Repository Analysis

Foundry376/Mailspring

:love_letter: A beautiful, fast and fully open source mail client for Mac, Windows and Linux.

0.8 Likely human-written View on GitHub
0.8
Adjusted Score
0.8
Raw Score
100%
Time Factor
2026-05-29
Last Push
17,538
Stars
JavaScript
Language
304,167
Lines of Code
1282
Files
189
Pattern Hits
2026-05-31
Scan Date

Score History

Severity Breakdown

CRITICAL 0HIGH 1MEDIUM 18LOW 170

Pattern Findings

189 matches across 6 categories. Click a row to expand file-level details.

Hyper-Verbose Identifiers79 hits · 78 pts
SeverityFileLineSnippet
LOWapp/spec/database-object-registry-spec.ts18describe('DatabaseObjectRegistry', function DatabaseObjectRegistrySpecs() {
LOWapp/spec/spec-runner/react-test-utils-extensions.ts6export function scryRenderedComponentsWithTypeAndProps(root, type, props) {
LOWapp/spec/spec-runner/gui-reporter.tsx327export function reportPlainTextSpecResult(spec) {
LOWapp/spec/stores/folder-sync-progress-store-spec.ts1xdescribe('FolderSyncProgressStore', function mailspringSyncStatusStore() {});
LOWapp/spec/models/mutable-query-result-set-spec.ts5describe('MutableQueryResultSet', function MutableQueryResultSetSpecs() {
LOWapp/spec/models/query-subscription-pool-spec.ts5describe('QuerySubscriptionPool', function QuerySubscriptionPoolSpecs() {
LOWapp/spec/components/participants-text-field-spec.tsx22xdescribe('ParticipantsTextField', function ParticipantsTextFieldSpecs() {
LOW…_packages/thread-list/lib/thread-list-participants.tsx44function getTokensFromParticipants(thread: ThreadWithMessagesMetadata) {
LOW…preferences/specs/preferences-account-details-spec.tsx19describe('PreferencesAccountDetails', function preferencesAccountDetails() {
LOW…packages/send-reminders/lib/send-reminders-headers.tsx10export function NotificationExplanationMessageHeader({
LOW…packages/send-reminders/lib/send-reminders-headers.tsx42export function ScheduledReminderThreadHeader({
LOW…al_packages/send-reminders/lib/send-reminders-utils.ts82export async function updateDraftReminderMetadata(
LOW…s/send-reminders/lib/send-reminders-toolbar-button.tsx13export default function SendRemindersToolbarButton(props: { items: Thread[] }) {
LOW…-reminders/lib/send-reminders-thread-list-extension.ts7export function cssClassNamesForThreadListItem(thread: Thread) {
LOW…-reminders/lib/send-reminders-thread-list-extension.ts15export function cssClassNamesForThreadListIcon(thread: Thread) {
LOW…r-signature/specs/signature-composer-dropdown-spec.tsx22describe('SignatureComposerDropdown', function signatureComposerDropdown() {
LOW…r-signature/specs/signature-composer-extension-spec.ts14describe('SignatureComposerExtension', function signatureComposerExtension() {
LOW…internal_packages/composer-signature/lib/templates.tsx68function widthAndHeightForPhotoURL(
LOWapp/internal_packages/thread-snooze/lib/snooze-utils.ts58export async function markUnreadOrResurfaceThreads(threads: Thread[], source: string) {
LOW…l_packages/main-calendar/lib/core/calendar-helpers.tsx19export function invalidateThemeTextColorCache() {
LOW…l_packages/main-calendar/lib/core/calendar-helpers.tsx319export function showNoEditableCalendarsError(): void {
LOW…ages/main-calendar/lib/core/calendar-event-popover.tsx728function extractNotesFromDescription(description: string) {
LOW…packages/main-calendar/lib/core/calendar-drag-utils.ts82export function parseEventIdFromOccurrence(occurrenceId: string): string {
LOW…ages/main-calendar/lib/core/recurring-event-actions.ts111export function createOccurrenceException(options: EventTimeChangeOptions): void {
LOW…ages/main-calendar/lib/core/recurring-event-actions.ts199export async function modifyEventWithRecurringSupport(
LOW…racking/specs/open-tracking-composer-extension-spec.ts25xdescribe('Open tracking composer extension', function openTrackingComposerExtension() {
LOW…n-tracking/specs/open-tracking-message-status-spec.tsx22describe('Open tracking message status', function openTrackingMessageStatus() {
LOW…l_packages/list-unsubscribe/lib/unsubscribe-service.ts30export function parseListUnsubscribeHeader(header: string): UnsubscribeOption[] {
LOW…l_packages/list-unsubscribe/lib/unsubscribe-service.ts82export async function performOneClickUnsubscribe(url: string): Promise<UnsubscribeResult> {
LOW…notifications/specs/disabled-mail-rules-notif-spec.tsx6describe('DisabledMailRulesNotification', function DisabledMailRulesNotifTests() {
LOW…internal_packages/onboarding/lib/onboarding-helpers.ts83export async function expandAccountWithCommonSettings(account: Account) {
LOW…internal_packages/onboarding/lib/onboarding-helpers.ts215export async function buildGmailAccountFromAuthResponse(code: string) {
LOW…internal_packages/onboarding/lib/onboarding-helpers.ts263export async function buildOutlookAccountFromAuthResponse(code: string) {
LOW…internal_packages/onboarding/lib/onboarding-helpers.ts267export async function buildMicrosoftAccountFromAuthResponse(
LOW…internal_packages/onboarding/lib/onboarding-helpers.ts342export async function finalizeAndValidateAccount(account: Account) {
LOWapp/src/ics-event-helpers.ts206function removeExistingExceptionVevent(
LOWapp/src/ics-event-helpers.ts533export function createRecurrenceException(
LOWapp/src/ics-event-helpers.ts762export function updateRecurringEventTimes(
LOWapp/src/canvas-utils.ts131export function canvasWithSystemTrayIconAndText(img, text) {
LOWapp/src/mail-rules-templates.ts121export function ConditionTemplatesForAccount(account): Template[] {
LOWapp/src/mail-rules-templates.ts125export function ActionTemplatesForAccount(account): Template[] {
LOWapp/src/dnd-utils-linux.ts34async function queryFreedesktopInhibited(): Promise<boolean | null> {
LOWapp/src/promise-extensions.ts12function thatLooksLikeAPromiseToMe(o) {
LOWapp/src/flux/stores/draft-editing-session.ts42function convertToShapeWithoutContent(value: Value) {
LOWapp/src/flux/stores/database-store.ts37function handleUnrecoverableDatabaseError(
LOWapp/src/browser/notification-ipc.ts237export function registerNotificationIPCHandlers(ipcMain: IpcMain) {
LOWapp/src/browser/notification-ipc.ts242export function handleWindowsToastXMLProtocolAction(parts: UrlWithParsedQuery) {
LOWapp/src/browser/quickpreview-ipc.ts131export function registerQuickpreviewIPCHandlers(ipcMain: IpcMain) {
LOW…/src/components/composer-editor/base-block-plugins.tsx41function toggleBlockTypeWithBreakout(editor: Editor, type: string) {
LOWapp/src/components/composer-editor/conversion.tsx462export function convertToShapeWithoutContent(value: Value) {
LOW…onents/composer-editor/toolbar-component-factories.tsx70export function expandSelectionToRangeOfMark(editor: Editor, type: string) {
LOW…onents/composer-editor/toolbar-component-factories.tsx136export function BuildMarkButtonWithValuePicker(config) {
LOW…c/components/composer-editor/grammar-check-plugins.tsx59export function clearAllGrammarDecorations() {
LOW…c/components/composer-editor/grammar-check-plugins.tsx100export function requestInitialCheckForDraft(draftId: string) {
LOW…c/components/composer-editor/grammar-check-plugins.tsx123function underlineColorForCategory(category: string): string {
LOW…c/components/composer-editor/grammar-check-plugins.tsx416function FloatingCorrectionPopover({ editor, value }: ComposerEditorPluginTopLevelComponentProps) {
LOWapp/src/components/composer-editor/plaintext.ts24export function wrapPlaintextWithSelection(
LOWapp/src/quickpreview/index.ts201export function canPossiblyPreviewExtension(file: File) {
LOWapp/src/quickpreview/index.ts208export function displayQuickPreviewWindow(filePath: string) {
LOWapp/src/services/unwrapped-signature-detector.ts28export default function unwrappedSignatureDetector(doc, quoteElements) {
19 more matches not shown…
Over-Commented Block65 hits · 65 pts
SeverityFileLineSnippet
LOWapp/spec/ics-event-helpers-spec.ts341 });
LOWapp/keymaps/README.m1# This is the core set of universal, cross-platform keymaps. This is
LOW…ternal_packages/thread-list/specs/thread-list-spec.tsx1// const moment = require('moment');
LOW…ternal_packages/thread-list/specs/thread-list-spec.tsx21
LOW…ternal_packages/thread-list/specs/thread-list-spec.tsx41// updated_at: null,
LOW…ternal_packages/thread-list/specs/thread-list-spec.tsx61// },
LOW…ternal_packages/thread-list/specs/thread-list-spec.tsx81// object: 'thread',
LOW…ternal_packages/thread-list/specs/thread-list-spec.tsx101// id: 'unseen',
LOW…ternal_packages/thread-list/specs/thread-list-spec.tsx121// created_at: null,
LOW…ternal_packages/thread-list/specs/thread-list-spec.tsx141// updated_at: null,
LOW…ternal_packages/thread-list/specs/thread-list-spec.tsx161// name: 'User One',
LOW…ternal_packages/thread-list/specs/thread-list-spec.tsx181
LOW…ternal_packages/thread-list/specs/thread-list-spec.tsx201// const c3 = new ListTabular.Column({
LOW…ternal_packages/thread-list/specs/thread-list-spec.tsx221// });
LOW…ternal_packages/thread-list/specs/thread-list-spec.tsx241// describe('when the workspace is in list mode', function() {
LOW…ternal_packages/thread-list/specs/thread-list-spec.tsx261// });
LOW…ternal_packages/thread-list/specs/thread-list-spec.tsx281// const view = {
LOW…ternal_packages/thread-list/specs/thread-list-spec.tsx301// advanceClock(100);
LOWapp/internal_packages/ui-darkside/README.md21@accent: #F18260;
LOW…internal_packages/ui-darkside/styles/ui-variables.less1// All themes need a file called `ui-variables` that extends from the base
LOWapp/internal_packages/ui-less-is-more/styles/index.less1//====================================================
LOW…kages/message-list/specs/message-participants-spec.tsx121// expect(p1._isToEveryone()).toBe true
LOWapp/internal_packages/onboarding/lib/page-tutorial.tsx41 xDot: 10,
LOWapp/static/style/base/ui-variables.less1// Color abstraction hierarchy:
LOWapp/src/regexp-utils.ts1import _ from 'underscore';
LOWapp/src/regexp-utils.ts201 // Test cases: https://regex101.com/r/cK0zD8/4
LOWapp/src/secondary-window-bootstrap.ts1/* eslint import/first: 0 */
LOWapp/src/app-env.ts561 // * `width` The window's width {Number}.
LOWapp/src/mailbox-perspective.ts181 // Public:
LOWapp/src/mailbox-perspective.ts521
LOWapp/src/config.ts21} else {
LOWapp/src/config.ts41// You may want to watch for changes. Use {::observe} to catch changes to the setting.
LOWapp/src/config.ts61// allows integers greater than `0`:
LOWapp/src/config.ts81// module.exports =
LOWapp/src/config.ts101// enableThing:
LOWapp/src/config.ts121//
LOWapp/src/config.ts141//
LOWapp/src/config.ts161//
LOWapp/src/config.ts181// minimum: 1.5
LOWapp/src/config.ts201//
LOWapp/src/config.ts221// type: 'object'
LOWapp/src/config.ts241// default: 4
LOWapp/src/config.ts261//
LOWapp/src/config.ts361 }
LOWapp/src/config.ts381 // * `keyPath` {String} name of the key to observe
LOWapp/src/config.ts421 //
LOWapp/src/config.ts441 //
LOWapp/src/menu-manager.ts21 AppEnv.commands.onRegistedCommandsChanged(() => this.update());
LOWapp/src/types/jasmine-global.d.ts1// Global type declarations for the vendored Jasmine 1.x instance.
LOWapp/src/registries/component-registry.ts41 // * `options` {Object}:
LOWapp/src/flux/tasks/change-folder-task.ts1import { ChangeMailTask } from './change-mail-task';
LOWapp/src/flux/tasks/task.ts81 // in flight.
LOWapp/src/flux/stores/database-store.ts421 // predicates provided.
LOWapp/src/flux/stores/database-store.ts441 // returned model must match.
LOWapp/src/flux/stores/contact-store.ts21 return [];
LOWapp/src/flux/models/utils.ts101 for (let i = left; ascending ? i < end : i > end; ascending ? i++ : i--) {
LOWapp/src/extensions/composer-extension.ts61 // You must return an object that contains the following properties:
LOWapp/src/browser/windows-updater.js241 }
LOWapp/src/browser/mailspring-protocol-handler.ts1import { protocol } from 'electron';
LOWapp/src/browser/window-launcher.ts121 }
5 more matches not shown…
Decorative Section Separators17 hits · 51 pts
SeverityFileLineSnippet
MEDIUMplaywright/helpers.ts17// ─── Config & Launch ───────────────────────────────────────────────────────
MEDIUMplaywright/helpers.ts200// ─── Thread List Helpers ───────────────────────────────────────────────────
MEDIUMplaywright/helpers.ts231// ─── Sidebar Helpers ───────────────────────────────────────────────────────
MEDIUMplaywright/helpers.ts238// ─── Task Capture Helpers ─────────────────────────────────────────────
MEDIUMplaywright/helpers.ts334// ─── Native Menu Intercept ────────────────────────────────────────────
MEDIUMplaywright/helpers.ts406// ─── Search Helpers ───────────────────────────────────────────────────
MEDIUMplaywright/helpers.ts419// ─── Composer Helpers ──────────────────────────────────────────────────────
MEDIUMplaywright/helpers.ts459// ─��─ SQLite Database Helpers ───────────────────────────────────────────────
MEDIUMplaywright/tests/visual-snapshots.spec.ts23// ─── Visual regression snapshots ────────────────────────────────────────────
MEDIUMplaywright/tests/folder-management.spec.ts26// ─── Helpers ──────────────────────────────────────────────────────────────
MEDIUMplaywright/tests/folder-management.spec.ts40// ─── Folder section visibility ────────────────────────────────────────────
MEDIUMplaywright/tests/folder-management.spec.ts52// ─── Folder hierarchy ─────────────────────────────────────────────────────
MEDIUMplaywright/tests/folder-management.spec.ts69// ─── Create folder via + button ───────────────────────────────────────────
MEDIUMplaywright/tests/folder-management.spec.ts97// ─── Rename folder via double-click ───────────────────────────────────────
MEDIUMplaywright/tests/folder-management.spec.ts139// ─── Context menu: rename via right-click ─────────────────────────────────
MEDIUMplaywright/tests/folder-management.spec.ts162// ─── Context menu: create subfolder ───────────────────────────────────────
MEDIUMplaywright/tests/folder-management.spec.ts197// ─── Context menu: delete folder ──────────────────────────────────────────
Excessive Try-Catch Wrapping14 hits · 16 pts
SeverityFileLineSnippet
LOWplans/caldav-provider-quirks/06-mkcalendar.md172 except Exception as e:
LOWplans/caldav-provider-quirks/06-mkcalendar.md269 except Exception as e:
LOWplans/caldav-provider-quirks/06-mkcalendar.md361 except Exception as e:
LOWplans/caldav-provider-quirks/06-mkcalendar.md385 except Exception:
LOWplans/caldav-provider-quirks/06-mkcalendar.md481 except Exception as e:
LOWplans/caldav-provider-quirks/06-mkcalendar.md518 except Exception as e:
LOWplans/caldav-provider-quirks/06-mkcalendar.md535 except Exception as e:
LOWplans/caldav-provider-quirks/06-mkcalendar.md542 except Exception as e:
LOWplans/caldav-provider-quirks/10-http-protocol-issues.md632 except Exception as e:
MEDIUMplans/caldav-provider-quirks/10-http-protocol-issues.md617def make_request_with_multiplexing_fallback(url, method, **kwargs):
LOW…s/caldav-provider-quirks/01-search-without-comptype.md299 except Exception:
LOW…s/caldav-provider-quirks/09-object-loading-recovery.md448except Exception as e:
LOW…s/caldav-provider-quirks/09-object-loading-recovery.md455except Exception as e:
LOWplans/caldav-provider-quirks/03-sync-tokens.md628 except Exception as e:
Fake / Example Data13 hits · 14 pts
SeverityFileLineSnippet
LOW…p/internal_packages/contacts/specs/vcf-helpers-spec.ts243 expect(result.streetAddress).toBe('123 Main St');
LOW…p/internal_packages/contacts/specs/vcf-helpers-spec.ts265 expect(result.formattedValue).toContain('123 Main St');
LOW…p/internal_packages/contacts/specs/vcf-helpers-spec.ts292 streetAddress: '123 Main St',
LOW…p/internal_packages/contacts/specs/vcf-helpers-spec.ts441 streetAddress: '123 Main St',
LOW…p/internal_packages/contacts/specs/vcf-helpers-spec.ts451 expect(result).toContain('123 Main St');
LOW…l_packages/thread-search/specs/search-bar-util-spec.ts63 expect(wrapInQuotes('John Doe')).toBe('"John Doe"');
LOW…l_packages/thread-search/specs/search-bar-util-spec.ts142 while ((next = regexp.exec('from:"John Doe"'))) {
LOW…l_packages/thread-search/specs/search-bar-util-spec.ts231 const query = 'from:"John Doe"';
LOWapp/src/calendar-utils.ts76 // Some calendar systems just use "user@example.com" directly
LOWdocs/EVENT-RSVP-TASK-SPECIFICATION.md301ORGANIZER;CN="John Doe":mailto:organizer@example.com
LOWplaywright/tests/preferences-data.spec.ts57 await nameField.type('Jane Doe');
LOWplaywright/tests/preferences-data.spec.ts71 expect(testSig.data.name).toBe('Jane Doe');
LOWplaywright/tests/compose.spec.ts716 await composerPage!.keyboard.type('Acme Corp');
Cross-Language Confusion (JS/TS)1 hit · 5 pts
SeverityFileLineSnippet
HIGHapp/src/flux/stores/undo-redo-store.ts93 print(): void {