@bobfrankston/mailx 1.0.1
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.
- package/.tswalk.json +3366 -0
- package/README.md +160 -0
- package/bin/mailx.js +58 -0
- package/client/app.js +431 -0
- package/client/components/folder-tree.js +286 -0
- package/client/components/message-list.js +230 -0
- package/client/components/message-viewer.js +161 -0
- package/client/compose/compose.css +197 -0
- package/client/compose/compose.html +45 -0
- package/client/compose/compose.js +335 -0
- package/client/favicon.svg +11 -0
- package/client/index.html +100 -0
- package/client/lib/api-client.js +67 -0
- package/client/package.json +9 -0
- package/client/styles/components.css +361 -0
- package/client/styles/layout.css +69 -0
- package/launch.ps1 +20 -0
- package/launcher/Cargo.lock +3167 -0
- package/launcher/Cargo.toml +13 -0
- package/launcher/build.cmd +4 -0
- package/launcher/build.rs +8 -0
- package/launcher/mailx.ico +0 -0
- package/launcher/release.cmd +4 -0
- package/launcher/src/main.rs +371 -0
- package/mailx.cmd +2 -0
- package/mailx.db +0 -0
- package/mailx.db-shm +0 -0
- package/mailx.db-wal +0 -0
- package/mailx.json +9 -0
- package/package.json +51 -0
- package/packages/mailx-api/index.d.ts +9 -0
- package/packages/mailx-api/index.js +375 -0
- package/packages/mailx-api/node_modules/nodemailer/.ncurc.js +9 -0
- package/packages/mailx-api/node_modules/nodemailer/.prettierignore +8 -0
- package/packages/mailx-api/node_modules/nodemailer/.prettierrc +12 -0
- package/packages/mailx-api/node_modules/nodemailer/.prettierrc.js +10 -0
- package/packages/mailx-api/node_modules/nodemailer/.release-please-config.json +9 -0
- package/packages/mailx-api/node_modules/nodemailer/LICENSE +16 -0
- package/packages/mailx-api/node_modules/nodemailer/README.md +86 -0
- package/packages/mailx-api/node_modules/nodemailer/SECURITY.txt +22 -0
- package/packages/mailx-api/node_modules/nodemailer/eslint.config.js +88 -0
- package/packages/mailx-api/node_modules/nodemailer/lib/addressparser/index.js +383 -0
- package/packages/mailx-api/node_modules/nodemailer/lib/base64/index.js +139 -0
- package/packages/mailx-api/node_modules/nodemailer/lib/dkim/index.js +253 -0
- package/packages/mailx-api/node_modules/nodemailer/lib/dkim/message-parser.js +155 -0
- package/packages/mailx-api/node_modules/nodemailer/lib/dkim/relaxed-body.js +154 -0
- package/packages/mailx-api/node_modules/nodemailer/lib/dkim/sign.js +117 -0
- package/packages/mailx-api/node_modules/nodemailer/lib/fetch/cookies.js +281 -0
- package/packages/mailx-api/node_modules/nodemailer/lib/fetch/index.js +280 -0
- package/packages/mailx-api/node_modules/nodemailer/lib/json-transport/index.js +82 -0
- package/packages/mailx-api/node_modules/nodemailer/lib/mail-composer/index.js +629 -0
- package/packages/mailx-api/node_modules/nodemailer/lib/mailer/index.js +441 -0
- package/packages/mailx-api/node_modules/nodemailer/lib/mailer/mail-message.js +316 -0
- package/packages/mailx-api/node_modules/nodemailer/lib/mime-funcs/index.js +625 -0
- package/packages/mailx-api/node_modules/nodemailer/lib/mime-funcs/mime-types.js +2113 -0
- package/packages/mailx-api/node_modules/nodemailer/lib/mime-node/index.js +1316 -0
- package/packages/mailx-api/node_modules/nodemailer/lib/mime-node/last-newline.js +33 -0
- package/packages/mailx-api/node_modules/nodemailer/lib/mime-node/le-unix.js +43 -0
- package/packages/mailx-api/node_modules/nodemailer/lib/mime-node/le-windows.js +52 -0
- package/packages/mailx-api/node_modules/nodemailer/lib/nodemailer.js +157 -0
- package/packages/mailx-api/node_modules/nodemailer/lib/punycode/index.js +460 -0
- package/packages/mailx-api/node_modules/nodemailer/lib/qp/index.js +227 -0
- package/packages/mailx-api/node_modules/nodemailer/lib/sendmail-transport/index.js +210 -0
- package/packages/mailx-api/node_modules/nodemailer/lib/ses-transport/index.js +234 -0
- package/packages/mailx-api/node_modules/nodemailer/lib/shared/index.js +754 -0
- package/packages/mailx-api/node_modules/nodemailer/lib/smtp-connection/data-stream.js +108 -0
- package/packages/mailx-api/node_modules/nodemailer/lib/smtp-connection/http-proxy-client.js +143 -0
- package/packages/mailx-api/node_modules/nodemailer/lib/smtp-connection/index.js +1870 -0
- package/packages/mailx-api/node_modules/nodemailer/lib/smtp-pool/index.js +652 -0
- package/packages/mailx-api/node_modules/nodemailer/lib/smtp-pool/pool-resource.js +259 -0
- package/packages/mailx-api/node_modules/nodemailer/lib/smtp-transport/index.js +421 -0
- package/packages/mailx-api/node_modules/nodemailer/lib/stream-transport/index.js +135 -0
- package/packages/mailx-api/node_modules/nodemailer/lib/well-known/index.js +47 -0
- package/packages/mailx-api/node_modules/nodemailer/lib/well-known/services.json +611 -0
- package/packages/mailx-api/node_modules/nodemailer/lib/xoauth2/index.js +427 -0
- package/packages/mailx-api/node_modules/nodemailer/package.json +47 -0
- package/packages/mailx-api/package.json +24 -0
- package/packages/mailx-api/tsconfig.tsbuildinfo +1 -0
- package/packages/mailx-compose/index.d.ts +21 -0
- package/packages/mailx-compose/index.js +61 -0
- package/packages/mailx-compose/package.json +14 -0
- package/packages/mailx-imap/index.d.ts +105 -0
- package/packages/mailx-imap/index.js +1026 -0
- package/packages/mailx-imap/node_modules/nodemailer/.ncurc.js +9 -0
- package/packages/mailx-imap/node_modules/nodemailer/.prettierignore +8 -0
- package/packages/mailx-imap/node_modules/nodemailer/.prettierrc +12 -0
- package/packages/mailx-imap/node_modules/nodemailer/.prettierrc.js +10 -0
- package/packages/mailx-imap/node_modules/nodemailer/.release-please-config.json +9 -0
- package/packages/mailx-imap/node_modules/nodemailer/LICENSE +16 -0
- package/packages/mailx-imap/node_modules/nodemailer/README.md +86 -0
- package/packages/mailx-imap/node_modules/nodemailer/SECURITY.txt +22 -0
- package/packages/mailx-imap/node_modules/nodemailer/eslint.config.js +88 -0
- package/packages/mailx-imap/node_modules/nodemailer/lib/addressparser/index.js +383 -0
- package/packages/mailx-imap/node_modules/nodemailer/lib/base64/index.js +139 -0
- package/packages/mailx-imap/node_modules/nodemailer/lib/dkim/index.js +253 -0
- package/packages/mailx-imap/node_modules/nodemailer/lib/dkim/message-parser.js +155 -0
- package/packages/mailx-imap/node_modules/nodemailer/lib/dkim/relaxed-body.js +154 -0
- package/packages/mailx-imap/node_modules/nodemailer/lib/dkim/sign.js +117 -0
- package/packages/mailx-imap/node_modules/nodemailer/lib/fetch/cookies.js +281 -0
- package/packages/mailx-imap/node_modules/nodemailer/lib/fetch/index.js +280 -0
- package/packages/mailx-imap/node_modules/nodemailer/lib/json-transport/index.js +82 -0
- package/packages/mailx-imap/node_modules/nodemailer/lib/mail-composer/index.js +629 -0
- package/packages/mailx-imap/node_modules/nodemailer/lib/mailer/index.js +441 -0
- package/packages/mailx-imap/node_modules/nodemailer/lib/mailer/mail-message.js +316 -0
- package/packages/mailx-imap/node_modules/nodemailer/lib/mime-funcs/index.js +625 -0
- package/packages/mailx-imap/node_modules/nodemailer/lib/mime-funcs/mime-types.js +2113 -0
- package/packages/mailx-imap/node_modules/nodemailer/lib/mime-node/index.js +1316 -0
- package/packages/mailx-imap/node_modules/nodemailer/lib/mime-node/last-newline.js +33 -0
- package/packages/mailx-imap/node_modules/nodemailer/lib/mime-node/le-unix.js +43 -0
- package/packages/mailx-imap/node_modules/nodemailer/lib/mime-node/le-windows.js +52 -0
- package/packages/mailx-imap/node_modules/nodemailer/lib/nodemailer.js +157 -0
- package/packages/mailx-imap/node_modules/nodemailer/lib/punycode/index.js +460 -0
- package/packages/mailx-imap/node_modules/nodemailer/lib/qp/index.js +227 -0
- package/packages/mailx-imap/node_modules/nodemailer/lib/sendmail-transport/index.js +210 -0
- package/packages/mailx-imap/node_modules/nodemailer/lib/ses-transport/index.js +234 -0
- package/packages/mailx-imap/node_modules/nodemailer/lib/shared/index.js +754 -0
- package/packages/mailx-imap/node_modules/nodemailer/lib/smtp-connection/data-stream.js +108 -0
- package/packages/mailx-imap/node_modules/nodemailer/lib/smtp-connection/http-proxy-client.js +143 -0
- package/packages/mailx-imap/node_modules/nodemailer/lib/smtp-connection/index.js +1870 -0
- package/packages/mailx-imap/node_modules/nodemailer/lib/smtp-pool/index.js +652 -0
- package/packages/mailx-imap/node_modules/nodemailer/lib/smtp-pool/pool-resource.js +259 -0
- package/packages/mailx-imap/node_modules/nodemailer/lib/smtp-transport/index.js +421 -0
- package/packages/mailx-imap/node_modules/nodemailer/lib/stream-transport/index.js +135 -0
- package/packages/mailx-imap/node_modules/nodemailer/lib/well-known/index.js +47 -0
- package/packages/mailx-imap/node_modules/nodemailer/lib/well-known/services.json +611 -0
- package/packages/mailx-imap/node_modules/nodemailer/lib/xoauth2/index.js +427 -0
- package/packages/mailx-imap/node_modules/nodemailer/package.json +47 -0
- package/packages/mailx-imap/package.json +19 -0
- package/packages/mailx-imap/tsconfig.tsbuildinfo +1 -0
- package/packages/mailx-send/README.md +217 -0
- package/packages/mailx-send/cli-queue.d.ts +11 -0
- package/packages/mailx-send/cli-queue.js +59 -0
- package/packages/mailx-send/cli-send.d.ts +17 -0
- package/packages/mailx-send/cli-send.js +75 -0
- package/packages/mailx-send/cli.d.ts +22 -0
- package/packages/mailx-send/cli.js +115 -0
- package/packages/mailx-send/index.d.ts +77 -0
- package/packages/mailx-send/index.js +264 -0
- package/packages/mailx-send/mailsend/README.md +133 -0
- package/packages/mailx-send/mailsend/cli.d.ts +12 -0
- package/packages/mailx-send/mailsend/cli.js +70 -0
- package/packages/mailx-send/mailsend/index.d.ts +77 -0
- package/packages/mailx-send/mailsend/index.js +264 -0
- package/packages/mailx-send/mailsend/node_modules/.package-lock.json +49 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/LICENSE +21 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/README.md +15 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/assert/strict.d.ts +111 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/assert.d.ts +1078 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/async_hooks.d.ts +603 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/buffer.buffer.d.ts +472 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/buffer.d.ts +1934 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/child_process.d.ts +1476 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/cluster.d.ts +578 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/compatibility/disposable.d.ts +14 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/compatibility/index.d.ts +9 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/compatibility/indexable.d.ts +20 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/compatibility/iterators.d.ts +20 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/console.d.ts +452 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/constants.d.ts +21 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/crypto.d.ts +4545 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/dgram.d.ts +600 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/diagnostics_channel.d.ts +578 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/dns/promises.d.ts +503 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/dns.d.ts +923 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/domain.d.ts +170 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/events.d.ts +976 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/fs/promises.d.ts +1295 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/fs.d.ts +4461 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/globals.d.ts +172 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/globals.typedarray.d.ts +38 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/http.d.ts +2089 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/http2.d.ts +2644 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/https.d.ts +579 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/index.d.ts +97 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/inspector.d.ts +253 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/inspector.generated.d.ts +4052 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/module.d.ts +891 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/net.d.ts +1057 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/os.d.ts +506 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/package.json +145 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/path.d.ts +200 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/perf_hooks.d.ts +968 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/process.d.ts +2084 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/punycode.d.ts +117 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/querystring.d.ts +152 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/readline/promises.d.ts +161 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/readline.d.ts +594 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/repl.d.ts +428 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/sea.d.ts +153 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/sqlite.d.ts +721 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/stream/consumers.d.ts +38 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/stream/promises.d.ts +90 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/stream/web.d.ts +622 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/stream.d.ts +1664 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/string_decoder.d.ts +67 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/test.d.ts +2163 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/timers/promises.d.ts +108 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/timers.d.ts +287 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/tls.d.ts +1319 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/trace_events.d.ts +197 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/ts5.6/buffer.buffer.d.ts +468 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/ts5.6/globals.typedarray.d.ts +34 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/ts5.6/index.d.ts +97 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/tty.d.ts +208 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/url.d.ts +984 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/util.d.ts +2606 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/v8.d.ts +920 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/vm.d.ts +1000 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/wasi.d.ts +181 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/web-globals/abortcontroller.d.ts +34 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/web-globals/domexception.d.ts +68 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/web-globals/events.d.ts +97 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/web-globals/fetch.d.ts +55 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/web-globals/navigator.d.ts +22 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/web-globals/storage.d.ts +24 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/worker_threads.d.ts +784 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/zlib.d.ts +747 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/LICENSE +21 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/README.md +15 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/index.d.ts +82 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/addressparser/index.d.ts +31 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/base64/index.d.ts +22 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/dkim/index.d.ts +45 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/dkim/message-parser.d.ts +75 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/dkim/relaxed-body.d.ts +75 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/dkim/sign.d.ts +21 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/fetch/cookies.d.ts +54 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/fetch/index.d.ts +38 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/json-transport/index.d.ts +53 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/mail-composer/index.d.ts +25 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/mailer/index.d.ts +283 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/mailer/mail-message.d.ts +32 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/mime-funcs/index.d.ts +87 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/mime-funcs/mime-types.d.ts +2 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/mime-node/index.d.ts +224 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/mime-node/last-newline.d.ts +9 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/qp/index.d.ts +23 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/sendmail-transport/index.d.ts +53 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/sendmail-transport/le-unix.d.ts +7 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/sendmail-transport/le-windows.d.ts +7 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/ses-transport/index.d.ts +146 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/shared/index.d.ts +58 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/smtp-connection/data-stream.d.ts +11 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/smtp-connection/http-proxy-client.d.ts +16 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/smtp-connection/index.d.ts +270 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/smtp-pool/index.d.ts +93 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/smtp-pool/pool-resource.d.ts +66 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/smtp-transport/index.d.ts +115 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/stream-transport/index.d.ts +59 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/well-known/index.d.ts +6 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/xoauth2/index.d.ts +114 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/package.json +38 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/.ncurc.js +9 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/.prettierignore +8 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/.prettierrc +12 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/.prettierrc.js +10 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/.release-please-config.json +9 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/LICENSE +16 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/README.md +86 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/SECURITY.txt +22 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/eslint.config.js +88 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/addressparser/index.js +383 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/base64/index.js +139 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/dkim/index.js +253 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/dkim/message-parser.js +155 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/dkim/relaxed-body.js +154 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/dkim/sign.js +117 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/fetch/cookies.js +281 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/fetch/index.js +280 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/json-transport/index.js +82 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/mail-composer/index.js +629 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/mailer/index.js +441 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/mailer/mail-message.js +316 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/mime-funcs/index.js +625 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/mime-funcs/mime-types.js +2113 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/mime-node/index.js +1316 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/mime-node/last-newline.js +33 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/mime-node/le-unix.js +43 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/mime-node/le-windows.js +52 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/nodemailer.js +157 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/punycode/index.js +460 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/qp/index.js +227 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/sendmail-transport/index.js +210 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/ses-transport/index.js +234 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/shared/index.js +754 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/smtp-connection/data-stream.js +108 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/smtp-connection/http-proxy-client.js +143 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/smtp-connection/index.js +1870 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/smtp-pool/index.js +652 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/smtp-pool/pool-resource.js +259 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/smtp-transport/index.js +421 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/stream-transport/index.js +135 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/well-known/index.js +47 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/well-known/services.json +611 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/xoauth2/index.js +427 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/package.json +47 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/LICENSE +21 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/README.md +6 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/agent.d.ts +31 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/api.d.ts +43 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/balanced-pool.d.ts +29 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/cache.d.ts +36 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/client.d.ts +108 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/connector.d.ts +34 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/content-type.d.ts +21 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/cookies.d.ts +28 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/diagnostics-channel.d.ts +66 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/dispatcher.d.ts +256 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/env-http-proxy-agent.d.ts +21 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/errors.d.ts +149 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/eventsource.d.ts +61 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/fetch.d.ts +209 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/file.d.ts +39 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/filereader.d.ts +54 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/formdata.d.ts +108 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/global-dispatcher.d.ts +9 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/global-origin.d.ts +7 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/handlers.d.ts +15 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/header.d.ts +4 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/index.d.ts +71 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/interceptors.d.ts +17 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/mock-agent.d.ts +50 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/mock-client.d.ts +25 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/mock-errors.d.ts +12 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/mock-interceptor.d.ts +93 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/mock-pool.d.ts +25 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/package.json +55 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/patch.d.ts +33 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/pool-stats.d.ts +19 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/pool.d.ts +39 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/proxy-agent.d.ts +28 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/readable.d.ts +65 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/retry-agent.d.ts +8 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/retry-handler.d.ts +116 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/util.d.ts +18 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/webidl.d.ts +228 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/websocket.d.ts +150 -0
- package/packages/mailx-send/mailsend/package.json +26 -0
- package/packages/mailx-send/node_modules/.package-lock.json +49 -0
- package/packages/mailx-send/node_modules/@types/node/LICENSE +21 -0
- package/packages/mailx-send/node_modules/@types/node/README.md +15 -0
- package/packages/mailx-send/node_modules/@types/node/assert/strict.d.ts +111 -0
- package/packages/mailx-send/node_modules/@types/node/assert.d.ts +1078 -0
- package/packages/mailx-send/node_modules/@types/node/async_hooks.d.ts +603 -0
- package/packages/mailx-send/node_modules/@types/node/buffer.buffer.d.ts +472 -0
- package/packages/mailx-send/node_modules/@types/node/buffer.d.ts +1934 -0
- package/packages/mailx-send/node_modules/@types/node/child_process.d.ts +1476 -0
- package/packages/mailx-send/node_modules/@types/node/cluster.d.ts +578 -0
- package/packages/mailx-send/node_modules/@types/node/compatibility/disposable.d.ts +14 -0
- package/packages/mailx-send/node_modules/@types/node/compatibility/index.d.ts +9 -0
- package/packages/mailx-send/node_modules/@types/node/compatibility/indexable.d.ts +20 -0
- package/packages/mailx-send/node_modules/@types/node/compatibility/iterators.d.ts +20 -0
- package/packages/mailx-send/node_modules/@types/node/console.d.ts +452 -0
- package/packages/mailx-send/node_modules/@types/node/constants.d.ts +21 -0
- package/packages/mailx-send/node_modules/@types/node/crypto.d.ts +4545 -0
- package/packages/mailx-send/node_modules/@types/node/dgram.d.ts +600 -0
- package/packages/mailx-send/node_modules/@types/node/diagnostics_channel.d.ts +578 -0
- package/packages/mailx-send/node_modules/@types/node/dns/promises.d.ts +503 -0
- package/packages/mailx-send/node_modules/@types/node/dns.d.ts +923 -0
- package/packages/mailx-send/node_modules/@types/node/domain.d.ts +170 -0
- package/packages/mailx-send/node_modules/@types/node/events.d.ts +976 -0
- package/packages/mailx-send/node_modules/@types/node/fs/promises.d.ts +1295 -0
- package/packages/mailx-send/node_modules/@types/node/fs.d.ts +4461 -0
- package/packages/mailx-send/node_modules/@types/node/globals.d.ts +172 -0
- package/packages/mailx-send/node_modules/@types/node/globals.typedarray.d.ts +38 -0
- package/packages/mailx-send/node_modules/@types/node/http.d.ts +2089 -0
- package/packages/mailx-send/node_modules/@types/node/http2.d.ts +2644 -0
- package/packages/mailx-send/node_modules/@types/node/https.d.ts +579 -0
- package/packages/mailx-send/node_modules/@types/node/index.d.ts +97 -0
- package/packages/mailx-send/node_modules/@types/node/inspector.d.ts +253 -0
- package/packages/mailx-send/node_modules/@types/node/inspector.generated.d.ts +4052 -0
- package/packages/mailx-send/node_modules/@types/node/module.d.ts +891 -0
- package/packages/mailx-send/node_modules/@types/node/net.d.ts +1057 -0
- package/packages/mailx-send/node_modules/@types/node/os.d.ts +506 -0
- package/packages/mailx-send/node_modules/@types/node/package.json +145 -0
- package/packages/mailx-send/node_modules/@types/node/path.d.ts +200 -0
- package/packages/mailx-send/node_modules/@types/node/perf_hooks.d.ts +968 -0
- package/packages/mailx-send/node_modules/@types/node/process.d.ts +2084 -0
- package/packages/mailx-send/node_modules/@types/node/punycode.d.ts +117 -0
- package/packages/mailx-send/node_modules/@types/node/querystring.d.ts +152 -0
- package/packages/mailx-send/node_modules/@types/node/readline/promises.d.ts +161 -0
- package/packages/mailx-send/node_modules/@types/node/readline.d.ts +594 -0
- package/packages/mailx-send/node_modules/@types/node/repl.d.ts +428 -0
- package/packages/mailx-send/node_modules/@types/node/sea.d.ts +153 -0
- package/packages/mailx-send/node_modules/@types/node/sqlite.d.ts +721 -0
- package/packages/mailx-send/node_modules/@types/node/stream/consumers.d.ts +38 -0
- package/packages/mailx-send/node_modules/@types/node/stream/promises.d.ts +90 -0
- package/packages/mailx-send/node_modules/@types/node/stream/web.d.ts +622 -0
- package/packages/mailx-send/node_modules/@types/node/stream.d.ts +1664 -0
- package/packages/mailx-send/node_modules/@types/node/string_decoder.d.ts +67 -0
- package/packages/mailx-send/node_modules/@types/node/test.d.ts +2163 -0
- package/packages/mailx-send/node_modules/@types/node/timers/promises.d.ts +108 -0
- package/packages/mailx-send/node_modules/@types/node/timers.d.ts +287 -0
- package/packages/mailx-send/node_modules/@types/node/tls.d.ts +1319 -0
- package/packages/mailx-send/node_modules/@types/node/trace_events.d.ts +197 -0
- package/packages/mailx-send/node_modules/@types/node/ts5.6/buffer.buffer.d.ts +468 -0
- package/packages/mailx-send/node_modules/@types/node/ts5.6/globals.typedarray.d.ts +34 -0
- package/packages/mailx-send/node_modules/@types/node/ts5.6/index.d.ts +97 -0
- package/packages/mailx-send/node_modules/@types/node/tty.d.ts +208 -0
- package/packages/mailx-send/node_modules/@types/node/url.d.ts +984 -0
- package/packages/mailx-send/node_modules/@types/node/util.d.ts +2606 -0
- package/packages/mailx-send/node_modules/@types/node/v8.d.ts +920 -0
- package/packages/mailx-send/node_modules/@types/node/vm.d.ts +1000 -0
- package/packages/mailx-send/node_modules/@types/node/wasi.d.ts +181 -0
- package/packages/mailx-send/node_modules/@types/node/web-globals/abortcontroller.d.ts +34 -0
- package/packages/mailx-send/node_modules/@types/node/web-globals/domexception.d.ts +68 -0
- package/packages/mailx-send/node_modules/@types/node/web-globals/events.d.ts +97 -0
- package/packages/mailx-send/node_modules/@types/node/web-globals/fetch.d.ts +55 -0
- package/packages/mailx-send/node_modules/@types/node/web-globals/navigator.d.ts +22 -0
- package/packages/mailx-send/node_modules/@types/node/web-globals/storage.d.ts +24 -0
- package/packages/mailx-send/node_modules/@types/node/worker_threads.d.ts +784 -0
- package/packages/mailx-send/node_modules/@types/node/zlib.d.ts +747 -0
- package/packages/mailx-send/node_modules/nodemailer/.ncurc.js +9 -0
- package/packages/mailx-send/node_modules/nodemailer/.prettierignore +8 -0
- package/packages/mailx-send/node_modules/nodemailer/.prettierrc +12 -0
- package/packages/mailx-send/node_modules/nodemailer/.prettierrc.js +10 -0
- package/packages/mailx-send/node_modules/nodemailer/.release-please-config.json +9 -0
- package/packages/mailx-send/node_modules/nodemailer/LICENSE +16 -0
- package/packages/mailx-send/node_modules/nodemailer/README.md +86 -0
- package/packages/mailx-send/node_modules/nodemailer/SECURITY.txt +22 -0
- package/packages/mailx-send/node_modules/nodemailer/eslint.config.js +88 -0
- package/packages/mailx-send/node_modules/nodemailer/lib/addressparser/index.js +383 -0
- package/packages/mailx-send/node_modules/nodemailer/lib/base64/index.js +139 -0
- package/packages/mailx-send/node_modules/nodemailer/lib/dkim/index.js +253 -0
- package/packages/mailx-send/node_modules/nodemailer/lib/dkim/message-parser.js +155 -0
- package/packages/mailx-send/node_modules/nodemailer/lib/dkim/relaxed-body.js +154 -0
- package/packages/mailx-send/node_modules/nodemailer/lib/dkim/sign.js +117 -0
- package/packages/mailx-send/node_modules/nodemailer/lib/fetch/cookies.js +281 -0
- package/packages/mailx-send/node_modules/nodemailer/lib/fetch/index.js +280 -0
- package/packages/mailx-send/node_modules/nodemailer/lib/json-transport/index.js +82 -0
- package/packages/mailx-send/node_modules/nodemailer/lib/mail-composer/index.js +629 -0
- package/packages/mailx-send/node_modules/nodemailer/lib/mailer/index.js +441 -0
- package/packages/mailx-send/node_modules/nodemailer/lib/mailer/mail-message.js +316 -0
- package/packages/mailx-send/node_modules/nodemailer/lib/mime-funcs/index.js +625 -0
- package/packages/mailx-send/node_modules/nodemailer/lib/mime-funcs/mime-types.js +2113 -0
- package/packages/mailx-send/node_modules/nodemailer/lib/mime-node/index.js +1316 -0
- package/packages/mailx-send/node_modules/nodemailer/lib/mime-node/last-newline.js +33 -0
- package/packages/mailx-send/node_modules/nodemailer/lib/mime-node/le-unix.js +43 -0
- package/packages/mailx-send/node_modules/nodemailer/lib/mime-node/le-windows.js +52 -0
- package/packages/mailx-send/node_modules/nodemailer/lib/nodemailer.js +157 -0
- package/packages/mailx-send/node_modules/nodemailer/lib/punycode/index.js +460 -0
- package/packages/mailx-send/node_modules/nodemailer/lib/qp/index.js +227 -0
- package/packages/mailx-send/node_modules/nodemailer/lib/sendmail-transport/index.js +210 -0
- package/packages/mailx-send/node_modules/nodemailer/lib/ses-transport/index.js +234 -0
- package/packages/mailx-send/node_modules/nodemailer/lib/shared/index.js +754 -0
- package/packages/mailx-send/node_modules/nodemailer/lib/smtp-connection/data-stream.js +108 -0
- package/packages/mailx-send/node_modules/nodemailer/lib/smtp-connection/http-proxy-client.js +143 -0
- package/packages/mailx-send/node_modules/nodemailer/lib/smtp-connection/index.js +1870 -0
- package/packages/mailx-send/node_modules/nodemailer/lib/smtp-pool/index.js +652 -0
- package/packages/mailx-send/node_modules/nodemailer/lib/smtp-pool/pool-resource.js +259 -0
- package/packages/mailx-send/node_modules/nodemailer/lib/smtp-transport/index.js +421 -0
- package/packages/mailx-send/node_modules/nodemailer/lib/stream-transport/index.js +135 -0
- package/packages/mailx-send/node_modules/nodemailer/lib/well-known/index.js +47 -0
- package/packages/mailx-send/node_modules/nodemailer/lib/well-known/services.json +611 -0
- package/packages/mailx-send/node_modules/nodemailer/lib/xoauth2/index.js +427 -0
- package/packages/mailx-send/node_modules/nodemailer/package.json +47 -0
- package/packages/mailx-send/node_modules/undici-types/LICENSE +21 -0
- package/packages/mailx-send/node_modules/undici-types/README.md +6 -0
- package/packages/mailx-send/node_modules/undici-types/agent.d.ts +31 -0
- package/packages/mailx-send/node_modules/undici-types/api.d.ts +43 -0
- package/packages/mailx-send/node_modules/undici-types/balanced-pool.d.ts +29 -0
- package/packages/mailx-send/node_modules/undici-types/cache.d.ts +36 -0
- package/packages/mailx-send/node_modules/undici-types/client.d.ts +108 -0
- package/packages/mailx-send/node_modules/undici-types/connector.d.ts +34 -0
- package/packages/mailx-send/node_modules/undici-types/content-type.d.ts +21 -0
- package/packages/mailx-send/node_modules/undici-types/cookies.d.ts +28 -0
- package/packages/mailx-send/node_modules/undici-types/diagnostics-channel.d.ts +66 -0
- package/packages/mailx-send/node_modules/undici-types/dispatcher.d.ts +256 -0
- package/packages/mailx-send/node_modules/undici-types/env-http-proxy-agent.d.ts +21 -0
- package/packages/mailx-send/node_modules/undici-types/errors.d.ts +149 -0
- package/packages/mailx-send/node_modules/undici-types/eventsource.d.ts +61 -0
- package/packages/mailx-send/node_modules/undici-types/fetch.d.ts +209 -0
- package/packages/mailx-send/node_modules/undici-types/file.d.ts +39 -0
- package/packages/mailx-send/node_modules/undici-types/filereader.d.ts +54 -0
- package/packages/mailx-send/node_modules/undici-types/formdata.d.ts +108 -0
- package/packages/mailx-send/node_modules/undici-types/global-dispatcher.d.ts +9 -0
- package/packages/mailx-send/node_modules/undici-types/global-origin.d.ts +7 -0
- package/packages/mailx-send/node_modules/undici-types/handlers.d.ts +15 -0
- package/packages/mailx-send/node_modules/undici-types/header.d.ts +4 -0
- package/packages/mailx-send/node_modules/undici-types/index.d.ts +71 -0
- package/packages/mailx-send/node_modules/undici-types/interceptors.d.ts +17 -0
- package/packages/mailx-send/node_modules/undici-types/mock-agent.d.ts +50 -0
- package/packages/mailx-send/node_modules/undici-types/mock-client.d.ts +25 -0
- package/packages/mailx-send/node_modules/undici-types/mock-errors.d.ts +12 -0
- package/packages/mailx-send/node_modules/undici-types/mock-interceptor.d.ts +93 -0
- package/packages/mailx-send/node_modules/undici-types/mock-pool.d.ts +25 -0
- package/packages/mailx-send/node_modules/undici-types/package.json +55 -0
- package/packages/mailx-send/node_modules/undici-types/patch.d.ts +33 -0
- package/packages/mailx-send/node_modules/undici-types/pool-stats.d.ts +19 -0
- package/packages/mailx-send/node_modules/undici-types/pool.d.ts +39 -0
- package/packages/mailx-send/node_modules/undici-types/proxy-agent.d.ts +28 -0
- package/packages/mailx-send/node_modules/undici-types/readable.d.ts +65 -0
- package/packages/mailx-send/node_modules/undici-types/retry-agent.d.ts +8 -0
- package/packages/mailx-send/node_modules/undici-types/retry-handler.d.ts +116 -0
- package/packages/mailx-send/node_modules/undici-types/util.d.ts +18 -0
- package/packages/mailx-send/node_modules/undici-types/webidl.d.ts +228 -0
- package/packages/mailx-send/node_modules/undici-types/websocket.d.ts +150 -0
- package/packages/mailx-send/package.json +27 -0
- package/packages/mailx-server/index.d.ts +8 -0
- package/packages/mailx-server/index.js +217 -0
- package/packages/mailx-server/package.json +25 -0
- package/packages/mailx-server/tsconfig.tsbuildinfo +1 -0
- package/packages/mailx-settings/index.d.ts +64 -0
- package/packages/mailx-settings/index.js +218 -0
- package/packages/mailx-settings/package.json +16 -0
- package/packages/mailx-settings/tsconfig.tsbuildinfo +1 -0
- package/packages/mailx-store/db.d.ts +100 -0
- package/packages/mailx-store/db.js +461 -0
- package/packages/mailx-store/file-store.d.ts +22 -0
- package/packages/mailx-store/file-store.js +59 -0
- package/packages/mailx-store/index.d.ts +7 -0
- package/packages/mailx-store/index.js +7 -0
- package/packages/mailx-store/package.json +19 -0
- package/packages/mailx-store/tsconfig.tsbuildinfo +1 -0
- package/packages/mailx-types/index.d.ts +195 -0
- package/packages/mailx-types/index.js +7 -0
- package/packages/mailx-types/package.json +12 -0
- package/packages/mailx-types/tsconfig.tsbuildinfo +1 -0
- package/tsconfig.base.json +28 -0
package/README.md
ADDED
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
# mailx — Email Client
|
|
2
|
+
|
|
3
|
+
A local-first email client with IMAP sync, full offline reading, and a standalone native app. Replaces Thunderbird/Outlook.
|
|
4
|
+
|
|
5
|
+
## Quick Start
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm start # Start server (auto-restarts on changes)
|
|
9
|
+
# Open http://localhost:9333 in browser
|
|
10
|
+
|
|
11
|
+
launch.ps1 # Or use the native WebView2 app
|
|
12
|
+
launch.ps1 -restart # Kill existing server and restart
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Setup
|
|
16
|
+
|
|
17
|
+
### 1. Config Pointer (~/.mailx/config.json)
|
|
18
|
+
|
|
19
|
+
Points to the shared settings file and local store:
|
|
20
|
+
|
|
21
|
+
```json
|
|
22
|
+
{
|
|
23
|
+
"settingsPath": "C:/Users/You/OneDrive/home/.mailx/settings.jsonc",
|
|
24
|
+
"storePath": "C:/Users/You/.mailx/mailxstore"
|
|
25
|
+
}
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
- **settingsPath** — Path to shared settings (can be on OneDrive/Dropbox for multi-machine sync)
|
|
29
|
+
- **storePath** — Where cached message bodies are stored (local, not synced)
|
|
30
|
+
|
|
31
|
+
If `config.json` doesn't exist, settings default to `~/.mailx/settings.jsonc`.
|
|
32
|
+
|
|
33
|
+
### 2. Settings File (settings.jsonc)
|
|
34
|
+
|
|
35
|
+
```jsonc
|
|
36
|
+
{
|
|
37
|
+
"accounts": [
|
|
38
|
+
{
|
|
39
|
+
"id": "work", // Unique ID (internal)
|
|
40
|
+
"name": "Work Email", // Display name in UI
|
|
41
|
+
"email": "bob@example.com",
|
|
42
|
+
"imap": {
|
|
43
|
+
"host": "imap.example.com",
|
|
44
|
+
"port": 993,
|
|
45
|
+
"tls": true,
|
|
46
|
+
"auth": "password", // "password" or "oauth2"
|
|
47
|
+
"user": "bob",
|
|
48
|
+
"password": "secret"
|
|
49
|
+
},
|
|
50
|
+
"smtp": {
|
|
51
|
+
"host": "smtp.example.com",
|
|
52
|
+
"port": 587,
|
|
53
|
+
"tls": true,
|
|
54
|
+
"auth": "password",
|
|
55
|
+
"user": "bob",
|
|
56
|
+
"password": "secret"
|
|
57
|
+
},
|
|
58
|
+
"enabled": true
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"id": "gmail",
|
|
62
|
+
"name": "Gmail",
|
|
63
|
+
"email": "bob@gmail.com",
|
|
64
|
+
"imap": {
|
|
65
|
+
"host": "imap.gmail.com", "port": 993, "tls": true,
|
|
66
|
+
"auth": "oauth2", "user": "bob@gmail.com"
|
|
67
|
+
},
|
|
68
|
+
"smtp": {
|
|
69
|
+
"host": "smtp.gmail.com", "port": 587, "tls": true,
|
|
70
|
+
"auth": "oauth2", "user": "bob@gmail.com"
|
|
71
|
+
},
|
|
72
|
+
"enabled": true
|
|
73
|
+
}
|
|
74
|
+
],
|
|
75
|
+
"sync": {
|
|
76
|
+
"intervalMinutes": 5, // Full sync interval
|
|
77
|
+
"historyDays": 30 // Days of history (0 = all)
|
|
78
|
+
},
|
|
79
|
+
"ui": {
|
|
80
|
+
"theme": "dark",
|
|
81
|
+
"folderWidth": 220,
|
|
82
|
+
"listViewerSplit": 40,
|
|
83
|
+
"fontSize": 14
|
|
84
|
+
},
|
|
85
|
+
// Auto-populated when you click "Always allow from sender/domain"
|
|
86
|
+
"remoteAllowList": {
|
|
87
|
+
"senders": [],
|
|
88
|
+
"domains": []
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### 3. Gmail OAuth
|
|
94
|
+
|
|
95
|
+
1. [Google Cloud Console](https://console.cloud.google.com/) → create project
|
|
96
|
+
2. Enable Gmail API (and People API for contacts)
|
|
97
|
+
3. Create OAuth 2.0 credentials (Desktop app)
|
|
98
|
+
4. Download `credentials.json` to the iflow package directory
|
|
99
|
+
5. First connect opens browser for consent. Tokens cached and refresh automatically.
|
|
100
|
+
|
|
101
|
+
## Usage
|
|
102
|
+
|
|
103
|
+
### Reading Mail
|
|
104
|
+
- **Folder tree** (left) — click to view, expand/collapse subfolders
|
|
105
|
+
- **Message list** (center) — click to preview, scroll for more
|
|
106
|
+
- **Preview pane** (right) — shows message content
|
|
107
|
+
- **All Inboxes** — unified view across all accounts
|
|
108
|
+
|
|
109
|
+
### Composing
|
|
110
|
+
- **Compose** — toolbar or Ctrl+N
|
|
111
|
+
- **Reply / Reply All / Forward** — Ctrl+R / Ctrl+Shift+R / toolbar
|
|
112
|
+
- **Send** — Ctrl+Enter
|
|
113
|
+
- **From field** — pick from dropdown or type any address
|
|
114
|
+
- **Address autocomplete** — type in To/Cc/Bcc, Tab accepts first match, Ctrl+K to trigger
|
|
115
|
+
- **Auto-save** — drafts saved every 5 seconds
|
|
116
|
+
|
|
117
|
+
### Managing Messages
|
|
118
|
+
- **Delete** — Del, Ctrl+D, or trash button → moves to Trash
|
|
119
|
+
- **Undo delete** — Ctrl+Z within 30 seconds
|
|
120
|
+
- **Flag/unflag** — click the star ☆/★
|
|
121
|
+
- **Search** — type in search bar. Qualifiers: `from:name`, `to:name`, `subject:text`
|
|
122
|
+
- **Remote content** — blocked by default. Click "Load this time" or "Always from sender/domain"
|
|
123
|
+
|
|
124
|
+
### View Options (View menu)
|
|
125
|
+
- **Two-line view** — From+Date on line 1, Subject on line 2
|
|
126
|
+
- **Preview pane** — toggle on/off
|
|
127
|
+
- **Flagged only** — show only starred messages
|
|
128
|
+
|
|
129
|
+
### Keyboard Shortcuts
|
|
130
|
+
| Key | Action |
|
|
131
|
+
|-----|--------|
|
|
132
|
+
| Ctrl+N | New message |
|
|
133
|
+
| Ctrl+R | Reply |
|
|
134
|
+
| Ctrl+Shift+R | Reply All |
|
|
135
|
+
| Del / Ctrl+D | Delete |
|
|
136
|
+
| Ctrl+Z | Undo delete |
|
|
137
|
+
| Ctrl+K | Address completion |
|
|
138
|
+
| Ctrl+Enter | Send (compose) |
|
|
139
|
+
| Escape | Discard / Clear search |
|
|
140
|
+
| F5 | Sync |
|
|
141
|
+
|
|
142
|
+
## Data Storage
|
|
143
|
+
|
|
144
|
+
| File | Location | Purpose |
|
|
145
|
+
|------|----------|---------|
|
|
146
|
+
| config.json | ~/.mailx/ | Points to settings file |
|
|
147
|
+
| settings.jsonc | OneDrive or ~/.mailx/ | Accounts, prefs (shared across machines) |
|
|
148
|
+
| mailx.db | ~/.mailx/ | SQLite — headers, contacts, sync state |
|
|
149
|
+
| mailxstore/ | ~/.mailx/ | Cached message bodies (.eml) |
|
|
150
|
+
| window.json | ~/.mailx/ | Window position (per machine) |
|
|
151
|
+
| mailx.log | project dir | Server log with timestamps |
|
|
152
|
+
|
|
153
|
+
## Architecture
|
|
154
|
+
|
|
155
|
+
- **Local-first** — changes update local DB immediately, background worker syncs to IMAP
|
|
156
|
+
- **Offline reading** — full message bodies cached during sync
|
|
157
|
+
- **IMAP IDLE** — instant new mail notifications + 30s poll fallback
|
|
158
|
+
- **Outbox** — queued in IMAP Outbox folder with multi-machine interlock via flags
|
|
159
|
+
- **Remote content blocking** — HTML sanitized server-side, CSP in iframe, per-sender/domain allow-list
|
|
160
|
+
- **Search** — SQLite FTS5 full-text index with qualifiers
|
package/bin/mailx.js
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* mailx launcher — starts the server and opens the browser.
|
|
4
|
+
* Usage: mailx [--external] [--no-browser]
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { spawn } from "node:child_process";
|
|
8
|
+
import { fileURLToPath } from "node:url";
|
|
9
|
+
import path from "node:path";
|
|
10
|
+
import net from "node:net";
|
|
11
|
+
|
|
12
|
+
const PORT = 9333;
|
|
13
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
14
|
+
const serverScript = path.join(__dirname, "..", "packages", "mailx-server", "index.js");
|
|
15
|
+
|
|
16
|
+
function isPortInUse(port) {
|
|
17
|
+
return new Promise((resolve) => {
|
|
18
|
+
const server = net.createServer();
|
|
19
|
+
server.once("error", () => resolve(true));
|
|
20
|
+
server.once("listening", () => { server.close(); resolve(false); });
|
|
21
|
+
server.listen(port, "127.0.0.1");
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
async function main() {
|
|
26
|
+
const args = process.argv.slice(2);
|
|
27
|
+
const noBrowser = args.includes("--no-browser");
|
|
28
|
+
const inUse = await isPortInUse(PORT);
|
|
29
|
+
|
|
30
|
+
if (inUse) {
|
|
31
|
+
console.log(`mailx server already running on port ${PORT}`);
|
|
32
|
+
} else {
|
|
33
|
+
console.log(`Starting mailx server on port ${PORT}...`);
|
|
34
|
+
const serverArgs = [serverScript, ...args.filter(a => a === "--external")];
|
|
35
|
+
const child = spawn(process.execPath, serverArgs, {
|
|
36
|
+
stdio: "inherit",
|
|
37
|
+
detached: false,
|
|
38
|
+
});
|
|
39
|
+
child.unref();
|
|
40
|
+
|
|
41
|
+
// Wait for server to be ready
|
|
42
|
+
for (let i = 0; i < 60; i++) {
|
|
43
|
+
await new Promise(r => setTimeout(r, 500));
|
|
44
|
+
if (await isPortInUse(PORT)) break;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
if (!noBrowser) {
|
|
49
|
+
const url = `http://localhost:${PORT}`;
|
|
50
|
+
const { exec } = await import("node:child_process");
|
|
51
|
+
if (process.platform === "win32") exec(`start "" "${url}"`);
|
|
52
|
+
else if (process.platform === "darwin") exec(`open "${url}"`);
|
|
53
|
+
else exec(`xdg-open "${url}"`);
|
|
54
|
+
console.log(`Opened ${url}`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
main().catch(console.error);
|
package/client/app.js
ADDED
|
@@ -0,0 +1,431 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* mailx client entry point.
|
|
3
|
+
* Wires together all UI components and WebSocket connection.
|
|
4
|
+
*/
|
|
5
|
+
import { initFolderTree, refreshFolderTree } from "./components/folder-tree.js";
|
|
6
|
+
import { initMessageList, loadMessages, loadUnifiedInbox, loadSearchResults, reloadCurrentFolder } from "./components/message-list.js";
|
|
7
|
+
import { showMessage, getCurrentMessage } from "./components/message-viewer.js";
|
|
8
|
+
import { connectWebSocket, onWsEvent, triggerSync, getAccounts } from "./lib/api-client.js";
|
|
9
|
+
// ── Wire up components ──
|
|
10
|
+
const folderTree = document.getElementById("folder-tree");
|
|
11
|
+
initFolderTree(folderTree, (accountId, folderId, folderName, specialUse) => {
|
|
12
|
+
loadMessages(accountId, folderId, 1, specialUse);
|
|
13
|
+
document.title = `mailx - ${folderName}`;
|
|
14
|
+
}, () => {
|
|
15
|
+
// Unified inbox handler
|
|
16
|
+
loadUnifiedInbox();
|
|
17
|
+
document.title = "mailx - All Inboxes";
|
|
18
|
+
});
|
|
19
|
+
initMessageList((accountId, uid) => {
|
|
20
|
+
showMessage(accountId, uid);
|
|
21
|
+
// Enable action buttons when a message is selected
|
|
22
|
+
for (const id of ["btn-reply", "btn-reply-all", "btn-forward", "btn-delete", "btn-flag"]) {
|
|
23
|
+
const btn = document.getElementById(id);
|
|
24
|
+
if (btn)
|
|
25
|
+
btn.disabled = false;
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
// ── Toolbar actions ──
|
|
29
|
+
document.getElementById("btn-sync")?.addEventListener("click", async () => {
|
|
30
|
+
const btn = document.getElementById("btn-sync");
|
|
31
|
+
btn.disabled = true;
|
|
32
|
+
btn.classList.add("syncing");
|
|
33
|
+
const statusSync = document.getElementById("status-sync");
|
|
34
|
+
if (statusSync)
|
|
35
|
+
statusSync.textContent = "Syncing...";
|
|
36
|
+
try {
|
|
37
|
+
await triggerSync();
|
|
38
|
+
// Button stays spinning — WebSocket syncProgress/folderCountsChanged will update UI
|
|
39
|
+
// Set a timeout to re-enable if no WebSocket response
|
|
40
|
+
setTimeout(() => {
|
|
41
|
+
btn.disabled = false;
|
|
42
|
+
btn.classList.remove("syncing");
|
|
43
|
+
refreshFolderTree();
|
|
44
|
+
reloadCurrentFolder();
|
|
45
|
+
if (statusSync && statusSync.textContent === "Syncing...") {
|
|
46
|
+
statusSync.textContent = `Synced ${new Date().toLocaleTimeString(undefined, { hour: "2-digit", minute: "2-digit", hour12: false })}`;
|
|
47
|
+
}
|
|
48
|
+
}, 30000);
|
|
49
|
+
}
|
|
50
|
+
catch (e) {
|
|
51
|
+
if (statusSync)
|
|
52
|
+
statusSync.textContent = `Sync error: ${e.message}`;
|
|
53
|
+
btn.disabled = false;
|
|
54
|
+
btn.classList.remove("syncing");
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
document.getElementById("btn-restart")?.addEventListener("click", async () => {
|
|
58
|
+
const statusSync = document.getElementById("status-sync");
|
|
59
|
+
if (statusSync)
|
|
60
|
+
statusSync.textContent = "Restarting...";
|
|
61
|
+
try {
|
|
62
|
+
await fetch("/api/restart", { method: "POST" });
|
|
63
|
+
}
|
|
64
|
+
catch { /* server is shutting down */ }
|
|
65
|
+
// Server broadcasts reload event; if missed, WebSocket reconnect will trigger page reload
|
|
66
|
+
});
|
|
67
|
+
async function openCompose(mode) {
|
|
68
|
+
const current = getCurrentMessage();
|
|
69
|
+
const accounts = await getAccounts();
|
|
70
|
+
const accountId = current?.accountId || accounts[0]?.id || "";
|
|
71
|
+
const msg = current?.message;
|
|
72
|
+
const rePrefix = /^(re|fwd?):\s*/i;
|
|
73
|
+
const cleanSubject = msg ? msg.subject.replace(rePrefix, "") : "";
|
|
74
|
+
const init = {
|
|
75
|
+
mode,
|
|
76
|
+
accountId,
|
|
77
|
+
to: [],
|
|
78
|
+
cc: [],
|
|
79
|
+
subject: "",
|
|
80
|
+
bodyHtml: "",
|
|
81
|
+
inReplyTo: "",
|
|
82
|
+
references: [],
|
|
83
|
+
accounts: accounts.map((a) => ({ id: a.id, name: a.name, email: a.email })),
|
|
84
|
+
};
|
|
85
|
+
if (msg && mode === "reply") {
|
|
86
|
+
init.to = [msg.from];
|
|
87
|
+
init.subject = `Re: ${cleanSubject}`;
|
|
88
|
+
init.bodyHtml = quoteBody(msg);
|
|
89
|
+
init.inReplyTo = msg.messageId;
|
|
90
|
+
init.references = [...(msg.references || []), msg.messageId];
|
|
91
|
+
}
|
|
92
|
+
else if (msg && mode === "replyAll") {
|
|
93
|
+
init.to = [msg.from, ...msg.to.filter((a) => a.address !== msg.from.address)];
|
|
94
|
+
init.cc = msg.cc || [];
|
|
95
|
+
init.subject = `Re: ${cleanSubject}`;
|
|
96
|
+
init.bodyHtml = quoteBody(msg);
|
|
97
|
+
init.inReplyTo = msg.messageId;
|
|
98
|
+
init.references = [...(msg.references || []), msg.messageId];
|
|
99
|
+
}
|
|
100
|
+
else if (msg && mode === "forward") {
|
|
101
|
+
init.subject = `Fwd: ${cleanSubject}`;
|
|
102
|
+
init.bodyHtml = forwardBody(msg);
|
|
103
|
+
}
|
|
104
|
+
// Store init data for compose window to pick up
|
|
105
|
+
sessionStorage.setItem("composeInit", JSON.stringify(init));
|
|
106
|
+
window.open("/compose/compose.html", "_blank", "width=800,height=600,menubar=no,toolbar=no,status=no");
|
|
107
|
+
}
|
|
108
|
+
function quoteBody(msg) {
|
|
109
|
+
const date = new Date(msg.date).toLocaleString();
|
|
110
|
+
const from = msg.from.name ? `${msg.from.name} <${msg.from.address}>` : msg.from.address;
|
|
111
|
+
const body = msg.bodyHtml || `<pre>${msg.bodyText || ""}</pre>`;
|
|
112
|
+
return `<br><div class="reply"><p>On ${date}, ${from} wrote:</p><blockquote>${body}</blockquote></div>`;
|
|
113
|
+
}
|
|
114
|
+
function forwardBody(msg) {
|
|
115
|
+
const date = new Date(msg.date).toLocaleString();
|
|
116
|
+
const from = msg.from.name ? `${msg.from.name} <${msg.from.address}>` : msg.from.address;
|
|
117
|
+
const to = msg.to.map((a) => a.name ? `${a.name} <${a.address}>` : a.address).join(", ");
|
|
118
|
+
const body = msg.bodyHtml || `<pre>${msg.bodyText || ""}</pre>`;
|
|
119
|
+
return `<br><div class="reply"><p>---------- Forwarded message ----------<br>From: ${from}<br>Date: ${date}<br>Subject: ${msg.subject}<br>To: ${to}</p>${body}</div>`;
|
|
120
|
+
}
|
|
121
|
+
let lastDeleted = null;
|
|
122
|
+
let undoTimeout = null;
|
|
123
|
+
async function deleteCurrentMessage() {
|
|
124
|
+
const current = getCurrentMessage();
|
|
125
|
+
if (!current)
|
|
126
|
+
return;
|
|
127
|
+
const { accountId, message } = current;
|
|
128
|
+
try {
|
|
129
|
+
const res = await fetch(`/api/message/${accountId}/${message.uid}`, { method: "DELETE" });
|
|
130
|
+
if (!res.ok) {
|
|
131
|
+
const err = await res.json().catch(() => ({ error: res.statusText }));
|
|
132
|
+
throw new Error(err.error || res.statusText);
|
|
133
|
+
}
|
|
134
|
+
lastDeleted = { accountId, uid: message.uid, folderId: message.folderId, subject: message.subject };
|
|
135
|
+
// Show undo notification in status bar
|
|
136
|
+
const statusSync = document.getElementById("status-sync");
|
|
137
|
+
if (statusSync)
|
|
138
|
+
statusSync.textContent = `Deleted "${message.subject.substring(0, 40)}" — Ctrl+Z to undo`;
|
|
139
|
+
// Clear undo after 30 seconds
|
|
140
|
+
if (undoTimeout)
|
|
141
|
+
clearTimeout(undoTimeout);
|
|
142
|
+
undoTimeout = setTimeout(() => {
|
|
143
|
+
lastDeleted = null;
|
|
144
|
+
if (statusSync?.textContent?.includes("Ctrl+Z"))
|
|
145
|
+
statusSync.textContent = "";
|
|
146
|
+
}, 30000);
|
|
147
|
+
// Clear the preview pane
|
|
148
|
+
const bodyEl = document.getElementById("mv-body");
|
|
149
|
+
const headerEl = document.getElementById("mv-header");
|
|
150
|
+
if (bodyEl)
|
|
151
|
+
bodyEl.innerHTML = `<div class="mv-empty">Select a message to read</div>`;
|
|
152
|
+
if (headerEl)
|
|
153
|
+
headerEl.hidden = true;
|
|
154
|
+
reloadCurrentFolder();
|
|
155
|
+
}
|
|
156
|
+
catch (e) {
|
|
157
|
+
console.error(`Delete failed: ${e.message}`);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
async function undoDelete() {
|
|
161
|
+
if (!lastDeleted)
|
|
162
|
+
return;
|
|
163
|
+
const { accountId, uid, folderId } = lastDeleted;
|
|
164
|
+
try {
|
|
165
|
+
const res = await fetch(`/api/message/${accountId}/${uid}/undelete`, {
|
|
166
|
+
method: "POST",
|
|
167
|
+
headers: { "Content-Type": "application/json" },
|
|
168
|
+
body: JSON.stringify({ folderId }),
|
|
169
|
+
});
|
|
170
|
+
if (!res.ok) {
|
|
171
|
+
const err = await res.json().catch(() => ({ error: res.statusText }));
|
|
172
|
+
throw new Error(err.error || res.statusText);
|
|
173
|
+
}
|
|
174
|
+
const statusSync = document.getElementById("status-sync");
|
|
175
|
+
if (statusSync)
|
|
176
|
+
statusSync.textContent = "Message restored";
|
|
177
|
+
lastDeleted = null;
|
|
178
|
+
if (undoTimeout)
|
|
179
|
+
clearTimeout(undoTimeout);
|
|
180
|
+
reloadCurrentFolder();
|
|
181
|
+
}
|
|
182
|
+
catch (e) {
|
|
183
|
+
console.error(`Undo failed: ${e.message}`);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
document.getElementById("btn-delete")?.addEventListener("click", deleteCurrentMessage);
|
|
187
|
+
document.getElementById("btn-compose")?.addEventListener("click", () => openCompose("new"));
|
|
188
|
+
document.getElementById("btn-reply")?.addEventListener("click", () => openCompose("reply"));
|
|
189
|
+
document.getElementById("btn-reply-all")?.addEventListener("click", () => openCompose("replyAll"));
|
|
190
|
+
document.getElementById("btn-forward")?.addEventListener("click", () => openCompose("forward"));
|
|
191
|
+
// ── Search ──
|
|
192
|
+
let searchTimeout;
|
|
193
|
+
const searchInput = document.getElementById("search-input");
|
|
194
|
+
searchInput?.addEventListener("input", () => {
|
|
195
|
+
clearTimeout(searchTimeout);
|
|
196
|
+
searchTimeout = setTimeout(() => {
|
|
197
|
+
const query = searchInput.value.trim();
|
|
198
|
+
if (query.length >= 2) {
|
|
199
|
+
loadSearchResults(query);
|
|
200
|
+
document.title = `mailx - Search: ${query}`;
|
|
201
|
+
}
|
|
202
|
+
else if (query.length === 0) {
|
|
203
|
+
// Clear search — reload current folder
|
|
204
|
+
reloadCurrentFolder();
|
|
205
|
+
}
|
|
206
|
+
}, 400);
|
|
207
|
+
});
|
|
208
|
+
// Enter triggers immediate search
|
|
209
|
+
searchInput?.addEventListener("keydown", (e) => {
|
|
210
|
+
if (e.key === "Enter") {
|
|
211
|
+
clearTimeout(searchTimeout);
|
|
212
|
+
const query = searchInput.value.trim();
|
|
213
|
+
if (query) {
|
|
214
|
+
loadSearchResults(query);
|
|
215
|
+
document.title = `mailx - Search: ${query}`;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
if (e.key === "Escape") {
|
|
219
|
+
searchInput.value = "";
|
|
220
|
+
reloadCurrentFolder();
|
|
221
|
+
}
|
|
222
|
+
});
|
|
223
|
+
// ── Open links from email body in system browser ──
|
|
224
|
+
window.addEventListener("message", (e) => {
|
|
225
|
+
if (e.data?.type === "openLink" && e.data.url) {
|
|
226
|
+
window.open(e.data.url, "_blank", "noopener,noreferrer");
|
|
227
|
+
}
|
|
228
|
+
});
|
|
229
|
+
// ── Splitter drag ──
|
|
230
|
+
const splitter = document.getElementById("splitter-h");
|
|
231
|
+
if (splitter) {
|
|
232
|
+
// Restore saved position
|
|
233
|
+
const saved = localStorage.getItem("mailx-split");
|
|
234
|
+
if (saved)
|
|
235
|
+
document.documentElement.style.setProperty("--list-viewer-split", saved);
|
|
236
|
+
let dragging = false;
|
|
237
|
+
let startX;
|
|
238
|
+
let startSplit;
|
|
239
|
+
splitter.addEventListener("pointerdown", (e) => {
|
|
240
|
+
dragging = true;
|
|
241
|
+
startX = e.clientX;
|
|
242
|
+
const mainArea = document.querySelector(".main-area");
|
|
243
|
+
startSplit = mainArea.getBoundingClientRect().width * (parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--list-viewer-split")) / 100);
|
|
244
|
+
splitter.setPointerCapture(e.pointerId);
|
|
245
|
+
});
|
|
246
|
+
splitter.addEventListener("pointermove", (e) => {
|
|
247
|
+
if (!dragging)
|
|
248
|
+
return;
|
|
249
|
+
const mainArea = document.querySelector(".main-area");
|
|
250
|
+
const totalWidth = mainArea.getBoundingClientRect().width;
|
|
251
|
+
const newSplit = ((startSplit + (e.clientX - startX)) / totalWidth) * 100;
|
|
252
|
+
const clamped = Math.max(15, Math.min(85, newSplit));
|
|
253
|
+
const val = `${clamped}%`;
|
|
254
|
+
document.documentElement.style.setProperty("--list-viewer-split", val);
|
|
255
|
+
localStorage.setItem("mailx-split", val);
|
|
256
|
+
});
|
|
257
|
+
splitter.addEventListener("pointerup", () => { dragging = false; });
|
|
258
|
+
}
|
|
259
|
+
// ── WebSocket for live updates ──
|
|
260
|
+
connectWebSocket();
|
|
261
|
+
onWsEvent((event) => {
|
|
262
|
+
const statusSync = document.getElementById("status-sync");
|
|
263
|
+
switch (event.type) {
|
|
264
|
+
case "connected":
|
|
265
|
+
if (statusSync)
|
|
266
|
+
statusSync.textContent = "Connected";
|
|
267
|
+
// Refresh folder counts on reconnect (non-disruptive)
|
|
268
|
+
refreshFolderTree();
|
|
269
|
+
break;
|
|
270
|
+
case "syncProgress":
|
|
271
|
+
if (statusSync)
|
|
272
|
+
statusSync.textContent = `Sync: ${event.phase} ${event.progress}%`;
|
|
273
|
+
break;
|
|
274
|
+
case "folderCountsChanged": {
|
|
275
|
+
refreshFolderTree();
|
|
276
|
+
// Only reload message list if user isn't reading a message
|
|
277
|
+
if (!getCurrentMessage())
|
|
278
|
+
reloadCurrentFolder();
|
|
279
|
+
// Sync finished — re-enable sync button
|
|
280
|
+
const syncBtn = document.getElementById("btn-sync");
|
|
281
|
+
if (syncBtn) {
|
|
282
|
+
syncBtn.disabled = false;
|
|
283
|
+
syncBtn.classList.remove("syncing");
|
|
284
|
+
}
|
|
285
|
+
if (statusSync)
|
|
286
|
+
statusSync.textContent = `Synced ${new Date().toLocaleTimeString(undefined, { hour: "2-digit", minute: "2-digit", hour12: false })}`;
|
|
287
|
+
break;
|
|
288
|
+
}
|
|
289
|
+
case "reload":
|
|
290
|
+
location.reload();
|
|
291
|
+
break;
|
|
292
|
+
case "error":
|
|
293
|
+
if (statusSync)
|
|
294
|
+
statusSync.textContent = `Error: ${event.message}`;
|
|
295
|
+
break;
|
|
296
|
+
}
|
|
297
|
+
});
|
|
298
|
+
// ── Keyboard shortcuts ──
|
|
299
|
+
document.addEventListener("keydown", (e) => {
|
|
300
|
+
// Ctrl+N or Ctrl+Shift+M = Compose
|
|
301
|
+
if ((e.ctrlKey && e.key === "n") || (e.ctrlKey && e.shiftKey && e.key === "M")) {
|
|
302
|
+
e.preventDefault();
|
|
303
|
+
openCompose("new");
|
|
304
|
+
}
|
|
305
|
+
// Ctrl+R = Reply
|
|
306
|
+
if (e.ctrlKey && e.key === "r" && !e.shiftKey) {
|
|
307
|
+
e.preventDefault();
|
|
308
|
+
openCompose("reply");
|
|
309
|
+
}
|
|
310
|
+
// Ctrl+Shift+R = Reply All
|
|
311
|
+
if (e.ctrlKey && e.shiftKey && e.key === "R") {
|
|
312
|
+
e.preventDefault();
|
|
313
|
+
openCompose("replyAll");
|
|
314
|
+
}
|
|
315
|
+
// Ctrl+D or Delete = Delete message
|
|
316
|
+
if ((e.ctrlKey && e.key === "d") || e.key === "Delete") {
|
|
317
|
+
e.preventDefault();
|
|
318
|
+
deleteCurrentMessage();
|
|
319
|
+
}
|
|
320
|
+
// Ctrl+Z = Undo delete
|
|
321
|
+
if (e.ctrlKey && e.key === "z") {
|
|
322
|
+
if (lastDeleted) {
|
|
323
|
+
e.preventDefault();
|
|
324
|
+
undoDelete();
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
// F5 = Sync
|
|
328
|
+
if (e.key === "F5") {
|
|
329
|
+
e.preventDefault();
|
|
330
|
+
document.getElementById("btn-sync")?.click();
|
|
331
|
+
}
|
|
332
|
+
});
|
|
333
|
+
// ── View menu ──
|
|
334
|
+
const viewBtn = document.getElementById("btn-view");
|
|
335
|
+
const viewDropdown = document.getElementById("view-dropdown");
|
|
336
|
+
const optTwoLine = document.getElementById("opt-two-line");
|
|
337
|
+
const optPreview = document.getElementById("opt-preview");
|
|
338
|
+
const optFlagged = document.getElementById("opt-flagged");
|
|
339
|
+
// Toggle dropdown
|
|
340
|
+
viewBtn?.addEventListener("click", (e) => {
|
|
341
|
+
e.stopPropagation();
|
|
342
|
+
if (viewDropdown)
|
|
343
|
+
viewDropdown.hidden = !viewDropdown.hidden;
|
|
344
|
+
});
|
|
345
|
+
document.addEventListener("click", () => {
|
|
346
|
+
if (viewDropdown)
|
|
347
|
+
viewDropdown.hidden = true;
|
|
348
|
+
});
|
|
349
|
+
// Restore saved view settings
|
|
350
|
+
const savedTwoLine = localStorage.getItem("mailx-two-line") === "true";
|
|
351
|
+
const savedPreview = localStorage.getItem("mailx-preview") !== "false"; // default true
|
|
352
|
+
const savedFlagged = localStorage.getItem("mailx-flagged") === "true";
|
|
353
|
+
if (optTwoLine)
|
|
354
|
+
optTwoLine.checked = savedTwoLine;
|
|
355
|
+
if (optPreview)
|
|
356
|
+
optPreview.checked = savedPreview;
|
|
357
|
+
if (optFlagged)
|
|
358
|
+
optFlagged.checked = savedFlagged;
|
|
359
|
+
if (savedTwoLine)
|
|
360
|
+
document.getElementById("message-list")?.classList.add("two-line");
|
|
361
|
+
if (!savedPreview)
|
|
362
|
+
document.querySelector(".main-area")?.classList.add("no-preview");
|
|
363
|
+
if (savedFlagged)
|
|
364
|
+
document.getElementById("ml-body")?.classList.add("flagged-only");
|
|
365
|
+
// Two-line toggle
|
|
366
|
+
optTwoLine?.addEventListener("change", () => {
|
|
367
|
+
const list = document.getElementById("message-list");
|
|
368
|
+
if (optTwoLine.checked) {
|
|
369
|
+
list?.classList.add("two-line");
|
|
370
|
+
}
|
|
371
|
+
else {
|
|
372
|
+
list?.classList.remove("two-line");
|
|
373
|
+
}
|
|
374
|
+
localStorage.setItem("mailx-two-line", String(optTwoLine.checked));
|
|
375
|
+
});
|
|
376
|
+
// Preview pane toggle
|
|
377
|
+
optPreview?.addEventListener("change", () => {
|
|
378
|
+
const main = document.querySelector(".main-area");
|
|
379
|
+
if (optPreview.checked) {
|
|
380
|
+
main?.classList.remove("no-preview");
|
|
381
|
+
}
|
|
382
|
+
else {
|
|
383
|
+
main?.classList.add("no-preview");
|
|
384
|
+
}
|
|
385
|
+
localStorage.setItem("mailx-preview", String(optPreview.checked));
|
|
386
|
+
});
|
|
387
|
+
// Flagged-only filter
|
|
388
|
+
optFlagged?.addEventListener("change", () => {
|
|
389
|
+
const body = document.getElementById("ml-body");
|
|
390
|
+
if (optFlagged.checked) {
|
|
391
|
+
body?.classList.add("flagged-only");
|
|
392
|
+
}
|
|
393
|
+
else {
|
|
394
|
+
body?.classList.remove("flagged-only");
|
|
395
|
+
}
|
|
396
|
+
localStorage.setItem("mailx-flagged", String(optFlagged.checked));
|
|
397
|
+
});
|
|
398
|
+
const isApp = typeof mailxapi !== "undefined" && mailxapi?.isApp;
|
|
399
|
+
fetch("/api/version").then(r => r.json()).then(d => {
|
|
400
|
+
const el = document.getElementById("app-version");
|
|
401
|
+
if (el)
|
|
402
|
+
el.textContent = `mailx s${d.server}/c${d.client}${isApp ? "" : " [browser]"}`;
|
|
403
|
+
}).catch(async () => {
|
|
404
|
+
// Server not running — try to start it if we're in the app
|
|
405
|
+
if (isApp) {
|
|
406
|
+
await mailxapi.ensureServer();
|
|
407
|
+
location.reload();
|
|
408
|
+
}
|
|
409
|
+
else {
|
|
410
|
+
const el = document.getElementById("app-version");
|
|
411
|
+
if (el)
|
|
412
|
+
el.textContent = "mailx [server offline]";
|
|
413
|
+
}
|
|
414
|
+
});
|
|
415
|
+
// ── Sync pending indicator ──
|
|
416
|
+
setInterval(async () => {
|
|
417
|
+
try {
|
|
418
|
+
const res = await fetch("/api/sync/pending");
|
|
419
|
+
if (!res.ok)
|
|
420
|
+
return;
|
|
421
|
+
const data = await res.json();
|
|
422
|
+
const el = document.getElementById("status-pending");
|
|
423
|
+
if (el) {
|
|
424
|
+
el.textContent = data.pending > 0 ? `↻ ${data.pending} pending` : "";
|
|
425
|
+
el.style.color = data.pending > 0 ? "oklch(0.75 0.15 60)" : "";
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
catch { /* offline */ }
|
|
429
|
+
}, 5000);
|
|
430
|
+
console.log("mailx client initialized");
|
|
431
|
+
//# sourceMappingURL=app.js.map
|