cross-seed 7.0.0-21 → 7.0.0-23

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 (785) hide show
  1. package/dist/action.js +7 -8
  2. package/dist/action.js.map +1 -1
  3. package/dist/arr.js +2 -2
  4. package/dist/arr.js.map +1 -1
  5. package/dist/bencode.d.ts +62 -0
  6. package/dist/bencode.js +248 -0
  7. package/dist/bencode.js.map +1 -0
  8. package/dist/clients/Deluge.d.ts +5 -10
  9. package/dist/clients/Deluge.js +115 -89
  10. package/dist/clients/Deluge.js.map +1 -1
  11. package/dist/clients/QBittorrent.d.ts +3 -0
  12. package/dist/clients/QBittorrent.js +43 -30
  13. package/dist/clients/QBittorrent.js.map +1 -1
  14. package/dist/clients/RTorrent.d.ts +3 -2
  15. package/dist/clients/RTorrent.js +120 -41
  16. package/dist/clients/RTorrent.js.map +1 -1
  17. package/dist/clients/TorrentClient.d.ts +3 -2
  18. package/dist/clients/TorrentClient.js +3 -5
  19. package/dist/clients/TorrentClient.js.map +1 -1
  20. package/dist/clients/Transmission.d.ts +1 -0
  21. package/dist/clients/Transmission.js +90 -40
  22. package/dist/clients/Transmission.js.map +1 -1
  23. package/dist/clients/qbittorrent-version.d.ts +6 -0
  24. package/dist/clients/qbittorrent-version.js +11 -0
  25. package/dist/clients/qbittorrent-version.js.map +1 -0
  26. package/dist/clients/scgi.d.ts +14 -0
  27. package/dist/clients/scgi.js +111 -0
  28. package/dist/clients/scgi.js.map +1 -0
  29. package/dist/cmd.js +1 -1
  30. package/dist/cmd.js.map +1 -1
  31. package/dist/configuration.js +49 -9
  32. package/dist/configuration.js.map +1 -1
  33. package/dist/constants.d.ts +10 -0
  34. package/dist/constants.js +12 -2
  35. package/dist/constants.js.map +1 -1
  36. package/dist/dataFiles.d.ts +1 -0
  37. package/dist/dataFiles.js +252 -60
  38. package/dist/dataFiles.js.map +1 -1
  39. package/dist/db.js +8 -4
  40. package/dist/db.js.map +1 -1
  41. package/dist/decide.js +8 -8
  42. package/dist/decide.js.map +1 -1
  43. package/dist/devLogin.js.map +1 -1
  44. package/dist/diff.js.map +1 -1
  45. package/dist/indexers.js +5 -4
  46. package/dist/indexers.js.map +1 -1
  47. package/dist/inject.js +5 -5
  48. package/dist/inject.js.map +1 -1
  49. package/dist/jobs.js +2 -1
  50. package/dist/jobs.js.map +1 -1
  51. package/dist/libraryInventory.d.ts +176 -0
  52. package/dist/libraryInventory.js +701 -0
  53. package/dist/libraryInventory.js.map +1 -0
  54. package/dist/logger.js +7 -5
  55. package/dist/logger.js.map +1 -1
  56. package/dist/migrations/09-clientAndDataSearchees.js +1 -0
  57. package/dist/migrations/09-clientAndDataSearchees.js.map +1 -1
  58. package/dist/migrations/17-api-key-settings-json.js +3 -1
  59. package/dist/migrations/17-api-key-settings-json.js.map +1 -1
  60. package/dist/migrations/18-library-inventory.d.ts +9 -0
  61. package/dist/migrations/18-library-inventory.js +48 -0
  62. package/dist/migrations/18-library-inventory.js.map +1 -0
  63. package/dist/migrations/19-library-files.d.ts +9 -0
  64. package/dist/migrations/19-library-files.js +26 -0
  65. package/dist/migrations/19-library-files.js.map +1 -0
  66. package/dist/migrations/migrations.d.ts +12 -5
  67. package/dist/migrations/migrations.js +5 -1
  68. package/dist/migrations/migrations.js.map +1 -1
  69. package/dist/parseTorrent.d.ts +1 -1
  70. package/dist/parseTorrent.js +18 -4
  71. package/dist/parseTorrent.js.map +1 -1
  72. package/dist/pipeline.js +12 -11
  73. package/dist/pipeline.js.map +1 -1
  74. package/dist/problems/linking.js +1 -1
  75. package/dist/problems/linking.js.map +1 -1
  76. package/dist/problems.js +2 -1
  77. package/dist/problems.js.map +1 -1
  78. package/dist/pushNotifier.js +10 -9
  79. package/dist/pushNotifier.js.map +1 -1
  80. package/dist/routes/baseApi.d.ts +8 -0
  81. package/dist/routes/baseApi.js +26 -52
  82. package/dist/routes/baseApi.js.map +1 -1
  83. package/dist/routes/devLogin.js +1 -0
  84. package/dist/routes/devLogin.js.map +1 -1
  85. package/dist/routes/indexerApi.js +1 -0
  86. package/dist/routes/indexerApi.js.map +1 -1
  87. package/dist/routes/staticFrontendPlugin.js +1 -0
  88. package/dist/routes/staticFrontendPlugin.js.map +1 -1
  89. package/dist/searchee.d.ts +14 -2
  90. package/dist/searchee.js +26 -9
  91. package/dist/searchee.js.map +1 -1
  92. package/dist/services/indexerService.js +8 -2
  93. package/dist/services/indexerService.js.map +1 -1
  94. package/dist/startup.d.ts +1 -0
  95. package/dist/startup.js +11 -4
  96. package/dist/startup.js.map +1 -1
  97. package/dist/torrent.js +302 -115
  98. package/dist/torrent.js.map +1 -1
  99. package/dist/torznab.d.ts +2 -2
  100. package/dist/torznab.js +15 -14
  101. package/dist/torznab.js.map +1 -1
  102. package/dist/trpc/routers/auth.js +1 -1
  103. package/dist/trpc/routers/auth.js.map +1 -1
  104. package/dist/trpc/routers/clients.js +8 -13
  105. package/dist/trpc/routers/clients.js.map +1 -1
  106. package/dist/trpc/routers/index.d.ts +51 -50
  107. package/dist/trpc/routers/index.js +2 -2
  108. package/dist/trpc/routers/index.js.map +1 -1
  109. package/dist/trpc/routers/jobs.js +1 -1
  110. package/dist/trpc/routers/jobs.js.map +1 -1
  111. package/dist/trpc/routers/library.d.ts +50 -0
  112. package/dist/trpc/routers/library.js +85 -0
  113. package/dist/trpc/routers/library.js.map +1 -0
  114. package/dist/trpc/routers/logs.js +6 -5
  115. package/dist/trpc/routers/logs.js.map +1 -1
  116. package/dist/trpc/routers/settings.js +78 -21
  117. package/dist/trpc/routers/settings.js.map +1 -1
  118. package/dist/trpc/routers/stats.d.ts +1 -0
  119. package/dist/trpc/routers/stats.js +11 -5
  120. package/dist/trpc/routers/stats.js.map +1 -1
  121. package/dist/userAuth.js +1 -1
  122. package/dist/userAuth.js.map +1 -1
  123. package/dist/utils/background.d.ts +7 -0
  124. package/dist/utils/background.js +14 -0
  125. package/dist/utils/background.js.map +1 -0
  126. package/dist/utils/logWatcher.js +3 -2
  127. package/dist/utils/logWatcher.js.map +1 -1
  128. package/dist/utils.d.ts +11 -1
  129. package/dist/utils.js +47 -8
  130. package/dist/utils.js.map +1 -1
  131. package/dist/webui/assets/DeleteOption-DkdJCiOu.js +1 -0
  132. package/dist/webui/assets/FieldInfo-rcCXc0d-.js +1 -0
  133. package/dist/webui/assets/Page-CKwSnUie.js +1 -0
  134. package/dist/webui/assets/array-field-DM2mAVqa.js +1 -0
  135. package/dist/webui/assets/badge-CLUazitN.js +1 -0
  136. package/dist/webui/assets/button-DoKPR9Fv.js +1 -0
  137. package/dist/webui/assets/check-BlfHpqkp.js +1 -0
  138. package/dist/webui/assets/clients-B5C80D0F.js +1 -0
  139. package/dist/webui/assets/connect-BM7yGLAl.js +2 -0
  140. package/dist/webui/assets/createLucideIcon-Cv-_CLkr.js +1 -0
  141. package/dist/webui/assets/debug-C8d57uIb.js +1 -0
  142. package/dist/webui/assets/directories-DkJnb01t.js +1 -0
  143. package/dist/webui/assets/dist-B7BqKb_s.js +1 -0
  144. package/dist/webui/assets/dist-CXZZv-cf.js +41 -0
  145. package/dist/webui/assets/dist-ChMQZgJB.js +1 -0
  146. package/dist/webui/assets/dist-DQ6Xm99Z.js +1 -0
  147. package/dist/webui/assets/duration-field-w-qiOS_S.js +1 -0
  148. package/dist/webui/assets/general-2HmkyF5T.js +1 -0
  149. package/dist/webui/assets/health-D6tv4ioy.js +1 -0
  150. package/dist/webui/assets/index-NlorOk2I.js +11 -0
  151. package/dist/webui/assets/index-UQKt4Igp.css +2 -0
  152. package/dist/webui/assets/input-BggK3IOz.js +1 -0
  153. package/dist/webui/assets/jobs-Do8vAIqy.js +1 -0
  154. package/dist/webui/assets/library-B1r1nAY-.js +1 -0
  155. package/dist/webui/assets/loader-circle-D988WNxu.js +1 -0
  156. package/dist/webui/assets/logs-_rm8bxf-.js +1 -0
  157. package/dist/webui/assets/number-field-CeKyqI7R.js +1 -0
  158. package/dist/webui/assets/react-dom-DtIef6y6.js +1 -0
  159. package/dist/webui/assets/required-indicator-Ba9NOQEP.js +1 -0
  160. package/dist/webui/assets/routes-Djgf7dZI.js +1 -0
  161. package/dist/webui/assets/search-DGY0ui92.js +1 -0
  162. package/dist/webui/assets/select-BzZ418Yt.js +1 -0
  163. package/dist/webui/assets/select-field-DsBowTDT.js +1 -0
  164. package/dist/webui/assets/settings-B4G8vHXc.js +1 -0
  165. package/dist/webui/assets/sidebar-Qy-rYdhU.js +5 -0
  166. package/dist/webui/assets/submit-button-Bx2Dvr03.js +1 -0
  167. package/dist/webui/assets/switch-CttdmVGp.js +1 -0
  168. package/dist/webui/assets/switch-field-p-JPVVvW.js +1 -0
  169. package/dist/webui/assets/table-Bs6CQscS.js +1 -0
  170. package/dist/webui/assets/{test-tube-CbcievIk.js → test-tube-DD9Yz2bZ.js} +1 -1
  171. package/dist/webui/assets/text-field-B0a3dEGb.js +1 -0
  172. package/dist/webui/assets/time-KFQKyrl-.js +1 -0
  173. package/dist/webui/assets/trackers-DG-YCaaO.js +7 -0
  174. package/dist/webui/assets/{trash-D083IWKI.js → trash-PHXIGUCt.js} +1 -1
  175. package/dist/webui/assets/use-settings-form-submit-CDmMUcwW.js +57 -0
  176. package/dist/webui/assets/useSelector-BoN-mufS.js +2 -0
  177. package/dist/webui/assets/utils-P-unlvb4.js +1 -0
  178. package/dist/webui/assets/with-selector-fbK2t2oY.js +1 -0
  179. package/dist/webui/index.html +12 -14
  180. package/node_modules/@cross-seed/shared/dist/tsconfig.tsbuildinfo +1 -1
  181. package/node_modules/@cross-seed/shared/package.json +6 -2
  182. package/node_modules/zod/README.md +30 -20
  183. package/node_modules/zod/compile.cjs +96 -0
  184. package/node_modules/zod/compile.d.cts +1 -0
  185. package/node_modules/zod/compile.d.ts +1 -0
  186. package/node_modules/zod/compile.js +52 -0
  187. package/node_modules/zod/index.cjs +21 -2
  188. package/node_modules/zod/index.d.cts +1 -2
  189. package/node_modules/zod/index.d.ts +1 -2
  190. package/node_modules/zod/index.js +5 -2
  191. package/node_modules/zod/locales/index.cjs +19 -0
  192. package/node_modules/zod/locales/package.json +2 -1
  193. package/node_modules/zod/mini/index.cjs +19 -0
  194. package/node_modules/zod/mini/package.json +2 -1
  195. package/node_modules/zod/package.json +20 -8
  196. package/node_modules/zod/src/compile.ts +56 -0
  197. package/node_modules/zod/src/index.ts +5 -2
  198. package/node_modules/zod/src/v3/ZodError.ts +22 -12
  199. package/node_modules/zod/src/v3/helpers/errorUtil.ts +1 -1
  200. package/node_modules/zod/src/v3/tests/all-errors.test.ts +3 -3
  201. package/node_modules/zod/src/v3/tests/error.test.ts +35 -0
  202. package/node_modules/zod/src/v3/tests/intersection.test.ts +18 -0
  203. package/node_modules/zod/src/v3/tests/language-server.test.ts +1 -2
  204. package/node_modules/zod/src/v3/tests/object.test.ts +8 -11
  205. package/node_modules/zod/src/v3/tests/partials.test.ts +3 -3
  206. package/node_modules/zod/src/v3/tests/readonly.test.ts +0 -80
  207. package/node_modules/zod/src/v3/tests/string.test.ts +6 -0
  208. package/node_modules/zod/src/v3/types.ts +5 -5
  209. package/node_modules/zod/src/v4/classic/checks.ts +1 -0
  210. package/node_modules/zod/src/v4/classic/compat.ts +26 -18
  211. package/node_modules/zod/src/v4/classic/deep-partial.ts +76 -0
  212. package/node_modules/zod/src/v4/classic/errors.ts +60 -45
  213. package/node_modules/zod/src/v4/classic/external.ts +15 -9
  214. package/node_modules/zod/src/v4/classic/from-json-schema.ts +389 -88
  215. package/node_modules/zod/src/v4/classic/in-out.ts +45 -0
  216. package/node_modules/zod/src/v4/classic/index.ts +2 -2
  217. package/node_modules/zod/src/v4/classic/iso.ts +2 -72
  218. package/node_modules/zod/src/v4/classic/parse.ts +16 -10
  219. package/node_modules/zod/src/v4/classic/schemas.ts +863 -335
  220. package/node_modules/zod/src/v4/classic/tests/apply.test.ts +27 -0
  221. package/node_modules/zod/src/v4/classic/tests/array.test.ts +29 -2
  222. package/node_modules/zod/src/v4/classic/tests/assignability.test.ts +192 -0
  223. package/node_modules/zod/src/v4/classic/tests/bigint.test.ts +36 -1
  224. package/node_modules/zod/src/v4/classic/tests/catch.test.ts +328 -0
  225. package/node_modules/zod/src/v4/classic/tests/codec-examples.test.ts +1 -2
  226. package/node_modules/zod/src/v4/classic/tests/codec.test.ts +144 -2
  227. package/node_modules/zod/src/v4/classic/tests/continuability.test.ts +4 -4
  228. package/node_modules/zod/src/v4/classic/tests/credit-card.test.ts +76 -0
  229. package/node_modules/zod/src/v4/classic/tests/cyclic-data.test.ts +985 -0
  230. package/node_modules/zod/src/v4/classic/tests/date.test.ts +30 -0
  231. package/node_modules/zod/src/v4/classic/tests/datetime.test.ts +31 -17
  232. package/node_modules/zod/src/v4/classic/tests/deep-partial.test.ts +380 -0
  233. package/node_modules/zod/src/v4/classic/tests/default-locale.test.ts +32 -0
  234. package/node_modules/zod/src/v4/classic/tests/default.test.ts +90 -0
  235. package/node_modules/zod/src/v4/classic/tests/detached-methods.test.ts +221 -0
  236. package/node_modules/zod/src/v4/classic/tests/discriminated-unions.test.ts +291 -10
  237. package/node_modules/zod/src/v4/classic/tests/enum.test.ts +20 -0
  238. package/node_modules/zod/src/v4/classic/tests/error-utils.test.ts +324 -2
  239. package/node_modules/zod/src/v4/classic/tests/error.test.ts +403 -6
  240. package/node_modules/zod/src/v4/classic/tests/from-json-schema.test.ts +743 -10
  241. package/node_modules/zod/src/v4/classic/tests/function.test.ts +37 -6
  242. package/node_modules/zod/src/v4/classic/tests/global-config.test.ts +32 -0
  243. package/node_modules/zod/src/v4/classic/tests/hash.test.ts +1 -2
  244. package/node_modules/zod/src/v4/classic/tests/iban.test.ts +81 -0
  245. package/node_modules/zod/src/v4/classic/tests/in-out.test.ts +159 -0
  246. package/node_modules/zod/src/v4/classic/tests/index.test.ts +23 -4
  247. package/node_modules/zod/src/v4/classic/tests/instance-footprint.test.ts +319 -0
  248. package/node_modules/zod/src/v4/classic/tests/instanceof.test.ts +67 -0
  249. package/node_modules/zod/src/v4/classic/tests/intersection.test.ts +136 -0
  250. package/node_modules/zod/src/v4/classic/tests/issue-schema.test.ts +215 -0
  251. package/node_modules/zod/src/v4/classic/tests/jitless-allows-eval.test.ts +39 -0
  252. package/node_modules/zod/src/v4/classic/tests/lazy.test.ts +36 -1
  253. package/node_modules/zod/src/v4/classic/tests/literal.test.ts +12 -1
  254. package/node_modules/zod/src/v4/classic/tests/locales_ka.test.ts +29 -0
  255. package/node_modules/zod/src/v4/classic/tests/locales_ro.test.ts +24 -0
  256. package/node_modules/zod/src/v4/classic/tests/map.test.ts +19 -0
  257. package/node_modules/zod/src/v4/classic/tests/number.test.ts +138 -7
  258. package/node_modules/zod/src/v4/classic/tests/object.test.ts +378 -12
  259. package/node_modules/zod/src/v4/classic/tests/optin-ladder.test.ts +235 -0
  260. package/node_modules/zod/src/v4/classic/tests/optional.test.ts +156 -13
  261. package/node_modules/zod/src/v4/classic/tests/partial.test.ts +71 -1
  262. package/node_modules/zod/src/v4/classic/tests/prefault.test.ts +71 -1
  263. package/node_modules/zod/src/v4/classic/tests/preprocess-types.test.ts +44 -0
  264. package/node_modules/zod/src/v4/classic/tests/preprocess.test.ts +69 -0
  265. package/node_modules/zod/src/v4/classic/tests/properties.test.ts +141 -0
  266. package/node_modules/zod/src/v4/classic/tests/readonly.test.ts +0 -68
  267. package/node_modules/zod/src/v4/classic/tests/record.test.ts +269 -16
  268. package/node_modules/zod/src/v4/classic/tests/recursive-types.test.ts +126 -1
  269. package/node_modules/zod/src/v4/classic/tests/redos.test.ts +68 -0
  270. package/node_modules/zod/src/v4/classic/tests/refine.test.ts +123 -0
  271. package/node_modules/zod/src/v4/classic/tests/set.test.ts +15 -0
  272. package/node_modules/zod/src/v4/classic/tests/standard-schema.test.ts +19 -0
  273. package/node_modules/zod/src/v4/classic/tests/string.test.ts +269 -4
  274. package/node_modules/zod/src/v4/classic/tests/stringbool.test.ts +18 -0
  275. package/node_modules/zod/src/v4/classic/tests/template-literal.test.ts +48 -7
  276. package/node_modules/zod/src/v4/classic/tests/to-json-schema.test.ts +1948 -205
  277. package/node_modules/zod/src/v4/classic/tests/transform.test.ts +17 -0
  278. package/node_modules/zod/src/v4/classic/tests/tuple.test.ts +330 -2
  279. package/node_modules/zod/src/v4/classic/tests/union.test.ts +93 -2
  280. package/node_modules/zod/src/v4/classic/tests/validate.test.ts +645 -0
  281. package/node_modules/zod/src/v4/classic/tests/validations.test.ts +2 -2
  282. package/node_modules/zod/src/v4/core/api.ts +111 -34
  283. package/node_modules/zod/src/v4/core/checks.ts +120 -147
  284. package/node_modules/zod/src/v4/core/compile.ts +2322 -0
  285. package/node_modules/zod/src/v4/core/core.ts +116 -24
  286. package/node_modules/zod/src/v4/core/doc.ts +17 -9
  287. package/node_modules/zod/src/v4/core/errors.ts +138 -43
  288. package/node_modules/zod/src/v4/core/index.ts +3 -0
  289. package/node_modules/zod/src/v4/core/json-schema-generator.ts +8 -3
  290. package/node_modules/zod/src/v4/core/json-schema-processors.ts +440 -173
  291. package/node_modules/zod/src/v4/core/json-schema.ts +2 -1
  292. package/node_modules/zod/src/v4/core/memoizer.ts +331 -0
  293. package/node_modules/zod/src/v4/core/parse.ts +167 -53
  294. package/node_modules/zod/src/v4/core/regexes.ts +50 -16
  295. package/node_modules/zod/src/v4/core/registries.ts +2 -2
  296. package/node_modules/zod/src/v4/core/schemas.ts +1219 -531
  297. package/node_modules/zod/src/v4/core/tests/cached.test.ts +54 -0
  298. package/node_modules/zod/src/v4/core/tests/compile-differential.test.ts +1004 -0
  299. package/node_modules/zod/src/v4/core/tests/compile-generative.test.ts +445 -0
  300. package/node_modules/zod/src/v4/core/tests/compile-global.test.ts +89 -0
  301. package/node_modules/zod/src/v4/core/tests/compile-off-by-default.test.ts +26 -0
  302. package/node_modules/zod/src/v4/core/tests/compile-stats.test.ts +34 -0
  303. package/node_modules/zod/src/v4/core/tests/compile.test.ts +2036 -0
  304. package/node_modules/zod/src/v4/core/tests/email-regex.test.ts +140 -0
  305. package/node_modules/zod/src/v4/core/tests/locales/el.test.ts +214 -0
  306. package/node_modules/zod/src/v4/core/tests/locales/es.test.ts +1 -2
  307. package/node_modules/zod/src/v4/core/tests/locales/fr.test.ts +72 -0
  308. package/node_modules/zod/src/v4/core/tests/locales/hr.test.ts +163 -0
  309. package/node_modules/zod/src/v4/core/tests/locales/parity.test.ts +42 -0
  310. package/node_modules/zod/src/v4/core/tests/locales/tg.test.ts +85 -0
  311. package/node_modules/zod/src/v4/core/tests/locales/tk.test.ts +69 -0
  312. package/node_modules/zod/src/v4/core/tests/locales/uz.test.ts +22 -0
  313. package/node_modules/zod/src/v4/core/tests/polyfill-collision.test.ts +46 -0
  314. package/node_modules/zod/src/v4/core/tests/record-constructor.test.ts +58 -0
  315. package/node_modules/zod/src/v4/core/tests/treeshake.test.ts +51 -0
  316. package/node_modules/zod/src/v4/core/tests/url-no-canparse.test.ts +133 -0
  317. package/node_modules/zod/src/v4/core/to-json-schema.ts +288 -44
  318. package/node_modules/zod/src/v4/core/util.ts +506 -179
  319. package/node_modules/zod/src/v4/core/versions.ts +2 -2
  320. package/node_modules/zod/src/v4/core/visit.ts +193 -0
  321. package/node_modules/zod/src/v4/index.ts +3 -3
  322. package/node_modules/zod/src/v4/locales/ar.ts +5 -0
  323. package/node_modules/zod/src/v4/locales/az.ts +5 -0
  324. package/node_modules/zod/src/v4/locales/be.ts +12 -0
  325. package/node_modules/zod/src/v4/locales/bg.ts +5 -0
  326. package/node_modules/zod/src/v4/locales/bn.ts +123 -0
  327. package/node_modules/zod/src/v4/locales/ca.ts +5 -0
  328. package/node_modules/zod/src/v4/locales/ckb.ts +140 -0
  329. package/node_modules/zod/src/v4/locales/cs.ts +5 -0
  330. package/node_modules/zod/src/v4/locales/da.ts +7 -2
  331. package/node_modules/zod/src/v4/locales/de.ts +5 -0
  332. package/node_modules/zod/src/v4/locales/el.ts +124 -0
  333. package/node_modules/zod/src/v4/locales/en.ts +21 -4
  334. package/node_modules/zod/src/v4/locales/eo.ts +5 -0
  335. package/node_modules/zod/src/v4/locales/es.ts +4 -0
  336. package/node_modules/zod/src/v4/locales/fa.ts +5 -0
  337. package/node_modules/zod/src/v4/locales/fi.ts +5 -0
  338. package/node_modules/zod/src/v4/locales/fr-CA.ts +5 -0
  339. package/node_modules/zod/src/v4/locales/fr.ts +41 -18
  340. package/node_modules/zod/src/v4/locales/gu.ts +123 -0
  341. package/node_modules/zod/src/v4/locales/he.ts +8 -1
  342. package/node_modules/zod/src/v4/locales/hi.ts +126 -0
  343. package/node_modules/zod/src/v4/locales/hr.ts +135 -0
  344. package/node_modules/zod/src/v4/locales/hu.ts +5 -0
  345. package/node_modules/zod/src/v4/locales/hy.ts +11 -0
  346. package/node_modules/zod/src/v4/locales/id.ts +5 -0
  347. package/node_modules/zod/src/v4/locales/index.ts +14 -0
  348. package/node_modules/zod/src/v4/locales/is.ts +5 -0
  349. package/node_modules/zod/src/v4/locales/it.ts +6 -1
  350. package/node_modules/zod/src/v4/locales/ja.ts +5 -0
  351. package/node_modules/zod/src/v4/locales/ka.ts +13 -8
  352. package/node_modules/zod/src/v4/locales/km.ts +5 -0
  353. package/node_modules/zod/src/v4/locales/kn.ts +126 -0
  354. package/node_modules/zod/src/v4/locales/ko.ts +5 -0
  355. package/node_modules/zod/src/v4/locales/lt.ts +4 -0
  356. package/node_modules/zod/src/v4/locales/mk.ts +5 -0
  357. package/node_modules/zod/src/v4/locales/ms.ts +5 -0
  358. package/node_modules/zod/src/v4/locales/ne.ts +128 -0
  359. package/node_modules/zod/src/v4/locales/nl.ts +5 -0
  360. package/node_modules/zod/src/v4/locales/nn.ts +121 -0
  361. package/node_modules/zod/src/v4/locales/no.ts +7 -2
  362. package/node_modules/zod/src/v4/locales/ota.ts +5 -0
  363. package/node_modules/zod/src/v4/locales/pl.ts +5 -0
  364. package/node_modules/zod/src/v4/locales/ps.ts +5 -0
  365. package/node_modules/zod/src/v4/locales/pt-BR.ts +161 -0
  366. package/node_modules/zod/src/v4/locales/pt.ts +101 -58
  367. package/node_modules/zod/src/v4/locales/ro.ts +132 -0
  368. package/node_modules/zod/src/v4/locales/ru.ts +12 -0
  369. package/node_modules/zod/src/v4/locales/sk.ts +123 -0
  370. package/node_modules/zod/src/v4/locales/sl.ts +5 -0
  371. package/node_modules/zod/src/v4/locales/sv.ts +7 -2
  372. package/node_modules/zod/src/v4/locales/ta.ts +5 -0
  373. package/node_modules/zod/src/v4/locales/tg.ts +135 -0
  374. package/node_modules/zod/src/v4/locales/th.ts +5 -0
  375. package/node_modules/zod/src/v4/locales/tk.ts +113 -0
  376. package/node_modules/zod/src/v4/locales/tr.ts +5 -0
  377. package/node_modules/zod/src/v4/locales/uk.ts +5 -0
  378. package/node_modules/zod/src/v4/locales/ur.ts +5 -0
  379. package/node_modules/zod/src/v4/locales/uz.ts +4 -0
  380. package/node_modules/zod/src/v4/locales/vi.ts +5 -0
  381. package/node_modules/zod/src/v4/locales/yo.ts +5 -0
  382. package/node_modules/zod/src/v4/locales/zh-CN.ts +5 -0
  383. package/node_modules/zod/src/v4/locales/zh-TW.ts +5 -0
  384. package/node_modules/zod/src/v4/mini/checks.ts +1 -0
  385. package/node_modules/zod/src/v4/mini/deep-partial.ts +73 -0
  386. package/node_modules/zod/src/v4/mini/external.ts +13 -1
  387. package/node_modules/zod/src/v4/mini/in-out.ts +45 -0
  388. package/node_modules/zod/src/v4/mini/parse.ts +2 -0
  389. package/node_modules/zod/src/v4/mini/schemas.ts +214 -79
  390. package/node_modules/zod/src/v4/mini/tests/apply.test.ts +33 -0
  391. package/node_modules/zod/src/v4/mini/tests/assignability.test.ts +62 -1
  392. package/node_modules/zod/src/v4/mini/tests/checks.test.ts +14 -0
  393. package/node_modules/zod/src/v4/mini/tests/codec.test.ts +54 -1
  394. package/node_modules/zod/src/v4/mini/tests/computed.test.ts +11 -17
  395. package/node_modules/zod/src/v4/mini/tests/cyclic-data.test.ts +84 -0
  396. package/node_modules/zod/src/v4/mini/tests/deep-partial.test.ts +54 -0
  397. package/node_modules/zod/src/v4/mini/tests/error.test.ts +23 -4
  398. package/node_modules/zod/src/v4/mini/tests/functions.test.ts +9 -0
  399. package/node_modules/zod/src/v4/mini/tests/index.test.ts +187 -4
  400. package/node_modules/zod/src/v4/mini/tests/number.test.ts +14 -0
  401. package/node_modules/zod/src/v4/mini/tests/object.test.ts +74 -9
  402. package/node_modules/zod/src/v4/mini/tests/recursive-types.test.ts +67 -1
  403. package/node_modules/zod/src/v4/mini/tests/string.test.ts +49 -0
  404. package/node_modules/zod/v3/ZodError.cjs +41 -12
  405. package/node_modules/zod/v3/ZodError.d.cts +1 -1
  406. package/node_modules/zod/v3/ZodError.d.ts +1 -1
  407. package/node_modules/zod/v3/ZodError.js +22 -12
  408. package/node_modules/zod/v3/errors.cjs +19 -0
  409. package/node_modules/zod/v3/external.cjs +19 -0
  410. package/node_modules/zod/v3/helpers/enumUtil.cjs +19 -0
  411. package/node_modules/zod/v3/helpers/errorUtil.cjs +20 -1
  412. package/node_modules/zod/v3/helpers/errorUtil.js +1 -1
  413. package/node_modules/zod/v3/helpers/parseUtil.cjs +19 -0
  414. package/node_modules/zod/v3/helpers/partialUtil.cjs +19 -0
  415. package/node_modules/zod/v3/helpers/typeAliases.cjs +19 -0
  416. package/node_modules/zod/v3/helpers/util.cjs +19 -0
  417. package/node_modules/zod/v3/index.cjs +19 -0
  418. package/node_modules/zod/v3/package.json +2 -1
  419. package/node_modules/zod/v3/standard-schema.cjs +19 -0
  420. package/node_modules/zod/v3/types.cjs +26 -5
  421. package/node_modules/zod/v3/types.js +7 -5
  422. package/node_modules/zod/v4/classic/checks.cjs +21 -1
  423. package/node_modules/zod/v4/classic/checks.d.cts +1 -1
  424. package/node_modules/zod/v4/classic/checks.d.ts +1 -1
  425. package/node_modules/zod/v4/classic/checks.js +1 -1
  426. package/node_modules/zod/v4/classic/coerce.cjs +19 -0
  427. package/node_modules/zod/v4/classic/compat.cjs +19 -0
  428. package/node_modules/zod/v4/classic/compat.d.cts +9 -11
  429. package/node_modules/zod/v4/classic/compat.d.ts +9 -11
  430. package/node_modules/zod/v4/classic/deep-partial.cjs +58 -0
  431. package/node_modules/zod/v4/classic/deep-partial.d.cts +14 -0
  432. package/node_modules/zod/v4/classic/deep-partial.d.ts +14 -0
  433. package/node_modules/zod/v4/classic/deep-partial.js +13 -0
  434. package/node_modules/zod/v4/classic/errors.cjs +62 -34
  435. package/node_modules/zod/v4/classic/errors.d.cts +3 -4
  436. package/node_modules/zod/v4/classic/errors.d.ts +3 -4
  437. package/node_modules/zod/v4/classic/errors.js +44 -35
  438. package/node_modules/zod/v4/classic/external.cjs +51 -27
  439. package/node_modules/zod/v4/classic/external.d.cts +6 -2
  440. package/node_modules/zod/v4/classic/external.d.ts +6 -2
  441. package/node_modules/zod/v4/classic/external.js +5 -8
  442. package/node_modules/zod/v4/classic/from-json-schema.cjs +394 -78
  443. package/node_modules/zod/v4/classic/from-json-schema.js +375 -78
  444. package/node_modules/zod/v4/classic/in-out.cjs +82 -0
  445. package/node_modules/zod/v4/classic/in-out.d.cts +8 -0
  446. package/node_modules/zod/v4/classic/in-out.d.ts +8 -0
  447. package/node_modules/zod/v4/classic/in-out.js +36 -0
  448. package/node_modules/zod/v4/classic/index.cjs +21 -2
  449. package/node_modules/zod/v4/classic/index.d.cts +1 -2
  450. package/node_modules/zod/v4/classic/index.d.ts +1 -2
  451. package/node_modules/zod/v4/classic/index.js +2 -2
  452. package/node_modules/zod/v4/classic/iso.cjs +30 -22
  453. package/node_modules/zod/v4/classic/iso.d.cts +2 -17
  454. package/node_modules/zod/v4/classic/iso.d.ts +2 -17
  455. package/node_modules/zod/v4/classic/iso.js +2 -17
  456. package/node_modules/zod/v4/classic/package.json +2 -1
  457. package/node_modules/zod/v4/classic/parse.cjs +23 -1
  458. package/node_modules/zod/v4/classic/parse.d.cts +17 -4
  459. package/node_modules/zod/v4/classic/parse.d.ts +17 -4
  460. package/node_modules/zod/v4/classic/parse.js +1 -0
  461. package/node_modules/zod/v4/classic/schemas.cjs +629 -225
  462. package/node_modules/zod/v4/classic/schemas.d.cts +104 -27
  463. package/node_modules/zod/v4/classic/schemas.d.ts +104 -27
  464. package/node_modules/zod/v4/classic/schemas.js +601 -223
  465. package/node_modules/zod/v4/core/api.cjs +73 -26
  466. package/node_modules/zod/v4/core/api.d.cts +40 -9
  467. package/node_modules/zod/v4/core/api.d.ts +40 -9
  468. package/node_modules/zod/v4/core/api.js +51 -26
  469. package/node_modules/zod/v4/core/checks.cjs +88 -128
  470. package/node_modules/zod/v4/core/checks.d.cts +30 -14
  471. package/node_modules/zod/v4/core/checks.d.ts +30 -14
  472. package/node_modules/zod/v4/core/checks.js +68 -127
  473. package/node_modules/zod/v4/core/compile.cjs +1916 -0
  474. package/node_modules/zod/v4/core/compile.d.cts +65 -0
  475. package/node_modules/zod/v4/core/compile.d.ts +65 -0
  476. package/node_modules/zod/v4/core/compile.js +1866 -0
  477. package/node_modules/zod/v4/core/core.cjs +104 -20
  478. package/node_modules/zod/v4/core/core.d.cts +16 -4
  479. package/node_modules/zod/v4/core/core.d.ts +16 -4
  480. package/node_modules/zod/v4/core/core.js +87 -22
  481. package/node_modules/zod/v4/core/doc.cjs +31 -9
  482. package/node_modules/zod/v4/core/doc.d.cts +3 -1
  483. package/node_modules/zod/v4/core/doc.d.ts +3 -1
  484. package/node_modules/zod/v4/core/doc.js +12 -9
  485. package/node_modules/zod/v4/core/errors.cjs +146 -42
  486. package/node_modules/zod/v4/core/errors.d.cts +5 -0
  487. package/node_modules/zod/v4/core/errors.d.ts +5 -0
  488. package/node_modules/zod/v4/core/errors.js +127 -42
  489. package/node_modules/zod/v4/core/index.cjs +24 -1
  490. package/node_modules/zod/v4/core/index.d.cts +3 -0
  491. package/node_modules/zod/v4/core/index.d.ts +3 -0
  492. package/node_modules/zod/v4/core/index.js +3 -0
  493. package/node_modules/zod/v4/core/json-schema-generator.cjs +24 -1
  494. package/node_modules/zod/v4/core/json-schema-generator.d.cts +2 -2
  495. package/node_modules/zod/v4/core/json-schema-generator.d.ts +2 -2
  496. package/node_modules/zod/v4/core/json-schema-generator.js +6 -2
  497. package/node_modules/zod/v4/core/json-schema-processors.cjs +454 -173
  498. package/node_modules/zod/v4/core/json-schema-processors.d.cts +16 -0
  499. package/node_modules/zod/v4/core/json-schema-processors.d.ts +16 -0
  500. package/node_modules/zod/v4/core/json-schema-processors.js +413 -175
  501. package/node_modules/zod/v4/core/json-schema.cjs +19 -0
  502. package/node_modules/zod/v4/core/json-schema.d.cts +2 -1
  503. package/node_modules/zod/v4/core/json-schema.d.ts +2 -1
  504. package/node_modules/zod/v4/core/memoizer.cjs +360 -0
  505. package/node_modules/zod/v4/core/memoizer.d.cts +15 -0
  506. package/node_modules/zod/v4/core/memoizer.d.ts +15 -0
  507. package/node_modules/zod/v4/core/memoizer.js +311 -0
  508. package/node_modules/zod/v4/core/package.json +2 -1
  509. package/node_modules/zod/v4/core/parse.cjs +151 -49
  510. package/node_modules/zod/v4/core/parse.d.cts +14 -11
  511. package/node_modules/zod/v4/core/parse.d.ts +14 -11
  512. package/node_modules/zod/v4/core/parse.js +130 -48
  513. package/node_modules/zod/v4/core/regexes.cjs +61 -18
  514. package/node_modules/zod/v4/core/regexes.d.cts +11 -0
  515. package/node_modules/zod/v4/core/regexes.d.ts +11 -0
  516. package/node_modules/zod/v4/core/regexes.js +39 -16
  517. package/node_modules/zod/v4/core/registries.cjs +19 -0
  518. package/node_modules/zod/v4/core/registries.js +2 -2
  519. package/node_modules/zod/v4/core/schemas.cjs +957 -382
  520. package/node_modules/zod/v4/core/schemas.d.cts +154 -25
  521. package/node_modules/zod/v4/core/schemas.d.ts +154 -25
  522. package/node_modules/zod/v4/core/schemas.js +925 -382
  523. package/node_modules/zod/v4/core/standard-schema.cjs +19 -0
  524. package/node_modules/zod/v4/core/to-json-schema.cjs +275 -40
  525. package/node_modules/zod/v4/core/to-json-schema.d.cts +45 -5
  526. package/node_modules/zod/v4/core/to-json-schema.d.ts +45 -5
  527. package/node_modules/zod/v4/core/to-json-schema.js +253 -39
  528. package/node_modules/zod/v4/core/util.cjs +428 -174
  529. package/node_modules/zod/v4/core/util.d.cts +82 -1
  530. package/node_modules/zod/v4/core/util.d.ts +82 -1
  531. package/node_modules/zod/v4/core/util.js +397 -175
  532. package/node_modules/zod/v4/core/versions.cjs +21 -2
  533. package/node_modules/zod/v4/core/versions.d.cts +1 -1
  534. package/node_modules/zod/v4/core/versions.d.ts +1 -1
  535. package/node_modules/zod/v4/core/versions.js +2 -2
  536. package/node_modules/zod/v4/core/visit.cjs +214 -0
  537. package/node_modules/zod/v4/core/visit.d.cts +30 -0
  538. package/node_modules/zod/v4/core/visit.d.ts +30 -0
  539. package/node_modules/zod/v4/core/visit.js +169 -0
  540. package/node_modules/zod/v4/index.cjs +34 -5
  541. package/node_modules/zod/v4/index.d.cts +2 -2
  542. package/node_modules/zod/v4/index.d.ts +2 -2
  543. package/node_modules/zod/v4/index.js +3 -2
  544. package/node_modules/zod/v4/locales/ar.cjs +5 -0
  545. package/node_modules/zod/v4/locales/ar.js +5 -0
  546. package/node_modules/zod/v4/locales/az.cjs +5 -0
  547. package/node_modules/zod/v4/locales/az.js +5 -0
  548. package/node_modules/zod/v4/locales/be.cjs +12 -0
  549. package/node_modules/zod/v4/locales/be.js +12 -0
  550. package/node_modules/zod/v4/locales/bg.cjs +5 -0
  551. package/node_modules/zod/v4/locales/bg.js +5 -0
  552. package/node_modules/zod/v4/locales/bn.cjs +140 -0
  553. package/node_modules/zod/v4/locales/bn.d.cts +5 -0
  554. package/node_modules/zod/v4/locales/bn.d.ts +4 -0
  555. package/node_modules/zod/v4/locales/bn.js +113 -0
  556. package/node_modules/zod/v4/locales/ca.cjs +5 -0
  557. package/node_modules/zod/v4/locales/ca.js +5 -0
  558. package/node_modules/zod/v4/locales/ckb.cjs +160 -0
  559. package/node_modules/zod/v4/locales/ckb.d.cts +5 -0
  560. package/node_modules/zod/v4/locales/ckb.d.ts +4 -0
  561. package/node_modules/zod/v4/locales/ckb.js +133 -0
  562. package/node_modules/zod/v4/locales/cs.cjs +5 -0
  563. package/node_modules/zod/v4/locales/cs.js +5 -0
  564. package/node_modules/zod/v4/locales/da.cjs +7 -2
  565. package/node_modules/zod/v4/locales/da.js +7 -2
  566. package/node_modules/zod/v4/locales/de.cjs +5 -0
  567. package/node_modules/zod/v4/locales/de.js +5 -0
  568. package/node_modules/zod/v4/locales/el.cjs +139 -0
  569. package/node_modules/zod/v4/locales/el.d.cts +5 -0
  570. package/node_modules/zod/v4/locales/el.d.ts +4 -0
  571. package/node_modules/zod/v4/locales/el.js +112 -0
  572. package/node_modules/zod/v4/locales/en.cjs +20 -4
  573. package/node_modules/zod/v4/locales/en.js +20 -4
  574. package/node_modules/zod/v4/locales/eo.cjs +5 -0
  575. package/node_modules/zod/v4/locales/eo.js +5 -0
  576. package/node_modules/zod/v4/locales/es.cjs +4 -0
  577. package/node_modules/zod/v4/locales/es.js +4 -0
  578. package/node_modules/zod/v4/locales/fa.cjs +5 -0
  579. package/node_modules/zod/v4/locales/fa.js +5 -0
  580. package/node_modules/zod/v4/locales/fi.cjs +5 -0
  581. package/node_modules/zod/v4/locales/fi.js +5 -0
  582. package/node_modules/zod/v4/locales/fr-CA.cjs +5 -0
  583. package/node_modules/zod/v4/locales/fr-CA.js +5 -0
  584. package/node_modules/zod/v4/locales/fr.cjs +38 -17
  585. package/node_modules/zod/v4/locales/fr.js +38 -17
  586. package/node_modules/zod/v4/locales/gu.cjs +140 -0
  587. package/node_modules/zod/v4/locales/gu.d.cts +5 -0
  588. package/node_modules/zod/v4/locales/gu.d.ts +4 -0
  589. package/node_modules/zod/v4/locales/gu.js +113 -0
  590. package/node_modules/zod/v4/locales/he.cjs +7 -0
  591. package/node_modules/zod/v4/locales/he.js +7 -0
  592. package/node_modules/zod/v4/locales/hi.cjs +138 -0
  593. package/node_modules/zod/v4/locales/hi.d.cts +5 -0
  594. package/node_modules/zod/v4/locales/hi.d.ts +4 -0
  595. package/node_modules/zod/v4/locales/hi.js +111 -0
  596. package/node_modules/zod/v4/locales/hr.cjs +153 -0
  597. package/node_modules/zod/v4/locales/hr.d.cts +5 -0
  598. package/node_modules/zod/v4/locales/hr.d.ts +4 -0
  599. package/node_modules/zod/v4/locales/hr.js +126 -0
  600. package/node_modules/zod/v4/locales/hu.cjs +5 -0
  601. package/node_modules/zod/v4/locales/hu.js +5 -0
  602. package/node_modules/zod/v4/locales/hy.cjs +11 -0
  603. package/node_modules/zod/v4/locales/hy.js +11 -0
  604. package/node_modules/zod/v4/locales/id.cjs +5 -0
  605. package/node_modules/zod/v4/locales/id.js +5 -0
  606. package/node_modules/zod/v4/locales/index.cjs +49 -1
  607. package/node_modules/zod/v4/locales/index.d.cts +14 -0
  608. package/node_modules/zod/v4/locales/index.d.ts +14 -0
  609. package/node_modules/zod/v4/locales/index.js +14 -0
  610. package/node_modules/zod/v4/locales/is.cjs +5 -0
  611. package/node_modules/zod/v4/locales/is.js +5 -0
  612. package/node_modules/zod/v4/locales/it.cjs +6 -1
  613. package/node_modules/zod/v4/locales/it.js +6 -1
  614. package/node_modules/zod/v4/locales/ja.cjs +5 -0
  615. package/node_modules/zod/v4/locales/ja.js +5 -0
  616. package/node_modules/zod/v4/locales/ka.cjs +13 -8
  617. package/node_modules/zod/v4/locales/ka.js +13 -8
  618. package/node_modules/zod/v4/locales/km.cjs +5 -0
  619. package/node_modules/zod/v4/locales/km.js +5 -0
  620. package/node_modules/zod/v4/locales/kn.cjs +143 -0
  621. package/node_modules/zod/v4/locales/kn.d.cts +5 -0
  622. package/node_modules/zod/v4/locales/kn.d.ts +4 -0
  623. package/node_modules/zod/v4/locales/kn.js +116 -0
  624. package/node_modules/zod/v4/locales/ko.cjs +5 -0
  625. package/node_modules/zod/v4/locales/ko.js +5 -0
  626. package/node_modules/zod/v4/locales/lt.cjs +4 -0
  627. package/node_modules/zod/v4/locales/lt.js +4 -0
  628. package/node_modules/zod/v4/locales/mk.cjs +5 -0
  629. package/node_modules/zod/v4/locales/mk.js +5 -0
  630. package/node_modules/zod/v4/locales/ms.cjs +5 -0
  631. package/node_modules/zod/v4/locales/ms.js +5 -0
  632. package/node_modules/zod/v4/locales/ne.cjs +138 -0
  633. package/node_modules/zod/v4/locales/ne.d.cts +5 -0
  634. package/node_modules/zod/v4/locales/ne.d.ts +4 -0
  635. package/node_modules/zod/v4/locales/ne.js +111 -0
  636. package/node_modules/zod/v4/locales/nl.cjs +5 -0
  637. package/node_modules/zod/v4/locales/nl.js +5 -0
  638. package/node_modules/zod/v4/locales/nn.cjs +140 -0
  639. package/node_modules/zod/v4/locales/nn.d.cts +5 -0
  640. package/node_modules/zod/v4/locales/nn.d.ts +4 -0
  641. package/node_modules/zod/v4/locales/nn.js +113 -0
  642. package/node_modules/zod/v4/locales/no.cjs +7 -2
  643. package/node_modules/zod/v4/locales/no.js +7 -2
  644. package/node_modules/zod/v4/locales/ota.cjs +5 -0
  645. package/node_modules/zod/v4/locales/ota.js +5 -0
  646. package/node_modules/zod/v4/locales/package.json +2 -1
  647. package/node_modules/zod/v4/locales/pl.cjs +5 -0
  648. package/node_modules/zod/v4/locales/pl.js +5 -0
  649. package/node_modules/zod/v4/locales/ps.cjs +5 -0
  650. package/node_modules/zod/v4/locales/ps.js +5 -0
  651. package/node_modules/zod/v4/locales/pt-BR.cjs +170 -0
  652. package/node_modules/zod/v4/locales/pt-BR.d.cts +5 -0
  653. package/node_modules/zod/v4/locales/pt-BR.d.ts +4 -0
  654. package/node_modules/zod/v4/locales/pt-BR.js +143 -0
  655. package/node_modules/zod/v4/locales/pt.cjs +89 -55
  656. package/node_modules/zod/v4/locales/pt.js +89 -55
  657. package/node_modules/zod/v4/locales/ro.cjs +149 -0
  658. package/node_modules/zod/v4/locales/ro.d.cts +5 -0
  659. package/node_modules/zod/v4/locales/ro.d.ts +4 -0
  660. package/node_modules/zod/v4/locales/ro.js +122 -0
  661. package/node_modules/zod/v4/locales/ru.cjs +12 -0
  662. package/node_modules/zod/v4/locales/ru.js +12 -0
  663. package/node_modules/zod/v4/locales/sk.cjs +143 -0
  664. package/node_modules/zod/v4/locales/sk.d.cts +5 -0
  665. package/node_modules/zod/v4/locales/sk.d.ts +4 -0
  666. package/node_modules/zod/v4/locales/sk.js +116 -0
  667. package/node_modules/zod/v4/locales/sl.cjs +5 -0
  668. package/node_modules/zod/v4/locales/sl.js +5 -0
  669. package/node_modules/zod/v4/locales/sv.cjs +7 -2
  670. package/node_modules/zod/v4/locales/sv.js +7 -2
  671. package/node_modules/zod/v4/locales/ta.cjs +5 -0
  672. package/node_modules/zod/v4/locales/ta.js +5 -0
  673. package/node_modules/zod/v4/locales/tg.cjs +144 -0
  674. package/node_modules/zod/v4/locales/tg.d.cts +5 -0
  675. package/node_modules/zod/v4/locales/tg.d.ts +4 -0
  676. package/node_modules/zod/v4/locales/tg.js +117 -0
  677. package/node_modules/zod/v4/locales/th.cjs +5 -0
  678. package/node_modules/zod/v4/locales/th.js +5 -0
  679. package/node_modules/zod/v4/locales/tk.cjs +134 -0
  680. package/node_modules/zod/v4/locales/tk.d.cts +5 -0
  681. package/node_modules/zod/v4/locales/tk.d.ts +4 -0
  682. package/node_modules/zod/v4/locales/tk.js +107 -0
  683. package/node_modules/zod/v4/locales/tr.cjs +5 -0
  684. package/node_modules/zod/v4/locales/tr.js +5 -0
  685. package/node_modules/zod/v4/locales/uk.cjs +5 -0
  686. package/node_modules/zod/v4/locales/uk.js +5 -0
  687. package/node_modules/zod/v4/locales/ur.cjs +5 -0
  688. package/node_modules/zod/v4/locales/ur.js +5 -0
  689. package/node_modules/zod/v4/locales/uz.cjs +4 -0
  690. package/node_modules/zod/v4/locales/uz.js +4 -0
  691. package/node_modules/zod/v4/locales/vi.cjs +5 -0
  692. package/node_modules/zod/v4/locales/vi.js +5 -0
  693. package/node_modules/zod/v4/locales/yo.cjs +5 -0
  694. package/node_modules/zod/v4/locales/yo.js +5 -0
  695. package/node_modules/zod/v4/locales/zh-CN.cjs +5 -0
  696. package/node_modules/zod/v4/locales/zh-CN.js +5 -0
  697. package/node_modules/zod/v4/locales/zh-TW.cjs +5 -0
  698. package/node_modules/zod/v4/locales/zh-TW.js +5 -0
  699. package/node_modules/zod/v4/mini/checks.cjs +21 -1
  700. package/node_modules/zod/v4/mini/checks.d.cts +1 -1
  701. package/node_modules/zod/v4/mini/checks.d.ts +1 -1
  702. package/node_modules/zod/v4/mini/checks.js +1 -1
  703. package/node_modules/zod/v4/mini/coerce.cjs +19 -0
  704. package/node_modules/zod/v4/mini/deep-partial.cjs +58 -0
  705. package/node_modules/zod/v4/mini/deep-partial.d.cts +14 -0
  706. package/node_modules/zod/v4/mini/deep-partial.d.ts +14 -0
  707. package/node_modules/zod/v4/mini/deep-partial.js +13 -0
  708. package/node_modules/zod/v4/mini/external.cjs +33 -1
  709. package/node_modules/zod/v4/mini/external.d.cts +6 -2
  710. package/node_modules/zod/v4/mini/external.d.ts +6 -2
  711. package/node_modules/zod/v4/mini/external.js +3 -1
  712. package/node_modules/zod/v4/mini/in-out.cjs +82 -0
  713. package/node_modules/zod/v4/mini/in-out.d.cts +8 -0
  714. package/node_modules/zod/v4/mini/in-out.d.ts +8 -0
  715. package/node_modules/zod/v4/mini/in-out.js +36 -0
  716. package/node_modules/zod/v4/mini/index.cjs +19 -0
  717. package/node_modules/zod/v4/mini/iso.cjs +19 -0
  718. package/node_modules/zod/v4/mini/package.json +2 -1
  719. package/node_modules/zod/v4/mini/parse.cjs +22 -1
  720. package/node_modules/zod/v4/mini/parse.d.cts +1 -1
  721. package/node_modules/zod/v4/mini/parse.d.ts +1 -1
  722. package/node_modules/zod/v4/mini/parse.js +1 -1
  723. package/node_modules/zod/v4/mini/schemas.cjs +151 -50
  724. package/node_modules/zod/v4/mini/schemas.d.cts +75 -22
  725. package/node_modules/zod/v4/mini/schemas.d.ts +75 -22
  726. package/node_modules/zod/v4/mini/schemas.js +125 -48
  727. package/node_modules/zod/v4/package.json +2 -1
  728. package/node_modules/zod/v4-mini/index.cjs +19 -0
  729. package/node_modules/zod/v4-mini/package.json +2 -1
  730. package/package.json +16 -14
  731. package/dist/trpc/routers/searchees.d.ts +0 -51
  732. package/dist/trpc/routers/searchees.js +0 -156
  733. package/dist/trpc/routers/searchees.js.map +0 -1
  734. package/dist/webui/assets/ClientOnly-CzZIsGML.js +0 -1
  735. package/dist/webui/assets/DeleteOption-dxKSbv6N.js +0 -1
  736. package/dist/webui/assets/FieldInfo-FLjtPgL4.js +0 -1
  737. package/dist/webui/assets/Page-C7KClZ28.js +0 -1
  738. package/dist/webui/assets/array-field-DGB7Lbh7.js +0 -1
  739. package/dist/webui/assets/badge-hukNSIir.js +0 -1
  740. package/dist/webui/assets/button-1cIaa9Lf.js +0 -1
  741. package/dist/webui/assets/check-CUrWQ2C7.js +0 -1
  742. package/dist/webui/assets/chevron-down-CVVogpPh.js +0 -1
  743. package/dist/webui/assets/clients-CHdgqO4r.js +0 -1
  744. package/dist/webui/assets/connect-Cr6Q3W8U.js +0 -2
  745. package/dist/webui/assets/createLucideIcon-zYRS_Hrv.js +0 -1
  746. package/dist/webui/assets/debug-CEmoQ2W_.js +0 -1
  747. package/dist/webui/assets/directories-CNuHKfHz.js +0 -1
  748. package/dist/webui/assets/dist-Bbmh5Du9.js +0 -1
  749. package/dist/webui/assets/dist-DhH_lYkz.js +0 -1
  750. package/dist/webui/assets/dist-DzdkRn7I.js +0 -1
  751. package/dist/webui/assets/dist-b2njvUJz.js +0 -41
  752. package/dist/webui/assets/dist-d-Lt00zD.js +0 -1
  753. package/dist/webui/assets/duration-field-CnlQcr37.js +0 -1
  754. package/dist/webui/assets/form-context-B-ekdUc0.js +0 -1
  755. package/dist/webui/assets/form-validation-context-CPAPOloL.js +0 -1
  756. package/dist/webui/assets/general-Cs8dEydJ.js +0 -1
  757. package/dist/webui/assets/health-DugF7R6A.js +0 -1
  758. package/dist/webui/assets/index-DhV1H9AB.css +0 -2
  759. package/dist/webui/assets/index-DinSQfHc.js +0 -11
  760. package/dist/webui/assets/input-CsfmMUT5.js +0 -1
  761. package/dist/webui/assets/jobs-Cr1xWWzM.js +0 -1
  762. package/dist/webui/assets/library-BNsctrbc.js +0 -1
  763. package/dist/webui/assets/loader-circle-BQbzoYGJ.js +0 -1
  764. package/dist/webui/assets/logs-C1l3cu_j.js +0 -1
  765. package/dist/webui/assets/number-field-Ce3QdLSz.js +0 -1
  766. package/dist/webui/assets/react-dom-mEftaaxx.js +0 -1
  767. package/dist/webui/assets/required-indicator-BXf2UzTH.js +0 -1
  768. package/dist/webui/assets/routes-Bw2nXmFg.js +0 -1
  769. package/dist/webui/assets/search-D9W5vk_0.js +0 -1
  770. package/dist/webui/assets/select-CZn10WME.js +0 -1
  771. package/dist/webui/assets/select-field-DozTirAZ.js +0 -1
  772. package/dist/webui/assets/settings-BXbhXNDK.js +0 -1
  773. package/dist/webui/assets/sidebar-y9WJu7Jw.js +0 -5
  774. package/dist/webui/assets/submit-button-CBOzR0f_.js +0 -1
  775. package/dist/webui/assets/switch-D4S9As9u.js +0 -1
  776. package/dist/webui/assets/switch-field-2E9ctvy_.js +0 -1
  777. package/dist/webui/assets/table-B1Y18B60.js +0 -1
  778. package/dist/webui/assets/text-field-DV4EP-I8.js +0 -1
  779. package/dist/webui/assets/time-DjUFOA4D.js +0 -1
  780. package/dist/webui/assets/trackers-ULhLxA6-.js +0 -7
  781. package/dist/webui/assets/use-settings-form-submit-D87nmJRy.js +0 -79
  782. package/dist/webui/assets/useBaseQuery-BvrWhgOK.js +0 -1
  783. package/dist/webui/assets/useRouterState-CZfD5Xdv.js +0 -1
  784. package/dist/webui/assets/useStore-CusP06SD.js +0 -1
  785. package/node_modules/zod/src/v4/core/config.ts +0 -15
package/dist/torrent.js CHANGED
@@ -1,19 +1,20 @@
1
1
  import { distance } from "fastest-levenshtein";
2
- import bencode from "bencode";
3
2
  import { readdir, readFile, stat } from "fs/promises";
4
3
  import { extname, join, resolve } from "path";
5
4
  import { inspect } from "util";
5
+ import { decode } from "./bencode.js";
6
6
  import { getClients, } from "./clients/TorrentClient.js";
7
7
  import { isChildPath } from "./utils.js";
8
8
  import { ALL_PARENTHESES_REGEX, ALL_SPACES_REGEX, ALL_SQUARE_BRACKETS_REGEX, LEVENSHTEIN_DIVISOR, MAX_PATH_BYTES, MediaType, MIN_VIDEO_QUERY_LENGTH, SAVED_TORRENTS_INFO_REGEX, USER_AGENT, } from "./constants.js";
9
9
  import { getDataByFuzzyName, indexDataDirs, shouldIgnorePathHeuristically, } from "./dataFiles.js";
10
10
  import { db } from "./db.js";
11
- import { Label, logger, logOnce } from "./logger.js";
12
- import { Metafile, updateMetafileMetadata } from "./parseTorrent.js";
11
+ import { createClientLibrarySourceKey, createDataLibrarySourceKey, createTorrentLibraryItemInput, createTorrentLibrarySourceKey, beginLibraryScan, getLibraryScan, failLibraryScan, LibraryItemSource, LibraryScanStatus, markLibraryItemsMissingBySourceKeys, syncLibraryItems, } from "./libraryInventory.js";
12
+ import { Label, logger } from "./logger.js";
13
+ import { Metafile, updateMetafileMetadata, } from "./parseTorrent.js";
13
14
  import { isOk, resultOf, resultOfErr } from "./Result.js";
14
15
  import { getRuntimeConfig } from "./runtimeConfig.js";
15
16
  import { createSearcheeFromDB, createSearcheeFromPath, createSearcheeFromTorrentFile, getAnimeKeys, getEpisodeKeys, getLargestFile, getMovieKeys, getSeasonKeys, } from "./searchee.js";
16
- import { createKeyTitle, exists, filterAsync, filterAsyncYield, flatMapAsync, getLogString, inBatches, mapAsync, Mutex, notExists, stripExtension, wait, withMutex, } from "./utils.js";
17
+ import { createKeyTitle, exists, filterAsync, filterAsyncYield, flatMapAsync, getLogString, inBatches, errorMessage, isTruthy, mapAsync, notExists, stripExtension, wait, } from "./utils.js";
17
18
  export var SnatchError;
18
19
  (function (SnatchError) {
19
20
  SnatchError["ABORTED"] = "ABORTED";
@@ -29,7 +30,7 @@ function isRecoverableTorrentDirError(error) {
29
30
  return ["ENOENT", "ENOTDIR", "EACCES", "EPERM"].includes(code ?? "");
30
31
  }
31
32
  function logRecoverableTorrentDirError(torrentDir, error) {
32
- const message = error instanceof Error ? error.message : String(error ?? "");
33
+ const message = errorMessage(error);
33
34
  logger.warn({
34
35
  label: Label.INDEX,
35
36
  message: `Skipping torrentDir indexing for "${torrentDir}": ${message}`,
@@ -45,7 +46,7 @@ export async function parseTorrentWithMetadata(filePath, torrentInfos) {
45
46
  if (clients[0]?.clientType === Label.QBITTORRENT) {
46
47
  const fastResumePath = filePath.replace(extname(filePath), ".fastresume");
47
48
  if (await exists(fastResumePath)) {
48
- updateMetafileMetadata(meta, bencode.decode(await readFile(fastResumePath)));
49
+ updateMetafileMetadata(meta, decode(await readFile(fastResumePath)));
49
50
  return meta;
50
51
  }
51
52
  else {
@@ -91,14 +92,15 @@ async function snatchOnce(candidate) {
91
92
  });
92
93
  }
93
94
  catch (e) {
94
- if (e.name === "AbortError" || e.name === "TimeoutError") {
95
+ const errName = e instanceof Error ? e.name : "";
96
+ if (errName === "AbortError" || errName === "TimeoutError") {
95
97
  logger.debug(`${candidate.name}: ${url}`);
96
98
  return {
97
99
  snatchError: SnatchError.ABORTED,
98
100
  extra: `snatch timed out`,
99
101
  };
100
102
  }
101
- else if (isMagnetRedirectError(e)) {
103
+ else if (e instanceof Error && isMagnetRedirectError(e)) {
102
104
  logger.debug(`${candidate.name}: ${url}`);
103
105
  return { snatchError: SnatchError.MAGNET_LINK };
104
106
  }
@@ -281,7 +283,10 @@ export async function cacheEnsembleTorrentEntry(searchee, torrentSavePaths) {
281
283
  savePath = torrentSavePaths.get(searchee.infoHash);
282
284
  }
283
285
  else {
284
- const downloadDirResult = await getClients()[0].getDownloadDir(searchee, {
286
+ const client = getClients()[0];
287
+ if (!client)
288
+ return null;
289
+ const downloadDirResult = await client.getDownloadDir(searchee, {
285
290
  onlyCompleted: false,
286
291
  });
287
292
  if (downloadDirResult.isErr()) {
@@ -302,6 +307,29 @@ export async function cacheEnsembleTorrentEntry(searchee, torrentSavePaths) {
302
307
  element: ensemblePiece.element,
303
308
  }));
304
309
  }
310
+ async function scanClientInventory(client, newSearcheesOnly) {
311
+ const scan = await beginLibraryScan({
312
+ source: LibraryItemSource.CLIENT,
313
+ sourceInstance: client.clientHost,
314
+ });
315
+ try {
316
+ const result = await client.getClientSearchees({
317
+ newSearcheesOnly,
318
+ includeFiles: true,
319
+ includeTrackers: true,
320
+ libraryScanId: scan.id,
321
+ });
322
+ if ((await getLibraryScan(scan.id))?.status !==
323
+ LibraryScanStatus.SUCCEEDED) {
324
+ throw new Error("Client did not complete its inventory refresh; preserving previous inventory");
325
+ }
326
+ return result;
327
+ }
328
+ catch (error) {
329
+ await failLibraryScan(scan.id, error);
330
+ throw error;
331
+ }
332
+ }
305
333
  async function indexTorrents(options) {
306
334
  const { seasonFromEpisodes, torrentDir, useClientTorrents } = getRuntimeConfig();
307
335
  if (!useClientTorrents && !torrentDir)
@@ -316,7 +344,7 @@ async function indexTorrents(options) {
316
344
  message: "Indexing torrentDir for reverse lookup...",
317
345
  });
318
346
  try {
319
- searchees = await loadTorrentDirLight(torrentDir);
347
+ searchees = await loadTorrentDirIncremental(torrentDir);
320
348
  }
321
349
  catch (error) {
322
350
  if (!isRecoverableTorrentDirError(error))
@@ -324,29 +352,35 @@ async function indexTorrents(options) {
324
352
  logRecoverableTorrentDirError(torrentDir, error);
325
353
  searchees = [];
326
354
  }
327
- if (clients.length) {
328
- infoHashPathMap = await clients[0].getAllDownloadDirs({
329
- metas: searchees,
330
- onlyCompleted: false,
331
- v1HashOnly: true,
332
- });
355
+ if (clients.length && seasonFromEpisodes) {
356
+ try {
357
+ infoHashPathMap = await clients[0].getAllDownloadDirs({
358
+ metas: searchees,
359
+ onlyCompleted: false,
360
+ v1HashOnly: true,
361
+ });
362
+ }
363
+ catch (error) {
364
+ infoHashPathMap = new Map();
365
+ logger.warn({
366
+ label: Label.INDEX,
367
+ message: `Skipping client-dependent episode grouping: ${errorMessage(error)}`,
368
+ });
369
+ }
333
370
  }
334
371
  }
335
372
  else {
336
373
  logger.info("Indexing client torrents for reverse lookup...");
337
374
  searchees = await flatMapAsync(clients, async (client) => {
338
375
  try {
339
- const { searchees } = await client.getClientSearchees({
340
- includeFiles: true,
341
- includeTrackers: true,
342
- });
376
+ const { searchees } = await scanClientInventory(client, false);
343
377
  return searchees;
344
378
  }
345
379
  catch (e) {
346
380
  const message = e instanceof Error ? e.message : String(e ?? "");
347
381
  logger.warn({
348
382
  label: client.label,
349
- message: `Indexing client torrents failed; disabling client until next retry: ${message}`,
383
+ message: `Indexing client torrents failed; keeping previous inventory until next retry: ${message}`,
350
384
  });
351
385
  logger.debug(e);
352
386
  return [];
@@ -369,17 +403,14 @@ async function indexTorrents(options) {
369
403
  else {
370
404
  searchees = await flatMapAsync(clients, async (client) => {
371
405
  try {
372
- return (await client.getClientSearchees({
373
- newSearcheesOnly: true,
374
- includeFiles: true,
375
- includeTrackers: true,
376
- })).newSearchees;
406
+ return (await scanClientInventory(client, true))
407
+ .newSearchees;
377
408
  }
378
409
  catch (e) {
379
410
  const message = e instanceof Error ? e.message : String(e ?? "");
380
411
  logger.warn({
381
412
  label: client.label,
382
- message: `Indexing client torrents failed; disabling client until next retry: ${message}`,
413
+ message: `Indexing client torrents failed; keeping previous inventory until next retry: ${message}`,
383
414
  });
384
415
  logger.debug(e);
385
416
  return [];
@@ -398,65 +429,80 @@ async function indexTorrents(options) {
398
429
  });
399
430
  }
400
431
  async function indexTorrentDir(dir) {
401
- const dirContents = new Set(await findAllTorrentFilesInDir(dir));
402
- const newSearchees = [];
403
- for (const filePath of dirContents) {
404
- const doesAlreadyExist = await db("torrent")
405
- .select("id")
406
- .where({ file_path: filePath })
407
- .first();
408
- if (doesAlreadyExist)
409
- continue;
410
- let meta;
411
- try {
412
- meta = await parseTorrentFromPath(filePath);
413
- }
414
- catch (e) {
415
- logOnce(`Failed to parse ${filePath}`, () => {
416
- logger.error({
417
- label: Label.INDEX,
418
- message: `Failed to parse ${filePath}`,
419
- });
420
- logger.debug(e);
421
- });
422
- continue;
423
- }
424
- await db("torrent")
425
- .insert({
426
- file_path: filePath,
427
- info_hash: meta.infoHash,
428
- name: meta.name,
429
- })
430
- .onConflict("file_path")
431
- .ignore();
432
- const res = await createSearcheeFromTorrentFile(filePath, []);
433
- if (res.isOk())
434
- newSearchees.push(res.unwrap());
435
- }
436
- const rows = await db("torrent").select("file_path", "info_hash");
437
- const toDelete = rows.filter((row) => !dirContents.has(row.file_path));
438
- await inBatches(toDelete, async (batch) => {
439
- await db("torrent")
440
- .whereIn("file_path", batch.map((row) => row.file_path))
441
- .del();
442
- await db("ensemble")
443
- .whereIn("info_hash", batch.map((row) => row.info_hash))
444
- .del();
432
+ return loadTorrentDirIncremental(dir, { includeUnchanged: false });
433
+ }
434
+ let activeIndexing;
435
+ let startupIndexingRequested = false;
436
+ export function indexTorrentsAndDataDirs(options = { startup: false }) {
437
+ startupIndexingRequested ||= options.startup;
438
+ if (activeIndexing)
439
+ return activeIndexing;
440
+ activeIndexing = (async () => {
441
+ do {
442
+ const startup = startupIndexingRequested;
443
+ startupIndexingRequested = false;
444
+ try {
445
+ await runIndexing({ startup });
446
+ }
447
+ catch (error) {
448
+ // A settings update queued during a failed scan still gets a turn.
449
+ if (!startupIndexingRequested)
450
+ throw error;
451
+ }
452
+ } while (startupIndexingRequested);
453
+ })().finally(() => {
454
+ activeIndexing = undefined;
445
455
  });
446
- return newSearchees;
456
+ return activeIndexing;
447
457
  }
448
- export async function indexTorrentsAndDataDirs(options = { startup: false }) {
458
+ async function runIndexing(options) {
449
459
  if (options.startup) {
450
460
  const { dataDirs, seasonFromEpisodes, torrentDir, useClientTorrents } = getRuntimeConfig();
461
+ const configuredSources = new Map([
462
+ [LibraryItemSource.DATA, new Set(dataDirs)],
463
+ [
464
+ LibraryItemSource.TORRENT,
465
+ new Set(torrentDir ? [torrentDir] : []),
466
+ ],
467
+ [
468
+ LibraryItemSource.CLIENT,
469
+ new Set(useClientTorrents
470
+ ? getClients().map((client) => client.clientHost)
471
+ : []),
472
+ ],
473
+ ]);
474
+ const activeItems = await db("library_item")
475
+ .whereNull("missing_since")
476
+ .select("source", "source_instance", "source_key", "info_hash");
477
+ const removedItems = activeItems.filter((item) => !configuredSources
478
+ .get(item.source)
479
+ ?.has(item.source_instance ?? ""));
480
+ const removedTorrentHashes = removedItems.filter((item) => item.source ===
481
+ LibraryItemSource.TORRENT);
482
+ await inBatches(removedTorrentHashes.map((item) => item.info_hash).filter(isTruthy), async (hashes) => {
483
+ await db("ensemble")
484
+ .whereNull("client_host")
485
+ .whereIn("info_hash", hashes)
486
+ .del();
487
+ });
488
+ await markLibraryItemsMissingBySourceKeys(removedItems.map((item) => item.source_key));
451
489
  if (!useClientTorrents) {
452
- const hashes = (await db("client_searchee").select("info_hash")).map((r) => r.info_hash);
490
+ const clientRows = await db("client_searchee").select("client_host", "info_hash");
491
+ const hashes = clientRows.map((r) => r.info_hash);
453
492
  await inBatches(hashes, async (batch) => {
454
493
  await db("ensemble").whereIn("info_hash", batch).del();
455
494
  });
495
+ await markLibraryItemsMissingBySourceKeys(clientRows.map((row) => createClientLibrarySourceKey({
496
+ clientHost: row.client_host,
497
+ infoHash: row.info_hash,
498
+ })));
456
499
  await db("client_searchee").del();
457
500
  }
458
501
  else {
459
502
  const clientHosts = getClients().map((client) => client.clientHost);
503
+ const clientRowsToDelete = await db("client_searchee")
504
+ .select("client_host", "info_hash")
505
+ .whereNotIn("client_host", clientHosts);
460
506
  await db("client_searchee")
461
507
  .whereNotIn("client_host", clientHosts)
462
508
  .del();
@@ -464,13 +510,18 @@ export async function indexTorrentsAndDataDirs(options = { startup: false }) {
464
510
  .whereNotNull("client_host")
465
511
  .whereNotIn("client_host", clientHosts)
466
512
  .del();
513
+ await markLibraryItemsMissingBySourceKeys(clientRowsToDelete.map((row) => createClientLibrarySourceKey({
514
+ clientHost: row.client_host,
515
+ infoHash: row.info_hash,
516
+ })));
467
517
  }
468
518
  if (!torrentDir) {
469
- const hashes = (await db("torrent").select("info_hash")).map((r) => r.info_hash);
519
+ const torrentRows = await getTorrentLibraryEntries();
520
+ const hashes = torrentRows.map((r) => r.info_hash).filter(isTruthy);
470
521
  await inBatches(hashes, async (batch) => {
471
522
  await db("ensemble").whereIn("info_hash", batch).del();
472
523
  });
473
- await db("torrent").del();
524
+ await markLibraryItemsMissingBySourceKeys(torrentRows.map((row) => createTorrentLibrarySourceKey(row.file_path)));
474
525
  }
475
526
  if (!dataDirs.length) {
476
527
  const paths = (await db("data").select("path")).map((r) => r.path);
@@ -479,6 +530,7 @@ export async function indexTorrentsAndDataDirs(options = { startup: false }) {
479
530
  .whereIn("path", batch)
480
531
  .whereNull("client_host")
481
532
  .del();
533
+ await markLibraryItemsMissingBySourceKeys(batch.map(createDataLibrarySourceKey));
482
534
  });
483
535
  await db("data").del();
484
536
  }
@@ -491,41 +543,44 @@ export async function indexTorrentsAndDataDirs(options = { startup: false }) {
491
543
  .whereIn("path", batch)
492
544
  .whereNull("client_host")
493
545
  .del();
546
+ await markLibraryItemsMissingBySourceKeys(batch.map(createDataLibrarySourceKey));
494
547
  });
495
548
  }
496
549
  if (!seasonFromEpisodes)
497
550
  await db("ensemble").del();
498
551
  }
499
- return withMutex(Mutex.INDEX_TORRENTS_AND_DATA_DIRS, { useQueue: false }, async () => {
500
- const maxRetries = 3;
501
- for (let attempt = 1; attempt <= maxRetries; attempt++) {
502
- try {
503
- await indexDataDirs(options); // Running together may increase failures
504
- await indexTorrents(options); // Run second so this data is more fresh
505
- break;
552
+ const maxRetries = 3;
553
+ for (let attempt = 1; attempt <= maxRetries; attempt++) {
554
+ try {
555
+ await indexDataDirs(options); // Running together may increase failures
556
+ await indexTorrents(options); // Run second so this data is more fresh
557
+ break;
558
+ }
559
+ catch (e) {
560
+ const log = {
561
+ label: Label.INDEX,
562
+ message: `Indexing failed (${maxRetries - attempt}): ${errorMessage(e)}`,
563
+ };
564
+ logger.debug(e);
565
+ if (attempt < maxRetries) {
566
+ logger.verbose(log);
506
567
  }
507
- catch (e) {
508
- const log = {
509
- label: Label.INDEX,
510
- message: `Indexing failed (${maxRetries - attempt}): ${e.message}`,
511
- };
512
- logger.debug(e);
513
- if (attempt < maxRetries) {
514
- logger.verbose(log);
515
- }
516
- else {
517
- logger.error(log);
518
- if (options.startup)
519
- throw e;
520
- }
568
+ else {
569
+ logger.error(log);
570
+ if (options.startup)
571
+ throw e;
521
572
  }
522
573
  }
523
- });
574
+ }
524
575
  }
525
576
  export async function getInfoHashesToExclude() {
526
577
  const { useClientTorrents } = getRuntimeConfig();
527
- const database = useClientTorrents ? db("client_searchee") : db("torrent");
528
- return new Set((await database.select("*")).map((e) => e.info_hash));
578
+ if (!useClientTorrents) {
579
+ return new Set((await getTorrentLibraryEntries())
580
+ .map((e) => e.info_hash)
581
+ .filter(isTruthy));
582
+ }
583
+ return new Set((await db("client_searchee").select("info_hash")).map((e) => e.info_hash));
529
584
  }
530
585
  export async function loadTorrentDirLight(torrentDir) {
531
586
  const torrentFilePaths = await findAllTorrentFilesInDir(torrentDir);
@@ -537,11 +592,135 @@ export async function loadTorrentDirLight(torrentDir) {
537
592
  for (const torrentFilePath of torrentFilePaths) {
538
593
  const searcheeResult = await createSearcheeFromTorrentFile(torrentFilePath, torrentInfos);
539
594
  if (searcheeResult.isOk()) {
540
- searchees.push(searcheeResult.unwrap());
595
+ searchees.push({
596
+ ...searcheeResult.unwrap(),
597
+ path: torrentFilePath,
598
+ });
541
599
  }
542
600
  }
543
601
  return searchees;
544
602
  }
603
+ function createTorrentFileFingerprint(filePath, stats) {
604
+ return JSON.stringify({
605
+ path: filePath,
606
+ size: stats.size,
607
+ mtimeMs: stats.mtimeMs,
608
+ });
609
+ }
610
+ function createSearcheeFromTorrentLibraryItem(row) {
611
+ if (!row.info_hash || !row.path)
612
+ return null;
613
+ return {
614
+ infoHash: row.info_hash,
615
+ path: row.path,
616
+ name: row.name,
617
+ title: row.title,
618
+ files: JSON.parse(row.files),
619
+ length: row.length,
620
+ category: row.category ?? undefined,
621
+ tags: row.tags ? JSON.parse(row.tags) : undefined,
622
+ trackers: row.trackers
623
+ ? JSON.parse(row.trackers)
624
+ : undefined,
625
+ };
626
+ }
627
+ async function getTorrentLibraryEntries() {
628
+ const rows = await db("library_item")
629
+ .where({
630
+ source: LibraryItemSource.TORRENT,
631
+ missing_since: null,
632
+ })
633
+ .whereNotNull("path")
634
+ .select("title", "name", "path", "info_hash");
635
+ return rows
636
+ .filter((row) => row.path !== null)
637
+ .map((row) => ({
638
+ title: row.title,
639
+ name: row.name,
640
+ file_path: row.path,
641
+ info_hash: row.info_hash,
642
+ }));
643
+ }
644
+ async function loadTorrentDirIncremental(torrentDir, options = { includeUnchanged: true }) {
645
+ const scan = await beginLibraryScan({
646
+ source: LibraryItemSource.TORRENT,
647
+ sourceInstance: torrentDir,
648
+ });
649
+ try {
650
+ const torrentFilePaths = await findAllTorrentFilesInDir(torrentDir);
651
+ const sourceKeys = torrentFilePaths.map(createTorrentLibrarySourceKey);
652
+ const existingRows = await db("library_item")
653
+ .where({
654
+ source: LibraryItemSource.TORRENT,
655
+ source_instance: torrentDir,
656
+ })
657
+ .whereIn("source_key", sourceKeys)
658
+ .select("source_key", "info_hash", "path", "name", "title", "files", "length", "category", "tags", "trackers", "content_fingerprint", "missing_since");
659
+ const existingBySourceKey = new Map(existingRows.map((row) => [row.source_key, row]));
660
+ const searchees = [];
661
+ const sourceKeysSeen = [];
662
+ const pathsToParse = [];
663
+ for (const filePath of torrentFilePaths) {
664
+ const fingerprint = createTorrentFileFingerprint(filePath, await stat(filePath));
665
+ const sourceKey = createTorrentLibrarySourceKey(filePath);
666
+ const existing = existingBySourceKey.get(sourceKey);
667
+ if (existing &&
668
+ existing.missing_since === null &&
669
+ existing.content_fingerprint === fingerprint) {
670
+ const searchee = createSearcheeFromTorrentLibraryItem(existing);
671
+ if (searchee) {
672
+ if (options.includeUnchanged)
673
+ searchees.push(searchee);
674
+ sourceKeysSeen.push(sourceKey);
675
+ continue;
676
+ }
677
+ }
678
+ pathsToParse.push({ filePath, fingerprint });
679
+ }
680
+ const client = getClients()[0];
681
+ let torrentInfos = [];
682
+ if (pathsToParse.length &&
683
+ client &&
684
+ client.clientType !== Label.QBITTORRENT) {
685
+ try {
686
+ torrentInfos = await client.getAllTorrents();
687
+ }
688
+ catch (error) {
689
+ logger.warn({
690
+ label: Label.INDEX,
691
+ message: `Client metadata unavailable; indexing torrent files without it: ${errorMessage(error)}`,
692
+ });
693
+ }
694
+ }
695
+ const itemsToUpsert = [];
696
+ for (const { filePath, fingerprint } of pathsToParse) {
697
+ const searcheeResult = await createSearcheeFromTorrentFile(filePath, torrentInfos);
698
+ if (searcheeResult.isOk()) {
699
+ const searchee = {
700
+ ...searcheeResult.unwrap(),
701
+ path: filePath,
702
+ };
703
+ searchees.push(searchee);
704
+ itemsToUpsert.push(createTorrentLibraryItemInput(searchee, filePath, torrentDir, {
705
+ contentFingerprint: fingerprint,
706
+ }));
707
+ }
708
+ }
709
+ await syncLibraryItems({
710
+ scanId: scan.id,
711
+ source: LibraryItemSource.TORRENT,
712
+ sourceInstance: torrentDir,
713
+ itemsToUpsert,
714
+ sourceKeysSeen,
715
+ pruneMissing: true,
716
+ });
717
+ return searchees;
718
+ }
719
+ catch (error) {
720
+ await failLibraryScan(scan.id, error);
721
+ throw error;
722
+ }
723
+ }
545
724
  function getKeysFromName(stem) {
546
725
  const episodeKeys = getEpisodeKeys(stem);
547
726
  if (episodeKeys) {
@@ -591,24 +770,24 @@ export async function getSimilarByName(name) {
591
770
  }
592
771
  const candidateMaxDistance = Math.floor(Math.min(...keyTitles.map((t) => t.length)) / LEVENSHTEIN_DIVISOR);
593
772
  const filterEntries = async (dbEntries) => {
594
- return filterAsyncYield(dbEntries, async (dbEntry) => {
773
+ return filterAsyncYield(dbEntries, (dbEntry) => {
595
774
  const entry = getKeysFromName(dbEntry.title ?? dbEntry.name);
596
775
  if (entry.element !== element)
597
- return false;
776
+ return Promise.resolve(false);
598
777
  if (!entry.keyTitles.length)
599
- return false;
778
+ return Promise.resolve(false);
600
779
  const maxDistance = Math.min(candidateMaxDistance, Math.floor(Math.min(...entry.keyTitles.map((t) => t.length)) /
601
780
  LEVENSHTEIN_DIVISOR));
602
- return entry.keyTitles.some((dbKeyTitle) => {
781
+ return Promise.resolve(entry.keyTitles.some((dbKeyTitle) => {
603
782
  return keyTitles.some((keyTitle) => distance(keyTitle, dbKeyTitle) <= maxDistance);
604
- });
783
+ }));
605
784
  });
606
785
  };
607
786
  if (useClientTorrents) {
608
787
  clientSearchees.push(...(await filterEntries(await db("client_searchee"))).map(createSearcheeFromDB));
609
788
  }
610
789
  else if (torrentDir) {
611
- const filteredTorrentEntries = (await filterEntries(await db("torrent").select("name", "file_path")));
790
+ const filteredTorrentEntries = (await filterEntries(await getTorrentLibraryEntries()));
612
791
  if (filteredTorrentEntries.length) {
613
792
  const client = getClients()[0];
614
793
  const torrentInfos = client && client.clientType !== Label.QBITTORRENT
@@ -646,23 +825,23 @@ async function getTorrentByFuzzyName(stem) {
646
825
  const { useClientTorrents } = getRuntimeConfig();
647
826
  const database = useClientTorrents
648
827
  ? await db("client_searchee")
649
- : await db("torrent");
828
+ : await getTorrentLibraryEntries();
650
829
  const fullMatch = createKeyTitle(stem);
651
830
  // Attempt to filter torrents in DB to match incoming data before fuzzy check
652
831
  let filteredNames = [];
653
832
  if (fullMatch) {
654
- filteredNames = await filterAsyncYield(database, async (dbEntry) => {
833
+ filteredNames = await filterAsyncYield(database, (dbEntry) => {
655
834
  const dbMatch = createKeyTitle(stripExtension(dbEntry.title ?? dbEntry.name));
656
- return fullMatch === dbMatch;
835
+ return Promise.resolve(fullMatch === dbMatch);
657
836
  });
658
837
  }
659
838
  // If none match, proceed with fuzzy name check on all names.
660
839
  filteredNames = filteredNames.length > 0 ? filteredNames : database;
661
840
  const candidateMaxDistance = Math.floor(stem.length / LEVENSHTEIN_DIVISOR);
662
- const potentialMatches = await filterAsyncYield(filteredNames, async (dbEntry) => {
841
+ const potentialMatches = await filterAsyncYield(filteredNames, (dbEntry) => {
663
842
  const dbTitle = stripExtension(dbEntry.title ?? dbEntry.name);
664
843
  const maxDistance = Math.min(candidateMaxDistance, Math.floor(dbTitle.length / LEVENSHTEIN_DIVISOR));
665
- return distance(stem, dbTitle) <= maxDistance;
844
+ return Promise.resolve(distance(stem, dbTitle) <= maxDistance);
666
845
  });
667
846
  if (useClientTorrents)
668
847
  return potentialMatches.map(createSearcheeFromDB);
@@ -676,8 +855,11 @@ async function getTorrentByFuzzyName(stem) {
676
855
  }
677
856
  export async function getTorrentByCriteria(criteria) {
678
857
  const { useClientTorrents } = getRuntimeConfig();
679
- const database = useClientTorrents ? db("client_searchee") : db("torrent");
680
- const dbTorrents = await database.where((b) => b.where({ info_hash: criteria.infoHash }));
858
+ const dbTorrents = useClientTorrents
859
+ ? await db("client_searchee").where({
860
+ info_hash: criteria.infoHash,
861
+ })
862
+ : (await getTorrentLibraryEntries()).filter((entry) => entry.info_hash === criteria.infoHash);
681
863
  if (!dbTorrents.length) {
682
864
  const message = `Torrent client does not have any torrent with criteria ${inspect(criteria)}`;
683
865
  throw new Error(message);
@@ -688,8 +870,13 @@ export async function getTorrentByCriteria(criteria) {
688
870
  const torrentInfos = client && client.clientType !== Label.QBITTORRENT
689
871
  ? await client.getAllTorrents()
690
872
  : [];
873
+ const torrentRow = dbTorrents[0];
874
+ const searchee = (await createSearcheeFromTorrentFile(torrentRow.file_path, torrentInfos)).unwrapOrThrow(new Error(`Failed to create searchee from ${torrentRow.file_path}`));
691
875
  return [
692
- (await createSearcheeFromTorrentFile(dbTorrents[0].file_path, torrentInfos)).unwrapOrThrow(new Error(`Failed to create searchee from ${dbTorrents[0].file_path}`)),
876
+ {
877
+ ...searchee,
878
+ path: torrentRow.file_path,
879
+ },
693
880
  ];
694
881
  }
695
882
  //# sourceMappingURL=torrent.js.map