@bobfrankston/mailx 1.0.466 → 1.0.500
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/.globalize.json5 +25 -0
- package/README.md +17 -420
- package/bin/mailx.js +87 -84
- package/bin/mailx.js.map +1 -1
- package/bin/mailx.ts +87 -84
- package/client/android.html +5 -5
- package/client/app.js +42 -38
- package/client/components/folder-tree.js +7 -5
- package/client/components/message-list.js +485 -448
- package/client/components/message-viewer.js +36 -41
- package/client/index.html +8 -8
- package/client/lib/message-state.js +46 -65
- package/index.js +59 -0
- package/package.json +12 -114
- package/packages/mailx-send/mailsend/{package-lock.json → node_modules/.package-lock.json} +0 -16
- 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-server/index.js +1 -1
- package/packages/mailx-settings/cloud.js +12 -7
- package/packages/mailx-settings/index.js +22 -1
- package/client/.gitattributes +0 -10
- package/client/app.js.map +0 -1
- package/client/app.ts +0 -3190
- package/client/components/address-book.js.map +0 -1
- package/client/components/address-book.ts +0 -204
- package/client/components/alarms.js.map +0 -1
- package/client/components/alarms.ts +0 -276
- package/client/components/calendar-sidebar.js.map +0 -1
- package/client/components/calendar-sidebar.ts +0 -474
- package/client/components/calendar.js.map +0 -1
- package/client/components/calendar.ts +0 -211
- package/client/components/context-menu.js.map +0 -1
- package/client/components/context-menu.ts +0 -95
- package/client/components/folder-picker.js.map +0 -1
- package/client/components/folder-picker.ts +0 -127
- package/client/components/folder-tree.js.map +0 -1
- package/client/components/folder-tree.ts +0 -1069
- package/client/components/message-list.js.map +0 -1
- package/client/components/message-list.ts +0 -1129
- package/client/components/message-viewer.js.map +0 -1
- package/client/components/message-viewer.ts +0 -1257
- package/client/components/outbox-view.js.map +0 -1
- package/client/components/outbox-view.ts +0 -102
- package/client/components/tasks.js.map +0 -1
- package/client/components/tasks.ts +0 -234
- package/client/compose/compose.js.map +0 -1
- package/client/compose/compose.ts +0 -1231
- package/client/compose/editor.js.map +0 -1
- package/client/compose/editor.ts +0 -599
- package/client/compose/ghost-text.js.map +0 -1
- package/client/compose/ghost-text.ts +0 -140
- package/client/lib/android-bootstrap.js.map +0 -1
- package/client/lib/android-bootstrap.ts +0 -9
- package/client/lib/api-client.js.map +0 -1
- package/client/lib/api-client.ts +0 -439
- package/client/lib/local-service.js.map +0 -1
- package/client/lib/local-service.ts +0 -646
- package/client/lib/local-store.js.map +0 -1
- package/client/lib/local-store.ts +0 -283
- package/client/lib/message-state.js.map +0 -1
- package/client/lib/message-state.ts +0 -160
- package/client/tsconfig.json +0 -19
- package/packages/mailx-api/.gitattributes +0 -10
- package/packages/mailx-api/index.d.ts.map +0 -1
- package/packages/mailx-api/index.js.map +0 -1
- package/packages/mailx-api/index.ts +0 -283
- package/packages/mailx-api/tsconfig.json +0 -9
- package/packages/mailx-compose/.gitattributes +0 -10
- package/packages/mailx-compose/index.d.ts.map +0 -1
- package/packages/mailx-compose/index.js.map +0 -1
- package/packages/mailx-compose/index.ts +0 -85
- package/packages/mailx-compose/tsconfig.json +0 -9
- package/packages/mailx-host/.gitattributes +0 -10
- package/packages/mailx-host/index.d.ts +0 -21
- package/packages/mailx-host/index.d.ts.map +0 -1
- package/packages/mailx-host/index.js +0 -29
- package/packages/mailx-host/index.js.map +0 -1
- package/packages/mailx-host/index.ts +0 -38
- package/packages/mailx-host/package.json +0 -23
- package/packages/mailx-host/tsconfig.json +0 -9
- package/packages/mailx-host/types-shim.d.ts +0 -14
- package/packages/mailx-imap/.gitattributes +0 -10
- package/packages/mailx-imap/index.d.ts +0 -442
- package/packages/mailx-imap/index.d.ts.map +0 -1
- package/packages/mailx-imap/index.js +0 -3684
- package/packages/mailx-imap/index.js.map +0 -1
- package/packages/mailx-imap/index.ts +0 -3652
- package/packages/mailx-imap/package-lock.json +0 -131
- package/packages/mailx-imap/package.json +0 -28
- package/packages/mailx-imap/providers/gmail-api.d.ts +0 -8
- package/packages/mailx-imap/providers/gmail-api.d.ts.map +0 -1
- package/packages/mailx-imap/providers/gmail-api.js +0 -8
- package/packages/mailx-imap/providers/gmail-api.js.map +0 -1
- package/packages/mailx-imap/providers/gmail-api.ts +0 -8
- package/packages/mailx-imap/providers/outlook-api.ts +0 -7
- package/packages/mailx-imap/providers/types.d.ts +0 -9
- package/packages/mailx-imap/providers/types.d.ts.map +0 -1
- package/packages/mailx-imap/providers/types.js +0 -9
- package/packages/mailx-imap/providers/types.js.map +0 -1
- package/packages/mailx-imap/providers/types.ts +0 -9
- package/packages/mailx-imap/tsconfig.json +0 -9
- package/packages/mailx-imap/tsconfig.tsbuildinfo +0 -1
- package/packages/mailx-send/.gitattributes +0 -10
- package/packages/mailx-send/cli-queue.d.ts.map +0 -1
- package/packages/mailx-send/cli-queue.js.map +0 -1
- package/packages/mailx-send/cli-queue.ts +0 -62
- package/packages/mailx-send/cli-send.d.ts.map +0 -1
- package/packages/mailx-send/cli-send.js.map +0 -1
- package/packages/mailx-send/cli-send.ts +0 -83
- package/packages/mailx-send/cli.d.ts.map +0 -1
- package/packages/mailx-send/cli.js.map +0 -1
- package/packages/mailx-send/cli.ts +0 -126
- package/packages/mailx-send/index.d.ts.map +0 -1
- package/packages/mailx-send/index.js.map +0 -1
- package/packages/mailx-send/index.ts +0 -333
- package/packages/mailx-send/mailsend/cli.d.ts.map +0 -1
- package/packages/mailx-send/mailsend/cli.js.map +0 -1
- package/packages/mailx-send/mailsend/cli.ts +0 -81
- package/packages/mailx-send/mailsend/index.d.ts.map +0 -1
- package/packages/mailx-send/mailsend/index.js.map +0 -1
- package/packages/mailx-send/mailsend/index.ts +0 -333
- package/packages/mailx-send/mailsend/tsconfig.json +0 -21
- package/packages/mailx-send/package-lock.json +0 -65
- package/packages/mailx-send/tsconfig.json +0 -21
- package/packages/mailx-server/.gitattributes +0 -10
- package/packages/mailx-server/index.d.ts.map +0 -1
- package/packages/mailx-server/index.js.map +0 -1
- package/packages/mailx-server/index.ts +0 -429
- package/packages/mailx-server/tsconfig.json +0 -9
- package/packages/mailx-settings/.gitattributes +0 -10
- package/packages/mailx-settings/cloud.d.ts.map +0 -1
- package/packages/mailx-settings/cloud.js.map +0 -1
- package/packages/mailx-settings/cloud.ts +0 -388
- package/packages/mailx-settings/index.d.ts.map +0 -1
- package/packages/mailx-settings/index.js.map +0 -1
- package/packages/mailx-settings/index.ts +0 -892
- package/packages/mailx-settings/tsconfig.json +0 -9
- package/packages/mailx-store/.gitattributes +0 -10
- package/packages/mailx-store/db.d.ts.map +0 -1
- package/packages/mailx-store/db.js.map +0 -1
- package/packages/mailx-store/db.ts +0 -2007
- package/packages/mailx-store/file-store.d.ts.map +0 -1
- package/packages/mailx-store/file-store.js.map +0 -1
- package/packages/mailx-store/file-store.ts +0 -82
- package/packages/mailx-store/index.d.ts.map +0 -1
- package/packages/mailx-store/index.js.map +0 -1
- package/packages/mailx-store/index.ts +0 -7
- package/packages/mailx-store/tsconfig.json +0 -9
- package/packages/mailx-types/.gitattributes +0 -10
- package/packages/mailx-types/index.d.ts.map +0 -1
- package/packages/mailx-types/index.js.map +0 -1
- package/packages/mailx-types/index.ts +0 -498
- package/packages/mailx-types/tsconfig.json +0 -9
|
@@ -1,52 +1,32 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Message viewer component -- displays full message in sandboxed iframe.
|
|
3
|
-
*
|
|
3
|
+
*
|
|
4
|
+
* Passive renderer. The list owns "what's focused"; this module exposes
|
|
5
|
+
* `showMessage(accountId, uid, folderId, envelope?)` and `clearViewer()`
|
|
6
|
+
* as the only ways content reaches the pane. There is no subscription —
|
|
7
|
+
* if the list never tells the viewer about a focus change, the viewer
|
|
8
|
+
* simply doesn't update. That's the property that makes summary↔preview
|
|
9
|
+
* drift impossible: there is exactly one path into this pane.
|
|
4
10
|
*/
|
|
5
11
|
import { getMessage, updateFlags, allowRemoteContent, flagSenderOrDomain, getAttachment, addContact, listContacts, upsertContact, unsubscribeOneClick, addPreferredContact } from "../lib/api-client.js";
|
|
6
12
|
import { showContextMenu } from "./context-menu.js";
|
|
7
|
-
import
|
|
13
|
+
import { updateMessageFlags as stateUpdateFlags } from "../lib/message-state.js";
|
|
8
14
|
/** Currently displayed message (for reply/forward) */
|
|
9
15
|
let currentMessage = null;
|
|
10
16
|
let currentAccountId = "";
|
|
11
17
|
let showMessageGeneration = 0; // Cancel stale fetches
|
|
12
18
|
let retryCount = 0;
|
|
19
|
+
/** Last envelope handed in by the list — used for envelope-first paint
|
|
20
|
+
* on retry, where we don't have a fresh row click to pass it again. */
|
|
21
|
+
let lastEnvelope = null;
|
|
13
22
|
export function getCurrentMessage() {
|
|
14
23
|
if (!currentMessage)
|
|
15
24
|
return null;
|
|
16
25
|
return { accountId: currentAccountId, message: currentMessage };
|
|
17
26
|
}
|
|
18
|
-
/**
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
if (change === "removed") {
|
|
22
|
-
// Message was deleted/moved — show auto-selected next, or clear
|
|
23
|
-
const sel = state.getSelected();
|
|
24
|
-
if (!sel) {
|
|
25
|
-
clearViewer();
|
|
26
|
-
}
|
|
27
|
-
else if (sel.uid !== currentMessage?.uid || sel.accountId !== currentAccountId) {
|
|
28
|
-
showMessage(sel.accountId, sel.uid, sel.folderId);
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
else if (change === "selected") {
|
|
32
|
-
// Explicit deselect (folder switch, clearViewer)
|
|
33
|
-
if (!state.getSelected()) {
|
|
34
|
-
clearViewer();
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
else if (change === "messages") {
|
|
38
|
-
// List was replaced (search, folder switch, sync reload). If the
|
|
39
|
-
// currently-displayed message is no longer in the list, clear the
|
|
40
|
-
// viewer — otherwise the user sees a preview that doesn't match
|
|
41
|
-
// any visible row. (The "search-clears-preview" bug class.)
|
|
42
|
-
// setMessages already deselects in this case; we just need to
|
|
43
|
-
// notice and clear here since the viewer ignored "messages" before.
|
|
44
|
-
if (currentMessage && !state.getSelected()) {
|
|
45
|
-
clearViewer();
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
});
|
|
49
|
-
}
|
|
27
|
+
/** Kept as an exported no-op for back-compat with app.ts wiring. The
|
|
28
|
+
* state-subscribe model is gone; list now drives the viewer directly. */
|
|
29
|
+
export function initViewer() { }
|
|
50
30
|
// Zoom is persisted across messages via localStorage
|
|
51
31
|
const ZOOM_KEY = "mailx-preview-zoom";
|
|
52
32
|
const ZOOM_MIN = 0.5;
|
|
@@ -250,9 +230,10 @@ function installPreviewControls(iframe) {
|
|
|
250
230
|
else
|
|
251
231
|
iframe.addEventListener("load", attach, { once: true });
|
|
252
232
|
}
|
|
253
|
-
function clearViewer() {
|
|
233
|
+
export function clearViewer() {
|
|
254
234
|
currentMessage = null;
|
|
255
235
|
currentAccountId = "";
|
|
236
|
+
lastEnvelope = null;
|
|
256
237
|
showMessageGeneration++;
|
|
257
238
|
const headerEl = document.getElementById("mv-header");
|
|
258
239
|
const bodyEl = document.getElementById("mv-body");
|
|
@@ -264,7 +245,12 @@ function clearViewer() {
|
|
|
264
245
|
if (attEl)
|
|
265
246
|
attEl.hidden = true;
|
|
266
247
|
}
|
|
267
|
-
|
|
248
|
+
/** Render the message identified by (accountId, uid, folderId). The
|
|
249
|
+
* list passes the row's existing envelope as `envelope` so the header +
|
|
250
|
+
* preview snippet paint *immediately*, before the body fetch returns —
|
|
251
|
+
* that's the "no Fetching… empty pane" guarantee. On retry, we reuse
|
|
252
|
+
* the most recently provided envelope. */
|
|
253
|
+
export async function showMessage(accountId, uid, folderId, specialUse, isRetry = false, envelope) {
|
|
268
254
|
const gen = ++showMessageGeneration;
|
|
269
255
|
if (!isRetry)
|
|
270
256
|
retryCount = 0;
|
|
@@ -277,8 +263,12 @@ export async function showMessage(accountId, uid, folderId, specialUse, isRetry
|
|
|
277
263
|
// tapping a message never shows just "Fetching message body..." with
|
|
278
264
|
// nothing actionable. The full getMessage() call (which might block on
|
|
279
265
|
// a slow IMAP body fetch) only fills in the body and attachments.
|
|
280
|
-
const cached =
|
|
281
|
-
|
|
266
|
+
const cached = (envelope && envelope.uid === uid && (envelope.accountId || accountId) === accountId)
|
|
267
|
+
? envelope
|
|
268
|
+
: (lastEnvelope && lastEnvelope.uid === uid && (lastEnvelope.accountId || accountId) === accountId ? lastEnvelope : null);
|
|
269
|
+
if (envelope)
|
|
270
|
+
lastEnvelope = envelope;
|
|
271
|
+
if (cached) {
|
|
282
272
|
try {
|
|
283
273
|
renderHeaderFromEnvelope(headerEl, cached);
|
|
284
274
|
}
|
|
@@ -329,7 +319,7 @@ export async function showMessage(accountId, uid, folderId, specialUse, isRetry
|
|
|
329
319
|
// Reflect locally so the list row stops looking unread.
|
|
330
320
|
msg.flags = newFlags;
|
|
331
321
|
try {
|
|
332
|
-
|
|
322
|
+
stateUpdateFlags(accountId, uid, newFlags);
|
|
333
323
|
}
|
|
334
324
|
catch { /* */ }
|
|
335
325
|
}, delaySec * 1000);
|
|
@@ -871,8 +861,13 @@ export async function showMessage(accountId, uid, folderId, specialUse, isRetry
|
|
|
871
861
|
if (isNotFound) {
|
|
872
862
|
// Drop the stale row so the list auto-advances to the next message
|
|
873
863
|
// (or clears the viewer). Leaves the user a way back on mobile where
|
|
874
|
-
// the viewer takes the whole screen.
|
|
875
|
-
|
|
864
|
+
// the viewer takes the whole screen. The list owns focus handoff —
|
|
865
|
+
// we surface the removal as an event and let it run its own
|
|
866
|
+
// removeMessages flow (which both filters the list and re-focuses
|
|
867
|
+
// a survivor or clears this pane).
|
|
868
|
+
document.dispatchEvent(new CustomEvent("mailx-remove-stale", {
|
|
869
|
+
detail: { accountId, uid },
|
|
870
|
+
}));
|
|
876
871
|
return;
|
|
877
872
|
}
|
|
878
873
|
if (retryCount < 3) {
|
package/client/index.html
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
<head>
|
|
4
4
|
<meta charset="UTF-8">
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
-
<title>
|
|
6
|
+
<title>rmfmail</title>
|
|
7
7
|
<link rel="icon" type="image/svg+xml" href="favicon.svg">
|
|
8
8
|
<link rel="stylesheet" href="styles/variables.css">
|
|
9
9
|
<link rel="stylesheet" href="styles/components.css">
|
|
@@ -61,14 +61,14 @@
|
|
|
61
61
|
<label class="tb-menu-item" title="Seconds to wait before auto-marking a viewed message as read. Higher = scroll past messages without changing their unread state. 0 = mark immediately.">Mark-read delay (sec) <input type="number" id="opt-automark-delay" min="0" max="30" step="0.5" style="width:4em"></label>
|
|
62
62
|
<hr class="tb-menu-sep">
|
|
63
63
|
<button class="tb-menu-item" id="btn-edit-jsonc" title="Edit accounts.jsonc / allowlist.jsonc">Edit config files...</button>
|
|
64
|
-
<button class="tb-menu-item" id="btn-open-mailx-dir" title="Open ~/.
|
|
64
|
+
<button class="tb-menu-item" id="btn-open-mailx-dir" title="Open ~/.rmfmail in file explorer">Open rmfmail folder...</button>
|
|
65
65
|
<button class="tb-menu-item" id="btn-open-log" title="Open today's log file">Open log...</button>
|
|
66
|
-
<button class="tb-menu-item" id="btn-about" title="Show version and build info">About
|
|
66
|
+
<button class="tb-menu-item" id="btn-about" title="Show version and build info">About rmfmail...</button>
|
|
67
67
|
</div>
|
|
68
68
|
</div>
|
|
69
69
|
<button class="tb-btn" id="btn-tb-delete" title="Delete selected message (Del)">🗑</button>
|
|
70
70
|
<button class="tb-btn" id="btn-tb-spam" title="Mark as spam — move to the configured Junk folder">⚠</button>
|
|
71
|
-
<span id="app-version" class="app-version">
|
|
71
|
+
<span id="app-version" class="app-version">rmfmail</span>
|
|
72
72
|
</div>
|
|
73
73
|
<div class="toolbar-right">
|
|
74
74
|
<button class="tb-btn" id="btn-sync" title="Sync all folders (F5)">
|
|
@@ -79,11 +79,11 @@
|
|
|
79
79
|
<span class="tb-icon">⚡</span><span class="tb-label"> Restart ▾</span>
|
|
80
80
|
</button>
|
|
81
81
|
<div class="tb-menu-dropdown" id="restart-dropdown" hidden>
|
|
82
|
-
<button class="tb-menu-item" id="btn-restart-quick" title="Restart the
|
|
82
|
+
<button class="tb-menu-item" id="btn-restart-quick" title="Restart the rmfmail daemon and reload the UI — picks up new code after a build">Restart</button>
|
|
83
83
|
<button class="tb-menu-item" id="btn-update" title="Check for updates and install if available">Check for updates</button>
|
|
84
84
|
<button class="tb-menu-item" id="btn-rebuild" title="Wipe local DB and message cache, re-download everything. Accounts and settings are preserved. Safe and fast.">Rebuild local cache</button>
|
|
85
85
|
<hr class="tb-menu-sep">
|
|
86
|
-
<span class="tb-menu-hint">CLI:
|
|
86
|
+
<span class="tb-menu-hint">CLI: rmfmail -rebuild for full reset</span>
|
|
87
87
|
</div>
|
|
88
88
|
</div>
|
|
89
89
|
</div>
|
|
@@ -154,7 +154,7 @@
|
|
|
154
154
|
<button class="tb-btn" id="btn-forward" title="Forward">→</button>
|
|
155
155
|
<button class="tb-btn" id="btn-delete" title="Delete (Del)">🗑</button>
|
|
156
156
|
<button class="tb-btn" id="btn-spam" title="Mark as spam — move to configured spam folder" hidden>⚠</button>
|
|
157
|
-
<button class="tb-btn" id="btn-spam-report" title="Report as spam (append to ~/.
|
|
157
|
+
<button class="tb-btn" id="btn-spam-report" title="Report as spam (append to ~/.rmfmail/spam.csv for later analysis)">🚫</button>
|
|
158
158
|
<button class="tb-btn" id="btn-flag" title="Flag">⚑</button>
|
|
159
159
|
<button class="tb-btn" id="btn-mark-unread" title="Mark unread (R)">◉</button>
|
|
160
160
|
<button class="tb-btn" id="mv-view-thread" title="View thread (conversation)" hidden>💬</button>
|
|
@@ -217,7 +217,7 @@
|
|
|
217
217
|
<span id="status-diag" class="status-diag" hidden title=""></span>
|
|
218
218
|
<span id="status-pending"></span>
|
|
219
219
|
<span id="status-queue"></span>
|
|
220
|
-
<span class="app-version" id="status-version">
|
|
220
|
+
<span class="app-version" id="status-version">rmfmail</span>
|
|
221
221
|
</footer>
|
|
222
222
|
|
|
223
223
|
<div id="startup-overlay" class="startup-overlay">
|
|
@@ -1,16 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Shared message
|
|
2
|
+
* Shared message store — the messages currently rendered in the list.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* Selection state used to live here too, with a broadcast-subscribe model
|
|
5
|
+
* that let the viewer subscribe to "selected changed" events independently
|
|
6
|
+
* of the list. That made drift between the highlighted row and the preview
|
|
7
|
+
* pane possible: two subscribers, two render paths, two opportunities for
|
|
8
|
+
* a missed update or stale read. Selection is now owned by message-list
|
|
9
|
+
* (the only thing that has DOM rows in the first place); the viewer is a
|
|
10
|
+
* passive `show(msg)` / `clear()` API the list calls directly. With one
|
|
11
|
+
* code path, drift is structurally impossible.
|
|
12
|
+
*
|
|
13
|
+
* What remains here: the array of currently-loaded messages, plus the
|
|
14
|
+
* removeMessages helper that filters the array and lets the caller decide
|
|
15
|
+
* which row to focus next (if any) — that policy is the list's, not the
|
|
16
|
+
* store's.
|
|
7
17
|
*/
|
|
8
|
-
/** The currently loaded messages (what the list shows) */
|
|
9
18
|
let messages = [];
|
|
10
|
-
/** The currently selected/viewed message (same ref as an entry in messages[]) */
|
|
11
|
-
let selected = null;
|
|
12
19
|
const listeners = [];
|
|
13
|
-
/** Subscribe to state changes. Returns unsubscribe function. */
|
|
14
20
|
export function subscribe(fn) {
|
|
15
21
|
listeners.push(fn);
|
|
16
22
|
return () => {
|
|
@@ -19,61 +25,38 @@ export function subscribe(fn) {
|
|
|
19
25
|
listeners.splice(i, 1);
|
|
20
26
|
};
|
|
21
27
|
}
|
|
22
|
-
function notify(
|
|
28
|
+
function notify() {
|
|
23
29
|
for (const fn of listeners) {
|
|
24
30
|
try {
|
|
25
|
-
fn(
|
|
31
|
+
fn();
|
|
26
32
|
}
|
|
27
33
|
catch { /* don't let one subscriber break others */ }
|
|
28
34
|
}
|
|
29
35
|
}
|
|
30
|
-
/** Replace the entire message list (folder load, search, unified inbox).
|
|
31
|
-
* Selection stays even when the previously-selected message isn't in
|
|
32
|
-
* the new list — that case happens whenever a periodic sync re-fetches
|
|
33
|
-
* page 1 of the unified inbox and a row the user opened earlier has
|
|
34
|
-
* scrolled off, or when the same row's accountId/uid pair changes
|
|
35
|
-
* shape after dedup. Yanking the viewer mid-read was a user-reported
|
|
36
|
-
* surprise (2026-04-30: "I was reading a message but now it just
|
|
37
|
-
* jumped to Select a message to read"). The viewer keeps the message
|
|
38
|
-
* it has; it'll only clear when the user explicitly clicks elsewhere
|
|
39
|
-
* or the message is removed via removeMessages (real delete/move). */
|
|
36
|
+
/** Replace the entire message list (folder load, search, unified inbox). */
|
|
40
37
|
export function setMessages(msgs) {
|
|
41
38
|
messages = msgs;
|
|
42
|
-
notify(
|
|
39
|
+
notify();
|
|
43
40
|
}
|
|
44
|
-
/** Get current messages */
|
|
45
41
|
export function getMessages() {
|
|
46
42
|
return messages;
|
|
47
43
|
}
|
|
48
|
-
/** Select a message (by reference or null to deselect) */
|
|
49
|
-
export function select(msg) {
|
|
50
|
-
selected = msg;
|
|
51
|
-
notify("selected");
|
|
52
|
-
}
|
|
53
|
-
/** Get the selected message */
|
|
54
|
-
export function getSelected() {
|
|
55
|
-
return selected;
|
|
56
|
-
}
|
|
57
44
|
/**
|
|
58
45
|
* Remove messages from the list (after move or delete).
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
*
|
|
62
|
-
*
|
|
63
|
-
*
|
|
46
|
+
*
|
|
47
|
+
* Returns a RemovalOutcome the caller uses to drive focus handoff. We
|
|
48
|
+
* pre-capture the next-survivor *by identity* (not by index) before the
|
|
49
|
+
* filter mutates the array, so subsequent index shifts don't matter — if
|
|
50
|
+
* every deleted row had a survivor below it, the chosen survivor is the
|
|
51
|
+
* same regardless of how many got deleted. Falls back to walking
|
|
52
|
+
* backward when the deletion is at the bottom.
|
|
64
53
|
*/
|
|
65
|
-
export function removeMessages(uids) {
|
|
54
|
+
export function removeMessages(uids, currentlyFocused) {
|
|
66
55
|
const removeSet = new Set(uids.map(u => `${u.accountId}:${u.uid}`));
|
|
67
|
-
const
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
// next. Capturing by reference (not index) so the post-filter shift
|
|
72
|
-
// doesn't matter; if every deleted row had a survivor below it, the
|
|
73
|
-
// chosen survivor is the same regardless of how many got deleted.
|
|
74
|
-
// Falls back to walking backward if the deletion is at the bottom.
|
|
75
|
-
let nextAfterRemoval = null;
|
|
76
|
-
if (wasSelectedRemoved) {
|
|
56
|
+
const focusedKey = currentlyFocused ? `${currentlyFocused.accountId}:${currentlyFocused.uid}` : null;
|
|
57
|
+
const focusedWasRemoved = focusedKey !== null && removeSet.has(focusedKey);
|
|
58
|
+
let nextSurvivor = null;
|
|
59
|
+
if (focusedWasRemoved) {
|
|
77
60
|
let lastRemovedIdx = -1;
|
|
78
61
|
for (let i = 0; i < messages.length; i++) {
|
|
79
62
|
if (removeSet.has(`${messages[i].accountId}:${messages[i].uid}`))
|
|
@@ -81,24 +64,23 @@ export function removeMessages(uids) {
|
|
|
81
64
|
}
|
|
82
65
|
for (let i = lastRemovedIdx + 1; i < messages.length; i++) {
|
|
83
66
|
if (!removeSet.has(`${messages[i].accountId}:${messages[i].uid}`)) {
|
|
84
|
-
|
|
67
|
+
nextSurvivor = messages[i];
|
|
85
68
|
break;
|
|
86
69
|
}
|
|
87
70
|
}
|
|
88
|
-
if (!
|
|
89
|
-
// No survivor below — fall back to the closest survivor above.
|
|
71
|
+
if (!nextSurvivor) {
|
|
90
72
|
for (let i = lastRemovedIdx - 1; i >= 0; i--) {
|
|
91
73
|
if (!removeSet.has(`${messages[i].accountId}:${messages[i].uid}`)) {
|
|
92
|
-
|
|
74
|
+
nextSurvivor = messages[i];
|
|
93
75
|
break;
|
|
94
76
|
}
|
|
95
77
|
}
|
|
96
78
|
}
|
|
97
79
|
}
|
|
98
|
-
//
|
|
99
|
-
//
|
|
100
|
-
//
|
|
101
|
-
//
|
|
80
|
+
// dupeCount fix-up: if we removed one half of a unified-inbox duplicate
|
|
81
|
+
// pair, the surviving row's ⇆ marker should drop now rather than wait
|
|
82
|
+
// for the next server fetch. Decrement once per remaining row whose
|
|
83
|
+
// messageId matches a removed one.
|
|
102
84
|
const removedIds = new Set();
|
|
103
85
|
for (const m of messages) {
|
|
104
86
|
if (removeSet.has(`${m.accountId}:${m.uid}`) && m.messageId) {
|
|
@@ -106,10 +88,6 @@ export function removeMessages(uids) {
|
|
|
106
88
|
}
|
|
107
89
|
}
|
|
108
90
|
messages = messages.filter(m => !removeSet.has(`${m.accountId}:${m.uid}`));
|
|
109
|
-
// Sibling dupeCount adjustment. dupeCount is server-recomputed on the
|
|
110
|
-
// next getUnifiedInbox fetch, but we don't want to wait for that —
|
|
111
|
-
// user just deleted, the marker should drop now. Decrement once per
|
|
112
|
-
// remaining message whose messageId matches a removed one.
|
|
113
91
|
if (removedIds.size > 0) {
|
|
114
92
|
for (const m of messages) {
|
|
115
93
|
if (m.messageId && removedIds.has(m.messageId) && typeof m.dupeCount === "number") {
|
|
@@ -117,16 +95,19 @@ export function removeMessages(uids) {
|
|
|
117
95
|
}
|
|
118
96
|
}
|
|
119
97
|
}
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
98
|
+
notify();
|
|
99
|
+
return {
|
|
100
|
+
focusedWasRemoved,
|
|
101
|
+
nextSurvivor: nextSurvivor
|
|
102
|
+
? { accountId: nextSurvivor.accountId, uid: nextSurvivor.uid, folderId: nextSurvivor.folderId }
|
|
103
|
+
: null,
|
|
104
|
+
};
|
|
124
105
|
}
|
|
125
|
-
/** Update flags on a message in the list
|
|
106
|
+
/** Update flags on a message in the list. List re-renders the row's
|
|
107
|
+
* flag/unread classes inline; no broadcast. */
|
|
126
108
|
export function updateMessageFlags(accountId, uid, flags) {
|
|
127
109
|
const msg = messages.find(m => m.uid === uid && m.accountId === accountId);
|
|
128
110
|
if (msg)
|
|
129
111
|
msg.flags = flags;
|
|
130
|
-
// No notify — flag changes are cosmetic, handled inline by the list
|
|
131
112
|
}
|
|
132
113
|
//# sourceMappingURL=message-state.js.map
|
package/index.js
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// @bobfrankston/mailx has been renamed to @bobfrankston/rmfmail.
|
|
3
|
+
// This stub replaces the real client on the old name. Old installs
|
|
4
|
+
// (or anyone who types `npm install -g @bobfrankston/mailx`) end up
|
|
5
|
+
// here, get told what to do, and can opt-in to auto-migrate.
|
|
6
|
+
//
|
|
7
|
+
// Why a stub instead of unpublish: npm only allows unpublish within 72h
|
|
8
|
+
// of publish AND only when no other package depends on you. The old
|
|
9
|
+
// name will exist on the registry essentially forever; making it loud
|
|
10
|
+
// and useful beats letting it run stale code.
|
|
11
|
+
|
|
12
|
+
import { execSync } from "node:child_process";
|
|
13
|
+
import readline from "node:readline";
|
|
14
|
+
|
|
15
|
+
const NEW_NAME = "@bobfrankston/rmfmail";
|
|
16
|
+
const OLD_NAME = "@bobfrankston/mailx";
|
|
17
|
+
|
|
18
|
+
console.log("");
|
|
19
|
+
console.log("─────────────────────────────────────────────────────────────");
|
|
20
|
+
console.log(` ${OLD_NAME} has been renamed to ${NEW_NAME}`);
|
|
21
|
+
console.log("─────────────────────────────────────────────────────────────");
|
|
22
|
+
console.log("");
|
|
23
|
+
console.log("To migrate:");
|
|
24
|
+
console.log(` npm install -g ${NEW_NAME}`);
|
|
25
|
+
console.log(` npm uninstall -g ${OLD_NAME}`);
|
|
26
|
+
console.log("");
|
|
27
|
+
console.log(`Then run: rmfmail`);
|
|
28
|
+
console.log("");
|
|
29
|
+
|
|
30
|
+
// If stdin isn't a TTY (piped, scripted), don't prompt — just exit
|
|
31
|
+
// after printing instructions. Avoids hanging in CI / automation.
|
|
32
|
+
if (!process.stdin.isTTY) {
|
|
33
|
+
process.exit(0);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
37
|
+
rl.question("Run those commands now? [y/N] ", (ans) => {
|
|
38
|
+
rl.close();
|
|
39
|
+
if (!/^y/i.test((ans || "").trim())) {
|
|
40
|
+
console.log("Skipped. Run them manually when ready.");
|
|
41
|
+
process.exit(0);
|
|
42
|
+
}
|
|
43
|
+
try {
|
|
44
|
+
console.log(`\nInstalling ${NEW_NAME}...`);
|
|
45
|
+
execSync(`npm install -g ${NEW_NAME}`, { stdio: "inherit" });
|
|
46
|
+
console.log(`\nUninstalling ${OLD_NAME}...`);
|
|
47
|
+
// Run uninstall AFTER install so a failed install doesn't leave
|
|
48
|
+
// the user with no client at all.
|
|
49
|
+
execSync(`npm uninstall -g ${OLD_NAME}`, { stdio: "inherit" });
|
|
50
|
+
console.log("");
|
|
51
|
+
console.log(`✓ Migrated. Run: rmfmail`);
|
|
52
|
+
} catch (e) {
|
|
53
|
+
console.error(`Migration failed: ${e?.message || e}`);
|
|
54
|
+
console.error(`Run the two commands manually:`);
|
|
55
|
+
console.error(` npm install -g ${NEW_NAME}`);
|
|
56
|
+
console.error(` npm uninstall -g ${OLD_NAME}`);
|
|
57
|
+
process.exit(1);
|
|
58
|
+
}
|
|
59
|
+
});
|
package/package.json
CHANGED
|
@@ -1,124 +1,22 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bobfrankston/mailx",
|
|
3
|
-
"version": "1.0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "1.0.500",
|
|
4
|
+
"description": "Renamed to @bobfrankston/rmfmail — install that instead",
|
|
5
5
|
"type": "module",
|
|
6
|
-
"main": "
|
|
6
|
+
"main": "index.js",
|
|
7
7
|
"bin": {
|
|
8
|
-
"mailx": "
|
|
9
|
-
"bobmail": "bin/mailx.js"
|
|
8
|
+
"mailx": "index.js"
|
|
10
9
|
},
|
|
11
|
-
"workspaces": [
|
|
12
|
-
"packages/mailx-types",
|
|
13
|
-
"packages/mailx-host",
|
|
14
|
-
"packages/mailx-send",
|
|
15
|
-
"packages/mailx-compose",
|
|
16
|
-
"packages/mailx-settings",
|
|
17
|
-
"packages/mailx-store",
|
|
18
|
-
"packages/mailx-store-web",
|
|
19
|
-
"packages/mailx-imap",
|
|
20
|
-
"packages/mailx-service",
|
|
21
|
-
"packages/mailx-api",
|
|
22
|
-
"packages/mailx-core",
|
|
23
|
-
"packages/mailx-server",
|
|
24
|
-
"client"
|
|
25
|
-
],
|
|
26
|
-
"scripts": {
|
|
27
|
-
"build": "tsc -p bin && node bin/build-icon-ico.js",
|
|
28
|
-
"watch": "tsc -w",
|
|
29
|
-
"start": "node --watch packages/mailx-server/index.js",
|
|
30
|
-
"start:prod": "node packages/mailx-server/index.js",
|
|
31
|
-
"release": "npmglobalize",
|
|
32
|
-
"postinstall": "node bin/postinstall.js"
|
|
33
|
-
},
|
|
34
|
-
"dependencies": {
|
|
35
|
-
"@bobfrankston/iflow-direct": "^0.1.27",
|
|
36
|
-
"@bobfrankston/iflow-node": "^0.1.8",
|
|
37
|
-
"@bobfrankston/miscinfo": "^1.0.10",
|
|
38
|
-
"@bobfrankston/oauthsupport": "^1.0.25",
|
|
39
|
-
"@bobfrankston/msger": "^0.1.369",
|
|
40
|
-
"@bobfrankston/mailx-host": "^0.1.10",
|
|
41
|
-
"@capacitor/android": "^8.3.0",
|
|
42
|
-
"@capacitor/cli": "^8.3.0",
|
|
43
|
-
"@capacitor/core": "^8.3.0",
|
|
44
|
-
"express": "^4.21.0",
|
|
45
|
-
"jsonc-parser": "^3.3.1",
|
|
46
|
-
"mailparser": "^3.7.2",
|
|
47
|
-
"nodemailer": "^7.0.0",
|
|
48
|
-
"quill": "^2.0.3",
|
|
49
|
-
"ws": "^8.18.0",
|
|
50
|
-
"sql.js": "^1.14.1",
|
|
51
|
-
"@bobfrankston/tcp-transport": "^0.1.5",
|
|
52
|
-
"@bobfrankston/node-tcp-transport": "^0.1.6",
|
|
53
|
-
"@bobfrankston/smtp-direct": "^0.1.5",
|
|
54
|
-
"@bobfrankston/mailx-sync": "^0.1.10",
|
|
55
|
-
"@bobfrankston/mailx-imap": "^0.1.15"
|
|
56
|
-
},
|
|
57
|
-
"devDependencies": {
|
|
58
|
-
"@types/mailparser": "^3.4.6"
|
|
59
|
-
},
|
|
60
|
-
"keywords": [
|
|
61
|
-
"email",
|
|
62
|
-
"imap",
|
|
63
|
-
"smtp",
|
|
64
|
-
"mail-client",
|
|
65
|
-
"webview"
|
|
66
|
-
],
|
|
67
|
-
"author": "Bob Frankston",
|
|
68
|
-
"license": "MIT",
|
|
69
10
|
"publishConfig": {
|
|
70
11
|
"access": "public"
|
|
71
12
|
},
|
|
72
|
-
"
|
|
73
|
-
|
|
74
|
-
"
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
"@bobfrankston/
|
|
80
|
-
"@bobfrankston/oauthsupport": "file:../../../projects/oauth/oauthsupport",
|
|
81
|
-
"@bobfrankston/msger": "file:../../../utils/msgx/msger",
|
|
82
|
-
"@bobfrankston/mailx-host": "file:packages/mailx-host",
|
|
83
|
-
"@capacitor/android": "^8.3.0",
|
|
84
|
-
"@capacitor/cli": "^8.3.0",
|
|
85
|
-
"@capacitor/core": "^8.3.0",
|
|
86
|
-
"express": "^4.21.0",
|
|
87
|
-
"jsonc-parser": "^3.3.1",
|
|
88
|
-
"mailparser": "^3.7.2",
|
|
89
|
-
"nodemailer": "^7.0.0",
|
|
90
|
-
"quill": "^2.0.3",
|
|
91
|
-
"ws": "^8.18.0",
|
|
92
|
-
"sql.js": "^1.14.1",
|
|
93
|
-
"@bobfrankston/tcp-transport": "file:../../MailApps/tcp-transport",
|
|
94
|
-
"@bobfrankston/node-tcp-transport": "file:../../MailApps/node-tcp-transport",
|
|
95
|
-
"@bobfrankston/smtp-direct": "file:../../MailApps/smtp-direct",
|
|
96
|
-
"@bobfrankston/mailx-sync": "file:../../MailApps/mailx-sync",
|
|
97
|
-
"@bobfrankston/mailx-imap": "file:packages/mailx-imap"
|
|
98
|
-
},
|
|
99
|
-
".transformedSnapshot": {
|
|
100
|
-
"dependencies": {
|
|
101
|
-
"@bobfrankston/iflow-direct": "^0.1.27",
|
|
102
|
-
"@bobfrankston/iflow-node": "^0.1.8",
|
|
103
|
-
"@bobfrankston/miscinfo": "^1.0.10",
|
|
104
|
-
"@bobfrankston/oauthsupport": "^1.0.25",
|
|
105
|
-
"@bobfrankston/msger": "^0.1.369",
|
|
106
|
-
"@bobfrankston/mailx-host": "^0.1.10",
|
|
107
|
-
"@capacitor/android": "^8.3.0",
|
|
108
|
-
"@capacitor/cli": "^8.3.0",
|
|
109
|
-
"@capacitor/core": "^8.3.0",
|
|
110
|
-
"express": "^4.21.0",
|
|
111
|
-
"jsonc-parser": "^3.3.1",
|
|
112
|
-
"mailparser": "^3.7.2",
|
|
113
|
-
"nodemailer": "^7.0.0",
|
|
114
|
-
"quill": "^2.0.3",
|
|
115
|
-
"ws": "^8.18.0",
|
|
116
|
-
"sql.js": "^1.14.1",
|
|
117
|
-
"@bobfrankston/tcp-transport": "^0.1.5",
|
|
118
|
-
"@bobfrankston/node-tcp-transport": "^0.1.6",
|
|
119
|
-
"@bobfrankston/smtp-direct": "^0.1.5",
|
|
120
|
-
"@bobfrankston/mailx-sync": "^0.1.10",
|
|
121
|
-
"@bobfrankston/mailx-imap": "^0.1.15"
|
|
122
|
-
}
|
|
13
|
+
"license": "MIT",
|
|
14
|
+
"keywords": [
|
|
15
|
+
"deprecated",
|
|
16
|
+
"renamed",
|
|
17
|
+
"moved"
|
|
18
|
+
],
|
|
19
|
+
"dependencies": {
|
|
20
|
+
"@bobfrankston/rmfmail": "^1.0.473"
|
|
123
21
|
}
|
|
124
22
|
}
|
|
@@ -4,22 +4,6 @@
|
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
|
-
"": {
|
|
8
|
-
"name": "@bobfrankston/mailsend",
|
|
9
|
-
"version": "0.1.0",
|
|
10
|
-
"license": "MIT",
|
|
11
|
-
"dependencies": {
|
|
12
|
-
"@bobfrankston/oauthsupport": "file:../../projects/oauth/oauthsupport",
|
|
13
|
-
"nodemailer": "^7.0.0"
|
|
14
|
-
},
|
|
15
|
-
"bin": {
|
|
16
|
-
"mailsend": "cli.js"
|
|
17
|
-
},
|
|
18
|
-
"devDependencies": {
|
|
19
|
-
"@types/node": "^22.0.0",
|
|
20
|
-
"@types/nodemailer": "^6.4.0"
|
|
21
|
-
}
|
|
22
|
-
},
|
|
23
7
|
"../../projects/oauth/oauthsupport": {},
|
|
24
8
|
"node_modules/@bobfrankston/oauthsupport": {
|
|
25
9
|
"resolved": "../../projects/oauth/oauthsupport",
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) Microsoft Corporation.
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# Installation
|
|
2
|
+
> `npm install --save @types/node`
|
|
3
|
+
|
|
4
|
+
# Summary
|
|
5
|
+
This package contains type definitions for node (https://nodejs.org/).
|
|
6
|
+
|
|
7
|
+
# Details
|
|
8
|
+
Files were exported from https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/node/v22.
|
|
9
|
+
|
|
10
|
+
### Additional Details
|
|
11
|
+
* Last updated: Fri, 06 Mar 2026 00:57:44 GMT
|
|
12
|
+
* Dependencies: [undici-types](https://npmjs.com/package/undici-types)
|
|
13
|
+
|
|
14
|
+
# Credits
|
|
15
|
+
These definitions were written by [Microsoft TypeScript](https://github.com/Microsoft), [Alberto Schiabel](https://github.com/jkomyno), [Andrew Makarov](https://github.com/r3nya), [Benjamin Toueg](https://github.com/btoueg), [David Junger](https://github.com/touffy), [Mohsen Azimi](https://github.com/mohsen1), [Nikita Galkin](https://github.com/galkin), [Sebastian Silbermann](https://github.com/eps1lon), [Wilco Bakker](https://github.com/WilcoBakker), [Marcin Kopacz](https://github.com/chyzwar), [Trivikram Kamat](https://github.com/trivikr), [Junxiao Shi](https://github.com/yoursunny), [Ilia Baryshnikov](https://github.com/qwelias), [ExE Boss](https://github.com/ExE-Boss), [Piotr Błażejewicz](https://github.com/peterblazejewicz), [Anna Henningsen](https://github.com/addaleax), [Victor Perin](https://github.com/victorperin), [NodeJS Contributors](https://github.com/NodeJS), [Linus Unnebäck](https://github.com/LinusU), [wafuwafu13](https://github.com/wafuwafu13), [Matteo Collina](https://github.com/mcollina), [Dmitry Semigradsky](https://github.com/Semigradsky), and [René](https://github.com/Renegade334).
|