@bobfrankston/rmfmail 1.0.467

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 (330) hide show
  1. package/README.md +429 -0
  2. package/bin/build-icon-ico.js +283 -0
  3. package/bin/lean-accounts.js +172 -0
  4. package/bin/mailx.js +1580 -0
  5. package/bin/mailx.js.map +1 -0
  6. package/bin/mailx.ts +1549 -0
  7. package/bin/postinstall.js +39 -0
  8. package/bin/postinstall.js.map +1 -0
  9. package/bin/postinstall.ts +41 -0
  10. package/bin/tsconfig.json +10 -0
  11. package/client/.gitattributes +10 -0
  12. package/client/.msger-window.json +1 -0
  13. package/client/android.html +226 -0
  14. package/client/app.js +3400 -0
  15. package/client/app.js.map +1 -0
  16. package/client/app.ts +3190 -0
  17. package/client/components/address-book.js +199 -0
  18. package/client/components/address-book.js.map +1 -0
  19. package/client/components/address-book.ts +204 -0
  20. package/client/components/alarms.js +299 -0
  21. package/client/components/alarms.js.map +1 -0
  22. package/client/components/alarms.ts +276 -0
  23. package/client/components/calendar-sidebar.js +508 -0
  24. package/client/components/calendar-sidebar.js.map +1 -0
  25. package/client/components/calendar-sidebar.ts +474 -0
  26. package/client/components/calendar.js +217 -0
  27. package/client/components/calendar.js.map +1 -0
  28. package/client/components/calendar.ts +211 -0
  29. package/client/components/context-menu.js +80 -0
  30. package/client/components/context-menu.js.map +1 -0
  31. package/client/components/context-menu.ts +95 -0
  32. package/client/components/folder-picker.js +119 -0
  33. package/client/components/folder-picker.js.map +1 -0
  34. package/client/components/folder-picker.ts +127 -0
  35. package/client/components/folder-tree.js +1093 -0
  36. package/client/components/folder-tree.js.map +1 -0
  37. package/client/components/folder-tree.ts +1069 -0
  38. package/client/components/message-list.js +1140 -0
  39. package/client/components/message-list.js.map +1 -0
  40. package/client/components/message-list.ts +1129 -0
  41. package/client/components/message-viewer.js +1291 -0
  42. package/client/components/message-viewer.js.map +1 -0
  43. package/client/components/message-viewer.ts +1257 -0
  44. package/client/components/outbox-view.js +104 -0
  45. package/client/components/outbox-view.js.map +1 -0
  46. package/client/components/outbox-view.ts +102 -0
  47. package/client/components/tasks.js +261 -0
  48. package/client/components/tasks.js.map +1 -0
  49. package/client/components/tasks.ts +234 -0
  50. package/client/compose/compose.css +560 -0
  51. package/client/compose/compose.html +52 -0
  52. package/client/compose/compose.js +1289 -0
  53. package/client/compose/compose.js.map +1 -0
  54. package/client/compose/compose.ts +1231 -0
  55. package/client/compose/editor.js +616 -0
  56. package/client/compose/editor.js.map +1 -0
  57. package/client/compose/editor.ts +599 -0
  58. package/client/compose/ghost-text.js +122 -0
  59. package/client/compose/ghost-text.js.map +1 -0
  60. package/client/compose/ghost-text.ts +140 -0
  61. package/client/favicon.svg +11 -0
  62. package/client/icon.ico +0 -0
  63. package/client/icon.png +0 -0
  64. package/client/index.html +230 -0
  65. package/client/lib/android-bootstrap.js +9 -0
  66. package/client/lib/android-bootstrap.js.map +1 -0
  67. package/client/lib/android-bootstrap.ts +9 -0
  68. package/client/lib/api-client.js +378 -0
  69. package/client/lib/api-client.js.map +1 -0
  70. package/client/lib/api-client.ts +439 -0
  71. package/client/lib/local-service.js +603 -0
  72. package/client/lib/local-service.js.map +1 -0
  73. package/client/lib/local-service.ts +646 -0
  74. package/client/lib/local-store.js +214 -0
  75. package/client/lib/local-store.js.map +1 -0
  76. package/client/lib/local-store.ts +283 -0
  77. package/client/lib/mailxapi.js +304 -0
  78. package/client/lib/message-state.js +132 -0
  79. package/client/lib/message-state.js.map +1 -0
  80. package/client/lib/message-state.ts +160 -0
  81. package/client/package.json +16 -0
  82. package/client/styles/components.css +2049 -0
  83. package/client/styles/layout.css +332 -0
  84. package/client/styles/variables.css +85 -0
  85. package/client/tsconfig.json +19 -0
  86. package/package.json +124 -0
  87. package/packages/mailx-api/.gitattributes +10 -0
  88. package/packages/mailx-api/index.d.ts +10 -0
  89. package/packages/mailx-api/index.d.ts.map +1 -0
  90. package/packages/mailx-api/index.js +322 -0
  91. package/packages/mailx-api/index.js.map +1 -0
  92. package/packages/mailx-api/index.ts +283 -0
  93. package/packages/mailx-api/package.json +27 -0
  94. package/packages/mailx-api/tsconfig.json +9 -0
  95. package/packages/mailx-api/tsconfig.tsbuildinfo +1 -0
  96. package/packages/mailx-compose/.gitattributes +10 -0
  97. package/packages/mailx-compose/index.d.ts +21 -0
  98. package/packages/mailx-compose/index.d.ts.map +1 -0
  99. package/packages/mailx-compose/index.js +61 -0
  100. package/packages/mailx-compose/index.js.map +1 -0
  101. package/packages/mailx-compose/index.ts +85 -0
  102. package/packages/mailx-compose/package.json +18 -0
  103. package/packages/mailx-compose/tsconfig.json +9 -0
  104. package/packages/mailx-core/index.d.ts +139 -0
  105. package/packages/mailx-core/index.d.ts.map +1 -0
  106. package/packages/mailx-core/index.js +403 -0
  107. package/packages/mailx-core/index.js.map +1 -0
  108. package/packages/mailx-core/index.ts +424 -0
  109. package/packages/mailx-core/ipc.d.ts +13 -0
  110. package/packages/mailx-core/ipc.d.ts.map +1 -0
  111. package/packages/mailx-core/ipc.js +56 -0
  112. package/packages/mailx-core/ipc.js.map +1 -0
  113. package/packages/mailx-core/ipc.ts +62 -0
  114. package/packages/mailx-core/package.json +18 -0
  115. package/packages/mailx-core/tsconfig.json +9 -0
  116. package/packages/mailx-host/.gitattributes +10 -0
  117. package/packages/mailx-host/index.d.ts +21 -0
  118. package/packages/mailx-host/index.d.ts.map +1 -0
  119. package/packages/mailx-host/index.js +29 -0
  120. package/packages/mailx-host/index.js.map +1 -0
  121. package/packages/mailx-host/index.ts +38 -0
  122. package/packages/mailx-host/package.json +23 -0
  123. package/packages/mailx-host/tsconfig.json +9 -0
  124. package/packages/mailx-host/types-shim.d.ts +14 -0
  125. package/packages/mailx-imap/.gitattributes +10 -0
  126. package/packages/mailx-imap/index.d.ts +442 -0
  127. package/packages/mailx-imap/index.d.ts.map +1 -0
  128. package/packages/mailx-imap/index.js +3684 -0
  129. package/packages/mailx-imap/index.js.map +1 -0
  130. package/packages/mailx-imap/index.ts +3652 -0
  131. package/packages/mailx-imap/package-lock.json +131 -0
  132. package/packages/mailx-imap/package.json +28 -0
  133. package/packages/mailx-imap/providers/gmail-api.d.ts +8 -0
  134. package/packages/mailx-imap/providers/gmail-api.d.ts.map +1 -0
  135. package/packages/mailx-imap/providers/gmail-api.js +8 -0
  136. package/packages/mailx-imap/providers/gmail-api.js.map +1 -0
  137. package/packages/mailx-imap/providers/gmail-api.ts +8 -0
  138. package/packages/mailx-imap/providers/outlook-api.ts +7 -0
  139. package/packages/mailx-imap/providers/types.d.ts +9 -0
  140. package/packages/mailx-imap/providers/types.d.ts.map +1 -0
  141. package/packages/mailx-imap/providers/types.js +9 -0
  142. package/packages/mailx-imap/providers/types.js.map +1 -0
  143. package/packages/mailx-imap/providers/types.ts +9 -0
  144. package/packages/mailx-imap/tsconfig.json +9 -0
  145. package/packages/mailx-imap/tsconfig.tsbuildinfo +1 -0
  146. package/packages/mailx-send/.gitattributes +10 -0
  147. package/packages/mailx-send/README.md +217 -0
  148. package/packages/mailx-send/cli-queue.d.ts +11 -0
  149. package/packages/mailx-send/cli-queue.d.ts.map +1 -0
  150. package/packages/mailx-send/cli-queue.js +59 -0
  151. package/packages/mailx-send/cli-queue.js.map +1 -0
  152. package/packages/mailx-send/cli-queue.ts +62 -0
  153. package/packages/mailx-send/cli-send.d.ts +17 -0
  154. package/packages/mailx-send/cli-send.d.ts.map +1 -0
  155. package/packages/mailx-send/cli-send.js +75 -0
  156. package/packages/mailx-send/cli-send.js.map +1 -0
  157. package/packages/mailx-send/cli-send.ts +83 -0
  158. package/packages/mailx-send/cli.d.ts +22 -0
  159. package/packages/mailx-send/cli.d.ts.map +1 -0
  160. package/packages/mailx-send/cli.js +115 -0
  161. package/packages/mailx-send/cli.js.map +1 -0
  162. package/packages/mailx-send/cli.ts +126 -0
  163. package/packages/mailx-send/index.d.ts +77 -0
  164. package/packages/mailx-send/index.d.ts.map +1 -0
  165. package/packages/mailx-send/index.js +264 -0
  166. package/packages/mailx-send/index.js.map +1 -0
  167. package/packages/mailx-send/index.ts +333 -0
  168. package/packages/mailx-send/mailsend/README.md +133 -0
  169. package/packages/mailx-send/mailsend/cli.d.ts +12 -0
  170. package/packages/mailx-send/mailsend/cli.d.ts.map +1 -0
  171. package/packages/mailx-send/mailsend/cli.js +70 -0
  172. package/packages/mailx-send/mailsend/cli.js.map +1 -0
  173. package/packages/mailx-send/mailsend/cli.ts +81 -0
  174. package/packages/mailx-send/mailsend/index.d.ts +77 -0
  175. package/packages/mailx-send/mailsend/index.d.ts.map +1 -0
  176. package/packages/mailx-send/mailsend/index.js +264 -0
  177. package/packages/mailx-send/mailsend/index.js.map +1 -0
  178. package/packages/mailx-send/mailsend/index.ts +333 -0
  179. package/packages/mailx-send/mailsend/package-lock.json +65 -0
  180. package/packages/mailx-send/mailsend/package.json +26 -0
  181. package/packages/mailx-send/mailsend/tsconfig.json +21 -0
  182. package/packages/mailx-send/package-lock.json +65 -0
  183. package/packages/mailx-send/package.json +37 -0
  184. package/packages/mailx-send/tsconfig.json +21 -0
  185. package/packages/mailx-server/.gitattributes +10 -0
  186. package/packages/mailx-server/index.d.ts +8 -0
  187. package/packages/mailx-server/index.d.ts.map +1 -0
  188. package/packages/mailx-server/index.js +397 -0
  189. package/packages/mailx-server/index.js.map +1 -0
  190. package/packages/mailx-server/index.ts +429 -0
  191. package/packages/mailx-server/package.json +28 -0
  192. package/packages/mailx-server/tsconfig.json +9 -0
  193. package/packages/mailx-server/tsconfig.tsbuildinfo +1 -0
  194. package/packages/mailx-service/google-sync.d.ts +96 -0
  195. package/packages/mailx-service/google-sync.d.ts.map +1 -0
  196. package/packages/mailx-service/google-sync.js +153 -0
  197. package/packages/mailx-service/google-sync.js.map +1 -0
  198. package/packages/mailx-service/google-sync.ts +238 -0
  199. package/packages/mailx-service/index.d.ts +366 -0
  200. package/packages/mailx-service/index.d.ts.map +1 -0
  201. package/packages/mailx-service/index.js +2589 -0
  202. package/packages/mailx-service/index.js.map +1 -0
  203. package/packages/mailx-service/index.ts +2512 -0
  204. package/packages/mailx-service/jsonrpc.d.ts +25 -0
  205. package/packages/mailx-service/jsonrpc.d.ts.map +1 -0
  206. package/packages/mailx-service/jsonrpc.js +238 -0
  207. package/packages/mailx-service/jsonrpc.js.map +1 -0
  208. package/packages/mailx-service/jsonrpc.ts +268 -0
  209. package/packages/mailx-service/package.json +22 -0
  210. package/packages/mailx-service/tsconfig.json +9 -0
  211. package/packages/mailx-settings/.gitattributes +10 -0
  212. package/packages/mailx-settings/cloud.d.ts +47 -0
  213. package/packages/mailx-settings/cloud.d.ts.map +1 -0
  214. package/packages/mailx-settings/cloud.js +408 -0
  215. package/packages/mailx-settings/cloud.js.map +1 -0
  216. package/packages/mailx-settings/cloud.ts +393 -0
  217. package/packages/mailx-settings/index.d.ts +140 -0
  218. package/packages/mailx-settings/index.d.ts.map +1 -0
  219. package/packages/mailx-settings/index.js +872 -0
  220. package/packages/mailx-settings/index.js.map +1 -0
  221. package/packages/mailx-settings/index.ts +908 -0
  222. package/packages/mailx-settings/package.json +20 -0
  223. package/packages/mailx-settings/tsconfig.json +9 -0
  224. package/packages/mailx-settings/tsconfig.tsbuildinfo +1 -0
  225. package/packages/mailx-store/.gitattributes +10 -0
  226. package/packages/mailx-store/db.d.ts +346 -0
  227. package/packages/mailx-store/db.d.ts.map +1 -0
  228. package/packages/mailx-store/db.js +1796 -0
  229. package/packages/mailx-store/db.js.map +1 -0
  230. package/packages/mailx-store/db.ts +2007 -0
  231. package/packages/mailx-store/file-store.d.ts +36 -0
  232. package/packages/mailx-store/file-store.d.ts.map +1 -0
  233. package/packages/mailx-store/file-store.js +80 -0
  234. package/packages/mailx-store/file-store.js.map +1 -0
  235. package/packages/mailx-store/file-store.ts +82 -0
  236. package/packages/mailx-store/index.d.ts +7 -0
  237. package/packages/mailx-store/index.d.ts.map +1 -0
  238. package/packages/mailx-store/index.js +7 -0
  239. package/packages/mailx-store/index.js.map +1 -0
  240. package/packages/mailx-store/index.ts +7 -0
  241. package/packages/mailx-store/package.json +19 -0
  242. package/packages/mailx-store/tsconfig.json +9 -0
  243. package/packages/mailx-store/tsconfig.tsbuildinfo +1 -0
  244. package/packages/mailx-store-web/android-bootstrap.d.ts +16 -0
  245. package/packages/mailx-store-web/android-bootstrap.d.ts.map +1 -0
  246. package/packages/mailx-store-web/android-bootstrap.js +1247 -0
  247. package/packages/mailx-store-web/android-bootstrap.js.map +1 -0
  248. package/packages/mailx-store-web/android-bootstrap.ts +1262 -0
  249. package/packages/mailx-store-web/db.d.ts +132 -0
  250. package/packages/mailx-store-web/db.d.ts.map +1 -0
  251. package/packages/mailx-store-web/db.js +642 -0
  252. package/packages/mailx-store-web/db.js.map +1 -0
  253. package/packages/mailx-store-web/db.ts +756 -0
  254. package/packages/mailx-store-web/gmail-api-web.d.ts +11 -0
  255. package/packages/mailx-store-web/gmail-api-web.d.ts.map +1 -0
  256. package/packages/mailx-store-web/gmail-api-web.js +11 -0
  257. package/packages/mailx-store-web/gmail-api-web.js.map +1 -0
  258. package/packages/mailx-store-web/gmail-api-web.ts +11 -0
  259. package/packages/mailx-store-web/imap-web-provider.d.ts +33 -0
  260. package/packages/mailx-store-web/imap-web-provider.d.ts.map +1 -0
  261. package/packages/mailx-store-web/imap-web-provider.js +140 -0
  262. package/packages/mailx-store-web/imap-web-provider.js.map +1 -0
  263. package/packages/mailx-store-web/imap-web-provider.ts +156 -0
  264. package/packages/mailx-store-web/index.d.ts +10 -0
  265. package/packages/mailx-store-web/index.d.ts.map +1 -0
  266. package/packages/mailx-store-web/index.js +10 -0
  267. package/packages/mailx-store-web/index.js.map +1 -0
  268. package/packages/mailx-store-web/index.ts +10 -0
  269. package/packages/mailx-store-web/main-thread-host.d.ts +15 -0
  270. package/packages/mailx-store-web/main-thread-host.d.ts.map +1 -0
  271. package/packages/mailx-store-web/main-thread-host.js +292 -0
  272. package/packages/mailx-store-web/main-thread-host.js.map +1 -0
  273. package/packages/mailx-store-web/main-thread-host.ts +322 -0
  274. package/packages/mailx-store-web/package.json +23 -0
  275. package/packages/mailx-store-web/provider-types.d.ts +7 -0
  276. package/packages/mailx-store-web/provider-types.d.ts.map +1 -0
  277. package/packages/mailx-store-web/provider-types.js +7 -0
  278. package/packages/mailx-store-web/provider-types.js.map +1 -0
  279. package/packages/mailx-store-web/provider-types.ts +7 -0
  280. package/packages/mailx-store-web/sql-wasm-esm.js +10 -0
  281. package/packages/mailx-store-web/sql.js.d.ts +29 -0
  282. package/packages/mailx-store-web/sync-manager.d.ts +68 -0
  283. package/packages/mailx-store-web/sync-manager.d.ts.map +1 -0
  284. package/packages/mailx-store-web/sync-manager.js +506 -0
  285. package/packages/mailx-store-web/sync-manager.js.map +1 -0
  286. package/packages/mailx-store-web/sync-manager.ts +508 -0
  287. package/packages/mailx-store-web/tsconfig.json +10 -0
  288. package/packages/mailx-store-web/web-jsonrpc.d.ts +20 -0
  289. package/packages/mailx-store-web/web-jsonrpc.d.ts.map +1 -0
  290. package/packages/mailx-store-web/web-jsonrpc.js +102 -0
  291. package/packages/mailx-store-web/web-jsonrpc.js.map +1 -0
  292. package/packages/mailx-store-web/web-jsonrpc.ts +116 -0
  293. package/packages/mailx-store-web/web-message-store.d.ts +16 -0
  294. package/packages/mailx-store-web/web-message-store.d.ts.map +1 -0
  295. package/packages/mailx-store-web/web-message-store.js +89 -0
  296. package/packages/mailx-store-web/web-message-store.js.map +1 -0
  297. package/packages/mailx-store-web/web-message-store.ts +97 -0
  298. package/packages/mailx-store-web/web-service.d.ts +111 -0
  299. package/packages/mailx-store-web/web-service.d.ts.map +1 -0
  300. package/packages/mailx-store-web/web-service.js +542 -0
  301. package/packages/mailx-store-web/web-service.js.map +1 -0
  302. package/packages/mailx-store-web/web-service.ts +616 -0
  303. package/packages/mailx-store-web/web-settings.d.ts +83 -0
  304. package/packages/mailx-store-web/web-settings.d.ts.map +1 -0
  305. package/packages/mailx-store-web/web-settings.js +491 -0
  306. package/packages/mailx-store-web/web-settings.js.map +1 -0
  307. package/packages/mailx-store-web/web-settings.ts +522 -0
  308. package/packages/mailx-store-web/worker-bundle.js +6838 -0
  309. package/packages/mailx-store-web/worker-entry.d.ts +8 -0
  310. package/packages/mailx-store-web/worker-entry.d.ts.map +1 -0
  311. package/packages/mailx-store-web/worker-entry.js +187 -0
  312. package/packages/mailx-store-web/worker-entry.js.map +1 -0
  313. package/packages/mailx-store-web/worker-entry.ts +215 -0
  314. package/packages/mailx-store-web/worker-tcp-transport.d.ts +28 -0
  315. package/packages/mailx-store-web/worker-tcp-transport.d.ts.map +1 -0
  316. package/packages/mailx-store-web/worker-tcp-transport.js +98 -0
  317. package/packages/mailx-store-web/worker-tcp-transport.js.map +1 -0
  318. package/packages/mailx-store-web/worker-tcp-transport.ts +101 -0
  319. package/packages/mailx-types/.gitattributes +10 -0
  320. package/packages/mailx-types/index.d.ts +319 -0
  321. package/packages/mailx-types/index.d.ts.map +1 -0
  322. package/packages/mailx-types/index.js +243 -0
  323. package/packages/mailx-types/index.js.map +1 -0
  324. package/packages/mailx-types/index.ts +498 -0
  325. package/packages/mailx-types/package.json +16 -0
  326. package/packages/mailx-types/tsconfig.json +9 -0
  327. package/packages/mailx-types/tsconfig.tsbuildinfo +1 -0
  328. package/todo.json +13 -0
  329. package/tsconfig.base.json +31 -0
  330. package/tsconfig.json +9 -0
@@ -0,0 +1,322 @@
1
+ /**
2
+ * @bobfrankston/mailx-api
3
+ * Thin Express Router — delegates all logic to mailx-service.
4
+ */
5
+ import { Router } from "express";
6
+ import { MailxService } from "@bobfrankston/mailx-service";
7
+ export function createApiRouter(db, imapManager) {
8
+ const svc = new MailxService(db, imapManager);
9
+ const router = Router();
10
+ router.use((req, res, next) => { res.type("json"); res.set("Cache-Control", "no-store"); next(); });
11
+ // ── Accounts ──
12
+ router.get("/accounts", (req, res) => { res.json(svc.getAccounts()); });
13
+ // ── Folders ──
14
+ router.get("/folders/:accountId", (req, res) => { res.json(svc.getFolders(req.params.accountId)); });
15
+ // ── Messages ──
16
+ router.get("/messages/unified/inbox", (req, res) => {
17
+ res.json(svc.getUnifiedInbox(Number(req.query.page) || 1, Number(req.query.pageSize) || 50));
18
+ });
19
+ router.get("/messages/:accountId/:folderId", (req, res) => {
20
+ res.json(svc.getMessages(req.params.accountId, Number(req.params.folderId), Number(req.query.page) || 1, Number(req.query.pageSize) || 50, req.query.sort || "date", req.query.sortDir || "desc", req.query.search));
21
+ });
22
+ router.get("/message/:accountId/:uid", async (req, res) => {
23
+ try {
24
+ const msg = await svc.getMessage(req.params.accountId, Number(req.params.uid), req.query.allowRemote === "true", req.query.folderId ? Number(req.query.folderId) : undefined);
25
+ res.json(msg);
26
+ }
27
+ catch (e) {
28
+ res.status(e.message === "Message not found" ? 404 : 500).json({ error: e.message });
29
+ }
30
+ });
31
+ router.patch("/message/:accountId/:uid/flags", async (req, res) => {
32
+ try {
33
+ await svc.updateFlags(req.params.accountId, Number(req.params.uid), req.body.flags);
34
+ res.json({ ok: true });
35
+ }
36
+ catch (e) {
37
+ res.status(500).json({ error: e.message });
38
+ }
39
+ });
40
+ // ── Remote content allow-list ──
41
+ router.post("/settings/allow-remote", (req, res) => {
42
+ svc.allowRemoteContent(req.body.type, req.body.value);
43
+ res.json({ ok: true });
44
+ });
45
+ // ── Search ──
46
+ router.get("/search", async (req, res) => {
47
+ try {
48
+ const result = await svc.search(req.query.q || "", Number(req.query.page) || 1, Number(req.query.pageSize) || 50, req.query.scope || "all", req.query.accountId, Number(req.query.folderId) || 0);
49
+ res.json(result);
50
+ }
51
+ catch (e) {
52
+ res.status(500).json({ error: e.message });
53
+ }
54
+ });
55
+ router.post("/search/rebuild", (req, res) => {
56
+ res.json({ ok: true, indexed: svc.rebuildSearchIndex() });
57
+ });
58
+ // ── Sync ──
59
+ router.get("/sync/pending", (req, res) => { res.json(svc.getSyncPending()); });
60
+ router.post("/sync", async (req, res) => {
61
+ try {
62
+ await svc.syncAll();
63
+ res.json({ ok: true });
64
+ }
65
+ catch (e) {
66
+ res.status(500).json({ error: e.message });
67
+ }
68
+ });
69
+ router.post("/sync/:accountId", async (req, res) => {
70
+ try {
71
+ await svc.syncAccount(req.params.accountId);
72
+ res.json({ ok: true });
73
+ }
74
+ catch (e) {
75
+ res.status(500).json({ error: e.message });
76
+ }
77
+ });
78
+ router.post("/reauth/:accountId", async (req, res) => {
79
+ try {
80
+ const ok = await svc.reauthenticate(req.params.accountId);
81
+ res.json({ ok });
82
+ }
83
+ catch (e) {
84
+ res.status(500).json({ error: e.message });
85
+ }
86
+ });
87
+ // ── Autocomplete ──
88
+ router.post("/autocomplete", async (req, res) => {
89
+ try {
90
+ res.json(await svc.autocomplete(req.body));
91
+ }
92
+ catch (e) {
93
+ res.status(500).json({ error: e.message, suggestion: "" });
94
+ }
95
+ });
96
+ router.get("/autocomplete/settings", (req, res) => {
97
+ res.json(svc.getAutocompleteSettings());
98
+ });
99
+ router.post("/autocomplete/settings", (req, res) => {
100
+ try {
101
+ svc.saveAutocompleteSettings(req.body);
102
+ res.json({ ok: true });
103
+ }
104
+ catch (e) {
105
+ res.status(500).json({ error: e.message });
106
+ }
107
+ });
108
+ // ── First-time setup ──
109
+ router.post("/setup", async (req, res) => {
110
+ try {
111
+ const { name, email, password } = req.body;
112
+ const result = await svc.setupAccount(name, email, password);
113
+ if (!result.ok)
114
+ res.status(400);
115
+ res.json(result);
116
+ }
117
+ catch (e) {
118
+ res.status(500).json({ error: e.message });
119
+ }
120
+ });
121
+ // ── Repair: restore accounts from DB cache to settings, re-register IMAP ──
122
+ router.post("/repair-accounts", async (req, res) => {
123
+ try {
124
+ const result = await svc.repairAccounts();
125
+ res.json(result);
126
+ }
127
+ catch (e) {
128
+ res.status(500).json({ error: e.message });
129
+ }
130
+ });
131
+ // ── Send ──
132
+ router.post("/send", async (req, res) => {
133
+ try {
134
+ await svc.send(req.body);
135
+ res.json({ ok: true, queued: true });
136
+ }
137
+ catch (e) {
138
+ console.error(` Send error: ${e.message}`);
139
+ res.status(500).json({ error: e.message });
140
+ }
141
+ });
142
+ // ── Bulk operations ──
143
+ router.post("/messages/delete", async (req, res) => {
144
+ try {
145
+ const { accountId, uids } = req.body;
146
+ await svc.deleteMessages(accountId, uids);
147
+ res.json({ ok: true, count: uids.length });
148
+ }
149
+ catch (e) {
150
+ res.status(500).json({ error: e.message });
151
+ }
152
+ });
153
+ router.post("/messages/move", async (req, res) => {
154
+ try {
155
+ const { accountId, uids, targetFolderId, targetAccountId } = req.body;
156
+ if (targetAccountId && targetAccountId !== accountId) {
157
+ // Cross-account: must do one at a time
158
+ for (const uid of uids) {
159
+ await svc.moveMessage(accountId, uid, targetFolderId, targetAccountId);
160
+ }
161
+ }
162
+ else {
163
+ await svc.moveMessages(accountId, uids, targetFolderId);
164
+ }
165
+ res.json({ ok: true, count: uids.length });
166
+ }
167
+ catch (e) {
168
+ res.status(500).json({ error: e.message });
169
+ }
170
+ });
171
+ router.post("/messages/spam", async (req, res) => {
172
+ try {
173
+ const { accountId, uids } = req.body;
174
+ const result = await svc.markAsSpamMessages(accountId, uids);
175
+ res.json({ ok: true, ...result });
176
+ }
177
+ catch (e) {
178
+ res.status(500).json({ error: e.message });
179
+ }
180
+ });
181
+ // ── Delete (single — kept for backward compat) ──
182
+ router.delete("/message/:accountId/:uid", async (req, res) => {
183
+ try {
184
+ await svc.deleteMessage(req.params.accountId, Number(req.params.uid));
185
+ res.json({ ok: true });
186
+ }
187
+ catch (e) {
188
+ const status = e.message === "Message not found" ? 404 : 500;
189
+ res.status(status).json({ error: e.message });
190
+ }
191
+ });
192
+ // ── Move ──
193
+ router.post("/message/:accountId/:uid/move", async (req, res) => {
194
+ try {
195
+ await svc.moveMessage(req.params.accountId, Number(req.params.uid), req.body.targetFolderId, req.body.targetAccountId);
196
+ res.json({ ok: true });
197
+ }
198
+ catch (e) {
199
+ const status = e.message === "Message not found" ? 404 : 500;
200
+ res.status(status).json({ error: e.message });
201
+ }
202
+ });
203
+ // ── Undelete ──
204
+ router.post("/message/:accountId/:uid/undelete", async (req, res) => {
205
+ try {
206
+ await svc.undeleteMessage(req.params.accountId, Number(req.params.uid), req.body.folderId);
207
+ res.json({ ok: true });
208
+ }
209
+ catch (e) {
210
+ res.status(500).json({ error: e.message });
211
+ }
212
+ });
213
+ // ── Direct IMAP delete ──
214
+ router.delete("/imap/:accountId/:folderPath/:uid", async (req, res) => {
215
+ try {
216
+ await svc.deleteOnServer(req.params.accountId, decodeURIComponent(req.params.folderPath), Number(req.params.uid));
217
+ res.json({ ok: true });
218
+ }
219
+ catch (e) {
220
+ res.status(500).json({ error: e.message });
221
+ }
222
+ });
223
+ // ── Folder management ──
224
+ router.post("/folder/:accountId", async (req, res) => {
225
+ try {
226
+ await svc.createFolder(req.params.accountId, req.body.parentPath, req.body.name);
227
+ res.json({ ok: true });
228
+ }
229
+ catch (e) {
230
+ res.status(500).json({ error: e.message });
231
+ }
232
+ });
233
+ router.post("/folder/:accountId/:folderId/rename", async (req, res) => {
234
+ try {
235
+ await svc.renameFolder(req.params.accountId, Number(req.params.folderId), req.body.newName);
236
+ res.json({ ok: true });
237
+ }
238
+ catch (e) {
239
+ res.status(500).json({ error: e.message });
240
+ }
241
+ });
242
+ router.delete("/folder/:accountId/:folderId", async (req, res) => {
243
+ try {
244
+ await svc.deleteFolder(req.params.accountId, Number(req.params.folderId));
245
+ res.json({ ok: true });
246
+ }
247
+ catch (e) {
248
+ res.status(500).json({ error: e.message });
249
+ }
250
+ });
251
+ router.post("/folder/:accountId/:folderId/mark-read", async (req, res) => {
252
+ try {
253
+ svc.markFolderRead(Number(req.params.folderId));
254
+ res.json({ ok: true });
255
+ }
256
+ catch (e) {
257
+ res.status(500).json({ error: e.message });
258
+ }
259
+ });
260
+ router.post("/folder/:accountId/:folderId/empty", async (req, res) => {
261
+ try {
262
+ await svc.emptyFolder(req.params.accountId, Number(req.params.folderId));
263
+ res.json({ ok: true });
264
+ }
265
+ catch (e) {
266
+ res.status(500).json({ error: e.message });
267
+ }
268
+ });
269
+ // ── Attachments ──
270
+ router.get("/message/:accountId/:uid/attachment/:attachmentId", async (req, res) => {
271
+ try {
272
+ const att = await svc.getAttachment(req.params.accountId, Number(req.params.uid), Number(req.params.attachmentId), req.query.folderId ? Number(req.query.folderId) : undefined);
273
+ res.set("Content-Type", att.contentType);
274
+ res.set("Content-Disposition", `inline; filename="${att.filename}"`);
275
+ res.send(att.content);
276
+ }
277
+ catch (e) {
278
+ const status = e.message.includes("not found") || e.message.includes("not available") ? 404 : 500;
279
+ res.status(status).json({ error: e.message });
280
+ }
281
+ });
282
+ // ── Drafts ──
283
+ router.post("/draft", async (req, res) => {
284
+ try {
285
+ const { accountId, subject, bodyHtml, bodyText, to, cc, previousDraftUid, draftId } = req.body;
286
+ const result = await svc.saveDraft(accountId, subject, bodyHtml, bodyText, to, cc, previousDraftUid, draftId);
287
+ res.json({ ok: true, draftUid: result.draftUid, draftId: result.draftId });
288
+ }
289
+ catch (e) {
290
+ res.status(500).json({ error: e.message });
291
+ }
292
+ });
293
+ router.delete("/draft", async (req, res) => {
294
+ try {
295
+ if (req.body.accountId && (req.body.draftUid || req.body.draftId))
296
+ await svc.deleteDraft(req.body.accountId, req.body.draftUid || 0, req.body.draftId);
297
+ res.json({ ok: true });
298
+ }
299
+ catch (e) {
300
+ res.status(500).json({ error: e.message });
301
+ }
302
+ });
303
+ // ── Contacts ──
304
+ router.get("/contacts", (req, res) => { res.json(svc.searchContacts(req.query.q || "")); });
305
+ router.post("/contacts/sync-google", async (req, res) => {
306
+ try {
307
+ await svc.syncGoogleContacts();
308
+ res.json({ ok: true });
309
+ }
310
+ catch (e) {
311
+ res.status(500).json({ error: e.message });
312
+ }
313
+ });
314
+ router.post("/contacts/seed", (req, res) => { res.json({ ok: true, added: svc.seedContacts() }); });
315
+ // ── Settings ──
316
+ router.get("/settings", (req, res) => { res.json(svc.getSettings()); });
317
+ router.put("/settings", (req, res) => { svc.saveSettings(req.body); res.json({ ok: true }); });
318
+ return router;
319
+ }
320
+ // Re-export the service for direct use (Android bridge, worker thread, etc.)
321
+ export { MailxService } from "@bobfrankston/mailx-service";
322
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,283 @@
1
+ /**
2
+ * @bobfrankston/mailx-api
3
+ * Thin Express Router — delegates all logic to mailx-service.
4
+ */
5
+
6
+ import { Router } from "express";
7
+ import { MailxDB } from "@bobfrankston/mailx-store";
8
+ import { ImapManager } from "@bobfrankston/mailx-imap";
9
+ import { MailxService } from "@bobfrankston/mailx-service";
10
+ import { loadSettings } from "@bobfrankston/mailx-settings";
11
+
12
+ export function createApiRouter(db: MailxDB, imapManager: ImapManager): Router {
13
+ const svc = new MailxService(db, imapManager);
14
+ const router = Router();
15
+ router.use((req, res, next) => { res.type("json"); res.set("Cache-Control", "no-store"); next(); });
16
+
17
+ // ── Accounts ──
18
+ router.get("/accounts", (req, res) => { res.json(svc.getAccounts()); });
19
+
20
+ // ── Folders ──
21
+ router.get("/folders/:accountId", (req, res) => { res.json(svc.getFolders(req.params.accountId)); });
22
+
23
+ // ── Messages ──
24
+ router.get("/messages/unified/inbox", (req, res) => {
25
+ res.json(svc.getUnifiedInbox(Number(req.query.page) || 1, Number(req.query.pageSize) || 50));
26
+ });
27
+
28
+ router.get("/messages/:accountId/:folderId", (req, res) => {
29
+ res.json(svc.getMessages(
30
+ req.params.accountId, Number(req.params.folderId),
31
+ Number(req.query.page) || 1, Number(req.query.pageSize) || 50,
32
+ (req.query.sort as string) || "date", (req.query.sortDir as string) || "desc",
33
+ req.query.search as string
34
+ ));
35
+ });
36
+
37
+ router.get("/message/:accountId/:uid", async (req, res) => {
38
+ try {
39
+ const msg = await svc.getMessage(
40
+ req.params.accountId, Number(req.params.uid),
41
+ req.query.allowRemote === "true",
42
+ req.query.folderId ? Number(req.query.folderId) : undefined
43
+ );
44
+ res.json(msg);
45
+ } catch (e: any) {
46
+ res.status(e.message === "Message not found" ? 404 : 500).json({ error: e.message });
47
+ }
48
+ });
49
+
50
+ router.patch("/message/:accountId/:uid/flags", async (req, res) => {
51
+ try {
52
+ await svc.updateFlags(req.params.accountId, Number(req.params.uid), req.body.flags);
53
+ res.json({ ok: true });
54
+ } catch (e: any) { res.status(500).json({ error: e.message }); }
55
+ });
56
+
57
+ // ── Remote content allow-list ──
58
+ router.post("/settings/allow-remote", (req, res) => {
59
+ svc.allowRemoteContent(req.body.type, req.body.value);
60
+ res.json({ ok: true });
61
+ });
62
+
63
+ // ── Search ──
64
+ router.get("/search", async (req, res) => {
65
+ try {
66
+ const result = await svc.search(
67
+ req.query.q as string || "", Number(req.query.page) || 1, Number(req.query.pageSize) || 50,
68
+ req.query.scope as string || "all", req.query.accountId as string, Number(req.query.folderId) || 0
69
+ );
70
+ res.json(result);
71
+ } catch (e: any) { res.status(500).json({ error: e.message }); }
72
+ });
73
+
74
+ router.post("/search/rebuild", (req, res) => {
75
+ res.json({ ok: true, indexed: svc.rebuildSearchIndex() });
76
+ });
77
+
78
+ // ── Sync ──
79
+ router.get("/sync/pending", (req, res) => { res.json(svc.getSyncPending()); });
80
+
81
+ router.post("/sync", async (req, res) => {
82
+ try { await svc.syncAll(); res.json({ ok: true }); }
83
+ catch (e: any) { res.status(500).json({ error: e.message }); }
84
+ });
85
+
86
+ router.post("/sync/:accountId", async (req, res) => {
87
+ try { await svc.syncAccount(req.params.accountId); res.json({ ok: true }); }
88
+ catch (e: any) { res.status(500).json({ error: e.message }); }
89
+ });
90
+
91
+ router.post("/reauth/:accountId", async (req, res) => {
92
+ try {
93
+ const ok = await svc.reauthenticate(req.params.accountId);
94
+ res.json({ ok });
95
+ } catch (e: any) { res.status(500).json({ error: e.message }); }
96
+ });
97
+
98
+ // ── Autocomplete ──
99
+ router.post("/autocomplete", async (req, res) => {
100
+ try { res.json(await svc.autocomplete(req.body)); }
101
+ catch (e: any) { res.status(500).json({ error: e.message, suggestion: "" }); }
102
+ });
103
+
104
+ router.get("/autocomplete/settings", (req, res) => {
105
+ res.json(svc.getAutocompleteSettings());
106
+ });
107
+
108
+ router.post("/autocomplete/settings", (req, res) => {
109
+ try { svc.saveAutocompleteSettings(req.body); res.json({ ok: true }); }
110
+ catch (e: any) { res.status(500).json({ error: e.message }); }
111
+ });
112
+
113
+ // ── First-time setup ──
114
+ router.post("/setup", async (req, res) => {
115
+ try {
116
+ const { name, email, password } = req.body;
117
+ const result = await svc.setupAccount(name, email, password);
118
+ if (!result.ok) res.status(400);
119
+ res.json(result);
120
+ } catch (e: any) {
121
+ res.status(500).json({ error: e.message });
122
+ }
123
+ });
124
+
125
+ // ── Repair: restore accounts from DB cache to settings, re-register IMAP ──
126
+ router.post("/repair-accounts", async (req, res) => {
127
+ try {
128
+ const result = await svc.repairAccounts();
129
+ res.json(result);
130
+ } catch (e: any) {
131
+ res.status(500).json({ error: e.message });
132
+ }
133
+ });
134
+
135
+ // ── Send ──
136
+ router.post("/send", async (req, res) => {
137
+ try { await svc.send(req.body); res.json({ ok: true, queued: true }); }
138
+ catch (e: any) { console.error(` Send error: ${e.message}`); res.status(500).json({ error: e.message }); }
139
+ });
140
+
141
+ // ── Bulk operations ──
142
+ router.post("/messages/delete", async (req, res) => {
143
+ try {
144
+ const { accountId, uids } = req.body;
145
+ await svc.deleteMessages(accountId, uids);
146
+ res.json({ ok: true, count: uids.length });
147
+ } catch (e: any) { res.status(500).json({ error: e.message }); }
148
+ });
149
+
150
+ router.post("/messages/move", async (req, res) => {
151
+ try {
152
+ const { accountId, uids, targetFolderId, targetAccountId } = req.body;
153
+ if (targetAccountId && targetAccountId !== accountId) {
154
+ // Cross-account: must do one at a time
155
+ for (const uid of uids) {
156
+ await svc.moveMessage(accountId, uid, targetFolderId, targetAccountId);
157
+ }
158
+ } else {
159
+ await svc.moveMessages(accountId, uids, targetFolderId);
160
+ }
161
+ res.json({ ok: true, count: uids.length });
162
+ } catch (e: any) { res.status(500).json({ error: e.message }); }
163
+ });
164
+
165
+ router.post("/messages/spam", async (req, res) => {
166
+ try {
167
+ const { accountId, uids } = req.body;
168
+ const result = await svc.markAsSpamMessages(accountId, uids);
169
+ res.json({ ok: true, ...result });
170
+ } catch (e: any) { res.status(500).json({ error: e.message }); }
171
+ });
172
+
173
+ // ── Delete (single — kept for backward compat) ──
174
+ router.delete("/message/:accountId/:uid", async (req, res) => {
175
+ try { await svc.deleteMessage(req.params.accountId, Number(req.params.uid)); res.json({ ok: true }); }
176
+ catch (e: any) {
177
+ const status = e.message === "Message not found" ? 404 : 500;
178
+ res.status(status).json({ error: e.message });
179
+ }
180
+ });
181
+
182
+ // ── Move ──
183
+ router.post("/message/:accountId/:uid/move", async (req, res) => {
184
+ try {
185
+ await svc.moveMessage(req.params.accountId, Number(req.params.uid), req.body.targetFolderId, req.body.targetAccountId);
186
+ res.json({ ok: true });
187
+ } catch (e: any) {
188
+ const status = e.message === "Message not found" ? 404 : 500;
189
+ res.status(status).json({ error: e.message });
190
+ }
191
+ });
192
+
193
+ // ── Undelete ──
194
+ router.post("/message/:accountId/:uid/undelete", async (req, res) => {
195
+ try { await svc.undeleteMessage(req.params.accountId, Number(req.params.uid), req.body.folderId); res.json({ ok: true }); }
196
+ catch (e: any) { res.status(500).json({ error: e.message }); }
197
+ });
198
+
199
+ // ── Direct IMAP delete ──
200
+ router.delete("/imap/:accountId/:folderPath/:uid", async (req, res) => {
201
+ try {
202
+ await svc.deleteOnServer(req.params.accountId, decodeURIComponent(req.params.folderPath), Number(req.params.uid));
203
+ res.json({ ok: true });
204
+ } catch (e: any) { res.status(500).json({ error: e.message }); }
205
+ });
206
+
207
+ // ── Folder management ──
208
+ router.post("/folder/:accountId", async (req, res) => {
209
+ try { await svc.createFolder(req.params.accountId, req.body.parentPath, req.body.name); res.json({ ok: true }); }
210
+ catch (e: any) { res.status(500).json({ error: e.message }); }
211
+ });
212
+
213
+ router.post("/folder/:accountId/:folderId/rename", async (req, res) => {
214
+ try { await svc.renameFolder(req.params.accountId, Number(req.params.folderId), req.body.newName); res.json({ ok: true }); }
215
+ catch (e: any) { res.status(500).json({ error: e.message }); }
216
+ });
217
+
218
+ router.delete("/folder/:accountId/:folderId", async (req, res) => {
219
+ try { await svc.deleteFolder(req.params.accountId, Number(req.params.folderId)); res.json({ ok: true }); }
220
+ catch (e: any) { res.status(500).json({ error: e.message }); }
221
+ });
222
+
223
+ router.post("/folder/:accountId/:folderId/mark-read", async (req, res) => {
224
+ try { svc.markFolderRead(Number(req.params.folderId)); res.json({ ok: true }); }
225
+ catch (e: any) { res.status(500).json({ error: e.message }); }
226
+ });
227
+
228
+ router.post("/folder/:accountId/:folderId/empty", async (req, res) => {
229
+ try { await svc.emptyFolder(req.params.accountId, Number(req.params.folderId)); res.json({ ok: true }); }
230
+ catch (e: any) { res.status(500).json({ error: e.message }); }
231
+ });
232
+
233
+ // ── Attachments ──
234
+ router.get("/message/:accountId/:uid/attachment/:attachmentId", async (req, res) => {
235
+ try {
236
+ const att = await svc.getAttachment(
237
+ req.params.accountId, Number(req.params.uid), Number(req.params.attachmentId),
238
+ req.query.folderId ? Number(req.query.folderId) : undefined
239
+ );
240
+ res.set("Content-Type", att.contentType);
241
+ res.set("Content-Disposition", `inline; filename="${att.filename}"`);
242
+ res.send(att.content);
243
+ } catch (e: any) {
244
+ const status = e.message.includes("not found") || e.message.includes("not available") ? 404 : 500;
245
+ res.status(status).json({ error: e.message });
246
+ }
247
+ });
248
+
249
+ // ── Drafts ──
250
+ router.post("/draft", async (req, res) => {
251
+ try {
252
+ const { accountId, subject, bodyHtml, bodyText, to, cc, previousDraftUid, draftId } = req.body;
253
+ const result = await svc.saveDraft(accountId, subject, bodyHtml, bodyText, to, cc, previousDraftUid, draftId);
254
+ res.json({ ok: true, draftUid: result.draftUid, draftId: result.draftId });
255
+ } catch (e: any) { res.status(500).json({ error: e.message }); }
256
+ });
257
+
258
+ router.delete("/draft", async (req, res) => {
259
+ try {
260
+ if (req.body.accountId && (req.body.draftUid || req.body.draftId)) await svc.deleteDraft(req.body.accountId, req.body.draftUid || 0, req.body.draftId);
261
+ res.json({ ok: true });
262
+ } catch (e: any) { res.status(500).json({ error: e.message }); }
263
+ });
264
+
265
+ // ── Contacts ──
266
+ router.get("/contacts", (req, res) => { res.json(svc.searchContacts(req.query.q as string || "")); });
267
+
268
+ router.post("/contacts/sync-google", async (req, res) => {
269
+ try { await svc.syncGoogleContacts(); res.json({ ok: true }); }
270
+ catch (e: any) { res.status(500).json({ error: e.message }); }
271
+ });
272
+
273
+ router.post("/contacts/seed", (req, res) => { res.json({ ok: true, added: svc.seedContacts() }); });
274
+
275
+ // ── Settings ──
276
+ router.get("/settings", (req, res) => { res.json(svc.getSettings()); });
277
+ router.put("/settings", (req, res) => { svc.saveSettings(req.body); res.json({ ok: true }); });
278
+
279
+ return router;
280
+ }
281
+
282
+ // Re-export the service for direct use (Android bridge, worker thread, etc.)
283
+ export { MailxService } from "@bobfrankston/mailx-service";
@@ -0,0 +1,27 @@
1
+ {
2
+ "name": "@bobfrankston/mailx-api",
3
+ "version": "0.1.3",
4
+ "type": "module",
5
+ "main": "index.js",
6
+ "types": "index.d.ts",
7
+ "scripts": {
8
+ "build": "tsc"
9
+ },
10
+ "license": "ISC",
11
+ "dependencies": {
12
+ "@bobfrankston/mailx-types": "file:../mailx-types",
13
+ "@bobfrankston/mailx-store": "file:../mailx-store",
14
+ "@bobfrankston/mailx-imap": "file:../mailx-imap",
15
+ "@bobfrankston/mailx-settings": "file:../mailx-settings",
16
+ "@bobfrankston/mailx-service": "file:../mailx-service",
17
+ "express": "^4.21.0"
18
+ },
19
+ "devDependencies": {
20
+ "@types/express": "^5.0.0",
21
+ "@types/nodemailer": "^6.4.0"
22
+ },
23
+ "repository": {
24
+ "type": "git",
25
+ "url": "https://github.com/BobFrankston/mailx-api.git"
26
+ }
27
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "extends": "../../tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "outDir": ".",
5
+ "rootDir": "."
6
+ },
7
+ "include": ["*.ts"],
8
+ "exclude": ["node_modules", "prev", "cruft", "tests"]
9
+ }