Showing preview only (8,774K chars total). Download the full file or copy to clipboard to get everything.
Repository: nylas/nylas-mail
Branch: master
Commit: e16cb1982e94
Files: 1760
Total size: 8.0 MB
Directory structure:
gitextract_fft17z4s/
├── .babelrc
├── .coffeelint.json
├── .dockerignore
├── .ebextensions/
│ └── enable_docker_cli_on_ssh.config
├── .ebignore
├── .eslintrc
├── .gitignore
├── .travis.yml
├── Dockerfile
├── ISSUE_TEMPLATE.md
├── LICENSE.md
├── README.md
├── appveyor.yml
├── lerna.json
├── package.json
├── packages/
│ ├── README.md
│ ├── client-app/
│ │ ├── .babelrc
│ │ ├── .travis.yml
│ │ ├── .watchmanconfig
│ │ ├── CHANGELOG.md
│ │ ├── CONFIGURATION.md
│ │ ├── CONTRIBUTING.md
│ │ ├── LICENSE.md
│ │ ├── README.md
│ │ ├── apm/
│ │ │ ├── README.md
│ │ │ └── package.json
│ │ ├── build/
│ │ │ ├── Gruntfile.js
│ │ │ ├── README.md
│ │ │ ├── config/
│ │ │ │ └── coffeelint.json
│ │ │ ├── docs_templates/
│ │ │ │ ├── _function.html
│ │ │ │ ├── _property.html
│ │ │ │ ├── class.md
│ │ │ │ └── sidebar.md
│ │ │ ├── resources/
│ │ │ │ ├── asar-ordering-hint.txt
│ │ │ │ ├── linux/
│ │ │ │ │ ├── debian/
│ │ │ │ │ │ ├── control.in
│ │ │ │ │ │ ├── lintian-overrides
│ │ │ │ │ │ ├── postinst
│ │ │ │ │ │ └── postrm
│ │ │ │ │ ├── nylas-mail.desktop.in
│ │ │ │ │ └── redhat/
│ │ │ │ │ └── nylas.spec.in
│ │ │ │ ├── mac/
│ │ │ │ │ ├── Nylas Calendar.app/
│ │ │ │ │ │ └── Contents/
│ │ │ │ │ │ ├── Info.plist
│ │ │ │ │ │ ├── MacOS/
│ │ │ │ │ │ │ └── Nylas Calendar
│ │ │ │ │ │ ├── PkgInfo
│ │ │ │ │ │ ├── Resources/
│ │ │ │ │ │ │ ├── AppIcon.icns
│ │ │ │ │ │ │ └── Base.lproj/
│ │ │ │ │ │ │ └── MainMenu.nib
│ │ │ │ │ │ └── _CodeSignature/
│ │ │ │ │ │ └── CodeResources
│ │ │ │ │ ├── file.icns
│ │ │ │ │ ├── nylas-Info.plist
│ │ │ │ │ └── nylas.icns
│ │ │ │ ├── ssh/
│ │ │ │ │ ├── nylas-n1-ci-ssh-secure-file.enc
│ │ │ │ │ └── nylas-n1-ci-ssh.openssl.enc
│ │ │ │ └── win/
│ │ │ │ ├── elevate.cmd
│ │ │ │ ├── elevate.vbs
│ │ │ │ ├── nylas-mailto-default.reg
│ │ │ │ └── nylas-mailto-registration.reg
│ │ │ └── tasks/
│ │ │ ├── coffeelint-task.js
│ │ │ ├── create-mac-dmg.js
│ │ │ ├── create-mac-zip.js
│ │ │ ├── csslint-task.js
│ │ │ ├── docs-build-task.js
│ │ │ ├── docs-render-task.js
│ │ │ ├── docs-task.js
│ │ │ ├── eslint-task.js
│ │ │ ├── installer-linux-task.js
│ │ │ ├── lesslint-task.js
│ │ │ ├── nylaslint-task.js
│ │ │ ├── package-task.js
│ │ │ └── task-helpers.js
│ │ ├── docs/
│ │ │ ├── ContinuousIntegration.md
│ │ │ └── README.md
│ │ ├── dot-nylas/
│ │ │ ├── README.md
│ │ │ ├── config.json
│ │ │ ├── keymap.json
│ │ │ └── packages/
│ │ │ └── README.md
│ │ ├── internal_packages/
│ │ │ ├── account-sidebar/
│ │ │ │ ├── README.md
│ │ │ │ ├── lib/
│ │ │ │ │ ├── account-commands.coffee
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── account-sidebar.cjsx
│ │ │ │ │ │ └── account-switcher.cjsx
│ │ │ │ │ ├── main.coffee
│ │ │ │ │ ├── sidebar-actions.coffee
│ │ │ │ │ ├── sidebar-item.coffee
│ │ │ │ │ ├── sidebar-section.coffee
│ │ │ │ │ └── sidebar-store.coffee
│ │ │ │ ├── package.json
│ │ │ │ ├── spec/
│ │ │ │ │ └── sidebar-item-spec.es6
│ │ │ │ └── stylesheets/
│ │ │ │ └── account-sidebar.less
│ │ │ ├── activity-list/
│ │ │ │ ├── lib/
│ │ │ │ │ ├── activity-data-source.es6
│ │ │ │ │ ├── activity-list-actions.es6
│ │ │ │ │ ├── activity-list-button.jsx
│ │ │ │ │ ├── activity-list-empty-state.jsx
│ │ │ │ │ ├── activity-list-item-container.jsx
│ │ │ │ │ ├── activity-list-store.jsx
│ │ │ │ │ ├── activity-list.jsx
│ │ │ │ │ ├── main.es6
│ │ │ │ │ ├── plugin-helpers.es6
│ │ │ │ │ └── test-data-source.es6
│ │ │ │ ├── package.json
│ │ │ │ ├── spec/
│ │ │ │ │ └── activity-list-spec.jsx
│ │ │ │ └── stylesheets/
│ │ │ │ └── activity-list.less
│ │ │ ├── attachments/
│ │ │ │ ├── lib/
│ │ │ │ │ ├── main.es6
│ │ │ │ │ └── message-attachments.jsx
│ │ │ │ └── package.json
│ │ │ ├── category-mapper/
│ │ │ │ ├── lib/
│ │ │ │ │ ├── category-selection.jsx
│ │ │ │ │ ├── main.es6
│ │ │ │ │ └── preferences-category-mapper.jsx
│ │ │ │ ├── package.json
│ │ │ │ └── stylesheets/
│ │ │ │ └── category-mapper.less
│ │ │ ├── category-picker/
│ │ │ │ ├── lib/
│ │ │ │ │ ├── category-picker-popover.jsx
│ │ │ │ │ ├── category-picker.cjsx
│ │ │ │ │ └── main.cjsx
│ │ │ │ ├── package.json
│ │ │ │ ├── spec/
│ │ │ │ │ └── category-picker-spec.cjsx
│ │ │ │ └── stylesheets/
│ │ │ │ └── category-picker.less
│ │ │ ├── composer/
│ │ │ │ ├── README.md
│ │ │ │ ├── keymaps/
│ │ │ │ │ └── composer.json
│ │ │ │ ├── lib/
│ │ │ │ │ ├── account-contact-field.jsx
│ │ │ │ │ ├── action-bar-plugins.jsx
│ │ │ │ │ ├── collapsed-participants.jsx
│ │ │ │ │ ├── compose-button.jsx
│ │ │ │ │ ├── composer-editor.jsx
│ │ │ │ │ ├── composer-header-actions.jsx
│ │ │ │ │ ├── composer-header.jsx
│ │ │ │ │ ├── composer-view.jsx
│ │ │ │ │ ├── fields.es6
│ │ │ │ │ ├── image-upload-composer-extension.es6
│ │ │ │ │ ├── inline-image-upload-container.jsx
│ │ │ │ │ ├── main.jsx
│ │ │ │ │ ├── send-action-button.jsx
│ │ │ │ │ └── subject-text-field.jsx
│ │ │ │ ├── package.json
│ │ │ │ ├── spec/
│ │ │ │ │ ├── collapsed-participants-spec.cjsx
│ │ │ │ │ ├── composer-header-actions-spec.cjsx
│ │ │ │ │ ├── composer-header-spec.jsx
│ │ │ │ │ ├── composer-view-spec.cjsx
│ │ │ │ │ ├── quoted-text-spec.cjsx
│ │ │ │ │ └── send-action-button-spec.jsx
│ │ │ │ └── stylesheets/
│ │ │ │ └── composer.less
│ │ │ ├── composer-emoji/
│ │ │ │ ├── lib/
│ │ │ │ │ ├── categorized-emoji.es6
│ │ │ │ │ ├── emoji-actions.es6
│ │ │ │ │ ├── emoji-button-popover.jsx
│ │ │ │ │ ├── emoji-button.jsx
│ │ │ │ │ ├── emoji-composer-extension.jsx
│ │ │ │ │ ├── emoji-data.json
│ │ │ │ │ ├── emoji-message-extension.jsx
│ │ │ │ │ ├── emoji-picker.jsx
│ │ │ │ │ ├── emoji-store.jsx
│ │ │ │ │ └── main.es6
│ │ │ │ ├── package.json
│ │ │ │ ├── spec/
│ │ │ │ │ ├── emoji-button-popover-spec.jsx
│ │ │ │ │ └── emoji-composer-extension-spec.jsx
│ │ │ │ └── stylesheets/
│ │ │ │ └── composer-emoji.less
│ │ │ ├── composer-mail-merge/
│ │ │ │ ├── lib/
│ │ │ │ │ ├── listens-to-mail-merge-session.jsx
│ │ │ │ │ ├── mail-merge-body-token.jsx
│ │ │ │ │ ├── mail-merge-button.jsx
│ │ │ │ │ ├── mail-merge-composer-extension.es6
│ │ │ │ │ ├── mail-merge-constants.es6
│ │ │ │ │ ├── mail-merge-container.jsx
│ │ │ │ │ ├── mail-merge-draft-editing-session.es6
│ │ │ │ │ ├── mail-merge-header-input.jsx
│ │ │ │ │ ├── mail-merge-participants-text-field.jsx
│ │ │ │ │ ├── mail-merge-send-button.jsx
│ │ │ │ │ ├── mail-merge-subject-text-field.jsx
│ │ │ │ │ ├── mail-merge-table.jsx
│ │ │ │ │ ├── mail-merge-token-dnd-handlers.es6
│ │ │ │ │ ├── mail-merge-token.jsx
│ │ │ │ │ ├── mail-merge-utils.es6
│ │ │ │ │ ├── mail-merge-workspace.jsx
│ │ │ │ │ ├── main.es6
│ │ │ │ │ ├── selection-state-reducers.es6
│ │ │ │ │ ├── send-many-drafts-task.es6
│ │ │ │ │ ├── table-state-reducers.es6
│ │ │ │ │ ├── token-data-source.es6
│ │ │ │ │ ├── token-state-reducers.es6
│ │ │ │ │ └── workspace-state-reducers.es6
│ │ │ │ ├── package.json
│ │ │ │ ├── spec/
│ │ │ │ │ ├── fixtures.es6
│ │ │ │ │ ├── mail-merge-draft-editing-session-spec.es6
│ │ │ │ │ ├── mail-merge-utils-spec.es6
│ │ │ │ │ ├── selection-state-reducers-spec.es6
│ │ │ │ │ ├── send-many-drafts-task-spec.es6
│ │ │ │ │ ├── table-state-reducers-spec.es6
│ │ │ │ │ ├── token-state-reducers-spec.es6
│ │ │ │ │ └── workspace-state-reducers-spec.es6
│ │ │ │ └── stylesheets/
│ │ │ │ └── mail-merge.less
│ │ │ ├── composer-markdown/
│ │ │ │ ├── README.md
│ │ │ │ ├── lib/
│ │ │ │ │ ├── main.cjsx
│ │ │ │ │ ├── markdown-composer-extension.coffee
│ │ │ │ │ ├── markdown-editor.cjsx
│ │ │ │ │ └── utils.coffee
│ │ │ │ ├── package.json
│ │ │ │ └── stylesheets/
│ │ │ │ └── index.less
│ │ │ ├── composer-scheduler/
│ │ │ │ ├── README.md
│ │ │ │ ├── lib/
│ │ │ │ │ ├── calendar/
│ │ │ │ │ │ ├── proposed-time-calendar-data-source.es6
│ │ │ │ │ │ ├── proposed-time-event.jsx
│ │ │ │ │ │ └── proposed-time-picker.jsx
│ │ │ │ │ ├── composer/
│ │ │ │ │ │ ├── email-b64-images.es6
│ │ │ │ │ │ ├── email-images.json
│ │ │ │ │ │ ├── event-datetime-input.jsx
│ │ │ │ │ │ ├── event-prep-helper.es6
│ │ │ │ │ │ ├── new-event-card-container.jsx
│ │ │ │ │ │ ├── new-event-card.jsx
│ │ │ │ │ │ ├── new-event-helper.es6
│ │ │ │ │ │ ├── new-event-preview.jsx
│ │ │ │ │ │ ├── proposed-time-list.jsx
│ │ │ │ │ │ ├── remove-event-helper.es6
│ │ │ │ │ │ ├── scheduler-composer-button.jsx
│ │ │ │ │ │ └── scheduler-composer-extension.es6
│ │ │ │ │ ├── main.es6
│ │ │ │ │ ├── proposal.es6
│ │ │ │ │ ├── proposed-time-calendar-store.es6
│ │ │ │ │ ├── scheduler-actions.es6
│ │ │ │ │ └── scheduler-constants.es6
│ │ │ │ ├── package.json
│ │ │ │ ├── spec/
│ │ │ │ │ ├── composer-scheduler-spec-helper.es6
│ │ │ │ │ ├── new-event-card-spec.jsx
│ │ │ │ │ ├── proposed-time-picker-spec.jsx
│ │ │ │ │ ├── scheduler-composer-button-spec.jsx
│ │ │ │ │ ├── scheduler-composer-extension-spec.es6
│ │ │ │ │ └── test-proposal-data-source.es6
│ │ │ │ └── stylesheets/
│ │ │ │ └── scheduler.less
│ │ │ ├── composer-signature/
│ │ │ │ ├── lib/
│ │ │ │ │ ├── main.es6
│ │ │ │ │ ├── preferences-signatures.jsx
│ │ │ │ │ ├── signature-composer-dropdown.jsx
│ │ │ │ │ ├── signature-composer-extension.es6
│ │ │ │ │ └── signature-utils.es6
│ │ │ │ ├── package.json
│ │ │ │ ├── spec/
│ │ │ │ │ ├── preferences-signatures-spec.jsx
│ │ │ │ │ ├── signature-composer-dropdown-spec.jsx
│ │ │ │ │ ├── signature-composer-extension-spec.es6
│ │ │ │ │ └── signature-store-spec.jsx
│ │ │ │ └── styles/
│ │ │ │ └── composer-signature.less
│ │ │ ├── composer-spellcheck/
│ │ │ │ ├── lib/
│ │ │ │ │ ├── main.es6
│ │ │ │ │ └── spellcheck-composer-extension.es6
│ │ │ │ ├── package.json
│ │ │ │ └── spec/
│ │ │ │ ├── fixtures/
│ │ │ │ │ ├── california-spelling-lookup.json
│ │ │ │ │ ├── california-with-misspellings-after.html
│ │ │ │ │ └── california-with-misspellings-before.html
│ │ │ │ └── spellcheck-composer-extension-spec.es6
│ │ │ ├── composer-templates/
│ │ │ │ ├── README.md
│ │ │ │ ├── assets/
│ │ │ │ │ └── Welcome to Quick Replies.html
│ │ │ │ ├── lib/
│ │ │ │ │ ├── main.es6
│ │ │ │ │ ├── preferences-templates.jsx
│ │ │ │ │ ├── template-composer-extension.es6
│ │ │ │ │ ├── template-editor.es6
│ │ │ │ │ ├── template-picker.jsx
│ │ │ │ │ ├── template-status-bar.jsx
│ │ │ │ │ └── template-store.es6
│ │ │ │ ├── package.json
│ │ │ │ ├── spec/
│ │ │ │ │ └── template-store-spec.es6
│ │ │ │ └── stylesheets/
│ │ │ │ └── message-templates.less
│ │ │ ├── composer-translate/
│ │ │ │ ├── README.md
│ │ │ │ ├── lib/
│ │ │ │ │ └── main.jsx
│ │ │ │ ├── package.json
│ │ │ │ └── stylesheets/
│ │ │ │ └── translate.less
│ │ │ ├── contact-rankings/
│ │ │ │ ├── lib/
│ │ │ │ │ ├── contact-rankings-cache.es6
│ │ │ │ │ ├── main.es6
│ │ │ │ │ └── refreshing-json-cache.coffee
│ │ │ │ └── package.json
│ │ │ ├── draft-list/
│ │ │ │ ├── lib/
│ │ │ │ │ ├── draft-list-columns.cjsx
│ │ │ │ │ ├── draft-list-send-status.jsx
│ │ │ │ │ ├── draft-list-store.coffee
│ │ │ │ │ ├── draft-list-toolbar.jsx
│ │ │ │ │ ├── draft-list.cjsx
│ │ │ │ │ ├── draft-toolbar-buttons.cjsx
│ │ │ │ │ ├── main.es6
│ │ │ │ │ ├── sending-cancel-button.cjsx
│ │ │ │ │ └── sending-progress-bar.cjsx
│ │ │ │ ├── package.json
│ │ │ │ └── stylesheets/
│ │ │ │ └── draft-list.less
│ │ │ ├── events/
│ │ │ │ ├── lib/
│ │ │ │ │ ├── event-header.cjsx
│ │ │ │ │ └── main.cjsx
│ │ │ │ ├── package.json
│ │ │ │ └── stylesheets/
│ │ │ │ └── events.less
│ │ │ ├── github-contact-card/
│ │ │ │ ├── README.md
│ │ │ │ ├── lib/
│ │ │ │ │ ├── github-contact-card-section.jsx
│ │ │ │ │ ├── github-user-store.es6
│ │ │ │ │ └── main.jsx
│ │ │ │ ├── package.json
│ │ │ │ └── stylesheets/
│ │ │ │ └── sidebar-github-profile.less
│ │ │ ├── keybase/
│ │ │ │ ├── README.md
│ │ │ │ ├── lib/
│ │ │ │ │ ├── decrypt-button.cjsx
│ │ │ │ │ ├── decryption-preprocess.coffee
│ │ │ │ │ ├── email-popover.cjsx
│ │ │ │ │ ├── encrypt-button.cjsx
│ │ │ │ │ ├── identity.coffee
│ │ │ │ │ ├── key-adder.cjsx
│ │ │ │ │ ├── key-manager.cjsx
│ │ │ │ │ ├── keybase-search.cjsx
│ │ │ │ │ ├── keybase-user.cjsx
│ │ │ │ │ ├── keybase.coffee
│ │ │ │ │ ├── main.es6
│ │ │ │ │ ├── modal-key-recommender.cjsx
│ │ │ │ │ ├── passphrase-popover.cjsx
│ │ │ │ │ ├── pgp-key-store.cjsx
│ │ │ │ │ ├── preferences-keybase.cjsx
│ │ │ │ │ ├── private-key-popover.cjsx
│ │ │ │ │ └── recipient-key-chip.cjsx
│ │ │ │ ├── package.json
│ │ │ │ ├── spec/
│ │ │ │ │ ├── decrypt-buttons-spec.cjsx
│ │ │ │ │ ├── encrypt-button-spec.cjsx
│ │ │ │ │ ├── keybase-profile-spec.cjsx
│ │ │ │ │ ├── keybase-search-spec.cjsx
│ │ │ │ │ ├── keybase-spec.coffee
│ │ │ │ │ ├── main-spec.coffee
│ │ │ │ │ ├── pgp-key-store-spec.cjsx
│ │ │ │ │ └── recipient-key-chip-spec.cjsx
│ │ │ │ └── stylesheets/
│ │ │ │ └── main.less
│ │ │ ├── link-tracking/
│ │ │ │ ├── README.md
│ │ │ │ ├── lib/
│ │ │ │ │ ├── link-tracking-button.jsx
│ │ │ │ │ ├── link-tracking-composer-extension.es6
│ │ │ │ │ ├── link-tracking-constants.es6
│ │ │ │ │ ├── link-tracking-message-extension.jsx
│ │ │ │ │ ├── link-tracking-message-popover.jsx
│ │ │ │ │ └── main.es6
│ │ │ │ ├── package.json
│ │ │ │ ├── spec/
│ │ │ │ │ └── link-tracking-composer-extension-spec.es6
│ │ │ │ └── stylesheets/
│ │ │ │ └── main.less
│ │ │ ├── main-calendar/
│ │ │ │ ├── README.md
│ │ │ │ ├── lib/
│ │ │ │ │ ├── calendar-wrapper.jsx
│ │ │ │ │ ├── event-description-frame.jsx
│ │ │ │ │ ├── main.jsx
│ │ │ │ │ ├── quick-event-button.jsx
│ │ │ │ │ └── quick-event-popover.jsx
│ │ │ │ ├── package.json
│ │ │ │ └── stylesheets/
│ │ │ │ └── main-calendar.less
│ │ │ ├── message-autoload-images/
│ │ │ │ ├── lib/
│ │ │ │ │ ├── autoload-images-actions.es6
│ │ │ │ │ ├── autoload-images-extension.es6
│ │ │ │ │ ├── autoload-images-header.jsx
│ │ │ │ │ ├── autoload-images-store.es6
│ │ │ │ │ └── main.es6
│ │ │ │ ├── package.json
│ │ │ │ ├── spec/
│ │ │ │ │ ├── autoload-images-extension-spec.es6
│ │ │ │ │ └── fixtures/
│ │ │ │ │ ├── linkedin-in.html
│ │ │ │ │ ├── linkedin-out.html
│ │ │ │ │ ├── marketing-email-in.html
│ │ │ │ │ ├── marketing-email-out.html
│ │ │ │ │ ├── no-image-extensions-in.html
│ │ │ │ │ ├── no-image-extensions-out.html
│ │ │ │ │ ├── table-body-in.html
│ │ │ │ │ └── table-body-out.html
│ │ │ │ └── stylesheets/
│ │ │ │ └── message-autoload-images.less
│ │ │ ├── message-list/
│ │ │ │ ├── lib/
│ │ │ │ │ ├── autolinker.es6
│ │ │ │ │ ├── autoscale-images.es6
│ │ │ │ │ ├── email-frame-styles-store.coffee
│ │ │ │ │ ├── email-frame.jsx
│ │ │ │ │ ├── find-in-thread.jsx
│ │ │ │ │ ├── inline-image-listeners.es6
│ │ │ │ │ ├── main.cjsx
│ │ │ │ │ ├── message-controls.cjsx
│ │ │ │ │ ├── message-item-body.cjsx
│ │ │ │ │ ├── message-item-container.cjsx
│ │ │ │ │ ├── message-item.cjsx
│ │ │ │ │ ├── message-list-hidden-messages-toggle.jsx
│ │ │ │ │ ├── message-list.cjsx
│ │ │ │ │ ├── message-participants.cjsx
│ │ │ │ │ ├── message-timestamp.jsx
│ │ │ │ │ ├── sidebar-participant-picker.jsx
│ │ │ │ │ ├── sidebar-plugin-container.cjsx
│ │ │ │ │ ├── thread-archive-button.cjsx
│ │ │ │ │ ├── thread-star-button.cjsx
│ │ │ │ │ ├── thread-toggle-unread-button.cjsx
│ │ │ │ │ └── thread-trash-button.cjsx
│ │ │ │ ├── package.json
│ │ │ │ ├── spec/
│ │ │ │ │ ├── autolinker-fixtures/
│ │ │ │ │ │ ├── both-email-and-url-in.html
│ │ │ │ │ │ ├── both-email-and-url-out.html
│ │ │ │ │ │ ├── gmail-in.html
│ │ │ │ │ │ ├── gmail-out.html
│ │ │ │ │ │ ├── linkedin-in.html
│ │ │ │ │ │ ├── linkedin-out.html
│ │ │ │ │ │ ├── medium-post-in.html
│ │ │ │ │ │ ├── medium-post-out.html
│ │ │ │ │ │ ├── nylas-url-in.html
│ │ │ │ │ │ ├── nylas-url-out.html
│ │ │ │ │ │ ├── plaintext-in.html
│ │ │ │ │ │ ├── plaintext-out.html
│ │ │ │ │ │ ├── readme-in.html
│ │ │ │ │ │ ├── readme-out.html
│ │ │ │ │ │ ├── strangeemails-in.html
│ │ │ │ │ │ ├── strangeemails-out.html
│ │ │ │ │ │ ├── strangephones-in.html
│ │ │ │ │ │ ├── strangephones-out.html
│ │ │ │ │ │ ├── twitter-in.html
│ │ │ │ │ │ ├── twitter-out.html
│ │ │ │ │ │ ├── url-with-port-in.html
│ │ │ │ │ │ └── url-with-port-out.html
│ │ │ │ │ ├── autolinker-spec.es6
│ │ │ │ │ ├── message-item-body-spec.cjsx
│ │ │ │ │ ├── message-item-container-spec.cjsx
│ │ │ │ │ ├── message-item-spec.cjsx
│ │ │ │ │ ├── message-list-spec.cjsx
│ │ │ │ │ ├── message-participants-spec.cjsx
│ │ │ │ │ └── message-timestamp-spec.cjsx
│ │ │ │ └── stylesheets/
│ │ │ │ ├── find-in-thread.less
│ │ │ │ └── message-list.less
│ │ │ ├── message-view-on-github/
│ │ │ │ ├── README.md
│ │ │ │ ├── keymaps/
│ │ │ │ │ └── github.json
│ │ │ │ ├── lib/
│ │ │ │ │ ├── github-store.es6
│ │ │ │ │ ├── main.jsx
│ │ │ │ │ └── view-on-github-button.jsx
│ │ │ │ ├── package.json
│ │ │ │ └── stylesheets/
│ │ │ │ └── github.less
│ │ │ ├── mode-switch/
│ │ │ │ ├── lib/
│ │ │ │ │ ├── main.es6
│ │ │ │ │ └── mode-toggle.cjsx
│ │ │ │ ├── package.json
│ │ │ │ └── stylesheets/
│ │ │ │ └── mode-switch.less
│ │ │ ├── notifications/
│ │ │ │ ├── lib/
│ │ │ │ │ ├── items/
│ │ │ │ │ │ ├── account-error-notif.jsx
│ │ │ │ │ │ ├── default-client-notif.jsx
│ │ │ │ │ │ ├── dev-mode-notif.jsx
│ │ │ │ │ │ ├── disabled-mail-rules-notif.jsx
│ │ │ │ │ │ └── offline-notification.jsx
│ │ │ │ │ ├── main.es6
│ │ │ │ │ ├── notif-wrapper.jsx
│ │ │ │ │ └── sidebar/
│ │ │ │ │ ├── activity-sidebar.cjsx
│ │ │ │ │ ├── initial-sync-activity.jsx
│ │ │ │ │ ├── sync-activity.jsx
│ │ │ │ │ └── syncback-activity.jsx
│ │ │ │ ├── package.json
│ │ │ │ ├── spec/
│ │ │ │ │ ├── account-error-notif-spec.jsx
│ │ │ │ │ ├── default-client-notif-spec.jsx
│ │ │ │ │ ├── dev-mode-notif-spec.jsx
│ │ │ │ │ ├── disabled-mail-rules-notif-spec.jsx
│ │ │ │ │ └── priority-spec.jsx
│ │ │ │ └── stylesheets/
│ │ │ │ ├── notifications.less
│ │ │ │ └── styles.less
│ │ │ ├── nylas-private-fonts/
│ │ │ │ ├── fonts/
│ │ │ │ │ ├── Nylas-Pro-Blond.otf
│ │ │ │ │ ├── Nylas-Pro-Hair.otf
│ │ │ │ │ ├── Nylas-Pro-Light.otf
│ │ │ │ │ ├── Nylas-Pro-Medium.otf
│ │ │ │ │ ├── Nylas-Pro-Normal.otf
│ │ │ │ │ ├── Nylas-Pro-SemiBold.otf
│ │ │ │ │ └── Nylas-Pro-Thin.otf
│ │ │ │ ├── lib/
│ │ │ │ │ └── main.es6
│ │ │ │ ├── package.json
│ │ │ │ └── stylesheets/
│ │ │ │ └── nylas-fonts.less
│ │ │ ├── nylas-private-salesforce/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── README.md
│ │ │ │ ├── keymaps/
│ │ │ │ │ └── salesforce.json
│ │ │ │ ├── lib/
│ │ │ │ │ ├── composer/
│ │ │ │ │ │ ├── contact-search-results.jsx
│ │ │ │ │ │ ├── participant-decorator.jsx
│ │ │ │ │ │ └── salesforce-composer-picker.jsx
│ │ │ │ │ ├── contact/
│ │ │ │ │ │ └── salesforce-contact-info.jsx
│ │ │ │ │ ├── form/
│ │ │ │ │ │ ├── fetch-empty-schema-for-type.es6
│ │ │ │ │ │ ├── form-data-helpers.es6
│ │ │ │ │ │ ├── generated-form-to-salesforce-adapter.es6
│ │ │ │ │ │ ├── pending-salesforce-object.es6
│ │ │ │ │ │ ├── remove-controls.jsx
│ │ │ │ │ │ ├── salesforce-object-form.jsx
│ │ │ │ │ │ ├── salesforce-object-picker.jsx
│ │ │ │ │ │ ├── salesforce-schema-adapter.es6
│ │ │ │ │ │ ├── salesforce-window-launcher.es6
│ │ │ │ │ │ └── smart-fields.es6
│ │ │ │ │ ├── main.jsx
│ │ │ │ │ ├── metadata-helpers.es6
│ │ │ │ │ ├── models/
│ │ │ │ │ │ ├── salesforce-object.es6
│ │ │ │ │ │ └── salesforce-schema.es6
│ │ │ │ │ ├── related-object-helpers.es6
│ │ │ │ │ ├── salesforce-actions.es6
│ │ │ │ │ ├── salesforce-api-error.es6
│ │ │ │ │ ├── salesforce-api.jsx
│ │ │ │ │ ├── salesforce-constants.es6
│ │ │ │ │ ├── salesforce-contact-crawler.es6
│ │ │ │ │ ├── salesforce-data-reset.es6
│ │ │ │ │ ├── salesforce-env.es6
│ │ │ │ │ ├── salesforce-error-reporter.es6
│ │ │ │ │ ├── salesforce-intro-notification.jsx
│ │ │ │ │ ├── salesforce-metadata-cleanup-listener.es6
│ │ │ │ │ ├── salesforce-new-mail-listener.es6
│ │ │ │ │ ├── salesforce-oauth.jsx
│ │ │ │ │ ├── salesforce-object-helpers.es6
│ │ │ │ │ ├── salesforce-related-object-cache.es6
│ │ │ │ │ ├── salesforce-sync-worker.es6
│ │ │ │ │ ├── search/
│ │ │ │ │ │ ├── salesforce-search-bar-results.jsx
│ │ │ │ │ │ └── salesforce-search-indexer.es6
│ │ │ │ │ ├── shared-components/
│ │ │ │ │ │ ├── open-in-salesforce-btn.jsx
│ │ │ │ │ │ ├── salesforce-icon.jsx
│ │ │ │ │ │ └── salesforce-login-prompt.jsx
│ │ │ │ │ ├── tasks/
│ │ │ │ │ │ ├── destroy-message-on-salesforce-task.es6
│ │ │ │ │ │ ├── destroy-salesforce-object-task.es6
│ │ │ │ │ │ ├── ensure-message-on-salesforce-task.es6
│ │ │ │ │ │ ├── manually-relate-salesforce-object-task.es6
│ │ │ │ │ │ ├── remove-manual-relation-to-salesforce-object-task.es6
│ │ │ │ │ │ ├── sync-salesforce-objects-task.es6
│ │ │ │ │ │ ├── sync-thread-activity-to-salesforce-task.es6
│ │ │ │ │ │ ├── syncback-salesforce-object-task.es6
│ │ │ │ │ │ └── upsert-opportunity-contact-role-task.es6
│ │ │ │ │ └── thread/
│ │ │ │ │ ├── related-objects-for-thread.jsx
│ │ │ │ │ ├── salesforce-manually-relate-thread-button.jsx
│ │ │ │ │ ├── salesforce-manually-relate-thread-popover.jsx
│ │ │ │ │ ├── salesforce-sync-label.jsx
│ │ │ │ │ ├── salesforce-sync-message-status.jsx
│ │ │ │ │ └── sync-thread-toggle.jsx
│ │ │ │ ├── menus/
│ │ │ │ │ └── salesforce.json
│ │ │ │ ├── package.json
│ │ │ │ ├── spec/
│ │ │ │ │ ├── fixtures/
│ │ │ │ │ │ ├── opportunity-layouts-alt.json
│ │ │ │ │ │ └── opportunity-layouts.json
│ │ │ │ │ ├── form-builder-spec.jsx
│ │ │ │ │ ├── generate-test-data.es6
│ │ │ │ │ ├── salesforce-schema-adapter-spec.es6
│ │ │ │ │ └── syncback-salesforce-object-task-spec.es6
│ │ │ │ └── stylesheets/
│ │ │ │ ├── open-in-salesforce-btn.less
│ │ │ │ ├── salesforce-association.less
│ │ │ │ ├── salesforce-composer.less
│ │ │ │ ├── salesforce-contact.less
│ │ │ │ ├── salesforce-icon.less
│ │ │ │ ├── salesforce-object-form.less
│ │ │ │ ├── salesforce-object-picker.less
│ │ │ │ ├── salesforce-picker.less
│ │ │ │ ├── salesforce-related-object.less
│ │ │ │ ├── salesforce-sync-label.less
│ │ │ │ ├── salesforce-sync-message-status.less
│ │ │ │ ├── salesforce-welcome-view.less
│ │ │ │ ├── search-results.less
│ │ │ │ └── sync-thread-toggle.less
│ │ │ ├── nylas-private-sounds/
│ │ │ │ ├── NYLAS_UI_Confirm_v1.ogg
│ │ │ │ ├── NYLAS_UI_HitSend_v1.ogg
│ │ │ │ ├── NYLAS_UI_NewMail_v1.ogg
│ │ │ │ ├── NYLAS_UI_Send_v1.ogg
│ │ │ │ ├── lib/
│ │ │ │ │ └── main.es6
│ │ │ │ └── package.json
│ │ │ ├── onboarding/
│ │ │ │ ├── lib/
│ │ │ │ │ ├── account-types.es6
│ │ │ │ │ ├── decorators/
│ │ │ │ │ │ └── create-page-for-form.jsx
│ │ │ │ │ ├── form-error-message.jsx
│ │ │ │ │ ├── form-field.jsx
│ │ │ │ │ ├── main.es6
│ │ │ │ │ ├── onboarding-actions.es6
│ │ │ │ │ ├── onboarding-helpers.es6
│ │ │ │ │ ├── onboarding-root.jsx
│ │ │ │ │ ├── onboarding-store.es6
│ │ │ │ │ ├── page-account-choose.jsx
│ │ │ │ │ ├── page-account-onboarding-success.jsx
│ │ │ │ │ ├── page-account-settings-exchange.jsx
│ │ │ │ │ ├── page-account-settings-gmail.jsx
│ │ │ │ │ ├── page-account-settings-imap.jsx
│ │ │ │ │ ├── page-account-settings.jsx
│ │ │ │ │ ├── page-initial-preferences.cjsx
│ │ │ │ │ ├── page-top-bar.jsx
│ │ │ │ │ └── page-welcome.jsx
│ │ │ │ ├── package.json
│ │ │ │ └── stylesheets/
│ │ │ │ ├── onboarding-reset.less
│ │ │ │ └── onboarding.less
│ │ │ ├── open-tracking/
│ │ │ │ ├── README.md
│ │ │ │ ├── lib/
│ │ │ │ │ ├── main.es6
│ │ │ │ │ ├── open-tracking-button.jsx
│ │ │ │ │ ├── open-tracking-composer-extension.es6
│ │ │ │ │ ├── open-tracking-constants.es6
│ │ │ │ │ ├── open-tracking-icon.jsx
│ │ │ │ │ ├── open-tracking-message-popover.jsx
│ │ │ │ │ └── open-tracking-message-status.jsx
│ │ │ │ ├── package.json
│ │ │ │ ├── spec/
│ │ │ │ │ ├── open-tracking-composer-extension-spec.es6
│ │ │ │ │ ├── open-tracking-icon-spec.jsx
│ │ │ │ │ └── open-tracking-message-status-spec.jsx
│ │ │ │ └── stylesheets/
│ │ │ │ └── main.less
│ │ │ ├── participant-profile/
│ │ │ │ ├── lib/
│ │ │ │ │ ├── clearbit-data-source.coffee
│ │ │ │ │ ├── main.es6
│ │ │ │ │ ├── participant-profile-store.es6
│ │ │ │ │ ├── sidebar-participant-profile.jsx
│ │ │ │ │ └── sidebar-related-threads.jsx
│ │ │ │ ├── package.json
│ │ │ │ └── stylesheets/
│ │ │ │ └── participant-profile.less
│ │ │ ├── personal-level-indicators/
│ │ │ │ ├── README.md
│ │ │ │ ├── docs/
│ │ │ │ │ ├── docco.css
│ │ │ │ │ ├── personal-level-icon.html
│ │ │ │ │ └── public/
│ │ │ │ │ └── stylesheets/
│ │ │ │ │ └── normalize.css
│ │ │ │ ├── lib/
│ │ │ │ │ ├── main.es6
│ │ │ │ │ └── personal-level-icon.jsx
│ │ │ │ ├── package.json
│ │ │ │ └── stylesheets/
│ │ │ │ └── main.less
│ │ │ ├── phishing-detection/
│ │ │ │ ├── README.md
│ │ │ │ ├── docs/
│ │ │ │ │ ├── docco.css
│ │ │ │ │ ├── main.coffee
│ │ │ │ │ ├── main.html
│ │ │ │ │ └── public/
│ │ │ │ │ └── stylesheets/
│ │ │ │ │ └── normalize.css
│ │ │ │ ├── lib/
│ │ │ │ │ └── main.jsx
│ │ │ │ ├── package.json
│ │ │ │ ├── spec/
│ │ │ │ │ └── main-spec.jsx
│ │ │ │ └── stylesheets/
│ │ │ │ ├── index.less
│ │ │ │ └── phishing.less
│ │ │ ├── plugins/
│ │ │ │ ├── lib/
│ │ │ │ │ ├── main.jsx
│ │ │ │ │ ├── package-set.jsx
│ │ │ │ │ ├── package.jsx
│ │ │ │ │ ├── packages-store.jsx
│ │ │ │ │ ├── plugins-actions.jsx
│ │ │ │ │ ├── plugins-tabs-view.jsx
│ │ │ │ │ ├── preferences-plugins.jsx
│ │ │ │ │ ├── tab-explore.jsx
│ │ │ │ │ ├── tab-installed.jsx
│ │ │ │ │ ├── tabs-store.jsx
│ │ │ │ │ └── tabs.jsx
│ │ │ │ ├── package.json
│ │ │ │ └── stylesheets/
│ │ │ │ └── plugins.less
│ │ │ ├── preferences/
│ │ │ │ ├── lib/
│ │ │ │ │ ├── main.jsx
│ │ │ │ │ ├── preferences-root.jsx
│ │ │ │ │ ├── preferences-tabs-bar.jsx
│ │ │ │ │ └── tabs/
│ │ │ │ │ ├── config-schema-item.jsx
│ │ │ │ │ ├── keymaps/
│ │ │ │ │ │ ├── command-item.jsx
│ │ │ │ │ │ ├── displayed-keybindings.js
│ │ │ │ │ │ └── mousetrap-keybinding-helpers.js
│ │ │ │ │ ├── preferences-account-details.jsx
│ │ │ │ │ ├── preferences-account-list.jsx
│ │ │ │ │ ├── preferences-accounts.jsx
│ │ │ │ │ ├── preferences-appearance.jsx
│ │ │ │ │ ├── preferences-general.jsx
│ │ │ │ │ ├── preferences-keymaps.jsx
│ │ │ │ │ ├── preferences-mail-rules.jsx
│ │ │ │ │ ├── sending-section.jsx
│ │ │ │ │ └── workspace-section.jsx
│ │ │ │ ├── package.json
│ │ │ │ ├── spec/
│ │ │ │ │ └── preferences-account-details-spec.jsx
│ │ │ │ └── stylesheets/
│ │ │ │ ├── preferences-accounts.less
│ │ │ │ ├── preferences-identity.less
│ │ │ │ ├── preferences-mail-rules.less
│ │ │ │ └── preferences.less
│ │ │ ├── print/
│ │ │ │ ├── lib/
│ │ │ │ │ ├── main.es6
│ │ │ │ │ ├── print-window.es6
│ │ │ │ │ └── printer.es6
│ │ │ │ ├── package.json
│ │ │ │ └── static/
│ │ │ │ ├── print-styles.css
│ │ │ │ └── print.js
│ │ │ ├── remove-tracking-pixels/
│ │ │ │ ├── lib/
│ │ │ │ │ └── main.es6
│ │ │ │ ├── package.json
│ │ │ │ └── spec/
│ │ │ │ ├── fixtures/
│ │ │ │ │ ├── a-after.txt
│ │ │ │ │ ├── a-before.txt
│ │ │ │ │ ├── b-after.txt
│ │ │ │ │ └── b-before.txt
│ │ │ │ └── tracking-pixels-extension-spec.es6
│ │ │ ├── screenshot-mode/
│ │ │ │ ├── assets/
│ │ │ │ │ ├── BLOKKNeue-Regular.otf
│ │ │ │ │ └── font-override.css
│ │ │ │ ├── lib/
│ │ │ │ │ └── main.coffee
│ │ │ │ └── package.json
│ │ │ ├── search-index/
│ │ │ │ ├── lib/
│ │ │ │ │ ├── contact-search-indexer.es6
│ │ │ │ │ ├── event-search-indexer.es6
│ │ │ │ │ ├── main.es6
│ │ │ │ │ └── thread-search-index-store.es6
│ │ │ │ └── package.json
│ │ │ ├── send-and-archive/
│ │ │ │ ├── lib/
│ │ │ │ │ ├── main.es6
│ │ │ │ │ └── send-and-archive-extension.es6
│ │ │ │ ├── package.json
│ │ │ │ ├── spec/
│ │ │ │ │ └── send-and-archive-spec.coffee
│ │ │ │ └── styles/
│ │ │ │ └── send-and-archive.less
│ │ │ ├── send-later/
│ │ │ │ ├── lib/
│ │ │ │ │ ├── main.es6
│ │ │ │ │ ├── send-later-button.jsx
│ │ │ │ │ ├── send-later-constants.es6
│ │ │ │ │ ├── send-later-popover.jsx
│ │ │ │ │ └── send-later-status.jsx
│ │ │ │ ├── package.json
│ │ │ │ ├── spec/
│ │ │ │ │ ├── send-later-button-spec.jsx
│ │ │ │ │ └── send-later-popover-spec.jsx
│ │ │ │ └── stylesheets/
│ │ │ │ ├── send-later-used-modal.less
│ │ │ │ └── send-later.less
│ │ │ ├── send-reminders/
│ │ │ │ ├── lib/
│ │ │ │ │ ├── main.es6
│ │ │ │ │ ├── send-reminders-account-sidebar-extension.es6
│ │ │ │ │ ├── send-reminders-composer-button.jsx
│ │ │ │ │ ├── send-reminders-constants.es6
│ │ │ │ │ ├── send-reminders-headers.jsx
│ │ │ │ │ ├── send-reminders-mailbox-perspective.es6
│ │ │ │ │ ├── send-reminders-popover-button.jsx
│ │ │ │ │ ├── send-reminders-popover.jsx
│ │ │ │ │ ├── send-reminders-query-subscription.es6
│ │ │ │ │ ├── send-reminders-store.es6
│ │ │ │ │ ├── send-reminders-thread-list-extension.es6
│ │ │ │ │ ├── send-reminders-thread-timestamp.jsx
│ │ │ │ │ ├── send-reminders-toolbar-button.jsx
│ │ │ │ │ └── send-reminders-utils.jsx
│ │ │ │ ├── package.json
│ │ │ │ └── stylesheets/
│ │ │ │ ├── reminders-used-modal.less
│ │ │ │ └── send-reminders.less
│ │ │ ├── sync-health-checker/
│ │ │ │ ├── lib/
│ │ │ │ │ ├── main.es6
│ │ │ │ │ └── sync-health-checker.es6
│ │ │ │ ├── package.json
│ │ │ │ └── spec/
│ │ │ │ └── sync-health-checker-spec.es6
│ │ │ ├── system-tray/
│ │ │ │ ├── lib/
│ │ │ │ │ ├── main.es6
│ │ │ │ │ └── system-tray-icon-store.es6
│ │ │ │ ├── package.json
│ │ │ │ └── spec/
│ │ │ │ └── system-tray-icon-store-spec.es6
│ │ │ ├── theme-picker/
│ │ │ │ ├── lib/
│ │ │ │ │ ├── main.jsx
│ │ │ │ │ ├── theme-option.jsx
│ │ │ │ │ └── theme-picker.jsx
│ │ │ │ ├── package.json
│ │ │ │ ├── preview-styles/
│ │ │ │ │ └── theme-option.less
│ │ │ │ ├── spec/
│ │ │ │ │ └── theme-picker-spec.jsx
│ │ │ │ └── styles/
│ │ │ │ └── theme-picker.less
│ │ │ ├── thread-list/
│ │ │ │ ├── lib/
│ │ │ │ │ ├── category-removal-target-rulesets.es6
│ │ │ │ │ ├── injects-toolbar-buttons.jsx
│ │ │ │ │ ├── main.es6
│ │ │ │ │ ├── message-list-toolbar.jsx
│ │ │ │ │ ├── selected-items-stack.jsx
│ │ │ │ │ ├── thread-list-columns.cjsx
│ │ │ │ │ ├── thread-list-context-menu.es6
│ │ │ │ │ ├── thread-list-data-source.es6
│ │ │ │ │ ├── thread-list-icon.cjsx
│ │ │ │ │ ├── thread-list-participants.cjsx
│ │ │ │ │ ├── thread-list-quick-actions.cjsx
│ │ │ │ │ ├── thread-list-scroll-tooltip.cjsx
│ │ │ │ │ ├── thread-list-store.coffee
│ │ │ │ │ ├── thread-list-toolbar.jsx
│ │ │ │ │ ├── thread-list.cjsx
│ │ │ │ │ └── thread-toolbar-buttons.jsx
│ │ │ │ ├── package.json
│ │ │ │ ├── spec/
│ │ │ │ │ ├── category-removal-target-rulesets-spec.es6
│ │ │ │ │ ├── thread-list-column-spec.coffee
│ │ │ │ │ ├── thread-list-participants-spec.cjsx
│ │ │ │ │ ├── thread-list-spec.cjsx
│ │ │ │ │ └── thread-toolbar-buttons-spec.cjsx
│ │ │ │ └── stylesheets/
│ │ │ │ ├── selected-items-stack.less
│ │ │ │ └── thread-list.less
│ │ │ ├── thread-search/
│ │ │ │ ├── README.md
│ │ │ │ ├── lib/
│ │ │ │ │ ├── main.es6
│ │ │ │ │ ├── search-actions.es6
│ │ │ │ │ ├── search-mailbox-perspective.es6
│ │ │ │ │ ├── search-query-subscription.es6
│ │ │ │ │ ├── search-store.es6
│ │ │ │ │ └── thread-search-bar.jsx
│ │ │ │ ├── package.json
│ │ │ │ ├── spec/
│ │ │ │ │ └── search-bar-spec.cjsx
│ │ │ │ └── stylesheets/
│ │ │ │ └── thread-search-bar.less
│ │ │ ├── thread-sharing/
│ │ │ │ ├── lib/
│ │ │ │ │ ├── copy-button.jsx
│ │ │ │ │ ├── external-threads.es6
│ │ │ │ │ ├── main.es6
│ │ │ │ │ ├── thread-sharing-button.jsx
│ │ │ │ │ ├── thread-sharing-constants.es6
│ │ │ │ │ └── thread-sharing-popover.jsx
│ │ │ │ ├── package.json
│ │ │ │ └── stylesheets/
│ │ │ │ └── main.less
│ │ │ ├── thread-snooze/
│ │ │ │ ├── README.md
│ │ │ │ ├── lib/
│ │ │ │ │ ├── main.es6
│ │ │ │ │ ├── snooze-actions.es6
│ │ │ │ │ ├── snooze-buttons.jsx
│ │ │ │ │ ├── snooze-constants.es6
│ │ │ │ │ ├── snooze-mail-label.jsx
│ │ │ │ │ ├── snooze-popover.jsx
│ │ │ │ │ ├── snooze-store.jsx
│ │ │ │ │ └── snooze-utils.es6
│ │ │ │ ├── package.json
│ │ │ │ ├── spec/
│ │ │ │ │ ├── snooze-store-spec.es6
│ │ │ │ │ └── snooze-utils-spec.es6
│ │ │ │ └── stylesheets/
│ │ │ │ ├── snooze-feature-used-modal.less
│ │ │ │ ├── snooze-mail-label.less
│ │ │ │ └── snooze-popover.less
│ │ │ ├── ui-dark/
│ │ │ │ ├── LICENSE.md
│ │ │ │ ├── README.md
│ │ │ │ ├── package.json
│ │ │ │ └── styles/
│ │ │ │ ├── email-frame.less
│ │ │ │ └── ui-variables.less
│ │ │ ├── ui-darkside/
│ │ │ │ ├── LICENSE
│ │ │ │ ├── README.md
│ │ │ │ ├── index.less
│ │ │ │ ├── package.json
│ │ │ │ └── styles/
│ │ │ │ ├── darkside-composer.less
│ │ │ │ ├── darkside-drafts.less
│ │ │ │ ├── darkside-inputs.less
│ │ │ │ ├── darkside-labels.less
│ │ │ │ ├── darkside-message-list.less
│ │ │ │ ├── darkside-notifications.less
│ │ │ │ ├── darkside-preferences.less
│ │ │ │ ├── darkside-sidebar.less
│ │ │ │ ├── darkside-swiping.less
│ │ │ │ ├── darkside-thread-icons.less
│ │ │ │ ├── darkside-threadlist.less
│ │ │ │ ├── darkside-toolbars.less
│ │ │ │ ├── darkside-variables.less
│ │ │ │ ├── darkside-window-controls.less
│ │ │ │ └── theme-colors.less
│ │ │ ├── ui-less-is-more/
│ │ │ │ ├── LICENSE
│ │ │ │ ├── README.md
│ │ │ │ ├── index.less
│ │ │ │ ├── package.json
│ │ │ │ └── styles/
│ │ │ │ ├── less-is-more.less
│ │ │ │ └── theme-colors.less
│ │ │ ├── ui-light/
│ │ │ │ ├── package.json
│ │ │ │ └── styles/
│ │ │ │ └── ui-variables.less
│ │ │ ├── ui-taiga/
│ │ │ │ ├── LICENSE
│ │ │ │ ├── README.md
│ │ │ │ ├── package.json
│ │ │ │ └── styles/
│ │ │ │ ├── controls.less
│ │ │ │ ├── email-frame.less
│ │ │ │ ├── notifications.less
│ │ │ │ ├── sidebar.less
│ │ │ │ ├── theme-colors.less
│ │ │ │ ├── threads.less
│ │ │ │ ├── ui-variables.less
│ │ │ │ └── variables.less
│ │ │ ├── ui-ubuntu/
│ │ │ │ ├── README.md
│ │ │ │ ├── index.less
│ │ │ │ ├── package.json
│ │ │ │ └── styles/
│ │ │ │ ├── theme-colors.less
│ │ │ │ └── ui-variables.less
│ │ │ ├── undo-redo/
│ │ │ │ ├── lib/
│ │ │ │ │ ├── main.es6
│ │ │ │ │ ├── undo-redo-thread-list-toast.jsx
│ │ │ │ │ ├── undo-send-store.es6
│ │ │ │ │ └── undo-send-toast.jsx
│ │ │ │ └── package.json
│ │ │ ├── unread-notifications/
│ │ │ │ ├── lib/
│ │ │ │ │ └── main.es6
│ │ │ │ ├── package.json
│ │ │ │ └── spec/
│ │ │ │ └── main-spec.es6
│ │ │ ├── verify-install-location/
│ │ │ │ ├── lib/
│ │ │ │ │ └── main.es6
│ │ │ │ └── package.json
│ │ │ └── worker-ui/
│ │ │ ├── lib/
│ │ │ │ ├── developer-bar-curl-item.cjsx
│ │ │ │ ├── developer-bar-long-poll-item.cjsx
│ │ │ │ ├── developer-bar-store.coffee
│ │ │ │ ├── developer-bar-task.cjsx
│ │ │ │ ├── developer-bar.cjsx
│ │ │ │ └── main.cjsx
│ │ │ ├── package.json
│ │ │ └── stylesheets/
│ │ │ └── worker-ui.less
│ │ ├── keymaps/
│ │ │ ├── README.m
│ │ │ ├── base-darwin.json
│ │ │ ├── base-linux.json
│ │ │ ├── base-win32.json
│ │ │ ├── base.json
│ │ │ └── templates/
│ │ │ ├── Apple Mail.json
│ │ │ ├── Gmail.json
│ │ │ ├── Inbox by Gmail.json
│ │ │ └── Outlook.json
│ │ ├── menus/
│ │ │ ├── darwin.json
│ │ │ ├── linux.json
│ │ │ └── win32.json
│ │ ├── package.json
│ │ ├── script/
│ │ │ ├── grunt
│ │ │ ├── grunt.cmd
│ │ │ ├── mkdeb
│ │ │ ├── mkrpm
│ │ │ ├── publish-docs
│ │ │ └── utils/
│ │ │ └── child-process-wrapper.js
│ │ ├── spec/
│ │ │ ├── action-bridge-spec.coffee
│ │ │ ├── async-test-spec.es6
│ │ │ ├── buffered-process-spec.coffee
│ │ │ ├── components/
│ │ │ │ ├── blockquote-manager-spec.es6
│ │ │ │ ├── clipboard-service-spec.coffee
│ │ │ │ ├── contenteditable-component-spec.cjsx
│ │ │ │ ├── date-input-spec.jsx
│ │ │ │ ├── date-picker-popover-spec.jsx
│ │ │ │ ├── editable-list-spec.jsx
│ │ │ │ ├── editable-table-spec.jsx
│ │ │ │ ├── evented-iframe-spec.cjsx
│ │ │ │ ├── fixed-popover-spec.jsx
│ │ │ │ ├── injected-component-set-spec.jsx
│ │ │ │ ├── multiselect-dropdown-spec.jsx
│ │ │ │ ├── multiselect-list-interaction-handler-spec.coffee
│ │ │ │ ├── multiselect-split-interaction-handler-spec.coffee
│ │ │ │ ├── nylas-calendar/
│ │ │ │ │ ├── calendar-toggles-spec.jsx
│ │ │ │ │ ├── fixtures/
│ │ │ │ │ │ └── events.es6
│ │ │ │ │ ├── test-data-source.es6
│ │ │ │ │ ├── test-utils.es6
│ │ │ │ │ ├── week-view-extended-spec.jsx
│ │ │ │ │ └── week-view-spec.jsx
│ │ │ │ ├── participants-text-field-spec.jsx
│ │ │ │ ├── selectable-table-spec.jsx
│ │ │ │ ├── table/
│ │ │ │ │ ├── table-data-source-spec.jsx
│ │ │ │ │ └── table-spec.jsx
│ │ │ │ └── tokenizing-text-field-spec.cjsx
│ │ │ ├── database-object-registry-spec.es6
│ │ │ ├── default-client-helper-spec.coffee
│ │ │ ├── fixtures/
│ │ │ │ ├── css.css
│ │ │ │ ├── db-test-model.coffee
│ │ │ │ ├── emails/
│ │ │ │ │ ├── correct_sig.txt
│ │ │ │ │ ├── email_1.html
│ │ │ │ │ ├── email_10.html
│ │ │ │ │ ├── email_10_stripped.html
│ │ │ │ │ ├── email_11.html
│ │ │ │ │ ├── email_11_stripped.html
│ │ │ │ │ ├── email_12.html
│ │ │ │ │ ├── email_12_stripped.html
│ │ │ │ │ ├── email_13.html
│ │ │ │ │ ├── email_13_stripped.html
│ │ │ │ │ ├── email_14.html
│ │ │ │ │ ├── email_14_stripped.html
│ │ │ │ │ ├── email_15.html
│ │ │ │ │ ├── email_15_stripped.html
│ │ │ │ │ ├── email_16.html
│ │ │ │ │ ├── email_16_stripped.html
│ │ │ │ │ ├── email_17.html
│ │ │ │ │ ├── email_17_stripped.html
│ │ │ │ │ ├── email_18.html
│ │ │ │ │ ├── email_18_stripped.html
│ │ │ │ │ ├── email_19.html
│ │ │ │ │ ├── email_19_stripped.html
│ │ │ │ │ ├── email_1_1.txt
│ │ │ │ │ ├── email_1_2.txt
│ │ │ │ │ ├── email_1_3.txt
│ │ │ │ │ ├── email_1_4.txt
│ │ │ │ │ ├── email_1_5.txt
│ │ │ │ │ ├── email_1_6.txt
│ │ │ │ │ ├── email_1_7.txt
│ │ │ │ │ ├── email_1_8.txt
│ │ │ │ │ ├── email_1_stripped.html
│ │ │ │ │ ├── email_2.html
│ │ │ │ │ ├── email_20.html
│ │ │ │ │ ├── email_20_stripped.html
│ │ │ │ │ ├── email_21.html
│ │ │ │ │ ├── email_21_stripped.html
│ │ │ │ │ ├── email_22.html
│ │ │ │ │ ├── email_22_stripped.html
│ │ │ │ │ ├── email_23.html
│ │ │ │ │ ├── email_23_stripped.html
│ │ │ │ │ ├── email_2_1.txt
│ │ │ │ │ ├── email_2_stripped.html
│ │ │ │ │ ├── email_3.html
│ │ │ │ │ ├── email_3_stripped.html
│ │ │ │ │ ├── email_4.html
│ │ │ │ │ ├── email_4_stripped.html
│ │ │ │ │ ├── email_5.html
│ │ │ │ │ ├── email_5_stripped.html
│ │ │ │ │ ├── email_6.html
│ │ │ │ │ ├── email_6_stripped.html
│ │ │ │ │ ├── email_7.html
│ │ │ │ │ ├── email_7_stripped.html
│ │ │ │ │ ├── email_8.html
│ │ │ │ │ ├── email_8_stripped.html
│ │ │ │ │ ├── email_9.html
│ │ │ │ │ ├── email_9_stripped.html
│ │ │ │ │ ├── email_BlackBerry.txt
│ │ │ │ │ ├── email_bullets.txt
│ │ │ │ │ ├── email_iPhone.txt
│ │ │ │ │ ├── email_multi_word_sent_from_my_mobile_device.txt
│ │ │ │ │ └── email_sent_from_my_not_signature.txt
│ │ │ │ ├── module-cache/
│ │ │ │ │ └── file.json
│ │ │ │ ├── packages/
│ │ │ │ │ ├── package-that-throws-an-exception/
│ │ │ │ │ │ └── index.coffee
│ │ │ │ │ ├── package-that-throws-on-activate/
│ │ │ │ │ │ └── index.coffee
│ │ │ │ │ ├── package-that-throws-on-deactivate/
│ │ │ │ │ │ └── index.coffee
│ │ │ │ │ ├── package-with-broken-keymap/
│ │ │ │ │ │ └── keymaps/
│ │ │ │ │ │ └── broken.json
│ │ │ │ │ ├── package-with-broken-package-json/
│ │ │ │ │ │ └── package.json
│ │ │ │ │ ├── package-with-config-defaults/
│ │ │ │ │ │ └── index.coffee
│ │ │ │ │ ├── package-with-config-schema/
│ │ │ │ │ │ └── index.coffee
│ │ │ │ │ ├── package-with-deactivate/
│ │ │ │ │ │ └── index.coffee
│ │ │ │ │ ├── package-with-deprecated-pane-item-method/
│ │ │ │ │ │ └── index.coffee
│ │ │ │ │ ├── package-with-empty-activation-commands/
│ │ │ │ │ │ ├── index.coffee
│ │ │ │ │ │ └── package.json
│ │ │ │ │ ├── package-with-empty-keymap/
│ │ │ │ │ │ ├── keymaps/
│ │ │ │ │ │ │ └── keymap.cson
│ │ │ │ │ │ └── package.json
│ │ │ │ │ ├── package-with-empty-menu/
│ │ │ │ │ │ ├── menus/
│ │ │ │ │ │ │ └── menu.cson
│ │ │ │ │ │ └── package.json
│ │ │ │ │ ├── package-with-incompatible-native-module/
│ │ │ │ │ │ ├── main.js
│ │ │ │ │ │ ├── node_modules/
│ │ │ │ │ │ │ └── native-module/
│ │ │ │ │ │ │ ├── build/
│ │ │ │ │ │ │ │ └── Release/
│ │ │ │ │ │ │ │ └── native.node
│ │ │ │ │ │ │ ├── main.js
│ │ │ │ │ │ │ └── package.json
│ │ │ │ │ │ └── package.json
│ │ │ │ │ ├── package-with-index/
│ │ │ │ │ │ └── index.coffee
│ │ │ │ │ ├── package-with-invalid-styles/
│ │ │ │ │ │ ├── package.json
│ │ │ │ │ │ └── styles/
│ │ │ │ │ │ └── index.less
│ │ │ │ │ ├── package-with-keymaps/
│ │ │ │ │ │ └── keymaps/
│ │ │ │ │ │ ├── keymap-1.json
│ │ │ │ │ │ └── keymap-2.json
│ │ │ │ │ ├── package-with-keymaps-manifest/
│ │ │ │ │ │ ├── keymaps/
│ │ │ │ │ │ │ ├── keymap-1.json
│ │ │ │ │ │ │ └── keymap-2.json
│ │ │ │ │ │ └── package.json
│ │ │ │ │ ├── package-with-main/
│ │ │ │ │ │ ├── main-module.coffee
│ │ │ │ │ │ └── package.json
│ │ │ │ │ ├── package-with-menus/
│ │ │ │ │ │ └── menus/
│ │ │ │ │ │ ├── menu-1.json
│ │ │ │ │ │ └── menu-2.json
│ │ │ │ │ ├── package-with-menus-manifest/
│ │ │ │ │ │ ├── menus/
│ │ │ │ │ │ │ ├── menu-1.json
│ │ │ │ │ │ │ └── menu-2.json
│ │ │ │ │ │ └── package.json
│ │ │ │ │ ├── package-with-models/
│ │ │ │ │ │ ├── main-module.coffee
│ │ │ │ │ │ └── package.json
│ │ │ │ │ ├── package-with-serialization/
│ │ │ │ │ │ └── index.coffee
│ │ │ │ │ ├── package-with-serialize-error/
│ │ │ │ │ │ ├── index.coffee
│ │ │ │ │ │ └── package.json
│ │ │ │ │ ├── package-with-style-sheets-manifest/
│ │ │ │ │ │ ├── package.json
│ │ │ │ │ │ └── styles/
│ │ │ │ │ │ ├── 1.css
│ │ │ │ │ │ ├── 2.less
│ │ │ │ │ │ └── 3.css
│ │ │ │ │ ├── package-with-styles/
│ │ │ │ │ │ └── styles/
│ │ │ │ │ │ ├── 1.css
│ │ │ │ │ │ ├── 2.less
│ │ │ │ │ │ ├── 3.test-context.css
│ │ │ │ │ │ └── 4.css
│ │ │ │ │ ├── package-with-stylesheets-manifest/
│ │ │ │ │ │ └── package.json
│ │ │ │ │ ├── package-without-module/
│ │ │ │ │ │ └── package.json
│ │ │ │ │ ├── theme-with-incomplete-ui-variables/
│ │ │ │ │ │ ├── package.json
│ │ │ │ │ │ └── styles/
│ │ │ │ │ │ ├── editor.less
│ │ │ │ │ │ └── ui-variables.less
│ │ │ │ │ ├── theme-with-index-css/
│ │ │ │ │ │ ├── index.css
│ │ │ │ │ │ └── package.json
│ │ │ │ │ ├── theme-with-index-less/
│ │ │ │ │ │ ├── index.less
│ │ │ │ │ │ └── package.json
│ │ │ │ │ ├── theme-with-invalid-styles/
│ │ │ │ │ │ ├── index.less
│ │ │ │ │ │ └── package.json
│ │ │ │ │ ├── theme-with-package-file/
│ │ │ │ │ │ ├── package.json
│ │ │ │ │ │ └── styles/
│ │ │ │ │ │ ├── first.css
│ │ │ │ │ │ ├── last.css
│ │ │ │ │ │ └── second.less
│ │ │ │ │ ├── theme-with-ui-variables/
│ │ │ │ │ │ ├── package.json
│ │ │ │ │ │ └── styles/
│ │ │ │ │ │ ├── editor.less
│ │ │ │ │ │ └── ui-variables.less
│ │ │ │ │ └── theme-without-package-file/
│ │ │ │ │ └── styles/
│ │ │ │ │ ├── a.css
│ │ │ │ │ ├── b.css
│ │ │ │ │ ├── c.less
│ │ │ │ │ └── d.csv
│ │ │ │ ├── paste/
│ │ │ │ │ ├── excel-paste-in.html
│ │ │ │ │ ├── excel-paste-out.html
│ │ │ │ │ ├── word-paste-in.html
│ │ │ │ │ └── word-paste-out.html
│ │ │ │ ├── sample-deltas-clustered.json
│ │ │ │ ├── sample-deltas.json
│ │ │ │ ├── sample.less
│ │ │ │ ├── table-data.es6
│ │ │ │ └── task-spec-handler.coffee
│ │ │ ├── list-selection-spec.coffee
│ │ │ ├── mail-rules-processor-spec.coffee
│ │ │ ├── mailbox-perspective-spec.es6
│ │ │ ├── menu-manager-spec.coffee
│ │ │ ├── models/
│ │ │ │ ├── category-spec.coffee
│ │ │ │ ├── contact-spec.coffee
│ │ │ │ ├── event-spec.coffee
│ │ │ │ ├── file-spec.coffee
│ │ │ │ ├── message-spec.coffee
│ │ │ │ ├── model-spec.es6
│ │ │ │ ├── model-with-metadata-spec.es6
│ │ │ │ ├── mutable-query-result-set-spec.es6
│ │ │ │ ├── query-range-spec.es6
│ │ │ │ ├── query-spec.es6
│ │ │ │ ├── query-subscription-pool-spec.es6
│ │ │ │ ├── query-subscription-spec.es6
│ │ │ │ └── thread-spec.coffee
│ │ │ ├── module-cache-spec.coffee
│ │ │ ├── n1-spec-runner/
│ │ │ │ ├── console-reporter.es6
│ │ │ │ ├── jasmine-extensions.es6
│ │ │ │ ├── jasmine.js
│ │ │ │ ├── master-after-each.es6
│ │ │ │ ├── master-before-each.es6
│ │ │ │ ├── n1-gui-reporter.cjsx
│ │ │ │ ├── n1-spec-loader.es6
│ │ │ │ ├── n1-spec-runner.es6
│ │ │ │ ├── nylas-test-constants.es6
│ │ │ │ ├── react-test-utils-extensions.es6
│ │ │ │ ├── spec-bootstrap.es6
│ │ │ │ ├── terminal-reporter.es6
│ │ │ │ ├── time-override.coffee
│ │ │ │ └── time-reporter.coffee
│ │ │ ├── nylas-api-spec.coffee
│ │ │ ├── nylas-env-spec.es6
│ │ │ ├── nylas-protocol-handler-spec.es6
│ │ │ ├── nylas-test-utils.coffee
│ │ │ ├── package-manager-spec.coffee
│ │ │ ├── package-spec.coffee
│ │ │ ├── registries/
│ │ │ │ ├── component-registry-spec.coffee
│ │ │ │ └── extension-registry-spec.coffee
│ │ │ ├── services/
│ │ │ │ ├── delta-processor-spec.coffee
│ │ │ │ ├── delta-streaming-connection-spec.coffee
│ │ │ │ ├── inline-style-transformer-spec.coffee
│ │ │ │ ├── quoted-html-transformer-spec.coffee
│ │ │ │ ├── quoted-plain-text-transformer-spec.coffee
│ │ │ │ └── search/
│ │ │ │ ├── search-query-backend-imap-spec.es6
│ │ │ │ └── search-query-parser-spec.es6
│ │ │ ├── spellchecker-spec.es6
│ │ │ ├── stores/
│ │ │ │ ├── account-store-spec.coffee
│ │ │ │ ├── badge-store-spec.coffee
│ │ │ │ ├── contact-store-spec.coffee
│ │ │ │ ├── database-setup-query-builder-spec.es6
│ │ │ │ ├── database-store-spec.es6
│ │ │ │ ├── database-transaction-spec.es6
│ │ │ │ ├── draft-editing-session-spec.coffee
│ │ │ │ ├── draft-factory-spec.es6
│ │ │ │ ├── draft-helpers-spec.es6
│ │ │ │ ├── draft-store-spec.es6
│ │ │ │ ├── feature-usage-store-spec.es6
│ │ │ │ ├── file-download-store-spec.coffee
│ │ │ │ ├── file-upload-store-spec.coffee
│ │ │ │ ├── focused-contacts-store-spec.coffee
│ │ │ │ ├── focused-content-store-spec.coffee
│ │ │ │ ├── focused-perspective-store-spec.coffee
│ │ │ │ ├── folder-sync-progress-store-spec.es6
│ │ │ │ ├── identity-store-spec.es6
│ │ │ │ ├── message-store-spec.coffee
│ │ │ │ ├── send-actions-store-spec.es6
│ │ │ │ ├── task-queue-spec.coffee
│ │ │ │ ├── task-subclass.es6
│ │ │ │ └── undo-redo-store-spec.es6
│ │ │ ├── tasks/
│ │ │ │ ├── base-draft-task-spec.es6
│ │ │ │ ├── change-folder-task-spec.coffee
│ │ │ │ ├── change-labels-task-spec.coffee
│ │ │ │ ├── change-mail-task-spec.coffee
│ │ │ │ ├── change-starred-task-spec.coffee
│ │ │ │ ├── change-unread-task-spec.coffee
│ │ │ │ ├── destroy-category-task-spec.coffee
│ │ │ │ ├── destroy-model-task-spec.es6
│ │ │ │ ├── event-rsvp-task-spec.coffee
│ │ │ │ ├── send-draft-task-spec.es6
│ │ │ │ ├── syncback-category-task-spec.coffee
│ │ │ │ ├── syncback-metadata-task-spec.es6
│ │ │ │ ├── syncback-model-task-spec.es6
│ │ │ │ ├── task-factory-spec.es6
│ │ │ │ └── task-spec.coffee
│ │ │ ├── themes/
│ │ │ │ ├── style-manager-spec.coffee
│ │ │ │ ├── styles-element-spec.coffee
│ │ │ │ └── theme-manager-spec.coffee
│ │ │ ├── undo-stack-spec.es6
│ │ │ └── utils/
│ │ │ ├── date-utils-spec.es6
│ │ │ ├── dom-utils-spec.coffee
│ │ │ └── utils-spec.coffee
│ │ ├── src/
│ │ │ ├── apm-wrapper.coffee
│ │ │ ├── browser/
│ │ │ │ ├── application-menu.coffee
│ │ │ │ ├── application.es6
│ │ │ │ ├── config-migrator.es6
│ │ │ │ ├── config-persistence-manager.es6
│ │ │ │ ├── database-reader.es6
│ │ │ │ ├── file-list-cache.es6
│ │ │ │ ├── global-timer.es6
│ │ │ │ ├── linux-updater-adapter.es6
│ │ │ │ ├── main.js
│ │ │ │ ├── nylas-protocol-handler.es6
│ │ │ │ ├── nylas-window.coffee
│ │ │ │ ├── package-migration-manager.es6
│ │ │ │ ├── prevent-legacy-n1-migration.es6
│ │ │ │ ├── system-tray-manager.es6
│ │ │ │ ├── window-launcher.es6
│ │ │ │ ├── window-manager.es6
│ │ │ │ ├── windows-updater-squirrel-adapter.coffee
│ │ │ │ └── windows-updater.js
│ │ │ ├── buffered-process.coffee
│ │ │ ├── canvas-utils.coffee
│ │ │ ├── chaos-monkey.coffee
│ │ │ ├── chrome-user-agent-stylesheet-string.coffee
│ │ │ ├── color.coffee
│ │ │ ├── compile-cache.js
│ │ │ ├── compile-support/
│ │ │ │ ├── babel.js
│ │ │ │ ├── cjsx.js
│ │ │ │ ├── coffee-script.js
│ │ │ │ └── typescript.js
│ │ │ ├── components/
│ │ │ │ ├── attachment-items.jsx
│ │ │ │ ├── billing-modal.jsx
│ │ │ │ ├── bolded-search-result.jsx
│ │ │ │ ├── button-dropdown.cjsx
│ │ │ │ ├── code-snippet.jsx
│ │ │ │ ├── config-prop-container.jsx
│ │ │ │ ├── contenteditable/
│ │ │ │ │ ├── blockquote-manager.es6
│ │ │ │ │ ├── clipboard-service.es6
│ │ │ │ │ ├── contenteditable-service.es6
│ │ │ │ │ ├── contenteditable.cjsx
│ │ │ │ │ ├── dom-normalizer.coffee
│ │ │ │ │ ├── editor-api.coffee
│ │ │ │ │ ├── emphasis-formatting-extension.es6
│ │ │ │ │ ├── exported-selection.es6
│ │ │ │ │ ├── extended-selection.coffee
│ │ │ │ │ ├── floating-toolbar.cjsx
│ │ │ │ │ ├── link-editor.cjsx
│ │ │ │ │ ├── link-manager.es6
│ │ │ │ │ ├── list-manager.es6
│ │ │ │ │ ├── mouse-service.es6
│ │ │ │ │ ├── paragraph-formatting-extension.es6
│ │ │ │ │ ├── tab-manager.es6
│ │ │ │ │ ├── toolbar-button-manager.es6
│ │ │ │ │ └── toolbar-buttons.jsx
│ │ │ │ ├── date-input.jsx
│ │ │ │ ├── date-picker-popover.jsx
│ │ │ │ ├── date-picker.jsx
│ │ │ │ ├── decorators/
│ │ │ │ │ ├── auto-focuses.jsx
│ │ │ │ │ ├── compose.es6
│ │ │ │ │ ├── has-tutorial-tip.jsx
│ │ │ │ │ ├── listens-to-flux-store.jsx
│ │ │ │ │ ├── listens-to-movement-keys.jsx
│ │ │ │ │ └── listens-to-observable.jsx
│ │ │ │ ├── disclosure-triangle.cjsx
│ │ │ │ ├── drop-zone.jsx
│ │ │ │ ├── dropdown-menu.jsx
│ │ │ │ ├── editable-list.jsx
│ │ │ │ ├── editable-table.jsx
│ │ │ │ ├── empty-list-state.cjsx
│ │ │ │ ├── evented-iframe.cjsx
│ │ │ │ ├── feature-used-up-modal.jsx
│ │ │ │ ├── fixed-popover.jsx
│ │ │ │ ├── flexbox.jsx
│ │ │ │ ├── flux-container.jsx
│ │ │ │ ├── focus-container.jsx
│ │ │ │ ├── generated-form.cjsx
│ │ │ │ ├── injected-component-label.jsx
│ │ │ │ ├── injected-component-set.cjsx
│ │ │ │ ├── injected-component.cjsx
│ │ │ │ ├── key-commands-region.jsx
│ │ │ │ ├── lazy-rendered-list.jsx
│ │ │ │ ├── list-data-source.es6
│ │ │ │ ├── list-selection.es6
│ │ │ │ ├── list-tabular-item.cjsx
│ │ │ │ ├── list-tabular.jsx
│ │ │ │ ├── mail-important-icon.cjsx
│ │ │ │ ├── mail-label-set.jsx
│ │ │ │ ├── mail-label.jsx
│ │ │ │ ├── menu.cjsx
│ │ │ │ ├── metadata-composer-toggle-button.jsx
│ │ │ │ ├── modal.jsx
│ │ │ │ ├── multiselect-action-bar.cjsx
│ │ │ │ ├── multiselect-dropdown.jsx
│ │ │ │ ├── multiselect-list-interaction-handler.coffee
│ │ │ │ ├── multiselect-list.cjsx
│ │ │ │ ├── multiselect-split-interaction-handler.coffee
│ │ │ │ ├── multiselect-toolbar.jsx
│ │ │ │ ├── notification.jsx
│ │ │ │ ├── nylas-calendar/
│ │ │ │ │ ├── calendar-constants.es6
│ │ │ │ │ ├── calendar-data-source.es6
│ │ │ │ │ ├── calendar-event-container.jsx
│ │ │ │ │ ├── calendar-event-popover.jsx
│ │ │ │ │ ├── calendar-event.jsx
│ │ │ │ │ ├── calendar-helpers.jsx
│ │ │ │ │ ├── calendar-toggles.jsx
│ │ │ │ │ ├── current-time-indicator.jsx
│ │ │ │ │ ├── event-grid-background.jsx
│ │ │ │ │ ├── event-participants-input.jsx
│ │ │ │ │ ├── event-search-bar.jsx
│ │ │ │ │ ├── footer-controls.jsx
│ │ │ │ │ ├── header-controls.jsx
│ │ │ │ │ ├── mini-month-view.jsx
│ │ │ │ │ ├── month-view.jsx
│ │ │ │ │ ├── nylas-calendar.jsx
│ │ │ │ │ ├── top-banner.jsx
│ │ │ │ │ ├── week-view-all-day-events.jsx
│ │ │ │ │ ├── week-view-event-column.jsx
│ │ │ │ │ └── week-view.jsx
│ │ │ │ ├── oauth-signin-page.jsx
│ │ │ │ ├── open-identity-page-button.jsx
│ │ │ │ ├── outline-view-item.jsx
│ │ │ │ ├── outline-view.jsx
│ │ │ │ ├── overlaid-components/
│ │ │ │ │ ├── anchor-constants.es6
│ │ │ │ │ ├── custom-contenteditable-components.es6
│ │ │ │ │ ├── overlaid-components.jsx
│ │ │ │ │ └── overlaid-composer-extension.es6
│ │ │ │ ├── participants-text-field.jsx
│ │ │ │ ├── resizable-region.cjsx
│ │ │ │ ├── retina-img.jsx
│ │ │ │ ├── scenario-editor-models.es6
│ │ │ │ ├── scenario-editor-row.cjsx
│ │ │ │ ├── scenario-editor.cjsx
│ │ │ │ ├── scroll-region.cjsx
│ │ │ │ ├── scrollbar-ticks.jsx
│ │ │ │ ├── search-bar.jsx
│ │ │ │ ├── selectable-table.jsx
│ │ │ │ ├── spinner.cjsx
│ │ │ │ ├── swipe-container.jsx
│ │ │ │ ├── switch.jsx
│ │ │ │ ├── syncing-list-state.jsx
│ │ │ │ ├── tab-group-region.cjsx
│ │ │ │ ├── table/
│ │ │ │ │ ├── table-data-source.es6
│ │ │ │ │ └── table.jsx
│ │ │ │ ├── time-picker.jsx
│ │ │ │ ├── toast.jsx
│ │ │ │ ├── tokenizing-text-field.jsx
│ │ │ │ ├── undo-toast.jsx
│ │ │ │ ├── unsafe-component.cjsx
│ │ │ │ └── webview.jsx
│ │ │ ├── config-schema.es6
│ │ │ ├── config-utils.js
│ │ │ ├── config.coffee
│ │ │ ├── database-helpers.es6
│ │ │ ├── date-utils.es6
│ │ │ ├── decorators/
│ │ │ │ └── inflates-draft-client-id.jsx
│ │ │ ├── default-client-helper.coffee
│ │ │ ├── deprecate-utils.coffee
│ │ │ ├── dom-utils.coffee
│ │ │ ├── dom-walkers.es6
│ │ │ ├── error-logger-extensions/
│ │ │ │ └── nylas-private-error-reporter.js
│ │ │ ├── error-logger.js
│ │ │ ├── extensions/
│ │ │ │ ├── account-sidebar-extension.es6
│ │ │ │ ├── composer-extension.coffee
│ │ │ │ ├── contenteditable-extension.coffee
│ │ │ │ ├── extension-utils.es6
│ │ │ │ ├── message-view-extension.coffee
│ │ │ │ └── thread-list-extension.es6
│ │ │ ├── flux/
│ │ │ │ ├── action-bridge.es6
│ │ │ │ ├── actions.es6
│ │ │ │ ├── attributes/
│ │ │ │ │ ├── attribute-boolean.es6
│ │ │ │ │ ├── attribute-collection.es6
│ │ │ │ │ ├── attribute-datetime.es6
│ │ │ │ │ ├── attribute-joined-data.es6
│ │ │ │ │ ├── attribute-number.es6
│ │ │ │ │ ├── attribute-object.es6
│ │ │ │ │ ├── attribute-serverid.es6
│ │ │ │ │ ├── attribute-string.es6
│ │ │ │ │ ├── attribute.es6
│ │ │ │ │ ├── matcher.es6
│ │ │ │ │ └── sort-order.es6
│ │ │ │ ├── attributes.es6
│ │ │ │ ├── coffee-helpers.coffee
│ │ │ │ ├── errors.es6
│ │ │ │ ├── models/
│ │ │ │ │ ├── account.es6
│ │ │ │ │ ├── calendar.es6
│ │ │ │ │ ├── category.es6
│ │ │ │ │ ├── contact.es6
│ │ │ │ │ ├── event.es6
│ │ │ │ │ ├── file.es6
│ │ │ │ │ ├── folder.es6
│ │ │ │ │ ├── json-blob.es6
│ │ │ │ │ ├── label.es6
│ │ │ │ │ ├── message-utils.es6
│ │ │ │ │ ├── message.es6
│ │ │ │ │ ├── model-with-metadata.es6
│ │ │ │ │ ├── model.coffee
│ │ │ │ │ ├── mutable-query-result-set.es6
│ │ │ │ │ ├── mutable-query-subscription.es6
│ │ │ │ │ ├── provider-syncback-request.es6
│ │ │ │ │ ├── query-range.es6
│ │ │ │ │ ├── query-result-set.es6
│ │ │ │ │ ├── query-subscription-pool.es6
│ │ │ │ │ ├── query-subscription.es6
│ │ │ │ │ ├── query.es6
│ │ │ │ │ ├── thread.es6
│ │ │ │ │ ├── unread-query-subscription.es6
│ │ │ │ │ └── utils.coffee
│ │ │ │ ├── modules/
│ │ │ │ │ └── reflux-coffee.coffee
│ │ │ │ ├── nylas-api-helpers.es6
│ │ │ │ ├── nylas-api-request.es6
│ │ │ │ ├── nylas-api.es6
│ │ │ │ ├── nylas-long-connection.es6
│ │ │ │ ├── stores/
│ │ │ │ │ ├── account-store.es6
│ │ │ │ │ ├── badge-store.es6
│ │ │ │ │ ├── category-store.coffee
│ │ │ │ │ ├── contact-ranking-store.coffee
│ │ │ │ │ ├── contact-store.coffee
│ │ │ │ │ ├── database-agent.js
│ │ │ │ │ ├── database-change-record.es6
│ │ │ │ │ ├── database-setup-query-builder.es6
│ │ │ │ │ ├── database-store.es6
│ │ │ │ │ ├── database-writer.es6
│ │ │ │ │ ├── delta-connection-store.es6
│ │ │ │ │ ├── draft-editing-session.coffee
│ │ │ │ │ ├── draft-factory.coffee
│ │ │ │ │ ├── draft-helpers.es6
│ │ │ │ │ ├── draft-store-extension.coffee
│ │ │ │ │ ├── draft-store.es6
│ │ │ │ │ ├── feature-usage-store.jsx
│ │ │ │ │ ├── file-download-store.es6
│ │ │ │ │ ├── file-upload-store.es6
│ │ │ │ │ ├── focused-contacts-store.es6
│ │ │ │ │ ├── focused-content-store.coffee
│ │ │ │ │ ├── focused-perspective-store.es6
│ │ │ │ │ ├── folder-sync-progress-store.es6
│ │ │ │ │ ├── identity-store.es6
│ │ │ │ │ ├── mail-rules-store.coffee
│ │ │ │ │ ├── message-body-processor.es6
│ │ │ │ │ ├── message-store-extension.coffee
│ │ │ │ │ ├── message-store.coffee
│ │ │ │ │ ├── metadata-store.es6
│ │ │ │ │ ├── modal-store.jsx
│ │ │ │ │ ├── observable-list-data-source.es6
│ │ │ │ │ ├── online-status-store.es6
│ │ │ │ │ ├── outbox-store.es6
│ │ │ │ │ ├── popover-store.jsx
│ │ │ │ │ ├── preferences-ui-store.es6
│ │ │ │ │ ├── recently-read-store.es6
│ │ │ │ │ ├── searchable-component-store.es6
│ │ │ │ │ ├── send-actions-store.es6
│ │ │ │ │ ├── signature-store.es6
│ │ │ │ │ ├── task-queue-status-store.coffee
│ │ │ │ │ ├── task-queue.coffee
│ │ │ │ │ ├── thread-counts-store.coffee
│ │ │ │ │ ├── thread-list-actions-store.es6
│ │ │ │ │ ├── undo-redo-store.es6
│ │ │ │ │ └── workspace-store.coffee
│ │ │ │ ├── syncback-task-api-request.es6
│ │ │ │ └── tasks/
│ │ │ │ ├── base-draft-task.es6
│ │ │ │ ├── change-folder-task.es6
│ │ │ │ ├── change-labels-task.es6
│ │ │ │ ├── change-mail-task.es6
│ │ │ │ ├── change-starred-task.es6
│ │ │ │ ├── change-unread-task.es6
│ │ │ │ ├── destroy-category-task.es6
│ │ │ │ ├── destroy-draft-task.es6
│ │ │ │ ├── destroy-model-task.es6
│ │ │ │ ├── ensure-message-in-sent-folder-task.es6
│ │ │ │ ├── event-rsvp-task.es6
│ │ │ │ ├── perform-send-action-task.es6
│ │ │ │ ├── reprocess-mail-rules-task.es6
│ │ │ │ ├── send-draft-task.es6
│ │ │ │ ├── send-feature-usage-event-task.es6
│ │ │ │ ├── syncback-category-task.es6
│ │ │ │ ├── syncback-event-task.es6
│ │ │ │ ├── syncback-metadata-task.es6
│ │ │ │ ├── syncback-model-task.es6
│ │ │ │ ├── task-factory.es6
│ │ │ │ └── task.es6
│ │ │ ├── fs-utils.es6
│ │ │ ├── global/
│ │ │ │ ├── nylas-component-kit.coffee
│ │ │ │ ├── nylas-exports.es6
│ │ │ │ ├── nylas-observables.coffee
│ │ │ │ └── nylas-store.coffee
│ │ │ ├── key-manager.es6
│ │ │ ├── keymap-manager.es6
│ │ │ ├── less-compile-cache.es6
│ │ │ ├── mail-rules-processor.coffee
│ │ │ ├── mail-rules-templates.coffee
│ │ │ ├── mailbox-perspective.coffee
│ │ │ ├── menu-helpers.coffee
│ │ │ ├── menu-manager.es6
│ │ │ ├── module-cache.coffee
│ │ │ ├── multi-request-progress-monitor.es6
│ │ │ ├── n1-cloud-api.es6
│ │ │ ├── native-notifications.es6
│ │ │ ├── nylas-env.es6
│ │ │ ├── package-manager.coffee
│ │ │ ├── package.coffee
│ │ │ ├── priority-ui-coordinator.es6
│ │ │ ├── regexp-utils.coffee
│ │ │ ├── registries/
│ │ │ │ ├── command-registry.es6
│ │ │ │ ├── component-registry.coffee
│ │ │ │ ├── database-object-registry.es6
│ │ │ │ ├── extension-registry.es6
│ │ │ │ ├── serializable-registry.es6
│ │ │ │ ├── service-registry.es6
│ │ │ │ ├── sound-registry.coffee
│ │ │ │ ├── store-registry.es6
│ │ │ │ └── task-registry.es6
│ │ │ ├── searchable-components/
│ │ │ │ ├── iframe-searcher.es6
│ │ │ │ ├── real-dom-parser.es6
│ │ │ │ ├── search-constants.es6
│ │ │ │ ├── search-match.jsx
│ │ │ │ ├── searchable-component-maker.jsx
│ │ │ │ ├── unified-dom-parser.es6
│ │ │ │ └── virtual-dom-parser.es6
│ │ │ ├── secondary-window-bootstrap.es6
│ │ │ ├── services/
│ │ │ │ ├── battery-status-manager.es6
│ │ │ │ ├── delta-processor.es6
│ │ │ │ ├── delta-streaming-connection.es6
│ │ │ │ ├── inline-style-transformer.es6
│ │ │ │ ├── model-search-indexer.es6
│ │ │ │ ├── quote-string-detector.es6
│ │ │ │ ├── quoted-html-transformer.es6
│ │ │ │ ├── quoted-plain-text-transformer.coffee
│ │ │ │ ├── sanitize-transformer.es6
│ │ │ │ ├── search/
│ │ │ │ │ ├── search-query-ast.es6
│ │ │ │ │ ├── search-query-backend-imap.es6
│ │ │ │ │ ├── search-query-backend-local.es6
│ │ │ │ │ └── search-query-parser.es6
│ │ │ │ ├── search-index-scheduler.es6
│ │ │ │ └── unwrapped-signature-detector.es6
│ │ │ ├── sheet-container.cjsx
│ │ │ ├── sheet-toolbar.cjsx
│ │ │ ├── sheet.cjsx
│ │ │ ├── spellchecker.es6
│ │ │ ├── style-manager.coffee
│ │ │ ├── styles-element.coffee
│ │ │ ├── system-start-service.es6
│ │ │ ├── task-bootstrap.coffee
│ │ │ ├── task.coffee
│ │ │ ├── theme-manager.coffee
│ │ │ ├── theme-package.coffee
│ │ │ ├── undo-stack.es6
│ │ │ ├── virtual-dom-utils.es6
│ │ │ ├── window-bootstrap.es6
│ │ │ ├── window-bridge.coffee
│ │ │ ├── window-event-handler.coffee
│ │ │ └── window.coffee
│ │ └── static/
│ │ ├── animations/
│ │ │ └── inbox-zero/
│ │ │ ├── airstrip/
│ │ │ │ ├── airstrip.html
│ │ │ │ └── airstrip.hyperesources/
│ │ │ │ ├── 96CD36-restorable.plist
│ │ │ │ ├── PIE.htc
│ │ │ │ └── airstrip_hype_generated_script.js
│ │ │ ├── galaxy/
│ │ │ │ ├── galaxy.html
│ │ │ │ └── galaxy.hyperesources/
│ │ │ │ ├── BC8A15-restorable.plist
│ │ │ │ ├── PIE.htc
│ │ │ │ └── galaxy_hype_generated_script.js
│ │ │ ├── gem/
│ │ │ │ ├── gem.html
│ │ │ │ └── gem.hyperesources/
│ │ │ │ └── gemslower_hype_generated_script.js
│ │ │ ├── oasis/
│ │ │ │ ├── oasis.html
│ │ │ │ └── oasis.hyperesources/
│ │ │ │ ├── DC9C02-restorable.plist
│ │ │ │ ├── PIE.htc
│ │ │ │ └── oasis_hype_generated_script.js
│ │ │ └── tron/
│ │ │ ├── tron.html
│ │ │ └── tron.hyperesources/
│ │ │ ├── 4982A5-restorable.plist
│ │ │ ├── PIE.htc
│ │ │ └── tron_hype_generated_script.js
│ │ ├── buttons.less
│ │ ├── components/
│ │ │ ├── attachment-items.less
│ │ │ ├── billing-modal.less
│ │ │ ├── button-dropdown.less
│ │ │ ├── code-snippet.less
│ │ │ ├── contenteditable.less
│ │ │ ├── date-input.less
│ │ │ ├── date-picker-popover.less
│ │ │ ├── date-picker.less
│ │ │ ├── disclosure-triangle.less
│ │ │ ├── editable-list.less
│ │ │ ├── editable-table.less
│ │ │ ├── empty-list-state.less
│ │ │ ├── extra.less
│ │ │ ├── feature-used-up-modal.less
│ │ │ ├── fixed-popover.less
│ │ │ ├── generated-form.less
│ │ │ ├── key-commands-region.less
│ │ │ ├── list-tabular.less
│ │ │ ├── menu.less
│ │ │ ├── modal.less
│ │ │ ├── multiselect-dropdown.less
│ │ │ ├── nylas-calendar.less
│ │ │ ├── outline-view.less
│ │ │ ├── scroll-region.less
│ │ │ ├── search-bar.less
│ │ │ ├── spinner.less
│ │ │ ├── switch.less
│ │ │ ├── syncing-list-state.less
│ │ │ ├── table.less
│ │ │ ├── time-picker.less
│ │ │ ├── toast.less
│ │ │ ├── tokenizing-text-field.less
│ │ │ ├── tutorial-overlay.less
│ │ │ ├── undo-toast.less
│ │ │ ├── unsafe.less
│ │ │ └── webview.less
│ │ ├── dropdowns.less
│ │ ├── email-frame.less
│ │ ├── index.html
│ │ ├── index.js
│ │ ├── index.less
│ │ ├── inputs.less
│ │ ├── jasmine.less
│ │ ├── linux.less
│ │ ├── mixins/
│ │ │ ├── background-variant.less
│ │ │ ├── common-ui-elements.less
│ │ │ ├── text-emphasis.less
│ │ │ └── windows.less
│ │ ├── normalize.less
│ │ ├── package-template/
│ │ │ ├── README.md
│ │ │ ├── lib/
│ │ │ │ ├── main.es6
│ │ │ │ ├── my-composer-button.jsx
│ │ │ │ └── my-message-sidebar.jsx
│ │ │ ├── spec/
│ │ │ │ ├── main-spec.es6
│ │ │ │ └── my-composer-button-spec.jsx
│ │ │ └── stylesheets/
│ │ │ └── main.less
│ │ ├── resizable.less
│ │ ├── selection.less
│ │ ├── sounds/
│ │ │ ├── mail_sent.ogg
│ │ │ └── new_mail.ogg
│ │ ├── type.less
│ │ ├── utilities.less
│ │ ├── variables/
│ │ │ ├── ui-mixins.less
│ │ │ └── ui-variables.less
│ │ └── workspace.less
│ ├── client-sync/
│ │ ├── README.md
│ │ ├── main.es6
│ │ ├── package.json
│ │ ├── spec/
│ │ │ ├── fixtures/
│ │ │ │ ├── FetchFolderList/
│ │ │ │ │ ├── gmail-bengotow.json
│ │ │ │ │ └── imap-inboxapptest1.json
│ │ │ │ ├── MessageUtils/
│ │ │ │ │ ├── parseFromImap/
│ │ │ │ │ │ ├── crypto-gram-ascii-plaintext.json
│ │ │ │ │ │ ├── eff-plaintext-no-mime.json
│ │ │ │ │ │ ├── hacker-newsletter-multipart-alternative.json
│ │ │ │ │ │ ├── mileageplus-mime-html-only.json
│ │ │ │ │ │ ├── node-streamtest-windows-1252.json
│ │ │ │ │ │ ├── spam-mime-html-base64-encoded.json
│ │ │ │ │ │ └── theskimm-multipart-alternative-quoted-printable.json
│ │ │ │ │ └── parseSnippet/
│ │ │ │ │ ├── finimize.html
│ │ │ │ │ ├── finimize.txt
│ │ │ │ │ ├── fittymi.html
│ │ │ │ │ ├── fittymi.txt
│ │ │ │ │ ├── mit_events.html
│ │ │ │ │ ├── mit_events.txt
│ │ │ │ │ ├── personal_capital.html
│ │ │ │ │ └── personal_capital.txt
│ │ │ │ └── Threading/
│ │ │ │ ├── remote-thread-id-no.js
│ │ │ │ ├── remote-thread-id-yes.js
│ │ │ │ ├── subject-matching-no.js
│ │ │ │ └── subject-matching-yes.js
│ │ │ ├── helpers.js
│ │ │ ├── local-sync-worker/
│ │ │ │ ├── imap-helpers-spec.es6
│ │ │ │ ├── sync-process-manager-spec.es6
│ │ │ │ ├── sync-tasks/
│ │ │ │ │ └── fetch-folder-list-spec.js
│ │ │ │ └── syncback-tasks/
│ │ │ │ └── syncback-task-spec.es6
│ │ │ ├── message-processor/
│ │ │ │ └── detect-thread-spec.js
│ │ │ └── shared/
│ │ │ └── interruptible-spec.es6
│ │ ├── src/
│ │ │ ├── local-api/
│ │ │ │ ├── decorators/
│ │ │ │ │ └── connections.js
│ │ │ │ ├── default-sync-policy.js
│ │ │ │ ├── index.js
│ │ │ │ ├── newrelic.js
│ │ │ │ ├── route-helpers.es6
│ │ │ │ ├── routes/
│ │ │ │ │ ├── auth.js
│ │ │ │ │ ├── calendars.js
│ │ │ │ │ ├── categories.js
│ │ │ │ │ ├── contacts.js
│ │ │ │ │ ├── drafts.js
│ │ │ │ │ ├── events.js
│ │ │ │ │ ├── files.js
│ │ │ │ │ ├── health.es6
│ │ │ │ │ ├── messages.js
│ │ │ │ │ ├── ping.js
│ │ │ │ │ ├── send.js
│ │ │ │ │ └── threads.js
│ │ │ │ ├── search.js
│ │ │ │ └── serialization.js
│ │ │ ├── local-sync-dashboard/
│ │ │ │ ├── dropdown.jsx
│ │ │ │ ├── elapsed-time.jsx
│ │ │ │ ├── modal.jsx
│ │ │ │ ├── root.jsx
│ │ │ │ ├── set-all-sync-policies.jsx
│ │ │ │ ├── sync-graph.jsx
│ │ │ │ └── syncback-request-details.jsx
│ │ │ ├── local-sync-worker/
│ │ │ │ ├── imap-helpers.js
│ │ │ │ ├── index.js
│ │ │ │ ├── local-sync-delta-emitter.es6
│ │ │ │ ├── newrelic.js
│ │ │ │ ├── send-task-manager.es6
│ │ │ │ ├── send-task-runner.es6
│ │ │ │ ├── sync-process-manager.es6
│ │ │ │ ├── sync-task-factory.js
│ │ │ │ ├── sync-tasks/
│ │ │ │ │ ├── fetch-folder-list.imap.es6
│ │ │ │ │ ├── fetch-messages-in-folder.imap.es6
│ │ │ │ │ ├── fetch-new-messages-in-folder.imap.es6
│ │ │ │ │ ├── fetch-specific-messages-in-folder.imap.es6
│ │ │ │ │ └── sync-task.js
│ │ │ │ ├── sync-utils.es6
│ │ │ │ ├── sync-worker.es6
│ │ │ │ ├── syncback-task-factory.js
│ │ │ │ ├── syncback-task-runner.es6
│ │ │ │ └── syncback-tasks/
│ │ │ │ ├── create-category.imap.es6
│ │ │ │ ├── delete-folder.imap.es6
│ │ │ │ ├── delete-label.imap.es6
│ │ │ │ ├── ensure-message-in-sent-folder.imap.es6
│ │ │ │ ├── mark-thread-as-read.imap.es6
│ │ │ │ ├── mark-thread-as-unread.imap.es6
│ │ │ │ ├── move-thread-to-folder.imap.es6
│ │ │ │ ├── rename-folder.imap.es6
│ │ │ │ ├── rename-label.imap.es6
│ │ │ │ ├── send-message-per-recipient.smtp.es6
│ │ │ │ ├── send-message.smtp.es6
│ │ │ │ ├── set-thread-folder-and-labels.imap.es6
│ │ │ │ ├── set-thread-labels.imap.es6
│ │ │ │ ├── star-thread.imap.es6
│ │ │ │ ├── sync-unknown-uids.imap.es6
│ │ │ │ ├── syncback-task.es6
│ │ │ │ └── unstar-thread.imap.es6
│ │ │ ├── message-processor/
│ │ │ │ ├── detect-thread.js
│ │ │ │ ├── extract-contacts.js
│ │ │ │ ├── extract-files.js
│ │ │ │ └── index.js
│ │ │ ├── models/
│ │ │ │ ├── contact.js
│ │ │ │ ├── file.js
│ │ │ │ ├── folder.es6
│ │ │ │ ├── label.js
│ │ │ │ ├── message.js
│ │ │ │ ├── messageLabel.js
│ │ │ │ ├── messageReference.js
│ │ │ │ ├── reference.js
│ │ │ │ ├── syncbackRequest.js
│ │ │ │ ├── thread.js
│ │ │ │ ├── threadFolder.js
│ │ │ │ └── threadLabel.js
│ │ │ └── shared/
│ │ │ ├── database-extensions.js
│ │ │ ├── dedupe-accounts.es6
│ │ │ ├── imap-paths-utils.js
│ │ │ ├── interruptible.js
│ │ │ ├── local-database-connector.js
│ │ │ ├── logger.es6
│ │ │ ├── shim-sequelize.es6
│ │ │ ├── stream-decoders.es6
│ │ │ ├── sync-activity.es6
│ │ │ └── transaction-connector.js
│ │ └── stylesheets/
│ │ └── index.less
│ ├── cloud-api/
│ │ ├── .gitignore
│ │ ├── README.md
│ │ ├── app.es6
│ │ ├── package.json
│ │ ├── spec/
│ │ │ ├── helpers.es6
│ │ │ ├── jasmine/
│ │ │ │ ├── execute.es6
│ │ │ │ ├── extensions.es6
│ │ │ │ └── polyfills.es6
│ │ │ ├── metatdata-spec.es6
│ │ │ └── run.es6
│ │ ├── src/
│ │ │ ├── authentication.es6
│ │ │ ├── decorators/
│ │ │ │ ├── error-format.es6
│ │ │ │ └── logger.es6
│ │ │ ├── routes/
│ │ │ │ ├── admin.es6
│ │ │ │ ├── auth.es6
│ │ │ │ ├── blobs.es6
│ │ │ │ ├── delta.es6
│ │ │ │ ├── honeycomb.es6
│ │ │ │ ├── link-tracking.es6
│ │ │ │ ├── metadata.es6
│ │ │ │ ├── open-tracking.es6
│ │ │ │ ├── ping.es6
│ │ │ │ └── static.es6
│ │ │ ├── sentry.es6
│ │ │ ├── serialization.js
│ │ │ ├── tracking-utils.es6
│ │ │ └── views/
│ │ │ ├── admin.html
│ │ │ ├── gmail-auth-failure.html
│ │ │ ├── gmail-auth-success.html
│ │ │ └── layout/
│ │ │ └── default.html
│ │ └── static/
│ │ ├── css/
│ │ │ └── index.css
│ │ └── fonts/
│ │ └── Avenir.css
│ ├── cloud-core/
│ │ ├── README.md
│ │ ├── _n1cloud_docker_launcher.sh
│ │ ├── build/
│ │ │ └── build-n1-cloud.js
│ │ ├── database-connector.es6
│ │ ├── database-extensions.js
│ │ ├── gmail-oauth-helpers.es6
│ │ ├── index.js
│ │ ├── log-streams.js
│ │ ├── logger.js
│ │ ├── migrations/
│ │ │ └── 01-expirationDate-metadata.es6
│ │ ├── models/
│ │ │ ├── cloud-job.es6
│ │ │ ├── metadata.js
│ │ │ └── pending-auth-response.js
│ │ ├── package.json
│ │ ├── pm2-debug-cloud-api.yml
│ │ ├── pm2-dev.yml
│ │ ├── pm2-prod-api.yml
│ │ ├── pm2-prod-workers.yml
│ │ ├── pubsub-connector.js
│ │ ├── scripts/
│ │ │ ├── migrate-db.es6
│ │ │ └── run-redis.sh
│ │ └── spec/
│ │ ├── jasmine/
│ │ │ ├── execute.es6
│ │ │ ├── extensions.es6
│ │ │ └── polyfills.es6
│ │ ├── logger-spec.js
│ │ └── run.es6
│ ├── cloud-workers/
│ │ ├── README.md
│ │ ├── app.es6
│ │ ├── package.json
│ │ ├── spec/
│ │ │ ├── jasmine/
│ │ │ │ ├── execute.es6
│ │ │ │ ├── extensions.es6
│ │ │ │ └── polyfills.es6
│ │ │ └── run.es6
│ │ └── src/
│ │ ├── cloud-worker.es6
│ │ ├── foreman.es6
│ │ ├── monitoring.es6
│ │ ├── sentry.es6
│ │ └── workers/
│ │ ├── send-later.es6
│ │ ├── send-reminders.es6
│ │ └── snooze.es6
│ └── isomorphic-core/
│ ├── README.md
│ ├── index.js
│ ├── package.json
│ ├── spec/
│ │ ├── backoff-scheduler-spec.es6
│ │ ├── imap-connection-pool-spec.es6
│ │ ├── jasmine/
│ │ │ ├── config.json
│ │ │ ├── execute.es6
│ │ │ ├── extensions.es6
│ │ │ └── polyfills.es6
│ │ ├── message-utils-spec.js
│ │ └── run.es6
│ └── src/
│ ├── auth-helpers.es6
│ ├── backoff-schedulers.es6
│ ├── database-types.js
│ ├── db-utils.es6
│ ├── delta-stream-builder.js
│ ├── env-helpers.es6
│ ├── errors.es6
│ ├── hook-increment-version-on-save.js
│ ├── hook-transaction-log.js
│ ├── imap-box.es6
│ ├── imap-connection-pool.es6
│ ├── imap-connection.es6
│ ├── imap-errors.es6
│ ├── load-models.js
│ ├── message-body-utils.es6
│ ├── message-utils.es6
│ ├── metrics-reporter.es6
│ ├── migrations/
│ │ └── 20160617002207-create-user.js
│ ├── model-utils.es6
│ ├── models/
│ │ ├── account-token.js
│ │ ├── account.js
│ │ └── transaction.js
│ ├── promise-utils.js
│ ├── sendmail-client.es6
│ ├── shell-utils.es6
│ ├── smtp-errors.es6
│ ├── string-utils.es6
│ ├── tls-utils.es6
│ └── tracking-utils.es6
└── scripts/
├── benchmark-initial-sync.sh
├── benchmark-new-commits.sh
├── daily.js
├── drop-data-except-accounts.sh
├── postinstall.es6
├── requirements.txt
├── run-once-per-day.sh
└── upload-benchmark-data.py
================================================
FILE CONTENTS
================================================
================================================
FILE: .babelrc
================================================
{
"presets": [
"electron",
"react"
],
"sourceMaps": "inline"
}
================================================
FILE: .coffeelint.json
================================================
{
"arrow_spacing": {
"level": "ignore"
},
"camel_case_classes": {
"level": "error"
},
"coffeescript_error": {
"level": "error"
},
"colon_assignment_spacing": {
"level": "ignore",
"spacing": {
"left": 0,
"right": 0
}
},
"cyclomatic_complexity": {
"value": 10,
"level": "ignore"
},
"duplicate_key": {
"level": "error"
},
"empty_constructor_needs_parens": {
"level": "ignore"
},
"indentation": {
"value": 2,
"level": "error"
},
"max_line_length": {
"value": 140,
"level": "error",
"limitComments": true
},
"missing_fat_arrows": {
"level": "ignore"
},
"newlines_after_classes": {
"value": 3,
"level": "ignore"
},
"no_backticks": {
"level": "error"
},
"no_debugger": {
"level": "warn"
},
"no_empty_functions": {
"level": "ignore"
},
"no_empty_param_list": {
"level": "ignore"
},
"no_implicit_braces": {
"level": "ignore",
"strict": true
},
"no_implicit_parens": {
"strict": true,
"level": "ignore"
},
"no_interpolation_in_single_quotes": {
"level": "ignore"
},
"no_plusplus": {
"level": "ignore"
},
"no_stand_alone_at": {
"level": "ignore"
},
"no_tabs": {
"level": "error"
},
"no_throwing_strings": {
"level": "error"
},
"no_trailing_semicolons": {
"level": "error"
},
"no_trailing_whitespace": {
"level": "error",
"allowed_in_comments": false,
"allowed_in_empty_lines": true
},
"no_unnecessary_double_quotes": {
"level": "ignore"
},
"no_unnecessary_fat_arrows": {
"level": "warn"
},
"non_empty_constructor_needs_parens": {
"level": "ignore"
},
"prefer_english_operator": {
"level": "ignore",
"doubleNotLevel": "ignore"
},
"space_operators": {
"level": "ignore"
},
"spacing_after_comma": {
"level": "ignore"
}
}
================================================
FILE: .dockerignore
================================================
.arc*
.git*
arclib
**/node_modules
packages/client-*
!packages/client-app/.babelrc
*.swp
*~
.DS_Store
**/npm-debug.log
**/lerna-debug.log
# Vim temp files
*.swp
*.swo
# Elastic Beanstalk Files
.elasticbeanstalk/*
!.elasticbeanstalk/*.cfg.yml
!.elasticbeanstalk/*.global.yml
/packages/client-sync/spec-saved-state.json
# Built cloud files
n1_cloud_dist
================================================
FILE: .ebextensions/enable_docker_cli_on_ssh.config
================================================
# This lets you log in via `eb ssh` and access the docker daemon.
# If we don't add the ec2-user to the docker group, then calls to docker
# (like `docker ps`) will fail with `Cannot connect to the Docker daemon`
#
# See: https://blog.cloudinvaders.com/connect-to-docker-daemon-on-aws-beanstalk-ec2-instance/
commands:
0_add_docker_group_to_ec2_user:
command: gpasswd -a ec2-user docker
test: groups ec2-user | grep -qv docker
================================================
FILE: .ebignore
================================================
.arc*
.git*
arclib/
**/node_modules/
packages/client-*
!packages/client-app/.babelrc
*.swp
*~
.DS_Store
**/npm-debug.log
**/lerna-debug.log
# Vim temp files
*.swp
*.swo
# Elastic Beanstalk Files
.elasticbeanstalk/*
!.elasticbeanstalk/*.cfg.yml
!.elasticbeanstalk/*.global.yml
/packages/client-sync/spec-saved-state.json
# Built cloud files
n1_cloud_dist/
================================================
FILE: .eslintrc
================================================
{
"parser": "babel-eslint",
"extends": "airbnb",
"globals": {
"NylasEnv": false,
"$n": false,
"waitsForPromise": false,
"advanceClock": false,
"TEST_ACCOUNT_ID": false,
"TEST_ACCOUNT_NAME": false,
"TEST_ACCOUNT_EMAIL": false,
"TEST_ACCOUNT_ALIAS_EMAIL": false
},
"env": {
"browser": true,
"node": true,
"jasmine": true
},
"rules": {
"arrow-body-style": "off",
"arrow-parens": "off",
"class-methods-use-this": "off",
"prefer-arrow-callback": ["error", {"allowNamedFunctions": true}],
"eqeqeq": ["error", "smart"],
"id-length": "off",
"object-curly-spacing": "off",
"max-len": "off",
"new-cap": ["error", {"capIsNew": false}],
"newline-per-chained-call": "off",
"no-bitwise": "off",
"no-lonely-if": "off",
"no-console": "off",
"no-continue": "off",
"no-constant-condition": "off",
"no-loop-func": "off",
"no-plusplus": "off",
"no-shadow": "error",
"no-underscore-dangle": "off",
"object-shorthand": "off",
"quotes": "off",
"quote-props": ["error", "consistent-as-needed", { "keywords": true }],
"no-param-reassign": ["error", { "props": false }],
"semi": "off",
"no-mixed-operators": "off",
"import/extensions": ["error", "never", { "json": "always" }],
"import/no-unresolved": ["error", {"ignore": ["nylas-exports", "nylas-component-kit", "electron", "nylas-store", "react-dom/server", "nylas-observables", "windows-shortcuts", "moment-round", "better-sqlite3", "chrono-node", "event-kit", "enzyme", "isomorphic-core"]}],
"import/no-extraneous-dependencies": "off",
"import/newline-after-import": "off",
"import/prefer-default-export": "off",
"react/no-multi-comp": "off",
"react/no-find-dom-node": "off",
"react/no-string-refs": "off",
"react/no-unused-prop-types": "off",
"react/forbid-prop-types": "off",
"jsx-a11y/no-static-element-interactions": "off",
"react/prop-types": ["error", {"ignore": ["children"]}],
"react/sort-comp": "error",
"no-restricted-syntax": [
"error", "ForInStatement", "LabeledStatement", "WithStatement"
],
"comma-dangle": ["error", {
"arrays": "always-multiline",
"objects": "always-multiline",
"imports": "always-multiline",
"exports": "always-multiline",
"functions": "ignore"
}],
"no-useless-return": "off"
},
"settings": {
"import/core-modules": [ "nylas-exports", "nylas-component-kit", "electron", "nylas-store", "nylas-observables" ],
"import/resolver": {"node": {"extensions": [".es6", ".jsx", ".coffee", ".json", ".cjsx", ".js"]}}
}
}
================================================
FILE: .gitignore
================================================
##### Elastic Beanstalk Files
.elasticbeanstalk/*
!.elasticbeanstalk/*.cfg.yml
!.elasticbeanstalk/*.global.yml
##### Arcanist / Phab
**/.arcconfig
**/.arclint
**/arclib
##### Node modules
node_modules
!packages/client-app/spec/fixtures/packages/package-with-incompatible-native-module/node_modules
**/npm-debug.log*
**/lerna-debug.log*
##### Certs for building
**/build/resources/certs
##### Misc swap files
**/*.swp
**/*.swo
**/*~
**/*#
**/.DS_Store
**/Thumbs.db
**/#emacs
# Built cloud files
n1_cloud_dist
# Built Nylas Mail client
packages/client-app/dist
# Tests
spec-saved-state.json
# Symlinked Jasmine config files
**/jasmine/config.json
!packages/isomorphic-core/spec/jasmine/config.json
# Symlinked isomorphic-core Specs
packages/client-app/spec/isomorphic-core
# Elastic Beanstalk Files
.elasticbeanstalk/*
!.elasticbeanstalk/*.cfg.yml
!.elasticbeanstalk/*.global.yml
# Sqlite amalgamation for scripts
scripts/sqlite
# Scripts for calculating statistics
scripts/toolbox
scripts/venv
# Python
*.pyc
# OAuth client secret for talking to Google Sheets
client_secret.json
/packages/client-app/internal_packages/client-sync
================================================
FILE: .travis.yml
================================================
# The private Nylas monorepo build script. This will build a full signed
# release for the Nylas Mail client
sudo: false
addons:
apt:
sources:
- ubuntu-toolchain-r-test
packages:
- build-essential
- clang
- fakeroot
- g++-4.8
- git
- libgnome-keyring-dev
- xvfb
- rpm
- libxext-dev
- libxtst-dev
- libxkbfile-dev
branches:
only:
- master
- /ci-.*/
- /stable.*/
matrix:
include:
- os: linux
env: NODE_VERSION=6.9 CC=gcc-4.8 CXX=g++-4.8 DEBUG="electron-packager:*" INSTALL_TARGET=client
- os: osx
env: NODE_VERSION=6.9 CC=clang CXX=clang++ DEBUG="electron-packager:*" INSTALL_TARGET=client
install:
- git clone https://github.com/creationix/nvm.git /tmp/.nvm
- source /tmp/.nvm/nvm.sh
- nvm install $NODE_VERSION
- nvm use --delete-prefix $NODE_VERSION
script:
- npm install && npm run build-client
cache:
directories:
- node_modules
- apm/node_modules
================================================
FILE: Dockerfile
================================================
# This Dockerfile builds a production-ready image of K2 to be used across all
# services. See the Dockerfile documentation here:
# https://docs.docker.com/engine/reference/builder/
# Use the latest Node 6 base docker image
# https://github.com/nodejs/docker-node
FROM node:6
ENV INSTALL_TARGET=cloud
# Copy everything (excluding what's in .dockerignore) into an empty dir
COPY . /home
WORKDIR /home
# This installs global dependencies, then in the postinstall script, runs lerna
# bootstrap to install and link cloud-api, cloud-core, and cloud-workers.
# We need the --unsafe-perm param to run the postinstall script since Docker
# will run everything as sudo
RUN npm install --unsafe-perm
# This uses babel to compile any es6 to stock js for plain node
RUN node packages/cloud-core/build/build-n1-cloud
# External services run on port 80. Expose it.
EXPOSE 5100
# We use a start-aws command that automatically spawns the correct process
# based on environmpackages/cloud-coreent variables (which changes instance to instance)
CMD packages/cloud-core/_n1cloud_docker_launcher.sh ${AWS_SERVICE_NAME}
================================================
FILE: ISSUE_TEMPLATE.md
================================================
##### IMPORTANT: Nylas Mail is no longer maintained
Nylas Mail is no longer maintained by Nylas - nobody will read or respond to issues filed here.
This issue tracker is being kept online because many existing issues contain valuable tips
and information.
If you're looking for an alternative to Nylas Mail, check out https://getmailspring.com/.
It is based on the Nylas Mail source code, maintained by one of the original developers,
and features an entirely re-written sync engine.
================================================
FILE: LICENSE.md
================================================
MIT License
Copyright (c) 2017 Nylas, Inc.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: README.md
================================================
# Nylas Mail - the open-source, extensible mail client

**Nylas Mail was an open-source mail client built on the modern web with [Electron](https://github.com/atom/electron), [React](https://facebook.github.io/react/), and [Flux](https://facebook.github.io/flux/).** It was designed to be easy to extend, and many third-party plugins are available that add functionality to the client.
**⚠️ Nylas Mail was initially released and open-sourced in early 2015 and was maintained by Nylas until Spring 2017.** While Nylas no longer supports Nylas Mail, you can download the latest release or build it from source. There are also **[several forks](#forks)** that are being actively developed and maintained.
# Getting Started
## Setup your Environment (Mac):
1. Install [Homebrew](http://brew.sh/)
1. Install [NVM](https://github.com/creationix/nvm) & Redis `brew install nvm redis`
1. Install Node 6 via NVM: `nvm install 6`
1. `npm install`
## Setup your Environment (Linux - Debian/Ubuntu):
1. Install Node 6+ via NodeSource (trusted):
1. `curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -`
1. `sudo apt-get install -y nodejs`
1. Install Redis locally `sudo apt-get install -y redis-server redis-tools`
benefit of letting us use subdomains.
1. `npm install`
## Running Nylas Mail
1. `npm run client`: Starts the app
1. `npm run test-client`: Run the tests
1. `npm run lint-client`: Lint the source (ESLint + Coffeelint + LESSLint)
### Exploring the Source
This repository contains the full source code to the Nylas Mail client and it's backend services. It is divided into the following packages:
1. [**Isomorphic Core**](https://github.com/nylas/nylas-mail/tree/master/packages/isomorphic-core): Shared code across local client and cloud servers
1. [**Client App**](https://github.com/nylas/nylas-mail/tree/master/packages/client-app): The main Electron app for Nylas Mail
mirrored to open source repo.
1. [**Client Sync**](https://github.com/nylas/nylas-mail/tree/master/packages/client-sync): The local mailsync engine integreated in Nylas Mail
1. [**Client Private Plugins**](https://github.com/nylas/nylas-mail/tree/master/packages/client-private-plugins): Private Nylas Mail plugins (like SFDC)
1. [**Cloud API**](https://github.com/nylas/nylas-mail/tree/master/packages/cloud-api): The cloud-based auth and metadata APIs for N1
1. [**Cloud Core**](https://github.com/nylas/nylas-mail/tree/master/packages/cloud-core): Shared code used in all remote cloud services
1. [**Cloud Workers**](https://github.com/nylas/nylas-mail/tree/master/packages/cloud-workers): Cloud workers for services like send later
See `/packages` for the separate pieces. Each folder in `/packages` is
designed to be its own stand-alone repository. They are all bundled here
for the ease of source control management.
## Digging Deeper
In early 2016, the Nylas Mail team wrote [extensive documentation](https://nylas.github.io/nylas-mail/) for the app that was intended for plugin developers. This documentation lives on GitHub Pages and offers a great overview of the app's architecture and important classes. Here are some good places to get started:
- [Application Architecture](https://nylas.github.io/nylas-mail/guides/Architecture.html)
- [Debugging Nylas Mail](https://nylas.github.io/nylas-mail/guides/Debugging.html)
The team has also given conference talks and published blog posts about the client:
- [ReactEurope: How React & Flux Turn Apps Into Extensible Platforms](https://www.youtube.com/watch?v=Uu4Yz2HmCgE)
- [ForwardJS: Electron, React & Pixel Perfect Experiences](https://www.youtube.com/watch?v=jRPUB-D1Wx0&list=PL7i8CwZBnlf7iUTn2JMVLLWofAhaiK7l3)
- [Blog: Splitting from Atom](https://github.com/nylas/nylas-mail/raw/master/blog-posts/splitting-from-atom.pdf)
- [Blog: Building Plugins for React Apps](https://github.com/nylas/nylas-mail/raw/master/blog-posts/plugins.pdf)
- [Blog: Nylas Mail Build Process](https://github.com/nylas/nylas-mail/raw/master/blog-posts/build-process.pdf)
- [Blog: Low level Electron Debugging](https://github.com/nylas/nylas-mail/raw/master/blog-posts/electron-debugging.pdf)
- [Blog: A New Search Parser](https://github.com/nylas/nylas-mail/raw/master/blog-posts/search-parser.pdf)
- [Blog: Developers Guide to Emoji](https://github.com/nylas/nylas-mail/raw/master/blog-posts/emoji.pdf)
- [Blog: Nylas Pro](https://github.com/nylas/nylas-mail/raw/master/blog-posts/nylas-pro.pdf)
- [Blog: Nylas Mail & PGP](https://github.com/nylas/nylas-mail/raw/master/blog-posts/pgp.pdf)
- [Blog: Calendar Events and RRULEs](https://github.com/nylas/nylas-mail/raw/master/blog-posts/rrules.pdf)
## Running the Cloud
When you download and build Nylas Mail from source it runs without its cloud components. The concept of a "Nylas ID" / subscription has been removed, and plugins that require server-side processing are disabled by default. (Plugins like Snooze, Send Later, etc.)
In order to use these plugins and get the full Nylas Mail experience, you need to deploy the backend infrastructure located in the `cloud-*` packages. Deploying these services is challenging because they are implemented as microservices and designed to be run at enterprise scale with Redis, Postgres, etc. Because these backend services must access your email account, it is also important to use security best-practices (at the very least, SSL, encryption at rest, and a partitioned VPC). For more information about building and deploying this part of the stack, check out the [cloud-core README](https://github.com/nylas/nylas-mail/blob/master/packages/cloud-core/README.md).
## Themes
The Nylas Mail user interface is styled using CSS, which means it's easy to modify and extend. Nylas Mail comes stock with a few beautiful themes, and there are many more which have been built by community developers

#### Bundled Themes
- [Dark](https://github.com/nylas/nylas-mail/tree/master/packages/client-app/internal_packages/ui-dark)
- [Darkside](https://github.com/nylas/nylas-mail/tree/master/packages/client-app/internal_packages/ui-darkside) (designed by [Jamie Wilson](https://github.com/jamiewilson))
- [Taiga](https://github.com/nylas/nylas-mail/tree/master/packages/client-app/internal_packages/ui-taiga) (designed by [Noah Buscher](https://github.com/noahbuscher))
- [Ubuntu](https://github.com/nylas/nylas-mail/tree/master/packages/client-app/internal_packages/ui-ubuntu) (designed by [Ahmed Elhanafy](https://github.com/ahmedlhanafy))
- [Less Is More](https://github.com/nylas/nylas-mail/tree/master/packages/client-app/internal_packages/ui-less-is-more) (designed by [Alexander Adkins](https://github.com/P0WW0W))
#### Community Themes
| | | |
| ----- | ----- | ----- |
| [ToogaBooga](https://github.com/brycedorn/N1-ToogaBooga) | [Material](https://github.com/jackiehluo/n1-material) | [Monokai](https://github.com/dcondrey/n1-monokai) |
| [Agapanthus](https://github.com/taniadaniela/n1-agapanthus)—Inbox-inspired theme | [Stripe](https://github.com/oeaeee/n1-stripe)| [Kleinstein](https://github.com/diklein/Kleinstein)—Hides account sidebar|
| [Arc Dark](https://github.com/varlesh/Nylas-Arc-Dark-Theme)| [Solarized Dark](https://github.com/NSHenry/N1-Solarized-Dark) | [Darkish](https://github.com/dyrnade/N1-Darkish)|
| [Predawn](https://github.com/adambmedia/N1-Predawn)| [Ido](https://github.com/edipox/n1-ido)—Polymail-inspired theme|[Berend](https://github.com/Frique/N1-Berend) |
| [ElementaryOS](https://github.com/edipox/elementary-nylas) | [LevelUp](https://github.com/stolinski/level-up-nylas-n1-theme)|[Sunrise](https://github.com/jackiehluo/n1-sunrise) |
| [BoraBora](https://github.com/arimai/N1-BoraBora) | [Honeyduke](https://github.com/arimai/n1-honeyduke)| [Snow](https://github.com/Wattenberger/N1-snow-theme)|
|[Hull](https://github.com/unity/n1-hull)|[Express](https://github.com/oeaeee/n1-express)|[DarkSoda](https://github.com/adambullmer/N1-theme-DarkSoda)|
|[Bemind](https://github.com/bemindinteractive/Bemind-N1-Theme)|[Dracula](https://github.com/dracula/nylas-n1)|[MouseEatsCat](https://github.com/MouseEatsCat/MouseEatsCat-N1)|
|[Sublime Dark](https://github.com/rishabhkesarwani/Nylas-Sublime-Dark-Theme)|[Firefox](https://github.com/darshandsoni/n1-firefox-theme)|[Gmail](https://github.com/dregitsky/n1-gmail-theme)|
#### To install community themes:
1. Download and unzip the repo
2. In Nylas Mail, select `Developer > Install a Package Manually... `
3. Navigate to where you downloaded the theme and select the root folder. The theme is copied into the `~/.nylas-mail` folder for your convinence
5. Select `Change Theme...` from the top level menu, and you'll see the newly installed theme. That's it!
Want to dive in more? Try [creating your own theme](https://github.com/nylas/nylas-mail-theme-starter)!
## Plugins
Some plugins come pre-installed, and are a great starting points for creating your own:
- [Translate](https://github.com/nylas/nylas-mail/tree/master/packages/client-app/internal_packages/composer-translate)—Works with 10 languages
- [Quick Replies](https://github.com/nylas/nylas-mail/tree/master/packages/client-app/internal_packages/composer-templates)—Send emails faster with templates
- [Emoji Keyboard](https://github.com/nylas/nylas-mail/tree/master/packages/client-app/internal_packages/composer-emoji)—Insert emoji by typing a colon (:) followed by the name of an emoji symbol
- [GitHub Sidebar Info](https://github.com/nylas/nylas-mail/tree/master/packages/client-app/internal_packages/github-contact-card)
- [View on GitHub](https://github.com/nylas/nylas-mail/tree/master/packages/client-app/internal_packages/message-view-on-github)
- [Personal Level Indicators](https://github.com/nylas/nylas-mail/tree/master/packages/client-app/internal_packages/personal-level-indicators)
- [Phishing Detection](https://github.com/nylas/nylas-mail/tree/master/packages/client-app/internal_packages/phishing-detection)
#### Community Plugins
Note these are not tested or officially supported by Nylas, but we still think they are really cool! If you find bugs with them, please open GitHub issues on their individual project pages, not the Nylas Mail (N1) repo page. Thanks!
| | | |
| ----- | ----- | ----- |
|[Jiffy](http://noahbuscher.github.io/N1-Jiffy/)—Insert animated GIFs|[Weather](https://github.com/jackiehluo/n1-weather)|[Todoist](https://github.com/alexfruehwirth/N1TodoistIntegration)|
|[Unsubscribe](https://github.com/colinking/n1-unsubscribe)|[Squirt Speed Reader](https://github.com/HarleyKwyn/squirt-reader-N1-plugin/)|[Website Launcher](https://github.com/adriangrantdotorg/nylas-n1-background-webpage)—Opens a URL in separate window|
|[Cypher](https://github.com/mbilker/cypher)—PGP Encryption|[Avatars](https://github.com/unity/n1-avatars)|[Events Calendar (WIP)](https://github.com/nerdenough/n1-events-calendar)|
|[Mail in Chat (WIP)](https://github.com/yjchen/mail_in_chat)|[Evernote](https://github.com/grobgl/n1-evernote)|[Wunderlist](https://github.com/miguelrs/n1-wunderlist)|
|[Participants Display](https://github.com/kbruccoleri/nylas-participants-display)|[GitHub](https://github.com/ForbesLindesay/N1-GitHub)||
When you install packages, they're moved to ~/.nylas-mail/packages, and Nylas Mail runs apm install on the command line to fetch dependencies listed in the package's package.json
# Forks
There are several forks of Nylas Mail that you should check out. If you're just learning about Nylas Mail, it is highly recommended you use one of these instead.
- [Mailspring](http://www.getmailspring.com/) - Significant rewrite by one of the original authors focused on performance and cloud plugins
- [Nylas Mail Lives](https://github.com/nylas-mail-lives/nylas-mail) - Community effort to fix bugs and improve the client! (Seeking Maintainers)
================================================
FILE: appveyor.yml
================================================
version: '{build}'
branches:
only:
- master
- /ci.*/
- /stable.*/
# We need to only clone the main module because our submodule requires the
# encrypted ssh key to access submodules
install:
- ps: Install-Product node $env:NODE_VERSION
- ps: nuget install secure-file -ExcludeVersion
- ps: npm config set msvs_version 2013
build_script:
- cmd: npm install
deploy_script:
- ps: |
npm run build-client
environment:
matrix:
- NODE_VERSION: 6.9
global:
DEBUG: "electron-windows-installer:*,electron-packager:*"
SIGN_BUILD: true
INSTALL_TARGET: "client"
CERTIFICATE_FILE: .\packages\client-private-plugins\encrypted_certificates\appveyor\win-nylas-n1.p12
DECRYPTION_PASSWORD:
secure: 48VSzDtdBd52Xlo3TZ1NeR1yRRrZ3AU6Px5XjD5RDp44cFU5GYVspecGqX6DGCV7i0D7nldGMyEbXNrjM1t1Kw==
cache:
- node_modules -> package.json
- packages\client-app\node_modules -> packages\client-app\package.json
- '%USERPROFILE%\.npm'
================================================
FILE: lerna.json
================================================
{
"lerna": "2.0.0-beta.38",
"version": "0.0.1"
}
================================================
FILE: package.json
================================================
{
"name": "nylas-mail-all",
"version": "0.0.1",
"description": "All components required to run Nylas Mail",
"devDependencies": {
"babel-cli": "6.x.x",
"babel-core": "6.x.x",
"babel-eslint": "7.1.0",
"babel-preset-electron": "1.4.15",
"babel-preset-react": "6.x.x",
"chalk": "1.x.x",
"coffeelint-cjsx": "2.x.x",
"commander": "^2.9.0",
"electron-installer-dmg": "0.2.x",
"electron-packager": "8.4.x",
"electron-winstaller": "2.x.x",
"eslint": "3.10.1",
"eslint-config-airbnb": "13.0.0",
"eslint-plugin-import": "2.2.0",
"eslint-plugin-jsx-a11y": "2.2.3",
"eslint-plugin-react": "6.7.1",
"eslint_d": "4.2.0",
"fs-extra": "2.x.x",
"fs-plus": "2.x.x",
"glob": "7.x.x",
"grunt": "0.4.x",
"grunt-cli": "0.1.x",
"grunt-coffeelint": "git+https://github.com/atom/grunt-coffeelint.git#cfb99aa99811d52687969532bd5a98011ed95bfe",
"grunt-coffeelint-cjsx": "0.1.x",
"grunt-contrib-coffee": "0.12.x",
"grunt-contrib-csslint": "0.5.x",
"grunt-contrib-less": "0.8.x",
"grunt-lesslint": "0.13.x",
"jasmine": "2.x.x",
"lerna": "emorikawa/lerna#v2.0.0-beta.38.forked",
"load-grunt-parent-tasks": "0.1.1",
"mkdirp": "^0.5.1",
"pm2": "2.4.0",
"request": "2.x.x",
"s3": "4.x.x",
"temp": "0.8.x",
"underscore": "1.8.x"
},
"scripts": {
"start": "npm run client",
"test": "npm run test-client && npm run test-cloud",
"client": "packages/client-app/node_modules/.bin/electron packages/client-app --enable-logging --dev",
"benchmark": "packages/client-app/node_modules/.bin/electron packages/client-app --enable-logging --dev --benchmark",
"test-client": "packages/client-app/node_modules/.bin/electron packages/client-app --enable-logging --test",
"test-client-window": "packages/client-app/node_modules/.bin/electron packages/client-app --enable-logging --test=window",
"test-client-junit": "",
"lint-client": "grunt lint --gruntfile=packages/client-app/build/Gruntfile.js --base=./",
"build-client": "grunt build-client --gruntfile=packages/client-app/build/Gruntfile.js --base=./",
"cloud": "pm2 stop all; pm2 delete all; pm2 start packages/cloud-core/pm2-dev.yml --no-daemon",
"cloud-debug": "pm2 stop all; pm2 delete all; pm2 start packages/cloud-core/pm2-debug-cloud-api.yml --no-daemon",
"test-cloud": "cd packages/cloud-api && npm test && cd ../cloud-core && npm test && cd ../cloud-workers && npm test && cd ../isomorphic-core && npm test",
"stop": "npm run stop-cloud",
"stop-cloud": "pm2 stop all; pm2 delete all;",
"build-cloud": "docker build .",
"postinstall": "babel-node scripts/postinstall.es6",
"daily": "babel-node scripts/daily.js"
},
"repository": {
"type": "git",
"url": "git+https://github.com/nylas/nylas-mail-all.git"
},
"author": "Nylas",
"license": "proprietary",
"engines": {
"node": "6.9.1",
"npm": "3.10.8"
}
}
================================================
FILE: packages/README.md
================================================
# Monorepo Packages
Each folder here is designed to act as its own repository. For development
convenience, they are all included here in one monorepo. This allows us to grep
across multiple codebases, not use submodules, and keep a unified commit
history.
We use [Lerna](https://github.com/lerna/lerna) to manage the monorepo and tie
them all together with the main `nylas-mail-all/scripts/postinstall.es6` script,
which in turn, calls `lerna bootstrap`
================================================
FILE: packages/client-app/.babelrc
================================================
{
"presets": [
"electron",
"react"
],
"sourceMaps": "inline"
}
================================================
FILE: packages/client-app/.travis.yml
================================================
# The open source Nylas Mail Client for Linux and Mac. See AppVeyor for
# Windows
sudo: false
addons:
apt:
sources:
- ubuntu-toolchain-r-test
packages:
- build-essential
- clang
- fakeroot
- g++-4.8
- git
- libgnome-keyring-dev
- xvfb
- rpm
- libxext-dev
- libxtst-dev
- libxkbfile-dev
branches:
only:
- master
- /ci-.*/
- /stable.*/
matrix:
include:
- os: linux
env: NODE_VERSION=6.9 CC=gcc-4.8 CXX=g++-4.8
- os: osx
env: NODE_VERSION=6.9 CC=clang CXX=clang++
install:
- git clone https://github.com/creationix/nvm.git /tmp/.nvm
- source /tmp/.nvm/nvm.sh
- nvm install $NODE_VERSION
- nvm use --delete-prefix $NODE_VERSION
before_script:
- if [ "${TRAVIS_OS_NAME}" == "linux" ]; then
export DISPLAY=:99.0;
sh -e /etc/init.d/xvfb start;
fi
script:
- npm install && npm test
cache:
directories:
- node_modules
- apm/node_modules
================================================
FILE: packages/client-app/.watchmanconfig
================================================
{
"ignore_dirs": [
"build/node_modules",
"apm/node_modules",
"node_modules",
"src/K2/node_modules",
"src/K2/packages/local-sync/node_modules",
"src/K2/packages/isomorphic-core/node_modules",
"src/K2/packages/cloud-api/node_modules",
"src/K2/packages/cloud-workers/node_modules",
"src/K2/packages/cloud-core/node_modules"
]
}
================================================
FILE: packages/client-app/CHANGELOG.md
================================================
# Nylas Mail Changelog
### 2.0.32 (5/1/2017)
+ Remove unnecessary tracking events
### 2.0.31 (4/28/2017)
- Fixes:
+ Fix invalid credentials error when sending on Gmail. This error will happen
sporadically, and was introduced in version 2.0.28
### 2.0.28 (4/26/2017)
- Fixes:
+ Fix send later with open/link tracking
### 2.0.27 (4/26/2017)
- Fixes:
+ Don't throw error when search query has trailing whitespace
### 2.0.26 (4/26/2017)
- Fixes:
+ Fix self-triggering in open and link tracking
+ Speed up sending per recipient
+ Fix open and link tracking when sending per recipient
- Development:
+ Consolidate TrackingUtils & better documentation
### 2.0.23 (4/25/2017)
- Fixes:
+ Properly retry retryable errors in syncback tasks
### 2.0.21 (4/24/2017)
- Fixes:
+ Fix throwing errors inside Interruptible
+ Fix sending on Gmail with large attachments (caused by conflict with syncing
sent folder)
+ Increment max size for attachments
### 2.0.20 (4/24/2017)
- Fixes:
+ Correctly pass connSettings to convertSmtpError
+ Fix attachment previews
+ Fix link editor jumping away from you in composer
+ Fix certificate error msg
+ Detect smtp cert errors and relax condition to detect them
### 2.0.19 (4/21/2017)
- Features:
+ Allow users to select custom folder mappings for Sent and Trash folders
+ Move messages out of db into compressed flat files for better space
efficiency
- Performance:
+ 10x speed improvement for sending messages
+ Improve performance of all syncback tasks by 500ms
- Fixes:
+ Correctly cleanup orphaned messages during sync
- Development:
+ Refactor sending code and remove cruft
+ Fix the specs
### 2.0.18 (4/21/2017)
- Fixes:
+ Correctly track all auth errors & correlate to email
+ Add more IMAP provider settings from Mozilla's ISPDB
+ Allow bypassing of invalid certificates during authentication
+ Don't double report auth errors
### 2.0.17 (4/19/2017)
- Fixes:
+ Record auth error location to Mixpanel
+ Show proper auth error messages to users
+ Correctly identify more certificate errors
+ Fix offline notification behind proxies
+ Fix attachment filename encodings
- Development
+ Prevent from running daily when untracked files present in working dir
+ Fixup auth helpers
### 2.0.16 (4/18/2017)
- Fixes:
+ Better handling of startup errors
+ Fix occasional EPERM issues on boot on Windows
+ Reduce CPU limits for historical sync
+ Fix search parser to handle nested queries properly
+ Update copy that still referenced N1 to Nylas Mail
- Development:
+ Fix benchmark mode
### 2.0.15 (4/17/2017)
+ Correctly handle and inform users about database malformed errors that can
occur both in main process and/or window processes
### 2.0.14 (4/14/2017)
- Fixes:
+ Prevent from adding duplicate accounts and sync workers due to account id changes
+ Correctly remove sync worker reference when destroying it
+ Correctly initialize SyncProcessManager with Identity
+ Fix contact ranking runtime error
### 2.0.13 (4/13/2017)
- Fixes:
+ Upload nupkg with correct name for win32 autoupdater to work
+ Correctly handle window.unhandledrejection events
### 2.0.12 (4/13/2017)
- Fixes:
+ Prevent NM from overwriting N1 binary on windows
+ Fix runtime error in sync process
+ Prevent old N1 config from getting wiped when installing Nylas Mail
- Development:
+ Remove useless docs
### 2.0.11 (4/12/2017)
- Fixes:
+ Dispose of mail listener connection before getting new one. This will
prevent sync process from leaking Imap connections and getting stuck.
+ Fix performance regression when polling for gmail attribute changes
+ Don't double report unhandled rejections
+ Fix unhandled rejection handling (fix ipc parse error)
+ Fix regression when processing messages under a transaction
+ Rate limit database malformed error reports to sentry
### 2.0.10 (4/11/2017)
- Fixes:
+ Fix missing UID error when archiving threads after sending
+ Ensure all mail folder exists before trying to access it
+ Fix SyncbackMetadataTask dependency
- Development:
+ Don't report stuck sync processes to Sentry
+ MessageFactory -> MessageUtils, SendUtils -> ModelUtils
### 2.0.9 (4/11/2017)
- Features:
+ Re-add imap to the onboarding accounts page
- Fixes:
+ Correctly detect changes in labels, starred and unread for Gmail accounts
+ Fix delta streaming connection retries
+ Handle weird MIME edge case with @ symbol
- Performance:
+ Wrap message processing in transaction for better performance
+ Increase sqlite `page_size` and `cache_size`
- Cloud:
+ Improve performance of reminders worker
+ Add DataDog StatsD for heartbeats
+ Restart automatically on unhandeld rejections
- Development:
+ Add benchmark mode
### 2.0.8 (4/7/2017)
- Fixes:
+ Revamp SSL options during authentication to be able to properly auth against
SMTP and prevent sending failures
+ Ensure IMAPConnnectionPool uses updated account credentials
+ Always fetch and update identity regardless of environment
+ Properly handle serialization errors for JSON columns in database
- Cloud:
+ Switch MySQL charset to utf8mb4
+ Add exponential backoff for cloud worker jobs when encountering errors
+ Use IMAP connection pool in cloud workers to limit number of connections
+ Properly generate metadata deltas when clearing expiration field
+ Increment default imap connection socket timeout in cloud workers
- Plugins:
+ Correctly syncback metadata for send later
+ Delete drafts after they are sent later
+ Correctly ensure messages in sent folder for send later in gmail
+ Fix send reminders version conflict error
+ Correctly set metadata values for send reminders
+ Fix imap folder names in send-reminders
+ Fix send later access token refresh
- Development:
+ Add view of CloudJobs in n1.nylas.com/admin
+ Ensure daily script grabs current version after pulling latest changes
### 2.0.1 (4/5/2017)
- Features:
+ Limit search to focused perspective
- Fixes:
+ IMAPConnectionPool now correctly disposes connections
+ Ensure we use refreshed access token for all imap connections during sync
+ Prevent IMAP connection leaking in sync worker
+ Fix send later button saving state and sending action
+ Fix inline images for send later
+ Correctly enable plugins on 2.0.1
+ Make sure app can update even after signing out of NylasID
+ Don't make any requests when NylasID isn't present
- Cloud:
+ Make cloud workers more robust
+ Remove old SignalFX reporter & add docs
+ Log errors according to bunyan specs
- Development:
+ Add script to run benchmarks once per day at specified time
+ Add script to upload benchmark data to Google Sheets
+ Add better logging when restarting stuck sync worker
### 2.0.0 (4/4/2017)
Introducing Nylas Mail Pro
- Features:
+ Enable snooze, send later, and send reminders
+ Add feature limits to reminders and send later
- Fixes
+ Don't assign duplicate folder roles
+ Re-setup IdentityStore in new window
- Development:
+ Fix sqlite build for older versions of clang
+ Remove rogue scripts-tmp folder
+ Remove unecessary db setup for mail rules
### 1.0.55 (3/31/2017)
- Fixes
+ Ensure open/link tracking work when sending multiple consecutive emails
+ Fix performance of contact rankings database query
+ Fix performance of thread search index database queries
+ Fix performance of ANALYZE queries
### 1.0.54 (3/31/2017)
- Features:
+ Add search support for `has:attachment`
- Fixes:
+ Reduce database thrashing caused by thread search indexing
+ Interrupt long-running syncback tasks
+ Fix performance of contact rankings db query
+ Don't hit contact rankings endpoint until account is ready
+ Ensure sync worker is stopped correctly when removing accounts or when
restarting it
- Metrics:
+ Report metrics about SyncbackTask runs
- Perf:
+ Delay building new hot window to improve win perf
- Development:
+ Add script to benchmarks new commits
+ Add DEBUG flag to be able to log all query activity for both databases
+ Add `DatabaseStore.write` which doesn't use Transactions
+ Metadata test fixes
### 1.0.52 (3/29/2017)
- Fixes:
+ Fix open and link tracking:
+ No longer triggers your own opens & link clicks
+ Link tracking indicator is now always present in sent messages
+ Fix regression in DB query execution which would delay all queries in the
system.
+ Reduce max retry backoff for DB queries, which could hold a query open for
too long
+ Fix thread reindexing issues, which should help performance and correctly
index threads for search
+ Fix `in:` search syntax for non-gmail search
+ Fix references to RetryableError imports
- Development:
+ Add initial sync benchmarking script
+ Clean up logging in DatabaseStore: differentiate background queries from
regular queries in the logs, only log queries that actually take more than
100ms.
+ Point the billing server URL to staging by default for easier development,
and allow it to be overriden
+ Add index to expiration field on Metadata
### 1.0.51 (3/28/2017)
- Features:
+ Restore contact rankings feature for better contact predictions in composer
recipient fields
- Fixes:
+ Correctly listen for new mail in between sync loops
+ Verify SMTP credentials in /auth endpoint
+ Also prioritize sent label for initial Gmail sync
+ Properly relaunch windows on autoupdate
+ Properly set up local /health endpoint by making sure to attach route files
ending in .es6 to local-api
- Perf:
+ Don't throttle while syncing first 500 threads
- Metrics:
+ Report battery state changes to Mixpanel
- Development:
+ Make deploy-it say what it's doing instead of hanging silently
+ Make deploy-it print link to the EB console
+ Make help message better on deploy-it
+ Add `SHOW_HOT_WINDOW` env for prod debugging of window launches
+ Correctly ignore `node_modules` in .ebignore for faster deploys
+ Only bootstrap specific pkgs in postinstall for faster npm installs
### 1.0.50 (3/28/2017)
- Fixes:
+ Fix SyncActivity errors introduced in 1.0.49
### 1.0.49 (3/27/2017)
- Fixes:
+ Ensure sync process does not get stuck
+ Ensure the worker window is always available
+ Retry database operations when encountering locking issues
- Metrics:
+ Detect and report when the worker window is unavailable
+ Detect and report when a sync process is stuck
- Development:
+ Windows autoupdater fixes
+ Add better documentation for windows autoupdater
+ Remap windows dev shortcuts to match the ones used on darwin and linux
+ When building app, only re-install for optional dependencies on darwin
- Cloud:
+ Timeout streaming API connections every 15 minutes
+ Add missing database indexes from SQL review
### 1.0.48 (3/27/2017)
- Fixes:
+ Reindex threads when they're updated
+ Don't try to restart sync on every IdentityStore change
+ Correctly remove inline images with x button
### 1.0.47 (3/23/2017)
- Fixes:
+ Report hard crashes using Electron's built-in crash reporter
- Development:
+ Don't handle IMAP timeouts in the connection pool
+ Record file download times
### 1.0.46 (3/22/2017)
- Fixes:
+ Ensure files get transferred in forwarded messages
+ Correctly sign out of NylasID
+ Don't report non-reportable errors in delta connection
+ Fix S3 attachment upload for send later
- Development:
+ Rename downloadDataForFile(s) -> getDownloadDataForFile(s)
+ Switch type of Metadata value column
+ Fix build condition
+ Fix DraftFactory specs
+ Refactor sync worker IMAPConnectionPool callbacks
### 1.0.45 (3/21/2017)
- Fixes:
+ Correctly report unhandled errors caught in window.
+ Fix passing cursor to delta streams
### 1.0.44 (3/20/2017)
- Fixes:
+ Add error handling when creating syncback requests
+ Fix path for tmp dir in daily script
### 1.0.43 (3/17/2017)
- Fixes:
+ Revert nodemailer to previous version
+ Creating a folder no longer creates a non-existent duplicate subfolder
+ Don't bump threads to the top of list when a message is sent: only update lastReceivedDate if the message was actually received
### 1.0.42 (3/16/2017)
- Fixes:
+ Fix spellchecker regression (Don't exclude source maps in build)
### 1.0.41 (3/16/2017)
- Development:
+ Upgrade nodemailer to latest version
### 1.0.40 (3/15/2017)
- Features:
+ Add support for attachments in send later
- Development:
+ Improve build time
+ Windows Autoupdater fixes
### 1.0.39 (3/14/2017)
- Fixes:
+ Fix missing depedency for imap-provider-settings
- Development:
+ Only upload 7 characters of the commit hash for Windows build
### 1.0.38 (3/13/2017)
- Fixes:
+ Restart sync when computer awakes from sleep
+ Fix issue that made users log out of NylasID, restart, and then force them to log out and restart again in a loop (#3325)
+ Don't start sync or delta connections without an identity
- Development:
+ Restore windows build
+ Remove specs from production build
+ Fix arc lint
+ Specify Content-Type in developer bar curl commands
### 1.0.37 (3/10/2017)
- Fixes:
+ Fix regression introduced in 1.0.36 in the message processor
+ Correctly show auth error when we can't connect to n1cloud
+ Fix error thrown sometimes when handling send errors
### 1.0.36 (3/10/2017)
- Fixes:
+ Increase the IMAP connection pool size
+ Shim sequelize to timeout after 1 minute on every database operation. This
is a safeguard to prevent unresolved db promises from halting the sync loop.
+ Better error handling to prevent the message processor from halting sync
- Development:
+ Measure and report inline composer open times
+ Refactor MessageProcessor to be more robust to errors
### 1.0.35 (3/9/2017)
- Fixes:
+ Make sure delta connection is restarted when an account is re-authed
+ More defensive error handling to prevent sync from halting
+ Prevent delta streaming connection from retrying too much
+ Fix error when attempting to report a fetch id error
+ Prevent error restart loop when database is malformed
+ Correctly cancel search when the search perspective is cleared
+ When many search results are returned from the server, don't try to sync them all at once, otherwise would slow down the main sync process.
+ When restarting the app, don't try to continue syncing search results from an old search
- Development:
+ Consolidate delta connection stores, remove `internal_package/deltas`
+ Rename NylasSyncStatusStore to FolderSyncProgressStore
+ Consolidate APIError status code that we should not report
+ Don't report incorrect username or password to Sentry
+ Rate limit error reporting for message processing errors
+ Fix circular reference error when reporting errors
+ Refactor file download IMAPConnectionPool usage
+ Don't focus the Console tab in dev tools every time an error is logged
+ Correctly set process title
### 1.0.34 (3/8/2017)
- Fixes:
+ Sync should not get stuck anymore due to sequelize
+ Delta Streaming connections now correctly retry after they are closed or an error occurs
+ Handle errors when opening imap box correctly
- Development:
+ Add script/daily
+ Provide better info to Sentry on sending errors
+ Refactor and clean up delta streaming code
+ Refactor message processing throttling
### 1.0.33 (3/8/2017)
- Features:
+ Add intitial support for send later
- Fixes:
+ Fetch unknown message uids returned in search results
+ Don't throttle message processing when syncing specific UIDs
- Development:
+ Better grouping for APIError by URL also
+ Don't generate sourceMapCache in prod mode
+ Upload a next-version to S3 for autoupdate testing
+ Windows build fixes
### 1.0.32 (3/7/2017)
- Development:
+ Report provider when reporting remove-from-threads-from-list
+ Report provider when reporting send perf metrics
### 1.0.31 (3/6/2017)
- Fixes:
+ Improve initial sync speed by scaling number of messages synced based on
folder SELECT duration
+ Immediately restore sync process when app comes back online after being
disconnected from the internet.
+ Can now reply from within notifications again
- Development:
+ Add basic rate limiting to Sentry
+ Report all search performance metrics
+ Prevent noisy uncaught errors when closing long connection
+ Improve reporting of refresh access token errors
+ Don't double report refresh access token API errors
+ Replace `setImmediate` with `setTimeout` as Promise scheduler
+ Use new Bluebird preferred `longStackTraces` syntax
+ NylasAPIRequest refactored and cleaned up
+ Search refactors and improvements
+ Protect from operating on IMAP connection while opening a box
+ Enable logging in prod builds
+ Make deploy-it support -h/--help
+ Restore cloud testing environments
### 1.0.30 (2/28/2017)
- Fixes:
+ Can properly add signatures and select them as default for different
accounts.
+ Can now correctly reply to a thread and immediately archive it or move it to
another folder without throwing an error (#3290)
+ Correctly fix IMAP connection timeout issues (#3232)
+ Nylas Mail no longer opens an increasing number of IMAP connections which
caused some users to reach IMAP server connection limits (#3228)
+ Fix memory leak while syncing which caused sync process to restart
sometimes.
+ Correctly handle IMAP connections ending unexpectedly
+ Correctly detect retryable IMAP errors during sync + detect more
retryable errors
+ Correctly catch more authentication errors when sending
+ Improve speed of processing messages during sync
+ Prevent unnecessary re-renders of the thread list
- Development:
+ Report performance metrics
+ More Coffeescript to Javascript conversions
### 1.0.29 (2/21/2017)
- Fixes:
+ You can now click inline images in messages to open them
+ More IMAP errors have been identified as retryable, which means users will
see less errors when syncing an account
+ Improve performance of thread search indexing queries
+ Correctly catch Invalid Login errors when sending
- Development:
+ Developer bar in Worker window now shows single delta connection
+ More code converted to Javascript
### 1.0.28 (2/16/2017)
- Fixes:
+ Fix offline notification bug that caused api outage
+ We now properly handle gmail auth token errors in the middle of the sync loop. This means less red boxes for users!
+ Less battery usage when initial sync has completed!
+ No more errors when saving sent messages to sent folders (`auth or accountId` errors)
+ No more `Lingering tasks in progress marked as failed errors`
+ Syncback tasks will continue retrying even after closing app
+ Syncback tasks retry more aggressively
+ Detect more offline errors when sending, sending is more reliable
+ Imap connection pooling (yet to land)
+ More retryable IMAP errors, means less red boxes for users
+ Offline notification now shows itself when we’re actually offline, shows countdown for next reconnect attempt
- Development:
+ More tests
+ Don't use breadcrumbs in dev mode
+ Add a better reason when waking sync for syncback in the logs
+ BackoffScheduler, BatteryManager added for reusability
### 1.0.27 (2/14/17)
- Fixes:
+ Offline notification fixes
### 1.0.26 (2/10/17)
- Fixes:
+ Downloads retry if they fail
+ NylasID doesn't intermittently log out or throw errors
+ Fix initial sync for Inbox Zero Gmail accounts
### 1.0.25 (2/10/17)
- Fixes:
+ When replying to a thread, properly add it to the sent folder
- Development:
+ Can now once again run Nylas Mail test suite
### 1.0.24 (2/9/17)
- Fixes:
+ Fix error reporter when reporting an error without an identity (this would
crash the app)
- Development:
+ Fix logging inside local-sync api requests
+ Stop reporting handled API errors to Sentry
+ Report thread-list perf metrics
### 1.0.23 (2/8/17)
- Fixes:
+ Fix emails occasionally being sent with an incomplete body (#3269)
+ Correctly thread messages together when open/link tracking is enabled
+ Fix `Mailbox does not exist` error for iCloud users (#3253)
+ When adding account, correctly remove whitespace from emails
+ Fix link in update notification to point to latest changelog
- Performance:
+ Thread list actions no longer sporadically lag for ~1sec (this is especially
noticeable when many accounts have been added)
+ No longer slow down sync process when more than 100,000 threads have been synced
- Development:
+ Better logging in worker window
+ You can now run a development build of Nylas Mail alongside a production
build
### 1.0.22 (2/7/17)
- Fixes:
+ New mail notification sounds on startup are combined when multiple new messages have arrived
+ You can now correctly select threads using `cmd` and `shift`
+ Improve message fetching by making sure we always fetch the most recent
messages first.
+ Improve IMAP connection timeouts by incrementing the socket timeout (#3232)
+ When adding a Google account, make sure to show the Account Chooser
- Development:
+ Nylas Identity is no longer stored in config.json
### 1.0.21 (2/3/17)
- Fixes:
+ Fixed an issue where Nylas Mail could delete all accounts (addresses #3231)
+ Correctly delete and archive threads when they contain sent messages (addresses #2706)
+ Improve performance and prevent crashes when running several sync actions
+ Improve error handling when sync actions fail
+ Fix JSON serialization issue which could cause sync process to error.
### 1.0.20 (2/1/17)
- Fixes:
+ Properly clean up broken replies
### 1.0.19 (1/31/17)
- Fixes:
+ Replies on threads won't create duplicate-looking emails. This began
to happen on midnight February 1 UTC due to a date parsing bug
+ Improve error handling in sync
+ Better retrying of certain syncback actions
- Development:
+ Now using Electron 1.4.15
### 1.0.18 (1/30/17)
- Performance:
+ 60% reduction of CPU usage during initial sync due to optimizing
unnecessary rendering
- Fixes:
+ New composer stays in "to" field when initially typing
- Development:
+ Better documentation for Nylas Mail SDKs
+ GitHub repository renamed from nylas/N1 to nylas/nylas-mail
+ `master` branch now has Nylas Mail (1.0.x)
+ `n1-pro` branch now has Nylas Pro (1.5.x)
### 1.0.17 (1/27/17)
- Fixes:
+ Fix send and archive: Can now archive after sending without errors
+ Local search now includes more thread results
+ Contact autocomplete in composer participant fields now includes more results
### 1.0.16 (1/27/17)
- Performance:
+ Improved typing performance in the composer, especially with
misspelled words
- Fixes:
+ Nylas Mail plugins install properly
+ Fix undo and occasional archive & move tasks failing due to not having uids
+ Fix logging for auth
+ Properly clean up after file downloads
+ Properly recover from IMAP uid invalidity
### 1.0.15 (1/25/17)
- Features:
+ Improve CPU performance of idle windows
- Fixes:
+ Correctly detect initial battery status for throttling.
+ Correctly allow auth for Custom IMAP accounts only #3185
### 1.0.14 (1/25/17)
- Features:
+ Improved spellchecker
- Fixes:
+ Correctly update attributes like starred and unread when syncing folders.
Marking as read or starred will no longer bounce back.
+ Correctly detect new mail while syncing Gmail inbox.
### 1.0.13 (1/25/17)
- Fixes:
+ Messages immediately appear in sent folder. No bouncing back.
+ Login more likely to succeed. Waits longer for IMAP
+ Doesn't allow invalid form submission
+ Correctly handles token refresh failing
+ Auto updater says "Nylas Mail" properly
+ Sync drafts correctly on Gmail
- Development:
+ Local sync account API deprecated
+ Silence noisy queries in the logs
### 1.0.12 (1/24/17)
- Features:
+ New 'Debug' sync button that opens up the console
+ Faster search
+ Message processing now throttles when on battery
+ Analytics for change mail tasks
- Fixes:
+ Archive, Mark as Unread, and Move to trash don't "bounce back"
+ Adding a new account is now smoother
+ Improved threading
+ Drafts are no longer in the inbox
### 1.0.11 (1/19/17)
- Features:
+ Nylas Mail's installer on Mac uses a DMG
- Fixes:
+ Fixed app being occasionally unresponsive
+ Decreased odds of failed logins (by bumping connection timeout value)
+ Sync erroring notification no longer tripped by timeouts
### 1.0.10 (1/19/17)
- Features:
+ "Contact Support" button now auto-fills information
+ Actions reach providers faster
- Fixes:
+ Show errors on the GMail auth screen
+ Show draft sending errors
+ Can now correctly search threads via `from:` and `to:`
+ Other error management improvements
+ The database will now be reset if malformed
+ Improve the offline notification
- Development:
+ Update Thread indexing
+ Add loadFromColumm option to Attribute
### 1.0.9 (1/17/17)
- Fixes:
+ All Fastmail domains now use the correct credentials
+ Offline notification more reliable
+ Fix error logging
### 1.0.8 (1/17/17)
- Introducing Nylas Mail Basic! Read more about it [here](https://blog.nylas.com/nylas-mail-is-now-free-8350d6a1044d)
================================================
FILE: packages/client-app/CONFIGURATION.md
================================================
# Configuration
This document outlines configuration options which aren't exposed via N1's
preferences interface but may be useful.
## Running Against Open Source Sync Engine
If you want to point N1 to your self-hosted sync engine, select "Hosting your own sync engine?" under the "Get Started" button on the welcome screen. There, follow the instructions for creating your own instance of the sync engine and enter the URL and port number where you have it running.
## Other Config Options
- `core.workspace.interfaceZoom`: If you'd like the N1 interface to be smaller or larger, this option allows you to scale the UI globally. (Default: 1)
================================================
FILE: packages/client-app/CONTRIBUTING.md
================================================
# Filing an Issue
Thanks for checking out N1! If you have a feature request, be sure to check out the [open source roadmap](http://trello.com/b/hxsqB6vx/n1-open-source-roadmap). If someone has already requested
the feature you have in mind, you can upvote the card on Trello—to keep things organized, we
often close feature requests on GitHub after creating Trello cards.
If you've found a bug, try searching for similars issue before filing a new one. Please include
the version of N1 you're using, the platform you're using (Mac / Windows / Linux), and the
type of email account. (Gmail, Outlook 365, etc.)
# Contributing to N1
The hosted sync engine allows us to control adoption of N1 and maintain a great
experience for our users. However, the sync engine is
[open source](https://github.com/nylas/sync-engine) and you can set it
up yourself to begin using N1 immediately. Follow instructions on the [sync
engine](https://github.com/nylas/sync-engine) repository.
### Getting Started
Before you get started, make sure you've installed the following dependencies.
N1's build scripts and tooling use modern JavaScript features and require:
- Node 6.0 or above with npm3
- python 2.7
Linux users should make sure they've installed all the packages listed at
https://github.com/nylas/nylas-mail/blob/master/.travis.yml#L10. Linux users on
Debian 8 and Ubuntu 15.04 onward must also install libgcrypt11 and gnome-keyring.
Next, clone and build N1 from source:
git clone https://github.com/nylas/nylas-mail.git
cd nylas-mail
script/bootstrap
Read the [getting started guides](https://nylas.github.io/N1/getting-started/).
**Building Nylas on Windows? See the [Windows instructions.](https://github.com/nylas/nylas-mail/blob/master/docs/Windows.md)**
### Running N1
npm start
### Testing N1
npm test
This will run the full suite of automated unit tests. We use [Jasmine 1.3](http://jasmine.github.io/1.3/introduction.html).
It runs all tests inside of the `/spec` folder and all tests inside of
`/internal_packages/**/spec`
You may skip certain tests (temporarily) with `xit` and `xdescribe`, or focus on only certain tests with `fit` and `fdescribe`.
### Linting N1
N1 lints clean against eslint, coffeelint, csslint, lesslint, and our own internal
tool, nylaslint. To run the linters, just run `npm run lint`.
### Creating binaries
Once you've checked out N1 and run `script/bootstrap`, you can create a packaged
version of the application by running `script/build`. Note that the builds
available at [https://nylas.com/N1](https://nylas.com/N1) include licensed
fonts, sounds, and other improvements. If you're just looking to run N1, you
should download it there!
# Pull requests
We require all authors sign our [Contributor License
Agreement](https://www.nylas.com/cla.html) before pull requests (even
minor ones) can be accepted. (It's similar to other projects, like NodeJS
Meteor, or React). I'm really sorry, but Legal made us do it.
### Commit Format
We decided to not impose super strict commit guidelines on the community.
We're trusting you to be thoughtful, responsible, committers.
We do have a few heuristics:
- Keep commits fairly isolated. Don't jam lots of different functionality
in 1 squashed commit. `git bisect` and `git cherry-pick` should still be
reasonable things to do.
- Keep commits fairly significant. DO `squash` all those little file
changes and "fixmes". Don't make it difficult to browse our history.
Play the balance between this idea and the last point. If a commit
doesn't deserve your time to write a long thoughtful message about, then
squash it.
- Be hyper-descriptive in your commit messages. I care less about what
you did (I can read the code), **I want to know WHY you did it**. Put
that in the commit body (not the subject). Itemize the major semantic
changes that happened.
- Read "[How to Write a Git Commit Message](http://chris.beams.io/posts/git-commit/)" if you haven't already (but don't be too prescriptivist about it!)
# Running Against Open Source Sync Engine
See [Configuration](https://github.com/nylas/nylas-mail/blob/master/CONFIGURATION.md)
================================================
FILE: packages/client-app/LICENSE.md
================================================
MIT License
Copyright (c) 2017 Nylas, Inc.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: packages/client-app/README.md
================================================
# Nylas Mail - the open-source, extensible mail client

**Nylas Mail is an open-source mail client built on the modern web with [Electron](https://github.com/atom/electron), [React](https://facebook.github.io/react/), and [Flux](https://facebook.github.io/flux/).** It is designed to be extensible, so it's easy to create new experiences and workflows around email. Want to learn more? Check out the [full documentation](https://nylas.github.io/nylas-mail/).
[](https://travis-ci.org/nylas/nylas-mail)
[](http://slack-invite.nylas.com)
#### Want to help build the future of email? [Nylas is hiring](https://jobs.lever.co/nylas)!
## Download Nylas Mail
You can download compiled versions of Nylas Mail for Windows, Mac OS X, and Linux (.deb) from [https://nylas.com/download](https://nylas.com/download). You can also build and run Nylas Mail (Previously N1) on Fedora. On Arch Linux, you can install **[n1](https://aur.archlinux.org/packages/n1/)** or **[n1-git](https://aur.archlinux.org/packages/n1-git/)** from the aur.
## Build A Plugin
Plugins lie at the heart of Nylas Mail and give it its powerful features. Building your own plugins allows you to integrate the app with other tools, experiment with new workflows, and more. Follow the [Getting Started guide](https://nylas.github.io/nylas-mail/) to write your first plugin in five minutes. To create your own theme, go to our [Theme Starter guide](https://github.com/nylas/N1-theme-starter).
If you would like to run the N1 source and contribute, check out our [contributing
guide](https://github.com/nylas/nylas-mail/blob/master/CONTRIBUTING.md).
## Themes
The Nylas Mail user interface is styled using CSS, which means it's easy to modify and extend. Nylas Mail comes stock with a few beautiful themes, and there are many more which have been built by community developers
<center><img width=550 src="http://i.imgur.com/PWQ7NlY.jpg"></center>
#### Bundled Themes
- [Dark](https://github.com/nylas/nylas-mail/tree/master/internal_packages/ui-dark)
- [Darkside](https://github.com/nylas/nylas-mail/tree/master/internal_packages/ui-darkside) (designed by [Jamie Wilson](https://github.com/jamiewilson))
- [Taiga](https://github.com/nylas/nylas-mail/tree/master/internal_packages/ui-taiga) (designed by [Noah Buscher](https://github.com/noahbuscher))
- [Ubuntu](https://github.com/nylas/nylas-mail/tree/master/internal_packages/ui-ubuntu) (designed by [Ahmed Elhanafy](https://github.com/ahmedlhanafy))
- [Less Is More](https://github.com/nylas/nylas-mail/tree/master/internal_packages/ui-less-is-more) (designed by [Alexander Adkins](https://github.com/P0WW0W))
#### Community Themes
- [Arc Dark](https://github.com/varlesh/Nylas-Arc-Dark-Theme)
- [Predawn](https://github.com/adambmedia/N1-Predawn)
- [ElementaryOS](https://github.com/edipox/elementary-nylas)
- [Ido](https://github.com/edipox/n1-ido)—Polymail-inspired theme
- [Solarized Dark](https://github.com/NSHenry/N1-Solarized-Dark)
- [Berend](https://github.com/Frique/N1-Berend)
- [LevelUp](https://github.com/stolinski/level-up-nylas-n1-theme)
- [Sunrise](https://github.com/jackiehluo/n1-sunrise)
- [ToogaBooga](https://github.com/brycedorn/N1-ToogaBooga)
- [Material](https://github.com/jackiehluo/n1-material)
- [Monokai](https://github.com/dcondrey/n1-monokai)
- [Agapanthus](https://github.com/taniadaniela/n1-agapanthus)—Inbox-inspired theme
- [Stripe](https://github.com/oeaeee/n1-stripe)
- [Kleinstein] (https://github.com/diklein/Kleinstein)—Hide the account list sidebar
- [BoraBora](https://github.com/arimai/N1-BoraBora)
- [Honeyduke](https://github.com/arimai/n1-honeyduke)
- [Snow](https://github.com/Wattenberger/N1-snow-theme)
- [Hull](https://github.com/unity/n1-hull)
- [Express](https://github.com/oeaeee/n1-express)
- [DarkSoda](https://github.com/adambullmer/N1-theme-DarkSoda)
- [Bemind](https://github.com/bemindinteractive/Bemind-N1-Theme)
- [Dracula](https://github.com/dracula/nylas-n1)
- [MouseEatsCat](https://github.com/MouseEatsCat/MouseEatsCat-N1)
- [Sublime Dark](https://github.com/rishabhkesarwani/Nylas-Sublime-Dark-Theme)
- [Firefox](https://github.com/darshandsoni/n1-firefox-theme)
- [Gmail](https://github.com/dregitsky/n1-gmail-theme)
- [Darkish](https://github.com/dyrnade/N1-Darkish)
#### To install community themes:
1. Download and unzip the repo
2. In Nylas Mail, select `Developer > Install a Package Manually... `
3. Navigate to where you downloaded the theme and select the root folder. The theme is copied into the `~/.nylas-mail` folder for your convinence
5. Select `Change Theme...` from the top level menu, and you'll see the newly installed theme. That's it!
Want to dive in more? Try [creating your own theme](https://github.com/nylas/nylas-mail-theme-starter)!
## Plugin List
We're working on building a plugin index that makes it super easy to add them to Nylas Mail. For now, check out the list below! (Feel free to submit a PR if you build a plugin and want it featured here.)
#### Bundled Plugins
Great starting points for creating your own plugins!
- [Translate](https://github.com/nylas/nylas-mail/tree/master/internal_packages/composer-translate)—Works with 10 languages
- [Quick Replies](https://github.com/nylas/nylas-mail/tree/master/internal_packages/composer-templates)—Send emails faster with templates
- [Emoji Keyboard](https://github.com/nylas/nylas-mail/tree/master/internal_packages/composer-emoji)—Insert emoji by typing a colon (:) followed by the name of an emoji symbol
- [GitHub Sidebar Info](https://github.com/nylas/nylas-mail/tree/master/internal_packages/github-contact-card)
- [View on GitHub](https://github.com/nylas/nylas-mail/tree/master/internal_packages/message-view-on-github)
- [Personal Level Indicators](https://github.com/nylas/nylas-mail/tree/master/internal_packages/personal-level-indicators)
- [Phishing Detection](https://github.com/nylas/nylas-mail/tree/master/internal_packages/phishing-detection)
#### Community Plugins
Note these are not tested or officially supported by Nylas, but we still think they are really cool! If you find bugs with them, please open GitHub issues on their individual project pages, not the Nylas Mail (N1) repo page. Thanks!
- [Jiffy](http://noahbuscher.github.io/N1-Jiffy/)—Insert animated GIFs
- [Weather](https://github.com/jackiehluo/n1-weather)
- [Todoist](https://github.com/alexfruehwirth/N1TodoistIntegration)
- [Unsubscribe](https://github.com/colinking/n1-unsubscribe)
- [Squirt Speed Reader](https://github.com/HarleyKwyn/squirt-reader-N1-plugin/)
- [Website Launcher](https://github.com/adriangrantdotorg/nylas-n1-background-webpage)—Opens a URL in separate window
- In Development: [Cypher](https://github.com/mbilker/cypher) (PGP Encryption)
- [Avatars](https://github.com/unity/n1-avatars)
- [Events Calendar (WIP)](https://github.com/nerdenough/n1-events-calendar)
- [Mail in Chat (WIP)](https://github.com/yjchen/mail_in_chat)
- [Evernote](https://github.com/grobgl/n1-evernote)
- [Wunderlist](https://github.com/miguelrs/n1-wunderlist)
- [Participants Display](https://github.com/kbruccoleri/nylas-participants-display)
- [GitHub](https://github.com/ForbesLindesay/N1-GitHub)
When you install packages, they're moved to ~/.nylas-mail/packages, and Nylas Mail runs apm install on the command line to fetch dependencies listed in the package's package.json
## Building the docs
Plugin SDK docs are available at [https://nylas.github.io/nylas-mail/](https://nylas.github.io/nylas-mail/). Here's how you build them:
Until my patch gets merged, docs need to be built manually using mg's fork.
git clone git@github.com:grinich/gitbook.git
cd nylas-mail
./node_modules/.bin/gitbook alias ../gitbook latest
Then to actually build the docs:
script/grunt docs
./node_modules/.bin/gitbook --gitbook=latest build . ./_docs_output --log=debug --debug
rm -r docs_src/classes
If you want to preview the docs:
pushd ./_docs_output; python -m SimpleHTTPServer; popd
Just want to publish everything? There's a helper script that does it for you:
script/publish-docs
## Configuration
You can configure Nylas Mail in a few ways—for instance, pointing it to your self-hosted instance of the sync engine or changing the interface zoom level. [Learn more about how.](https://github.com/nylas/nylas-mail/blob/master/CONFIGURATION.md)
## Feature Requests / Plugin Ideas
Have an idea for a package or a feature you'd love to see in Nylas Mail? Search for existing [GitHub issues](https://github.com/nylas/nylas-mail/issues) and join the conversation!
================================================
FILE: packages/client-app/apm/README.md
================================================
Nylas Mail ships a copy of [apm](https://github.com/atom/apm) to build packages
when users choose to install them. This won't be true much longer.
================================================
FILE: packages/client-app/apm/package.json
================================================
{
"name": "n1-bundled-apm",
"description": "N1's bundled apm",
"repository": {
"type": "git",
"url": "https://github.com/nylas/nylas-mail"
},
"dependencies": {
"atom-package-manager": "1.1.1"
}
}
================================================
FILE: packages/client-app/build/Gruntfile.js
================================================
/* eslint global-require: 0 */
/* eslint import/no-dynamic-require: 0 */
const path = require('path');
module.exports = (grunt) => {
if (!grunt.option('platform')) {
grunt.option('platform', process.platform);
}
/**
* The main appDir is that of the root nylas-mail-all repo. This Gruntfile
* is designed to be run from the npm-build-client task whose repo root is
* the main nylas-mail-all package.
*/
const appDir = path.resolve(path.join('packages', 'client-app'));
const buildDir = path.join(appDir, 'build');
const tasksDir = path.join(buildDir, 'tasks');
const taskHelpers = require(path.join(tasksDir, 'task-helpers'))(grunt)
// This allows all subsequent paths to the relative to the root of the repo
grunt.config.init({
'taskHelpers': taskHelpers,
'rootDir': path.resolve('./'),
'buildDir': buildDir,
'appDir': appDir,
'classDocsOutputDir': './docs_src/classes',
'outputDir': path.join(appDir, 'dist'),
'appJSON': grunt.file.readJSON(path.join(appDir, 'package.json')),
'source:coffeescript': [
'internal_packages/**/*.cjsx',
'internal_packages/**/*.coffee',
'dot-nylas/**/*.coffee',
'src/**/*.coffee',
'src/**/*.cjsx',
'!src/**/node_modules/**/*.coffee',
'!internal_packages/**/node_modules/**/*.coffee',
],
'source:es6': [
'internal_packages/**/*.jsx',
'internal_packages/**/*.es6',
'internal_packages/**/*.es',
'dot-nylas/**/*.es6',
'dot-nylas/**/*.es',
'src/**/*.es6',
'src/**/*.es',
'src/**/*.jsx',
'src/K2/**/*.js', // K2 doesn't use ES6 extension, lint it anyway!
'!src/K2/packages/local-private/src/error-logger-extensions/*.js',
'!src/**/node_modules/**/*.es6',
'!src/**/node_modules/**/*.es',
'!src/**/node_modules/**/*.jsx',
'!src/K2/**/node_modules/**/*.js',
'!internal_packages/**/node_modules/**/*.es6',
'!internal_packages/**/node_modules/**/*.es',
'!internal_packages/**/node_modules/**/*.jsx',
],
});
grunt.loadTasks(tasksDir);
grunt.file.setBase(appDir);
grunt.registerTask('docs', ['docs-build', 'docs-render']);
grunt.registerTask('lint', [
'eslint',
'lesslint',
'nylaslint',
'coffeelint',
'csslint',
]);
if (grunt.option('platform') === 'win32') {
grunt.registerTask("build-client", [
"package",
// The Windows electron-winstaller task must be run outside of grunt
]);
} else if (grunt.option('platform') === 'darwin') {
grunt.registerTask("build-client", [
"package",
"create-mac-zip",
"create-mac-dmg",
]);
} else if (grunt.option('platform') === 'linux') {
grunt.registerTask("build-client", [
"package",
"create-deb-installer",
"create-rpm-installer",
]);
}
}
================================================
FILE: packages/client-app/build/README.md
================================================
# N1 Build Environment
Node version 0.10.x (Due to the version of electron currently used.)
# N1 Building and Tasks
This folder contains tasks to create production builds of N1
Tasks should not be executed from this folder, but rather from `/scripts`. The
`/scripts` folder has convenient methods that fix paths and do environment
checks.
Note that most of the task definitions are stored in `/build/tasks`
## Some useful tasks
NOTE: Run all of these from the N1 root folder.
**Linting:**
`script/grunt lint`
**Building:**
`script/grunt build`
The build folder has its own package.json and is isolated so we can use `npm`
to compile against v8's headers instead of `apm`
================================================
FILE: packages/client-app/build/config/coffeelint.json
================================================
{
"max_line_length": {
"level": "ignore"
},
"no_empty_param_list": {
"level": "error"
},
"arrow_spacing": {
"level": "error"
},
"no_unnecessary_fat_arrows": {
"level": "ignore"
},
"no_interpolation_in_single_quotes": {
"level": "error"
},
"no_debugger": {
"level": "error"
}
}
================================================
FILE: packages/client-app/build/docs_templates/_function.html
================================================
<h4 id={{name}} class="function-name">
{{name}}(<span class="args">{{#each arguments}}<span class="arg">{{#if isOptional}}[{{/if}}{{name}}{{#if isOptional}}]{{/if}}</span>{{/each}}</span>) <a href="#{{name}}" class="link"></a>
</h4>
<div class="function-description markdown-from-sourecode">
<p>{{{description}}}</p>
</div>
{{#if arguments.length}}
<strong>Parameters</strong>
<table class="arguments">
<tr>
<th>Argument</th>
<th>Description</th>
</tr>
{{#each arguments}}
<tr>
<td style="width:15%;">
<em>{{name}}</em>
</td>
<td class="markdown-from-sourecode">
{{#if isOptional}}<span class="optional">Optional</span>{{/if}}
{{{description}}}
</td>
</tr>
{{/each}}
</table>
{{/if}}
{{#if returnValues.length}}
<strong>Returns</strong>
<table class="arguments">
<tr>
<th>Return Values</th>
</tr>
{{#each returnValues}}
<tr><td class="markdown-from-sourecode">{{{description}}}</td></tr>
{{/each}}
</table>
{{/if}}
================================================
FILE: packages/client-app/build/docs_templates/_property.html
================================================
<h4 id={{name}}>{{name}} <a href="#{{name}}" class="link"></a></h4>
<p>{{{description}}}</p>
{{#if arguments.length}}
<table class="arguments">
{{#each arguments}}
<tr>
<td style="width:15%;">
<em>{{name}}</em>
</td>
<td>
{{#if isOptional}}<span class="optional">Optional</span>{{/if}}
{{{description}}}
</td>
</tr>
{{/each}}
</table>
{{/if}}
================================================
FILE: packages/client-app/build/docs_templates/class.md
================================================
# {{ name }}
## Summary
{{{documentation.description}}}
<ul>
{{#each documentation.sections}}
<li><a href="#{{name}}">{{name}}</a></li>
{{/each}}
</ul>
{{#if documentation.classProperties.length}}
### Class Properties
{{#each documentation.classProperties}}
{{> _property.html}}
{{/each}}
{{/if}}
{{#if documentation.classMethods.length}}
### Class Methods
{{#each documentation.classMethods}}
{{> _function.html}}
{{/each}}
{{/if}}
{{#if documentation.instanceMethods.length}}
### Instance Methods
{{#each documentation.instanceMethods}}
{{> _function.html}}
{{/each}}
{{/if}}
================================================
FILE: packages/client-app/build/docs_templates/sidebar.md
================================================
{{!-- This is our preferred ordering, so do it manually! --}}
## General
{{#each sidebar.General}}
* [{{this}}](/classes/{{this}}.md)
{{/each}}
## Component Kit
{{#each sidebar.[Component Kit]}}
* [{{this}}](/classes/{{this}}.md)
{{/each}}
## Extensions
{{#each sidebar.[Extensions]}}
* [{{this}}](/classes/{{this}}.md)
{{/each}}
## Models
{{#each sidebar.[Models]}}
* [{{this}}](/classes/{{this}}.md)
{{/each}}
## Stores
{{#each sidebar.[Stores]}}
* [{{this}}](/classes/{{this}}.md)
{{/each}}
## Database
{{#each sidebar.[Database]}}
* [{{this}}](/classes/{{this}}.md)
{{/each}}
## Drafts
{{#each sidebar.[Drafts]}}
* [{{this}}](/classes/{{this}}.md)
{{/each}}
## NylasEnv
{{#each sidebar.[NylasEnv]}}
* [{{this}}](/classes/{{this}}.md)
{{/each}}
## Atom
{{#each sidebar.[Atom]}}
* [{{this}}](/classes/{{this}}.md)
{{/each}}
================================================
FILE: packages/client-app/build/resources/asar-ordering-hint.txt
================================================
956764: package.json
1760546: src/browser/main.js
1766806: node_modules/fs-plus/package.json
1768751: node_modules/fs-plus/lib/fs-plus.js
1789356: node_modules/fs-plus/node_modules/underscore-plus/package.json
1791321: node_modules/fs-plus/node_modules/underscore-plus/lib/underscore-plus.js
1806109: node_modules/fs-plus/node_modules/underscore-plus/node_modules/underscore/package.json
1807823: node_modules/fs-plus/node_modules/underscore-plus/node_modules/underscore/underscore.js
1853312: node_modules/fs-plus/node_modules/async/package.json
1854649: node_modules/fs-plus/node_modules/async/lib/async.js
1884050: node_modules/fs-plus/node_modules/mkdirp/package.json
1885107: node_modules/fs-plus/node_modules/mkdirp/index.js
1887478: node_modules/fs-plus/node_modules/rimraf/package.json
1889121: node_modules/fs-plus/node_modules/rimraf/rimraf.js
1894875: node_modules/mkdirp/package.json
1896279: node_modules/mkdirp/index.js
1898909: node_modules/optimist/package.json
1900199: node_modules/optimist/index.js
1914385: node_modules/optimist/node_modules/wordwrap/package.json
1915858: node_modules/optimist/node_modules/wordwrap/index.js
1918089: src/error-logger.js
1926560: node_modules/nslog/package.json
1928316: node_modules/nslog/lib/nslog.js
1928640: src/error-logger-extensions/nylas-private-error-reporter.js
1933337: node_modules/raven/package.json
1935222: node_modules/raven/index.js
1935631: node_modules/raven/lib/client.js
1941308: node_modules/raven/lib/parsers.js
1945141: node_modules/raven/node_modules/cookie/package.json
1946217: node_modules/raven/node_modules/cookie/index.js
1948116: node_modules/raven/lib/utils.js
1953762: node_modules/raven/lib/transports.js
1956068: node_modules/raven/node_modules/lsmod/package.json
1957254: node_modules/raven/node_modules/lsmod/index.js
1958729: node_modules/raven/node_modules/stack-trace/package.json
1960042: node_modules/raven/node_modules/stack-trace/lib/stack-trace.js
1962761: node_modules/node-uuid/package.json
1964629: node_modules/node-uuid/uuid.js
1933337: node_modules/raven/package.json
1972642: node_modules/raven/lib/middleware/connect.js
1973294: src/compile-cache.js
1978902: src/compile-support/babel.js
1980527: static/babelrc.json
1980671: src/compile-support/coffee-script.js
1981853: src/compile-support/typescript.js
1983139: node_modules/underscore/package.json
1985095: node_modules/underscore/underscore.js
2038014: node_modules/source-map-support/package.json
2039642: node_modules/source-map-support/source-map-support.js
2054178: node_modules/source-map-support/node_modules/source-map/package.json
2057217: node_modules/source-map-support/node_modules/source-map/lib/source-map.js
2057643: node_modules/source-map-support/node_modules/source-map/lib/source-map/source-map-generator.js
2070902: node_modules/source-map-support/node_modules/source-map/node_modules/amdefine/package.json
2072148: node_modules/source-map-support/node_modules/source-map/node_modules/amdefine/amdefine.js
2082064: node_modules/source-map-support/node_modules/source-map/lib/source-map/base64-vlq.js
2086956: node_modules/source-map-support/node_modules/source-map/lib/source-map/base64.js
2088093: node_modules/source-map-support/node_modules/source-map/lib/source-map/util.js
2093422: node_modules/source-map-support/node_modules/source-map/lib/source-map/array-set.js
2096140: node_modules/source-map-support/node_modules/source-map/lib/source-map/source-map-consumer.js
2113947: node_modules/source-map-support/node_modules/source-map/lib/source-map/binary-search.js
2117157: node_modules/source-map-support/node_modules/source-map/lib/source-map/source-node.js
2130092: src/browser/application.js
2161879: src/browser/system-tray-manager.js
2173675: src/browser/nylas-window.js
2187662: src/browser/window-manager.js
91213297: src/browser/window-launcher.js
91200495: src/browser/file-list-cache.js
2195924: src/browser/application-menu.js
2207382: src/flux/models/utils.js
8174990: node_modules/moment-timezone/package.json
8177056: node_modules/moment-timezone/index.js
8177170: node_modules/moment-timezone/moment-timezone.js
3971136: node_modules/moment/package.json
3974612: node_modules/moment/moment.js
8190929: node_modules/moment-timezone/data/packed/latest.json
3261374: src/task-registry.js
3264167: src/serializable-registry.js
3271782: src/database-object-registry.js
2228693: src/browser/auto-update-manager.js
2235663: src/browser/nylas-protocol-handler.js
2396007: node_modules/season/package.json
2397840: node_modules/season/lib/cson.js
2238228: src/config.js
2261295: src/config-utils.js
2264399: node_modules/emissary/package.json
2266273: node_modules/emissary/lib/emissary.js
2266555: node_modules/emissary/lib/helpers.js
2268129: node_modules/emissary/lib/behavior.js
2272107: node_modules/emissary/node_modules/underscore-plus/package.json
2274072: node_modules/emissary/node_modules/underscore-plus/lib/underscore-plus.js
2288860: node_modules/emissary/node_modules/underscore-plus/node_modules/underscore/package.json
2290574: node_modules/emissary/node_modules/underscore-plus/node_modules/underscore/underscore.js
2336063: node_modules/property-accessors/package.json
2337929: node_modules/property-accessors/lib/property-accessors.js
2340201: node_modules/property-accessors/node_modules/mixto/package.json
2341779: node_modules/property-accessors/node_modules/mixto/lib/mixin.js
2343179: node_modules/emissary/lib/signal.js
2352520: node_modules/emissary/lib/emitter.js
2367779: node_modules/emissary/node_modules/mixto/package.json
2369463: node_modules/emissary/node_modules/mixto/lib/mixin.js
2370863: node_modules/emissary/lib/subscriber.js
2374948: node_modules/emissary/lib/subscription.js
2376215: node_modules/event-kit/package.json
2378208: node_modules/event-kit/lib/event-kit.js
2378397: node_modules/event-kit/lib/emitter.js
2382101: node_modules/event-kit/lib/disposable.js
2394595: node_modules/event-kit/lib/composite-disposable.js
2441735: node_modules/pathwatcher/package.json
2444020: node_modules/pathwatcher/lib/main.js
2450494: node_modules/pathwatcher/lib/file.js
2466571: node_modules/pathwatcher/node_modules/underscore-plus/package.json
2468584: node_modules/pathwatcher/node_modules/underscore-plus/lib/underscore-plus.js
2483372: node_modules/pathwatcher/node_modules/underscore-plus/node_modules/underscore/package.json
2485130: node_modules/pathwatcher/node_modules/underscore-plus/node_modules/underscore/underscore.js
2530619: node_modules/pathwatcher/lib/directory.js
2542040: node_modules/pathwatcher/node_modules/async/package.json
2543482: node_modules/pathwatcher/node_modules/async/lib/async.js
2572883: src/color.js
1973294: src/compile-cache.js
1766806: node_modules/fs-plus/package.json
1768751: node_modules/fs-plus/lib/fs-plus.js
1789356: node_modules/fs-plus/node_modules/underscore-plus/package.json
1791321: node_modules/fs-plus/node_modules/underscore-plus/lib/underscore-plus.js
1806109: node_modules/fs-plus/node_modules/underscore-plus/node_modules/underscore/package.json
1807823: node_modules/fs-plus/node_modules/underscore-plus/node_modules/underscore/underscore.js
1973294: src/compile-cache.js
1766806: node_modules/fs-plus/package.json
1768751: node_modules/fs-plus/lib/fs-plus.js
1789356: node_modules/fs-plus/node_modules/underscore-plus/package.json
1791321: node_modules/fs-plus/node_modules/underscore-plus/lib/underscore-plus.js
1806109: node_modules/fs-plus/node_modules/underscore-plus/node_modules/underscore/package.json
1973294: src/compile-cache.js
1807823: node_modules/fs-plus/node_modules/underscore-plus/node_modules/underscore/underscore.js
1766806: node_modules/fs-plus/package.json
1768751: node_modules/fs-plus/lib/fs-plus.js
1789356: node_modules/fs-plus/node_modules/underscore-plus/package.json
1791321: node_modules/fs-plus/node_modules/underscore-plus/lib/underscore-plus.js
1853312: node_modules/fs-plus/node_modules/async/package.json
1854649: node_modules/fs-plus/node_modules/async/lib/async.js
1806109: node_modules/fs-plus/node_modules/underscore-plus/node_modules/underscore/package.json
1807823: node_modules/fs-plus/node_modules/underscore-plus/node_modules/underscore/underscore.js
1884050: node_modules/fs-plus/node_modules/mkdirp/package.json
1885107: node_modules/fs-plus/node_modules/mkdirp/index.js
1887478: node_modules/fs-plus/node_modules/rimraf/package.json
1889121: node_modules/fs-plus/node_modules/rimraf/rimraf.js
1978902: src/compile-support/babel.js
1853312: node_modules/fs-plus/node_modules/async/package.json
1854649: node_modules/fs-plus/node_modules/async/lib/async.js
1884050: node_modules/fs-plus/node_modules/mkdirp/package.json
1885107: node_modules/fs-plus/node_modules/mkdirp/index.js
1887478: node_modules/fs-plus/node_modules/rimraf/package.json
1889121: node_modules/fs-plus/node_modules/rimraf/rimraf.js
1853312: node_modules/fs-plus/node_modules/async/package.json
1980527: static/babelrc.json
1854649: node_modules/fs-plus/node_modules/async/lib/async.js
1980671: src/compile-support/coffee-script.js
1981853: src/compile-support/typescript.js
1978902: src/compile-support/babel.js
1983139: node_modules/underscore/package.json
1985095: node_modules/underscore/underscore.js
1884050: node_modules/fs-plus/node_modules/mkdirp/package.json
1885107: node_modules/fs-plus/node_modules/mkdirp/index.js
1887478: node_modules/fs-plus/node_modules/rimraf/package.json
1889121: node_modules/fs-plus/node_modules/rimraf/rimraf.js
1978902: src/compile-support/babel.js
1980527: static/babelrc.json
1980671: src/compile-support/coffee-script.js
1981853: src/compile-support/typescript.js
2038014: node_modules/source-map-support/package.json
1983139: node_modules/underscore/package.json
2039642: node_modules/source-map-support/source-map-support.js
1985095: node_modules/underscore/underscore.js
2054178: node_modules/source-map-support/node_modules/source-map/package.json
2057217: node_modules/source-map-support/node_modules/source-map/lib/source-map.js
1980527: static/babelrc.json
2057643: node_modules/source-map-support/node_modules/source-map/lib/source-map/source-map-generator.js
1980671: src/compile-support/coffee-script.js
2070902: node_modules/source-map-support/node_modules/source-map/node_modules/amdefine/package.json
1981853: src/compile-support/typescript.js
2072148: node_modules/source-map-support/node_modules/source-map/node_modules/amdefine/amdefine.js
1983139: node_modules/underscore/package.json
1985095: node_modules/underscore/underscore.js
2082064: node_modules/source-map-support/node_modules/source-map/lib/source-map/base64-vlq.js
2038014: node_modules/source-map-support/package.json
2039642: node_modules/source-map-support/source-map-support.js
2086956: node_modules/source-map-support/node_modules/source-map/lib/source-map/base64.js
2054178: node_modules/source-map-support/node_modules/source-map/package.json
2057217: node_modules/source-map-support/node_modules/source-map/lib/source-map.js
2057643: node_modules/source-map-support/node_modules/source-map/lib/source-map/source-map-generator.js
2088093: node_modules/source-map-support/node_modules/source-map/lib/source-map/util.js
2070902: node_modules/source-map-support/node_modules/source-map/node_modules/amdefine/package.json
2072148: node_modules/source-map-support/node_modules/source-map/node_modules/amdefine/amdefine.js
2093422: node_modules/source-map-support/node_modules/source-map/lib/source-map/array-set.js
2096140: node_modules/source-map-support/node_modules/source-map/lib/source-map/source-map-consumer.js
2038014: node_modules/source-map-support/package.json
2039642: node_modules/source-map-support/source-map-support.js
2113947: node_modules/source-map-support/node_modules/source-map/lib/source-map/binary-search.js
2054178: node_modules/source-map-support/node_modules/source-map/package.json
2117157: node_modules/source-map-support/node_modules/source-map/lib/source-map/source-node.js
2082064: node_modules/source-map-support/node_modules/source-map/lib/source-map/base64-vlq.js
2057217: node_modules/source-map-support/node_modules/source-map/lib/source-map.js
2057643: node_modules/source-map-support/node_modules/source-map/lib/source-map/source-map-generator.js
2086956: node_modules/source-map-support/node_modules/source-map/lib/source-map/base64.js
2070902: node_modules/source-map-support/node_modules/source-map/node_modules/amdefine/package.json
2072148: node_modules/source-map-support/node_modules/source-map/node_modules/amdefine/amdefine.js
2851648: src/module-cache.js
2088093: node_modules/source-map-support/node_modules/source-map/lib/source-map/util.js
2093422: node_modules/source-map-support/node_modules/source-map/lib/source-map/array-set.js
2866883: node_modules/semver/package.json
2868219: node_modules/semver/semver.js
2096140: node_modules/source-map-support/node_modules/source-map/lib/source-map/source-map-consumer.js
2082064: node_modules/source-map-support/node_modules/source-map/lib/source-map/base64-vlq.js
2113947: node_modules/source-map-support/node_modules/source-map/lib/source-map/binary-search.js
2086956: node_modules/source-map-support/node_modules/source-map/lib/source-map/base64.js
2117157: node_modules/source-map-support/node_modules/source-map/lib/source-map/source-node.js
2088093: node_modules/source-map-support/node_modules/source-map/lib/source-map/util.js
956764: package.json
2851648: src/module-cache.js
2093422: node_modules/source-map-support/node_modules/source-map/lib/source-map/array-set.js
2096140: node_modules/source-map-support/node_modules/source-map/lib/source-map/source-map-consumer.js
2866883: node_modules/semver/package.json
2868219: node_modules/semver/semver.js
2113947: node_modules/source-map-support/node_modules/source-map/lib/source-map/binary-search.js
2117157: node_modules/source-map-support/node_modules/source-map/lib/source-map/source-node.js
2851648: src/module-cache.js
956764: package.json
2866883: node_modules/semver/package.json
2868219: node_modules/semver/semver.js
956764: package.json
2397840: node_modules/season/lib/cson.js
94886363: src/secondary-window-bootstrap.js
2901212: node_modules/bluebird/js/main/bluebird.js
2901506: node_modules/bluebird/js/main/promise.js
2926597: node_modules/bluebird/js/main/util.js
2935230: node_modules/bluebird/js/main/es5.js
2397840: node_modules/season/lib/cson.js
2937208: node_modules/bluebird/js/main/async.js
2925857: src/window-bootstrap.js
2941161: node_modules/bluebird/js/main/schedule.js
2901212: node_modules/bluebird/js/main/bluebird.js
2901506: node_modules/bluebird/js/main/promise.js
2942440: node_modules/bluebird/js/main/queue.js
2944794: node_modules/bluebird/js/main/errors.js
2948412: node_modules/bluebird/js/main/thenables.js
2950756: node_modules/bluebird/js/main/promise_array.js
2926597: node_modules/bluebird/js/main/util.js
2954903: node_modules/bluebird/js/main/captured_trace.js
2935230: node_modules/bluebird/js/main/es5.js
2397840: node_modules/season/lib/cson.js
2937208: node_modules/bluebird/js/main/async.js
94886363: src/secondary-window-bootstrap.js
2941161: node_modules/bluebird/js/main/schedule.js
2901212: node_modules/bluebird/js/main/bluebird.js
2942440: node_modules/bluebird/js/main/queue.js
2901506: node_modules/bluebird/js/main/promise.js
2969949: node_modules/bluebird/js/main/debuggability.js
2944794: node_modules/bluebird/js/main/errors.js
2975097: node_modules/bluebird/js/main/context.js
2948412: node_modules/bluebird/js/main/thenables.js
2976035: node_modules/bluebird/js/main/catch_filter.js
2950756: node_modules/bluebird/js/main/promise_array.js
2978109: node_modules/bluebird/js/main/promise_resolver.js
2926597: node_modules/bluebird/js/main/util.js
2954903: node_modules/bluebird/js/main/captured_trace.js
2981972: node_modules/bluebird/js/main/progress.js
2935230: node_modules/bluebird/js/main/es5.js
2984464: node_modules/bluebird/js/main/method.js
2985800: node_modules/bluebird/js/main/bind.js
2987812: node_modules/bluebird/js/main/finally.js
2937208: node_modules/bluebird/js/main/async.js
2990436: node_modules/bluebird/js/main/direct_resolve.js
2991902: node_modules/bluebird/js/main/synchronous_inspection.js
2941161: node_modules/bluebird/js/main/schedule.js
2942440: node_modules/bluebird/js/main/queue.js
2994543: node_modules/bluebird/js/main/join.js
2969949: node_modules/bluebird/js/main/debuggability.js
2998433: node_modules/bluebird/js/main/map.js
2944794: node_modules/bluebird/js/main/errors.js
2975097: node_modules/bluebird/js/main/context.js
3002811: node_modules/bluebird/js/main/cancel.js
2948412: node_modules/bluebird/js/main/thenables.js
2976035: node_modules/bluebird/js/main/catch_filter.js
3004209: node_modules/bluebird/js/main/using.js
2950756: node_modules/bluebird/js/main/promise_array.js
2978109: node_modules/bluebird/js/main/promise_resolver.js
2954903: node_modules/bluebird/js/main/captured_trace.js
3011204: node_modules/bluebird/js/main/generators.js
2981972: node_modules/bluebird/js/main/progress.js
2984464: node_modules/bluebird/js/main/method.js
3015905: node_modules/bluebird/js/main/nodeify.js
2985800: node_modules/bluebird/js/main/bind.js
3017541: node_modules/bluebird/js/main/call_get.js
2987812: node_modules/bluebird/js/main/finally.js
3021885: node_modules/bluebird/js/main/props.js
2990436: node_modules/bluebird/js/main/direct_resolve.js
2991902: node_modules/bluebird/js/main/synchronous_inspection.js
3024057: node_modules/bluebird/js/main/race.js
2994543: node_modules/bluebird/js/main/join.js
3025282: node_modules/bluebird/js/main/reduce.js
2969949: node_modules/bluebird/js/main/debuggability.js
2998433: node_modules/bluebird/js/main/map.js
3030305: node_modules/bluebird/js/main/settle.js
2975097: node_modules/bluebird/js/main/context.js
3031473: node_modules/bluebird/js/main/some.js
2976035: node_modules/bluebird/js/main/catch_filter.js
3002811: node_modules/bluebird/js/main/cancel.js
3004209: node_modules/bluebird/js/main/using.js
2978109: node_modules/bluebird/js/main/promise_resolver.js
3034851: node_modules/bluebird/js/main/promisify.js
2981972: node_modules/bluebird/js/main/progress.js
3011204: node_modules/bluebird/js/main/generators.js
2984464: node_modules/bluebird/js/main/method.js
3046413: node_modules/bluebird/js/main/any.js
3015905: node_modules/bluebird/js/main/nodeify.js
3046834: node_modules/bluebird/js/main/each.js
2985800: node_modules/bluebird/js/main/bind.js
3047132: node_modules/bluebird/js/main/timers.js
3017541: node_modules/bluebird/js/main/call_get.js
2987812: node_modules/bluebird/js/main/finally.js
3048873: node_modules/bluebird/js/main/filter.js
2990436: node_modules/bluebird/js/main/direct_resolve.js
3021885: node_modules/bluebird/js/main/props.js
2991902: node_modules/bluebird/js/main/synchronous_inspection.js
2994543: node_modules/bluebird/js/main/join.js
3024057: node_modules/bluebird/js/main/race.js
3025282: node_modules/bluebird/js/main/reduce.js
2998433: node_modules/bluebird/js/main/map.js
2937208: node_modules/bluebird/js/main/async.js
3049187: node_modules/babel-core/package.json
3030305: node_modules/bluebird/js/main/settle.js
3002811: node_modules/bluebird/js/main/cancel.js
3031473: node_modules/bluebird/js/main/some.js
3004209: node_modules/bluebird/js/main/using.js
3034851: node_modules/bluebird/js/main/promisify.js
3011204: node_modules/bluebird/js/main/generators.js
1973294: src/compile-cache.js
3015905: node_modules/bluebird/js/main/nodeify.js
3046413: node_modules/bluebird/js/main/any.js
3046834: node_modules/bluebird/js/main/each.js
3017541: node_modules/bluebird/js/main/call_get.js
3047132: node_modules/bluebird/js/main/timers.js
3021885: node_modules/bluebird/js/main/props.js
2901506: node_modules/bluebird/js/main/promise.js
3048873: node_modules/bluebird/js/main/filter.js
3024057: node_modules/bluebird/js/main/race.js
3025282: node_modules/bluebird/js/main/reduce.js
2937208: node_modules/bluebird/js/main/async.js
3030305: node_modules/bluebird/js/main/settle.js
2901212: node_modules/bluebird/js/main/bluebird.js
3049187: node_modules/babel-core/package.json
3031473: node_modules/bluebird/js/main/some.js
2926597: node_modules/bluebird/js/main/util.js
3034851: node_modules/bluebird/js/main/promisify.js
3046413: node_modules/bluebird/js/main/any.js
3052709: src/window.js
3046834: node_modules/bluebird/js/main/each.js
3053190: src/nylas-env.js
1973294: src/compile-cache.js
3047132: node_modules/bluebird/js/main/timers.js
3048873: node_modules/bluebird/js/main/filter.js
2901506: node_modules/bluebird/js/main/promise.js
2937208: node_modules/bluebird/js/main/async.js
3049187: node_modules/babel-core/package.json
2901212: node_modules/bluebird/js/main/bluebird.js
2926597: node_modules/bluebird/js/main/util.js
1973294: src/compile-cache.js
2266273: node_modules/emissary/lib/emissary.js
2266555: node_modules/emissary/lib/helpers.js
3052709: src/window.js
2268129: node_modules/emissary/lib/behavior.js
2274072: node_modules/emissary/node_modules/underscore-plus/lib/underscore-plus.js
2901506: node_modules/bluebird/js/main/promise.js
3053190: src/nylas-env.js
2290574: node_modules/emissary/node_modules/underscore-plus/node_modules/underscore/underscore.js
2901212: node_modules/bluebird/js/main/bluebird.js
2926597: node_modules/bluebird/js/main/util.js
2266273: node_modules/emissary/lib/emissary.js
3052709: src/window.js
2266555: node_modules/emissary/lib/helpers.js
3053190: src/nylas-env.js
2268129: node_modules/emissary/lib/behavior.js
2274072: node_modules/emissary/node_modules/underscore-plus/lib/underscore-plus.js
2337929: node_modules/property-accessors/lib/property-accessors.js
2290574: node_modules/emissary/node_modules/underscore-plus/node_modules/underscore/underscore.js
2369463: node_modules/emissary/node_modules/mixto/lib/mixin.js
2343179: node_modules/emissary/lib/signal.js
2352520: node_modules/emissary/lib/emitter.js
2370863: node_modules/emissary/lib/subscriber.js
2374948: node_modules/emissary/lib/subscription.js
2266273: node_modules/emissary/lib/emissary.js
2266555: node_modules/emissary/lib/helpers.js
2268129: node_modules/emissary/lib/behavior.js
2274072: node_modules/emissary/node_modules/underscore-plus/lib/underscore-plus.js
2378208: node_modules/event-kit/lib/event-kit.js
2337929: node_modules/property-accessors/lib/property-accessors.js
2378397: node_modules/event-kit/lib/emitter.js
2369463: node_modules/emissary/node_modules/mixto/lib/mixin.js
2290574: node_modules/emissary/node_modules/underscore-plus/node_modules/underscore/underscore.js
2382101: node_modules/event-kit/lib/disposable.js
2343179: node_modules/emissary/lib/signal.js
2394595: node_modules/event-kit/lib/composite-disposable.js
3088814: node_modules/coffeestack/index.js
2352520: node_modules/emissary/lib/emitter.js
3093983: src/window-event-handler.js
2370863: node_modules/emissary/lib/subscriber.js
2374948: node_modules/emissary/lib/subscription.js
2378208: node_modules/event-kit/lib/event-kit.js
2337929: node_modules/property-accessors/lib/property-accessors.js
3106501: src/styles-element.js
2378397: node_modules/event-kit/lib/emitter.js
2369463: node_modules/emissary/node_modules/mixto/lib/mixin.js
2382101: node_modules/event-kit/lib/disposable.js
94901394: src/store-registry.js
2343179: node_modules/emissary/lib/signal.js
2394595: node_modules/event-kit/lib/composite-disposable.js
3264167: src/serializable-registry.js
3088814: node_modules/coffeestack/index.js
2352520: node_modules/emissary/lib/emitter.js
3093983: src/window-event-handler.js
2207382: src/flux/models/utils.js
2370863: node_modules/emissary/lib/subscriber.js
2374948: node_modules/emissary/lib/subscription.js
8174990: node_modules/moment-timezone/package.json
8177056: node_modules/moment-timezone/index.js
8177170: node_modules/moment-timezone/moment-timezone.js
2378208: node_modules/event-kit/lib/event-kit.js
2378397: node_modules/event-kit/lib/emitter.js
3974612: node_modules/moment/moment.js
3106501: src/styles-element.js
2382101: node_modules/event-kit/lib/disposable.js
2394595: node_modules/event-kit/lib/composite-disposable.js
94901394: src/store-registry.js
3088814: node_modules/coffeestack/index.js
3264167: src/serializable-registry.js
3093983: src/window-event-handler.js
2207382: src/flux/models/utils.js
8174990: node_modules/moment-timezone/package.json
8177056: node_modules/moment-timezone/index.js
8177170: node_modules/moment-timezone/moment-timezone.js
3106501: src/styles-element.js
3974612: node_modules/moment/moment.js
94901394: src/store-registry.js
3264167: src/serializable-registry.js
2207382: src/flux/models/utils.js
8174990: node_modules/moment-timezone/package.json
8177056: node_modules/moment-timezone/index.js
8177170: node_modules/moment-timezone/moment-timezone.js
3974612: node_modules/moment/moment.js
8190929: node_modules/moment-timezone/data/packed/latest.json
8190929: node_modules/moment-timezone/data/packed/latest.json
8190929: node_modules/moment-timezone/data/packed/latest.json
3261374: src/task-registry.js
3271782: src/database-object-registry.js
3113921: src/flux/errors.js
3261374: src/task-registry.js
3271782: src/database-object-registry.js
3113921: src/flux/errors.js
3261374: src/task-registry.js
1918089: src/error-logger.js
1918089: src/error-logger.js
3271782: src/database-object-registry.js
3113921: src/flux/errors.js
1928640: src/error-logger-extensions/nylas-private-error-reporter.js
1933337: node_modules/raven/package.json
1928640: src/error-logger-extensions/nylas-private-error-reporter.js
1935222: node_modules/raven/index.js
1935631: node_modules/raven/lib/client.js
1933337: node_modules/raven/package.json
1935222: node_modules/raven/index.js
1941308: node_modules/raven/lib/parsers.js
1935631: node_modules/raven/lib/client.js
1946217: node_modules/raven/node_modules/cookie/index.js
1948116: node_modules/raven/lib/utils.js
1941308: node_modules/raven/lib/parsers.js
1953762: node_modules/raven/lib/transports.js
1946217: node_modules/raven/node_modules/cookie/index.js
1948116: node_modules/raven/lib/utils.js
1953762: node_modules/raven/lib/transports.js
1918089: src/error-logger.js
1928640: src/error-logger-extensions/nylas-private-error-reporter.js
1933337: node_modules/raven/package.json
1935222: node_modules/raven/index.js
1935631: node_modules/raven/lib/client.js
1941308: node_modules/raven/lib/parsers.js
1946217: node_modules/raven/node_modules/cookie/index.js
1948116: node_modules/raven/lib/utils.js
1953762: node_modules/raven/lib/transports.js
1957254: node_modules/raven/node_modules/lsmod/index.js
1957254: node_modules/raven/node_modules/lsmod/index.js
1960042: node_modules/raven/node_modules/stack-trace/lib/stack-trace.js
1960042: node_modules/raven/node_modules/stack-trace/lib/stack-trace.js
1964629: node_modules/node-uuid/uuid.js
1964629: node_modules/node-uuid/uuid.js
1933337: node_modules/raven/package.json
1933337: node_modules/raven/package.json
1972642: node_modules/raven/lib/middleware/connect.js
1972642: node_modules/raven/lib/middleware/connect.js
1957254: node_modules/raven/node_modules/lsmod/index.js
1960042: node_modules/raven/node_modules/stack-trace/lib/stack-trace.js
1964629: node_modules/node-uuid/uuid.js
1933337: node_modules/raven/package.json
1972642: node_modules/raven/lib/middleware/connect.js
2238228: src/config.js
2238228: src/config.js
2261295: src/config-utils.js
2261295: src/config-utils.js
2444020: node_modules/pathwatcher/lib/main.js
2444020: node_modules/pathwatcher/lib/main.js
2450494: node_modules/pathwatcher/lib/file.js
2450494: node_modules/pathwatcher/lib/file.js
2530619: node_modules/pathwatcher/lib/directory.js
2530619: node_modules/pathwatcher/lib/directory.js
2572883: src/color.js
2572883: src/color.js
2238228: src/config.js
3115571: src/keymap-manager.js
3115571: src/keymap-manager.js
2261295: src/config-utils.js
72365667: node_modules/mousetrap/mousetrap.js
72365667: node_modules/mousetrap/mousetrap.js
2444020: node_modules/pathwatcher/lib/main.js
3122755: src/command-registry.js
3122755: src/command-registry.js
3153088: src/package-manager.js
3153088: src/package-manager.js
2450494: node_modules/pathwatcher/lib/file.js
3176053: node_modules/q/q.js
3176053: node_modules/q/q.js
2530619: node_modules/pathwatcher/lib/directory.js
2572883: src/color.js
3115571: src/keymap-manager.js
72365667: node_modules/mousetrap/mousetrap.js
3122755: src/command-registry.js
3176053: node_modules/q/q.js
3176053: node_modules/q/q.js
3153088: src/package-manager.js
3153088: src/package-manager.js
3153088: src/package-manager.js
3053190: src/nylas-env.js
3053190: src/nylas-env.js
3176053: node_modules/q/q.js
94886363: src/secondary-window-bootstrap.js
2925857: src/window-bootstrap.js
3238845: src/package.js
3238845: src/package.js
2407083: node_modules/async/lib/async.js
2407083: node_modules/async/lib/async.js
3176053: node_modules/q/q.js
3274725: src/theme-package.js
3274725: src/theme-package.js
3276790: src/flux/stores/database-store.js
3276790: src/flux/stores/database-store.js
3153088: src/package-manager.js
3053190: src/nylas-env.js
94886363: src/secondary-window-bootstrap.js
2405266: node_modules/async/package.json
2405266: node_modules/async/package.json
3305440: node_modules/sqlite3/package.json
3305440: node_modules/sqlite3/package.json
3317559: node_modules/sqlite3/lib/sqlite3.js
3317559: node_modules/sqlite3/lib/sqlite3.js
3323109: node_modules/node-pre-gyp/lib/node-pre-gyp.js
3323109: node_modules/node-pre-gyp/lib/node-pre-gyp.js
3238845: src/package.js
74661469: node_modules/nopt/lib/nopt.js
74661469: node_modules/nopt/lib/nopt.js
41220040: node_modules/abbrev/abbrev.js
41220040: node_modules/abbrev/abbrev.js
2407083: node_modules/async/lib/async.js
74736261: node_modules/npmlog/log.js
74736261: node_modules/npmlog/log.js
41757580: node_modules/are-we-there-yet/index.js
41757580: node_modules/are-we-there-yet/index.js
41760200: node_modules/are-we-there-yet/tracker-group.js
41760200: node_modules/are-we-there-yet/tracker-group.js
41759926: node_modules/are-we-there-yet/tracker-base.js
41759926: node_modules/are-we-there-yet/tracker-base.js
41764374: node_modules/are-we-there-yet/tracker.js
41764374: node_modules/are-we-there-yet/tracker.js
41763431: node_modules/are-we-there-yet/tracker-stream.js
41763431: node_modules/are-we-there-yet/tracker-stream.js
3327439: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/readable-stream/readable.js
3327439: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/readable-stream/readable.js
3327909: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_readable.js
3274725: src/theme-package.js
3327909: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_readable.js
3276790: src/flux/stores/database-store.js
56978227: node_modules/falafel/node_modules/isarray/index.js
56978227: node_modules/falafel/node_modules/isarray/index.js
56174974: node_modules/core-util-is/lib/util.js
56174974: node_modules/core-util-is/lib/util.js
3357009: node_modules/babel-core/node_modules/regenerator/node_modules/commoner/node_modules/glob/node_modules/inherits/inherits.js
3357009: node_modules/babel-core/node_modules/regenerator/node_modules/commoner/node_modules/glob/node_modules/inherits/inherits.js
3357051: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_writable.js
2405266: node_modules/async/package.json
3357051: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_writable.js
3305440: node_modules/sqlite3/package.json
3317559: node_modules/sqlite3/lib/sqlite3.js
3370120: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_duplex.js
3370120: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_duplex.js
3372931: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_transform.js
3323109: node_modules/node-pre-gyp/lib/node-pre-gyp.js
3372931: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_transform.js
3380281: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_passthrough.js
74661469: node_modules/nopt/lib/nopt.js
3380281: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_passthrough.js
56223160: node_modules/delegates/index.js
56223160: node_modules/delegates/index.js
41220040: node_modules/abbrev/abbrev.js
57167856: node_modules/gauge/progress-bar.js
57167856: node_modules/gauge/progress-bar.js
74736261: node_modules/npmlog/log.js
57204450: node_modules/has-unicode/index.js
57204450: node_modules/has-unicode/index.js
41738129: node_modules/ansi/lib/ansi.js
41738129: node_modules/ansi/lib/ansi.js
41757580: node_modules/are-we-there-yet/index.js
41760200: node_modules/are-we-there-yet/tracker-group.js
41759926: node_modules/are-we-there-yet/tracker-base.js
41746103: node_modules/ansi/lib/newlines.js
41746103: node_modules/ansi/lib/newlines.js
41764374: node_modules/are-we-there-yet/tracker.js
41763431: node_modules/are-we-there-yet/tracker-stream.js
3327439: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/readable-stream/readable.js
67599487: node_modules/lodash.pad/index.js
67599487: node_modules/lodash.pad/index.js
3327909: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_readable.js
67593383: node_modules/lodash._baseslice/index.js
67593383: node_modules/lodash._baseslice/index.js
67646936: node_modules/lodash.tostring/index.js
67646936: node_modules/lodash.tostring/index.js
56978227: node_modules/falafel/node_modules/isarray/index.js
56174974: node_modules/core-util-is/lib/util.js
67615561: node_modules/lodash.padend/index.js
67615561: node_modules/lodash.padend/index.js
3357009: node_modules/babel-core/node_modules/regenerator/node_modules/commoner/node_modules/glob/node_modules/inherits/inherits.js
3357051: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_writable.js
67631576: node_modules/lodash.padstart/index.js
67631576: node_modules/lodash.padstart/index.js
3370120: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_duplex.js
3372931: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_transform.js
3380281: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_passthrough.js
56223160: node_modules/delegates/index.js
57167856: node_modules/gauge/progress-bar.js
3382008: node_modules/node-pre-gyp/lib/pre-binding.js
3382008: node_modules/node-pre-gyp/lib/pre-binding.js
3382833: node_modules/node-pre-gyp/lib/util/versioning.js
57204450: node_modules/has-unicode/index.js
3382833: node_modules/node-pre-gyp/lib/util/versioning.js
41738129: node_modules/ansi/lib/ansi.js
3396883: node_modules/node-pre-gyp/node_modules/semver/semver.js
3396883: node_modules/node-pre-gyp/node_modules/semver/semver.js
41746103: node_modules/ansi/lib/newlines.js
67599487: node_modules/lodash.pad/index.js
67593383: node_modules/lodash._baseslice/index.js
3429402: node_modules/node-pre-gyp/lib/util/abi_crosswalk.json
67646936: node_modules/lodash.tostring/index.js
3429402: node_modules/node-pre-gyp/lib/util/abi_crosswalk.json
3446169: node_modules/node-pre-gyp/package.json
67615561: node_modules/lodash.padend/index.js
3446169: node_modules/node-pre-gyp/package.json
3305440: node_modules/sqlite3/package.json
67631576: node_modules/lodash.padstart/index.js
3305440: node_modules/sqlite3/package.json
3382008: node_modules/node-pre-gyp/lib/pre-binding.js
3382833: node_modules/node-pre-gyp/lib/util/versioning.js
3396883: node_modules/node-pre-gyp/node_modules/semver/semver.js
3449351: src/flux/models/model.js
3449351: src/flux/models/model.js
3454751: src/flux/attributes.js
3454751: src/flux/attributes.js
3458403: src/flux/attributes/matcher.js
3458403: src/flux/attributes/matcher.js
3429402: node_modules/node-pre-gyp/lib/util/abi_crosswalk.json
3446169: node_modules/node-pre-gyp/package.json
3305440: node_modules/sqlite3/package.json
3470821: src/flux/attributes/sort-order.js
3470821: src/flux/attributes/sort-order.js
3471723: src/flux/attributes/attribute.js
3471723: src/flux/attributes/attribute.js
3474483: src/flux/attributes/attribute-number.js
3474483: src/flux/attributes/attribute-number.js
3477709: src/flux/attributes/attribute-string.js
3477709: src/flux/attributes/attribute-string.js
3479579: src/flux/attributes/attribute-object.js
3479579: src/flux/attributes/attribute-object.js
3481139: src/flux/attributes/attribute-boolean.js
3481139: src/flux/attributes/attribute-boolean.js
3482541: src/flux/attributes/attribute-datetime.js
3482541: src/flux/attributes/attribute-datetime.js
3485716: src/flux/attributes/attribute-collection.js
3485716: src/flux/attributes/attribute-collection.js
3490067: src/flux/attributes/attribute-joined-data.js
3490067: src/flux/attributes/attribute-joined-data.js
3492659: src/flux/attributes/attribute-serverid.js
3492659: src/flux/attributes/attribute-serverid.js
3494243: src/flux/actions.js
3449351: src/flux/models/model.js
3494243: src/flux/actions.js
3509768: node_modules/reflux/package.json
3454751: src/flux/attributes.js
3509768: node_modules/reflux/package.json
3511690: node_modules/reflux/src/index.js
3458403: src/flux/attributes/matcher.js
3511690: node_modules/reflux/src/index.js
3513193: node_modules/reflux/src/ListenerMethods.js
3513193: node_modules/reflux/src/ListenerMethods.js
3519984: node_modules/reflux/src/utils.js
3519984: node_modules/reflux/src/utils.js
3521383: node_modules/reflux/node_modules/eventemitter3/index.js
3521383: node_modules/reflux/node_modules/eventemitter3/index.js
3470821: src/flux/attributes/sort-order.js
3527461: node_modules/reflux/src/joins.js
3471723: src/flux/attributes/attribute.js
3527461: node_modules/reflux/src/joins.js
3530350: node_modules/reflux/src/createStore.js
3530350: node_modules/reflux/src/createStore.js
3474483: src/flux/attributes/attribute-number.js
3531848: node_modules/reflux/src/Keep.js
3477709: src/flux/attributes/attribute-string.js
3531848: node_modules/reflux/src/Keep.js
3479579: src/flux/attributes/attribute-object.js
3532111: node_modules/reflux/src/PublisherMethods.js
3532111: node_modules/reflux/src/PublisherMethods.js
3481139: src/flux/attributes/attribute-boolean.js
3534287: node_modules/reflux/src/createAction.js
3534287: node_modules/reflux/src/createAction.js
3482541: src/flux/attributes/attribute-datetime.js
3535424: node_modules/reflux/src/connect.js
3535424: node_modules/reflux/src/connect.js
3485716: src/flux/attributes/attribute-collection.js
3536186: node_modules/reflux/src/ListenerMixin.js
3536186: node_modules/reflux/src/ListenerMixin.js
3490067: src/flux/attributes/attribute-joined-data.js
3536620: node_modules/reflux/src/listenTo.js
3536620: node_modules/reflux/src/listenTo.js
3538124: node_modules/reflux/src/listenToMany.js
3492659: src/flux/attributes/attribute-serverid.js
3538124: node_modules/reflux/src/listenToMany.js
3494243: src/flux/actions.js
3509768: node_modules/reflux/package.json
3511690: node_modules/reflux/src/index.js
3513193: node_modules/reflux/src/ListenerMethods.js
3519984: node_modules/reflux/src/utils.js
3521383: node_modules/reflux/node_modules/eventemitter3/index.js
3527461: node_modules/reflux/src/joins.js
3530350: node_modules/reflux/src/createStore.js
3531848: node_modules/reflux/src/Keep.js
3532111: node_modules/reflux/src/PublisherMethods.js
3534287: node_modules/reflux/src/createAction.js
3535424: node_modules/reflux/src/connect.js
3539478: src/flux/models/query.js
3539478: src/flux/models/query.js
3536186: node_modules/reflux/src/ListenerMixin.js
3536620: node_modules/reflux/src/listenTo.js
3538124: node_modules/reflux/src/listenToMany.js
3553781: src/flux/models/query-range.js
3553781: src/flux/models/query-range.js
3556781: src/global/nylas-store.js
3556781: src/global/nylas-store.js
3557281: src/flux/modules/reflux-coffee.js
3557281: src/flux/modules/reflux-coffee.js
3564303: node_modules/underscore.string/package.json
3564303: node_modules/underscore.string/package.json
3126085: node_modules/underscore.string/index.js
3126085: node_modules/underscore.string/index.js
3130619: node_modules/underscore.string/isBlank.js
3130619: node_modules/underscore.string/isBlank.js
3130755: node_modules/underscore.string/helper/makeString.js
3130755: node_modules/underscore.string/helper/makeString.js
3130916: node_modules/underscore.string/stripTags.js
3130916: node_modules/underscore.string/stripTags.js
3131065: node_modules/underscore.string/capitalize.js
3131065: node_modules/underscore.string/capitalize.js
3131341: node_modules/underscore.string/decapitalize.js
3131341: node_modules/underscore.string/decapitalize.js
3131518: node_modules/underscore.string/chop.js
3131518: node_modules/underscore.string/chop.js
3131710: node_modules/underscore.string/trim.js
3131710: node_modules/underscore.string/trim.js
3132143: node_modules/underscore.string/helper/defaultToWhiteSpace.js
3132143: node_modules/underscore.string/helper/defaultToWhiteSpace.js
3132413: node_modules/underscore.string/helper/escapeRegExp.js
3132413: node_modules/underscore.string/helper/escapeRegExp.js
3132577: node_modules/underscore.string/clean.js
3132577: node_modules/underscore.string/clean.js
3132693: node_modules/underscore.string/cleanDiacritics.js
3132693: node_modules/underscore.string/cleanDiacritics.js
3133280: node_modules/underscore.string/count.js
3133280: node_modules/underscore.string/count.js
3133530: node_modules/underscore.string/chars.js
3133530: node_modules/underscore.string/chars.js
3539478: src/flux/models/query.js
3133658: node_modules/underscore.string/swapCase.js
3133883: node_modules/underscore.string/escapeHTML.js
3133658: node_modules/underscore.string/swapCase.js
3134273: node_modules/underscore.string/helper/escapeChars.js
3133883: node_modules/underscore.string/escapeHTML.js
3134692: node_modules/underscore.string/unescapeHTML.js
3553781: src/flux/models/query-range.js
3134273: node_modules/underscore.string/helper/escapeChars.js
3135351: node_modules/underscore.string/helper/htmlEntities.js
3134692: node_modules/underscore.string/unescapeHTML.js
3135655: node_modules/underscore.string/splice.js
3135351: node_modules/underscore.string/helper/htmlEntities.js
3556781: src/global/nylas-store.js
3135836: node_modules/underscore.string/insert.js
3135655: node_modules/underscore.string/splice.js
3135961: node_modules/underscore.string/replaceAll.js
3135836: node_modules/underscore.string/insert.js
3136217: node_modules/underscore.string/include.js
3557281: src/flux/modules/reflux-coffee.js
3135961: node_modules/underscore.string/replaceAll.js
3136402: node_modules/underscore.string/join.js
3136217: node_modules/underscore.string/include.js
3136622: node_modules/underscore.string/lines.js
3136402: node_modules/underscore.string/join.js
3136734: node_modules/underscore.string/dedent.js
3136622: node_modules/underscore.string/lines.js
3136734: node_modules/underscore.string/dedent.js
3564303: node_modules/underscore.string/package.json
3137344: node_modules/underscore.string/reverse.js
3126085: node_modules/underscore.string/index.js
3137461: node_modules/underscore.string/startsWith.js
3137811: node_modules/underscore.string/helper/toPositive.js
3130619: node_modules/underscore.string/isBlank.js
3137903: node_modules/underscore.string/endsWith.js
3130755: node_modules/underscore.string/helper/makeString.js
3137344: node_modules/underscore.string/reverse.js
3138345: node_modules/underscore.string/pred.js
3130916: node_modules/underscore.string/stripTags.js
3138460: node_modules/underscore.string/helper/adjacent.js
3137461: node_modules/underscore.string/startsWith.js
3131065: node_modules/underscore.string/capitalize.js
3137811: node_modules/underscore.string/helper/toPositive.js
3131341: node_modules/underscore.string/decapitalize.js
3138722: node_modules/underscore.string/succ.js
3137903: node_modules/underscore.string/endsWith.js
3131518: node_modules/underscore.string/chop.js
3138836: node_modules/underscore.string/titleize.js
3131710: node_modules/underscore.string/trim.js
3138345: node_modules/underscore.string/pred.js
3139043: node_modules/underscore.string/camelize.js
3132143: node_modules/underscore.string/helper/defaultToWhiteSpace.js
3138460: node_modules/underscore.string/helper/adjacent.js
3139364: node_modules/underscore.string/underscored.js
3132413: node_modules/underscore.string/helper/escapeRegExp.js
3139540: node_modules/underscore.string/dasherize.js
3132577: node_modules/underscore.string/clean.js
3139703: node_modules/underscore.string/classify.js
3132693: node_modules/underscore.string/cleanDiacritics.js
3139981: node_modules/underscore.string/humanize.js
3138722: node_modules/underscore.string/succ.js
3140227: node_modules/underscore.string/ltrim.js
3138836: node_modules/underscore.string/titleize.js
3140651: node_modules/underscore.string/rtrim.js
3133280: node_modules/underscore.string/count.js
3139043: node_modules/underscore.string/camelize.js
3141074: node_modules/underscore.string/truncate.js
3133530: node_modules/underscore.string/chars.js
3141347: node_modules/underscore.string/prune.js
3139364: node_modules/underscore.string/underscored.js
3133658: node_modules/underscore.string/swapCase.js
3139540: node_modules/underscore.string/dasherize.js
3142255: node_modules/underscore.string/words.js
3139703: node_modules/underscore.string/classify.js
3142463: node_modules/underscore.string/pad.js
3133883: node_modules/underscore.string/escapeHTML.js
3139981: node_modules/underscore.string/humanize.js
3143150: node_modules/underscore.string/helper/strRepeat.js
3134273: node_modules/underscore.string/helper/escapeChars.js
3143345: node_modules/underscore.string/lpad.js
3140227: node_modules/underscore.string/ltrim.js
3143466: node_modules/underscore.string/rpad.js
3134692: node_modules/underscore.string/unescapeHTML.js
3140651: node_modules/underscore.string/rtrim.js
3143596: node_modules/underscore.string/lrpad.js
3135351: node_modules/underscore.string/helper/htmlEntities.js
3141074: node_modules/underscore.string/truncate.js
3135655: node_modules/underscore.string/splice.js
3141347: node_modules/underscore.string/prune.js
3143726: node_modules/underscore.string/sprintf.js
3135836: node_modules/underscore.string/insert.js
4476299: node_modules/juice/node_modules/util-deprecate/node.js
3142255: node_modules/underscore.string/words.js
3135961: node_modules/underscore.string/replaceAll.js
3142463: node_modules/underscore.string/pad.js
89722232: node_modules/underscore.string/node_modules/sprintf-js/src/sprintf.js
3136217: node_modules/underscore.string/include.js
3143150: node_modules/underscore.string/helper/strRepeat.js
3136402: node_modules/underscore.string/join.js
3143345: node_modules/underscore.string/lpad.js
3136622: node_modules/underscore.string/lines.js
3143466: node_modules/underscore.string/rpad.js
3136734: node_modules/underscore.string/dedent.js
3143923: node_modules/underscore.string/vsprintf.js
3143596: node_modules/underscore.string/lrpad.js
3137344: node_modules/underscore.string/reverse.js
3144122: node_modules/underscore.string/toNumber.js
3143726: node_modules/underscore.string/sprintf.js
3137461: node_modules/underscore.string/startsWith.js
3144317: node_modules/underscore.string/numberFormat.js
4476299: node_modules/juice/node_modules/util-deprecate/node.js
3137811: node_modules/underscore.string/helper/toPositive.js
3144704: node_modules/underscore.string/strRight.js
3137903: node_modules/underscore.string/endsWith.js
3144959: node_modules/underscore.string/strRightBack.js
89722232: node_modules/underscore.string/node_modules/sprintf-js/src/sprintf.js
3138345: node_modules/underscore.string/pred.js
3145222: node_modules/underscore.string/strLeft.js
3138460: node_modules/underscore.string/helper/adjacent.js
3145454: node_modules/underscore.string/strLeftBack.js
3145682: node_modules/underscore.string/toSentence.js
3143923: node_modules/underscore.string/vsprintf.js
3138722: node_modules/underscore.string/succ.js
3146093: node_modules/underscore.string/toSentenceSerial.js
3144122: node_modules/underscore.string/toNumber.js
3144317: node_modules/underscore.string/numberFormat.js
3138836: node_modules/underscore.string/titleize.js
3146253: node_modules/underscore.string/slugify.js
3144704: node_modules/underscore.string/strRight.js
3139043: node_modules/underscore.string/camelize.js
3146513: node_modules/underscore.string/surround.js
3144959: node_modules/underscore.string/strRightBack.js
3139364: node_modules/underscore.string/underscored.js
3146610: node_modules/underscore.string/quote.js
3145222: node_modules/underscore.string/strLeft.js
3139540: node_modules/underscore.string/dasherize.js
3146744: node_modules/underscore.string/unquote.js
3145454: node_modules/underscore.string/strLeftBack.js
3139703: node_modules/underscore.string/classify.js
3146956: node_modules/underscore.string/repeat.js
3145682: node_modules/underscore.string/toSentence.js
3147436: node_modules/underscore.string/naturalCmp.js
3139981: node_modules/underscore.string/humanize.js
3146093: node_modules/underscore.string/toSentenceSerial.js
3148137: node_modules/underscore.string/levenshtein.js
3140227: node_modules/underscore.string/ltrim.js
3140651: node_modules/underscore.string/rtrim.js
3149427: node_modules/underscore.string/toBoolean.js
3146253: node_modules/underscore.string/slugify.js
3150095: node_modules/underscore.string/exports.js
3141074: node_modules/underscore.string/truncate.js
3150336: node_modules/underscore.string/wrap.js
3146513: node_modules/underscore.string/surround.js
3141347: node_modules/underscore.string/prune.js
3146610: node_modules/underscore.string/quote.js
3152857: node_modules/underscore.string/map.js
3142255: node_modules/underscore.string/words.js
3146744: node_modules/underscore.string/unquote.js
3142463: node_modules/underscore.string/pad.js
3146956: node_modules/underscore.string/repeat.js
3143150: node_modules/underscore.string/helper/strRepeat.js
3147436: node_modules/underscore.string/naturalCmp.js
3143345: node_modules/underscore.string/lpad.js
3148137: node_modules/underscore.string/levenshtein.js
3568295: src/flux/coffee-helpers.js
3143466: node_modules/underscore.string/rpad.js
3149427: node_modules/underscore.string/toBoolean.js
3143596: node_modules/underscore.string/lrpad.js
3150095: node_modules/underscore.string/exports.js
3143726: node_modules/underscore.string/sprintf.js
3150336: node_modules/underscore.string/wrap.js
4476299: node_modules/juice/node_modules/util-deprecate/node.js
3152857: node_modules/underscore.string/map.js
3570836: node_modules/promise-queue/package.json
89722232: node_modules/underscore.string/node_modules/sprintf-js/src/sprintf.js
3572457: node_modules/promise-queue/index.js
3568295: src/flux/coffee-helpers.js
3572560: node_modules/promise-queue/lib/index.js
3143923: node_modules/underscore.string/vsprintf.js
3144122: node_modules/underscore.string/toNumber.js
3144317: node_modules/underscore.string/numberFormat.js
3577195: src/priority-ui-coordinator.js
3144704: node_modules/underscore.string/strRight.js
3144959: node_modules/underscore.string/strRightBack.js
3570836: node_modules/promise-queue/package.json
3145222: node_modules/underscore.string/strLeft.js
3579245: src/flux/stores/database-setup-query-builder.js
3572457: node_modules/promise-queue/index.js
3145454: node_modules/underscore.string/strLeftBack.js
3145682: node_modules/underscore.string/toSentence.js
3583641: src/flux/stores/database-change-record.js
3572560: node_modules/promise-queue/lib/index.js
3146093: node_modules/underscore.string/toSentenceSerial.js
3585323: src/flux/stores/database-writer.js
3146253: node_modules/underscore.string/slugify.js
3577195: src/priority-ui-coordinator.js
3146513: node_modules/underscore.string/surround.js
3146610: node_modules/underscore.string/quote.js
3146744: node_modules/underscore.string/unquote.js
3146956: node_modules/underscore.string/repeat.js
3579245: src/flux/stores/database-setup-query-builder.js
3147436: node_modules/underscore.string/naturalCmp.js
3148137: node_modules/underscore.string/levenshtein.js
3583641: src/flux/stores/database-change-record.js
3149427: node_modules/underscore.string/toBoolean.js
3150095: node_modules/underscore.string/exports.js
3585323: src/flux/stores/database-writer.js
3150336: node_modules/underscore.string/wrap.js
3152857: node_modules/underscore.string/map.js
3568295: src/flux/coffee-helpers.js
3599638: src/apm-wrapper.js
3570836: node_modules/promise-queue/package.json
3572457: node_modules/promise-queue/index.js
3613961: src/buffered-process.js
3572560: node_modules/promise-queue/lib/index.js
3577195: src/priority-ui-coordinator.js
3599638: src/apm-wrapper.js
3621867: src/clipboard.js
3579245: src/flux/stores/database-setup-query-builder.js
3583641: src/flux/stores/database-change-record.js
3613961: src/buffered-process.js
3622937: src/theme-manager.js
3585323: src/flux/stores/database-writer.js
3621867: src/clipboard.js
3642517: src/style-manager.js
3648228: src/flux/action-bridge.js
3622937: src/theme-manager.js
3654791: src/menu-manager.js
3658911: src/menu-helpers.js
3642517: src/style-manager.js
3648228: src/flux/action-bridge.js
3599638: src/apm-wrapper.js
3654791: src/menu-manager.js
3658911: src/menu-helpers.js
3613961: src/buffered-process.js
3621867: src/clipboard.js
3622937: src/theme-manager.js
3677020: menus/darwin.json
3642517: src/style-manager.js
3648228: src/flux/action-bridge.js
3654791: src/menu-manager.js
3677020: menus/darwin.json
3662409: src/nylas-spellchecker.js
3658911: src/menu-helpers.js
3662409: src/nylas-spellchecker.js
3677020: menus/darwin.json
3662409: src/nylas-spellchecker.js
3798011: src/global/nylas-exports.js
3798011: src/global/nylas-exports.js
5912469: src/deprecate-utils.js
3668481: src/config-schema.js
5912469: src/deprecate-utils.js
3798011: src/global/nylas-exports.js
5912469: src/deprecate-utils.js
3668481: src/config-schema.js
4687050: src/global/nylas-observables.js
4697858: node_modules/rx-lite/package.json
4699647: node_modules/rx-lite/rx.lite.js
4687050: src/global/nylas-observables.js
4697858: node_modules/rx-lite/package.json
4699647: node_modules/rx-lite/rx.lite.js
4699647: node_modules/rx-lite/rx.lite.js
4687050: src/global/nylas-observables.js
4699647: node_modules/rx-lite/rx.lite.js
4687050: src/global/nylas-observables.js
3925280: src/flux/models/category.js
5180618: src/flux/models/query-subscription-pool.js
5195386: src/flux/models/query-subscription.js
5231737: src/flux/models/mutable-query-result-set.js
5237299: src/flux/models/query-result-set.js
5389575: src/flux/stores/task-queue.js
3925280: src/flux/models/category.js
5180618: src/flux/models/query-subscription-pool.js
3813280: src/flux/tasks/task.js
5195386: src/flux/models/query-subscription.js
5231737: src/flux/models/mutable-query-result-set.js
4200026: src/flux/nylas-api.js
5237299: src/flux/models/query-result-set.js
5389575: src/flux/stores/task-queue.js
4222287: node_modules/request/package.json
4225420: node_modules/request/index.js
80787899: node_modules/request/node_modules/extend/index.js
4229450: node_modules/request/lib/cookies.js
4230419: node_modules/less-cache/node_modules/less/node_modules/request/node_modules/tough-cookie/lib/cookie.js
3813280: src/flux/tasks/task.js
4267962: node_modules/less-cache/node_modules/less/node_modules/request/node_modules/tough-cookie/lib/pubsuffix.js
4200026: src/flux/nylas-api.js
4222287: node_modules/request/package.json
4225420: node_modules/request/index.js
80787899: node_modules/request/node_modules/extend/index.js
4229450: node_modules/request/lib/cookies.js
4230419: node_modules/less-cache/node_modules/less/node_modules/request/node_modules/tough-cookie/lib/cookie.js
4267962: node_modules/less-cache/node_modules/less/node_modules/request/node_modules/tough-cookie/lib/pubsuffix.js
4417589: node_modules/less-cache/node_modules/less/node_modules/request/node_modules/tough-cookie/lib/store.js
4420430: node_modules/less-cache/node_modules/less/node_modules/request/node_modules/tough-cookie/lib/memstore.js
4425944: node_modules/less-cache/node_modules/less/node_modules/request/node_modules/tough-cookie/lib/permuteDomain.js
4428210: node_modules/less-cache/node_modules/less/node_modules/request/node_modules/tough-cookie/lib/pathMatch.js
4430645: node_modules/less-cache/node_modules/less/node_modules/request/node_modules/tough-cookie/package.json
4432858: node_modules/request/lib/helpers.js
4434482: node_modules/less-cache/node_modules/less/node_modules/request/node_modules/json-stringify-safe/stringify.js
4435389: node_modules/request/request.js
4417589: node_modules/less-cache/node_modules/less/node_modules/request/node_modules/tough-cookie/lib/store.js
80567623: node_modules/request/node_modules/bl/bl.js
4420430: node_modules/less-cache/node_modules/less/node_modules/request/node_modules/tough-cookie/lib/memstore.js
4425944: node_modules/less-cache/node_modules/less/node_modules/request/node_modules/tough-cookie/lib/permuteDomain.js
80636139: node_modules/request/node_modules/bl/node_modules/readable-stream/duplex.js
4428210: node_modules/less-cache/node_modules/less/node_modules/request/node_modules/tough-cookie/lib/pathMatch.js
80636191: node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_duplex.js
4430645: node_modules/less-cache/node_modules/less/node_modules/request/node_modules/tough-cookie/package.json
75226954: node_modules/process-nextick-args/index.js
80638643: node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_readable.js
4432858: node_modules/request/lib/helpers.js
4434482: node_modules/less-cache/node_modules/less/node_modules/request/node_modules/json-stringify-safe/stringify.js
4435389: node_modules/request/request.js
57417682: node_modules/isarray/index.js
80670635: node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_writable.js
81345592: node_modules/request/node_modules/hawk/lib/index.js
80567623: node_modules/request/node_modules/bl/bl.js
81416906: node_modules/request/node_modules/hawk/node_modules/boom/lib/index.js
80636139: node_modules/request/node_modules/bl/node_modules/readable-stream/duplex.js
80636191: node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_duplex.js
75226954: node_modules/process-nextick-args/index.js
80638643: node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_readable.js
81490930: node_modules/request/node_modules/hawk/node_modules/hoek/lib/index.js
57417682: node_modules/isarray/index.js
80670635: node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_writable.js
81488262: node_modules/request/node_modules/hawk/node_modules/hoek/lib/escape.js
81520773: node_modules/request/node_modules/hawk/node_modules/sntp/index.js
81345592: node_modules/request/node_modules/hawk/lib/index.js
81416906: node_modules/request/node_modules/hawk/node_modules/boom/lib/index.js
81520807: node_modules/request/node_modules/hawk/node_modules/sntp/lib/index.js
81345973: node_modules/request/node_modules/hawk/lib/server.js
81490930: node_modules/request/node_modules/hawk/node_modules/hoek/lib/index.js
81488262: node_modules/request/node_modules/hawk/node_modules/hoek/lib/escape.js
81520773: node_modules/request/node_modules/hawk/node_modules/sntp/index.js
81520807: node_modules/request/node_modules/hawk/node_modules/sntp/lib/index.js
81428267: node_modules/request/node_modules/hawk/node_modules/cryptiles/lib/index.js
81342006: node_modules/request/node_modules/hawk/lib/crypto.js
81364519: node_modules/request/node_modules/hawk/lib/utils.js
81331415: node_modules/request/node_modules/hawk/lib/client.js
80480692: node_modules/request/node_modules/aws-sign2/index.js
81551606: node_modules/request/node_modules/http-signature/lib/index.js
81552232: node_modules/request/node_modules/http-signature/lib/parser.js
81585919: node_modules/request/node_modules/http-signature/node_modules/assert-plus/assert.js
81345973: node_modules/request/node_modules/hawk/lib/server.js
81428267: node_modules/request/node_modules/hawk/node_modules/cryptiles/lib/index.js
81342006: node_modules/request/node_modules/hawk/lib/crypto.js
81574938: node_modules/request/node_modules/http-signature/lib/utils.js
81364519: node_modules/request/node_modules/hawk/lib/utils.js
81887698: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/index.js
81888429: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/key.js
81331415: node_modules/request/node_modules/hawk/lib/client.js
81950012: node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/assert-plus/assert.js
80480692: node_modules/request/node_modules/aws-sign2/index.js
81551606: node_modules/request/node_modules/http-signature/lib/index.js
81552232: node_modules/request/node_modules/http-signature/lib/parser.js
81585919: node_modules/request/node_modules/http-signature/node_modules/assert-plus/assert.js
81830178: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/algs.js
81847974: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/fingerprint.js
81574938: node_modules/request/node_modules/http-signature/lib/utils.js
81845672: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/errors.js
81911179: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/utils.js
81887698: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/index.js
81888429: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/key.js
81895828: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/private-key.js
81950012: node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/assert-plus/assert.js
81901963: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/signature.js
81942773: node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/index.js
81928490: node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/ber/index.js
81830178: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/algs.js
81928251: node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/ber/errors.js
81934548: node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/ber/types.js
81847974: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/fingerprint.js
81845672: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/errors.js
81928959: node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/ber/reader.js
81911179: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/utils.js
81935186: node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/ber/writer.js
81895828: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/private-key.js
81901963: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/signature.js
81908010: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/ssh-buffer.js
81942773: node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/index.js
81843337: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/ed-compat.js
81928490: node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/ber/index.js
81928251: node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/ber/errors.js
81851404: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/auto.js
81934548: node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/ber/types.js
81853302: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/pem.js
81858111: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/pkcs1.js
81928959: node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/ber/reader.js
81865807: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/pkcs8.js
81935186: node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/ber/writer.js
81881346: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/ssh-private.js
81877740: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/rfc4253.js
81908010: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/ssh-buffer.js
81843337: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/ed-compat.js
81884606: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/ssh.js
81851404: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/auto.js
81835020: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/dhe.js
81853302: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/pem.js
81858111: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/pkcs1.js
81562004: node_modules/request/node_modules/http-signature/lib/signer.js
81865807: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/pkcs8.js
81602307: node_modules/request/node_modules/http-signature/node_modules/jsprim/lib/jsprim.js
81881346: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/ssh-private.js
81632804: node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/extsprintf/lib/extsprintf.js
81877740: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/rfc4253.js
81797823: node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/verror/lib/verror.js
81763963: node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/lib/validate.js
81884606: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/ssh.js
81835020: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/dhe.js
81577777: node_modules/request/node_modules/http-signature/lib/verify.js
82371286: node_modules/request/node_modules/mime-types/index.js
81562004: node_modules/request/node_modules/http-signature/lib/signer.js
82530510: node_modules/request/node_modules/mime-types/node_modules/mime-db/index.js
82387545: node_modules/request/node_modules/mime-types/node_modules/mime-db/db.json
81602307: node_modules/request/node_modules/http-signature/node_modules/jsprim/lib/jsprim.js
81632804: node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/extsprintf/lib/extsprintf.js
81797823: node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/verror/lib/verror.js
81763963: node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/lib/validate.js
81577777: node_modules/request/node_modules/http-signature/lib/verify.js
82371286: node_modules/request/node_modules/mime-types/index.js
82530510: node_modules/request/node_modules/mime-types/node_modules/mime-db/index.js
82387545: node_modules/request/node_modules/mime-types/node_modules/mime-db/db.json
4476422: node_modules/less-cache/node_modules/less/node_modules/request/node_modules/stringstream/stringstream.js
80754327: node_modules/request/node_modules/caseless/index.js
80801324: node_modules/request/node_modules/forever-agent/index.js
80814876: node_modules/request/node_modules/form-data/lib/form_data.js
3668481: src/config-schema.js
80764215: node_modules/request/node_modules/combined-stream/lib/combined_stream.js
80773528: node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/lib/delayed_stream.js
80944514: node_modules/request/node_modules/form-data/node_modules/async/lib/async.js
4476422: node_modules/less-cache/node_modules/less/node_modules/request/node_modules/stringstream/stringstream.js
80754327: node_modules/request/node_modules/caseless/index.js
80801324: node_modules/request/node_modules/forever-agent/index.js
80814876: node_modules/request/node_modules/form-data/lib/form_data.js
80826033: node_modules/request/node_modules/form-data/lib/populate.js
82348558: node_modules/request/node_modules/isstream/isstream.js
82341499: node_modules/request/node_modules/is-typedarray/index.js
80764215: node_modules/request/node_modules/combined-stream/lib/combined_stream.js
4479214: node_modules/request/lib/getProxyFromURI.js
4481482: node_modules/request/lib/querystring.js
80773528: node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/lib/delayed_stream.js
82587962: node_modules/request/node_modules/qs/lib/index.js
82593363: node_modules/request/node_modules/qs/lib/stringify.js
82597342: node_modules/request/node_modules/qs/lib/utils.js
80944514: node_modules/request/node_modules/form-data/node_modules/async/lib/async.js
82588115: node_modules/request/node_modules/qs/lib/parse.js
4482815: node_modules/request/lib/har.js
81001381: node_modules/request/node_modules/har-validator/lib/index.js
81163939: node_modules/request/node_modules/har-validator/node_modules/pinkie-promise/index.js
81001935: node_modules/request/node_modules/har-validator/lib/runner.js
80826033: node_modules/request/node_modules/form-data/lib/populate.js
81005359: node_modules/request/node_modules/har-validator/lib/schemas/index.js
81002525: node_modules/request/node_modules/har-validator/lib/schemas/cache.json
82348558: node_modules/request/node_modules/isstream/isstream.js
81002712: node_modules/request/node_modules/har-validator/lib/schemas/cacheEntry.json
81003206: node_modules/request/node_modules/har-validator/lib/schemas/content.json
82341499: node_modules/request/node_modules/is-typedarray/index.js
81003583: node_modules/request/node_modules/har-validator/lib/schemas/cookie.json
81004081: node_modules/request/node_modules/har-validator/lib/schemas/creator.json
4479214: node_modules/request/lib/getProxyFromURI.js
81004311: node_modules/request/node_modules/har-validator/lib/schemas/entry.json
81005242: node_modules/request/node_modules/har-validator/lib/schemas/har.json
4481482: node_modules/request/lib/querystring.js
81007111: node_modules/request/node_modules/har-validator/lib/schemas/log.json
81007604: node_modules/request/node_modules/har-validator/lib/schemas/page.json
82587962: node_modules/request/node_modules/qs/lib/index.js
81008181: node_modules/request/node_modules/har-validator/lib/schemas/pageTimings.json
81008406: node_modules/request/node_modules/har-validator/lib/schemas/postData.json
82593363: node_modules/request/node_modules/qs/lib/stringify.js
81009060: node_modules/request/node_modules/har-validator/lib/schemas/record.json
81009286: node_modules/request/node_modules/har-validator/lib/schemas/request.json
81010139: node_modules/request/node_modules/har-validator/lib/schemas/response.json
82597342: node_modules/request/node_modules/qs/lib/utils.js
81010946: node_modules/request/node_modules/har-validator/lib/schemas/timings.json
81001195: node_modules/request/node_modules/har-validator/lib/error.js
81108729: node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/index.js
82588115: node_modules/request/node_modules/qs/lib/parse.js
81132607: node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/index.js
4482815: node_modules/request/lib/har.js
81134601: node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/node_modules/is-property/is-property.js
81001381: node_modules/request/node_modules/har-validator/lib/index.js
81127606: node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-function/index.js
81163939: node_modules/request/node_modules/har-validator/node_modules/pinkie-promise/index.js
81149530: node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/jsonpointer.js
81001935: node_modules/request/node_modules/har-validator/lib/runner.js
4525735: node_modules/babel-core/node_modules/output-file-sync/node_modules/xtend/immutable.js
81106380: node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/formats.js
81005359: node_modules/request/node_modules/har-validator/lib/schemas/index.js
81002525: node_modules/request/node_modules/har-validator/lib/schemas/cache.json
81002712: node_modules/request/node_modules/har-validator/lib/schemas/cacheEntry.json
4533728: node_modules/request/lib/auth.js
81003206: node_modules/request/node_modules/har-validator/lib/schemas/content.json
81003583: node_modules/request/node_modules/har-validator/lib/schemas/cookie.json
81004081: node_modules/request/node_modules/har-validator/lib/schemas/creator.json
81004311: node_modules/request/node_modules/har-validator/lib/schemas/entry.json
81005242: node_modules/request/node_modules/har-validator/lib/schemas/har.json
81007111: node_modules/request/node_modules/har-validator/lib/schemas/log.json
4550226: node_modules/request/lib/oauth.js
81007604: node_modules/request/node_modules/har-validator/lib/schemas/page.json
81008181: node_modules/request/node_modules/har-validator/lib/schemas/pageTimings.json
81008406: node_modules/request/node_modules/har-validator/lib/schemas/postData.json
81009060: node_modules/request/node_modules/har-validator/lib/schemas/record.json
81009286: node_modules/request/node_modules/har-validator/lib/schemas/request.json
82544802: node_modules/request/node_modules/oauth-sign/index.js
81010139: node_modules/request/node_modules/har-validator/lib/schemas/response.json
81010946: node_modules/request/node_modules/har-validator/lib/schemas/timings.json
81001195: node_modules/request/node_modules/har-validator/lib/error.js
4568756: node_modules/request/lib/multipart.js
81108729: node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/index.js
4585628: node_modules/request/lib/redirect.js
4594531: node_modules/request/lib/tunnel.js
81132607: node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/index.js
4601413: node_modules/less-cache/node_modules/less/node_modules/request/node_modules/tunnel-agent/index.js
81134601: node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/node_modules/is-property/is-property.js
81127606: node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-function/index.js
81149530: node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/jsonpointer.js
91866084: src/flux/nylas-long-connection.js
4525735: node_modules/babel-core/node_modules/output-file-sync/node_modules/xtend/immutable.js
81106380: node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/formats.js
2376215: node_modules/event-kit/package.json
4533728: node_modules/request/lib/auth.js
3905749: src/flux/models/account.js
3911874: src/flux/models/model-with-metadata.js
4550226: node_modules/request/lib/oauth.js
82544802: node_modules/request/node_modules/oauth-sign/index.js
4568756: node_modules/request/lib/multipart.js
4585628: node_modules/request/lib/redirect.js
3959955: src/flux/models/message.js
4594531: node_modules/request/lib/tunnel.js
3971136: node_modules/moment/package.json
4601413: node_modules/less-cache/node_modules/less/node_modules/request/node_modules/tunnel-agent/index.js
3809622: src/flux/models/file.js
91866084: src/flux/nylas-long-connection.js
3870842: src/flux/models/event.js
3875483: src/flux/models/contact.js
2376215: node_modules/event-kit/package.json
3886010: src/regexp-utils.js
3905749: src/flux/models/account.js
56664169: node_modules/emoji-data/lib/emoji_data.js
3911874: src/flux/models/model-with-metadata.js
56662240: node_modules/emoji-data/lib/emoji_char.js
56691400: node_modules/emoji-data/node_modules/underscore.string/lib/underscore.string.js
3959955: src/flux/models/message.js
3971136: node_modules/moment/package.json
3809622: src/flux/models/file.js
3870842: src/flux/models/event.js
3875483: src/flux/models/contact.js
3886010: src/regexp-utils.js
56664169: node_modules/emoji-data/lib/emoji_data.js
56662240: node_modules/emoji-data/lib/emoji_char.js
56691400: node_modules/emoji-data/node_modules/underscore.string/lib/underscore.string.js
3889367: src/flux/stores/account-store.js
65006241: node_modules/keytar/package.json
65004180: node_modules/keytar/lib/keytar.js
3889367: src/flux/stores/account-store.js
65006241: node_modules/keytar/package.json
65004180: node_modules/keytar/lib/keytar.js
4687050: src/global/nylas-observables.js
4697858: node_modules/rx-lite/package.json
3925080: src/flux/models/label.js
4699647: node_modules/rx-lite/rx.lite.js
3930438: src/flux/models/folder.js
3930638: src/flux/models/thread.js
4096909: src/flux/models/calendar.js
4098495: src/flux/models/json-blob.js
3925080: src/flux/models/label.js
3930438: src/flux/models/folder.js
3930638: src/flux/models/thread.js
4096909: src/flux/models/calendar.js
5951047: src/flux/stores/badge-store.js
5726955: src/flux/stores/focused-perspective-store.js
5744701: src/flux/stores/workspace-store.js
5951047: src/flux/stores/badge-store.js
5726955: src/flux/stores/focused-perspective-store.js
4648657: src/flux/stores/category-store.js
5744701: src/flux/stores/workspace-store.js
9942964: src/flux/stores/nylas-sync-status-store.js
4648657: src/flux/stores/category-store.js
9942964: src/flux/stores/nylas-sync-status-store.js
4699647: node_modules/rx-lite/rx.lite.js
4098495: src/flux/models/json-blob.js
4687050: src/global/nylas-observables.js
4100089: src/mailbox-perspective.js
3925280: src/flux/models/category.js
4120446: src/flux/tasks/task-factory.js
4139229: src/flux/tasks/change-folder-task.js
5180618: src/flux/models/query-subscription-pool.js
4156736: src/flux/tasks/change-mail-task.js
5195386: src/flux/models/query-subscription.js
4100089: src/mailbox-perspective.js
5231737: src/flux/models/mutable-query-result-set.js
4120446: src/flux/tasks/task-factory.js
4636283: src/flux/tasks/syncback-category-task.js
5237299: src/flux/models/query-result-set.js
4139229: src/flux/tasks/change-folder-task.js
5389575: src/flux/stores/task-queue.js
5273907: src/flux/tasks/change-labels-task.js
4156736: src/flux/tasks/change-mail-task.js
5304677: src/flux/tasks/change-unread-task.js
3813280: src/flux/tasks/task.js
4636283: src/flux/tasks/syncback-category-task.js
5341333: src/flux/tasks/change-starred-task.js
4200026: src/flux/nylas-api.js
5350052: src/flux/stores/outbox-store.js
5356198: src/flux/tasks/send-draft-task.js
5273907: src/flux/tasks/change-labels-task.js
5417961: src/sound-registry.js
91943581: src/flux/tasks/base-draft-task.js
4222287: node_modules/request/package.json
5304677: src/flux/tasks/change-unread-task.js
4225420: node_modules/request/index.js
5419733: src/flux/tasks/syncback-metadata-task.js
80787899: node_modules/request/node_modules/extend/index.js
4229450: node_modules/request/lib/cookies.js
5431422: src/flux/tasks/syncback-model-task.js
5341333: src/flux/tasks/change-starred-task.js
4230419: node_modules/less-cache/node_modules/less/node_modules/request/node_modules/tough-cookie/lib/cookie.js
91991403: src/flux/tasks/notify-plugins-of-send-task.js
5350052: src/flux/stores/outbox-store.js
5356198: src/flux/tasks/send-draft-task.js
4267962: node_modules/less-cache/node_modules/less/node_modules/request/node_modules/tough-cookie/lib/pubsuffix.js
91821594: src/flux/edgehill-api.js
5417961: src/sound-registry.js
91943581: src/flux/tasks/base-draft-task.js
5471010: src/flux/stores/task-queue-status-store.js
5419733: src/flux/tasks/syncback-metadata-task.js
5431422: src/flux/tasks/syncback-model-task.js
91991403: src/flux/tasks/notify-plugins-of-send-task.js
5512912: src/flux/stores/thread-counts-store.js
91821594: src/flux/edgehill-api.js
91919008: src/flux/stores/recently-read-store.js
5501930: src/flux/models/mutable-query-subscription.js
5471010: src/flux/stores/task-queue-status-store.js
91852488: src/flux/models/unread-query-subscription.js
5512912: src/flux/stores/thread-counts-store.js
91919008: src/flux/stores/recently-read-store.js
5501930: src/flux/models/mutable-query-subscription.js
4417589: node_modules/less-cache/node_modules/less/node_modules/request/node_modules/tough-cookie/lib/store.js
91852488: src/flux/models/unread-query-subscription.js
4420430: node_modules/less-cache/node_modules/less/node_modules/request/node_modules/tough-cookie/lib/memstore.js
4425944: node_modules/less-cache/node_modules/less/node_modules/request/node_modules/tough-cookie/lib/permuteDomain.js
4428210: node_modules/less-cache/node_modules/less/node_modules/request/node_modules/tough-cookie/lib/pathMatch.js
4430645: node_modules/less-cache/node_modules/less/node_modules/request/node_modules/tough-cookie/package.json
5680865: src/flux/stores/draft-store.js
4432858: node_modules/request/lib/helpers.js
4434482: node_modules/less-cache/node_modules/less/node_modules/request/node_modules/json-stringify-safe/stringify.js
4435389: node_modules/request/request.js
5704584: src/flux/stores/draft-editing-session.js
5886976: src/extension-registry.js
5895610: src/extensions/composer-extension-adapter.js
80567623: node_modules/request/node_modules/bl/bl.js
5860903: src/dom-utils.js
80636139: node_modules/request/node_modules/bl/node_modules/readable-stream/duplex.js
80636191: node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_duplex.js
5680865: src/flux/stores/draft-store.js
75226954: node_modules/process-nextick-args/index.js
80638643: node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_readable.js
5913732: src/extensions/extension-utils.js
5915158: src/extensions/message-view-extension-adapter.js
5704584: src/flux/stores/draft-editing-session.js
57417682: node_modules/isarray/index.js
5886976: src/extension-registry.js
91896596: src/flux/stores/draft-factory.js
80670635: node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_writable.js
5895610: src/extensions/composer-extension-adapter.js
5714320: src/flux/stores/contact-store.js
81345592: node_modules/request/node_modules/hawk/lib/index.js
5860903: src/dom-utils.js
81416906: node_modules/request/node_modules/hawk/node_modules/boom/lib/index.js
5723311: src/flux/stores/contact-ranking-store.js
5913732: src/extensions/extension-utils.js
81490930: node_modules/request/node_modules/hawk/node_modules/hoek/lib/index.js
5915158: src/extensions/message-view-extension-adapter.js
5523481: src/window-bridge.js
91896596: src/flux/stores/draft-factory.js
5714320: src/flux/stores/contact-store.js
5917902: src/flux/stores/message-store.js
5723311: src/flux/stores/contact-ranking-store.js
5733766: src/flux/stores/focused-content-store.js
5523481: src/window-bridge.js
5756110: src/services/inline-style-transformer.js
81488262: node_modules/request/node_modules/hawk/node_modules/hoek/lib/escape.js
81520773: node_modules/request/node_modules/hawk/node_modules/sntp/index.js
5917902: src/flux/stores/message-store.js
81520807: node_modules/request/node_modules/hawk/node_modules/sntp/lib/index.js
5758660: src/services/sanitize-transformer.js
5763630: node_modules/sanitize-html/package.json
5733766: src/flux/stores/focused-content-store.js
81345973: node_modules/request/node_modules/hawk/lib/server.js
5765975: node_modules/sanitize-html/index.js
81428267: node_modules/request/node_modules/hawk/node_modules/cryptiles/lib/index.js
5775765: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/lib/index.js
81342006: node_modules/request/node_modules/hawk/lib/crypto.js
81364519: node_modules/request/node_modules/hawk/lib/utils.js
5777529: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/lib/Parser.js
81331415: node_modules/request/node_modules/hawk/lib/client.js
5756110: src/services/inline-style-transformer.js
5785458: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/lib/Tokenizer.js
80480692: node_modules/request/node_modules/aws-sign2/index.js
81551606: node_modules/request/node_modules/http-signature/lib/index.js
81552232: node_modules/request/node_modules/http-signature/lib/parser.js
5810958: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/entities/lib/decode_codepoint.js
81585919: node_modules/request/node_modules/http-signature/node_modules/assert-plus/assert.js
5758660: src/services/sanitize-transformer.js
5811580: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/entities/maps/decode.json
5811878: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/entities/maps/entities.json
5763630: node_modules/sanitize-html/package.json
5765975: node_modules/sanitize-html/index.js
81574938: node_modules/request/node_modules/http-signature/lib/utils.js
5775765: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/lib/index.js
81887698: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/index.js
81888429: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/key.js
5777529: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/lib/Parser.js
81950012: node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/assert-plus/assert.js
5852494: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/entities/maps/legacy.json
5785458: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/lib/Tokenizer.js
5854241: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/entities/maps/xml.json
81830178: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/algs.js
5854294: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/domhandler/index.js
5810958: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/entities/lib/decode_codepoint.js
5858733: node_modules/juice/node_modules/cheerio/node_modules/css-select/node_modules/domutils/node_modules/domelementtype/index.js
81847974: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/fingerprint.js
5811580: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/entities/maps/decode.json
5859144: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/domhandler/lib/node.js
5811878: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/entities/maps/entities.json
81845672: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/errors.js
5860059: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/domhandler/lib/element.js
81911179: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/utils.js
5860502: node_modules/sanitize-html/node_modules/regexp-quote/regexp-quote.js
81895828: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/private-key.js
5860597: src/flux/models/message-utils.js
81901963: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/signature.js
92019120: src/flux/tasks/syncback-draft-files-task.js
81942773: node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/index.js
92064500: src/multi-request-progress-monitor.js
81928490: node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/ber/index.js
5852494: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/entities/maps/legacy.json
81928251: node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/ber/errors.js
5555349: src/flux/tasks/destroy-draft-task.js
81934548: node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/ber/types.js
81928959: node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/ber/reader.js
5854241: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/entities/maps/xml.json
81935186: node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/ber/writer.js
5854294: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/domhandler/index.js
81908010: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/ssh-buffer.js
5858733: node_modules/juice/node_modules/cheerio/node_modules/css-select/node_modules/domutils/node_modules/domelementtype/index.js
6145019: src/flux/stores/modal-store.js
5859144: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/domhandler/lib/node.js
81843337: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/ed-compat.js
4488696: node_modules/react/package.json
81851404: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/auto.js
5860059: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/domhandler/lib/element.js
4490634: node_modules/react/react.js
81853302: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/pem.js
4490690: node_modules/react/lib/React.js
5860502: node_modules/sanitize-html/node_modules/regexp-quote/regexp-quote.js
79997473: node_modules/react/node_modules/object-assign/index.js
81858111: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/pkcs1.js
5860597: src/flux/models/message-utils.js
4503558: node_modules/react/lib/ReactChildren.js
92019120: src/flux/tasks/syncback-draft-files-task.js
4509426: node_modules/react/lib/PooledClass.js
81865807: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/pkcs8.js
92064500: src/multi-request-progress-monitor.js
77945402: node_modules/react/node_modules/fbjs/lib/invariant.js
4515504: node_modules/react/lib/ReactElement.js
81881346: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/ssh-private.js
5555349: src/flux/tasks/destroy-draft-task.js
81877740: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/rfc4253.js
4526119: node_modules/react/lib/ReactCurrentOwner.js
77997237: node_modules/react/node_modules/fbjs/lib/warning.js
77865983: node_modules/react/node_modules/fbjs/lib/emptyFunction.js
81884606: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/ssh.js
77610157: node_modules/react/lib/canDefineProperty.js
81835020: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/dhe.js
4526776: node_modules/react/lib/traverseAllChildren.js
6145019: src/flux/stores/modal-store.js
4549078: node_modules/react/lib/getIteratorFn.js
4488696: node_modules/react/package.json
81562004: node_modules/request/node_modules/http-signature/lib/signer.js
4554180: node_modules/react/lib/ReactComponent.js
4490634: node_modules/react/react.js
77543851: node_modules/react/lib/ReactNoopUpdateQueue.js
4490690: node_modules/react/lib/React.js
77541351: node_modules/react/lib/ReactInstrumentation.js
81602307: node_modules/request/node_modules/http-signature/node_modules/jsprim/lib/jsprim.js
77520716: node_modules/react/lib/ReactDebugTool.js
79997473: node_modules/react/node_modules/object-assign/index.js
4503558: node_modules/react/lib/ReactChildren.js
77541813: node_modules/react/lib/ReactInvalidSetStateWarningDevTool.js
81632804: node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/extsprintf/lib/extsprintf.js
4509426: node_modules/react/lib/PooledClass.js
77868121: node_modules/react/node_modules/fbjs/lib/emptyObject.js
81797823: node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/verror/lib/verror.js
4658325: node_modules/react/lib/ReactClass.js
77945402: node_modules/react/node_modules/fbjs/lib/invariant.js
4515504: node_modules/react/lib/ReactElement.js
81763963: node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/lib/validate.js
4622568: node_modules/react/lib/ReactPropTypeLocations.js
4526119: node_modules/react/lib/ReactCurrentOwner.js
77955086: node_modules/react/node_modules/fbjs/lib/keyMirror.js
77997237: node_modules/react/node_modules/fbjs/lib/warning.js
81577777: node_modules/request/node_modules/http-signature/lib/verify.js
77865983: node_modules/react/node_modules/fbjs/lib/emptyFunction.js
4623120: node_modules/react/lib/ReactPropTypeLocationNames.js
77610157: node_modules/react/lib/canDefineProperty.js
77961237: node_modules/react/node_modules/fbjs/lib/keyOf.js
82371286: node_modules/request/node_modules/mime-types/index.js
4526776: node_modules/react/lib/traverseAllChildren.js
77505957: node_modules/react/lib/ReactDOMFactories.js
82530510: node_modules/request/node_modules/mime-types/node_modules/mime-db/index.js
4611818: node_modules/react/lib/ReactElementValidator.js
4549078: node_modules/react/lib/getIteratorFn.js
82387545: node_modules/request/node_modules/mime-types/node_modules/mime-db/db.json
4554180: node_modules/react/lib/ReactComponent.js
77963437: node_modules/react/node_modules/fbjs/lib/mapObject.js
77543851: node_modules/react/lib/ReactNoopUpdateQueue.js
77541351: node_modules/react/lib/ReactInstrumentation.js
77520716: node_modules/react/lib/ReactDebugTool.js
77541813: node_modules/react/lib/ReactInvalidSetStateWarningDevTool.js
77868121: node_modules/react/node_modules/fbjs/lib/emptyObject.js
4658325: node_modules/react/lib/ReactClass.js
4622568: node_modules/react/lib/ReactPropTypeLocations.js
77955086: node_modules/react/node_modules/fbjs/lib/keyMirror.js
5328125: node_modules/react/lib/ReactPropTypes.js
4623120: node_modules/react/lib/ReactPropTypeLocationNames.js
77961237: node_modules/react/node_modules/fbjs/lib/keyOf.js
77505957: node_modules/react/lib/ReactDOMFactories.js
77568528: node_modules/react/lib/ReactVersion.js
4611818: node_modules/react/lib/ReactElementValidator.js
5544770: node_modules/react/lib/onlyChild.js
75786540: node_modules/react-dom/package.json
75786477: node_modules/react-dom/index.js
77963437: node_modules/react/node_modules/fbjs/lib/mapObject.js
4476422: node_modules/less-cache/node_modules/less/node_modules/request/node_modules/stringstream/stringstream.js
4693093: node_modules/react/lib/ReactDOM.js
80754327: node_modules/request/node_modules/caseless/index.js
77494923: node_modules/react/lib/ReactDOMComponentTree.js
4954924: node_modules/react/lib/DOMProperty.js
80801324: node_modules/request/node_modules/forever-agent/index.js
77494452: node_modules/react/lib/ReactDOMComponentFlags.js
5154239: node_modules/react/lib/ReactDefaultInjection.js
5157979: node_modules/react/lib/BeforeInputEventPlugin.js
80814876: node_modules/request/node_modules/form-data/lib/form_data.js
4501390: node_modules/react/lib/EventConstants.js
80764215: node_modules/request/node_modules/combined-stream/lib/combined_stream.js
5171831: node_modules/react/lib/EventPropagators.js
80773528: node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/lib/delayed_stream.js
5034693: node_modules/react/lib/EventPluginHub.js
5328125: node_modules/react/lib/ReactPropTypes.js
5042578: node_modules/react/lib/EventPluginRegistry.js
80944514: node_modules/request/node_modules/form-data/node_modules/async/lib/async.js
4493310: node_modules/react/lib/EventPluginUtils.js
77568528: node_modules/react/lib/ReactVersion.js
4684789: node_modules/react/lib/ReactErrorUtils.js
5544770: node_modules/react/lib/onlyChild.js
5051772: node_modules/react/lib/accumulateInto.js
75786540: node_modules/react-dom/package.json
5053515: node_modules/react/lib/forEachAccumulated.js
75786477: node_modules/react-dom/index.js
77682133: node_modules/react/node_modules/fbjs/lib/ExecutionEnvironment.js
4693093: node_modules/react/lib/ReactDOM.js
5177151: node_modules/react/lib/FallbackCompositionState.js
77494923: node_modules/react/lib/ReactDOMComponentTree.js
80826033: node_modules/request/node_modules/form-data/lib/populate.js
5179621: node_modules/react/lib/getTextContentAccessor.js
82348558: node_modules/request/node_modules/isstream/isstream.js
4954924: node_modules/react/lib/DOMProperty.js
5185473: node_modules/react/lib/SyntheticCompositionEvent.js
82341499: node_modules/request/node_modules/is-typedarray/index.js
5186617: node_modules/react/lib/SyntheticEvent.js
77494452: node_modules/react/lib/ReactDOMComponentFlags.js
4479214: node_modules/request/lib/getProxyFromURI.js
5154239: node_modules/react/lib/ReactDefaultInjection.js
4481482: node_modules/request/lib/querystring.js
5157979: node_modules/react/lib/BeforeInputEventPlugin.js
5236171: node_modules/react/lib/SyntheticInputEvent.js
82587962: node_modules/request/node_modules/qs/lib/index.js
82593363: node_modules/request/node_modules/qs/lib/stringify.js
5241892: node_modules/react/lib/ChangeEventPlugin.js
4501390: node_modules/react/lib/EventConstants.js
82597342: node_modules/request/node_modules/qs/lib/utils.js
5171831: node_modules/react/lib/EventPropagators.js
4571389: node_modules/react/lib/ReactUpdates.js
5034693: node_modules/react/lib/EventPluginHub.js
82588115: node_modules/request/node_modules/qs/lib/parse.js
5042578: node_modules/react/lib/EventPluginRegistry.js
4580474: node_modules/react/lib/CallbackQueue.js
4482815: node_modules/request/lib/har.js
77540690: node_modules/react/lib/ReactFeatureFlags.js
4493310: node_modules/react/lib/EventPluginUtils.js
4583141: node_modules/react/lib/ReactPerf.js
81001381: node_modules/request/node_modules/har-validator/lib/index.js
4590060: node_modules/react/lib/ReactReconciler.js
81163939: node_modules/request/node_modules/har-validator/node_modules/pinkie-promise/index.js
4684789: node_modules/react/lib/ReactErrorUtils.js
4599068: node_modules/react/lib/ReactRef.js
81001935: node_modules/request/node_modules/har-validator/lib/runner.js
5051772: node_modules/react/lib/accumulateInto.js
4608257: node_modules/react/lib/ReactOwner.js
5053515: node_modules/react/lib/forEachAccumulated.js
81005359: node_modules/request/node_modules/har-validator/lib/schemas/index.js
4626735: node_modules/react/lib/Transaction.js
77682133: node_modules/react/node_modules/fbjs/lib/ExecutionEnvironment.js
81002525: node_modules/request/node_modules/har-validator/lib/schemas/cache.json
5177151: node_modules/react/lib/FallbackCompositionState.js
81002712: node_modules/request/node_modules/har-validator/lib/schemas/cacheEntry.json
5230693: node_modules/react/lib/getEventTarget.js
81003206: node_modules/request/node_modules/har-validator/lib/schemas/content.json
5179621: node_modules/react/lib/getTextContentAccessor.js
81003583: node_modules/request/node_modules/har-validator/lib/schemas/cookie.json
5056054: node_modules/react/lib/isEventSupported.js
81004081: node_modules/request/node_modules/har-validator/lib/schemas/creator.json
5185473: node_modules/react/lib/SyntheticCompositionEvent.js
81004311: node_modules/request/node_modules/har-validator/lib/schemas/entry.json
5253386: node_modules/react/lib/isTextInputElement.js
5186617: node_modules/react/lib/SyntheticEvent.js
81005242: node_modules/request/node_modules/har-validator/lib/schemas/har.json
81007111: node_modules/request/node_modules/har-validator/lib/schemas/log.json
81007604: node_modules/request/node_modules/har-validator/lib/schemas/page.json
81008181: node_modules/request/node_modules/har-validator/lib/schemas/pageTimings.json
81008406: node_modules/request/node_modules/har-validator/lib/schemas/postData.json
5254419: node_modules/react/lib/DefaultEventPluginOrder.js
81009060: node_modules/request/node_modules/har-validator/lib/schemas/record.json
5236171: node_modules/react/lib/SyntheticInputEvent.js
81009286: node_modules/request/node_modules/har-validator/lib/schemas/request.json
5255683: node_modules/react/lib/EnterLeaveEventPlugin.js
81010139: node_modules/request/node_modules/har-validator/lib/schemas/response.json
81010946: node_modules/request/node_modules/har-validator/lib/schemas/timings.json
5241892: node_modules/react/lib/ChangeEventPlugin.js
5259147: node_modules/react/lib/SyntheticMouseEvent.js
81001195: node_modules/request/node_modules/har-validator/lib/error.js
5261327: node_modules/react/lib/SyntheticUIEvent.js
81108729: node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/index.js
4571389: node_modules/react/lib/ReactUpdates.js
5055413: node_modules/react/lib/ViewportMetrics.js
5262952: node_modules/react/lib/getEventModifierState.js
4580474: node_modules/react/lib/CallbackQueue.js
5264226: node_modules/react/lib/HTMLDOMPropertyConfig.js
77540690: node_modules/react/lib/ReactFeatureFlags.js
81132607: node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/index.js
4583141: node_modules/react/lib/ReactPerf.js
81134601: node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/node_modules/is-property/is-property.js
4965198: node_modules/react/lib/ReactComponentBrowserEnvironment.js
4590060: node_modules/react/lib/ReactReconciler.js
4981199: node_modules/react/lib/DOMChildrenOperations.js
4599068: node_modules/react/lib/ReactRef.js
81127606: node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-function/index.js
4608257: node_modules/react/lib/ReactOwner.js
77469073: node_modules/react/lib/DOMLazyTree.js
4626735: node_modules/react/lib/Transaction.js
81149530: node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/jsonpointer.js
77613716: node_modules/react/lib/createMicrosoftUnsafeLocalFunction.js
4525735: node_modules/babel-core/node_modules/output-file-sync/node_modules/xtend/immutable.js
4994328: node_modules/react/lib/setTextContent.js
81106380: node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/formats.js
4964346: node_modules/react/lib/escapeTextContentForBrowser.js
4995531: node_modules/react/lib/setInnerHTML.js
5230693: node_modules/react/lib/getEventTarget.js
5056054: node_modules/react/lib/isEventSupported.js
4533728: node_modules/request/lib/auth.js
4986498: node_modules/react/lib/Danger.js
5253386: node_modules/react/lib/isTextInputElement.js
4550226: node_modules/request/lib/oauth.js
77856589: node_modules/react/node_modules/fbjs/lib/createNodesFromMarkup.js
5254419: node_modules/react/lib/DefaultEventPluginOrder.js
77848650: node_modules/react/node_modules/fbjs/lib/createArrayFromMixed.js
5255683: node_modules/react/lib/EnterLeaveEventPlugin.js
82544802: node_modules/request/node_modules/oauth-sign/index.js
77922333: node_modules/react/node_modules/fbjs/lib/getMarkupWrap.js
5259147: node_modules/react/lib/SyntheticMouseEvent.js
4568756: node_modules/request/lib/multipart.js
5261327: node_modules/react/lib/SyntheticUIEvent.js
4585628: node_modules/request/lib/redirect.js
4594531: node_modules/request/lib/tunnel.js
5055413: node_modules/react/lib/ViewportMetrics.js
5262952: node_modules/react/lib/getEventModifierState.js
4993464: node_modules/react/lib/ReactMultiChildUpdateTypes.js
4601413: node_modules/less-cache/node_modules/less/node_modules/request/node_modules/tunnel-agent/index.js
5264226: node_modules/react/lib/HTMLDOMPropertyConfig.js
4966626: node_modules/react/lib/ReactDOMIDOperations.js
91866084: src/flux/nylas-long-connection.js
5100253: node_modules/react/lib/ReactDOMComponent.js
4965198: node_modules/react/lib/ReactComponentBrowserEnvironment.js
4981199: node_modules/react/lib/DOMChildrenOperations.js
77469073: node_modules/react/lib/DOMLazyTree.js
77613716: node_modules/react/lib/createMicrosoftUnsafeLocalFunction.js
2376215: node_modules/event-kit/package.json
4994328: node_modules/react/lib/setTextContent.js
4964346: node_modules/react/lib/escapeTextContentForBrowser.js
77468440: node_modules/react/lib/AutoFocusUtils.js
4995531: node_modules/react/lib/setInnerHTML.js
3905749: src/flux/models/account.js
77909940: node_modules/react/node_modules/fbjs/lib/focusNode.js
4986498: node_modules/react/lib/Danger.js
4967813: node_modules/react/lib/CSSPropertyOperations.js
3911874: src/flux/models/model-with-metadata.js
77856589: node_modules/react/node_modules/fbjs/lib/createNodesFromMarkup.js
4974604: node_modules/react/lib/CSSProperty.js
77848650: node_modules/react/node_modules/fbjs/lib/createArrayFromMixed.js
77922333: node_modules/react/node_modules/fbjs/lib/getMarkupWrap.js
77831606: node_modules/react/node_modules/fbjs/lib/camelizeStyleName.js
77830175: node_modules/react/node_modules/fbjs/lib/camelize.js
4993464: node_modules/react/lib/ReactMultiChildUpdateTypes.js
3959955: src/flux/models/message.js
4978298: node_modules/react/lib/dangerousStyleValue.js
4966626: node_modules/react/lib/ReactDOMIDOperations.js
77943412: node_modules/react/node_modules/fbjs/lib/hyphenateStyleName.js
3971136: node_modules/moment/package.json
5100253: node_modules/react/lib/ReactDOMComponent.js
77941796: node_modules/react/node_modules/fbjs/lib/hyphenate.js
77967845: node_modules/react/node_modules/fbjs/lib/memoizeStringOnly.js
3809622: src/flux/models/file.js
77472180: node_modules/react/lib/DOMNamespaces.js
4947570: node_modules/react/lib/DOMPropertyOperations.js
3870842: src/flux/models/event.js
77468440: node_modules/react/lib/AutoFocusUtils.js
77509750: node_modules/react/lib/ReactDOMInstrumentation.js
3875483: src/flux/models/contact.js
77502083: node_modules/react/lib/ReactDOMDebugTool.js
77514692: node_modules/react/lib/ReactDOMUnknownPropertyDevtool.js
77909940: node_modules/react/node_modules/fbjs/lib/focusNode.js
4967813: node_modules/react/lib/CSSPropertyOperations.js
3886010: src/regexp-utils.js
4963597: node_modules/react/lib/quoteAttributeValueForBrowser.js
5022146: node_modules/react/lib/ReactBrowserEventEmitter.js
4974604: node_modules/react/lib/CSSProperty.js
56664169: node_modules/emoji-data/lib/emoji_data.js
56662240: node_modules/emoji-data/lib/emoji_char.js
5054412: node_modules/react/lib/ReactEventEmitterMixin.js
77617819: node_modules/react/lib/getVendorPrefixedEventName.js
56691400: node_modules/emoji-data/node_modules/underscore.string/lib/underscore.string.js
77831606: node_modules/react/node_modules/fbjs/lib/camelizeStyleName.js
77830175: node_modules/react/node_modules/fbjs/lib/camelize.js
5303529: node_modules/react/lib/ReactDOMButton.js
4978298: node_modules/react/lib/dangerousStyleValue.js
5313340: node_modules/react/lib/ReactDOMInput.js
77943412: node_modules/react/node_modules/fbjs/lib/hyphenateStyleName.js
5322982: node_modules/react/lib/LinkedValueUtils.js
77941796: node_modules/react/node_modules/fbjs/lib/hyphenate.js
77967845: node_modules/react/node_modules/fbjs/lib/memoizeStringOnly.js
5379029: node_modules/react/lib/ReactDOMOption.js
77472180: node_modules/react/lib/DOMNamespaces.js
5382256: node_modules/react/lib/ReactDOMSelect.js
4947570: node_modules/react/lib/DOMPropertyOperations.js
5405374: node_modules/react/lib/ReactDOMTextarea.js
77509750: node_modules/react/lib/ReactDOMInstrumentation.js
77502083: node_modules/react/lib/ReactDOMDebugTool.js
5134927: node_modules/react/lib/ReactMultiChild.js
77514692: node_modules/react/lib/ReactDOMUnknownPropertyDevtool.js
4963597: node_modules/react/lib/quoteAttributeValueForBrowser.js
5097145: node_modules/react/lib/ReactComponentEnvironment.js
5147906: node_modules/react/lib/ReactChildReconciler.js
5022146: node_modules/react/lib/ReactBrowserEventEmitter.js
5061495: node_modules/react/lib/instantiateReactComponent.js
5054412: node_modules/react/lib/ReactEventEmitterMixin.js
5065922: node_modules/react/lib/ReactCompositeComponent.js
77617819: node_modules/react/lib/getVendorPrefixedEventName.js
5303529: node_modules/react/lib/ReactDOMButton.js
4567499: node_modules/react/lib/ReactInstanceMap.js
5313340: node_modules/react/lib/ReactDOMInput.js
77542853: node_modules/react/lib/ReactNodeTypes.js
4559113: node_modules/react/lib/ReactUpdateQueue.js
5322982: node_modules/react/lib/LinkedValueUtils.js
5098804: node_modules/react/lib/shouldUpdateReactComponent.js
5379029: node_modules/react/lib/ReactDOMOption.js
5058027: node_modules/react/lib/ReactEmptyComponent.js
5382256: node_modules/react/lib/ReactDOMSelect.js
4623734: node_modules/react/lib/ReactNativeComponent.js
5152586: node_modules/react/lib/flattenChildren.js
5405374: node_modules/react/lib/ReactDOMTextarea.js
5134927: node_modules/react/lib/ReactMultiChild.js
77987568: node_modules/react/node_modules/fbjs/lib/shallowEqual.js
77629907: node_modules/react/lib/validateDOMNesting.js
5097145: node_modules/react/lib/ReactComponentEnvironment.js
5147906: node_modules/react/lib/ReactChildReconciler.js
5061495: node_modules/react/lib/instantiateReactComponent.js
77503986: node_modules/react/lib/ReactDOMEmptyComponent.js
5065922: node_modules/react/lib/ReactCompositeComponent.js
77510993: node_modules/react/lib/ReactDOMTreeTraversal.js
4941549: node_modules/react/lib/ReactDOMTextComponent.js
5271987: node_modules/react/lib/ReactDefaultBatchingStrategy.js
4567499: node_modules/react/lib/ReactInstanceMap.js
77542853: node_modules/react/lib/ReactNodeTypes.js
5411190: node_modules/react/lib/ReactEventListener.js
4559113: node_modules/react/lib/ReactUpdateQueue.js
77676891: node_modules/react/node_modules/fbjs/lib/EventListener.js
5098804: node_modules/react/lib/shouldUpdateReactComponent.js
5058027: node_modules/react/lib/ReactEmptyComponent.js
77934933: node_modules/react/node_modules/fbjs/lib/getUnboundedScrollPosition.js
4623734: node_modules/react/lib/ReactNativeComponent.js
5416577: node_modules/react/lib/ReactInjection.js
5152586: node_modules/react/lib/flattenChildren.js
5426571: node_modules/react/lib/ReactReconcileTransaction.js
5447146: node_modules/react/lib/ReactInputSelection.js
77987568: node_modules/react/node_modules/fbjs/lib/shallowEqual.js
5451456: node_modules/react/lib/ReactDOMSelection.js
77629907: node_modules/react/lib/validateDOMNesting.js
5458269: node_modules/react/lib/getNodeForCharacterOffset.js
77503986: node_modules/react/lib/ReactDOMEmptyComponent.js
77836612: node_modules/react/node_modules/fbjs/lib/containsNode.js
77951977: node_modules/react/node_modules/fbjs/lib/isTextNode.js
77510993: node_modules/react/lib/ReactDOMTreeTraversal.js
77950580: node_modules/react/node_modules/fbjs/lib/isNode.js
4941549: node_modules/react/lib/ReactDOMTextComponent.js
77913930: node_modules/react/node_modules/fbjs/lib/getActiveElement.js
5530086: node_modules/react/lib/SVGDOMPropertyConfig.js
5271987: node_modules/react/lib/ReactDefaultBatchingStrategy.js
3889367: src/flux/stores/account-store.js
5411190: node_modules/react/lib/ReactEventListener.js
77676891: node_modules/react/node_modules/fbjs/lib/EventListener.js
77934933: node_modules/react/node_modules/fbjs/lib/getUnboundedScrollPosition.js
5416577: node_modules/react/lib/ReactInjection.js
65006241: node_modules/keytar/package.json
5426571: node_modules/react/lib/ReactReconcileTransaction.js
65004180: node_modules/keytar/lib/keytar.js
5447146: node_modules/react/lib/ReactInputSelection.js
5451456: node_modules/react/lib/ReactDOMSelection.js
5458269: node_modules/react/lib/getNodeForCharacterOffset.js
5474425: node_modules/react/lib/SelectEventPlugin.js
77836612: node_modules/react/node_modules/fbjs/lib/containsNode.js
77951977: node_modules/react/node_modules/fbjs/lib/isTextNode.js
77950580: node_modules/react/node_modules/fbjs/lib/isNode.js
5480910: node_modules/react/lib/SimpleEventPlugin.js
77913930: node_modules/react/node_modules/fbjs/lib/getActiveElement.js
5530086: node_modules/react/lib/SVGDOMPropertyConfig.js
77602647: node_modules/react/lib/SyntheticAnimationEvent.js
5499613: node_modules/react/lib/SyntheticClipboardEvent.js
5500825: node_modules/react/lib/SyntheticFocusEvent.js
5508624: node_modules/react/lib/SyntheticKeyboardEvent.js
5511371: node_modules/react/lib/getEventCharCode.js
5519469: node_modules/react/lib/getEventKey.js
5522372: node_modules/react/lib/SyntheticDragEvent.js
5526795: node_modules/react/lib/SyntheticTouchEvent.js
77603899: node_modules/react/lib/SyntheticTransitionEvent.js
5528111: node_modules/react/lib/SyntheticWheelEvent.js
5474425: node_modules/react/lib/SelectEventPlugin.js
5480910: node_modules/react/lib/SimpleEventPlugin.js
4998763: node_modules/react/lib/ReactMount.js
77602647: node_modules/react/lib/SyntheticAnimationEvent.js
5499613: node_modules/react/lib/SyntheticClipboardEvent.js
5500825: node_modules/react/lib/SyntheticFocusEvent.js
77501092: node_modules/react/lib/ReactDOMContainerInfo.js
77509290: node_modules/react/lib/ReactDOMFeatureFlags.js
5508624: node_modules/react/lib/SyntheticKeyboardEvent.js
5058770: node_modules/react/lib/ReactMarkupChecksum.js
5511371: node_modules/react/lib/getEventCharCode.js
5519469: node_modules/react/lib/getEventKey.js
5060281: node_modules/react/lib/adler32.js
5269677: node_modules/react/lib/findDOMNode.js
5522372: node_modules/react/lib/SyntheticDragEvent.js
5526795: node_modules/react/lib/SyntheticTouchEvent.js
77616438: node_modules/react/lib/getNativeComponentFromComposite.js
77627726: node_modules/react/lib/renderSubtreeIntoContainer.js
77603899: node_modules/react/lib/SyntheticTransitionEvent.js
5528111: node_modules/react/lib/SyntheticWheelEvent.js
4998763: node_modules/react/lib/ReactMount.js
77501092: node_modules/react/lib/ReactDOMContainerInfo.js
77509290: node_modules/react/lib/ReactDOMFeatureFlags.js
5058770: node_modules/react/lib/ReactMarkupChecksum.js
5060281: node_modules/react/lib/adler32.js
5269677: node_modules/react/lib/findDOMNode.js
77616438: node_modules/react/lib/getNativeComponentFromComposite.js
77627726: node_modules/react/lib/renderSubtreeIntoContainer.js
5634095: src/global/nylas-component-kit.js
3925080: src/flux/models/label.js
5634095: src/global/nylas-component-kit.js
3930438: src/flux/models/folder.js
3930638: src/flux/models/thread.js
6135910: src/flux/stores/popover-store.js
91364936: src/components/fixed-popover.js
4096909: src/flux/models/calendar.js
5951047: src/flux/stores/badge-store.js
5726955: src/flux/stores/focused-perspective-store.js
5744701: src/flux/stores/workspace-store.js
5932960: src/flux/stores/metadata-store.js
4648657: src/flux/stores/category-store.js
6135910: src/flux/stores/popover-store.js
9942964: src/flux/stores/nylas-sync-status-store.js
91364936: src/components/fixed-popover.js
5541756: src/flux/stores/undo-redo-store.js
5614032: src/flux/stores/mail-rules-store.js
4098495: src/flux/models/json-blob.js
5592720: src/flux/tasks/reprocess-mail-rules-task.js
5605792: src/mail-rules-processor.js
5621142: src/mail-rules-templates.js
5629111: src/components/scenario-editor-models.js
5932960: src/flux/stores/metadata-store.js
5541756: src/flux/stores/undo-redo-store.js
5941725: src/flux/stores/file-upload-store.js
5614032: src/flux/stores/mail-rules-store.js
5592720: src/flux/tasks/reprocess-mail-rules-task.js
1894875: node_modules/mkdirp/package.json
1896279: node_modules/mkdirp/index.js
5605792: src/mail-rules-processor.js
5621142: src/mail-rules-templates.js
5629111: src/components/scenario-editor-models.js
5941725: src/flux/stores/file-upload-store.js
4100089: src/mailbox-perspective.js
1894875: node_modules/mkdirp/package.json
1896279: node_modules/mkdirp/index.js
4120446: src/flux/tasks/task-factory.js
4139229: src/flux/tasks/change-folder-task.js
4156736: src/flux/tasks/change-mail-task.js
4636283: src/flux/tasks/syncback-category-task.js
5273907: src/flux/tasks/change-labels-task.js
5304677: src/flux/tasks/change-unread-task.js
5341333: src/flux/tasks/change-starred-task.js
5350052: src/flux/stores/outbox-store.js
5960988: src/flux/stores/file-download-store.js
5356198: src/flux/tasks/send-draft-task.js
5417961: src/sound-registry.js
5975123: node_modules/request-progress/package.json
91943581: src/flux/tasks/base-draft-task.js
5976554: node_modules/request-progress/index.js
5978608: node_modules/request-progress/node_modules/throttleit/index.js
5419733: src/flux/tasks/syncback-metadata-task.js
5431422: src/flux/tasks/syncback-model-task.js
91991403: src/flux/tasks/notify-plugins-of-send-task.js
91821594: src/flux/edgehill-api.js
5960988: src/flux/stores/file-download-store.js
5975123: node_modules/request-progress/package.json
5976554: node_modules/request-progress/index.js
5471010: src/flux/stores/task-queue-status-store.js
5978608: node_modules/request-progress/node_modules/throttleit/index.js
5986780: src/flux/stores/preferences-ui-store.js
5512912: src/flux/stores/thread-counts-store.js
5990595: node_modules/immutable/package.json
5992964: node_modules/immutable/dist/immutable.js
91919008: src/flux/stores/recently-read-store.js
5501930: src/flux/models/mutable-query-subscription.js
91852488: src/flux/models/unread-query-subscription.js
5986780: src/flux/stores/preferences-ui-store.js
5990595: node_modules/immutable/package.json
5992964: node_modules/immutable/dist/immutable.js
5680865: src/flux/stores/draft-store.js
5704584: src/flux/stores/draft-editing-session.js
5886976: src/extension-registry.js
5895610: src/extensions/composer-extension-adapter.js
5860903: src/dom-utils.js
5913732: src/extensions/extension-utils.js
5915158: src/extensions/message-view-extension-adapter.js
91896596: src/flux/stores/draft-factory.js
5714320: src/flux/stores/contact-store.js
5723311: src/flux/stores/contact-ranking-store.js
6183183: src/flux/stores/message-body-processor.js
5523481: src/window-bridge.js
5979358: src/flux/stores/focused-contacts-store.js
5917902: src/flux/stores/message-store.js
6153847: src/flux/stores/searchable-component-store.js
5733766: src/flux/stores/focused-content-store.js
94875052: src/searchable-components/search-constants.js
3672501: keymaps/base.json
6183183: src/flux/stores/message-body-processor.js
5756110: src/services/inline-style-transformer.js
5979358: src/flux/stores/focused-contacts-store.js
5758660: src/services/sanitize-transformer.js
5763630: node_modules/sanitize-html/package.json
6153847: src/flux/stores/searchable-component-store.js
5765975: node_modules/sanitize-html/index.js
94875052: src/searchable-components/search-constants.js
5775765: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/lib/index.js
5777529: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/lib/Parser.js
3672501: keymaps/base.json
5785458: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/lib/Tokenizer.js
3674831: ke
gitextract_fft17z4s/
├── .babelrc
├── .coffeelint.json
├── .dockerignore
├── .ebextensions/
│ └── enable_docker_cli_on_ssh.config
├── .ebignore
├── .eslintrc
├── .gitignore
├── .travis.yml
├── Dockerfile
├── ISSUE_TEMPLATE.md
├── LICENSE.md
├── README.md
├── appveyor.yml
├── lerna.json
├── package.json
├── packages/
│ ├── README.md
│ ├── client-app/
│ │ ├── .babelrc
│ │ ├── .travis.yml
│ │ ├── .watchmanconfig
│ │ ├── CHANGELOG.md
│ │ ├── CONFIGURATION.md
│ │ ├── CONTRIBUTING.md
│ │ ├── LICENSE.md
│ │ ├── README.md
│ │ ├── apm/
│ │ │ ├── README.md
│ │ │ └── package.json
│ │ ├── build/
│ │ │ ├── Gruntfile.js
│ │ │ ├── README.md
│ │ │ ├── config/
│ │ │ │ └── coffeelint.json
│ │ │ ├── docs_templates/
│ │ │ │ ├── _function.html
│ │ │ │ ├── _property.html
│ │ │ │ ├── class.md
│ │ │ │ └── sidebar.md
│ │ │ ├── resources/
│ │ │ │ ├── asar-ordering-hint.txt
│ │ │ │ ├── linux/
│ │ │ │ │ ├── debian/
│ │ │ │ │ │ ├── control.in
│ │ │ │ │ │ ├── lintian-overrides
│ │ │ │ │ │ ├── postinst
│ │ │ │ │ │ └── postrm
│ │ │ │ │ ├── nylas-mail.desktop.in
│ │ │ │ │ └── redhat/
│ │ │ │ │ └── nylas.spec.in
│ │ │ │ ├── mac/
│ │ │ │ │ ├── Nylas Calendar.app/
│ │ │ │ │ │ └── Contents/
│ │ │ │ │ │ ├── Info.plist
│ │ │ │ │ │ ├── MacOS/
│ │ │ │ │ │ │ └── Nylas Calendar
│ │ │ │ │ │ ├── PkgInfo
│ │ │ │ │ │ ├── Resources/
│ │ │ │ │ │ │ ├── AppIcon.icns
│ │ │ │ │ │ │ └── Base.lproj/
│ │ │ │ │ │ │ └── MainMenu.nib
│ │ │ │ │ │ └── _CodeSignature/
│ │ │ │ │ │ └── CodeResources
│ │ │ │ │ ├── file.icns
│ │ │ │ │ ├── nylas-Info.plist
│ │ │ │ │ └── nylas.icns
│ │ │ │ ├── ssh/
│ │ │ │ │ ├── nylas-n1-ci-ssh-secure-file.enc
│ │ │ │ │ └── nylas-n1-ci-ssh.openssl.enc
│ │ │ │ └── win/
│ │ │ │ ├── elevate.cmd
│ │ │ │ ├── elevate.vbs
│ │ │ │ ├── nylas-mailto-default.reg
│ │ │ │ └── nylas-mailto-registration.reg
│ │ │ └── tasks/
│ │ │ ├── coffeelint-task.js
│ │ │ ├── create-mac-dmg.js
│ │ │ ├── create-mac-zip.js
│ │ │ ├── csslint-task.js
│ │ │ ├── docs-build-task.js
│ │ │ ├── docs-render-task.js
│ │ │ ├── docs-task.js
│ │ │ ├── eslint-task.js
│ │ │ ├── installer-linux-task.js
│ │ │ ├── lesslint-task.js
│ │ │ ├── nylaslint-task.js
│ │ │ ├── package-task.js
│ │ │ └── task-helpers.js
│ │ ├── docs/
│ │ │ ├── ContinuousIntegration.md
│ │ │ └── README.md
│ │ ├── dot-nylas/
│ │ │ ├── README.md
│ │ │ ├── config.json
│ │ │ ├── keymap.json
│ │ │ └── packages/
│ │ │ └── README.md
│ │ ├── internal_packages/
│ │ │ ├── account-sidebar/
│ │ │ │ ├── README.md
│ │ │ │ ├── lib/
│ │ │ │ │ ├── account-commands.coffee
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── account-sidebar.cjsx
│ │ │ │ │ │ └── account-switcher.cjsx
│ │ │ │ │ ├── main.coffee
│ │ │ │ │ ├── sidebar-actions.coffee
│ │ │ │ │ ├── sidebar-item.coffee
│ │ │ │ │ ├── sidebar-section.coffee
│ │ │ │ │ └── sidebar-store.coffee
│ │ │ │ ├── package.json
│ │ │ │ ├── spec/
│ │ │ │ │ └── sidebar-item-spec.es6
│ │ │ │ └── stylesheets/
│ │ │ │ └── account-sidebar.less
│ │ │ ├── activity-list/
│ │ │ │ ├── lib/
│ │ │ │ │ ├── activity-data-source.es6
│ │ │ │ │ ├── activity-list-actions.es6
│ │ │ │ │ ├── activity-list-button.jsx
│ │ │ │ │ ├── activity-list-empty-state.jsx
│ │ │ │ │ ├── activity-list-item-container.jsx
│ │ │ │ │ ├── activity-list-store.jsx
│ │ │ │ │ ├── activity-list.jsx
│ │ │ │ │ ├── main.es6
│ │ │ │ │ ├── plugin-helpers.es6
│ │ │ │ │ └── test-data-source.es6
│ │ │ │ ├── package.json
│ │ │ │ ├── spec/
│ │ │ │ │ └── activity-list-spec.jsx
│ │ │ │ └── stylesheets/
│ │ │ │ └── activity-list.less
│ │ │ ├── attachments/
│ │ │ │ ├── lib/
│ │ │ │ │ ├── main.es6
│ │ │ │ │ └── message-attachments.jsx
│ │ │ │ └── package.json
│ │ │ ├── category-mapper/
│ │ │ │ ├── lib/
│ │ │ │ │ ├── category-selection.jsx
│ │ │ │ │ ├── main.es6
│ │ │ │ │ └── preferences-category-mapper.jsx
│ │ │ │ ├── package.json
│ │ │ │ └── stylesheets/
│ │ │ │ └── category-mapper.less
│ │ │ ├── category-picker/
│ │ │ │ ├── lib/
│ │ │ │ │ ├── category-picker-popover.jsx
│ │ │ │ │ ├── category-picker.cjsx
│ │ │ │ │ └── main.cjsx
│ │ │ │ ├── package.json
│ │ │ │ ├── spec/
│ │ │ │ │ └── category-picker-spec.cjsx
│ │ │ │ └── stylesheets/
│ │ │ │ └── category-picker.less
│ │ │ ├── composer/
│ │ │ │ ├── README.md
│ │ │ │ ├── keymaps/
│ │ │ │ │ └── composer.json
│ │ │ │ ├── lib/
│ │ │ │ │ ├── account-contact-field.jsx
│ │ │ │ │ ├── action-bar-plugins.jsx
│ │ │ │ │ ├── collapsed-participants.jsx
│ │ │ │ │ ├── compose-button.jsx
│ │ │ │ │ ├── composer-editor.jsx
│ │ │ │ │ ├── composer-header-actions.jsx
│ │ │ │ │ ├── composer-header.jsx
│ │ │ │ │ ├── composer-view.jsx
│ │ │ │ │ ├── fields.es6
│ │ │ │ │ ├── image-upload-composer-extension.es6
│ │ │ │ │ ├── inline-image-upload-container.jsx
│ │ │ │ │ ├── main.jsx
│ │ │ │ │ ├── send-action-button.jsx
│ │ │ │ │ └── subject-text-field.jsx
│ │ │ │ ├── package.json
│ │ │ │ ├── spec/
│ │ │ │ │ ├── collapsed-participants-spec.cjsx
│ │ │ │ │ ├── composer-header-actions-spec.cjsx
│ │ │ │ │ ├── composer-header-spec.jsx
│ │ │ │ │ ├── composer-view-spec.cjsx
│ │ │ │ │ ├── quoted-text-spec.cjsx
│ │ │ │ │ └── send-action-button-spec.jsx
│ │ │ │ └── stylesheets/
│ │ │ │ └── composer.less
│ │ │ ├── composer-emoji/
│ │ │ │ ├── lib/
│ │ │ │ │ ├── categorized-emoji.es6
│ │ │ │ │ ├── emoji-actions.es6
│ │ │ │ │ ├── emoji-button-popover.jsx
│ │ │ │ │ ├── emoji-button.jsx
│ │ │ │ │ ├── emoji-composer-extension.jsx
│ │ │ │ │ ├── emoji-data.json
│ │ │ │ │ ├── emoji-message-extension.jsx
│ │ │ │ │ ├── emoji-picker.jsx
│ │ │ │ │ ├── emoji-store.jsx
│ │ │ │ │ └── main.es6
│ │ │ │ ├── package.json
│ │ │ │ ├── spec/
│ │ │ │ │ ├── emoji-button-popover-spec.jsx
│ │ │ │ │ └── emoji-composer-extension-spec.jsx
│ │ │ │ └── stylesheets/
│ │ │ │ └── composer-emoji.less
│ │ │ ├── composer-mail-merge/
│ │ │ │ ├── lib/
│ │ │ │ │ ├── listens-to-mail-merge-session.jsx
│ │ │ │ │ ├── mail-merge-body-token.jsx
│ │ │ │ │ ├── mail-merge-button.jsx
│ │ │ │ │ ├── mail-merge-composer-extension.es6
│ │ │ │ │ ├── mail-merge-constants.es6
│ │ │ │ │ ├── mail-merge-container.jsx
│ │ │ │ │ ├── mail-merge-draft-editing-session.es6
│ │ │ │ │ ├── mail-merge-header-input.jsx
│ │ │ │ │ ├── mail-merge-participants-text-field.jsx
│ │ │ │ │ ├── mail-merge-send-button.jsx
│ │ │ │ │ ├── mail-merge-subject-text-field.jsx
│ │ │ │ │ ├── mail-merge-table.jsx
│ │ │ │ │ ├── mail-merge-token-dnd-handlers.es6
│ │ │ │ │ ├── mail-merge-token.jsx
│ │ │ │ │ ├── mail-merge-utils.es6
│ │ │ │ │ ├── mail-merge-workspace.jsx
│ │ │ │ │ ├── main.es6
│ │ │ │ │ ├── selection-state-reducers.es6
│ │ │ │ │ ├── send-many-drafts-task.es6
│ │ │ │ │ ├── table-state-reducers.es6
│ │ │ │ │ ├── token-data-source.es6
│ │ │ │ │ ├── token-state-reducers.es6
│ │ │ │ │ └── workspace-state-reducers.es6
│ │ │ │ ├── package.json
│ │ │ │ ├── spec/
│ │ │ │ │ ├── fixtures.es6
│ │ │ │ │ ├── mail-merge-draft-editing-session-spec.es6
│ │ │ │ │ ├── mail-merge-utils-spec.es6
│ │ │ │ │ ├── selection-state-reducers-spec.es6
│ │ │ │ │ ├── send-many-drafts-task-spec.es6
│ │ │ │ │ ├── table-state-reducers-spec.es6
│ │ │ │ │ ├── token-state-reducers-spec.es6
│ │ │ │ │ └── workspace-state-reducers-spec.es6
│ │ │ │ └── stylesheets/
│ │ │ │ └── mail-merge.less
│ │ │ ├── composer-markdown/
│ │ │ │ ├── README.md
│ │ │ │ ├── lib/
│ │ │ │ │ ├── main.cjsx
│ │ │ │ │ ├── markdown-composer-extension.coffee
│ │ │ │ │ ├── markdown-editor.cjsx
│ │ │ │ │ └── utils.coffee
│ │ │ │ ├── package.json
│ │ │ │ └── stylesheets/
│ │ │ │ └── index.less
│ │ │ ├── composer-scheduler/
│ │ │ │ ├── README.md
│ │ │ │ ├── lib/
│ │ │ │ │ ├── calendar/
│ │ │ │ │ │ ├── proposed-time-calendar-data-source.es6
│ │ │ │ │ │ ├── proposed-time-event.jsx
│ │ │ │ │ │ └── proposed-time-picker.jsx
│ │ │ │ │ ├── composer/
│ │ │ │ │ │ ├── email-b64-images.es6
│ │ │ │ │ │ ├── email-images.json
│ │ │ │ │ │ ├── event-datetime-input.jsx
│ │ │ │ │ │ ├── event-prep-helper.es6
│ │ │ │ │ │ ├── new-event-card-container.jsx
│ │ │ │ │ │ ├── new-event-card.jsx
│ │ │ │ │ │ ├── new-event-helper.es6
│ │ │ │ │ │ ├── new-event-preview.jsx
│ │ │ │ │ │ ├── proposed-time-list.jsx
│ │ │ │ │ │ ├── remove-event-helper.es6
│ │ │ │ │ │ ├── scheduler-composer-button.jsx
│ │ │ │ │ │ └── scheduler-composer-extension.es6
│ │ │ │ │ ├── main.es6
│ │ │ │ │ ├── proposal.es6
│ │ │ │ │ ├── proposed-time-calendar-store.es6
│ │ │ │ │ ├── scheduler-actions.es6
│ │ │ │ │ └── scheduler-constants.es6
│ │ │ │ ├── package.json
│ │ │ │ ├── spec/
│ │ │ │ │ ├── composer-scheduler-spec-helper.es6
│ │ │ │ │ ├── new-event-card-spec.jsx
│ │ │ │ │ ├── proposed-time-picker-spec.jsx
│ │ │ │ │ ├── scheduler-composer-button-spec.jsx
│ │ │ │ │ ├── scheduler-composer-extension-spec.es6
│ │ │ │ │ └── test-proposal-data-source.es6
│ │ │ │ └── stylesheets/
│ │ │ │ └── scheduler.less
│ │ │ ├── composer-signature/
│ │ │ │ ├── lib/
│ │ │ │ │ ├── main.es6
│ │ │ │ │ ├── preferences-signatures.jsx
│ │ │ │ │ ├── signature-composer-dropdown.jsx
│ │ │ │ │ ├── signature-composer-extension.es6
│ │ │ │ │ └── signature-utils.es6
│ │ │ │ ├── package.json
│ │ │ │ ├── spec/
│ │ │ │ │ ├── preferences-signatures-spec.jsx
│ │ │ │ │ ├── signature-composer-dropdown-spec.jsx
│ │ │ │ │ ├── signature-composer-extension-spec.es6
│ │ │ │ │ └── signature-store-spec.jsx
│ │ │ │ └── styles/
│ │ │ │ └── composer-signature.less
│ │ │ ├── composer-spellcheck/
│ │ │ │ ├── lib/
│ │ │ │ │ ├── main.es6
│ │ │ │ │ └── spellcheck-composer-extension.es6
│ │ │ │ ├── package.json
│ │ │ │ └── spec/
│ │ │ │ ├── fixtures/
│ │ │ │ │ ├── california-spelling-lookup.json
│ │ │ │ │ ├── california-with-misspellings-after.html
│ │ │ │ │ └── california-with-misspellings-before.html
│ │ │ │ └── spellcheck-composer-extension-spec.es6
│ │ │ ├── composer-templates/
│ │ │ │ ├── README.md
│ │ │ │ ├── assets/
│ │ │ │ │ └── Welcome to Quick Replies.html
│ │ │ │ ├── lib/
│ │ │ │ │ ├── main.es6
│ │ │ │ │ ├── preferences-templates.jsx
│ │ │ │ │ ├── template-composer-extension.es6
│ │ │ │ │ ├── template-editor.es6
│ │ │ │ │ ├── template-picker.jsx
│ │ │ │ │ ├── template-status-bar.jsx
│ │ │ │ │ └── template-store.es6
│ │ │ │ ├── package.json
│ │ │ │ ├── spec/
│ │ │ │ │ └── template-store-spec.es6
│ │ │ │ └── stylesheets/
│ │ │ │ └── message-templates.less
│ │ │ ├── composer-translate/
│ │ │ │ ├── README.md
│ │ │ │ ├── lib/
│ │ │ │ │ └── main.jsx
│ │ │ │ ├── package.json
│ │ │ │ └── stylesheets/
│ │ │ │ └── translate.less
│ │ │ ├── contact-rankings/
│ │ │ │ ├── lib/
│ │ │ │ │ ├── contact-rankings-cache.es6
│ │ │ │ │ ├── main.es6
│ │ │ │ │ └── refreshing-json-cache.coffee
│ │ │ │ └── package.json
│ │ │ ├── draft-list/
│ │ │ │ ├── lib/
│ │ │ │ │ ├── draft-list-columns.cjsx
│ │ │ │ │ ├── draft-list-send-status.jsx
│ │ │ │ │ ├── draft-list-store.coffee
│ │ │ │ │ ├── draft-list-toolbar.jsx
│ │ │ │ │ ├── draft-list.cjsx
│ │ │ │ │ ├── draft-toolbar-buttons.cjsx
│ │ │ │ │ ├── main.es6
│ │ │ │ │ ├── sending-cancel-button.cjsx
│ │ │ │ │ └── sending-progress-bar.cjsx
│ │ │ │ ├── package.json
│ │ │ │ └── stylesheets/
│ │ │ │ └── draft-list.less
│ │ │ ├── events/
│ │ │ │ ├── lib/
│ │ │ │ │ ├── event-header.cjsx
│ │ │ │ │ └── main.cjsx
│ │ │ │ ├── package.json
│ │ │ │ └── stylesheets/
│ │ │ │ └── events.less
│ │ │ ├── github-contact-card/
│ │ │ │ ├── README.md
│ │ │ │ ├── lib/
│ │ │ │ │ ├── github-contact-card-section.jsx
│ │ │ │ │ ├── github-user-store.es6
│ │ │ │ │ └── main.jsx
│ │ │ │ ├── package.json
│ │ │ │ └── stylesheets/
│ │ │ │ └── sidebar-github-profile.less
│ │ │ ├── keybase/
│ │ │ │ ├── README.md
│ │ │ │ ├── lib/
│ │ │ │ │ ├── decrypt-button.cjsx
│ │ │ │ │ ├── decryption-preprocess.coffee
│ │ │ │ │ ├── email-popover.cjsx
│ │ │ │ │ ├── encrypt-button.cjsx
│ │ │ │ │ ├── identity.coffee
│ │ │ │ │ ├── key-adder.cjsx
│ │ │ │ │ ├── key-manager.cjsx
│ │ │ │ │ ├── keybase-search.cjsx
│ │ │ │ │ ├── keybase-user.cjsx
│ │ │ │ │ ├── keybase.coffee
│ │ │ │ │ ├── main.es6
│ │ │ │ │ ├── modal-key-recommender.cjsx
│ │ │ │ │ ├── passphrase-popover.cjsx
│ │ │ │ │ ├── pgp-key-store.cjsx
│ │ │ │ │ ├── preferences-keybase.cjsx
│ │ │ │ │ ├── private-key-popover.cjsx
│ │ │ │ │ └── recipient-key-chip.cjsx
│ │ │ │ ├── package.json
│ │ │ │ ├── spec/
│ │ │ │ │ ├── decrypt-buttons-spec.cjsx
│ │ │ │ │ ├── encrypt-button-spec.cjsx
│ │ │ │ │ ├── keybase-profile-spec.cjsx
│ │ │ │ │ ├── keybase-search-spec.cjsx
│ │ │ │ │ ├── keybase-spec.coffee
│ │ │ │ │ ├── main-spec.coffee
│ │ │ │ │ ├── pgp-key-store-spec.cjsx
│ │ │ │ │ └── recipient-key-chip-spec.cjsx
│ │ │ │ └── stylesheets/
│ │ │ │ └── main.less
│ │ │ ├── link-tracking/
│ │ │ │ ├── README.md
│ │ │ │ ├── lib/
│ │ │ │ │ ├── link-tracking-button.jsx
│ │ │ │ │ ├── link-tracking-composer-extension.es6
│ │ │ │ │ ├── link-tracking-constants.es6
│ │ │ │ │ ├── link-tracking-message-extension.jsx
│ │ │ │ │ ├── link-tracking-message-popover.jsx
│ │ │ │ │ └── main.es6
│ │ │ │ ├── package.json
│ │ │ │ ├── spec/
│ │ │ │ │ └── link-tracking-composer-extension-spec.es6
│ │ │ │ └── stylesheets/
│ │ │ │ └── main.less
│ │ │ ├── main-calendar/
│ │ │ │ ├── README.md
│ │ │ │ ├── lib/
│ │ │ │ │ ├── calendar-wrapper.jsx
│ │ │ │ │ ├── event-description-frame.jsx
│ │ │ │ │ ├── main.jsx
│ │ │ │ │ ├── quick-event-button.jsx
│ │ │ │ │ └── quick-event-popover.jsx
│ │ │ │ ├── package.json
│ │ │ │ └── stylesheets/
│ │ │ │ └── main-calendar.less
│ │ │ ├── message-autoload-images/
│ │ │ │ ├── lib/
│ │ │ │ │ ├── autoload-images-actions.es6
│ │ │ │ │ ├── autoload-images-extension.es6
│ │ │ │ │ ├── autoload-images-header.jsx
│ │ │ │ │ ├── autoload-images-store.es6
│ │ │ │ │ └── main.es6
│ │ │ │ ├── package.json
│ │ │ │ ├── spec/
│ │ │ │ │ ├── autoload-images-extension-spec.es6
│ │ │ │ │ └── fixtures/
│ │ │ │ │ ├── linkedin-in.html
│ │ │ │ │ ├── linkedin-out.html
│ │ │ │ │ ├── marketing-email-in.html
│ │ │ │ │ ├── marketing-email-out.html
│ │ │ │ │ ├── no-image-extensions-in.html
│ │ │ │ │ ├── no-image-extensions-out.html
│ │ │ │ │ ├── table-body-in.html
│ │ │ │ │ └── table-body-out.html
│ │ │ │ └── stylesheets/
│ │ │ │ └── message-autoload-images.less
│ │ │ ├── message-list/
│ │ │ │ ├── lib/
│ │ │ │ │ ├── autolinker.es6
│ │ │ │ │ ├── autoscale-images.es6
│ │ │ │ │ ├── email-frame-styles-store.coffee
│ │ │ │ │ ├── email-frame.jsx
│ │ │ │ │ ├── find-in-thread.jsx
│ │ │ │ │ ├── inline-image-listeners.es6
│ │ │ │ │ ├── main.cjsx
│ │ │ │ │ ├── message-controls.cjsx
│ │ │ │ │ ├── message-item-body.cjsx
│ │ │ │ │ ├── message-item-container.cjsx
│ │ │ │ │ ├── message-item.cjsx
│ │ │ │ │ ├── message-list-hidden-messages-toggle.jsx
│ │ │ │ │ ├── message-list.cjsx
│ │ │ │ │ ├── message-participants.cjsx
│ │ │ │ │ ├── message-timestamp.jsx
│ │ │ │ │ ├── sidebar-participant-picker.jsx
│ │ │ │ │ ├── sidebar-plugin-container.cjsx
│ │ │ │ │ ├── thread-archive-button.cjsx
│ │ │ │ │ ├── thread-star-button.cjsx
│ │ │ │ │ ├── thread-toggle-unread-button.cjsx
│ │ │ │ │ └── thread-trash-button.cjsx
│ │ │ │ ├── package.json
│ │ │ │ ├── spec/
│ │ │ │ │ ├── autolinker-fixtures/
│ │ │ │ │ │ ├── both-email-and-url-in.html
│ │ │ │ │ │ ├── both-email-and-url-out.html
│ │ │ │ │ │ ├── gmail-in.html
│ │ │ │ │ │ ├── gmail-out.html
│ │ │ │ │ │ ├── linkedin-in.html
│ │ │ │ │ │ ├── linkedin-out.html
│ │ │ │ │ │ ├── medium-post-in.html
│ │ │ │ │ │ ├── medium-post-out.html
│ │ │ │ │ │ ├── nylas-url-in.html
│ │ │ │ │ │ ├── nylas-url-out.html
│ │ │ │ │ │ ├── plaintext-in.html
│ │ │ │ │ │ ├── plaintext-out.html
│ │ │ │ │ │ ├── readme-in.html
│ │ │ │ │ │ ├── readme-out.html
│ │ │ │ │ │ ├── strangeemails-in.html
│ │ │ │ │ │ ├── strangeemails-out.html
│ │ │ │ │ │ ├── strangephones-in.html
│ │ │ │ │ │ ├── strangephones-out.html
│ │ │ │ │ │ ├── twitter-in.html
│ │ │ │ │ │ ├── twitter-out.html
│ │ │ │ │ │ ├── url-with-port-in.html
│ │ │ │ │ │ └── url-with-port-out.html
│ │ │ │ │ ├── autolinker-spec.es6
│ │ │ │ │ ├── message-item-body-spec.cjsx
│ │ │ │ │ ├── message-item-container-spec.cjsx
│ │ │ │ │ ├── message-item-spec.cjsx
│ │ │ │ │ ├── message-list-spec.cjsx
│ │ │ │ │ ├── message-participants-spec.cjsx
│ │ │ │ │ └── message-timestamp-spec.cjsx
│ │ │ │ └── stylesheets/
│ │ │ │ ├── find-in-thread.less
│ │ │ │ └── message-list.less
│ │ │ ├── message-view-on-github/
│ │ │ │ ├── README.md
│ │ │ │ ├── keymaps/
│ │ │ │ │ └── github.json
│ │ │ │ ├── lib/
│ │ │ │ │ ├── github-store.es6
│ │ │ │ │ ├── main.jsx
│ │ │ │ │ └── view-on-github-button.jsx
│ │ │ │ ├── package.json
│ │ │ │ └── stylesheets/
│ │ │ │ └── github.less
│ │ │ ├── mode-switch/
│ │ │ │ ├── lib/
│ │ │ │ │ ├── main.es6
│ │ │ │ │ └── mode-toggle.cjsx
│ │ │ │ ├── package.json
│ │ │ │ └── stylesheets/
│ │ │ │ └── mode-switch.less
│ │ │ ├── notifications/
│ │ │ │ ├── lib/
│ │ │ │ │ ├── items/
│ │ │ │ │ │ ├── account-error-notif.jsx
│ │ │ │ │ │ ├── default-client-notif.jsx
│ │ │ │ │ │ ├── dev-mode-notif.jsx
│ │ │ │ │ │ ├── disabled-mail-rules-notif.jsx
│ │ │ │ │ │ └── offline-notification.jsx
│ │ │ │ │ ├── main.es6
│ │ │ │ │ ├── notif-wrapper.jsx
│ │ │ │ │ └── sidebar/
│ │ │ │ │ ├── activity-sidebar.cjsx
│ │ │ │ │ ├── initial-sync-activity.jsx
│ │ │ │ │ ├── sync-activity.jsx
│ │ │ │ │ └── syncback-activity.jsx
│ │ │ │ ├── package.json
│ │ │ │ ├── spec/
│ │ │ │ │ ├── account-error-notif-spec.jsx
│ │ │ │ │ ├── default-client-notif-spec.jsx
│ │ │ │ │ ├── dev-mode-notif-spec.jsx
│ │ │ │ │ ├── disabled-mail-rules-notif-spec.jsx
│ │ │ │ │ └── priority-spec.jsx
│ │ │ │ └── stylesheets/
│ │ │ │ ├── notifications.less
│ │ │ │ └── styles.less
│ │ │ ├── nylas-private-fonts/
│ │ │ │ ├── fonts/
│ │ │ │ │ ├── Nylas-Pro-Blond.otf
│ │ │ │ │ ├── Nylas-Pro-Hair.otf
│ │ │ │ │ ├── Nylas-Pro-Light.otf
│ │ │ │ │ ├── Nylas-Pro-Medium.otf
│ │ │ │ │ ├── Nylas-Pro-Normal.otf
│ │ │ │ │ ├── Nylas-Pro-SemiBold.otf
│ │ │ │ │ └── Nylas-Pro-Thin.otf
│ │ │ │ ├── lib/
│ │ │ │ │ └── main.es6
│ │ │ │ ├── package.json
│ │ │ │ └── stylesheets/
│ │ │ │ └── nylas-fonts.less
│ │ │ ├── nylas-private-salesforce/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── README.md
│ │ │ │ ├── keymaps/
│ │ │ │ │ └── salesforce.json
│ │ │ │ ├── lib/
│ │ │ │ │ ├── composer/
│ │ │ │ │ │ ├── contact-search-results.jsx
│ │ │ │ │ │ ├── participant-decorator.jsx
│ │ │ │ │ │ └── salesforce-composer-picker.jsx
│ │ │ │ │ ├── contact/
│ │ │ │ │ │ └── salesforce-contact-info.jsx
│ │ │ │ │ ├── form/
│ │ │ │ │ │ ├── fetch-empty-schema-for-type.es6
│ │ │ │ │ │ ├── form-data-helpers.es6
│ │ │ │ │ │ ├── generated-form-to-salesforce-adapter.es6
│ │ │ │ │ │ ├── pending-salesforce-object.es6
│ │ │ │ │ │ ├── remove-controls.jsx
│ │ │ │ │ │ ├── salesforce-object-form.jsx
│ │ │ │ │ │ ├── salesforce-object-picker.jsx
│ │ │ │ │ │ ├── salesforce-schema-adapter.es6
│ │ │ │ │ │ ├── salesforce-window-launcher.es6
│ │ │ │ │ │ └── smart-fields.es6
│ │ │ │ │ ├── main.jsx
│ │ │ │ │ ├── metadata-helpers.es6
│ │ │ │ │ ├── models/
│ │ │ │ │ │ ├── salesforce-object.es6
│ │ │ │ │ │ └── salesforce-schema.es6
│ │ │ │ │ ├── related-object-helpers.es6
│ │ │ │ │ ├── salesforce-actions.es6
│ │ │ │ │ ├── salesforce-api-error.es6
│ │ │ │ │ ├── salesforce-api.jsx
│ │ │ │ │ ├── salesforce-constants.es6
│ │ │ │ │ ├── salesforce-contact-crawler.es6
│ │ │ │ │ ├── salesforce-data-reset.es6
│ │ │ │ │ ├── salesforce-env.es6
│ │ │ │ │ ├── salesforce-error-reporter.es6
│ │ │ │ │ ├── salesforce-intro-notification.jsx
│ │ │ │ │ ├── salesforce-metadata-cleanup-listener.es6
│ │ │ │ │ ├── salesforce-new-mail-listener.es6
│ │ │ │ │ ├── salesforce-oauth.jsx
│ │ │ │ │ ├── salesforce-object-helpers.es6
│ │ │ │ │ ├── salesforce-related-object-cache.es6
│ │ │ │ │ ├── salesforce-sync-worker.es6
│ │ │ │ │ ├── search/
│ │ │ │ │ │ ├── salesforce-search-bar-results.jsx
│ │ │ │ │ │ └── salesforce-search-indexer.es6
│ │ │ │ │ ├── shared-components/
│ │ │ │ │ │ ├── open-in-salesforce-btn.jsx
│ │ │ │ │ │ ├── salesforce-icon.jsx
│ │ │ │ │ │ └── salesforce-login-prompt.jsx
│ │ │ │ │ ├── tasks/
│ │ │ │ │ │ ├── destroy-message-on-salesforce-task.es6
│ │ │ │ │ │ ├── destroy-salesforce-object-task.es6
│ │ │ │ │ │ ├── ensure-message-on-salesforce-task.es6
│ │ │ │ │ │ ├── manually-relate-salesforce-object-task.es6
│ │ │ │ │ │ ├── remove-manual-relation-to-salesforce-object-task.es6
│ │ │ │ │ │ ├── sync-salesforce-objects-task.es6
│ │ │ │ │ │ ├── sync-thread-activity-to-salesforce-task.es6
│ │ │ │ │ │ ├── syncback-salesforce-object-task.es6
│ │ │ │ │ │ └── upsert-opportunity-contact-role-task.es6
│ │ │ │ │ └── thread/
│ │ │ │ │ ├── related-objects-for-thread.jsx
│ │ │ │ │ ├── salesforce-manually-relate-thread-button.jsx
│ │ │ │ │ ├── salesforce-manually-relate-thread-popover.jsx
│ │ │ │ │ ├── salesforce-sync-label.jsx
│ │ │ │ │ ├── salesforce-sync-message-status.jsx
│ │ │ │ │ └── sync-thread-toggle.jsx
│ │ │ │ ├── menus/
│ │ │ │ │ └── salesforce.json
│ │ │ │ ├── package.json
│ │ │ │ ├── spec/
│ │ │ │ │ ├── fixtures/
│ │ │ │ │ │ ├── opportunity-layouts-alt.json
│ │ │ │ │ │ └── opportunity-layouts.json
│ │ │ │ │ ├── form-builder-spec.jsx
│ │ │ │ │ ├── generate-test-data.es6
│ │ │ │ │ ├── salesforce-schema-adapter-spec.es6
│ │ │ │ │ └── syncback-salesforce-object-task-spec.es6
│ │ │ │ └── stylesheets/
│ │ │ │ ├── open-in-salesforce-btn.less
│ │ │ │ ├── salesforce-association.less
│ │ │ │ ├── salesforce-composer.less
│ │ │ │ ├── salesforce-contact.less
│ │ │ │ ├── salesforce-icon.less
│ │ │ │ ├── salesforce-object-form.less
│ │ │ │ ├── salesforce-object-picker.less
│ │ │ │ ├── salesforce-picker.less
│ │ │ │ ├── salesforce-related-object.less
│ │ │ │ ├── salesforce-sync-label.less
│ │ │ │ ├── salesforce-sync-message-status.less
│ │ │ │ ├── salesforce-welcome-view.less
│ │ │ │ ├── search-results.less
│ │ │ │ └── sync-thread-toggle.less
│ │ │ ├── nylas-private-sounds/
│ │ │ │ ├── NYLAS_UI_Confirm_v1.ogg
│ │ │ │ ├── NYLAS_UI_HitSend_v1.ogg
│ │ │ │ ├── NYLAS_UI_NewMail_v1.ogg
│ │ │ │ ├── NYLAS_UI_Send_v1.ogg
│ │ │ │ ├── lib/
│ │ │ │ │ └── main.es6
│ │ │ │ └── package.json
│ │ │ ├── onboarding/
│ │ │ │ ├── lib/
│ │ │ │ │ ├── account-types.es6
│ │ │ │ │ ├── decorators/
│ │ │ │ │ │ └── create-page-for-form.jsx
│ │ │ │ │ ├── form-error-message.jsx
│ │ │ │ │ ├── form-field.jsx
│ │ │ │ │ ├── main.es6
│ │ │ │ │ ├── onboarding-actions.es6
│ │ │ │ │ ├── onboarding-helpers.es6
│ │ │ │ │ ├── onboarding-root.jsx
│ │ │ │ │ ├── onboarding-store.es6
│ │ │ │ │ ├── page-account-choose.jsx
│ │ │ │ │ ├── page-account-onboarding-success.jsx
│ │ │ │ │ ├── page-account-settings-exchange.jsx
│ │ │ │ │ ├── page-account-settings-gmail.jsx
│ │ │ │ │ ├── page-account-settings-imap.jsx
│ │ │ │ │ ├── page-account-settings.jsx
│ │ │ │ │ ├── page-initial-preferences.cjsx
│ │ │ │ │ ├── page-top-bar.jsx
│ │ │ │ │ └── page-welcome.jsx
│ │ │ │ ├── package.json
│ │ │ │ └── stylesheets/
│ │ │ │ ├── onboarding-reset.less
│ │ │ │ └── onboarding.less
│ │ │ ├── open-tracking/
│ │ │ │ ├── README.md
│ │ │ │ ├── lib/
│ │ │ │ │ ├── main.es6
│ │ │ │ │ ├── open-tracking-button.jsx
│ │ │ │ │ ├── open-tracking-composer-extension.es6
│ │ │ │ │ ├── open-tracking-constants.es6
│ │ │ │ │ ├── open-tracking-icon.jsx
│ │ │ │ │ ├── open-tracking-message-popover.jsx
│ │ │ │ │ └── open-tracking-message-status.jsx
│ │ │ │ ├── package.json
│ │ │ │ ├── spec/
│ │ │ │ │ ├── open-tracking-composer-extension-spec.es6
│ │ │ │ │ ├── open-tracking-icon-spec.jsx
│ │ │ │ │ └── open-tracking-message-status-spec.jsx
│ │ │ │ └── stylesheets/
│ │ │ │ └── main.less
│ │ │ ├── participant-profile/
│ │ │ │ ├── lib/
│ │ │ │ │ ├── clearbit-data-source.coffee
│ │ │ │ │ ├── main.es6
│ │ │ │ │ ├── participant-profile-store.es6
│ │ │ │ │ ├── sidebar-participant-profile.jsx
│ │ │ │ │ └── sidebar-related-threads.jsx
│ │ │ │ ├── package.json
│ │ │ │ └── stylesheets/
│ │ │ │ └── participant-profile.less
│ │ │ ├── personal-level-indicators/
│ │ │ │ ├── README.md
│ │ │ │ ├── docs/
│ │ │ │ │ ├── docco.css
│ │ │ │ │ ├── personal-level-icon.html
│ │ │ │ │ └── public/
│ │ │ │ │ └── stylesheets/
│ │ │ │ │ └── normalize.css
│ │ │ │ ├── lib/
│ │ │ │ │ ├── main.es6
│ │ │ │ │ └── personal-level-icon.jsx
│ │ │ │ ├── package.json
│ │ │ │ └── stylesheets/
│ │ │ │ └── main.less
│ │ │ ├── phishing-detection/
│ │ │ │ ├── README.md
│ │ │ │ ├── docs/
│ │ │ │ │ ├── docco.css
│ │ │ │ │ ├── main.coffee
│ │ │ │ │ ├── main.html
│ │ │ │ │ └── public/
│ │ │ │ │ └── stylesheets/
│ │ │ │ │ └── normalize.css
│ │ │ │ ├── lib/
│ │ │ │ │ └── main.jsx
│ │ │ │ ├── package.json
│ │ │ │ ├── spec/
│ │ │ │ │ └── main-spec.jsx
│ │ │ │ └── stylesheets/
│ │ │ │ ├── index.less
│ │ │ │ └── phishing.less
│ │ │ ├── plugins/
│ │ │ │ ├── lib/
│ │ │ │ │ ├── main.jsx
│ │ │ │ │ ├── package-set.jsx
│ │ │ │ │ ├── package.jsx
│ │ │ │ │ ├── packages-store.jsx
│ │ │ │ │ ├── plugins-actions.jsx
│ │ │ │ │ ├── plugins-tabs-view.jsx
│ │ │ │ │ ├── preferences-plugins.jsx
│ │ │ │ │ ├── tab-explore.jsx
│ │ │ │ │ ├── tab-installed.jsx
│ │ │ │ │ ├── tabs-store.jsx
│ │ │ │ │ └── tabs.jsx
│ │ │ │ ├── package.json
│ │ │ │ └── stylesheets/
│ │ │ │ └── plugins.less
│ │ │ ├── preferences/
│ │ │ │ ├── lib/
│ │ │ │ │ ├── main.jsx
│ │ │ │ │ ├── preferences-root.jsx
│ │ │ │ │ ├── preferences-tabs-bar.jsx
│ │ │ │ │ └── tabs/
│ │ │ │ │ ├── config-schema-item.jsx
│ │ │ │ │ ├── keymaps/
│ │ │ │ │ │ ├── command-item.jsx
│ │ │ │ │ │ ├── displayed-keybindings.js
│ │ │ │ │ │ └── mousetrap-keybinding-helpers.js
│ │ │ │ │ ├── preferences-account-details.jsx
│ │ │ │ │ ├── preferences-account-list.jsx
│ │ │ │ │ ├── preferences-accounts.jsx
│ │ │ │ │ ├── preferences-appearance.jsx
│ │ │ │ │ ├── preferences-general.jsx
│ │ │ │ │ ├── preferences-keymaps.jsx
│ │ │ │ │ ├── preferences-mail-rules.jsx
│ │ │ │ │ ├── sending-section.jsx
│ │ │ │ │ └── workspace-section.jsx
│ │ │ │ ├── package.json
│ │ │ │ ├── spec/
│ │ │ │ │ └── preferences-account-details-spec.jsx
│ │ │ │ └── stylesheets/
│ │ │ │ ├── preferences-accounts.less
│ │ │ │ ├── preferences-identity.less
│ │ │ │ ├── preferences-mail-rules.less
│ │ │ │ └── preferences.less
│ │ │ ├── print/
│ │ │ │ ├── lib/
│ │ │ │ │ ├── main.es6
│ │ │ │ │ ├── print-window.es6
│ │ │ │ │ └── printer.es6
│ │ │ │ ├── package.json
│ │ │ │ └── static/
│ │ │ │ ├── print-styles.css
│ │ │ │ └── print.js
│ │ │ ├── remove-tracking-pixels/
│ │ │ │ ├── lib/
│ │ │ │ │ └── main.es6
│ │ │ │ ├── package.json
│ │ │ │ └── spec/
│ │ │ │ ├── fixtures/
│ │ │ │ │ ├── a-after.txt
│ │ │ │ │ ├── a-before.txt
│ │ │ │ │ ├── b-after.txt
│ │ │ │ │ └── b-before.txt
│ │ │ │ └── tracking-pixels-extension-spec.es6
│ │ │ ├── screenshot-mode/
│ │ │ │ ├── assets/
│ │ │ │ │ ├── BLOKKNeue-Regular.otf
│ │ │ │ │ └── font-override.css
│ │ │ │ ├── lib/
│ │ │ │ │ └── main.coffee
│ │ │ │ └── package.json
│ │ │ ├── search-index/
│ │ │ │ ├── lib/
│ │ │ │ │ ├── contact-search-indexer.es6
│ │ │ │ │ ├── event-search-indexer.es6
│ │ │ │ │ ├── main.es6
│ │ │ │ │ └── thread-search-index-store.es6
│ │ │ │ └── package.json
│ │ │ ├── send-and-archive/
│ │ │ │ ├── lib/
│ │ │ │ │ ├── main.es6
│ │ │ │ │ └── send-and-archive-extension.es6
│ │ │ │ ├── package.json
│ │ │ │ ├── spec/
│ │ │ │ │ └── send-and-archive-spec.coffee
│ │ │ │ └── styles/
│ │ │ │ └── send-and-archive.less
│ │ │ ├── send-later/
│ │ │ │ ├── lib/
│ │ │ │ │ ├── main.es6
│ │ │ │ │ ├── send-later-button.jsx
│ │ │ │ │ ├── send-later-constants.es6
│ │ │ │ │ ├── send-later-popover.jsx
│ │ │ │ │ └── send-later-status.jsx
│ │ │ │ ├── package.json
│ │ │ │ ├── spec/
│ │ │ │ │ ├── send-later-button-spec.jsx
│ │ │ │ │ └── send-later-popover-spec.jsx
│ │ │ │ └── stylesheets/
│ │ │ │ ├── send-later-used-modal.less
│ │ │ │ └── send-later.less
│ │ │ ├── send-reminders/
│ │ │ │ ├── lib/
│ │ │ │ │ ├── main.es6
│ │ │ │ │ ├── send-reminders-account-sidebar-extension.es6
│ │ │ │ │ ├── send-reminders-composer-button.jsx
│ │ │ │ │ ├── send-reminders-constants.es6
│ │ │ │ │ ├── send-reminders-headers.jsx
│ │ │ │ │ ├── send-reminders-mailbox-perspective.es6
│ │ │ │ │ ├── send-reminders-popover-button.jsx
│ │ │ │ │ ├── send-reminders-popover.jsx
│ │ │ │ │ ├── send-reminders-query-subscription.es6
│ │ │ │ │ ├── send-reminders-store.es6
│ │ │ │ │ ├── send-reminders-thread-list-extension.es6
│ │ │ │ │ ├── send-reminders-thread-timestamp.jsx
│ │ │ │ │ ├── send-reminders-toolbar-button.jsx
│ │ │ │ │ └── send-reminders-utils.jsx
│ │ │ │ ├── package.json
│ │ │ │ └── stylesheets/
│ │ │ │ ├── reminders-used-modal.less
│ │ │ │ └── send-reminders.less
│ │ │ ├── sync-health-checker/
│ │ │ │ ├── lib/
│ │ │ │ │ ├── main.es6
│ │ │ │ │ └── sync-health-checker.es6
│ │ │ │ ├── package.json
│ │ │ │ └── spec/
│ │ │ │ └── sync-health-checker-spec.es6
│ │ │ ├── system-tray/
│ │ │ │ ├── lib/
│ │ │ │ │ ├── main.es6
│ │ │ │ │ └── system-tray-icon-store.es6
│ │ │ │ ├── package.json
│ │ │ │ └── spec/
│ │ │ │ └── system-tray-icon-store-spec.es6
│ │ │ ├── theme-picker/
│ │ │ │ ├── lib/
│ │ │ │ │ ├── main.jsx
│ │ │ │ │ ├── theme-option.jsx
│ │ │ │ │ └── theme-picker.jsx
│ │ │ │ ├── package.json
│ │ │ │ ├── preview-styles/
│ │ │ │ │ └── theme-option.less
│ │ │ │ ├── spec/
│ │ │ │ │ └── theme-picker-spec.jsx
│ │ │ │ └── styles/
│ │ │ │ └── theme-picker.less
│ │ │ ├── thread-list/
│ │ │ │ ├── lib/
│ │ │ │ │ ├── category-removal-target-rulesets.es6
│ │ │ │ │ ├── injects-toolbar-buttons.jsx
│ │ │ │ │ ├── main.es6
│ │ │ │ │ ├── message-list-toolbar.jsx
│ │ │ │ │ ├── selected-items-stack.jsx
│ │ │ │ │ ├── thread-list-columns.cjsx
│ │ │ │ │ ├── thread-list-context-menu.es6
│ │ │ │ │ ├── thread-list-data-source.es6
│ │ │ │ │ ├── thread-list-icon.cjsx
│ │ │ │ │ ├── thread-list-participants.cjsx
│ │ │ │ │ ├── thread-list-quick-actions.cjsx
│ │ │ │ │ ├── thread-list-scroll-tooltip.cjsx
│ │ │ │ │ ├── thread-list-store.coffee
│ │ │ │ │ ├── thread-list-toolbar.jsx
│ │ │ │ │ ├── thread-list.cjsx
│ │ │ │ │ └── thread-toolbar-buttons.jsx
│ │ │ │ ├── package.json
│ │ │ │ ├── spec/
│ │ │ │ │ ├── category-removal-target-rulesets-spec.es6
│ │ │ │ │ ├── thread-list-column-spec.coffee
│ │ │ │ │ ├── thread-list-participants-spec.cjsx
│ │ │ │ │ ├── thread-list-spec.cjsx
│ │ │ │ │ └── thread-toolbar-buttons-spec.cjsx
│ │ │ │ └── stylesheets/
│ │ │ │ ├── selected-items-stack.less
│ │ │ │ └── thread-list.less
│ │ │ ├── thread-search/
│ │ │ │ ├── README.md
│ │ │ │ ├── lib/
│ │ │ │ │ ├── main.es6
│ │ │ │ │ ├── search-actions.es6
│ │ │ │ │ ├── search-mailbox-perspective.es6
│ │ │ │ │ ├── search-query-subscription.es6
│ │ │ │ │ ├── search-store.es6
│ │ │ │ │ └── thread-search-bar.jsx
│ │ │ │ ├── package.json
│ │ │ │ ├── spec/
│ │ │ │ │ └── search-bar-spec.cjsx
│ │ │ │ └── stylesheets/
│ │ │ │ └── thread-search-bar.less
│ │ │ ├── thread-sharing/
│ │ │ │ ├── lib/
│ │ │ │ │ ├── copy-button.jsx
│ │ │ │ │ ├── external-threads.es6
│ │ │ │ │ ├── main.es6
│ │ │ │ │ ├── thread-sharing-button.jsx
│ │ │ │ │ ├── thread-sharing-constants.es6
│ │ │ │ │ └── thread-sharing-popover.jsx
│ │ │ │ ├── package.json
│ │ │ │ └── stylesheets/
│ │ │ │ └── main.less
│ │ │ ├── thread-snooze/
│ │ │ │ ├── README.md
│ │ │ │ ├── lib/
│ │ │ │ │ ├── main.es6
│ │ │ │ │ ├── snooze-actions.es6
│ │ │ │ │ ├── snooze-buttons.jsx
│ │ │ │ │ ├── snooze-constants.es6
│ │ │ │ │ ├── snooze-mail-label.jsx
│ │ │ │ │ ├── snooze-popover.jsx
│ │ │ │ │ ├── snooze-store.jsx
│ │ │ │ │ └── snooze-utils.es6
│ │ │ │ ├── package.json
│ │ │ │ ├── spec/
│ │ │ │ │ ├── snooze-store-spec.es6
│ │ │ │ │ └── snooze-utils-spec.es6
│ │ │ │ └── stylesheets/
│ │ │ │ ├── snooze-feature-used-modal.less
│ │ │ │ ├── snooze-mail-label.less
│ │ │ │ └── snooze-popover.less
│ │ │ ├── ui-dark/
│ │ │ │ ├── LICENSE.md
│ │ │ │ ├── README.md
│ │ │ │ ├── package.json
│ │ │ │ └── styles/
│ │ │ │ ├── email-frame.less
│ │ │ │ └── ui-variables.less
│ │ │ ├── ui-darkside/
│ │ │ │ ├── LICENSE
│ │ │ │ ├── README.md
│ │ │ │ ├── index.less
│ │ │ │ ├── package.json
│ │ │ │ └── styles/
│ │ │ │ ├── darkside-composer.less
│ │ │ │ ├── darkside-drafts.less
│ │ │ │ ├── darkside-inputs.less
│ │ │ │ ├── darkside-labels.less
│ │ │ │ ├── darkside-message-list.less
│ │ │ │ ├── darkside-notifications.less
│ │ │ │ ├── darkside-preferences.less
│ │ │ │ ├── darkside-sidebar.less
│ │ │ │ ├── darkside-swiping.less
│ │ │ │ ├── darkside-thread-icons.less
│ │ │ │ ├── darkside-threadlist.less
│ │ │ │ ├── darkside-toolbars.less
│ │ │ │ ├── darkside-variables.less
│ │ │ │ ├── darkside-window-controls.less
│ │ │ │ └── theme-colors.less
│ │ │ ├── ui-less-is-more/
│ │ │ │ ├── LICENSE
│ │ │ │ ├── README.md
│ │ │ │ ├── index.less
│ │ │ │ ├── package.json
│ │ │ │ └── styles/
│ │ │ │ ├── less-is-more.less
│ │ │ │ └── theme-colors.less
│ │ │ ├── ui-light/
│ │ │ │ ├── package.json
│ │ │ │ └── styles/
│ │ │ │ └── ui-variables.less
│ │ │ ├── ui-taiga/
│ │ │ │ ├── LICENSE
│ │ │ │ ├── README.md
│ │ │ │ ├── package.json
│ │ │ │ └── styles/
│ │ │ │ ├── controls.less
│ │ │ │ ├── email-frame.less
│ │ │ │ ├── notifications.less
│ │ │ │ ├── sidebar.less
│ │ │ │ ├── theme-colors.less
│ │ │ │ ├── threads.less
│ │ │ │ ├── ui-variables.less
│ │ │ │ └── variables.less
│ │ │ ├── ui-ubuntu/
│ │ │ │ ├── README.md
│ │ │ │ ├── index.less
│ │ │ │ ├── package.json
│ │ │ │ └── styles/
│ │ │ │ ├── theme-colors.less
│ │ │ │ └── ui-variables.less
│ │ │ ├── undo-redo/
│ │ │ │ ├── lib/
│ │ │ │ │ ├── main.es6
│ │ │ │ │ ├── undo-redo-thread-list-toast.jsx
│ │ │ │ │ ├── undo-send-store.es6
│ │ │ │ │ └── undo-send-toast.jsx
│ │ │ │ └── package.json
│ │ │ ├── unread-notifications/
│ │ │ │ ├── lib/
│ │ │ │ │ └── main.es6
│ │ │ │ ├── package.json
│ │ │ │ └── spec/
│ │ │ │ └── main-spec.es6
│ │ │ ├── verify-install-location/
│ │ │ │ ├── lib/
│ │ │ │ │ └── main.es6
│ │ │ │ └── package.json
│ │ │ └── worker-ui/
│ │ │ ├── lib/
│ │ │ │ ├── developer-bar-curl-item.cjsx
│ │ │ │ ├── developer-bar-long-poll-item.cjsx
│ │ │ │ ├── developer-bar-store.coffee
│ │ │ │ ├── developer-bar-task.cjsx
│ │ │ │ ├── developer-bar.cjsx
│ │ │ │ └── main.cjsx
│ │ │ ├── package.json
│ │ │ └── stylesheets/
│ │ │ └── worker-ui.less
│ │ ├── keymaps/
│ │ │ ├── README.m
│ │ │ ├── base-darwin.json
│ │ │ ├── base-linux.json
│ │ │ ├── base-win32.json
│ │ │ ├── base.json
│ │ │ └── templates/
│ │ │ ├── Apple Mail.json
│ │ │ ├── Gmail.json
│ │ │ ├── Inbox by Gmail.json
│ │ │ └── Outlook.json
│ │ ├── menus/
│ │ │ ├── darwin.json
│ │ │ ├── linux.json
│ │ │ └── win32.json
│ │ ├── package.json
│ │ ├── script/
│ │ │ ├── grunt
│ │ │ ├── grunt.cmd
│ │ │ ├── mkdeb
│ │ │ ├── mkrpm
│ │ │ ├── publish-docs
│ │ │ └── utils/
│ │ │ └── child-process-wrapper.js
│ │ ├── spec/
│ │ │ ├── action-bridge-spec.coffee
│ │ │ ├── async-test-spec.es6
│ │ │ ├── buffered-process-spec.coffee
│ │ │ ├── components/
│ │ │ │ ├── blockquote-manager-spec.es6
│ │ │ │ ├── clipboard-service-spec.coffee
│ │ │ │ ├── contenteditable-component-spec.cjsx
│ │ │ │ ├── date-input-spec.jsx
│ │ │ │ ├── date-picker-popover-spec.jsx
│ │ │ │ ├── editable-list-spec.jsx
│ │ │ │ ├── editable-table-spec.jsx
│ │ │ │ ├── evented-iframe-spec.cjsx
│ │ │ │ ├── fixed-popover-spec.jsx
│ │ │ │ ├── injected-component-set-spec.jsx
│ │ │ │ ├── multiselect-dropdown-spec.jsx
│ │ │ │ ├── multiselect-list-interaction-handler-spec.coffee
│ │ │ │ ├── multiselect-split-interaction-handler-spec.coffee
│ │ │ │ ├── nylas-calendar/
│ │ │ │ │ ├── calendar-toggles-spec.jsx
│ │ │ │ │ ├── fixtures/
│ │ │ │ │ │ └── events.es6
│ │ │ │ │ ├── test-data-source.es6
│ │ │ │ │ ├── test-utils.es6
│ │ │ │ │ ├── week-view-extended-spec.jsx
│ │ │ │ │ └── week-view-spec.jsx
│ │ │ │ ├── participants-text-field-spec.jsx
│ │ │ │ ├── selectable-table-spec.jsx
│ │ │ │ ├── table/
│ │ │ │ │ ├── table-data-source-spec.jsx
│ │ │ │ │ └── table-spec.jsx
│ │ │ │ └── tokenizing-text-field-spec.cjsx
│ │ │ ├── database-object-registry-spec.es6
│ │ │ ├── default-client-helper-spec.coffee
│ │ │ ├── fixtures/
│ │ │ │ ├── css.css
│ │ │ │ ├── db-test-model.coffee
│ │ │ │ ├── emails/
│ │ │ │ │ ├── correct_sig.txt
│ │ │ │ │ ├── email_1.html
│ │ │ │ │ ├── email_10.html
│ │ │ │ │ ├── email_10_stripped.html
│ │ │ │ │ ├── email_11.html
│ │ │ │ │ ├── email_11_stripped.html
│ │ │ │ │ ├── email_12.html
│ │ │ │ │ ├── email_12_stripped.html
│ │ │ │ │ ├── email_13.html
│ │ │ │ │ ├── email_13_stripped.html
│ │ │ │ │ ├── email_14.html
│ │ │ │ │ ├── email_14_stripped.html
│ │ │ │ │ ├── email_15.html
│ │ │ │ │ ├── email_15_stripped.html
│ │ │ │ │ ├── email_16.html
│ │ │ │ │ ├── email_16_stripped.html
│ │ │ │ │ ├── email_17.html
│ │ │ │ │ ├── email_17_stripped.html
│ │ │ │ │ ├── email_18.html
│ │ │ │ │ ├── email_18_stripped.html
│ │ │ │ │ ├── email_19.html
│ │ │ │ │ ├── email_19_stripped.html
│ │ │ │ │ ├── email_1_1.txt
│ │ │ │ │ ├── email_1_2.txt
│ │ │ │ │ ├── email_1_3.txt
│ │ │ │ │ ├── email_1_4.txt
│ │ │ │ │ ├── email_1_5.txt
│ │ │ │ │ ├── email_1_6.txt
│ │ │ │ │ ├── email_1_7.txt
│ │ │ │ │ ├── email_1_8.txt
│ │ │ │ │ ├── email_1_stripped.html
│ │ │ │ │ ├── email_2.html
│ │ │ │ │ ├── email_20.html
│ │ │ │ │ ├── email_20_stripped.html
│ │ │ │ │ ├── email_21.html
│ │ │ │ │ ├── email_21_stripped.html
│ │ │ │ │ ├── email_22.html
│ │ │ │ │ ├── email_22_stripped.html
│ │ │ │ │ ├── email_23.html
│ │ │ │ │ ├── email_23_stripped.html
│ │ │ │ │ ├── email_2_1.txt
│ │ │ │ │ ├── email_2_stripped.html
│ │ │ │ │ ├── email_3.html
│ │ │ │ │ ├── email_3_stripped.html
│ │ │ │ │ ├── email_4.html
│ │ │ │ │ ├── email_4_stripped.html
│ │ │ │ │ ├── email_5.html
│ │ │ │ │ ├── email_5_stripped.html
│ │ │ │ │ ├── email_6.html
│ │ │ │ │ ├── email_6_stripped.html
│ │ │ │ │ ├── email_7.html
│ │ │ │ │ ├── email_7_stripped.html
│ │ │ │ │ ├── email_8.html
│ │ │ │ │ ├── email_8_stripped.html
│ │ │ │ │ ├── email_9.html
│ │ │ │ │ ├── email_9_stripped.html
│ │ │ │ │ ├── email_BlackBerry.txt
│ │ │ │ │ ├── email_bullets.txt
│ │ │ │ │ ├── email_iPhone.txt
│ │ │ │ │ ├── email_multi_word_sent_from_my_mobile_device.txt
│ │ │ │ │ └── email_sent_from_my_not_signature.txt
│ │ │ │ ├── module-cache/
│ │ │ │ │ └── file.json
│ │ │ │ ├── packages/
│ │ │ │ │ ├── package-that-throws-an-exception/
│ │ │ │ │ │ └── index.coffee
│ │ │ │ │ ├── package-that-throws-on-activate/
│ │ │ │ │ │ └── index.coffee
│ │ │ │ │ ├── package-that-throws-on-deactivate/
│ │ │ │ │ │ └── index.coffee
│ │ │ │ │ ├── package-with-broken-keymap/
│ │ │ │ │ │ └── keymaps/
│ │ │ │ │ │ └── broken.json
│ │ │ │ │ ├── package-with-broken-package-json/
│ │ │ │ │ │ └── package.json
│ │ │ │ │ ├── package-with-config-defaults/
│ │ │ │ │ │ └── index.coffee
│ │ │ │ │ ├── package-with-config-schema/
│ │ │ │ │ │ └── index.coffee
│ │ │ │ │ ├── package-with-deactivate/
│ │ │ │ │ │ └── index.coffee
│ │ │ │ │ ├── package-with-deprecated-pane-item-method/
│ │ │ │ │ │ └── index.coffee
│ │ │ │ │ ├── package-with-empty-activation-commands/
│ │ │ │ │ │ ├── index.coffee
│ │ │ │ │ │ └── package.json
│ │ │ │ │ ├── package-with-empty-keymap/
│ │ │ │ │ │ ├── keymaps/
│ │ │ │ │ │ │ └── keymap.cson
│ │ │ │ │ │ └── package.json
│ │ │ │ │ ├── package-with-empty-menu/
│ │ │ │ │ │ ├── menus/
│ │ │ │ │ │ │ └── menu.cson
│ │ │ │ │ │ └── package.json
│ │ │ │ │ ├── package-with-incompatible-native-module/
│ │ │ │ │ │ ├── main.js
│ │ │ │ │ │ ├── node_modules/
│ │ │ │ │ │ │ └── native-module/
│ │ │ │ │ │ │ ├── build/
│ │ │ │ │ │ │ │ └── Release/
│ │ │ │ │ │ │ │ └── native.node
│ │ │ │ │ │ │ ├── main.js
│ │ │ │ │ │ │ └── package.json
│ │ │ │ │ │ └── package.json
│ │ │ │ │ ├── package-with-index/
│ │ │ │ │ │ └── index.coffee
│ │ │ │ │ ├── package-with-invalid-styles/
│ │ │ │ │ │ ├── package.json
│ │ │ │ │ │ └── styles/
│ │ │ │ │ │ └── index.less
│ │ │ │ │ ├── package-with-keymaps/
│ │ │ │ │ │ └── keymaps/
│ │ │ │ │ │ ├── keymap-1.json
│ │ │ │ │ │ └── keymap-2.json
│ │ │ │ │ ├── package-with-keymaps-manifest/
│ │ │ │ │ │ ├── keymaps/
│ │ │ │ │ │ │ ├── keymap-1.json
│ │ │ │ │ │ │ └── keymap-2.json
│ │ │ │ │ │ └── package.json
│ │ │ │ │ ├── package-with-main/
│ │ │ │ │ │ ├── main-module.coffee
│ │ │ │ │ │ └── package.json
│ │ │ │ │ ├── package-with-menus/
│ │ │ │ │ │ └── menus/
│ │ │ │ │ │ ├── menu-1.json
│ │ │ │ │ │ └── menu-2.json
│ │ │ │ │ ├── package-with-menus-manifest/
│ │ │ │ │ │ ├── menus/
│ │ │ │ │ │ │ ├── menu-1.json
│ │ │ │ │ │ │ └── menu-2.json
│ │ │ │ │ │ └── package.json
│ │ │ │ │ ├── package-with-models/
│ │ │ │ │ │ ├── main-module.coffee
│ │ │ │ │ │ └── package.json
│ │ │ │ │ ├── package-with-serialization/
│ │ │ │ │ │ └── index.coffee
│ │ │ │ │ ├── package-with-serialize-error/
│ │ │ │ │ │ ├── index.coffee
│ │ │ │ │ │ └── package.json
│ │ │ │ │ ├── package-with-style-sheets-manifest/
│ │ │ │ │ │ ├── package.json
│ │ │ │ │ │ └── styles/
│ │ │ │ │ │ ├── 1.css
│ │ │ │ │ │ ├── 2.less
│ │ │ │ │ │ └── 3.css
│ │ │ │ │ ├── package-with-styles/
│ │ │ │ │ │ └── styles/
│ │ │ │ │ │ ├── 1.css
│ │ │ │ │ │ ├── 2.less
│ │ │ │ │ │ ├── 3.test-context.css
│ │ │ │ │ │ └── 4.css
│ │ │ │ │ ├── package-with-stylesheets-manifest/
│ │ │ │ │ │ └── package.json
│ │ │ │ │ ├── package-without-module/
│ │ │ │ │ │ └── package.json
│ │ │ │ │ ├── theme-with-incomplete-ui-variables/
│ │ │ │ │ │ ├── package.json
│ │ │ │ │ │ └── styles/
│ │ │ │ │ │ ├── editor.less
│ │ │ │ │ │ └── ui-variables.less
│ │ │ │ │ ├── theme-with-index-css/
│ │ │ │ │ │ ├── index.css
│ │ │ │ │ │ └── package.json
│ │ │ │ │ ├── theme-with-index-less/
│ │ │ │ │ │ ├── index.less
│ │ │ │ │ │ └── package.json
│ │ │ │ │ ├── theme-with-invalid-styles/
│ │ │ │ │ │ ├── index.less
│ │ │ │ │ │ └── package.json
│ │ │ │ │ ├── theme-with-package-file/
│ │ │ │ │ │ ├── package.json
│ │ │ │ │ │ └── styles/
│ │ │ │ │ │ ├── first.css
│ │ │ │ │ │ ├── last.css
│ │ │ │ │ │ └── second.less
│ │ │ │ │ ├── theme-with-ui-variables/
│ │ │ │ │ │ ├── package.json
│ │ │ │ │ │ └── styles/
│ │ │ │ │ │ ├── editor.less
│ │ │ │ │ │ └── ui-variables.less
│ │ │ │ │ └── theme-without-package-file/
│ │ │ │ │ └── styles/
│ │ │ │ │ ├── a.css
│ │ │ │ │ ├── b.css
│ │ │ │ │ ├── c.less
│ │ │ │ │ └── d.csv
│ │ │ │ ├── paste/
│ │ │ │ │ ├── excel-paste-in.html
│ │ │ │ │ ├── excel-paste-out.html
│ │ │ │ │ ├── word-paste-in.html
│ │ │ │ │ └── word-paste-out.html
│ │ │ │ ├── sample-deltas-clustered.json
│ │ │ │ ├── sample-deltas.json
│ │ │ │ ├── sample.less
│ │ │ │ ├── table-data.es6
│ │ │ │ └── task-spec-handler.coffee
│ │ │ ├── list-selection-spec.coffee
│ │ │ ├── mail-rules-processor-spec.coffee
│ │ │ ├── mailbox-perspective-spec.es6
│ │ │ ├── menu-manager-spec.coffee
│ │ │ ├── models/
│ │ │ │ ├── category-spec.coffee
│ │ │ │ ├── contact-spec.coffee
│ │ │ │ ├── event-spec.coffee
│ │ │ │ ├── file-spec.coffee
│ │ │ │ ├── message-spec.coffee
│ │ │ │ ├── model-spec.es6
│ │ │ │ ├── model-with-metadata-spec.es6
│ │ │ │ ├── mutable-query-result-set-spec.es6
│ │ │ │ ├── query-range-spec.es6
│ │ │ │ ├── query-spec.es6
│ │ │ │ ├── query-subscription-pool-spec.es6
│ │ │ │ ├── query-subscription-spec.es6
│ │ │ │ └── thread-spec.coffee
│ │ │ ├── module-cache-spec.coffee
│ │ │ ├── n1-spec-runner/
│ │ │ │ ├── console-reporter.es6
│ │ │ │ ├── jasmine-extensions.es6
│ │ │ │ ├── jasmine.js
│ │ │ │ ├── master-after-each.es6
│ │ │ │ ├── master-before-each.es6
│ │ │ │ ├── n1-gui-reporter.cjsx
│ │ │ │ ├── n1-spec-loader.es6
│ │ │ │ ├── n1-spec-runner.es6
│ │ │ │ ├── nylas-test-constants.es6
│ │ │ │ ├── react-test-utils-extensions.es6
│ │ │ │ ├── spec-bootstrap.es6
│ │ │ │ ├── terminal-reporter.es6
│ │ │ │ ├── time-override.coffee
│ │ │ │ └── time-reporter.coffee
│ │ │ ├── nylas-api-spec.coffee
│ │ │ ├── nylas-env-spec.es6
│ │ │ ├── nylas-protocol-handler-spec.es6
│ │ │ ├── nylas-test-utils.coffee
│ │ │ ├── package-manager-spec.coffee
│ │ │ ├── package-spec.coffee
│ │ │ ├── registries/
│ │ │ │ ├── component-registry-spec.coffee
│ │ │ │ └── extension-registry-spec.coffee
│ │ │ ├── services/
│ │ │ │ ├── delta-processor-spec.coffee
│ │ │ │ ├── delta-streaming-connection-spec.coffee
│ │ │ │ ├── inline-style-transformer-spec.coffee
│ │ │ │ ├── quoted-html-transformer-spec.coffee
│ │ │ │ ├── quoted-plain-text-transformer-spec.coffee
│ │ │ │ └── search/
│ │ │ │ ├── search-query-backend-imap-spec.es6
│ │ │ │ └── search-query-parser-spec.es6
│ │ │ ├── spellchecker-spec.es6
│ │ │ ├── stores/
│ │ │ │ ├── account-store-spec.coffee
│ │ │ │ ├── badge-store-spec.coffee
│ │ │ │ ├── contact-store-spec.coffee
│ │ │ │ ├── database-setup-query-builder-spec.es6
│ │ │ │ ├── database-store-spec.es6
│ │ │ │ ├── database-transaction-spec.es6
│ │ │ │ ├── draft-editing-session-spec.coffee
│ │ │ │ ├── draft-factory-spec.es6
│ │ │ │ ├── draft-helpers-spec.es6
│ │ │ │ ├── draft-store-spec.es6
│ │ │ │ ├── feature-usage-store-spec.es6
│ │ │ │ ├── file-download-store-spec.coffee
│ │ │ │ ├── file-upload-store-spec.coffee
│ │ │ │ ├── focused-contacts-store-spec.coffee
│ │ │ │ ├── focused-content-store-spec.coffee
│ │ │ │ ├── focused-perspective-store-spec.coffee
│ │ │ │ ├── folder-sync-progress-store-spec.es6
│ │ │ │ ├── identity-store-spec.es6
│ │ │ │ ├── message-store-spec.coffee
│ │ │ │ ├── send-actions-store-spec.es6
│ │ │ │ ├── task-queue-spec.coffee
│ │ │ │ ├── task-subclass.es6
│ │ │ │ └── undo-redo-store-spec.es6
│ │ │ ├── tasks/
│ │ │ │ ├── base-draft-task-spec.es6
│ │ │ │ ├── change-folder-task-spec.coffee
│ │ │ │ ├── change-labels-task-spec.coffee
│ │ │ │ ├── change-mail-task-spec.coffee
│ │ │ │ ├── change-starred-task-spec.coffee
│ │ │ │ ├── change-unread-task-spec.coffee
│ │ │ │ ├── destroy-category-task-spec.coffee
│ │ │ │ ├── destroy-model-task-spec.es6
│ │ │ │ ├── event-rsvp-task-spec.coffee
│ │ │ │ ├── send-draft-task-spec.es6
│ │ │ │ ├── syncback-category-task-spec.coffee
│ │ │ │ ├── syncback-metadata-task-spec.es6
│ │ │ │ ├── syncback-model-task-spec.es6
│ │ │ │ ├── task-factory-spec.es6
│ │ │ │ └── task-spec.coffee
│ │ │ ├── themes/
│ │ │ │ ├── style-manager-spec.coffee
│ │ │ │ ├── styles-element-spec.coffee
│ │ │ │ └── theme-manager-spec.coffee
│ │ │ ├── undo-stack-spec.es6
│ │ │ └── utils/
│ │ │ ├── date-utils-spec.es6
│ │ │ ├── dom-utils-spec.coffee
│ │ │ └── utils-spec.coffee
│ │ ├── src/
│ │ │ ├── apm-wrapper.coffee
│ │ │ ├── browser/
│ │ │ │ ├── application-menu.coffee
│ │ │ │ ├── application.es6
│ │ │ │ ├── config-migrator.es6
│ │ │ │ ├── config-persistence-manager.es6
│ │ │ │ ├── database-reader.es6
│ │ │ │ ├── file-list-cache.es6
│ │ │ │ ├── global-timer.es6
│ │ │ │ ├── linux-updater-adapter.es6
│ │ │ │ ├── main.js
│ │ │ │ ├── nylas-protocol-handler.es6
│ │ │ │ ├── nylas-window.coffee
│ │ │ │ ├── package-migration-manager.es6
│ │ │ │ ├── prevent-legacy-n1-migration.es6
│ │ │ │ ├── system-tray-manager.es6
│ │ │ │ ├── window-launcher.es6
│ │ │ │ ├── window-manager.es6
│ │ │ │ ├── windows-updater-squirrel-adapter.coffee
│ │ │ │ └── windows-updater.js
│ │ │ ├── buffered-process.coffee
│ │ │ ├── canvas-utils.coffee
│ │ │ ├── chaos-monkey.coffee
│ │ │ ├── chrome-user-agent-stylesheet-string.coffee
│ │ │ ├── color.coffee
│ │ │ ├── compile-cache.js
│ │ │ ├── compile-support/
│ │ │ │ ├── babel.js
│ │ │ │ ├── cjsx.js
│ │ │ │ ├── coffee-script.js
│ │ │ │ └── typescript.js
│ │ │ ├── components/
│ │ │ │ ├── attachment-items.jsx
│ │ │ │ ├── billing-modal.jsx
│ │ │ │ ├── bolded-search-result.jsx
│ │ │ │ ├── button-dropdown.cjsx
│ │ │ │ ├── code-snippet.jsx
│ │ │ │ ├── config-prop-container.jsx
│ │ │ │ ├── contenteditable/
│ │ │ │ │ ├── blockquote-manager.es6
│ │ │ │ │ ├── clipboard-service.es6
│ │ │ │ │ ├── contenteditable-service.es6
│ │ │ │ │ ├── contenteditable.cjsx
│ │ │ │ │ ├── dom-normalizer.coffee
│ │ │ │ │ ├── editor-api.coffee
│ │ │ │ │ ├── emphasis-formatting-extension.es6
│ │ │ │ │ ├── exported-selection.es6
│ │ │ │ │ ├── extended-selection.coffee
│ │ │ │ │ ├── floating-toolbar.cjsx
│ │ │ │ │ ├── link-editor.cjsx
│ │ │ │ │ ├── link-manager.es6
│ │ │ │ │ ├── list-manager.es6
│ │ │ │ │ ├── mouse-service.es6
│ │ │ │ │ ├── paragraph-formatting-extension.es6
│ │ │ │ │ ├── tab-manager.es6
│ │ │ │ │ ├── toolbar-button-manager.es6
│ │ │ │ │ └── toolbar-buttons.jsx
│ │ │ │ ├── date-input.jsx
│ │ │ │ ├── date-picker-popover.jsx
│ │ │ │ ├── date-picker.jsx
│ │ │ │ ├── decorators/
│ │ │ │ │ ├── auto-focuses.jsx
│ │ │ │ │ ├── compose.es6
│ │ │ │ │ ├── has-tutorial-tip.jsx
│ │ │ │ │ ├── listens-to-flux-store.jsx
│ │ │ │ │ ├── listens-to-movement-keys.jsx
│ │ │ │ │ └── listens-to-observable.jsx
│ │ │ │ ├── disclosure-triangle.cjsx
│ │ │ │ ├── drop-zone.jsx
│ │ │ │ ├── dropdown-menu.jsx
│ │ │ │ ├── editable-list.jsx
│ │ │ │ ├── editable-table.jsx
│ │ │ │ ├── empty-list-state.cjsx
│ │ │ │ ├── evented-iframe.cjsx
│ │ │ │ ├── feature-used-up-modal.jsx
│ │ │ │ ├── fixed-popover.jsx
│ │ │ │ ├── flexbox.jsx
│ │ │ │ ├── flux-container.jsx
│ │ │ │ ├── focus-container.jsx
│ │ │ │ ├── generated-form.cjsx
│ │ │ │ ├── injected-component-label.jsx
│ │ │ │ ├── injected-component-set.cjsx
│ │ │ │ ├── injected-component.cjsx
│ │ │ │ ├── key-commands-region.jsx
│ │ │ │ ├── lazy-rendered-list.jsx
│ │ │ │ ├── list-data-source.es6
│ │ │ │ ├── list-selection.es6
│ │ │ │ ├── list-tabular-item.cjsx
│ │ │ │ ├── list-tabular.jsx
│ │ │ │ ├── mail-important-icon.cjsx
│ │ │ │ ├── mail-label-set.jsx
│ │ │ │ ├── mail-label.jsx
│ │ │ │ ├── menu.cjsx
│ │ │ │ ├── metadata-composer-toggle-button.jsx
│ │ │ │ ├── modal.jsx
│ │ │ │ ├── multiselect-action-bar.cjsx
│ │ │ │ ├── multiselect-dropdown.jsx
│ │ │ │ ├── multiselect-list-interaction-handler.coffee
│ │ │ │ ├── multiselect-list.cjsx
│ │ │ │ ├── multiselect-split-interaction-handler.coffee
│ │ │ │ ├── multiselect-toolbar.jsx
│ │ │ │ ├── notification.jsx
│ │ │ │ ├── nylas-calendar/
│ │ │ │ │ ├── calendar-constants.es6
│ │ │ │ │ ├── calendar-data-source.es6
│ │ │ │ │ ├── calendar-event-container.jsx
│ │ │ │ │ ├── calendar-event-popover.jsx
│ │ │ │ │ ├── calendar-event.jsx
│ │ │ │ │ ├── calendar-helpers.jsx
│ │ │ │ │ ├── calendar-toggles.jsx
│ │ │ │ │ ├── current-time-indicator.jsx
│ │ │ │ │ ├── event-grid-background.jsx
│ │ │ │ │ ├── event-participants-input.jsx
│ │ │ │ │ ├── event-search-bar.jsx
│ │ │ │ │ ├── footer-controls.jsx
│ │ │ │ │ ├── header-controls.jsx
│ │ │ │ │ ├── mini-month-view.jsx
│ │ │ │ │ ├── month-view.jsx
│ │ │ │ │ ├── nylas-calendar.jsx
│ │ │ │ │ ├── top-banner.jsx
│ │ │ │ │ ├── week-view-all-day-events.jsx
│ │ │ │ │ ├── week-view-event-column.jsx
│ │ │ │ │ └── week-view.jsx
│ │ │ │ ├── oauth-signin-page.jsx
│ │ │ │ ├── open-identity-page-button.jsx
│ │ │ │ ├── outline-view-item.jsx
│ │ │ │ ├── outline-view.jsx
│ │ │ │ ├── overlaid-components/
│ │ │ │ │ ├── anchor-constants.es6
│ │ │ │ │ ├── custom-contenteditable-components.es6
│ │ │ │ │ ├── overlaid-components.jsx
│ │ │ │ │ └── overlaid-composer-extension.es6
│ │ │ │ ├── participants-text-field.jsx
│ │ │ │ ├── resizable-region.cjsx
│ │ │ │ ├── retina-img.jsx
│ │ │ │ ├── scenario-editor-models.es6
│ │ │ │ ├── scenario-editor-row.cjsx
│ │ │ │ ├── scenario-editor.cjsx
│ │ │ │ ├── scroll-region.cjsx
│ │ │ │ ├── scrollbar-ticks.jsx
│ │ │ │ ├── search-bar.jsx
│ │ │ │ ├── selectable-table.jsx
│ │ │ │ ├── spinner.cjsx
│ │ │ │ ├── swipe-container.jsx
│ │ │ │ ├── switch.jsx
│ │ │ │ ├── syncing-list-state.jsx
│ │ │ │ ├── tab-group-region.cjsx
│ │ │ │ ├── table/
│ │ │ │ │ ├── table-data-source.es6
│ │ │ │ │ └── table.jsx
│ │ │ │ ├── time-picker.jsx
│ │ │ │ ├── toast.jsx
│ │ │ │ ├── tokenizing-text-field.jsx
│ │ │ │ ├── undo-toast.jsx
│ │ │ │ ├── unsafe-component.cjsx
│ │ │ │ └── webview.jsx
│ │ │ ├── config-schema.es6
│ │ │ ├── config-utils.js
│ │ │ ├── config.coffee
│ │ │ ├── database-helpers.es6
│ │ │ ├── date-utils.es6
│ │ │ ├── decorators/
│ │ │ │ └── inflates-draft-client-id.jsx
│ │ │ ├── default-client-helper.coffee
│ │ │ ├── deprecate-utils.coffee
│ │ │ ├── dom-utils.coffee
│ │ │ ├── dom-walkers.es6
│ │ │ ├── error-logger-extensions/
│ │ │ │ └── nylas-private-error-reporter.js
│ │ │ ├── error-logger.js
│ │ │ ├── extensions/
│ │ │ │ ├── account-sidebar-extension.es6
│ │ │ │ ├── composer-extension.coffee
│ │ │ │ ├── contenteditable-extension.coffee
│ │ │ │ ├── extension-utils.es6
│ │ │ │ ├── message-view-extension.coffee
│ │ │ │ └── thread-list-extension.es6
│ │ │ ├── flux/
│ │ │ │ ├── action-bridge.es6
│ │ │ │ ├── actions.es6
│ │ │ │ ├── attributes/
│ │ │ │ │ ├── attribute-boolean.es6
│ │ │ │ │ ├── attribute-collection.es6
│ │ │ │ │ ├── attribute-datetime.es6
│ │ │ │ │ ├── attribute-joined-data.es6
│ │ │ │ │ ├── attribute-number.es6
│ │ │ │ │ ├── attribute-object.es6
│ │ │ │ │ ├── attribute-serverid.es6
│ │ │ │ │ ├── attribute-string.es6
│ │ │ │ │ ├── attribute.es6
│ │ │ │ │ ├── matcher.es6
│ │ │ │ │ └── sort-order.es6
│ │ │ │ ├── attributes.es6
│ │ │ │ ├── coffee-helpers.coffee
│ │ │ │ ├── errors.es6
│ │ │ │ ├── models/
│ │ │ │ │ ├── account.es6
│ │ │ │ │ ├── calendar.es6
│ │ │ │ │ ├── category.es6
│ │ │ │ │ ├── contact.es6
│ │ │ │ │ ├── event.es6
│ │ │ │ │ ├── file.es6
│ │ │ │ │ ├── folder.es6
│ │ │ │ │ ├── json-blob.es6
│ │ │ │ │ ├── label.es6
│ │ │ │ │ ├── message-utils.es6
│ │ │ │ │ ├── message.es6
│ │ │ │ │ ├── model-with-metadata.es6
│ │ │ │ │ ├── model.coffee
│ │ │ │ │ ├── mutable-query-result-set.es6
│ │ │ │ │ ├── mutable-query-subscription.es6
│ │ │ │ │ ├── provider-syncback-request.es6
│ │ │ │ │ ├── query-range.es6
│ │ │ │ │ ├── query-result-set.es6
│ │ │ │ │ ├── query-subscription-pool.es6
│ │ │ │ │ ├── query-subscription.es6
│ │ │ │ │ ├── query.es6
│ │ │ │ │ ├── thread.es6
│ │ │ │ │ ├── unread-query-subscription.es6
│ │ │ │ │ └── utils.coffee
│ │ │ │ ├── modules/
│ │ │ │ │ └── reflux-coffee.coffee
│ │ │ │ ├── nylas-api-helpers.es6
│ │ │ │ ├── nylas-api-request.es6
│ │ │ │ ├── nylas-api.es6
│ │ │ │ ├── nylas-long-connection.es6
│ │ │ │ ├── stores/
│ │ │ │ │ ├── account-store.es6
│ │ │ │ │ ├── badge-store.es6
│ │ │ │ │ ├── category-store.coffee
│ │ │ │ │ ├── contact-ranking-store.coffee
│ │ │ │ │ ├── contact-store.coffee
│ │ │ │ │ ├── database-agent.js
│ │ │ │ │ ├── database-change-record.es6
│ │ │ │ │ ├── database-setup-query-builder.es6
│ │ │ │ │ ├── database-store.es6
│ │ │ │ │ ├── database-writer.es6
│ │ │ │ │ ├── delta-connection-store.es6
│ │ │ │ │ ├── draft-editing-session.coffee
│ │ │ │ │ ├── draft-factory.coffee
│ │ │ │ │ ├── draft-helpers.es6
│ │ │ │ │ ├── draft-store-extension.coffee
│ │ │ │ │ ├── draft-store.es6
│ │ │ │ │ ├── feature-usage-store.jsx
│ │ │ │ │ ├── file-download-store.es6
│ │ │ │ │ ├── file-upload-store.es6
│ │ │ │ │ ├── focused-contacts-store.es6
│ │ │ │ │ ├── focused-content-store.coffee
│ │ │ │ │ ├── focused-perspective-store.es6
│ │ │ │ │ ├── folder-sync-progress-store.es6
│ │ │ │ │ ├── identity-store.es6
│ │ │ │ │ ├── mail-rules-store.coffee
│ │ │ │ │ ├── message-body-processor.es6
│ │ │ │ │ ├── message-store-extension.coffee
│ │ │ │ │ ├── message-store.coffee
│ │ │ │ │ ├── metadata-store.es6
│ │ │ │ │ ├── modal-store.jsx
│ │ │ │ │ ├── observable-list-data-source.es6
│ │ │ │ │ ├── online-status-store.es6
│ │ │ │ │ ├── outbox-store.es6
│ │ │ │ │ ├── popover-store.jsx
│ │ │ │ │ ├── preferences-ui-store.es6
│ │ │ │ │ ├── recently-read-store.es6
│ │ │ │ │ ├── searchable-component-store.es6
│ │ │ │ │ ├── send-actions-store.es6
│ │ │ │ │ ├── signature-store.es6
│ │ │ │ │ ├── task-queue-status-store.coffee
│ │ │ │ │ ├── task-queue.coffee
│ │ │ │ │ ├── thread-counts-store.coffee
│ │ │ │ │ ├── thread-list-actions-store.es6
│ │ │ │ │ ├── undo-redo-store.es6
│ │ │ │ │ └── workspace-store.coffee
│ │ │ │ ├── syncback-task-api-request.es6
│ │ │ │ └── tasks/
│ │ │ │ ├── base-draft-task.es6
│ │ │ │ ├── change-folder-task.es6
│ │ │ │ ├── change-labels-task.es6
│ │ │ │ ├── change-mail-task.es6
│ │ │ │ ├── change-starred-task.es6
│ │ │ │ ├── change-unread-task.es6
│ │ │ │ ├── destroy-category-task.es6
│ │ │ │ ├── destroy-draft-task.es6
│ │ │ │ ├── destroy-model-task.es6
│ │ │ │ ├── ensure-message-in-sent-folder-task.es6
│ │ │ │ ├── event-rsvp-task.es6
│ │ │ │ ├── perform-send-action-task.es6
│ │ │ │ ├── reprocess-mail-rules-task.es6
│ │ │ │ ├── send-draft-task.es6
│ │ │ │ ├── send-feature-usage-event-task.es6
│ │ │ │ ├── syncback-category-task.es6
│ │ │ │ ├── syncback-event-task.es6
│ │ │ │ ├── syncback-metadata-task.es6
│ │ │ │ ├── syncback-model-task.es6
│ │ │ │ ├── task-factory.es6
│ │ │ │ └── task.es6
│ │ │ ├── fs-utils.es6
│ │ │ ├── global/
│ │ │ │ ├── nylas-component-kit.coffee
│ │ │ │ ├── nylas-exports.es6
│ │ │ │ ├── nylas-observables.coffee
│ │ │ │ └── nylas-store.coffee
│ │ │ ├── key-manager.es6
│ │ │ ├── keymap-manager.es6
│ │ │ ├── less-compile-cache.es6
│ │ │ ├── mail-rules-processor.coffee
│ │ │ ├── mail-rules-templates.coffee
│ │ │ ├── mailbox-perspective.coffee
│ │ │ ├── menu-helpers.coffee
│ │ │ ├── menu-manager.es6
│ │ │ ├── module-cache.coffee
│ │ │ ├── multi-request-progress-monitor.es6
│ │ │ ├── n1-cloud-api.es6
│ │ │ ├── native-notifications.es6
│ │ │ ├── nylas-env.es6
│ │ │ ├── package-manager.coffee
│ │ │ ├── package.coffee
│ │ │ ├── priority-ui-coordinator.es6
│ │ │ ├── regexp-utils.coffee
│ │ │ ├── registries/
│ │ │ │ ├── command-registry.es6
│ │ │ │ ├── component-registry.coffee
│ │ │ │ ├── database-object-registry.es6
│ │ │ │ ├── extension-registry.es6
│ │ │ │ ├── serializable-registry.es6
│ │ │ │ ├── service-registry.es6
│ │ │ │ ├── sound-registry.coffee
│ │ │ │ ├── store-registry.es6
│ │ │ │ └── task-registry.es6
│ │ │ ├── searchable-components/
│ │ │ │ ├── iframe-searcher.es6
│ │ │ │ ├── real-dom-parser.es6
│ │ │ │ ├── search-constants.es6
│ │ │ │ ├── search-match.jsx
│ │ │ │ ├── searchable-component-maker.jsx
│ │ │ │ ├── unified-dom-parser.es6
│ │ │ │ └── virtual-dom-parser.es6
│ │ │ ├── secondary-window-bootstrap.es6
│ │ │ ├── services/
│ │ │ │ ├── battery-status-manager.es6
│ │ │ │ ├── delta-processor.es6
│ │ │ │ ├── delta-streaming-connection.es6
│ │ │ │ ├── inline-style-transformer.es6
│ │ │ │ ├── model-search-indexer.es6
│ │ │ │ ├── quote-string-detector.es6
│ │ │ │ ├── quoted-html-transformer.es6
│ │ │ │ ├── quoted-plain-text-transformer.coffee
│ │ │ │ ├── sanitize-transformer.es6
│ │ │ │ ├── search/
│ │ │ │ │ ├── search-query-ast.es6
│ │ │ │ │ ├── search-query-backend-imap.es6
│ │ │ │ │ ├── search-query-backend-local.es6
│ │ │ │ │ └── search-query-parser.es6
│ │ │ │ ├── search-index-scheduler.es6
│ │ │ │ └── unwrapped-signature-detector.es6
│ │ │ ├── sheet-container.cjsx
│ │ │ ├── sheet-toolbar.cjsx
│ │ │ ├── sheet.cjsx
│ │ │ ├── spellchecker.es6
│ │ │ ├── style-manager.coffee
│ │ │ ├── styles-element.coffee
│ │ │ ├── system-start-service.es6
│ │ │ ├── task-bootstrap.coffee
│ │ │ ├── task.coffee
│ │ │ ├── theme-manager.coffee
│ │ │ ├── theme-package.coffee
│ │ │ ├── undo-stack.es6
│ │ │ ├── virtual-dom-utils.es6
│ │ │ ├── window-bootstrap.es6
│ │ │ ├── window-bridge.coffee
│ │ │ ├── window-event-handler.coffee
│ │ │ └── window.coffee
│ │ └── static/
│ │ ├── animations/
│ │ │ └── inbox-zero/
│ │ │ ├── airstrip/
│ │ │ │ ├── airstrip.html
│ │ │ │ └── airstrip.hyperesources/
│ │ │ │ ├── 96CD36-restorable.plist
│ │ │ │ ├── PIE.htc
│ │ │ │ └── airstrip_hype_generated_script.js
│ │ │ ├── galaxy/
│ │ │ │ ├── galaxy.html
│ │ │ │ └── galaxy.hyperesources/
│ │ │ │ ├── BC8A15-restorable.plist
│ │ │ │ ├── PIE.htc
│ │ │ │ └── galaxy_hype_generated_script.js
│ │ │ ├── gem/
│ │ │ │ ├── gem.html
│ │ │ │ └── gem.hyperesources/
│ │ │ │ └── gemslower_hype_generated_script.js
│ │ │ ├── oasis/
│ │ │ │ ├── oasis.html
│ │ │ │ └── oasis.hyperesources/
│ │ │ │ ├── DC9C02-restorable.plist
│ │ │ │ ├── PIE.htc
│ │ │ │ └── oasis_hype_generated_script.js
│ │ │ └── tron/
│ │ │ ├── tron.html
│ │ │ └── tron.hyperesources/
│ │ │ ├── 4982A5-restorable.plist
│ │ │ ├── PIE.htc
│ │ │ └── tron_hype_generated_script.js
│ │ ├── buttons.less
│ │ ├── components/
│ │ │ ├── attachment-items.less
│ │ │ ├── billing-modal.less
│ │ │ ├── button-dropdown.less
│ │ │ ├── code-snippet.less
│ │ │ ├── contenteditable.less
│ │ │ ├── date-input.less
│ │ │ ├── date-picker-popover.less
│ │ │ ├── date-picker.less
│ │ │ ├── disclosure-triangle.less
│ │ │ ├── editable-list.less
│ │ │ ├── editable-table.less
│ │ │ ├── empty-list-state.less
│ │ │ ├── extra.less
│ │ │ ├── feature-used-up-modal.less
│ │ │ ├── fixed-popover.less
│ │ │ ├── generated-form.less
│ │ │ ├── key-commands-region.less
│ │ │ ├── list-tabular.less
│ │ │ ├── menu.less
│ │ │ ├── modal.less
│ │ │ ├── multiselect-dropdown.less
│ │ │ ├── nylas-calendar.less
│ │ │ ├── outline-view.less
│ │ │ ├── scroll-region.less
│ │ │ ├── search-bar.less
│ │ │ ├── spinner.less
│ │ │ ├── switch.less
│ │ │ ├── syncing-list-state.less
│ │ │ ├── table.less
│ │ │ ├── time-picker.less
│ │ │ ├── toast.less
│ │ │ ├── tokenizing-text-field.less
│ │ │ ├── tutorial-overlay.less
│ │ │ ├── undo-toast.less
│ │ │ ├── unsafe.less
│ │ │ └── webview.less
│ │ ├── dropdowns.less
│ │ ├── email-frame.less
│ │ ├── index.html
│ │ ├── index.js
│ │ ├── index.less
│ │ ├── inputs.less
│ │ ├── jasmine.less
│ │ ├── linux.less
│ │ ├── mixins/
│ │ │ ├── background-variant.less
│ │ │ ├── common-ui-elements.less
│ │ │ ├── text-emphasis.less
│ │ │ └── windows.less
│ │ ├── normalize.less
│ │ ├── package-template/
│ │ │ ├── README.md
│ │ │ ├── lib/
│ │ │ │ ├── main.es6
│ │ │ │ ├── my-composer-button.jsx
│ │ │ │ └── my-message-sidebar.jsx
│ │ │ ├── spec/
│ │ │ │ ├── main-spec.es6
│ │ │ │ └── my-composer-button-spec.jsx
│ │ │ └── stylesheets/
│ │ │ └── main.less
│ │ ├── resizable.less
│ │ ├── selection.less
│ │ ├── sounds/
│ │ │ ├── mail_sent.ogg
│ │ │ └── new_mail.ogg
│ │ ├── type.less
│ │ ├── utilities.less
│ │ ├── variables/
│ │ │ ├── ui-mixins.less
│ │ │ └── ui-variables.less
│ │ └── workspace.less
│ ├── client-sync/
│ │ ├── README.md
│ │ ├── main.es6
│ │ ├── package.json
│ │ ├── spec/
│ │ │ ├── fixtures/
│ │ │ │ ├── FetchFolderList/
│ │ │ │ │ ├── gmail-bengotow.json
│ │ │ │ │ └── imap-inboxapptest1.json
│ │ │ │ ├── MessageUtils/
│ │ │ │ │ ├── parseFromImap/
│ │ │ │ │ │ ├── crypto-gram-ascii-plaintext.json
│ │ │ │ │ │ ├── eff-plaintext-no-mime.json
│ │ │ │ │ │ ├── hacker-newsletter-multipart-alternative.json
│ │ │ │ │ │ ├── mileageplus-mime-html-only.json
│ │ │ │ │ │ ├── node-streamtest-windows-1252.json
│ │ │ │ │ │ ├── spam-mime-html-base64-encoded.json
│ │ │ │ │ │ └── theskimm-multipart-alternative-quoted-printable.json
│ │ │ │ │ └── parseSnippet/
│ │ │ │ │ ├── finimize.html
│ │ │ │ │ ├── finimize.txt
│ │ │ │ │ ├── fittymi.html
│ │ │ │ │ ├── fittymi.txt
│ │ │ │ │ ├── mit_events.html
│ │ │ │ │ ├── mit_events.txt
│ │ │ │ │ ├── personal_capital.html
│ │ │ │ │ └── personal_capital.txt
│ │ │ │ └── Threading/
│ │ │ │ ├── remote-thread-id-no.js
│ │ │ │ ├── remote-thread-id-yes.js
│ │ │ │ ├── subject-matching-no.js
│ │ │ │ └── subject-matching-yes.js
│ │ │ ├── helpers.js
│ │ │ ├── local-sync-worker/
│ │ │ │ ├── imap-helpers-spec.es6
│ │ │ │ ├── sync-process-manager-spec.es6
│ │ │ │ ├── sync-tasks/
│ │ │ │ │ └── fetch-folder-list-spec.js
│ │ │ │ └── syncback-tasks/
│ │ │ │ └── syncback-task-spec.es6
│ │ │ ├── message-processor/
│ │ │ │ └── detect-thread-spec.js
│ │ │ └── shared/
│ │ │ └── interruptible-spec.es6
│ │ ├── src/
│ │ │ ├── local-api/
│ │ │ │ ├── decorators/
│ │ │ │ │ └── connections.js
│ │ │ │ ├── default-sync-policy.js
│ │ │ │ ├── index.js
│ │ │ │ ├── newrelic.js
│ │ │ │ ├── route-helpers.es6
│ │ │ │ ├── routes/
│ │ │ │ │ ├── auth.js
│ │ │ │ │ ├── calendars.js
│ │ │ │ │ ├── categories.js
│ │ │ │ │ ├── contacts.js
│ │ │ │ │ ├── drafts.js
│ │ │ │ │ ├── events.js
│ │ │ │ │ ├── files.js
│ │ │ │ │ ├── health.es6
│ │ │ │ │ ├── messages.js
│ │ │ │ │ ├── ping.js
│ │ │ │ │ ├── send.js
│ │ │ │ │ └── threads.js
│ │ │ │ ├── search.js
│ │ │ │ └── serialization.js
│ │ │ ├── local-sync-dashboard/
│ │ │ │ ├── dropdown.jsx
│ │ │ │ ├── elapsed-time.jsx
│ │ │ │ ├── modal.jsx
│ │ │ │ ├── root.jsx
│ │ │ │ ├── set-all-sync-policies.jsx
│ │ │ │ ├── sync-graph.jsx
│ │ │ │ └── syncback-request-details.jsx
│ │ │ ├── local-sync-worker/
│ │ │ │ ├── imap-helpers.js
│ │ │ │ ├── index.js
│ │ │ │ ├── local-sync-delta-emitter.es6
│ │ │ │ ├── newrelic.js
│ │ │ │ ├── send-task-manager.es6
│ │ │ │ ├── send-task-runner.es6
│ │ │ │ ├── sync-process-manager.es6
│ │ │ │ ├── sync-task-factory.js
│ │ │ │ ├── sync-tasks/
│ │ │ │ │ ├── fetch-folder-list.imap.es6
│ │ │ │ │ ├── fetch-messages-in-folder.imap.es6
│ │ │ │ │ ├── fetch-new-messages-in-folder.imap.es6
│ │ │ │ │ ├── fetch-specific-messages-in-folder.imap.es6
│ │ │ │ │ └── sync-task.js
│ │ │ │ ├── sync-utils.es6
│ │ │ │ ├── sync-worker.es6
│ │ │ │ ├── syncback-task-factory.js
│ │ │ │ ├── syncback-task-runner.es6
│ │ │ │ └── syncback-tasks/
│ │ │ │ ├── create-category.imap.es6
│ │ │ │ ├── delete-folder.imap.es6
│ │ │ │ ├── delete-label.imap.es6
│ │ │ │ ├── ensure-message-in-sent-folder.imap.es6
│ │ │ │ ├── mark-thread-as-read.imap.es6
│ │ │ │ ├── mark-thread-as-unread.imap.es6
│ │ │ │ ├── move-thread-to-folder.imap.es6
│ │ │ │ ├── rename-folder.imap.es6
│ │ │ │ ├── rename-label.imap.es6
│ │ │ │ ├── send-message-per-recipient.smtp.es6
│ │ │ │ ├── send-message.smtp.es6
│ │ │ │ ├── set-thread-folder-and-labels.imap.es6
│ │ │ │ ├── set-thread-labels.imap.es6
│ │ │ │ ├── star-thread.imap.es6
│ │ │ │ ├── sync-unknown-uids.imap.es6
│ │ │ │ ├── syncback-task.es6
│ │ │ │ └── unstar-thread.imap.es6
│ │ │ ├── message-processor/
│ │ │ │ ├── detect-thread.js
│ │ │ │ ├── extract-contacts.js
│ │ │ │ ├── extract-files.js
│ │ │ │ └── index.js
│ │ │ ├── models/
│ │ │ │ ├── contact.js
│ │ │ │ ├── file.js
│ │ │ │ ├── folder.es6
│ │ │ │ ├── label.js
│ │ │ │ ├── message.js
│ │ │ │ ├── messageLabel.js
│ │ │ │ ├── messageReference.js
│ │ │ │ ├── reference.js
│ │ │ │ ├── syncbackRequest.js
│ │ │ │ ├── thread.js
│ │ │ │ ├── threadFolder.js
│ │ │ │ └── threadLabel.js
│ │ │ └── shared/
│ │ │ ├── database-extensions.js
│ │ │ ├── dedupe-accounts.es6
│ │ │ ├── imap-paths-utils.js
│ │ │ ├── interruptible.js
│ │ │ ├── local-database-connector.js
│ │ │ ├── logger.es6
│ │ │ ├── shim-sequelize.es6
│ │ │ ├── stream-decoders.es6
│ │ │ ├── sync-activity.es6
│ │ │ └── transaction-connector.js
│ │ └── stylesheets/
│ │ └── index.less
│ ├── cloud-api/
│ │ ├── .gitignore
│ │ ├── README.md
│ │ ├── app.es6
│ │ ├── package.json
│ │ ├── spec/
│ │ │ ├── helpers.es6
│ │ │ ├── jasmine/
│ │ │ │ ├── execute.es6
│ │ │ │ ├── extensions.es6
│ │ │ │ └── polyfills.es6
│ │ │ ├── metatdata-spec.es6
│ │ │ └── run.es6
│ │ ├── src/
│ │ │ ├── authentication.es6
│ │ │ ├── decorators/
│ │ │ │ ├── error-format.es6
│ │ │ │ └── logger.es6
│ │ │ ├── routes/
│ │ │ │ ├── admin.es6
│ │ │ │ ├── auth.es6
│ │ │ │ ├── blobs.es6
│ │ │ │ ├── delta.es6
│ │ │ │ ├── honeycomb.es6
│ │ │ │ ├── link-tracking.es6
│ │ │ │ ├── metadata.es6
│ │ │ │ ├── open-tracking.es6
│ │ │ │ ├── ping.es6
│ │ │ │ └── static.es6
│ │ │ ├── sentry.es6
│ │ │ ├── serialization.js
│ │ │ ├── tracking-utils.es6
│ │ │ └── views/
│ │ │ ├── admin.html
│ │ │ ├── gmail-auth-failure.html
│ │ │ ├── gmail-auth-success.html
│ │ │ └── layout/
│ │ │ └── default.html
│ │ └── static/
│ │ ├── css/
│ │ │ └── index.css
│ │ └── fonts/
│ │ └── Avenir.css
│ ├── cloud-core/
│ │ ├── README.md
│ │ ├── _n1cloud_docker_launcher.sh
│ │ ├── build/
│ │ │ └── build-n1-cloud.js
│ │ ├── database-connector.es6
│ │ ├── database-extensions.js
│ │ ├── gmail-oauth-helpers.es6
│ │ ├── index.js
│ │ ├── log-streams.js
│ │ ├── logger.js
│ │ ├── migrations/
│ │ │ └── 01-expirationDate-metadata.es6
│ │ ├── models/
│ │ │ ├── cloud-job.es6
│ │ │ ├── metadata.js
│ │ │ └── pending-auth-response.js
│ │ ├── package.json
│ │ ├── pm2-debug-cloud-api.yml
│ │ ├── pm2-dev.yml
│ │ ├── pm2-prod-api.yml
│ │ ├── pm2-prod-workers.yml
│ │ ├── pubsub-connector.js
│ │ ├── scripts/
│ │ │ ├── migrate-db.es6
│ │ │ └── run-redis.sh
│ │ └── spec/
│ │ ├── jasmine/
│ │ │ ├── execute.es6
│ │ │ ├── extensions.es6
│ │ │ └── polyfills.es6
│ │ ├── logger-spec.js
│ │ └── run.es6
│ ├── cloud-workers/
│ │ ├── README.md
│ │ ├── app.es6
│ │ ├── package.json
│ │ ├── spec/
│ │ │ ├── jasmine/
│ │ │ │ ├── execute.es6
│ │ │ │ ├── extensions.es6
│ │ │ │ └── polyfills.es6
│ │ │ └── run.es6
│ │ └── src/
│ │ ├── cloud-worker.es6
│ │ ├── foreman.es6
│ │ ├── monitoring.es6
│ │ ├── sentry.es6
│ │ └── workers/
│ │ ├── send-later.es6
│ │ ├── send-reminders.es6
│ │ └── snooze.es6
│ └── isomorphic-core/
│ ├── README.md
│ ├── index.js
│ ├── package.json
│ ├── spec/
│ │ ├── backoff-scheduler-spec.es6
│ │ ├── imap-connection-pool-spec.es6
│ │ ├── jasmine/
│ │ │ ├── config.json
│ │ │ ├── execute.es6
│ │ │ ├── extensions.es6
│ │ │ └── polyfills.es6
│ │ ├── message-utils-spec.js
│ │ └── run.es6
│ └── src/
│ ├── auth-helpers.es6
│ ├── backoff-schedulers.es6
│ ├── database-types.js
│ ├── db-utils.es6
│ ├── delta-stream-builder.js
│ ├── env-helpers.es6
│ ├── errors.es6
│ ├── hook-increment-version-on-save.js
│ ├── hook-transaction-log.js
│ ├── imap-box.es6
│ ├── imap-connection-pool.es6
│ ├── imap-connection.es6
│ ├── imap-errors.es6
│ ├── load-models.js
│ ├── message-body-utils.es6
│ ├── message-utils.es6
│ ├── metrics-reporter.es6
│ ├── migrations/
│ │ └── 20160617002207-create-user.js
│ ├── model-utils.es6
│ ├── models/
│ │ ├── account-token.js
│ │ ├── account.js
│ │ └── transaction.js
│ ├── promise-utils.js
│ ├── sendmail-client.es6
│ ├── shell-utils.es6
│ ├── smtp-errors.es6
│ ├── string-utils.es6
│ ├── tls-utils.es6
│ └── tracking-utils.es6
└── scripts/
├── benchmark-initial-sync.sh
├── benchmark-new-commits.sh
├── daily.js
├── drop-data-except-accounts.sh
├── postinstall.es6
├── requirements.txt
├── run-once-per-day.sh
└── upload-benchmark-data.py
SYMBOL INDEX (1804 symbols across 325 files)
FILE: packages/client-app/build/tasks/docs-render-task.js
method highlight (line 8) | highlight(code) {
function __guard__ (line 230) | function __guard__(value, transform) {
FILE: packages/client-app/build/tasks/nylaslint-task.js
function normalizeRequirePath (line 5) | function normalizeRequirePath(requirePath, fPath) {
FILE: packages/client-app/build/tasks/package-task.js
function runCopyAPM (line 18) | function runCopyAPM(buildPath, electronVersion, platform, arch, callback) {
function runCopyPlatformSpecificResources (line 40) | function runCopyPlatformSpecificResources(buildPath, electronVersion, pl...
function resolveRealSymlinkPaths (line 56) | function resolveRealSymlinkPaths(appDir) {
function runCopySymlinkedPackages (line 79) | function runCopySymlinkedPackages(buildPath, electronVersion, platform, ...
function removeUnnecessaryFiles (line 98) | function removeUnnecessaryFiles(buildPath, electronVersion, platform, ar...
function runTranspilers (line 103) | function runTranspilers(buildPath, electronVersion, platform, arch, call...
FILE: packages/client-app/build/tasks/task-helpers.js
function spawn (line 4) | function spawn(options, callback) {
function spawnP (line 22) | function spawnP(options) {
FILE: packages/client-app/internal_packages/activity-list/lib/activity-list-button.jsx
class ActivityListButton (line 9) | class ActivityListButton extends React.Component {
method constructor (line 12) | constructor() {
method componentDidMount (line 17) | componentDidMount() {
method componentWillUnmount (line 21) | componentWillUnmount() {
method _getStateFromStores (line 37) | _getStateFromStores() {
method render (line 43) | render() {
FILE: packages/client-app/internal_packages/activity-list/lib/activity-list-item-container.jsx
class ActivityListItemContainer (line 11) | class ActivityListItemContainer extends React.Component {
method constructor (line 19) | constructor(props) {
method _onClick (line 26) | _onClick(threadId) {
method _getText (line 35) | _getText() {
method renderActivityContainer (line 60) | renderActivityContainer() {
method render (line 93) | render() {
FILE: packages/client-app/internal_packages/activity-list/lib/activity-list-store.jsx
class ActivityListStore (line 14) | class ActivityListStore extends NylasStore {
method activate (line 15) | activate() {
method actions (line 21) | actions() {
method unreadCount (line 25) | unreadCount() {
method hasBeenViewed (line 34) | hasBeenViewed(action) {
method focusThread (line 39) | focusThread(threadId) {
method getRecipient (line 53) | getRecipient(recipientEmail, recipients) {
method _dataSource (line 66) | _dataSource() {
method _onResetSeen (line 70) | _onResetSeen() {
method _getActivity (line 76) | _getActivity() {
method _updateActivity (line 88) | _updateActivity() {
method _getActions (line 93) | _getActions(messages) {
method _openActionsForMessage (line 129) | _openActionsForMessage(message) {
method _linkActionsForMessage (line 168) | _linkActionsForMessage(message) {
FILE: packages/client-app/internal_packages/activity-list/lib/activity-list.jsx
class ActivityList (line 11) | class ActivityList extends React.Component {
method constructor (line 15) | constructor() {
method componentDidMount (line 20) | componentDidMount() {
method componentWillUnmount (line 24) | componentWillUnmount() {
method _getStateFromStores (line 33) | _getStateFromStores() {
method _groupActions (line 42) | _groupActions(actions) {
method renderActions (line 60) | renderActions() {
method render (line 78) | render() {
FILE: packages/client-app/internal_packages/activity-list/spec/activity-list-spec.jsx
constant OPEN_TRACKING_ID (line 15) | const OPEN_TRACKING_ID = 'open-tracking-id'
constant LINK_TRACKING_ID (line 16) | const LINK_TRACKING_ID = 'link-tracking-id'
FILE: packages/client-app/internal_packages/attachments/lib/message-attachments.jsx
class MessageAttachments (line 6) | class MessageAttachments extends Component {
method renderAttachment (line 44) | renderAttachment(AttachmentRenderer, file) {
method render (line 75) | render() {
FILE: packages/client-app/internal_packages/category-mapper/lib/category-selection.jsx
class CategorySelection (line 14) | class CategorySelection extends React.Component {
method constructor (line 19) | constructor(props) {
method componentDidMount (line 28) | componentDidMount() {
method shouldComponentUpdate (line 32) | shouldComponentUpdate(nextProps, nextState) {
method componentWillUnmount (line 36) | componentWillUnmount() {
method render (line 131) | render() {
FILE: packages/client-app/internal_packages/category-mapper/lib/preferences-category-mapper.jsx
constant ROLES (line 12) | const ROLES = ['inbox', 'sent', 'drafts', 'spam', 'trash']
class PreferencesCategoryMapper (line 14) | class PreferencesCategoryMapper extends React.Component {
method constructor (line 15) | constructor() {
method componentDidMount (line 22) | componentDidMount() {
method componentWillUnmount (line 27) | componentWillUnmount() {
method _populateRoleAssignments (line 31) | async _populateRoleAssignments() {
method render (line 111) | render() {
FILE: packages/client-app/internal_packages/category-picker/lib/category-picker-popover.jsx
class CategoryPickerPopover (line 24) | class CategoryPickerPopover extends Component {
method constructor (line 31) | constructor(props) {
method componentDidMount (line 39) | componentDidMount() {
method componentWillReceiveProps (line 43) | componentWillReceiveProps(nextProps) {
method componentWillUnmount (line 48) | componentWillUnmount() {
method render (line 325) | render() {
FILE: packages/client-app/internal_packages/composer-emoji/lib/emoji-button-popover.jsx
class EmojiButtonPopover (line 10) | class EmojiButtonPopover extends React.Component {
method constructor (line 13) | constructor() {
method componentDidMount (line 28) | componentDidMount() {
method componentWillUnmount (line 34) | componentWillUnmount() {
method scrollToCategory (line 145) | scrollToCategory(category) {
method findSearchMatches (line 159) | findSearchMatches(searchValue) {
method calcPosition (line 172) | calcPosition(event) {
method renderTabs (line 201) | renderTabs() {
method renderCanvas (line 223) | renderCanvas() {
method renderCategory (line 247) | renderCategory(category, i, ctx, pos, callback) {
method render (line 294) | render() {
FILE: packages/client-app/internal_packages/composer-emoji/lib/emoji-button.jsx
class EmojiButton (line 7) | class EmojiButton extends React.Component {
method render (line 18) | render() {
FILE: packages/client-app/internal_packages/composer-emoji/lib/emoji-composer-extension.jsx
class EmojiComposerExtension (line 9) | class EmojiComposerExtension extends ComposerExtension {
method _findEmojiOptions (line 170) | static _findEmojiOptions(sel) {
method _emojiPickerWidth (line 239) | static _emojiPickerWidth(emojiOptions) {
method _emojiPickerHeight (line 251) | static _emojiPickerHeight(emojiOptions) {
method _getTextUntilSpace (line 259) | static _getTextUntilSpace(node, offset) {
method _findMatches (line 279) | static _findMatches(word) {
FILE: packages/client-app/internal_packages/composer-emoji/lib/emoji-message-extension.jsx
function makeIntoEmojiTag (line 7) | function makeIntoEmojiTag(nodeArg, emojiName) {
class EmojiMessageExtension (line 17) | class EmojiMessageExtension extends MessageViewExtension {
method renderedMessageBodyIntoDocument (line 18) | static renderedMessageBodyIntoDocument({document}) {
FILE: packages/client-app/internal_packages/composer-emoji/lib/emoji-picker.jsx
class EmojiPicker (line 8) | class EmojiPicker extends React.Component {
method constructor (line 15) | constructor(props) {
method componentDidUpdate (line 20) | componentDidUpdate() {
method onMouseDown (line 27) | onMouseDown(emojiName) {
method render (line 31) | render() {
FILE: packages/client-app/internal_packages/composer-emoji/lib/emoji-store.jsx
class EmojiStore (line 13) | class EmojiStore extends NylasStore {
method constructor (line 14) | constructor(props) {
method getImagePath (line 44) | getImagePath(emojiName) {
FILE: packages/client-app/internal_packages/composer-mail-merge/lib/listens-to-mail-merge-session.jsx
function ListensToMailMergeSession (line 6) | function ListensToMailMergeSession(ComposedComponent) {
FILE: packages/client-app/internal_packages/composer-mail-merge/lib/mail-merge-body-token.jsx
class MailMergeBodyToken (line 18) | class MailMergeBodyToken extends Component {
method constructor (line 33) | constructor(props) {
method componentDidMount (line 38) | componentDidMount() {
method componentWillReceiveProps (line 50) | componentWillReceiveProps(nextProps) {
method shouldComponentUpdate (line 54) | shouldComponentUpdate(nextProps, nextState) {
method componentDidUpdate (line 64) | componentDidUpdate() {
method componentWillUnmount (line 83) | componentWillUnmount() {
method getState (line 92) | getState(props) {
method render (line 105) | render() {
FILE: packages/client-app/internal_packages/composer-mail-merge/lib/mail-merge-button.jsx
function MailMergeButton (line 7) | function MailMergeButton(props) {
FILE: packages/client-app/internal_packages/composer-mail-merge/lib/mail-merge-container.jsx
class MailMergeContainer (line 6) | class MailMergeContainer extends Component {
method shouldComponentUpdate (line 18) | shouldComponentUpdate(nextProps) {
method render (line 27) | render() {
FILE: packages/client-app/internal_packages/composer-mail-merge/lib/mail-merge-header-input.jsx
function getInputSize (line 6) | function getInputSize(value) {
class MailMergeHeaderInput (line 10) | class MailMergeHeaderInput extends Component {
method constructor (line 20) | constructor(props) {
method componentWillReceiveProps (line 25) | componentWillReceiveProps(nextProps) {
method render (line 41) | render() {
FILE: packages/client-app/internal_packages/composer-mail-merge/lib/mail-merge-participants-text-field.jsx
function MailMergeParticipantToken (line 9) | function MailMergeParticipantToken(props) {
class MailMergeParticipantsTextField (line 28) | class MailMergeParticipantsTextField extends Component {
method constructor (line 48) | constructor(props) {
method focus (line 87) | focus() {
method render (line 96) | render() {
FILE: packages/client-app/internal_packages/composer-mail-merge/lib/mail-merge-send-button.jsx
class MailMergeSendButton (line 8) | class MailMergeSendButton extends Component {
method constructor (line 21) | constructor(props) {
method primarySend (line 54) | primarySend() {
method render (line 65) | render() {
method primarySend (line 108) | primarySend() {
FILE: packages/client-app/internal_packages/composer-mail-merge/lib/mail-merge-subject-text-field.jsx
class MailMergeSubjectTextField (line 10) | class MailMergeSubjectTextField extends Component {
method componentDidMount (line 25) | componentDidMount() {
method shouldComponentUpdate (line 34) | shouldComponentUpdate(nextProps) {
method componentDidUpdate (line 42) | componentDidUpdate() {
method focus (line 79) | focus() {
method renderContenteditable (line 89) | renderContenteditable() {
method render (line 112) | render() {
FILE: packages/client-app/internal_packages/composer-mail-merge/lib/mail-merge-table.jsx
function InputRenderer (line 7) | function InputRenderer(props) {
function MailMergeTable (line 20) | function MailMergeTable(props) {
FILE: packages/client-app/internal_packages/composer-mail-merge/lib/mail-merge-token.jsx
function onDragStart (line 7) | function onDragStart(event, {draftClientId, colIdx, colName, dragBehavio...
function MailMergeToken (line 16) | function MailMergeToken(props) {
FILE: packages/client-app/internal_packages/composer-mail-merge/lib/mail-merge-workspace.jsx
class MailMergeWorkspace (line 9) | class MailMergeWorkspace extends Component {
method constructor (line 20) | constructor() {
method loadCSV (line 56) | loadCSV(newTableData) {
method renderSelectionControls (line 77) | renderSelectionControls() {
method renderDropCover (line 111) | renderDropCover() {
method render (line 123) | render() {
FILE: packages/client-app/internal_packages/composer-scheduler/lib/calendar/proposed-time-event.jsx
class ProposedTimeEvent (line 9) | class ProposedTimeEvent extends React.Component {
method _onMouseDown (line 28) | _onMouseDown(event) {
method render (line 33) | render() {
FILE: packages/client-app/internal_packages/composer-scheduler/lib/calendar/proposed-time-picker.jsx
class ProposedTimePicker (line 11) | class ProposedTimePicker extends React.Component {
method constructor (line 18) | constructor(props) {
method componentDidMount (line 27) | componentDidMount() {
method shouldComponentUpdate (line 38) | shouldComponentUpdate(nextProps, nextState) {
method componentWillUnmount (line 43) | componentWillUnmount() {
method _dataSource (line 47) | _dataSource() {
method _renderClearButton (line 63) | _renderClearButton() {
method _leftFooterComponents (line 83) | _leftFooterComponents() {
method _rightFooterComponents (line 110) | _rightFooterComponents() {
method _onCalendarMouseUp (line 137) | _onCalendarMouseUp({time, currentView}) {
method _onCalendarMouseMove (line 146) | _onCalendarMouseMove({time, mouseIsDown, currentView}) {
method _onCalendarMouseDown (line 152) | _onCalendarMouseDown({time, currentView}) {
method render (line 158) | render() {
FILE: packages/client-app/internal_packages/composer-scheduler/lib/composer/event-datetime-input.jsx
function getDateFormat (line 5) | function getDateFormat(type) {
class EventDatetimeInput (line 14) | class EventDatetimeInput extends React.Component {
method constructor (line 24) | constructor(props) {
method _onDateChange (line 29) | _onDateChange() {
method _renderInput (line 36) | _renderInput(type) {
method render (line 54) | render() {
FILE: packages/client-app/internal_packages/composer-scheduler/lib/composer/new-event-card-container.jsx
class NewEventCardContainer (line 43) | class NewEventCardContainer extends Component {
method componentDidMount (line 53) | componentDidMount() {
method componentWillUnmount (line 58) | componentWillUnmount() {
method _onConfirmChoices (line 65) | _onConfirmChoices({proposals = [], draftClientId}) {
method _getEvent (line 81) | _getEvent() {
method render (line 109) | render() {
FILE: packages/client-app/internal_packages/composer-scheduler/lib/composer/new-event-card.jsx
class NewEventCard (line 20) | class NewEventCard extends React.Component {
method constructor (line 31) | constructor(props) {
method componentDidMount (line 39) | componentDidMount() {
method componentWillReceiveProps (line 45) | componentWillReceiveProps(newProps) {
method componentWillUnmount (line 50) | componentWillUnmount() {
method _loadCalendarsForEmail (line 54) | _loadCalendarsForEmail(email) {
method _renderIcon (line 68) | _renderIcon(name) {
method _renderParticipants (line 74) | _renderParticipants() {
method _renderCalendarPicker (line 78) | _renderCalendarPicker() {
method _eventStart (line 98) | _eventStart() {
method _eventEnd (line 102) | _eventEnd() {
method _renderTimePicker (line 147) | _renderTimePicker() {
method _renderSuggestPrompt (line 187) | _renderSuggestPrompt() {
method render (line 203) | render() {
FILE: packages/client-app/internal_packages/composer-scheduler/lib/composer/new-event-preview.jsx
class NewEventPreview (line 11) | class NewEventPreview extends React.Component {
method constructor (line 22) | constructor(props) {
method componentWillReceiveProps (line 27) | componentWillReceiveProps(props) {
method _stateFromProps (line 31) | _stateFromProps(props) {
method _renderB64Img (line 44) | _renderB64Img(name, styles = {}) {
method _renderEventInfo (line 57) | _renderEventInfo() {
method _renderEventTime (line 82) | _renderEventTime() {
method _sEventPreviewWrap (line 93) | _sEventPreviewWrap() {
method render (line 103) | render() {
FILE: packages/client-app/internal_packages/composer-scheduler/lib/composer/proposed-time-list.jsx
class ProposedTimeList (line 11) | class ProposedTimeList extends React.Component {
method _proposalUrl (line 26) | _proposalUrl(proposalId) {
method _renderB64Img (line 31) | _renderB64Img(name) {
method _renderHeaderInEmail (line 43) | _renderHeaderInEmail() {
method _renderHeaderInCard (line 63) | _renderHeaderInCard() {
method _sProposalTimeList (line 77) | _sProposalTimeList() {
method _sProposalWrap (line 93) | _sProposalWrap() {
method _proposalsByDay (line 99) | _proposalsByDay() {
method _sProposalTable (line 105) | _sProposalTable() {
method _sTD (line 113) | _sTD() {
method _sTH (line 119) | _sTH() {
method _sTDInner (line 128) | _sTDInner(isLast) {
method _sTHInner (line 141) | _sTHInner() {
method _renderProposalTable (line 148) | _renderProposalTable() {
method _renderProposalTimeText (line 213) | _renderProposalTimeText(proposal) {
method _headerTextFromDay (line 221) | _headerTextFromDay(dayNum) {
method _sProposalsWrap (line 225) | _sProposalsWrap() {
method render (line 233) | render() {
FILE: packages/client-app/internal_packages/composer-scheduler/lib/composer/scheduler-composer-button.jsx
constant MEETING_REQUEST (line 19) | const MEETING_REQUEST = "Send a meeting request…"
constant PROPOSAL (line 20) | const PROPOSAL = "Propose times to meet…"
class SchedulerComposerButton (line 22) | class SchedulerComposerButton extends React.Component {
method constructor (line 30) | constructor(props) {
method shouldComponentUpdate (line 36) | shouldComponentUpdate(nextProps, nextState) {
method _hasPendingEvent (line 41) | _hasPendingEvent(props) {
method _renderPopover (line 47) | _renderPopover() {
method _onPluginAuthError (line 109) | _onPluginAuthError(error) {
method _now (line 125) | _now() {
method _hasEvent (line 129) | _hasEvent() {
method render (line 133) | render() {
FILE: packages/client-app/internal_packages/composer-signature/lib/preferences-signatures.jsx
class PreferencesSignatures (line 14) | class PreferencesSignatures extends React.Component {
method constructor (line 17) | constructor() {
method componentDidMount (line 22) | componentDidMount() {
method componentWillUnmount (line 28) | componentWillUnmount() {
method _getStateFromStores (line 37) | _getStateFromStores() {
method _renderSignatureToolbar (line 97) | _renderSignatureToolbar() {
method _labelForAccountPicker (line 127) | _labelForAccountPicker() {
method _renderAccountPicker (line 135) | _renderAccountPicker() {
method _renderEditableSignature (line 152) | _renderEditableSignature() {
method _renderHTMLSignature (line 164) | _renderHTMLSignature() {
method _renderSignatures (line 173) | _renderSignatures() {
method render (line 216) | render() {
FILE: packages/client-app/internal_packages/composer-signature/lib/signature-composer-dropdown.jsx
class SignatureComposerDropdown (line 16) | class SignatureComposerDropdown extends React.Component {
method constructor (line 28) | constructor() {
method componentDidUpdate (line 39) | componentDidUpdate(previousProps) {
method componentWillUnmount (line 46) | componentWillUnmount() {
method _getStateFromStores (line 55) | _getStateFromStores() {
method _onClickEditSignatures (line 93) | _onClickEditSignatures() {
method _renderSignatures (line 98) | _renderSignatures() {
method _renderSignatureIcon (line 116) | _renderSignatureIcon() {
method render (line 126) | render() {
FILE: packages/client-app/internal_packages/composer-signature/spec/preferences-signatures-spec.jsx
constant SIGNATURES (line 8) | const SIGNATURES = {
constant DEFAULTS (line 21) | const DEFAULTS = {
FILE: packages/client-app/internal_packages/composer-signature/spec/signature-composer-dropdown-spec.jsx
constant SIGNATURES (line 9) | const SIGNATURES = {
FILE: packages/client-app/internal_packages/composer-signature/spec/signature-store-spec.jsx
constant SIGNATURES (line 4) | let SIGNATURES = {
constant DEFAULTS (line 17) | const DEFAULTS = {
FILE: packages/client-app/internal_packages/composer-templates/lib/preferences-templates.jsx
class PreferencesTemplates (line 9) | class PreferencesTemplates extends React.Component {
method constructor (line 12) | constructor() {
method componentDidMount (line 27) | componentDidMount() {
method componentWillUnmount (line 31) | componentWillUnmount() {
method _saveTemplateNow (line 47) | _saveTemplateNow(name, contents, callback) {
method _saveTemplateSoon (line 51) | _saveTemplateSoon(name, contents) {
method __saveTemplatesFromCache (line 56) | __saveTemplatesFromCache() {
method _getStateFromStores (line 70) | _getStateFromStores() {
method _renderTemplatePicker (line 113) | _renderTemplatePicker() {
method _renderEditableTemplate (line 125) | _renderEditableTemplate() {
method _renderHTMLTemplate (line 137) | _renderHTMLTemplate() {
method _renderModeToggle (line 147) | _renderModeToggle() {
method _onEnter (line 154) | _onEnter(action) {
method _renderEditName (line 163) | _renderEditName() {
method _renderName (line 173) | _renderName() {
method _renderCreateNew (line 255) | _renderCreateNew() {
method render (line 267) | render() {
FILE: packages/client-app/internal_packages/composer-templates/lib/template-picker.jsx
class TemplatePopover (line 6) | class TemplatePopover extends React.Component {
method constructor (line 13) | constructor() {
method componentDidMount (line 21) | componentDidMount() {
method componentWillUnmount (line 27) | componentWillUnmount() {
method _filteredTemplates (line 33) | _filteredTemplates() {
method render (line 68) | render() {
class TemplatePicker (line 102) | class TemplatePicker extends React.Component {
method render (line 117) | render() {
FILE: packages/client-app/internal_packages/composer-templates/lib/template-status-bar.jsx
class TemplateStatusBar (line 3) | class TemplateStatusBar extends React.Component {
method shouldComponentUpdate (line 10) | shouldComponentUpdate(nextProps) {
method _usingTemplate (line 14) | _usingTemplate({draft}) {
method render (line 18) | render() {
FILE: packages/client-app/internal_packages/composer-translate/lib/main.jsx
class TranslateButton (line 39) | class TranslateButton extends React.Component {
method shouldComponentUpdate (line 52) | shouldComponentUpdate(nextProps) {
method _onError (line 58) | _onError(error) {
method _renderPopover (line 115) | _renderPopover() {
method render (line 145) | render() {
function activate (line 183) | function activate() {
function serialize (line 189) | function serialize() {
function deactivate (line 193) | function deactivate() {
FILE: packages/client-app/internal_packages/composer/lib/account-contact-field.jsx
class AccountContactField (line 8) | class AccountContactField extends React.Component {
method _renderAccountSelector (line 25) | _renderAccountSelector() {
method _renderAccounts (line 67) | _renderAccounts(accounts) {
method render (line 96) | render() {
FILE: packages/client-app/internal_packages/composer/lib/action-bar-plugins.jsx
constant ROLE (line 6) | const ROLE = "Composer:ActionButton";
class ActionBarPlugins (line 8) | class ActionBarPlugins extends React.Component {
method constructor (line 17) | constructor(props) {
method componentDidMount (line 22) | componentDidMount() {
method componentWillUnmount (line 26) | componentWillUnmount() {
method _getPluginsLength (line 46) | _getPluginsLength() {
method _getStateFromStores (line 50) | _getStateFromStores() {
method render (line 56) | render() {
FILE: packages/client-app/internal_packages/composer/lib/collapsed-participants.jsx
constant NUM_TO_DISPLAY_MAX (line 6) | const NUM_TO_DISPLAY_MAX = 999;
class CollapsedParticipants (line 8) | class CollapsedParticipants extends React.Component {
method constructor (line 28) | constructor(props = {}) {
method componentDidMount (line 37) | componentDidMount() {
method componentWillReceiveProps (line 41) | componentWillReceiveProps(nextProps) {
method shouldComponentUpdate (line 52) | shouldComponentUpdate(nextProps, nextState) {
method componentDidUpdate (line 56) | componentDidUpdate() {
method _setNumHiddenParticipants (line 62) | _setNumHiddenParticipants() {
method _renderNumRemaining (line 94) | _renderNumRemaining() {
method render (line 145) | render() {
FILE: packages/client-app/internal_packages/composer/lib/compose-button.jsx
class ComposeButton (line 5) | class ComposeButton extends React.Component {
method render (line 12) | render() {
FILE: packages/client-app/internal_packages/composer/lib/composer-editor.jsx
constant NODE_END (line 27) | const NODE_END = false;
constant NODE_BEGINNING (line 28) | const NODE_BEGINNING = true;
class ComposerEditor (line 30) | class ComposerEditor extends Component {
method constructor (line 76) | constructor(props) {
method componentDidMount (line 83) | componentDidMount() {
method componentWillUnmount (line 87) | componentWillUnmount() {
method getCurrentSelection (line 95) | getCurrentSelection() {
method getPreviousSelection (line 99) | getPreviousSelection() {
method setSelection (line 103) | setSelection(selection) {
method focus (line 107) | focus() {
method focusAbsoluteEnd (line 123) | focusAbsoluteEnd() {
method _findLastNodeBeforeQuoteOrSignature (line 132) | _findLastNodeBeforeQuoteOrSignature(editor) {
method _selectNode (line 155) | _selectNode(node, {collapseTo} = {}) {
method _onDOMMutated (line 169) | _onDOMMutated(mutations) {
method _shouldScrollToBottom (line 214) | _shouldScrollToBottom(selection, editableNode) {
method render (line 263) | render() {
FILE: packages/client-app/internal_packages/composer/lib/composer-header-actions.jsx
class ComposerHeaderActions (line 6) | class ComposerHeaderActions extends React.Component {
method render (line 20) | render() {
FILE: packages/client-app/internal_packages/composer/lib/composer-header.jsx
class ComposerHeader (line 29) | class ComposerHeader extends React.Component {
method constructor (line 45) | constructor(props = {}) {
method componentWillReceiveProps (line 50) | componentWillReceiveProps(nextProps) {
method focus (line 58) | focus() {
method _ensureFilledFieldsEnabled (line 89) | _ensureFilledFieldsEnabled(draft) {
method _initialStateForDraft (line 102) | _initialStateForDraft(draft, props) {
method isFocused (line 182) | isFocused() {
method render (line 325) | render() {
FILE: packages/client-app/internal_packages/composer/lib/composer-view.jsx
class ComposerView (line 31) | class ComposerView extends React.Component {
method constructor (line 46) | constructor(props) {
method componentDidMount (line 54) | componentDidMount() {
method componentWillReceiveProps (line 61) | componentWillReceiveProps(nextProps) {
method componentWillUnmount (line 75) | componentWillUnmount() {
method focus (line 79) | focus() {
method _recordComposerOpenTime (line 87) | _recordComposerOpenTime() {
method _keymapHandlers (line 112) | _keymapHandlers() {
method _setupForProps (line 137) | _setupForProps({draft, session}) {
method _teardownForProps (line 168) | _teardownForProps() {
method _renderContentScrollRegion (line 175) | _renderContentScrollRegion() {
method _renderContent (line 192) | _renderContent() {
method _renderBodyRegions (line 215) | _renderBodyRegions() {
method _renderEditor (line 231) | _renderEditor() {
method _renderQuotedTextControl (line 269) | _renderQuotedTextControl() {
method _renderFooterRegions (line 313) | _renderFooterRegions() {
method _renderAttachments (line 330) | _renderAttachments() {
method _renderFileAttachments (line 339) | _renderFileAttachments() {
method _imageFiles (line 349) | _imageFiles(files) {
method _nonImageFiles (line 353) | _nonImageFiles(files) {
method _renderUploadAttachments (line 357) | _renderUploadAttachments() {
method _renderActionsWorkspaceRegion (line 387) | _renderActionsWorkspaceRegion() {
method _renderActionsRegion (line 401) | _renderActionsRegion() {
method _inFooterRegion (line 469) | _inFooterRegion(el) {
method render (line 615) | render() {
FILE: packages/client-app/internal_packages/composer/lib/inline-image-upload-container.jsx
class InlineImageUploadContainer (line 8) | class InlineImageUploadContainer extends Component {
method render (line 129) | render() {
FILE: packages/client-app/internal_packages/composer/lib/main.jsx
class ComposerWithWindowProps (line 23) | class ComposerWithWindowProps extends React.Component {
method constructor (line 27) | constructor(props) {
method componentWillUnmount (line 41) | componentWillUnmount() {
method componentDidUpdate (line 45) | componentDidUpdate() {
method _recordComposerOpenTime (line 73) | _recordComposerOpenTime() {
method render (line 91) | render() {
method _showInitialErrorDialog (line 102) | _showInitialErrorDialog(msg, detail) {
function activate (line 112) | function activate() {
function deactivate (line 136) | function deactivate() {
function serialize (line 149) | function serialize() {
FILE: packages/client-app/internal_packages/composer/lib/send-action-button.jsx
class SendActionButton (line 6) | class SendActionButton extends React.Component {
method primarySend (line 18) | primarySend() {
method _renderSingleButton (line 52) | _renderSingleButton() {
method _renderButtonDropdown (line 66) | _renderButtonDropdown() {
method render (line 92) | render() {
method getStateFromStores (line 103) | getStateFromStores(props) {
method primarySend (line 119) | primarySend() {
FILE: packages/client-app/internal_packages/composer/lib/subject-text-field.jsx
class SubjectTextField (line 5) | class SubjectTextField extends Component {
method focus (line 19) | focus() {
method render (line 23) | render() {
FILE: packages/client-app/internal_packages/composer/spec/send-action-button-spec.jsx
method performSendAction (line 30) | performSendAction() {}
FILE: packages/client-app/internal_packages/draft-list/lib/draft-list-send-status.jsx
class DraftListSendStatus (line 6) | class DraftListSendStatus extends Component {
method render (line 15) | render() {
FILE: packages/client-app/internal_packages/draft-list/lib/draft-list-toolbar.jsx
function getObservable (line 7) | function getObservable() {
function getStateFromObservable (line 11) | function getStateFromObservable(items) {
class DraftListToolbar (line 18) | class DraftListToolbar extends Component {
method render (line 29) | render() {
FILE: packages/client-app/internal_packages/github-contact-card/lib/github-contact-card-section.jsx
class GithubContactCardSection (line 48) | class GithubContactCardSection extends React.Component {
method constructor (line 55) | constructor(props) {
method componentDidMount (line 60) | componentDidMount() {
method componentWillUnmount (line 67) | componentWillUnmount() {
method _renderInner (line 84) | _renderInner() {
method render (line 99) | render() {
FILE: packages/client-app/internal_packages/github-contact-card/lib/main.jsx
function activate (line 22) | function activate() {
function serialize (line 31) | function serialize() {
function deactivate (line 35) | function deactivate() {
FILE: packages/client-app/internal_packages/link-tracking/lib/link-tracking-button.jsx
class LinkTrackingButton (line 6) | class LinkTrackingButton extends React.Component {
method shouldComponentUpdate (line 14) | shouldComponentUpdate(nextProps) {
method _title (line 18) | _title(enabled) {
method _errorMessage (line 23) | _errorMessage(error) {
method render (line 30) | render() {
FILE: packages/client-app/internal_packages/link-tracking/lib/link-tracking-message-extension.jsx
class LinkTrackingMessageExtension (line 5) | class LinkTrackingMessageExtension extends MessageViewExtension {
method renderedMessageBodyIntoDocument (line 7) | static renderedMessageBodyIntoDocument({document, message, iframe}) {
FILE: packages/client-app/internal_packages/link-tracking/lib/link-tracking-message-popover.jsx
class LinkTrackingMessagePopover (line 7) | class LinkTrackingMessagePopover extends React.Component {
method renderClickActions (line 15) | renderClickActions() {
method render (line 36) | render() {
FILE: packages/client-app/internal_packages/main-calendar/lib/calendar-wrapper.jsx
class CalendarWrapper (line 15) | class CalendarWrapper extends React.Component {
method constructor (line 19) | constructor(props) {
method _openEventPopover (line 25) | _openEventPopover(eventModel) {
method render (line 89) | render() {
FILE: packages/client-app/internal_packages/main-calendar/lib/event-description-frame.jsx
class EmailFrame (line 6) | class EmailFrame extends React.Component {
method componentDidMount (line 13) | componentDidMount() {
method shouldComponentUpdate (line 18) | shouldComponentUpdate(nextProps, nextState) {
method componentDidUpdate (line 22) | componentDidUpdate() {
method componentWillUnmount (line 26) | componentWillUnmount() {
method render (line 117) | render() {
FILE: packages/client-app/internal_packages/main-calendar/lib/main.jsx
function activate (line 30) | function activate() {
function deactivate (line 66) | function deactivate() {
FILE: packages/client-app/internal_packages/main-calendar/lib/quick-event-button.jsx
class QuickEventButton (line 6) | class QuickEventButton extends React.Component {
method render (line 18) | render() {
FILE: packages/client-app/internal_packages/main-calendar/lib/quick-event-popover.jsx
class QuickEventPopover (line 11) | class QuickEventPopover extends React.Component {
method constructor (line 13) | constructor(props) {
method render (line 71) | render() {
FILE: packages/client-app/internal_packages/message-autoload-images/lib/autoload-images-header.jsx
class AutoloadImagesHeader (line 7) | class AutoloadImagesHeader extends React.Component {
method constructor (line 14) | constructor(props) {
method componentDidMount (line 21) | componentDidMount() {
method componentWillUnmount (line 30) | componentWillUnmount() {
method render (line 34) | render() {
FILE: packages/client-app/internal_packages/message-list/lib/email-frame.jsx
class EmailFrame (line 11) | class EmailFrame extends React.Component {
method componentDidMount (line 21) | componentDidMount() {
method shouldComponentUpdate (line 27) | shouldComponentUpdate(nextProps, nextState) {
method componentDidUpdate (line 32) | componentDidUpdate() {
method componentWillUnmount (line 36) | componentWillUnmount() {
method render (line 153) | render() {
FILE: packages/client-app/internal_packages/message-list/lib/find-in-thread.jsx
class FindInThread (line 7) | class FindInThread extends React.Component {
method constructor (line 10) | constructor(props) {
method componentDidMount (line 15) | componentDidMount() {
method componentWillUnmount (line 19) | componentWillUnmount() {
method _globalKeymapHandlers (line 23) | _globalKeymapHandlers() {
method _selectionText (line 59) | _selectionText() {
method _navEnabled (line 66) | _navEnabled() {
method render (line 89) | render() {
FILE: packages/client-app/internal_packages/message-list/lib/message-list-hidden-messages-toggle.jsx
class MessageListHiddenMessagesToggle (line 8) | class MessageListHiddenMessagesToggle extends React.Component {
method constructor (line 12) | constructor() {
method componentDidMount (line 19) | componentDidMount() {
method componentWillUnmount (line 27) | componentWillUnmount() {
method render (line 31) | render() {
FILE: packages/client-app/internal_packages/message-list/lib/message-timestamp.jsx
class MessageTimestamp (line 4) | class MessageTimestamp extends React.Component {
method shouldComponentUpdate (line 14) | shouldComponentUpdate(nextProps) {
method render (line 21) | render() {
FILE: packages/client-app/internal_packages/message-list/lib/sidebar-participant-picker.jsx
constant SPLIT_KEY (line 4) | const SPLIT_KEY = "---splitvalue---"
class SidebarParticipantPicker (line 6) | class SidebarParticipantPicker extends React.Component {
method constructor (line 14) | constructor(props) {
method componentDidMount (line 19) | componentDidMount() {
method componentWillUnmount (line 25) | componentWillUnmount() {
method _getStateFromStores (line 29) | _getStateFromStores() {
method _getKeyForContact (line 36) | _getKeyForContact(contact) {
method _renderSortedContacts (line 50) | _renderSortedContacts() {
method render (line 62) | render() {
FILE: packages/client-app/internal_packages/message-view-on-github/lib/main.jsx
function activate (line 49) | function activate() {
function deactivate (line 55) | function deactivate() {
FILE: packages/client-app/internal_packages/message-view-on-github/lib/view-on-github-button.jsx
class ViewOnGithubButton (line 49) | class ViewOnGithubButton extends React.Component {
method constructor (line 63) | constructor(props) {
method componentDidMount (line 74) | componentDidMount() {
method componentWillUnmount (line 85) | componentWillUnmount() {
method _keymapHandlers (line 89) | _keymapHandlers() {
method _getStateFromStores (line 123) | _getStateFromStores() {
method render (line 149) | render() {
FILE: packages/client-app/internal_packages/notifications/lib/items/account-error-notif.jsx
class AccountErrorNotification (line 5) | class AccountErrorNotification extends React.Component {
method constructor (line 8) | constructor() {
method componentDidMount (line 18) | componentDidMount() {
method componentWillUnmount (line 24) | componentWillUnmount() {
method _onCheckAgain (line 53) | _onCheckAgain(event, account) {
method render (line 70) | render() {
FILE: packages/client-app/internal_packages/notifications/lib/items/default-client-notif.jsx
constant SETTINGS_KEY (line 4) | const SETTINGS_KEY = 'nylas.mailto.prompted-about-default'
class DefaultClientNotification (line 6) | class DefaultClientNotification extends React.Component {
method constructor (line 9) | constructor() {
method componentDidMount (line 17) | componentDidMount() {
method componentWillUnmount (line 31) | componentWillUnmount() {
method getStateFromStores (line 36) | getStateFromStores() {
method render (line 55) | render() {
FILE: packages/client-app/internal_packages/notifications/lib/items/dev-mode-notif.jsx
class DevModeNotification (line 4) | class DevModeNotification extends React.Component {
method constructor (line 7) | constructor() {
method render (line 16) | render() {
FILE: packages/client-app/internal_packages/notifications/lib/items/disabled-mail-rules-notif.jsx
class DisabledMailRulesNotification (line 4) | class DisabledMailRulesNotification extends React.Component {
method constructor (line 7) | constructor() {
method componentDidMount (line 12) | componentDidMount() {
method componentWillUnmount (line 16) | componentWillUnmount() {
method getStateFromStores (line 20) | getStateFromStores() {
method render (line 31) | render() {
FILE: packages/client-app/internal_packages/notifications/lib/items/offline-notification.jsx
function OfflineNotification (line 5) | function OfflineNotification({isOnline, retryingInSeconds}) {
method getStateFromStores (line 36) | getStateFromStores() {
FILE: packages/client-app/internal_packages/notifications/lib/notif-wrapper.jsx
constant ROLE (line 5) | const ROLE = "RootSidebar:Notifications";
class NotifWrapper (line 7) | class NotifWrapper extends React.Component {
method componentDidMount (line 10) | componentDidMount() {
method componentWillUnmount (line 16) | componentWillUnmount() {
method render (line 40) | render() {
FILE: packages/client-app/internal_packages/notifications/lib/sidebar/initial-sync-activity.jsx
constant MONTH_SHORT_FORMATS (line 5) | const MONTH_SHORT_FORMATS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', '...
class InitialSyncActivity (line 8) | class InitialSyncActivity extends React.Component {
method constructor (line 11) | constructor(props) {
method componentDidMount (line 19) | componentDidMount() {
method shouldComponentUpdate (line 24) | shouldComponentUpdate(nextProps, nextState) {
method componentWillUnmount (line 29) | componentWillUnmount() {
method renderFolderProgress (line 39) | renderFolderProgress(name, progress, oldestProcessedDate) {
method render (line 70) | render() {
FILE: packages/client-app/internal_packages/notifications/lib/sidebar/sync-activity.jsx
class SyncActivity (line 7) | class SyncActivity extends React.Component {
method constructor (line 14) | constructor() {
method componentDidMount (line 23) | componentDidMount() {
method shouldComponentUpdate (line 28) | shouldComponentUpdate(nextProps, nextState) {
method componentWillUnmount (line 33) | componentWillUnmount() {
method _renderInitialSync (line 55) | _renderInitialSync() {
method _renderSyncbackTasks (line 60) | _renderSyncbackTasks() {
method _renderExpandedDetails (line 64) | _renderExpandedDetails() {
method render (line 74) | render() {
FILE: packages/client-app/internal_packages/notifications/lib/sidebar/syncback-activity.jsx
class SyncbackActivity (line 4) | class SyncbackActivity extends React.Component {
method shouldComponentUpdate (line 9) | shouldComponentUpdate(nextProps, nextState) {
method render (line 14) | render() {
FILE: packages/client-app/internal_packages/notifications/spec/default-client-notif-spec.jsx
method constructor (line 11) | constructor() {
constant SETTINGS_KEY (line 20) | const SETTINGS_KEY = 'nylas.mailto.prompted-about-default';
FILE: packages/client-app/internal_packages/notifications/spec/priority-spec.jsx
method render (line 11) | render() { return <Notification priority={`${priority}`} title={`Priorit...
FILE: packages/client-app/internal_packages/nylas-private-salesforce/lib/composer/contact-search-results.jsx
function ContactSearchResult (line 8) | function ContactSearchResult({token}) {
class ContactSearchResults (line 23) | class ContactSearchResults extends React.Component {
method findAdditionalContacts (line 36) | static findAdditionalContacts(search, nylasContacts) {
FILE: packages/client-app/internal_packages/nylas-private-salesforce/lib/composer/participant-decorator.jsx
class ParticipantDecorator (line 7) | class ParticipantDecorator extends React.Component {
method constructor (line 17) | constructor(props) {
method componentWillMount (line 22) | componentWillMount() {
method componentWillReceiveProps (line 26) | componentWillReceiveProps(nextProps) {
method componentWillUnmount (line 30) | componentWillUnmount() {
method _setupObserver (line 34) | _setupObserver(props) {
method render (line 47) | render() {
FILE: packages/client-app/internal_packages/nylas-private-salesforce/lib/composer/salesforce-composer-picker.jsx
class SalesforceComposerPicker (line 6) | class SalesforceComposerPicker extends React.Component {
method _defaultObjectType (line 20) | _defaultObjectType() {
method _pickerId (line 24) | _pickerId() {
method _renderPicker (line 28) | _renderPicker() {
method render (line 55) | render() {
FILE: packages/client-app/internal_packages/nylas-private-salesforce/lib/contact/salesforce-contact-info.jsx
class SalesforceContactInfo (line 12) | class SalesforceContactInfo extends React.Component {
method constructor (line 23) | constructor(props) {
method componentDidMount (line 28) | componentDidMount() {
method componentWillReceiveProps (line 39) | componentWillReceiveProps(nextProps = {}) {
method componentWillUnmount (line 43) | componentWillUnmount() {
method _fetchLead (line 53) | _fetchLead(props) {
method _requestNew (line 61) | _requestNew(objectType, objectInitialData = {}) {
method _requestEdit (line 78) | _requestEdit(object) {
method _renderObjectCreators (line 91) | _renderObjectCreators() {
method _hasRelatedObjects (line 106) | _hasRelatedObjects() {
method _renderRelatedObjects (line 110) | _renderRelatedObjects() {
method _renderRelatedSFObjects (line 120) | _renderRelatedSFObjects(objectType, sfObjects = []) {
method _renderCreateObj (line 146) | _renderCreateObj(objType) {
method _renderConvertLead (line 159) | _renderConvertLead(lead) {
method render (line 178) | render() {
FILE: packages/client-app/internal_packages/nylas-private-salesforce/lib/form/remove-controls.jsx
class RemoveControls (line 7) | class RemoveControls extends React.Component {
method constructor (line 13) | constructor(props) {
method _renderOpenInSalesforce (line 18) | _renderOpenInSalesforce() {
method render (line 38) | render() {
FILE: packages/client-app/internal_packages/nylas-private-salesforce/lib/form/salesforce-object-form.jsx
class SalesforceObjectForm (line 17) | class SalesforceObjectForm extends React.Component {
method constructor (line 49) | constructor(props) {
method componentWillMount (line 59) | componentWillMount() {
method componentWillUnmount (line 73) | componentWillUnmount() {
method _initializeNewFormData (line 78) | _initializeNewFormData() {
method _addContextData (line 90) | _addContextData(emptySchema) {
method _localErrorsForAnalytics (line 166) | _localErrorsForAnalytics(validationErrors = {}) {
method _remoteErrorsForAnalytics (line 171) | _remoteErrorsForAnalytics(apiError = {}) {
method _objectName (line 216) | _objectName() {
method render (line 220) | render() {
FILE: packages/client-app/internal_packages/nylas-private-salesforce/lib/form/salesforce-object-picker.jsx
constant MAX_RESULTS (line 15) | const MAX_RESULTS = 100;
class SalesforceObjectPicker (line 23) | class SalesforceObjectPicker extends React.Component {
method componentWillMount (line 90) | componentWillMount() {
method componentWillUnmount (line 97) | componentWillUnmount() {
method focus (line 101) | focus() {
method _tokens (line 105) | _tokens() {
method render (line 334) | render() {
FILE: packages/client-app/internal_packages/nylas-private-salesforce/lib/main.jsx
function SalesforceObjectFormWithWindowProps (line 54) | function SalesforceObjectFormWithWindowProps() {
function setComponentActivation (line 158) | function setComponentActivation() {
function storesForWindow (line 180) | function storesForWindow() {
function activate (line 188) | function activate() {
function deactivate (line 200) | function deactivate() {
FILE: packages/client-app/internal_packages/nylas-private-salesforce/lib/salesforce-api.jsx
class SalesforceAPI (line 8) | class SalesforceAPI {
method constructor (line 9) | constructor() {
method makeRequest (line 27) | makeRequest(options = {}) {
method _retry (line 69) | _retry(options) {
method _isBadTokenError (line 80) | _isBadTokenError(salesforceAPIError) {
method _isLimitExceeded (line 91) | _isLimitExceeded(salesforceAPIError) {
method _handleAPIDisabled (line 95) | _handleAPIDisabled() {
method _unableToAuth (line 113) | _unableToAuth() {
method _refreshToken (line 126) | _refreshToken() {
FILE: packages/client-app/internal_packages/nylas-private-salesforce/lib/salesforce-intro-notification.jsx
class SalesforceIntroNotification (line 9) | class SalesforceIntroNotification extends React.Component {
method constructor (line 14) | constructor(props) {
method componentDidMount (line 21) | componentDidMount() {
method componentWillUnmount (line 25) | componentWillUnmount() {
method render (line 33) | render() {
FILE: packages/client-app/internal_packages/nylas-private-salesforce/lib/salesforce-oauth.jsx
constant ACCESS_TOKEN_KEY_NAME (line 5) | const ACCESS_TOKEN_KEY_NAME = 'Nylas Salesforce Token';
constant REFRESH_TOKEN_KEY_NAME (line 6) | const REFRESH_TOKEN_KEY_NAME = 'Nylas Salesforce Refresh Token';
class SalesforceOAuth (line 8) | class SalesforceOAuth {
method constructor (line 9) | constructor() {
method activate (line 16) | activate() {
method deactivate (line 20) | deactivate() {
method connect (line 24) | connect() {
method fetchNewToken (line 34) | fetchNewToken() {
method clearTokens (line 55) | clearTokens() {
method accessToken (line 60) | accessToken() {
method refreshToken (line 64) | refreshToken() {
method _resetDelay (line 68) | _resetDelay() {
method _pollForToken (line 126) | _pollForToken(connectionAttempt) {
method _tryAgain (line 147) | _tryAgain(fn) {
FILE: packages/client-app/internal_packages/nylas-private-salesforce/lib/search/salesforce-search-bar-results.jsx
function SearchBarResult (line 8) | function SearchBarResult(sObject) {
function _searchObjects (line 17) | function _searchObjects(name) {
function _forAllPages (line 23) | function _forAllPages(fn, offset = 0) {
class SalesforceSearchBarResults (line 38) | class SalesforceSearchBarResults extends React.Component {
method searchLabel (line 41) | static searchLabel() { return "Salesforce Objects" }
method fetchSearchSuggestions (line 43) | static fetchSearchSuggestions(searchQuery) {
method observeThreadIdsForQuery (line 53) | static observeThreadIdsForQuery(searchQuery) {
FILE: packages/client-app/internal_packages/nylas-private-salesforce/lib/shared-components/open-in-salesforce-btn.jsx
function OpenInSalesforceBtn (line 6) | function OpenInSalesforceBtn({objectId, size = "small"}) {
FILE: packages/client-app/internal_packages/nylas-private-salesforce/lib/shared-components/salesforce-icon.jsx
function SalesforceIcon (line 4) | function SalesforceIcon(props = {}) {
FILE: packages/client-app/internal_packages/nylas-private-salesforce/lib/shared-components/salesforce-login-prompt.jsx
class SalesforceLoginPrompt (line 9) | class SalesforceLoginPrompt extends React.Component {
method _connectSalesforce (line 12) | _connectSalesforce() {
method render (line 16) | render() {
FILE: packages/client-app/internal_packages/nylas-private-salesforce/lib/thread/related-objects-for-thread.jsx
class RelatedObjectsForThread (line 18) | class RelatedObjectsForThread extends React.Component {
method constructor (line 30) | constructor(props) {
method componentWillMount (line 35) | componentWillMount() {
method componentWillReceiveProps (line 40) | componentWillReceiveProps(nextProps) {
method componentWillUnmount (line 44) | componentWillUnmount() {
method _initialState (line 51) | _initialState() {
method _setupDataSource (line 68) | _setupDataSource(props) {
method _extraInfoForObj (line 123) | _extraInfoForObj(obj) {
method _requestEdit (line 150) | _requestEdit(object) {
method _createNewContact (line 171) | _createNewContact(participant, mainObj) {
method _humanize (line 209) | _humanize(type) {
method _renderSubObjects (line 252) | _renderSubObjects(obj) {
method _subObjects (line 378) | _subObjects(obj) {
method _renderMainObjects (line 382) | _renderMainObjects() {
method render (line 394) | render() {
FILE: packages/client-app/internal_packages/nylas-private-salesforce/lib/thread/salesforce-manually-relate-thread-button.jsx
class SalesforceManuallyRelateThreadButton (line 15) | class SalesforceManuallyRelateThreadButton extends React.Component {
method constructor (line 28) | constructor(props) {
method componentWillMount (line 37) | componentWillMount() {
method componentWillUnmount (line 54) | componentWillUnmount() {
method _emails (line 96) | _emails(props) {
method _keymapHandlers (line 151) | _keymapHandlers() {
method _menuItems (line 157) | _menuItems() {
method render (line 168) | render() {
FILE: packages/client-app/internal_packages/nylas-private-salesforce/lib/thread/salesforce-manually-relate-thread-popover.jsx
constant PICKER_ID (line 11) | const PICKER_ID = "manually-relate-thread-popover"
class SalesforceManuallyRelateThreadPopover (line 13) | class SalesforceManuallyRelateThreadPopover extends React.Component {
method constructor (line 28) | constructor(props) {
method _threadIds (line 35) | _threadIds() {
method _placeholder (line 39) | _placeholder() {
method _renderAssociationPicker (line 56) | _renderAssociationPicker() {
method _renderSalesforce (line 87) | _renderSalesforce() {
method render (line 106) | render() {
FILE: packages/client-app/internal_packages/nylas-private-salesforce/lib/thread/salesforce-sync-label.jsx
class SalesforceSyncLabel (line 9) | class SalesforceSyncLabel extends React.Component {
method constructor (line 18) | constructor(props) {
method componentDidMount (line 23) | componentDidMount() {
method componentWillReceiveProps (line 28) | componentWillReceiveProps(nextProps) {
method componentWillUnmount (line 33) | componentWillUnmount() {
method _initialState (line 40) | _initialState(props) {
method _setupDataSource (line 46) | _setupDataSource() {
method _requestEdit (line 60) | _requestEdit(object) {
method render (line 68) | render() {
FILE: packages/client-app/internal_packages/nylas-private-salesforce/lib/thread/salesforce-sync-message-status.jsx
class SalesforceSyncMessageStatus (line 7) | class SalesforceSyncMessageStatus extends React.Component {
method _getRelatedIds (line 19) | _getRelatedIds() {
method _hasRelatedSObject (line 35) | _hasRelatedSObject() {
method _editActivityBtn (line 40) | _editActivityBtn(type, id) {
method _editEmailMessageFn (line 50) | _editEmailMessageFn(id) {
method _isPendingSync (line 57) | _isPendingSync() {
method _renderPendingSync (line 61) | _renderPendingSync() {
method render (line 65) | render() {
FILE: packages/client-app/internal_packages/nylas-private-salesforce/lib/thread/sync-thread-toggle.jsx
function SyncThreadToggle (line 8) | function SyncThreadToggle(props) {
FILE: packages/client-app/internal_packages/nylas-private-salesforce/spec/form-builder-spec.jsx
function StubDiv (line 14) | function StubDiv() {
FILE: packages/client-app/internal_packages/onboarding/lib/decorators/create-page-for-form.jsx
method constructor (line 20) | constructor(props) {
method componentDidMount (line 30) | componentDidMount() {
method componentDidUpdate (line 34) | componentDidUpdate() {
method _applyFocus (line 38) | _applyFocus() {
method _isValid (line 58) | _isValid() {
method _renderButton (line 155) | _renderButton() {
method _renderCredentialsNote (line 187) | _renderCredentialsNote() {
method render (line 215) | render() {
FILE: packages/client-app/internal_packages/onboarding/lib/onboarding-root.jsx
class OnboardingRoot (line 28) | class OnboardingRoot extends React.Component {
method constructor (line 32) | constructor(props) {
method componentDidMount (line 37) | componentDidMount() {
method componentWillUnmount (line 63) | componentWillUnmount() {
method render (line 81) | render() {
FILE: packages/client-app/internal_packages/onboarding/lib/page-account-choose.jsx
class AccountChoosePage (line 6) | class AccountChoosePage extends React.Component {
method _renderAccountTypes (line 13) | _renderAccountTypes() {
method render (line 32) | render() {
FILE: packages/client-app/internal_packages/onboarding/lib/page-account-onboarding-success.jsx
class AccountOnboardingSuccess (line 6) | class AccountOnboardingSuccess extends Component { // eslint-disable-line
method render (line 13) | render() {
FILE: packages/client-app/internal_packages/onboarding/lib/page-account-settings-exchange.jsx
class AccountExchangeSettingsForm (line 7) | class AccountExchangeSettingsForm extends React.Component {
method constructor (line 60) | constructor(props) {
method submit (line 65) | submit() {
method render (line 69) | render() {
FILE: packages/client-app/internal_packages/onboarding/lib/page-account-settings-gmail.jsx
class AccountSettingsPageGmail (line 16) | class AccountSettingsPageGmail extends React.Component {
method constructor (line 23) | constructor() {
method onSuccess (line 29) | onSuccess(account) {
method render (line 33) | render() {
FILE: packages/client-app/internal_packages/onboarding/lib/page-account-settings-imap.jsx
class AccountIMAPSettingsForm (line 6) | class AccountIMAPSettingsForm extends React.Component {
method submit (line 55) | submit() {
method renderPortDropdown (line 59) | renderPortDropdown(protocol) {
method renderSecurityDropdown (line 105) | renderSecurityDropdown(protocol) {
method renderFieldsForType (line 140) | renderFieldsForType(type) {
method render (line 154) | render() {
FILE: packages/client-app/internal_packages/onboarding/lib/page-account-settings.jsx
class AccountBasicSettingsForm (line 9) | class AccountBasicSettingsForm extends React.Component {
method submit (line 58) | submit() {
method render (line 75) | render() {
FILE: packages/client-app/internal_packages/onboarding/lib/page-welcome.jsx
class WelcomePage (line 5) | class WelcomePage extends React.Component {
method render (line 12) | render() {
FILE: packages/client-app/internal_packages/open-tracking/lib/open-tracking-button.jsx
class OpenTrackingButton (line 6) | class OpenTrackingButton extends React.Component {
method shouldComponentUpdate (line 14) | shouldComponentUpdate(nextProps) {
method _title (line 18) | _title(enabled) {
method _errorMessage (line 23) | _errorMessage(error) {
method render (line 30) | render() {
FILE: packages/client-app/internal_packages/open-tracking/lib/open-tracking-icon.jsx
class OpenTrackingIcon (line 7) | class OpenTrackingIcon extends React.Component {
method constructor (line 14) | constructor(props) {
method componentWillReceiveProps (line 19) | componentWillReceiveProps(newProps) {
method _getStateFromThread (line 34) | _getStateFromThread(thread) {
method _renderImage (line 65) | _renderImage() {
method render (line 75) | render() {
FILE: packages/client-app/internal_packages/open-tracking/lib/open-tracking-message-popover.jsx
class OpenTrackingMessagePopover (line 7) | class OpenTrackingMessagePopover extends React.Component {
method renderOpenActions (line 15) | renderOpenActions() {
method render (line 36) | render() {
FILE: packages/client-app/internal_packages/open-tracking/lib/open-tracking-message-status.jsx
class OpenTrackingMessageStatus (line 7) | class OpenTrackingMessageStatus extends React.Component {
method constructor (line 18) | constructor(props) {
method componentWillReceiveProps (line 23) | componentWillReceiveProps(nextProps) {
method _getStateFromMessage (line 38) | _getStateFromMessage(message) {
method renderImage (line 54) | renderImage() {
method render (line 65) | render() {
FILE: packages/client-app/internal_packages/open-tracking/spec/open-tracking-icon-spec.jsx
function makeIcon (line 11) | function makeIcon(thread, props = {}) {
function find (line 15) | function find(component, className) {
function addOpenMetadata (line 19) | function addOpenMetadata(obj, openCount) {
FILE: packages/client-app/internal_packages/open-tracking/spec/open-tracking-message-status-spec.jsx
function makeIcon (line 10) | function makeIcon(message, props = {}) {
function addOpenMetadata (line 14) | function addOpenMetadata(obj, openCount) {
FILE: packages/client-app/internal_packages/participant-profile/lib/sidebar-participant-profile.jsx
class SidebarParticipantProfile (line 7) | class SidebarParticipantProfile extends React.Component {
method constructor (line 19) | constructor(props) {
method componentDidMount (line 38) | componentDidMount() {
method componentWillUnmount (line 44) | componentWillUnmount() {
method _renderProfilePhoto (line 48) | _renderProfilePhoto() {
method _renderDefaultProfileImage (line 61) | _renderDefaultProfileImage() {
method _renderCorePersonalInfo (line 79) | _renderCorePersonalInfo() {
method _renderSocialProfiles (line 94) | _renderSocialProfiles() {
method _renderAdditionalInfo (line 114) | _renderAdditionalInfo() {
method _renderCurrentJob (line 124) | _renderCurrentJob() {
method _renderBio (line 135) | _renderBio() {
method _renderLocation (line 166) | _renderLocation() {
method _select (line 180) | _select(event) {
method render (line 193) | render() {
FILE: packages/client-app/internal_packages/participant-profile/lib/sidebar-related-threads.jsx
class RelatedThreads (line 4) | class RelatedThreads extends React.Component {
method constructor (line 16) | constructor(props) {
method _onClick (line 22) | _onClick(thread) {
method _renderToggle (line 30) | _renderToggle() {
method _hasToggle (line 38) | _hasToggle() {
method render (line 42) | render() {
FILE: packages/client-app/internal_packages/personal-level-indicators/lib/personal-level-icon.jsx
class PersonalLevelIcon (line 8) | class PersonalLevelIcon extends React.Component {
method renderIndicator (line 17) | renderIndicator(level) {
method render (line 31) | render() {
FILE: packages/client-app/internal_packages/phishing-detection/lib/main.jsx
class PhishingIndicator (line 15) | class PhishingIndicator extends React.Component {
method constructor (line 20) | constructor() {
method componentDidMount (line 26) | componentDidMount() {
method componentWillUnmount (line 30) | componentWillUnmount() {
method render (line 46) | render() {
function activate (line 81) | function activate() {
function serialize (line 87) | function serialize() {
function deactivate (line 91) | function deactivate() {
FILE: packages/client-app/internal_packages/plugins/lib/main.jsx
function activate (line 4) | function activate() {
function deactivate (line 14) | function deactivate() {
FILE: packages/client-app/internal_packages/plugins/lib/package-set.jsx
class PackageSet (line 6) | class PackageSet extends React.Component {
method render (line 15) | render() {
FILE: packages/client-app/internal_packages/plugins/lib/package.jsx
class Package (line 7) | class Package extends React.Component {
method render (line 40) | render() {
FILE: packages/client-app/internal_packages/plugins/lib/plugins-tabs-view.jsx
class PluginsTabs (line 9) | class PluginsTabs extends React.Component {
method constructor (line 24) | constructor() {
method componentDidMount (line 29) | componentDidMount() {
method componentWillUnmount (line 34) | componentWillUnmount() {
method _getStateFromStores (line 38) | _getStateFromStores() {
method _renderItems (line 48) | _renderItems() {
method render (line 58) | render() {
FILE: packages/client-app/internal_packages/plugins/lib/preferences-plugins.jsx
class PluginsView (line 7) | class PluginsView extends React.Component {
method constructor (line 16) | constructor() {
method componentDidMount (line 21) | componentDidMount() {
method componentWillUnmount (line 26) | componentWillUnmount() {
method _getStateFromStores (line 30) | _getStateFromStores() {
method render (line 38) | render() {
FILE: packages/client-app/internal_packages/plugins/lib/tab-explore.jsx
class TabExplore (line 8) | class TabExplore extends React.Component {
method constructor (line 12) | constructor() {
method componentDidMount (line 17) | componentDidMount() {
method componentWillUnmount (line 25) | componentWillUnmount() {
method _getStateFromStores (line 29) | _getStateFromStores() {
method render (line 45) | render() {
FILE: packages/client-app/internal_packages/plugins/lib/tab-installed.jsx
class TabInstalled (line 10) | class TabInstalled extends React.Component {
method constructor (line 14) | constructor() {
method componentDidMount (line 19) | componentDidMount() {
method componentWillUnmount (line 26) | componentWillUnmount() {
method _getStateFromStores (line 30) | _getStateFromStores() {
method _onInstallPackage (line 41) | _onInstallPackage() {
method _onCreatePackage (line 45) | _onCreatePackage() {
method _onEnableDevMode (line 53) | _onEnableDevMode() {
method render (line 57) | render() {
FILE: packages/client-app/internal_packages/preferences/lib/main.jsx
function activate (line 12) | function activate() {
function deactivate (line 54) | function deactivate() {
function serialize (line 57) | function serialize() {
FILE: packages/client-app/internal_packages/preferences/lib/preferences-root.jsx
class PreferencesRoot (line 15) | class PreferencesRoot extends React.Component {
method componentDidMount (line 26) | componentDidMount() {
method componentDidUpdate (line 31) | componentDidUpdate(oldProps) {
method _localHandlers (line 39) | _localHandlers() {
method _focusContent (line 70) | _focusContent() {
method render (line 77) | render() {
method getStateFromStores (line 104) | getStateFromStores() {
FILE: packages/client-app/internal_packages/preferences/lib/preferences-tabs-bar.jsx
class PreferencesTabItem (line 10) | class PreferencesTabItem extends React.Component {
method render (line 27) | render() {
class PreferencesTabsBar (line 58) | class PreferencesTabsBar extends React.Component {
method renderTabs (line 66) | renderTabs() {
method render (line 76) | render() {
FILE: packages/client-app/internal_packages/preferences/lib/tabs/config-schema-item.jsx
class ConfigSchemaItem (line 12) | class ConfigSchemaItem extends React.Component {
method _appliesToPlatform (line 23) | _appliesToPlatform() {
method render (line 42) | render() {
FILE: packages/client-app/internal_packages/preferences/lib/tabs/keymaps/command-item.jsx
class CommandKeybinding (line 9) | class CommandKeybinding extends React.Component {
method constructor (line 16) | constructor(props) {
method componentDidUpdate (line 23) | componentDidUpdate() {
method _formatKeystrokes (line 33) | _formatKeystrokes(original) {
method render (line 135) | render() {
FILE: packages/client-app/internal_packages/preferences/lib/tabs/keymaps/mousetrap-keybinding-helpers.js
function characterFromEvent (line 137) | function characterFromEvent(e) {
function eventModifiers (line 181) | function eventModifiers(e) {
function keyAndModifiersForEvent (line 203) | function keyAndModifiersForEvent(e) {
FILE: packages/client-app/internal_packages/preferences/lib/tabs/preferences-account-details.jsx
class PreferencesAccountDetails (line 6) | class PreferencesAccountDetails extends Component {
method constructor (line 13) | constructor(props) {
method componentWillReceiveProps (line 18) | componentWillReceiveProps(nextProps) {
method componentWillUnmount (line 22) | componentWillUnmount() {
method _makeAlias (line 38) | _makeAlias(str, account = this.props.account) {
method _renderDefaultAliasSelector (line 120) | _renderDefaultAliasSelector(account) {
method _renderErrorDetail (line 138) | _renderErrorDetail(message, buttonText, buttonAction) {
method _renderSyncErrorDetails (line 145) | _renderSyncErrorDetails() {
method render (line 172) | render() {
FILE: packages/client-app/internal_packages/preferences/lib/tabs/preferences-account-list.jsx
class PreferencesAccountList (line 5) | class PreferencesAccountList extends Component {
method _renderAccountStateIcon (line 16) | _renderAccountStateIcon(account) {
method render (line 60) | render() {
FILE: packages/client-app/internal_packages/preferences/lib/tabs/preferences-accounts.jsx
class PreferencesAccounts (line 9) | class PreferencesAccounts extends React.Component {
method constructor (line 12) | constructor() {
method componentDidMount (line 17) | componentDidMount() {
method componentWillUnmount (line 21) | componentWillUnmount() {
method getStateFromStores (line 27) | getStateFromStores({selected} = {}) {
method _onAddAccount (line 49) | _onAddAccount() {
method _onReorderAccount (line 53) | _onReorderAccount(account, oldIdx, newIdx) {
method _onRemoveAccount (line 61) | _onRemoveAccount(account) {
method _onAccountUpdated (line 66) | _onAccountUpdated(account, updates) {
method render (line 70) | render() {
FILE: packages/client-app/internal_packages/preferences/lib/tabs/preferences-appearance.jsx
class AppearanceModeSwitch (line 4) | class AppearanceModeSwitch extends React.Component {
method constructor (line 12) | constructor(props) {
method componentWillReceiveProps (line 19) | componentWillReceiveProps(nextProps) {
method _renderModeOptions (line 29) | _renderModeOptions() {
method render (line 40) | render() {
class PreferencesAppearance (line 83) | class PreferencesAppearance extends React.Component {
method render (line 96) | render() {
FILE: packages/client-app/internal_packages/preferences/lib/tabs/preferences-general.jsx
class PreferencesGeneral (line 8) | class PreferencesGeneral extends React.Component {
method render (line 35) | render() {
FILE: packages/client-app/internal_packages/preferences/lib/tabs/preferences-keymaps.jsx
class PreferencesKeymaps (line 10) | class PreferencesKeymaps extends React.Component {
method constructor (line 18) | constructor() {
method componentDidMount (line 27) | componentDidMount() {
method componentWillUnmount (line 33) | componentWillUnmount() {
method _getStateFromKeymaps (line 37) | _getStateFromKeymaps() {
method _loadTemplates (line 47) | _loadTemplates() {
method _onShowUserKeymaps (line 61) | _onShowUserKeymaps() {
method _onDeleteUserKeymap (line 69) | _onDeleteUserKeymap() {
method render (line 103) | render() {
FILE: packages/client-app/internal_packages/preferences/lib/tabs/preferences-mail-rules.jsx
class PreferencesMailRules (line 23) | class PreferencesMailRules extends React.Component {
method constructor (line 26) | constructor() {
method componentDidMount (line 31) | componentDidMount() {
method componentWillUnmount (line 37) | componentWillUnmount() {
method _getStateFromStores (line 41) | _getStateFromStores() {
method _renderAccountPicker (line 135) | _renderAccountPicker() {
method _renderMailRules (line 151) | _renderMailRules() {
method _renderListItemContent (line 186) | _renderListItemContent(rule) {
method _renderDetail (line 193) | _renderDetail() {
method _renderDetailDisabledNotice (line 232) | _renderDetailDisabledNotice() {
method _renderTasks (line 244) | _renderTasks() {
method render (line 269) | render() {
FILE: packages/client-app/internal_packages/preferences/lib/tabs/sending-section.jsx
function getExtendedSendingSchema (line 8) | function getExtendedSendingSchema(configSchema) {
function SendingSection (line 33) | function SendingSection(props) {
method getStateFromStores (line 55) | getStateFromStores(props) {
FILE: packages/client-app/internal_packages/preferences/lib/tabs/workspace-section.jsx
class DefaultMailClientItem (line 5) | class DefaultMailClientItem extends React.Component {
method constructor (line 7) | constructor() {
method componentDidMount (line 18) | componentDidMount() {
method componentWillUnmount (line 22) | componentWillUnmount() {
method render (line 37) | render() {
class LaunchSystemStartItem (line 54) | class LaunchSystemStartItem extends React.Component {
method constructor (line 56) | constructor() {
method componentDidMount (line 65) | componentDidMount() {
method componentWillUnmount (line 80) | componentWillUnmount() {
method render (line 95) | render() {
FILE: packages/client-app/internal_packages/preferences/spec/preferences-account-details-spec.jsx
function assertAccountState (line 29) | function assertAccountState(actual, expected) {
FILE: packages/client-app/internal_packages/print/static/print.js
function rebuildMessages (line 2) | function rebuildMessages(messageNodes, messages) {
function removeClassFromNodes (line 11) | function removeClassFromNodes(nodeList, className) {
function removeScrollClasses (line 19) | function removeScrollClasses() {
function continueAndPrint (line 28) | function continueAndPrint() {
FILE: packages/client-app/internal_packages/send-later/lib/send-later-button.jsx
constant OPEN_TRACKING_ID (line 10) | const OPEN_TRACKING_ID = NylasEnv.packages.pluginIdFor('open-tracking')
constant LINK_TRACKING_ID (line 11) | const LINK_TRACKING_ID = NylasEnv.packages.pluginIdFor('link-tracking')
class SendLaterButton (line 15) | class SendLaterButton extends Component {
method constructor (line 26) | constructor() {
method componentDidMount (line 33) | componentDidMount() {
method shouldComponentUpdate (line 37) | shouldComponentUpdate(nextProps, nextState) {
method componentWillUnmount (line 47) | componentWillUnmount() {
method _sendLaterDateForDraft (line 182) | _sendLaterDateForDraft(draft) {
method render (line 191) | render() {
FILE: packages/client-app/internal_packages/send-later/lib/send-later-popover.jsx
function SendLaterPopover (line 16) | function SendLaterPopover(props) {
FILE: packages/client-app/internal_packages/send-later/lib/send-later-status.jsx
class SendLaterStatus (line 10) | class SendLaterStatus extends Component {
method render (line 21) | render() {
FILE: packages/client-app/internal_packages/send-reminders/lib/send-reminders-composer-button.jsx
class SendRemindersComposerButton (line 9) | class SendRemindersComposerButton extends Component {
method constructor (line 19) | constructor(props) {
method componentWillReceiveProps (line 26) | componentWillReceiveProps() {
method shouldComponentUpdate (line 32) | shouldComponentUpdate(nextProps) {
method render (line 58) | render() {
FILE: packages/client-app/internal_packages/send-reminders/lib/send-reminders-headers.jsx
function MessageHeader (line 8) | function MessageHeader(props) {
function ThreadHeader (line 38) | function ThreadHeader(props) {
FILE: packages/client-app/internal_packages/send-reminders/lib/send-reminders-popover-button.jsx
function getMessageObservable (line 9) | function getMessageObservable({thread} = {}) {
function getStateFromObservable (line 16) | function getStateFromObservable(message, {props}) {
class SendRemindersPopoverButton (line 23) | class SendRemindersPopoverButton extends Component {
method render (line 60) | render() {
FILE: packages/client-app/internal_packages/send-reminders/lib/send-reminders-popover.jsx
function SendRemindersPopover (line 20) | function SendRemindersPopover(props) {
FILE: packages/client-app/internal_packages/send-reminders/lib/send-reminders-thread-timestamp.jsx
function canRenderTimestamp (line 8) | function canRenderTimestamp(message) {
class SendRemindersThreadTimestamp (line 19) | class SendRemindersThreadTimestamp extends Component {
method constructor (line 30) | constructor(props) {
method componentDidMount (line 38) | componentDidMount() {
method componentWillReceiveProps (line 43) | componentWillReceiveProps(nextProps) {
method componentWillUnmount (line 54) | componentWillUnmount() {
method onRemoveReminder (line 58) | onRemoveReminder(message) {
method setupMessageObservable (line 62) | setupMessageObservable(message) {
method disposeMessageObservable (line 75) | disposeMessageObservable() {
method render (line 81) | render() {
FILE: packages/client-app/internal_packages/send-reminders/lib/send-reminders-toolbar-button.jsx
function canSetReminderOnThread (line 11) | function canSetReminderOnThread(thread) {
function SendRemindersToolbarButton (line 18) | function SendRemindersToolbarButton(props) {
FILE: packages/client-app/internal_packages/send-reminders/lib/send-reminders-utils.jsx
function reminderDateForMessage (line 18) | function reminderDateForMessage(message) {
function asyncBuildMetadata (line 26) | async function asyncBuildMetadata({message, thread, expiration} = {}) {
function asyncUpdateFromSentMessage (line 69) | async function asyncUpdateFromSentMessage({messageClientId}) {
function asyncSetReminder (line 89) | async function asyncSetReminder(accountId, reminderDate, dateLabel, {mes...
function setMessageReminder (line 141) | function setMessageReminder(accountId, message, reminderDate, dateLabel,...
function setDraftReminder (line 145) | function setDraftReminder(accountId, draftSession, reminderDate, dateLab...
function reminderThreadIdsFromMessages (line 150) | function reminderThreadIdsFromMessages(messages) {
function observableForThreadsWithReminders (line 159) | function observableForThreadsWithReminders(accountIds = [], {emitIds = f...
function getLatestMessage (line 182) | function getLatestMessage(thread, messages) {
function getLatestMessageWithReminder (line 187) | function getLatestMessageWithReminder(thread, messages) {
function getReminderLabel (line 195) | function getReminderLabel(reminderDate, {fromNow = false, shortFormat = ...
FILE: packages/client-app/internal_packages/theme-picker/lib/main.jsx
function activate (line 7) | function activate() {
function deactivate (line 18) | function deactivate() {
FILE: packages/client-app/internal_packages/theme-picker/lib/theme-option.jsx
class ThemeOption (line 10) | class ThemeOption extends React.Component {
method constructor (line 17) | constructor(props) {
method componentDidMount (line 22) | componentDidMount() {
method _getImportPaths (line 26) | _getImportPaths() {
method _loadStylesheet (line 41) | _loadStylesheet(stylesheetPath) {
method _loadLessStylesheet (line 48) | _loadLessStylesheet(lessStylesheetPath) {
method _writeContent (line 69) | _writeContent() {
method render (line 97) | render() {
FILE: packages/client-app/internal_packages/theme-picker/lib/theme-picker.jsx
class ThemePicker (line 8) | class ThemePicker extends React.Component {
method constructor (line 11) | constructor(props) {
method componentDidMount (line 17) | componentDidMount() {
method componentWillUnmount (line 23) | componentWillUnmount() {
method _getState (line 27) | _getState() {
method _setActiveTheme (line 34) | _setActiveTheme(theme) {
method _rewriteIFrame (line 40) | _rewriteIFrame(prevActiveTheme, activeTheme) {
method _renderThemeOptions (line 49) | _renderThemeOptions() {
method render (line 65) | render() {
FILE: packages/client-app/internal_packages/thread-list/lib/injects-toolbar-buttons.jsx
function defaultObservable (line 9) | function defaultObservable() {
function InjectsToolbarButtons (line 13) | function InjectsToolbarButtons(ToolbarComponent, {getObservable, extraRo...
FILE: packages/client-app/internal_packages/thread-list/lib/message-list-toolbar.jsx
function getObservable (line 8) | function getObservable() {
FILE: packages/client-app/internal_packages/thread-list/lib/selected-items-stack.jsx
function getObservable (line 7) | function getObservable() {
function getStateFromObservable (line 14) | function getStateFromObservable(selectionCount) {
class SelectedItemsStack (line 21) | class SelectedItemsStack extends Component {
method render (line 34) | render() {
FILE: packages/client-app/internal_packages/thread-list/lib/thread-list-toolbar.jsx
class ThreadListToolbar (line 6) | class ThreadListToolbar extends Component {
method render (line 21) | render() {
FILE: packages/client-app/internal_packages/thread-list/lib/thread-toolbar-buttons.jsx
class ArchiveButton (line 16) | class ArchiveButton extends React.Component {
method render (line 34) | render() {
class TrashButton (line 54) | class TrashButton extends React.Component {
method render (line 69) | render() {
class MarkAsSpamButton (line 89) | class MarkAsSpamButton extends React.Component {
method _allInSpam (line 97) | _allInSpam() {
method render (line 126) | render() {
class ToggleStarredButton (line 159) | class ToggleStarredButton extends React.Component {
method render (line 173) | render() {
class ToggleUnreadButton (line 192) | class ToggleUnreadButton extends React.Component {
method render (line 207) | render() {
class ThreadArrowButton (line 228) | class ThreadArrowButton extends React.Component {
method constructor (line 236) | constructor(props) {
method componentDidMount (line 241) | componentDidMount() {
method componentWillUnmount (line 246) | componentWillUnmount() {
method render (line 263) | render() {
FILE: packages/client-app/internal_packages/thread-search/lib/thread-search-bar.jsx
class ThreadSearchBar (line 8) | class ThreadSearchBar extends Component {
method render (line 65) | render() {
method getStateFromStores (line 89) | getStateFromStores() {
FILE: packages/client-app/internal_packages/thread-sharing/lib/copy-button.jsx
class CopyButton (line 6) | class CopyButton extends React.Component {
method constructor (line 13) | constructor(props) {
method componentWillReceiveProps (line 21) | componentWillReceiveProps(nextProps) {
method componentWillUnmount (line 27) | componentWillUnmount() {
method render (line 42) | render() {
FILE: packages/client-app/internal_packages/thread-sharing/lib/thread-sharing-button.jsx
class ThreadSharingButton (line 5) | class ThreadSharingButton extends React.Component {
method componentWillReceiveProps (line 15) | componentWillReceiveProps(nextProps) {
method render (line 37) | render() {
FILE: packages/client-app/internal_packages/thread-sharing/lib/thread-sharing-popover.jsx
function isShared (line 12) | function isShared(thread) {
class ThreadSharingPopover (line 17) | class ThreadSharingPopover extends React.Component {
method constructor (line 23) | constructor(props) {
method componentDidMount (line 32) | componentDidMount() {
method componentDidUpdate (line 39) | componentDidUpdate() {
method componentWillUnmount (line 43) | componentWillUnmount() {
method render (line 77) | render() {
FILE: packages/client-app/internal_packages/thread-snooze/lib/snooze-buttons.jsx
class SnoozeButton (line 8) | class SnoozeButton extends Component {
method render (line 38) | render() {
class QuickActionSnooze (line 62) | class QuickActionSnooze extends Component {
method render (line 81) | render() {
class ToolbarSnooze (line 98) | class ToolbarSnooze extends Component {
method render (line 107) | render() {
FILE: packages/client-app/internal_packages/thread-snooze/lib/snooze-mail-label.jsx
class SnoozeMailLabel (line 9) | class SnoozeMailLabel extends Component {
method render (line 18) | render() {
FILE: packages/client-app/internal_packages/thread-snooze/lib/snooze-popover.jsx
class SnoozePopover (line 42) | class SnoozePopover extends Component {
method constructor (line 54) | constructor() {
method componentWillUnmount (line 59) | componentWillUnmount() {
method onSnooze (line 63) | onSnooze(date, itemLabel) {
method render (line 111) | render() {
FILE: packages/client-app/internal_packages/thread-snooze/lib/snooze-store.jsx
class SnoozeStore (line 8) | class SnoozeStore {
method constructor (line 10) | constructor(pluginId = PLUGIN_ID, pluginName = PLUGIN_NAME) {
method activate (line 17) | activate() {
method recordSnoozeEvent (line 24) | recordSnoozeEvent(threads, snoozeDate, label) {
method deactivate (line 113) | deactivate() {
FILE: packages/client-app/internal_packages/undo-redo/lib/undo-redo-thread-list-toast.jsx
function onUndo (line 6) | function onUndo() {
function UndoRedoThreadListToast (line 10) | function UndoRedoThreadListToast(props) {
method getStateFromStores (line 31) | getStateFromStores() {
FILE: packages/client-app/internal_packages/undo-redo/lib/undo-send-toast.jsx
function UndoSendToast (line 7) | function UndoSendToast(props) {
method getStateFromStores (line 38) | getStateFromStores() {
FILE: packages/client-app/spec/components/editable-table-spec.jsx
function renderCell (line 10) | function renderCell(props) {
function renderTable (line 105) | function renderTable(props) {
FILE: packages/client-app/spec/components/injected-component-set-spec.jsx
method render (line 12) | render() { return <div className={displayName} /> }
FILE: packages/client-app/spec/components/selectable-table-spec.jsx
function renderCell (line 9) | function renderCell(props) {
function renderRow (line 105) | function renderRow(props) {
function renderTable (line 184) | function renderTable(props) {
FILE: packages/client-app/spec/components/table/table-spec.jsx
function renderRow (line 37) | function renderRow(props = {}) {
function renderTable (line 118) | function renderTable(props = {}) {
FILE: packages/client-app/spec/n1-spec-runner/jasmine.js
function getGlobal (line 61) | function getGlobal() {
function tryIt (line 627) | function tryIt(f) {
FILE: packages/client-app/src/browser/windows-updater.js
function spawn (line 43) | function spawn(command, args, callback, options = {}) {
function spawnUpdate (line 80) | function spawnUpdate(args, callback, options = {}) {
function createShortcuts (line 86) | function createShortcuts(callback) {
function createRegistryEntries (line 90) | function createRegistryEntries({allowEscalation, registerDefaultIfPossib...
function removeShortcuts (line 153) | function removeShortcuts(callback) {
FILE: packages/client-app/src/compile-cache.js
constant COMPILERS (line 9) | const COMPILERS = {
function readCachedJavascript (line 20) | function readCachedJavascript(relativeCachePath) {
function writeCachedJavascript (line 41) | function writeCachedJavascript(relativeCachePath, code) {
function addSourceURL (line 52) | function addSourceURL(jsCode, filePath) {
function compileFileAtPath (line 60) | function compileFileAtPath(compiler, filePath, extension) {
constant INLINE_SOURCE_MAP_REGEXP (line 77) | const INLINE_SOURCE_MAP_REGEXP = /\/\/[#@]\s*sourceMappingURL=([^'"\n]+)...
FILE: packages/client-app/src/compile-support/babel.js
function createVersionAndOptionsDigest (line 58) | function createVersionAndOptionsDigest (version, options) {
FILE: packages/client-app/src/compile-support/cjsx.js
function compile (line 24) | function compile(module, filename) {
function monitorHotReload (line 28) | function monitorHotReload(module) {
function isReactComponent (line 46) | function isReactComponent(module) {
function recompileRequirements (line 50) | function recompileRequirements(module, collection) {
function monitorRequire (line 67) | function monitorRequire(module) {
function onRequired (line 78) | function onRequired(module) {
function removeModuleFromDependencies (line 85) | function removeModuleFromDependencies(module) {
function hotCompile (line 91) | function hotCompile(module, filename, withRequirements) {
function registerHotCompile (line 136) | function registerHotCompile() {
FILE: packages/client-app/src/compile-support/typescript.js
function createVersionAndOptionsDigest (line 44) | function createVersionAndOptionsDigest (version, options) {
FILE: packages/client-app/src/components/attachment-items.jsx
constant SPACE (line 37) | const SPACE = ' '
function ProgressBar (line 39) | function ProgressBar(props) {
function AttachmentActionIcon (line 59) | function AttachmentActionIcon(props) {
class AttachmentItem (line 102) | class AttachmentItem extends Component {
method _canPreview (line 111) | _canPreview() {
method _previewAttachment (line 120) | _previewAttachment() {
method render (line 171) | render() {
class ImageAttachmentItem (line 253) | class ImageAttachmentItem extends Component {
method renderImage (line 283) | renderImage() {
method render (line 298) | render() {
FILE: packages/client-app/src/components/billing-modal.jsx
class BillingModal (line 6) | class BillingModal extends React.Component {
method constructor (line 12) | constructor(props = {}) {
method componentWillMount (line 19) | componentWillMount() {
method componentDidMount (line 28) | componentDidMount() {
method componentWillUnmount (line 40) | componentWillUnmount() {
method render (line 88) | render() {
FILE: packages/client-app/src/components/bolded-search-result.jsx
function BoldedSearchResult (line 4) | function BoldedSearchResult({query = "", value = ""} = {}) {
FILE: packages/client-app/src/components/code-snippet.jsx
function CodeSnippet (line 3) | function CodeSnippet(props) {
FILE: packages/client-app/src/components/config-prop-container.jsx
class ConfigPropContainer (line 3) | class ConfigPropContainer extends React.Component {
method constructor (line 6) | constructor(props) {
method componentDidMount (line 11) | componentDidMount() {
method componentWillUnmount (line 17) | componentWillUnmount() {
method getStateFromStores (line 23) | getStateFromStores() {
method getConfigWithMutators (line 29) | getConfigWithMutators() {
method render (line 58) | render() {
FILE: packages/client-app/src/components/contenteditable/toolbar-buttons.jsx
class ToolbarButtons (line 12) | class ToolbarButtons extends React.Component {
method render (line 25) | render() {
FILE: packages/client-app/src/components/date-input.jsx
class DateInput (line 7) | class DateInput extends Component {
method constructor (line 22) | constructor(props) {
method componentDidMount (line 31) | componentDidMount() {
method componentWillUnmount (line 35) | componentWillUnmount() {
method clearInput (line 58) | clearInput() {
method render (line 65) | render() {
FILE: packages/client-app/src/components/date-picker-popover.jsx
class DatePickerPopover (line 9) | class DatePickerPopover extends Component {
method onEscape (line 25) | onEscape() {
method render (line 70) | render() {
FILE: packages/client-app/src/components/date-picker.jsx
class DatePicker (line 7) | class DatePicker extends React.Component {
method constructor (line 25) | constructor(props) {
method value (line 30) | value() {
method _onChange (line 34) | _onChange(newMoment) {
method _moveDay (line 41) | _moveDay(numDays) {
method _renderMiniMonthView (line 74) | _renderMiniMonthView() {
method render (line 88) | render() {
FILE: packages/client-app/src/components/decorators/auto-focuses.jsx
constant FOCUSABLE_SELECTOR (line 6) | const FOCUSABLE_SELECTOR = 'input, textarea, [contenteditable], [tabIndex]'
function AutoFocuses (line 8) | function AutoFocuses(ComposedComponent, {onMount = true, onUpdate = true...
FILE: packages/client-app/src/components/decorators/has-tutorial-tip.jsx
class TipsStoreCls (line 16) | class TipsStoreCls extends NylasStore {
method constructor (line 17) | constructor() {
method isTipVisible (line 23) | isTipVisible(key) {
method hasSeenTip (line 28) | hasSeenTip(key) {
class TipPopoverContents (line 56) | class TipPopoverContents extends React.Component {
method componentDidMount (line 64) | componentDidMount() {
method componentWillUnmount (line 73) | componentWillUnmount() {
method render (line 85) | render() {
function HasTutorialTip (line 104) | function HasTutorialTip(ComposedComponent, TipConfig) {
FILE: packages/client-app/src/components/decorators/listens-to-flux-store.jsx
function ListensToFluxStore (line 4) | function ListensToFluxStore(ComposedComponent, {stores, getStateFromStor...
FILE: packages/client-app/src/components/decorators/listens-to-movement-keys.jsx
function ListensToMovementKeys (line 4) | function ListensToMovementKeys(ComposedComponent) {
FILE: packages/client-app/src/components/decorators/listens-to-observable.jsx
function ListensToObservable (line 3) | function ListensToObservable(ComposedComponent, {getObservable, getState...
FILE: packages/client-app/src/components/drop-zone.jsx
class DropZone (line 4) | class DropZone extends React.Component {
method render (line 62) | render() {
FILE: packages/client-app/src/components/dropdown-menu.jsx
class DropdownMenu (line 4) | class DropdownMenu extends React.Component {
method constructor (line 12) | constructor(props) {
method componentWillReceiveProps (line 20) | componentWillReceiveProps(nextProps) {
method render (line 57) | render() {
FILE: packages/client-app/src/components/editable-list.jsx
class EditableList (line 44) | class EditableList extends Component {
method constructor (line 119) | constructor(props) {
method render (line 456) | render() {
FILE: packages/client-app/src/components/editable-table.jsx
class EditableTableCell (line 67) | class EditableTableCell extends Component {
method componentDidMount (line 85) | componentDidMount() {
method componentDidUpdate (line 91) | componentDidUpdate() {
method shouldFocusInput (line 121) | shouldFocusInput() {
method render (line 129) | render() {
function EditableTable (line 153) | function EditableTable(props) {
FILE: packages/client-app/src/components/feature-used-up-modal.jsx
class FeatureUsedUpModal (line 8) | class FeatureUsedUpModal extends React.Component {
method componentDidMount (line 17) | componentDidMount() {
method componentWillUnmount (line 27) | componentWillUnmount() {
method render (line 31) | render() {
FILE: packages/client-app/src/components/fixed-popover.jsx
constant OFFSET_PADDING (line 23) | const OFFSET_PADDING = 11.5;
class FixedPopover (line 32) | class FixedPopover extends Component {
method constructor (line 56) | constructor(props) {
method componentDidMount (line 68) | componentDidMount() {
method componentWillReceiveProps (line 75) | componentWillReceiveProps(nextProps) {
method shouldComponentUpdate (line 80) | shouldComponentUpdate(nextProps, nextState) {
method componentDidUpdate (line 87) | componentDidUpdate() {
method componentWillUnmount (line 91) | componentWillUnmount() {
method onWindowResize (line 101) | onWindowResize() {
method render (line 303) | render() {
FILE: packages/client-app/src/components/flexbox.jsx
class Flexbox (line 10) | class Flexbox extends React.Component {
method render (line 31) | render() {
FILE: packages/client-app/src/components/flux-container.jsx
class FluxContainer (line 4) | class FluxContainer extends React.Component {
method constructor (line 12) | constructor(props) {
method componentDidMount (line 18) | componentDidMount() {
method componentWillReceiveProps (line 22) | componentWillReceiveProps(nextProps) {
method componentWillUnmount (line 27) | componentWillUnmount() {
method setupListeners (line 34) | setupListeners(props = this.props) {
method render (line 46) | render() {
FILE: packages/client-app/src/components/focus-container.jsx
class FocusContainer (line 5) | class FocusContainer extends React.Component {
method render (line 24) | render() {
FILE: packages/client-app/src/components/injected-component-label.jsx
class InjectedComponentLabel (line 4) | class InjectedComponentLabel extends React.Component {
method render (line 11) | render() {
FILE: packages/client-app/src/components/key-commands-region.jsx
class KeyCommandsRegion (line 84) | class KeyCommandsRegion extends React.Component {
method constructor (line 105) | constructor(props) {
method componentDidMount (line 113) | componentDidMount() {
method componentWillReceiveProps (line 120) | componentWillReceiveProps(newProps) {
method componentWillUnmount (line 133) | componentWillUnmount() {
method _setupListeners (line 151) | _setupListeners(props) {
method _unmountListeners (line 166) | _unmountListeners() {
method render (line 254) | render() {
FILE: packages/client-app/src/components/lazy-rendered-list.jsx
constant MIN_RANGE_SIZE (line 5) | const MIN_RANGE_SIZE = 2
function getRange (line 7) | function getRange({total, itemHeight, containerHeight, scrollTop = 0} = ...
class LazyRenderedList (line 14) | class LazyRenderedList extends Component {
method constructor (line 31) | constructor(props) {
method componentWillReceiveProps (line 36) | componentWillReceiveProps(nextProps) {
method getRangeState (line 44) | getRangeState({items, itemHeight, containerHeight, scrollTop}) {
method updateRangeState (line 48) | updateRangeState(props) {
method renderItems (line 53) | renderItems() {
method render (line 74) | render() {
FILE: packages/client-app/src/components/list-tabular.jsx
class ListColumn (line 12) | class ListColumn {
method constructor (line 13) | constructor({name, resolver, flex, width}) {
class ListTabularRows (line 21) | class ListTabularRows extends Component {
method shouldComponentUpdate (line 37) | shouldComponentUpdate(nextProps, nextState) {
method renderRow (line 44) | renderRow({item, idx, itemProps = {}} = {}) {
method render (line 67) | render() {
class ListTabular (line 83) | class ListTabular extends Component {
method constructor (line 114) | constructor(props) {
method componentDidMount (line 124) | componentDidMount() {
method componentWillReceiveProps (line 130) | componentWillReceiveProps(nextProps) {
method componentDidUpdate (line 136) | componentDidUpdate(prevProps) {
method componentWillUnmount (line 156) | componentWillUnmount() {
method setupDataSource (line 192) | setupDataSource(dataSource) {
method getRowsToRender (line 200) | getRowsToRender() {
method scrollTo (line 222) | scrollTo(node) {
method scrollByPage (line 226) | scrollByPage(direction) {
method updateRangeState (line 231) | updateRangeState() {
method buildStateForRange (line 265) | buildStateForRange(args = {}) {
method render (line 324) | render() {
FILE: packages/client-app/src/components/mail-label-set.jsx
class MailLabelSet (line 12) | class MailLabelSet extends React.Component {
method _onRemoveLabel (line 22) | _onRemoveLabel(label) {
method render (line 30) | render() {
FILE: packages/client-app/src/components/mail-label.jsx
method color (line 5) | color(label) {
method backgroundColor (line 9) | backgroundColor(label) {
method backgroundColorDark (line 13) | backgroundColorDark(label) {
method styles (line 17) | styles(label) {
class MailLabel (line 30) | class MailLabel extends React.Component {
method shouldComponentUpdate (line 36) | shouldComponentUpdate(nextProps) {
method _removable (line 41) | _removable() {
method render (line 45) | render() {
FILE: packages/client-app/src/components/metadata-composer-toggle-button.jsx
class MetadataComposerToggleButton (line 6) | class MetadataComposerToggleButton extends React.Component {
method constructor (line 28) | constructor(props) {
method componentWillMount (line 36) | componentWillMount() {
method _configKey (line 42) | _configKey() {
method _isEnabled (line 46) | _isEnabled() {
method _isEnabledByDefault (line 52) | _isEnabledByDefault() {
method _setEnabled (line 56) | _setEnabled(enabled) {
method render (line 100) | render() {
FILE: packages/client-app/src/components/modal.jsx
class Modal (line 8) | class Modal extends React.Component {
method constructor (line 17) | constructor(props) {
method componentDidMount (line 25) | componentDidMount() {
method render (line 77) | render() {
FILE: packages/client-app/src/components/multiselect-dropdown.jsx
class MultiselectDropdown (line 18) | class MultiselectDropdown extends Component {
method componentDidUpdate (line 41) | componentDidUpdate() {
method render (line 71) | render() {
FILE: packages/client-app/src/components/multiselect-toolbar.jsx
class MultiselectToolbar (line 15) | class MultiselectToolbar extends Component {
method shouldComponentUpdate (line 25) | shouldComponentUpdate(nextProps, nextState) {
method renderToolbar (line 42) | renderToolbar() {
method render (line 64) | render() {
FILE: packages/client-app/src/components/notification.jsx
class Notification (line 4) | class Notification extends React.Component {
method constructor (line 25) | constructor(props) {
method componentDidMount (line 33) | componentDidMount() {
method componentWillUnmount (line 37) | componentWillUnmount() {
method _isDismissed (line 41) | _isDismissed() {
method _numAsks (line 48) | _numAsks() {
method _onClick (line 58) | _onClick(event, actionId, actionFn) {
method _subtitle (line 75) | _subtitle() {
method render (line 92) | render() {
FILE: packages/client-app/src/components/nylas-calendar/calendar-event-container.jsx
class CalendarEventContainer (line 6) | class CalendarEventContainer extends React.Component {
method constructor (line 15) | constructor() {
method componentDidMount (line 20) | componentDidMount() {
method componentWillUnmount (line 24) | componentWillUnmount() {
method _runPropsHandler (line 47) | _runPropsHandler(name, event) {
method _dataFromMouseEvent (line 58) | _dataFromMouseEvent(event) {
method render (line 92) | render() {
FILE: packages/client-app/src/components/nylas-calendar/calendar-event-popover.jsx
class CalendarEventPopover (line 8) | class CalendarEventPopover extends React.Component {
method constructor (line 13) | constructor(props) {
method extractNotesFromDescription (line 62) | extractNotesFromDescription(node) {
method formatTime (line 81) | formatTime(momentTime) {
method renderTime (line 132) | renderTime() {
method renderEditableTime (line 145) | renderEditableTime() {
method renderParticipants (line 173) | renderParticipants(participants) {
method render (line 233) | render() {
FILE: packages/client-app/src/components/nylas-calendar/calendar-event.jsx
class CalendarEvent (line 7) | class CalendarEvent extends React.Component {
method componentDidMount (line 35) | componentDidMount() {
method componentDidUpdate (line 39) | componentDidUpdate() {
method _scrollFocusedEventIntoView (line 43) | _scrollFocusedEventIntoView() {
method _getDimensions (line 53) | _getDimensions() {
method _getStyles (line 78) | _getStyles() {
method _overflowBefore (line 95) | _overflowBefore() {
method render (line 99) | render() {
FILE: packages/client-app/src/components/nylas-calendar/calendar-helpers.jsx
function calcColor (line 3) | function calcColor(calendarId) {
FILE: packages/client-app/src/components/nylas-calendar/calendar-toggles.jsx
constant DISABLED_CALENDARS (line 8) | const DISABLED_CALENDARS = "nylas.disabledCalendars"
function renderCalendarToggles (line 10) | function renderCalendarToggles(calendars, disabledCalendars) {
function CalendarToggles (line 45) | function CalendarToggles(props) {
FILE: packages/client-app/src/components/nylas-calendar/current-time-indicator.jsx
class CurrentTimeIndicator (line 6) | class CurrentTimeIndicator extends React.Component {
method constructor (line 14) | constructor(props) {
method componentDidMount (line 20) | componentDidMount() {
method componentWillUnmount (line 28) | componentWillUnmount() {
method getStateFromTime (line 33) | getStateFromTime() {
method render (line 40) | render() {
FILE: packages/client-app/src/components/nylas-calendar/event-grid-background.jsx
class EventGridBackground (line 5) | class EventGridBackground extends React.Component {
method constructor (line 15) | constructor() {
method componentDidMount (line 20) | componentDidMount() {
method shouldComponentUpdate (line 24) | shouldComponentUpdate(nextProps, nextState) {
method componentDidUpdate (line 29) | componentDidUpdate() {
method _renderEventGridBackground (line 33) | _renderEventGridBackground() {
method mouseMove (line 54) | mouseMove({x, y, width}) {
method render (line 76) | render() {
FILE: packages/client-app/src/components/nylas-calendar/event-participants-input.jsx
class EventParticipantsInput (line 30) | class EventParticipantsInput extends React.Component {
method shouldComponentUpdate (line 41) | shouldComponentUpdate(nextProps, nextState) {
method render (line 154) | render() {
FILE: packages/client-app/src/components/nylas-calendar/event-search-bar.jsx
class EventSearchBar (line 6) | class EventSearchBar extends Component {
method constructor (line 19) | constructor(props) {
method renderEvent (line 62) | renderEvent(event) {
method render (line 66) | render() {
FILE: packages/client-app/src/components/nylas-calendar/footer-controls.jsx
class FooterControls (line 4) | class FooterControls extends React.Component {
method shouldComponentUpdate (line 15) | shouldComponentUpdate(nextProps, nextState) {
method render (line 20) | render() {
FILE: packages/client-app/src/components/nylas-calendar/header-controls.jsx
class HeaderControls (line 5) | class HeaderControls extends React.Component {
method shouldComponentUpdate (line 19) | shouldComponentUpdate(nextProps, nextState) {
method _renderNextAction (line 24) | _renderNextAction() {
method _renderPrevAction (line 40) | _renderPrevAction() {
method render (line 56) | render() {
FILE: packages/client-app/src/components/nylas-calendar/mini-month-view.jsx
class MiniMonthView (line 6) | class MiniMonthView extends React.Component {
method constructor (line 19) | constructor(props) {
method componentWillReceiveProps (line 25) | componentWillReceiveProps(newProps) {
method _stateFromProps (line 29) | _stateFromProps(props) {
method _shownMonthMoment (line 37) | _shownMonthMoment() {
method _renderLegend (line 50) | _renderLegend() {
method _isSameDay (line 66) | _isSameDay(m1, m2) {
method _renderDays (line 70) | _renderDays() {
method render (line 103) | render() {
FILE: packages/client-app/src/components/nylas-calendar/month-view.jsx
class MonthView (line 3) | class MonthView extends React.Component {
method render (line 14) | render() {
FILE: packages/client-app/src/components/nylas-calendar/nylas-calendar.jsx
constant DISABLED_CALENDARS (line 13) | const DISABLED_CALENDARS = "nylas.disabledCalendars"
class NylasCalendar (line 18) | class NylasCalendar extends React.Component {
method constructor (line 91) | constructor(props) {
method componentWillMount (line 102) | componentWillMount() {
method componentWillUnmount (line 106) | componentWillUnmount() {
method _subscribeToCalendars (line 110) | _subscribeToCalendars() {
method _now (line 125) | _now() {
method _getCurrentViewComponent (line 129) | _getCurrentViewComponent() {
method render (line 153) | render() {
FILE: packages/client-app/src/components/nylas-calendar/top-banner.jsx
class TopBanner (line 3) | class TopBanner extends React.Component {
method render (line 10) | render() {
FILE: packages/client-app/src/components/nylas-calendar/week-view-all-day-events.jsx
class WeekViewAllDayEvents (line 12) | class WeekViewAllDayEvents extends React.Component {
method shouldComponentUpdate (line 24) | shouldComponentUpdate(nextProps, nextState) {
method render (line 29) | render() {
FILE: packages/client-app/src/components/nylas-calendar/week-view-event-column.jsx
class WeekViewEventColumn (line 13) | class WeekViewEventColumn extends React.Component {
method shouldComponentUpdate (line 28) | shouldComponentUpdate(nextProps, nextState) {
method renderEvents (line 33) | renderEvents() {
method render (line 53) | render() {
FILE: packages/client-app/src/components/nylas-calendar/week-view.jsx
constant BUFFER_DAYS (line 19) | const BUFFER_DAYS = 7;
constant DAYS_IN_VIEW (line 20) | const DAYS_IN_VIEW = 7;
constant MIN_INTERVAL_HEIGHT (line 21) | const MIN_INTERVAL_HEIGHT = 21;
constant DAY_DUR (line 22) | const DAY_DUR = moment.duration(1, 'day').as('seconds');
constant INTERVAL_TIME (line 23) | const INTERVAL_TIME = moment.duration(30, 'minutes').as('seconds');
class WeekView (line 28) | class WeekView extends React.Component {
method constructor (line 57) | constructor(props) {
method componentWillMount (line 65) | componentWillMount() {
method componentDidMount (line 69) | componentDidMount() {
method componentWillReceiveProps (line 79) | componentWillReceiveProps(props) {
method componentDidUpdate (line 83) | componentDidUpdate() {
method componentWillUnmount (line 88) | componentWillUnmount() {
method _now (line 95) | _now() {
method _initializeComponent (line 99) | _initializeComponent(props) {
method _calculateStartMoment (line 129) | _calculateStartMoment(props) {
method _calculateEndMoment (line 149) | _calculateEndMoment(props) {
method _isToday (line 169) | _isToday(day) {
method _allDayEventHeight (line 192) | _allDayEventHeight(allDayOverlap) {
method _eventOverlap (line 206) | _eventOverlap(events) {
method _findMaxConcurrent (line 241) | _findMaxConcurrent(startedEvents, overlapById) {
method _findAvailableOrder (line 249) | _findAvailableOrder(startedEvents, overlapById) {
method _maxConcurrentEvents (line 258) | _maxConcurrentEvents(eventOverlap) {
method _daysInView (line 266) | _daysInView() {
method _currentWeekText (line 277) | _currentWeekText() {
method _headerComponents (line 283) | _headerComponents() {
method _gridHeight (line 313) | _gridHeight() {
method _centerScrollRegion (line 317) | _centerScrollRegion() {
method _tickGenerator (line 324) | * _tickGenerator({type}) {
method _ensureHorizontalScrollPos (line 388) | _ensureHorizontalScrollPos() {
method _renderEventGridLabels (line 398) | _renderEventGridLabels() {
method _bufferRatio (line 410) | _bufferRatio() {
method _eventsByDay (line 416) | _eventsByDay(days) {
method render (line 441) | render() {
FILE: packages/client-app/src/components/oauth-signin-page.jsx
class OAuthSignInPage (line 8) | class OAuthSignInPage extends React.Component {
method constructor (line 52) | constructor() {
method componentDidMount (line 62) | componentDidMount() {
method componentWillUnmount (line 75) | componentWillUnmount() {
method _handleError (line 80) | _handleError(err) {
method startPollingForResponse (line 91) | startPollingForResponse() {
method fetchAccountDataWithToken (line 126) | async fetchAccountDataWithToken(tokenData, {forceTrustCertificate = fa...
method _renderCertificateErrorHeader (line 140) | _renderCertificateErrorHeader() {
method _renderHeader (line 171) | _renderHeader() {
method _renderAlternative (line 205) | _renderAlternative() {
method render (line 239) | render() {
FILE: packages/client-app/src/components/open-identity-page-button.jsx
class OpenIdentityPageButton (line 7) | class OpenIdentityPageButton extends React.Component {
method constructor (line 17) | constructor(props) {
method render (line 36) | render() {
FILE: packages/client-app/src/components/outline-view-item.jsx
class OutlineViewItem (line 69) | class OutlineViewItem extends Component {
method constructor (line 142) | constructor(props) {
method componentDidMount (line 151) | componentDidMount() {
method componentWillReceiveProps (line 157) | componentWillReceiveProps(newProps) {
method shouldComponentUpdate (line 163) | shouldComponentUpdate(nextProps, nextState) {
method componentWillUnmount (line 168) | componentWillUnmount() {
method _renderCount (line 286) | _renderCount(item = this.props.item) {
method _renderIcon (line 297) | _renderIcon(item = this.props.item) {
method _renderItemContent (line 309) | _renderItemContent(item = this.props.item, state = this.state) {
method _renderItem (line 329) | _renderItem(item = this.props.item, state = this.state) {
method _renderChildren (line 354) | _renderChildren(item = this.props.item) {
method render (line 367) | render() {
FILE: packages/client-app/src/components/outline-view.jsx
class OutlineView (line 33) | class OutlineView extends Component {
method shouldComponentUpdate (line 65) | shouldComponentUpdate(nextProps, nextState) {
method componentWillUnmount (line 70) | componentWillUnmount() {
method _renderCreateInput (line 114) | _renderCreateInput(props = this.props) {
method _renderCreateButton (line 128) | _renderCreateButton() {
method _renderHeading (line 144) | _renderHeading(allowCreate, collapsed, collapsible) {
method _renderItems (line 170) | _renderItems() {
method _renderOutline (line 176) | _renderOutline(allowCreate, collapsed) {
method render (line 190) | render() {
FILE: packages/client-app/src/components/overlaid-components/overlaid-components.jsx
constant MUTATION_CONFIG (line 9) | const MUTATION_CONFIG = {
class OverlaidComponents (line 18) | class OverlaidComponents extends React.Component {
method propsToDOMAttr (line 34) | static propsToDOMAttr(props) {
method buildAnchorTag (line 38) | static buildAnchorTag(componentKey, props = {}, existingId = null, sty...
method constructor (line 54) | constructor(props) {
method componentDidMount (line 66) | componentDidMount() {
method componentWillUpdate (line 72) | componentWillUpdate() {
method componentDidUpdate (line 76) | componentDidUpdate() {
method componentWillUnmount (line 82) | componentWillUnmount() {
method _setupMutationObservers (line 86) | _setupMutationObservers() {
method _teardownMutationObservers (line 99) | _teardownMutationObservers() {
method _adjustNodes (line 133) | _adjustNodes(ref, rects, dims) {
method _dataFromNodes (line 145) | _dataFromNodes({root, selector, dataFields}) {
method _renderPreviewToggle (line 171) | _renderPreviewToggle() {
method _renderOverlaidComponents (line 183) | _renderOverlaidComponents() {
method render (line 232) | render() {
FILE: packages/client-app/src/components/participants-text-field.jsx
class ParticipantsTextField (line 31) | class ParticipantsTextField extends React.Component {
method shouldComponentUpdate (line 64) | shouldComponentUpdate(nextProps, nextState) {
method render (line 202) | render() {
FILE: packages/client-app/src/components/retina-img.jsx
class RetinaImg (line 69) | class RetinaImg extends React.Component {
method render (line 119) | render() {
FILE: packages/client-app/src/components/scrollbar-ticks.jsx
class ScrollbarTicks (line 4) | class ScrollbarTicks extends React.Component {
method componentDidMount (line 11) | componentDidMount() {
method componentDidUpdate (line 15) | componentDidUpdate() {
method _updateTicks (line 19) | _updateTicks() {
method render (line 34) | render() {
FILE: packages/client-app/src/components/search-bar.jsx
class SearchBar (line 9) | class SearchBar extends Component {
method componentDidMount (line 37) | componentDidMount() {
method componentWillUnmount (line 41) | componentWillUnmount() {
method clearAndBlur (line 45) | clearAndBlur() {
method render (line 93) | render() {
FILE: packages/client-app/src/components/selectable-table.jsx
class SelectableTableCell (line 78) | class SelectableTableCell extends Component {
method shouldComponentUpdate (line 93) | shouldComponentUpdate(nextProps) {
method isSelected (line 110) | isSelected({selection, rowIdx, colIdx}) {
method isSelectedUsingKey (line 116) | isSelectedUsingKey(key) {
method isInLastRow (line 121) | isInLastRow() {
method render (line 127) | render() {
class SelectableTableRow (line 144) | class SelectableTableRow extends Component {
method shouldComponentUpdate (line 157) | shouldComponentUpdate(nextProps) {
method componentDidUpdate (line 172) | componentDidUpdate() {
method isSelected (line 179) | isSelected({selection, rowIdx}) {
method render (line 183) | render() {
class SelectableTable (line 199) | class SelectableTable extends Component {
method shouldComponentUpdate (line 221) | shouldComponentUpdate(nextProps) {
method onArrowUp (line 228) | onArrowUp({key}) {
method onArrowDown (line 233) | onArrowDown({key}) {
method onArrowLeft (line 238) | onArrowLeft({key}) {
method onArrowRight (line 243) | onArrowRight({key}) {
method onEnter (line 248) | onEnter({key}) {
method onTab (line 253) | onTab({key}) {
method onShiftTab (line 263) | onShiftTab({key}) {
method render (line 273) | render() {
FILE: packages/client-app/src/components/swipe-container.jsx
class SwipeContainer (line 50) | class SwipeContainer extends Component {
method constructor (line 73) | constructor(props) {
method componentDidMount (line 89) | componentDidMount() {
method componentWillReceiveProps (line 95) | componentWillReceiveProps() {
method componentDidUpdate (line 99) | componentDidUpdate() {
method componentWillUnmount (line 109) | componentWillUnmount() {
method _onReset (line 268) | _onReset() {
method _settle (line 276) | _settle() {
method render (line 312) | render() {
FILE: packages/client-app/src/components/syncing-list-state.jsx
function SyncingListState (line 3) | function SyncingListState(props) {
FILE: packages/client-app/src/components/table/table.jsx
function TableCell (line 63) | function TableCell(props) {
class TableRow (line 78) | class TableRow extends Component {
method render (line 96) | render() {
class Table (line 129) | class Table extends Component {
method renderBody (line 168) | renderBody() {
method renderHeader (line 184) | renderHeader() {
method render (line 203) | render() {
FILE: packages/client-app/src/components/time-picker.jsx
constant INTERVAL (line 8) | const INTERVAL = [30, 'minutes']
class TimePicker (line 10) | class TimePicker extends React.Component {
method constructor (line 28) | constructor(props) {
method componentDidMount (line 36) | componentDidMount() {
method componentWillReceiveProps (line 40) | componentWillReceiveProps(newProps) {
method componentDidUpdate (line 44) | componentDidUpdate() {
method _valToTimeString (line 50) | _valToTimeString(value) {
method _onArrow (line 66) | _onArrow(key) {
method _saveIfValid (line 100) | _saveIfValid(rawText = "") {
method _shouldAddTwelve (line 116) | _shouldAddTwelve(rawText) {
method _fixTimeOptionScroll (line 127) | _fixTimeOptionScroll() {
method _onSelectOption (line 137) | _onSelectOption(val) {
method _renderTimeOptions (line 141) | _renderTimeOptions() {
method render (line 204) | render() {
FILE: packages/client-app/src/components/toast.jsx
class Toast (line 5) | class Toast extends Component {
method constructor (line 21) | constructor(props) {
method componentDidMount (line 30) | componentDidMount() {
method componentWillReceiveProps (line 35) | componentWillReceiveProps(nextProps) {
method componentDidUpdate (line 39) | componentDidUpdate() {
method componentWillUnmount (line 43) | componentWillUnmount() {
method _clearTimeout (line 49) | _clearTimeout() {
method _ensureTimeout (line 54) | _ensureTimeout() {
method render (line 75) | render() {
FILE: packages/client-app/src/components/tokenizing-text-field.jsx
class SizeToFitInput (line 12) | class SizeToFitInput extends React.Component {
method constructor (line 17) | constructor(props) {
method componentDidMount (line 22) | componentDidMount() {
method componentDidUpdate (line 26) | componentDidUpdate() {
method _sizeToFit (line 30) | _sizeToFit() {
method select (line 46) | select() {
method selectionRange (line 50) | selectionRange() {
method focus (line 58) | focus() {
method render (line 62) | render() {
class Token (line 72) | class Token extends React.Component {
method constructor (line 92) | constructor(props) {
method componentWillReceiveProps (line 100) | componentWillReceiveProps(props) {
method componentDidUpdate (line 108) | componentDidUpdate(prevProps, prevState) {
method _renderEditing (line 114) | _renderEditing() {
method _renderViewing (line 128) | _renderViewing() {
method render (line 211) | render() {
class TokenizingTextField (line 226) | class TokenizingTextField extends React.Component {
method constructor (line 377) | constructor(props) {
method componentDidMount (line 386) | componentDidMount() {
method componentWillReceiveProps (line 395) | componentWillReceiveProps(newProps) {
method componentWillUnmount (line 405) | componentWillUnmount() {
method _clearInput (line 599) | _clearInput() {
method focus (line 604) | focus() {
method _selectedTokens (line 673) | _selectedTokens() {
method _inputComponent (line 826) | _inputComponent() {
method _placeholderComponent (line 854) | _placeholderComponent() {
method _atMaxTokens (line 863) | _atMaxTokens() {
method _renderPromptComponent (line 868) | _renderPromptComponent() {
method _fieldComponents (line 875) | _fieldComponents() {
method _fieldComponent (line 905) | _fieldComponent() {
method render (line 931) | render() {
FILE: packages/client-app/src/components/undo-toast.jsx
function UndoToast (line 6) | function UndoToast(props) {
FILE: packages/client-app/src/components/webview.jsx
class InitialLoadingCover (line 10) | class InitialLoadingCover extends React.Component {
method constructor (line 17) | constructor(props) {
method componentDidMount (line 22) | componentDidMount() {
method componentWillUnmount (line 28) | componentWillUnmount() {
method render (line 33) | render() {
class Webview (line 68) | class Webview extends React.Component {
method constructor (line 76) | constructor(props) {
method componentDidMount (line 84) | componentDidMount() {
method componentWillReceiveProps (line 89) | componentWillReceiveProps(nextProps = {}) {
method componentWillUnmount (line 96) | componentWillUnmount() {
method _setupWebview (line 100) | _setupWebview(props) {
method render (line 170) | render() {
FILE: packages/client-app/src/decorators/inflates-draft-client-id.jsx
function InflatesDraftClientId (line 6) | function InflatesDraftClientId(ComposedComponent) {
FILE: packages/client-app/src/error-logger-extensions/nylas-private-error-reporter.js
class ErrorReporter (line 15) | class ErrorReporter {
method constructor (line 17) | constructor(modes) {
method onDidLogAPIError (line 41) | onDidLogAPIError(error, statusCode, message) { // eslint-disable-line
method getVersion (line 45) | getVersion() {
method reportError (line 52) | reportError(err, extra) {
method _shouldReportError (line 88) | _shouldReportError(extra = {}) {
method _setupSentry (line 123) | _setupSentry() {
method _prepareSentryCaptureObjects (line 141) | _prepareSentryCaptureObjects(error, extra) {
FILE: packages/client-app/src/error-logger.js
function ErrorLogger (line 37) | function ErrorLogger(args) {
function hook_process_output (line 241) | function hook_process_output(channel, callback) {
FILE: packages/client-app/src/flux/stores/feature-usage-store.jsx
class NoProAccess (line 10) | class NoProAccess extends Error { }
class FeatureUsageStore (line 58) | class FeatureUsageStore extends NylasStore {
method constructor (line 59) | constructor() {
method activate (line 65) | activate() {
method deactivate (line 76) | deactivate() {
method asyncUseFeature (line 81) | async asyncUseFeature(feature, {lexicon = {}} = {}) {
method _modalText (line 117) | _modalText(feature, lexicon = {}) {
method _featureData (line 146) | _featureData(feature) {
method _isUsable (line 155) | _isUsable(feature) {
method _markFeatureUsed (line 164) | async _markFeatureUsed(featureName) {
method _featureUsage (line 172) | _featureUsage() {
FILE: packages/client-app/src/flux/stores/modal-store.jsx
constant CONTAINER_ID (line 8) | const CONTAINER_ID = "nylas-modal-container";
function createContainer (line 10) | function createContainer(id) {
class ModalStore (line 16) | class ModalStore extends NylasStore {
method constructor (line 18) | constructor(containerId = CONTAINER_ID) {
FILE: packages/client-app/src/flux/stores/popover-store.jsx
constant CONTAINER_ID (line 8) | const CONTAINER_ID = "nylas-popover-container";
function createContainer (line 10) | function createContainer(id) {
class PopoverStore (line 16) | class PopoverStore extends NylasStore {
method constructor (line 18) | constructor(containerId = CONTAINER_ID) {
FILE: packages/client-app/src/searchable-components/searchable-component-maker.jsx
class SearchableComponent (line 7) | class SearchableComponent {
method componentDidMount (line 8) | componentDidMount(superMethod, ...args) {
method _onSearchableComponentStoreChange (line 15) | _onSearchableComponentStoreChange() {
method shouldComponentUpdate (line 24) | shouldComponentUpdate(superMethod, nextProps, nextState) {
method componentWillUnmount (line 35) | componentWillUnmount(superMethod, ...args) {
method componentDidUpdate (line 41) | componentDidUpdate(superMethod, ...args) {
method render (line 46) | render(superMethod, ...args) {
class SearchableComponentMaker (line 65) | class SearchableComponentMaker {
method extend (line 66) | static extend(component) {
method searchInIframe (line 80) | static searchInIframe(contentDocument) {
FILE: packages/client-app/static/animations/inbox-zero/airstrip/airstrip.hyperesources/airstrip_hype_generated_script.js
function l (line 3) | function l(a,b,d){var c=!1;null==window[a]&&(null==window[b]?(window[b]=...
FILE: packages/client-app/static/animations/inbox-zero/galaxy/galaxy.hyperesources/galaxy_hype_generated_script.js
function l (line 3) | function l(a,b,d){var c=!1;null==window[a]&&(null==window[b]?(window[b]=...
FILE: packages/client-app/static/animations/inbox-zero/gem/gem.hyperesources/gemslower_hype_generated_script.js
function l (line 3) | function l(a,b,d){var c=!1;null==window[a]&&(null==window[b]?(window[b]=...
FILE: packages/client-app/static/animations/inbox-zero/oasis/oasis.hyperesources/oasis_hype_generated_script.js
function l (line 3) | function l(a,b,d){var c=!1;null==window[a]&&(null==window[b]?(window[b]=...
FILE: packages/client-app/static/animations/inbox-zero/tron/tron.hyperesources/tron_hype_generated_script.js
function l (line 3) | function l(a,b,d){var c=!1;null==window[a]&&(null==window[b]?(window[b]=...
FILE: packages/client-app/static/index.js
function setLoadTime (line 15) | function setLoadTime (loadTime) {
function handleSetupError (line 23) | function handleSetupError (error) {
function copyEnvFromMainProcess (line 39) | function copyEnvFromMainProcess() {
function setupWindow (line 46) | function setupWindow (loadSettings) {
function setupVmCompatibility (line 75) | function setupVmCompatibility () {
FILE: packages/client-app/static/package-template/lib/my-composer-button.jsx
class MyComposerButton (line 3) | class MyComposerButton extends React.Component {
method shouldComponentUpdate (line 17) | shouldComponentUpdate(nextProps) {
method _getDialog (line 42) | _getDialog() {
method render (line 46) | render() {
FILE: packages/client-app/static/package-template/lib/my-message-sidebar.jsx
class MyMessageSidebar (line 6) | class MyMessageSidebar extends React.Component {
method constructor (line 16) | constructor(props) {
method componentDidMount (line 21) | componentDidMount() {
method componentWillUnmount (line 25) | componentWillUnmount() {
method _renderContent (line 39) | _renderContent() {
method _renderPlaceholder (line 54) | _renderPlaceholder() {
method render (line 60) | render() {
FILE: packages/client-sync/spec/helpers.js
constant FIXTURES_PATH (line 5) | const FIXTURES_PATH = path.join(__dirname, 'fixtures');
constant ACCOUNT_ID (line 6) | const ACCOUNT_ID = 'test-account-id';
function forEachJSONFixture (line 8) | function forEachJSONFixture(relativePath, callback) {
function forEachHTMLAndTXTFixture (line 17) | function forEachHTMLAndTXTFixture(relativePath, callback) {
function getTestDatabase (line 28) | async function getTestDatabase(accountId = ACCOUNT_ID) {
function destroyTestDatabase (line 33) | function destroyTestDatabase(accountId = ACCOUNT_ID) {
function mockImapBox (line 37) | function mockImapBox() {
FILE: packages/client-sync/spec/message-processor/detect-thread-spec.js
function messagesFromFixture (line 6) | function messagesFromFixture({Message}, folder, name) {
FILE: packages/client-sync/src/local-api/routes/auth.js
function upsertAccount (line 7) | async function upsertAccount(accountParams, credentials) {
FILE: packages/client-sync/src/local-api/routes/categories.js
method handler (line 28) | async handler(request, reply) {
method handler (line 57) | async handler(request, reply) {
method handler (line 90) | async handler(request, reply) {
FILE: packages/client-sync/src/local-api/routes/contacts.js
constant LOOKBACK_TIME (line 5) | const LOOKBACK_TIME = moment.duration(2, 'years').asMilliseconds();
constant MIN_MESSAGE_WEIGHT (line 6) | const MIN_MESSAGE_WEIGHT = 0.01;
FILE: packages/client-sync/src/local-api/routes/send.js
method handler (line 36) | async handler(request, reply) {
FILE: packages/client-sync/src/local-api/search.js
constant MAX_IMAP_TIMEOUT_ERRORS (line 14) | const MAX_IMAP_TIMEOUT_ERRORS = 5;
class SearchFolder (line 43) | class SearchFolder {
method constructor (line 44) | constructor(folder, criteria) {
method description (line 49) | description() {
method run (line 53) | run(db, imap) {
class ImapSearchClient (line 60) | class ImapSearchClient {
method constructor (line 61) | constructor(account) {
method _getFoldersForSearch (line 67) | async _getFoldersForSearch(db, query) {
method _getCriteriaForQuery (line 104) | _getCriteriaForQuery(query, folder) {
method _search (line 108) | async _search(db, query) {
method _searchFolder (line 158) | _searchFolder(conn, folder, criteria) {
method cancelSearchRequest (line 166) | cancelSearchRequest() {
method _cancelSyncbackTasks (line 170) | async _cancelSyncbackTasks(db) {
method searchThreads (line 182) | async searchThreads(db, query, limit) {
class GmailSearchClient (line 252) | class GmailSearchClient extends ImapSearchClient {
method _getFoldersForSearch (line 253) | async _getFoldersForSearch(db/* , query*/) {
method _getCriteriaForQuery (line 258) | _getCriteriaForQuery(query/* , folder*/) {
FILE: packages/client-sync/src/local-api/serialization.js
function replacer (line 3) | function replacer(key, value) {
function jsonSchema (line 8) | function jsonSchema(modelName) {
function jsonStringify (line 57) | function jsonStringify(models) {
FILE: packages/client-sync/src/local-sync-dashboard/dropdown.jsx
class Dropdown (line 3) | class Dropdown extends React.Component {
method constructor (line 4) | constructor(props) {
method open (line 13) | open() {
method selectAndClose (line 17) | selectAndClose(selection) {
method close (line 25) | close() {
method render (line 29) | render() {
FILE: packages/client-sync/src/local-sync-dashboard/elapsed-time.jsx
class ElapsedTime (line 8) | class ElapsedTime extends React.Component {
method constructor (line 9) | constructor(props) {
method componentDidMount (line 16) | componentDidMount() {
method componentWillUnmount (line 25) | componentWillUnmount() {
method render (line 29) | render() {
FILE: packages/client-sync/src/local-sync-dashboard/modal.jsx
class Modal (line 3) | class Modal extends React.Component {
method constructor (line 4) | constructor(props) {
method componentDidMount (line 13) | componentDidMount() {
method componentWillUnmount (line 23) | componentWillUnmount() {
method open (line 27) | open() {
method close (line 32) | close() {
method renderActionElem (line 39) | renderActionElem({title, type = 'button', action = () => {}, className...
method render (line 58) | render() {
FILE: packages/client-sync/src/local-sync-dashboard/root.jsx
function calcAcctPosition (line 15) | function calcAcctPosition(count) {
function formatSyncTimes (line 30) | function formatSyncTimes(timestamp) {
class AccountCard (line 34) | class AccountCard extends React.Component {
method renderError (line 57) | renderError() {
method render (line 76) | render() {
class Root (line 119) | class Root extends React.Component {
method constructor (line 122) | constructor() {
method componentDidMount (line 131) | componentDidMount() {
method componentWillUnmount (line 144) | componentWillUnmount() {
method render (line 148) | render() {
FILE: packages/client-sync/src/local-sync-dashboard/set-all-sync-policies.jsx
class SetAllSyncPolicies (line 4) | class SetAllSyncPolicies extends React.Component {
method applyToAllAccounts (line 6) | applyToAllAccounts(accountIds) {
method render (line 26) | render() {
FILE: packages/client-sync/src/local-sync-dashboard/sync-graph.jsx
class SyncGraph (line 8) | class SyncGraph extends React.Component {
method componentDidMount (line 9) | componentDidMount() {
method componentDidUpdate (line 20) | componentDidUpdate() {
method componentWillUnmount (line 24) | componentWillUnmount() {
method drawGraph (line 28) | drawGraph(isInitial) {
method render (line 82) | render() {
FILE: packages/client-sync/src/local-sync-dashboard/syncback-request-details.jsx
class SyncbackRequestDetails (line 5) | class SyncbackRequestDetails extends React.Component {
method constructor (line 6) | constructor(props) {
method getDetails (line 17) | getDetails() {
method getCounts (line 33) | getCounts() {
method setStatusFilter (line 50) | setStatusFilter(statusFilter) {
method setAutoRefresh (line 54) | setAutoRefresh() {
method render (line 67) | render() {
FILE: packages/client-sync/src/local-sync-worker/imap-helpers.js
method messagesForThreadByFolder (line 5) | async messagesForThreadByFolder(db, threadId) {
method forEachFolderOfThread (line 14) | async forEachFolderOfThread({db, imap, threadMessages, callback}) {
method forEachLabelSetOfMessages (line 32) | async forEachLabelSetOfMessages({messages, callback}) {
method openMessageBox (line 69) | async openMessageBox({messageId, db, imap}) {
method setLabelsForMessages (line 80) | async setLabelsForMessages({db, box, messages, labelIds}) {
FILE: packages/client-sync/src/local-sync-worker/index.js
function ensureK2Consistency (line 12) | async function ensureK2Consistency() {
FILE: packages/client-sync/src/local-sync-worker/sync-task-factory.js
class SyncTaskFactory (line 2) | class SyncTaskFactory {
method create (line 4) | static create(taskName, ...args) {
FILE: packages/client-sync/src/local-sync-worker/sync-tasks/sync-task.js
class SyncTask (line 13) | class SyncTask extends Interruptible {
method constructor (line 15) | constructor({account} = {}) {
method description (line 24) | description() {
method run (line 32) | async run(...args) {
method runTask (line 71) | * runTask(db, imap, syncWorker) { // eslint-disable-line
FILE: packages/client-sync/src/local-sync-worker/syncback-task-factory.js
class SyncbackTaskFactory (line 6) | class SyncbackTaskFactory {
method create (line 8) | static create(account, syncbackRequest) {
FILE: packages/client-sync/src/message-processor/detect-thread.js
function cleanSubject (line 4) | function cleanSubject(subject = "") {
function emptyThread (line 9) | function emptyThread({Thread, accountId}, options = {}) {
function findOrBuildByReferences (line 17) | async function findOrBuildByReferences(db, message) {
function findOrBuildByRemoteThreadId (line 42) | async function findOrBuildByRemoteThreadId(db, remoteThreadId) {
function detectThread (line 51) | async function detectThread({db, messageValues}) {
FILE: packages/client-sync/src/message-processor/extract-contacts.js
function isContactMeaningful (line 3) | function isContactMeaningful(contact) {
function extractContacts (line 16) | async function extractContacts({db, messageValues, logger = console} = {...
FILE: packages/client-sync/src/message-processor/extract-files.js
function collectFilesFromStruct (line 3) | function collectFilesFromStruct({db, messageValues, struct, fileIds = ne...
function extractFiles (line 50) | async function extractFiles({db, messageValues, struct}) {
FILE: packages/client-sync/src/message-processor/index.js
constant MAX_QUEUE_LENGTH (line 14) | const MAX_QUEUE_LENGTH = 500
constant MAX_CPU_USE_ON_AC (line 19) | const MAX_CPU_USE_ON_AC = 0.5;
constant MAX_CPU_USE_ON_BATTERY (line 20) | const MAX_CPU_USE_ON_BATTERY = 0.05;
constant MAX_CHUNK_SIZE (line 21) | const MAX_CHUNK_SIZE = 1;
class MessageProcessor (line 23) | class MessageProcessor {
method constructor (line 25) | constructor() {
method queueLength (line 33) | queueLength() {
method queueIsFull (line 37) | queueIsFull() {
method _maxCPUForProcessing (line 41) | _maxCPUForProcessing() {
method _computeThrottlingTimeout (line 48) | _computeThrottlingTimeout() {
method queueMessageForProcessing (line 59) | queueMessageForProcessing({accountId, folderId, imapMessage, struct, d...
method _processMessage (line 108) | async _processMessage({db, accountId, folder, imapMessage, struct, des...
method _onError (line 184) | async _onError({imapMessage, desiredParts, folder, err, logger}) {
method _addReferences (line 218) | async _addReferences(db, message, thread, references) {
method _processNewMessage (line 246) | async _processNewMessage({messageValues, struct, logger = console} = {...
method _processExistingMessage (line 297) | async _processExistingMessage({existingMessage, messageValues, struct}...
FILE: packages/client-sync/src/models/contact.js
method hash (line 21) | hash({email}) {
method toJSON (line 26) | toJSON() {
FILE: packages/client-sync/src/models/file.js
constant MAX_IMAP_TIMEOUT_ERRORS (line 10) | const MAX_IMAP_TIMEOUT_ERRORS = 5;
method fetch (line 35) | async fetch({account, db, logger}) {
method toJSON (line 111) | toJSON() {
FILE: packages/client-sync/src/models/label.js
method associate (line 13) | associate({Label, Message, MessageLabel, Thread, ThreadLabel}) {
method findXGMLabels (line 18) | findXGMLabels(xGmLabels, {preloadedLabels} = {}) {
method hash (line 35) | hash({boxName, accountId}) {
method imapLabelIdentifier (line 40) | imapLabelIdentifier() {
method toJSON (line 47) | toJSON() {
FILE: packages/client-sync/src/models/message.js
constant MAX_IMAP_TIMEOUT_ERRORS (line 12) | const MAX_IMAP_TIMEOUT_ERRORS = 5;
function validateRecipientsPresent (line 14) | function validateRecipientsPresent(message) {
method uploadStructure (line 80) | uploadStructure(stringifiedArr) {
method associate (line 103) | associate({Message, Folder, Label, File, Thread, MessageLabel, Reference...
method hash (line 114) | hash({from = [], to = [], cc = [], bcc = [], date = '', subject = '', he...
method dateString (line 123) | dateString(strOrDate) {
method buildHeaderMessageId (line 131) | buildHeaderMessageId(id) {
method requiredAssociationsForJSON (line 135) | requiredAssociationsForJSON({Folder, Label, File}) {
method getRecipients (line 144) | getRecipients() {
method setLabelsFromXGM (line 149) | async setLabelsFromXGM(xGmLabels, {Label, preloadedLabels} = {}) {
method setIsSent (line 155) | setIsSent(val) {
method fetchRaw (line 162) | async fetchRaw({account, logger}) {
method toJSON (line 217) | toJSON() {
FILE: packages/client-sync/src/models/syncbackRequest.js
method toJSON (line 39) | toJSON() {
FILE: packages/client-sync/src/models/thread.js
method updateLabelsAndFolders (line 51) | async updateLabelsAndFolders({transaction} = {}) {
method _updateSimpleMessageAttributes (line 77) | _updateSimpleMessageAttributes(message) {
method updateFromMessages (line 111) | async updateFromMessages({db, messages, recompute, transaction} = {}) {
method toJSON (line 193) | toJSON() {
FILE: packages/client-sync/src/shared/imap-paths-utils.js
function formatImapPath (line 1) | function formatImapPath(pathStr) {
FILE: packages/client-sync/src/shared/interruptible.js
class Interruptible (line 36) | class Interruptible extends EventEmitter {
method constructor (line 37) | constructor() {
method interrupt (line 44) | interrupt({forceReject = false} = {}) {
method _runGenerator (line 62) | _runGenerator(generatorObj) {
method run (line 124) | async run(generatorFunc, ctx, ...fnArgs) {
FILE: packages/client-sync/src/shared/local-database-connector.js
class LocalDatabaseConnector (line 11) | class LocalDatabaseConnector {
method constructor (line 12) | constructor() {
method _sequelizePoolForDatabase (line 16) | _sequelizePoolForDatabase(dbname) {
method forAccount (line 32) | forAccount(accountId) {
method ensureAccountDatabase (line 63) | ensureAccountDatabase(accountId) {
method destroyAccountDatabase (line 74) | async destroyAccountDatabase(accountId) {
method _sequelizeForShared (line 99) | _sequelizeForShared() {
method forShared (line 111) | forShared() {
FILE: packages/client-sync/src/shared/transaction-connector.js
class TransactionConnector (line 4) | class TransactionConnector extends EventEmitter {
method notifyDelta (line 5) | notifyDelta(accountId, transaction) {
method getObservableForAccountId (line 9) | getObservableForAccountId(accountId) {
FILE: packages/cloud-api/src/serialization.js
function replacer (line 3) | function replacer(key, value) {
function jsonSchema (line 8) | function jsonSchema(modelName) {
function jsonStringify (line 23) | function jsonStringify(models) {
FILE: packages/cloud-core/log-streams.js
class StringStream (line 5) | class StringStream extends stream.Writable {
method constructor (line 6) | constructor() {
method _write (line 11) | _write(chunk, enc, next) {
method toString (line 16) | toString() {
method reset (line 20) | reset() {
FILE: packages/cloud-core/logger.js
constant NODE_ENV (line 3) | const NODE_ENV = process.env.NODE_ENV || 'unknown'
function createLogger (line 52) | function createLogger(name, env = NODE_ENV) {
FILE: packages/cloud-core/models/metadata.js
method toJSON (line 22) | toJSON() {
method updateValue (line 34) | updateValue(value, {transaction} = {}) {
method clearExpiration (line 46) | async clearExpiration({transaction} = {}) {
FILE: packages/cloud-core/pubsub-connector.js
class PubsubConnector (line 9) | class PubsubConnector {
method constructor (line 10) | constructor() {
method buildClient (line 16) | buildClient(accountId, {onClose} = {}) {
method broadcastClient (line 30) | broadcastClient() {
method notifyDelta (line 42) | notifyDelta(accountId, transactionJSON) {
method observeDeltas (line 46) | observeDeltas(accountId) {
FILE: packages/isomorphic-core/src/database-types.js
method JSONColumn (line 4) | JSONColumn(fieldName, options = {}) {
method JSONArrayColumn (line 26) | JSONArrayColumn(fieldName, options = {}) {
FILE: packages/isomorphic-core/src/delta-stream-builder.js
constant DELTA_CONNECTION_TIMEOUT_MS (line 4) | const DELTA_CONNECTION_TIMEOUT_MS = 15 * 60000;
constant OBSERVABLE_TIMEOUT_MS (line 5) | const OBSERVABLE_TIMEOUT_MS = DELTA_CONNECTION_TIMEOUT_MS - (1 * 60000);
function inflateTransactions (line 14) | function inflateTransactions(db, accountId, transactions = [], sourceNam...
function stringifyTransactions (line 54) | function stringifyTransactions(db, accountId, transactions = [], sourceN...
function transactionsSinceCursor (line 61) | function transactionsSinceCursor(db, cursor, accountId) {
method buildAPIStream (line 67) | buildAPIStream(request, {databasePromise, cursor, accountId, deltasSourc...
method buildDeltaObservable (line 107) | buildDeltaObservable({db, cursor, accountId, deltasSource}) {
method buildCursor (line 116) | buildCursor({databasePromise}) {
FILE: packages/isomorphic-core/src/load-models.js
function loadModels (line 5) | function loadModels(Sequelize, sequelize, {loadShared = true, modelDirs ...
FILE: packages/isomorphic-core/src/models/account.js
method associate (line 34) | associate(data = {}) {
method hash (line 37) | hash({emailAddress, connectionSettings} = {}) {
method upsertWithCredentials (line 41) | upsertWithCredentials(accountParams, credentials) {
method toJSON (line 61) | toJSON() {
method errored (line 78) | errored() {
method setCredentials (line 82) | setCredentials(json) {
method decryptedCredentials (line 97) | decryptedCredentials() {
method smtpConfig (line 114) | smtpConfig() {
FILE: packages/isomorphic-core/src/promise-utils.js
function sleep (line 11) | function sleep(ms) {
function each (line 15) | function each(iterable, iterator) {
function promisify (line 27) | function promisify(nodeFn) {
function promisifyAll (line 41) | function promisifyAll(obj) {
FILE: scripts/daily.js
constant TMP_DIR (line 8) | const TMP_DIR = path.join(__dirname, '..', 'tmp')
function spawn (line 10) | async function spawn(cmd, args, opts = {}) {
function exec (line 21) | function exec(cmd, opts = {}) {
function git (line 32) | function git(subCmd, opts = {}) {
function prependToFile (line 43) | async function prependToFile(filepath, string) {
function sliceFileLines (line 49) | async function sliceFileLines(filepath, idx) {
function updateChangelogFile (line 54) | async function updateChangelogFile(changelogString) {
function getFormattedLogs (line 60) | function getFormattedLogs(mainLog) {
function getChangelogHeader (line 71) | function getChangelogHeader(nextVersion) {
function validateArgs (line 82) | function validateArgs(args) {
function main (line 93) | async function main(args) {
FILE: scripts/upload-benchmark-data.py
function usage (line 16) | def usage():
function anymean (line 20) | def anymean(filename):
function update_spreadsheet (line 30) | def update_spreadsheet(datadir):
function main (line 60) | def main():
Condensed preview — 1760 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (8,976K chars).
[
{
"path": ".babelrc",
"chars": 77,
"preview": "{\n \"presets\": [\n \"electron\",\n \"react\"\n ],\n \"sourceMaps\": \"inline\"\n}\n"
},
{
"path": ".coffeelint.json",
"chars": 2207,
"preview": "{\n \"arrow_spacing\": {\n \"level\": \"ignore\"\n },\n \"camel_case_classes\": {\n \"level\": \"error\"\n },\n "
},
{
"path": ".dockerignore",
"chars": 356,
"preview": ".arc*\n.git*\narclib\n**/node_modules\npackages/client-*\n!packages/client-app/.babelrc\n\n*.swp\n*~\n.DS_Store\n**/npm-debug.log\n"
},
{
"path": ".ebextensions/enable_docker_cli_on_ssh.config",
"chars": 437,
"preview": "# This lets you log in via `eb ssh` and access the docker daemon.\n# If we don't add the ec2-user to the docker group, th"
},
{
"path": ".ebignore",
"chars": 359,
"preview": ".arc*\n.git*\narclib/\n**/node_modules/\npackages/client-*\n!packages/client-app/.babelrc\n\n*.swp\n*~\n.DS_Store\n**/npm-debug.lo"
},
{
"path": ".eslintrc",
"chars": 2652,
"preview": "{\n \"parser\": \"babel-eslint\",\n \"extends\": \"airbnb\",\n \"globals\": {\n \"NylasEnv\": false,\n \"$n\": false,\n \"waitsFo"
},
{
"path": ".gitignore",
"chars": 1143,
"preview": "##### Elastic Beanstalk Files\n.elasticbeanstalk/*\n!.elasticbeanstalk/*.cfg.yml\n!.elasticbeanstalk/*.global.yml\n\n##### Ar"
},
{
"path": ".travis.yml",
"chars": 943,
"preview": "# The private Nylas monorepo build script. This will build a full signed\n# release for the Nylas Mail client\nsudo: false"
},
{
"path": "Dockerfile",
"chars": 1105,
"preview": "# This Dockerfile builds a production-ready image of K2 to be used across all\n# services. See the Dockerfile documentati"
},
{
"path": "ISSUE_TEMPLATE.md",
"chars": 488,
"preview": "\n##### IMPORTANT: Nylas Mail is no longer maintained\n\nNylas Mail is no longer maintained by Nylas - nobody will read or "
},
{
"path": "LICENSE.md",
"chars": 1068,
"preview": "MIT License\n\nCopyright (c) 2017 Nylas, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining a cop"
},
{
"path": "README.md",
"chars": 12073,
"preview": "# Nylas Mail - the open-source, extensible mail client\n\n\n + Remove unnecessary tracking events\n\n### 2.0.31 (4/28/2017)\n\n- Fixes:\n"
},
{
"path": "packages/client-app/CONFIGURATION.md",
"chars": 649,
"preview": "# Configuration\n\nThis document outlines configuration options which aren't exposed via N1's\npreferences interface but ma"
},
{
"path": "packages/client-app/CONTRIBUTING.md",
"chars": 4173,
"preview": "# Filing an Issue\n\nThanks for checking out N1! If you have a feature request, be sure to check out the [open source road"
},
{
"path": "packages/client-app/LICENSE.md",
"chars": 1068,
"preview": "MIT License\n\nCopyright (c) 2017 Nylas, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining a cop"
},
{
"path": "packages/client-app/README.md",
"chars": 8788,
"preview": "# Nylas Mail - the open-source, extensible mail client\n to build packages\nwhen users choose to install them. This "
},
{
"path": "packages/client-app/apm/package.json",
"chars": 220,
"preview": "{\n \"name\": \"n1-bundled-apm\",\n \"description\": \"N1's bundled apm\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"http"
},
{
"path": "packages/client-app/build/Gruntfile.js",
"chars": 2833,
"preview": "/* eslint global-require: 0 */\n/* eslint import/no-dynamic-require: 0 */\nconst path = require('path');\n\nmodule.exports ="
},
{
"path": "packages/client-app/build/README.md",
"chars": 690,
"preview": "# N1 Build Environment\nNode version 0.10.x (Due to the version of electron currently used.)\n\n# N1 Building and Tasks\n\nTh"
},
{
"path": "packages/client-app/build/config/coffeelint.json",
"chars": 325,
"preview": "{\n \"max_line_length\": {\n \"level\": \"ignore\"\n },\n \"no_empty_param_list\": {\n \"level\": \"error\"\n },\n \"arrow_spacin"
},
{
"path": "packages/client-app/build/docs_templates/_function.html",
"chars": 1020,
"preview": "<h4 id={{name}} class=\"function-name\">\n {{name}}(<span class=\"args\">{{#each arguments}}<span class=\"arg\">{{#if isOption"
},
{
"path": "packages/client-app/build/docs_templates/_property.html",
"chars": 407,
"preview": "<h4 id={{name}}>{{name}} <a href=\"#{{name}}\" class=\"link\"></a></h4>\n<p>{{{description}}}</p>\n{{#if arguments.length}}\n<t"
},
{
"path": "packages/client-app/build/docs_templates/class.md",
"chars": 608,
"preview": "# {{ name }}\n\n## Summary\n\n{{{documentation.description}}}\n\n<ul>\n {{#each documentation.sections}}\n <li><a href=\"#{"
},
{
"path": "packages/client-app/build/docs_templates/sidebar.md",
"chars": 834,
"preview": "{{!-- This is our preferred ordering, so do it manually! --}}\n## General\n{{#each sidebar.General}}\n* [{{this}}](/classes"
},
{
"path": "packages/client-app/build/resources/asar-ordering-hint.txt",
"chars": 227958,
"preview": "956764: package.json\n1760546: src/browser/main.js\n1766806: node_modules/fs-plus/package.json\n1768751: node_modules/fs-pl"
},
{
"path": "packages/client-app/build/resources/linux/debian/control.in",
"chars": 434,
"preview": "Package: <%= name %>\nVersion: <%= version %>\nDepends: libgnome-keyring0, gir1.2-gnomekeyring-1.0, git, gconf2, gconf-ser"
},
{
"path": "packages/client-app/build/resources/linux/debian/lintian-overrides",
"chars": 394,
"preview": "nylas: arch-dependent-file-in-usr-share\nnylas: changelog-file-missing-in-native-package\nnylas: copyright-file-contains-f"
},
{
"path": "packages/client-app/build/resources/linux/debian/postinst",
"chars": 5873,
"preview": "#!/bin/sh\n# postinst script for Nylas\n#\n# see: dh_installdeb(1)\n\n# summary of how this script can be called:\n# * "
},
{
"path": "packages/client-app/build/resources/linux/debian/postrm",
"chars": 1370,
"preview": "#!/bin/sh\n# Remove the Nylas repository.\n# Copyright (c) 2009 The Chromium Authors. All rights reserved.\n# Use of this s"
},
{
"path": "packages/client-app/build/resources/linux/nylas-mail.desktop.in",
"chars": 336,
"preview": "[Desktop Entry]\nName=<%= productName %>\nComment=<%= description %>\nGenericName=<%= productName %>\nExec=/usr/bin/nylas-ma"
},
{
"path": "packages/client-app/build/resources/linux/redhat/nylas.spec.in",
"chars": 1314,
"preview": "Name: <%= name %>\nVersion: <%= version %>\nRelease: 0.1%{?dist}\nSummary: <%= description %"
},
{
"path": "packages/client-app/build/resources/mac/Nylas Calendar.app/Contents/Info.plist",
"chars": 1705,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "packages/client-app/build/resources/mac/Nylas Calendar.app/Contents/PkgInfo",
"chars": 8,
"preview": "APPL????"
},
{
"path": "packages/client-app/build/resources/mac/Nylas Calendar.app/Contents/_CodeSignature/CodeResources",
"chars": 2755,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "packages/client-app/build/resources/mac/nylas-Info.plist",
"chars": 578,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "packages/client-app/build/resources/win/elevate.cmd",
"chars": 80,
"preview": "@setlocal\n@echo off\nset CMD=%*\nset APP=%1\nstart wscript //nologo \"%~dpn0.vbs\" %*"
},
{
"path": "packages/client-app/build/resources/win/elevate.vbs",
"chars": 334,
"preview": "Set Shell = CreateObject(\"Shell.Application\")\nSet WShell = WScript.CreateObject(\"WScript.Shell\")\nSet ProcEnv = WShell.En"
},
{
"path": "packages/client-app/build/resources/win/nylas-mailto-registration.reg",
"chars": 2183,
"preview": "Windows Registry Editor Version 5.00\n\n[{{HKEY_ROOT}}\\SOFTWARE\\Classes\\Nylas.Url.mailto]\n\"FriendlyTypeName\"=\"Nylas Url\"\n\n"
},
{
"path": "packages/client-app/build/tasks/coffeelint-task.js",
"chars": 618,
"preview": "module.exports = (grunt) => {\n grunt.config.merge({\n coffeelint: {\n 'options': {\n configFile: 'build/con"
},
{
"path": "packages/client-app/build/tasks/create-mac-dmg.js",
"chars": 876,
"preview": "const path = require('path');\nconst createDMG = require('electron-installer-dmg')\n\nmodule.exports = (grunt) => {\n grunt"
},
{
"path": "packages/client-app/build/tasks/create-mac-zip.js",
"chars": 892,
"preview": "/* eslint prefer-template: 0 */\n/* eslint global-require: 0 */\n/* eslint quote-props: 0 */\nconst path = require('path');"
},
{
"path": "packages/client-app/build/tasks/csslint-task.js",
"chars": 935,
"preview": "module.exports = (grunt) => {\n grunt.config.merge({\n csslint: {\n options: {\n 'adjoining-classes': false,"
},
{
"path": "packages/client-app/build/tasks/docs-build-task.js",
"chars": 6255,
"preview": "const path = require('path');\nconst cjsxtransform = require('coffee-react-transform');\nconst rimraf = require('rimraf');"
},
{
"path": "packages/client-app/build/tasks/docs-render-task.js",
"chars": 7104,
"preview": "const path = require('path');\nconst Handlebars = require('handlebars');\nconst marked = require('meta-marked');\nconst fs "
},
{
"path": "packages/client-app/build/tasks/docs-task.js",
"chars": 5349,
"preview": "const path = require('path');\nconst cjsxtransform = require('coffee-react-transform');\nconst rimraf = require('rimraf');"
},
{
"path": "packages/client-app/build/tasks/eslint-task.js",
"chars": 1713,
"preview": "const chalk = require('chalk');\nconst eslint = require('eslint');\n\nmodule.exports = (grunt) => {\n grunt.config.merge({\n"
},
{
"path": "packages/client-app/build/tasks/installer-linux-task.js",
"chars": 3891,
"preview": "/* eslint global-require:0 */\nconst fs = require('fs');\nconst path = require('path');\nconst _ = require('underscore');\n\n"
},
{
"path": "packages/client-app/build/tasks/lesslint-task.js",
"chars": 438,
"preview": "module.exports = (grunt) => {\n grunt.config.merge({\n lesslint: {\n src: [\n 'internal_packages/**/*.less',"
},
{
"path": "packages/client-app/build/tasks/nylaslint-task.js",
"chars": 7174,
"preview": "/* eslint no-cond-assign: 0 */\nconst path = require('path');\nconst fs = require('fs-plus');\n\nfunction normalizeRequirePa"
},
{
"path": "packages/client-app/build/tasks/package-task.js",
"chars": 10654,
"preview": "/* eslint global-require: 0 *//* eslint prefer-template: 0 */\n/* eslint quote-props: 0 */\nconst packager = require('elec"
},
{
"path": "packages/client-app/build/tasks/task-helpers.js",
"chars": 1100,
"preview": "const childProcess = require('child_process');\n\nmodule.exports = (grunt) => {\n function spawn(options, callback) {\n "
},
{
"path": "packages/client-app/docs/ContinuousIntegration.md",
"chars": 2713,
"preview": "# Building N1 with Continuous Integration\n\n script/grunt ci\n\nN1 is designed to be built into a production app for Mac"
},
{
"path": "packages/client-app/docs/README.md",
"chars": 99,
"preview": "These are now available at [https://nylas.github.io/nylas-mail](https://nylas.github.io/nylas-mail)"
},
{
"path": "packages/client-app/dot-nylas/README.md",
"chars": 123,
"preview": "# Default Config\n\nThese are the default Nylas configs. This folder on setup is copied to\n`~/.nylas-mail` on unix machine"
},
{
"path": "packages/client-app/dot-nylas/config.json",
"chars": 621,
"preview": "{\n \"*\": {\n \"env\": \"production\",\n \"core\": {\n \"themes\": [\n \"ui-light\"\n ],\n \"disabledPackages\""
},
{
"path": "packages/client-app/dot-nylas/keymap.json",
"chars": 0,
"preview": ""
},
{
"path": "packages/client-app/dot-nylas/packages/README.md",
"chars": 60,
"preview": "All packages in this directory will be automatically loaded\n"
},
{
"path": "packages/client-app/internal_packages/account-sidebar/README.md",
"chars": 31,
"preview": "# React version of thread list\n"
},
{
"path": "packages/client-app/internal_packages/account-sidebar/lib/account-commands.coffee",
"chars": 2791,
"preview": "_ = require 'underscore'\n{Actions, MenuHelpers} = require 'nylas-exports'\n\n\nclass AccountCommands\n\n @_focusAccounts: (a"
},
{
"path": "packages/client-app/internal_packages/account-sidebar/lib/components/account-sidebar.cjsx",
"chars": 1827,
"preview": "_ = require 'underscore'\nReact = require 'react'\n{Utils, AccountStore} = require 'nylas-exports'\n{OutlineView, ScrollReg"
},
{
"path": "packages/client-app/internal_packages/account-sidebar/lib/components/account-switcher.cjsx",
"chars": 1388,
"preview": "React = require 'react'\n{Actions} = require 'nylas-exports'\n{RetinaImg} = require 'nylas-component-kit'\nAccountCommands "
},
{
"path": "packages/client-app/internal_packages/account-sidebar/lib/main.coffee",
"chars": 426,
"preview": "React = require \"react\"\nAccountSidebar = require \"./components/account-sidebar\"\n{ComponentRegistry, WorkspaceStore} = re"
},
{
"path": "packages/client-app/internal_packages/account-sidebar/lib/sidebar-actions.coffee",
"chars": 205,
"preview": "Reflux = require 'reflux'\n\nActions = [\n 'focusAccounts',\n 'setKeyCollapsed',\n]\n\nfor idx in Actions\n Actions[idx] = Re"
},
{
"path": "packages/client-app/internal_packages/account-sidebar/lib/sidebar-item.coffee",
"chars": 5947,
"preview": "_ = require 'underscore'\n_str = require 'underscore.string'\n{WorkspaceStore,\n MailboxPerspective,\n FocusedPerspectiveSto"
},
{
"path": "packages/client-app/internal_packages/account-sidebar/lib/sidebar-section.coffee",
"chars": 5990,
"preview": "_ = require 'underscore'\n{Actions,\n SyncbackCategoryTask,\n DestroyCategoryTask,\n CategoryStore,\n Category,\n ExtensionReg"
},
{
"path": "packages/client-app/internal_packages/account-sidebar/lib/sidebar-store.coffee",
"chars": 3948,
"preview": "_ = require 'underscore'\nNylasStore = require 'nylas-store'\n{Actions,\n AccountStore,\n ThreadCountsStore,\n WorkspaceStore"
},
{
"path": "packages/client-app/internal_packages/account-sidebar/package.json",
"chars": 234,
"preview": "{\n \"name\": \"account-sidebar\",\n \"version\": \"0.1.0\",\n \"main\": \"./lib/main\",\n \"description\": \"Sidebar view that shows y"
},
{
"path": "packages/client-app/internal_packages/account-sidebar/spec/sidebar-item-spec.es6",
"chars": 963,
"preview": "import {Category, Actions} from \"nylas-exports\"\nimport SidebarItem from \"../lib/sidebar-item\"\n\ndescribe(\"sidebar-item\", "
},
{
"path": "packages/client-app/internal_packages/account-sidebar/stylesheets/account-sidebar.less",
"chars": 397,
"preview": "@import \"ui-variables\";\n@import \"ui-mixins\";\n\n.account-sidebar {\n flex: 1;\n height: 100%;\n background-color: @source-"
},
{
"path": "packages/client-app/internal_packages/activity-list/lib/activity-data-source.es6",
"chars": 558,
"preview": "import {Rx, Message, DatabaseStore} from 'nylas-exports';\n\nexport default class ActivityDataSource {\n buildObservable({"
},
{
"path": "packages/client-app/internal_packages/activity-list/lib/activity-list-actions.es6",
"chars": 234,
"preview": "import Reflux from 'reflux';\n\nconst ActivityListActions = Reflux.createActions([\n \"resetSeen\",\n]);\n\nfor (const key of O"
},
{
"path": "packages/client-app/internal_packages/activity-list/lib/activity-list-button.jsx",
"chars": 1601,
"preview": "import React from 'react';\nimport {Actions, ReactDOM} from 'nylas-exports';\nimport {RetinaImg} from 'nylas-component-kit"
},
{
"path": "packages/client-app/internal_packages/activity-list/lib/activity-list-empty-state.jsx",
"chars": 668,
"preview": "import React from 'react';\nimport {RetinaImg} from 'nylas-component-kit';\n\nconst ActivityListEmptyState = function Activ"
},
{
"path": "packages/client-app/internal_packages/activity-list/lib/activity-list-item-container.jsx",
"chars": 4143,
"preview": "import React from 'react';\n\nimport {DisclosureTriangle,\n Flexbox,\n RetinaImg} from 'nylas-component-kit';\nimport {Date"
},
{
"path": "packages/client-app/internal_packages/activity-list/lib/activity-list-store.jsx",
"chars": 6837,
"preview": "import NylasStore from 'nylas-store';\nimport {\n Actions,\n Thread,\n DatabaseStore,\n NativeNotifications,\n FocusedPer"
},
{
"path": "packages/client-app/internal_packages/activity-list/lib/activity-list.jsx",
"chars": 2483,
"preview": "import React from 'react';\nimport classnames from 'classnames';\n\nimport {Flexbox,\n ScrollRegion} from 'nylas-component-"
},
{
"path": "packages/client-app/internal_packages/activity-list/lib/main.es6",
"chars": 745,
"preview": "import {ComponentRegistry, WorkspaceStore} from 'nylas-exports';\nimport {HasTutorialTip} from 'nylas-component-kit';\nimp"
},
{
"path": "packages/client-app/internal_packages/activity-list/lib/plugin-helpers.es6",
"chars": 604,
"preview": "\nexport function pluginFor(id) {\n const openTrackingId = NylasEnv.packages.pluginIdFor('open-tracking')\n const linkTra"
},
{
"path": "packages/client-app/internal_packages/activity-list/lib/test-data-source.es6",
"chars": 314,
"preview": "export default class TestDataSource {\n buildObservable() {\n return this;\n }\n\n manuallyTrigger = (messages = []) =>"
},
{
"path": "packages/client-app/internal_packages/activity-list/package.json",
"chars": 411,
"preview": "{\n \"name\": \"activity-list\",\n \"main\": \"./lib/main\",\n \"version\": \"0.1.0\",\n \"repository\": {\n \"type\": \"git\",\n \"url"
},
{
"path": "packages/client-app/internal_packages/activity-list/spec/activity-list-spec.jsx",
"chars": 6008,
"preview": "import React from 'react';\nimport ReactTestUtils from 'react-addons-test-utils';\nimport {\n Thread,\n Actions,\n Contact"
},
{
"path": "packages/client-app/internal_packages/activity-list/stylesheets/activity-list.less",
"chars": 3042,
"preview": "@import \"ui-variables\";\n\n.toolbar-activity {\n order: 100;\n position: relative;\n\n .unread-count {\n display: none;\n "
},
{
"path": "packages/client-app/internal_packages/attachments/lib/main.es6",
"chars": 301,
"preview": "import {ComponentRegistry} from 'nylas-exports';\nimport MessageAttachments from './message-attachments'\n\nexport function"
},
{
"path": "packages/client-app/internal_packages/attachments/lib/message-attachments.jsx",
"chars": 2707,
"preview": "import React, {Component, PropTypes} from 'react'\nimport {Actions, Utils, FileDownloadStore} from 'nylas-exports'\nimport"
},
{
"path": "packages/client-app/internal_packages/attachments/package.json",
"chars": 326,
"preview": "{\n \"name\": \"attachments\",\n \"version\": \"0.1.0\",\n \"main\": \"./lib/main\",\n \"description\": \"View attachments on messages\""
},
{
"path": "packages/client-app/internal_packages/category-mapper/lib/category-selection.jsx",
"chars": 4246,
"preview": "import {\n Menu,\n RetinaImg,\n DropdownMenu,\n LabelColorizer,\n BoldedSearchResult,\n} from 'nylas-component-kit'\nimpor"
},
{
"path": "packages/client-app/internal_packages/category-mapper/lib/main.es6",
"chars": 485,
"preview": "import {PreferencesUIStore} from 'nylas-exports';\nimport PreferencesCategoryMapper from './preferences-category-mapper'\n"
},
{
"path": "packages/client-app/internal_packages/category-mapper/lib/preferences-category-mapper.jsx",
"chars": 3314,
"preview": "import {\n AccountStore,\n Category,\n DatabaseStore,\n NylasAPI,\n NylasAPIRequest,\n React,\n} from 'nylas-exports'\nimp"
},
{
"path": "packages/client-app/internal_packages/category-mapper/package.json",
"chars": 226,
"preview": "{\n \"name\": \"category-mapper\",\n \"version\": \"0.1.0\",\n \"main\": \"./lib/main\",\n \"description\": \"Allow users to manually m"
},
{
"path": "packages/client-app/internal_packages/category-mapper/stylesheets/category-mapper.less",
"chars": 1658,
"preview": "@import \"ui-variables\";\n\n.category-mapper-container {\n width: 40%;\n min-width: 460px;\n margin: 0 auto;\n}\n\n.account-se"
},
{
"path": "packages/client-app/internal_packages/category-picker/lib/category-picker-popover.jsx",
"chars": 9941,
"preview": "/* eslint jsx-a11y/tabindex-no-positive: 0 */\nimport _ from 'underscore'\nimport React, {Component, PropTypes} from 'reac"
},
{
"path": "packages/client-app/internal_packages/category-picker/lib/category-picker.cjsx",
"chars": 2404,
"preview": "_ = require 'underscore'\nReact = require 'react'\nReactDOM = require 'react-dom'\n\n{Actions,\n AccountStore,\n WorkspaceStor"
},
{
"path": "packages/client-app/internal_packages/category-picker/lib/main.cjsx",
"chars": 309,
"preview": "CategoryPicker = require \"./category-picker\"\n\n{ComponentRegistry,\n WorkspaceStore} = require 'nylas-exports'\n\nmodule.exp"
},
{
"path": "packages/client-app/internal_packages/category-picker/package.json",
"chars": 200,
"preview": "{\n \"name\": \"category-picker\",\n \"version\": \"0.1.0\",\n \"main\": \"./lib/main\",\n \"description\": \"Label & Folder Picker\",\n "
},
{
"path": "packages/client-app/internal_packages/category-picker/spec/category-picker-spec.cjsx",
"chars": 7644,
"preview": "_ = require 'underscore'\nReact = require \"react\"\nReactDOM = require 'react-dom'\nReactTestUtils = require 'react-addons-t"
},
{
"path": "packages/client-app/internal_packages/category-picker/stylesheets/category-picker.less",
"chars": 1289,
"preview": "@import \"ui-variables\";\n\n@popover-width: 250px;\n\nbody.platform-win32 {\n .category-picker-popover {\n margin-left: 0;\n"
},
{
"path": "packages/client-app/internal_packages/composer/README.md",
"chars": 19,
"preview": "# composer package\n"
},
{
"path": "packages/client-app/internal_packages/composer/keymaps/composer.json",
"chars": 295,
"preview": "{\n \"composer:focus-to\": \"mod+shift+t\",\n \"composer:show-and-focus-cc\": \"mod+shift+c\",\n \"composer:show-and-focus-bcc\": "
},
{
"path": "packages/client-app/internal_packages/composer/lib/account-contact-field.jsx",
"chars": 2662,
"preview": "import React from 'react';\nimport classnames from 'classnames';\nimport {\n AccountStore,\n} from 'nylas-exports';\nimport "
},
{
"path": "packages/client-app/internal_packages/composer/lib/action-bar-plugins.jsx",
"chars": 2181,
"preview": "import React from 'react'\nimport classnames from 'classnames'\nimport {ComponentRegistry} from 'nylas-exports'\nimport {In"
},
{
"path": "packages/client-app/internal_packages/composer/lib/collapsed-participants.jsx",
"chars": 4813,
"preview": "import React from 'react';\nimport ReactDOM from 'react-dom';\nimport {Utils} from 'nylas-exports';\nimport {DropZone, Inje"
},
{
"path": "packages/client-app/internal_packages/composer/lib/compose-button.jsx",
"chars": 566,
"preview": "import React from 'react';\nimport {Actions} from 'nylas-exports';\nimport {RetinaImg} from 'nylas-component-kit';\n\nexport"
},
{
"path": "packages/client-app/internal_packages/composer/lib/composer-editor.jsx",
"chars": 9154,
"preview": "import React, {Component, PropTypes} from 'react';\nimport {ExtensionRegistry, DOMUtils} from 'nylas-exports';\nimport {Dr"
},
{
"path": "packages/client-app/internal_packages/composer/lib/composer-header-actions.jsx",
"chars": 1992,
"preview": "import React from 'react';\nimport {Actions} from 'nylas-exports';\nimport {RetinaImg} from 'nylas-component-kit';\nimport "
},
{
"path": "packages/client-app/internal_packages/composer/lib/composer-header.jsx",
"chars": 9482,
"preview": "import _ from 'underscore';\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport {Utils, DraftHelpers, Ac"
},
{
"path": "packages/client-app/internal_packages/composer/lib/composer-view.jsx",
"chars": 20027,
"preview": "import React from 'react'\nimport ReactDOM from 'react-dom'\nimport {remote} from 'electron'\nimport {\n Utils,\n Actions,\n"
},
{
"path": "packages/client-app/internal_packages/composer/lib/fields.es6",
"chars": 399,
"preview": "const Fields = {\n To: \"textFieldTo\",\n Cc: \"textFieldCc\",\n Bcc: \"textFieldBcc\",\n From: \"fromField\",\n Subject: \"textF"
},
{
"path": "packages/client-app/internal_packages/composer/lib/image-upload-composer-extension.es6",
"chars": 966,
"preview": "import {\n Actions,\n ComposerExtension,\n} from 'nylas-exports'\n\nexport default class ImageUploadComposerExtension exten"
},
{
"path": "packages/client-app/internal_packages/composer/lib/inline-image-upload-container.jsx",
"chars": 5253,
"preview": "import React, {Component, PropTypes} from 'react';\nimport ReactDOM from 'react-dom';\nimport fs from 'fs';\nimport path fr"
},
{
"path": "packages/client-app/internal_packages/composer/lib/main.jsx",
"chars": 4776,
"preview": "/* eslint react/sort-comp: 0 */\nimport _ from 'underscore';\nimport React from 'react';\nimport {\n Message,\n Actions,\n "
},
{
"path": "packages/client-app/internal_packages/composer/lib/send-action-button.jsx",
"chars": 3580,
"preview": "import React from 'react'\nimport {Actions, SendActionsStore} from 'nylas-exports'\nimport {Menu, RetinaImg, ButtonDropdow"
},
{
"path": "packages/client-app/internal_packages/composer/lib/subject-text-field.jsx",
"chars": 795,
"preview": "import React, {Component, PropTypes} from 'react'\nimport {findDOMNode} from 'react-dom'\n\n\nexport default class SubjectTe"
},
{
"path": "packages/client-app/internal_packages/composer/package.json",
"chars": 339,
"preview": "{\n \"name\": \"composer\",\n \"version\": \"0.1.0\",\n \"main\": \"./lib/main\",\n \"description\": \"Nylas Composer Component\",\n \"li"
},
{
"path": "packages/client-app/internal_packages/composer/spec/collapsed-participants-spec.cjsx",
"chars": 1503,
"preview": "_ = require \"underscore\"\nReact = require \"react\"\nReactDOM = require 'react-dom'\nReactTestUtils = require 'react-addons-t"
},
{
"path": "packages/client-app/internal_packages/composer/spec/composer-header-actions-spec.cjsx",
"chars": 4310,
"preview": "React = require 'react'\nReactDOM = require 'react-dom'\nComposerHeaderActions = require('../lib/composer-header-actions')"
},
{
"path": "packages/client-app/internal_packages/composer/spec/composer-header-spec.jsx",
"chars": 4292,
"preview": "import React from 'react';\nimport ReactDOM from 'react-dom';\nimport ReactTestUtils from 'react-addons-test-utils';\n\nimpo"
},
{
"path": "packages/client-app/internal_packages/composer/spec/composer-view-spec.cjsx",
"chars": 22330,
"preview": "_ = require \"underscore\"\nReact = require \"react\"\nReactDOM = require 'react-dom'\nReactTestUtils = require('react-addons-t"
},
{
"path": "packages/client-app/internal_packages/composer/spec/quoted-text-spec.cjsx",
"chars": 3562,
"preview": "# This tests just quoted text within a contenteditable.\n#\n# For a test of the basic component itself see\n# contenteditab"
},
{
"path": "packages/client-app/internal_packages/composer/spec/send-action-button-spec.jsx",
"chars": 4861,
"preview": "import React from 'react';\nimport {mount} from 'enzyme';\nimport {ButtonDropdown, RetinaImg} from 'nylas-component-kit';\n"
},
{
"path": "packages/client-app/internal_packages/composer/stylesheets/composer.less",
"chars": 12225,
"preview": "// The ui-variables file is provided by base themes provided by N1.\n@import \"ui-variables\";\n@import \"ui-mixins\";\n@import"
},
{
"path": "packages/client-app/internal_packages/composer-emoji/lib/categorized-emoji.es6",
"chars": 22930,
"preview": "const categorizedEmojiList = {\n 'People': [\n 'grinning',\n 'grimacing',\n 'grin',\n 'joy',\n 'smiley',\n '"
},
{
"path": "packages/client-app/internal_packages/composer-emoji/lib/emoji-actions.es6",
"chars": 222,
"preview": "import Reflux from 'reflux';\n\nconst EmojiActions = Reflux.createActions([\n \"selectEmoji\",\n \"useEmoji\",\n]);\n\nfor (const"
},
{
"path": "packages/client-app/internal_packages/composer-emoji/lib/emoji-button-popover.jsx",
"chars": 10147,
"preview": "import React from 'react';\nimport {findDOMNode} from 'react-dom';\nimport {Actions} from 'nylas-exports';\nimport {RetinaI"
},
{
"path": "packages/client-app/internal_packages/composer-emoji/lib/emoji-button.jsx",
"chars": 788,
"preview": "import {Actions, React, ReactDOM} from 'nylas-exports';\nimport {RetinaImg} from 'nylas-component-kit';\n\nimport EmojiButt"
},
{
"path": "packages/client-app/internal_packages/composer-emoji/lib/emoji-composer-extension.jsx",
"chars": 11088,
"preview": "import {DOMUtils, ComposerExtension, RegExpUtils} from 'nylas-exports';\nimport emoji from 'node-emoji';\n\nimport EmojiSto"
},
{
"path": "packages/client-app/internal_packages/composer-emoji/lib/emoji-data.json",
"chars": 552257,
"preview": "{\"emojiData\":[{\"name\":\"COPYRIGHT SIGN\",\"unified\":\"00A9\",\"variations\":[\"00A9-FE0F\"],\"docomo\":\"E731\",\"au\":\"E558\",\"softbank"
},
{
"path": "packages/client-app/internal_packages/composer-emoji/lib/emoji-message-extension.jsx",
"chars": 1391,
"preview": "/* eslint no-cond-assign:0 */\nimport {MessageViewExtension, RegExpUtils} from 'nylas-exports';\nimport emoji from 'node-e"
},
{
"path": "packages/client-app/internal_packages/composer-emoji/lib/emoji-picker.jsx",
"chars": 1835,
"preview": "import {React, ReactDOM} from 'nylas-exports';\nimport emoji from 'node-emoji';\n\nimport EmojiStore from './emoji-store';\n"
},
{
"path": "packages/client-app/internal_packages/composer-emoji/lib/emoji-store.jsx",
"chars": 2107,
"preview": "/* eslint global-require: \"off\" */\n\nimport NylasStore from 'nylas-store';\nimport _ from 'underscore';\n\nimport {Rx, Datab"
},
{
"path": "packages/client-app/internal_packages/composer-emoji/lib/main.es6",
"chars": 750,
"preview": "import {ExtensionRegistry, ComponentRegistry} from 'nylas-exports';\nimport EmojiStore from './emoji-store';\nimport Emoji"
},
{
"path": "packages/client-app/internal_packages/composer-emoji/package.json",
"chars": 500,
"preview": "{\n \"name\": \"composer-emoji\",\n \"main\": \"./lib/main\",\n \"version\": \"0.1.0\",\n \"repository\": {\n \"type\": \"git\",\n \"ur"
},
{
"path": "packages/client-app/internal_packages/composer-emoji/spec/emoji-button-popover-spec.jsx",
"chars": 1795,
"preview": "import React from 'react';\nimport ReactTestUtils from 'react-addons-test-utils';\n\nimport {findDOMNode} from 'react-dom';"
},
{
"path": "packages/client-app/internal_packages/composer-emoji/spec/emoji-composer-extension-spec.jsx",
"chars": 3931,
"preview": "import React from 'react';\nimport ReactDOM from 'react-dom';\nimport ReactTestUtils from 'react-addons-test-utils';\n\nimpo"
},
{
"path": "packages/client-app/internal_packages/composer-emoji/stylesheets/composer-emoji.less",
"chars": 1283,
"preview": "@import \"ui-variables\";\n\n.emoji-picker {\n max-height: 130px !important;\n margin: 10px;\n overflow: auto;\n .btn.btn-ic"
},
{
"path": "packages/client-app/internal_packages/composer-mail-merge/lib/listens-to-mail-merge-session.jsx",
"chars": 1604,
"preview": "/* eslint no-prototype-builtins: 0 */\nimport React, {Component, PropTypes} from 'react';\nimport {mailMergeSessionForDraf"
},
{
"path": "packages/client-app/internal_packages/composer-mail-merge/lib/mail-merge-body-token.jsx",
"chars": 4987,
"preview": "import React, {Component, PropTypes} from 'react'\nimport MailMergeToken from './mail-merge-token'\nimport {DragBehaviors}"
},
{
"path": "packages/client-app/internal_packages/composer-mail-merge/lib/mail-merge-button.jsx",
"chars": 1179,
"preview": "import classnames from 'classnames'\nimport React, {PropTypes} from 'react'\nimport {RetinaImg} from 'nylas-component-kit'"
},
{
"path": "packages/client-app/internal_packages/composer-mail-merge/lib/mail-merge-composer-extension.es6",
"chars": 253,
"preview": "import * as Handlers from './mail-merge-token-dnd-handlers'\n\nexport const name = 'MailMergeComposerExtension'\n\nexport {\n"
},
{
"path": "packages/client-app/internal_packages/composer-mail-merge/lib/mail-merge-constants.es6",
"chars": 864,
"preview": "import plugin from '../package.json'\n\nexport const PLUGIN_ID = plugin.name;\nexport const PLUGIN_NAME = \"Mail Merge\"\nexpo"
},
{
"path": "packages/client-app/internal_packages/composer-mail-merge/lib/mail-merge-container.jsx",
"chars": 1065,
"preview": "import React, {Component, PropTypes} from 'react'\nimport MailMergeWorkspace from './mail-merge-workspace'\nimport Listens"
},
{
"path": "packages/client-app/internal_packages/composer-mail-merge/lib/mail-merge-draft-editing-session.es6",
"chars": 4612,
"preview": "import NylasStore from 'nylas-store'\nimport * as TableStateReducers from './table-state-reducers'\nimport * as TokenState"
},
{
"path": "packages/client-app/internal_packages/composer-mail-merge/lib/mail-merge-header-input.jsx",
"chars": 1699,
"preview": "import React, {Component, PropTypes} from 'react'\nimport {pickHTMLProps} from 'pick-react-known-prop'\nimport MailMergeTo"
},
{
"path": "packages/client-app/internal_packages/composer-mail-merge/lib/mail-merge-participants-text-field.jsx",
"chars": 4114,
"preview": "import React, {Component, PropTypes} from 'react';\nimport classnames from 'classnames'\nimport {DropZone, TokenizingTextF"
},
{
"path": "packages/client-app/internal_packages/composer-mail-merge/lib/mail-merge-send-button.jsx",
"chars": 3458,
"preview": "import {remote} from 'electron'\nimport React, {Component, PropTypes} from 'react'\nimport {RetinaImg} from 'nylas-compone"
},
{
"path": "packages/client-app/internal_packages/composer-mail-merge/lib/mail-merge-subject-text-field.jsx",
"chars": 3613,
"preview": "/* eslint react/no-danger: 0 */\nimport React, {Component, PropTypes} from 'react'\nimport {findDOMNode} from 'react-dom'\n"
},
{
"path": "packages/client-app/internal_packages/composer-mail-merge/lib/mail-merge-table.jsx",
"chars": 1161,
"preview": "import React, {PropTypes} from 'react'\nimport {EditableTable} from 'nylas-component-kit'\nimport {pickHTMLProps} from 'pi"
},
{
"path": "packages/client-app/internal_packages/composer-mail-merge/lib/mail-merge-token-dnd-handlers.es6",
"chars": 1605,
"preview": "import {Utils} from 'nylas-exports'\nimport {mailMergeSessionForDraft} from './mail-merge-draft-editing-session'\nimport {"
},
{
"path": "packages/client-app/internal_packages/composer-mail-merge/lib/mail-merge-token.jsx",
"chars": 1561,
"preview": "import React, {PropTypes} from 'react'\nimport classnames from 'classnames'\nimport {RetinaImg} from 'nylas-component-kit'"
},
{
"path": "packages/client-app/internal_packages/composer-mail-merge/lib/mail-merge-utils.es6",
"chars": 6748,
"preview": "import Papa from 'papaparse'\nimport {\n Utils,\n Actions,\n Contact,\n RegExpUtils,\n DraftHelpers,\n DatabaseStore,\n S"
},
{
"path": "packages/client-app/internal_packages/composer-mail-merge/lib/mail-merge-workspace.jsx",
"chars": 4439,
"preview": "import React, {Component, PropTypes} from 'react'\nimport {RetinaImg, DropZone} from 'nylas-component-kit'\nimport fs from"
},
{
"path": "packages/client-app/internal_packages/composer-mail-merge/lib/main.es6",
"chars": 1871,
"preview": "import {\n TaskRegistry,\n ExtensionRegistry,\n ComponentRegistry,\n CustomContenteditableComponents,\n} from 'nylas-expo"
},
{
"path": "packages/client-app/internal_packages/composer-mail-merge/lib/selection-state-reducers.es6",
"chars": 2513,
"preview": "import _ from 'underscore'\nimport {MAX_ROWS} from './mail-merge-constants'\n\n\nexport function initialState(savedState) {\n"
},
{
"path": "packages/client-app/internal_packages/composer-mail-merge/lib/send-many-drafts-task.es6",
"chars": 5260,
"preview": "import {\n Task,\n Actions,\n Message,\n TaskQueue,\n DraftStore,\n BaseDraftTask,\n SendDraftTask,\n SoundRegistry,\n D"
},
{
"path": "packages/client-app/internal_packages/composer-mail-merge/lib/table-state-reducers.es6",
"chars": 2187,
"preview": "import {Table} from 'nylas-component-kit'\nimport {MAX_ROWS} from './mail-merge-constants'\n\nconst {TableDataSource} = Tab"
},
{
"path": "packages/client-app/internal_packages/composer-mail-merge/lib/token-data-source.es6",
"chars": 2834,
"preview": "import _ from 'underscore'\nimport {Utils} from 'nylas-exports'\n\n\nclass FieldTokens {\n\n constructor(field, tokens = {}) "
},
{
"path": "packages/client-app/internal_packages/composer-mail-merge/lib/token-state-reducers.es6",
"chars": 4619,
"preview": "import {contactFromColIdx} from './mail-merge-utils'\nimport TokenDataSource from './token-data-source'\nimport {LinkableF"
},
{
"path": "packages/client-app/internal_packages/composer-mail-merge/lib/workspace-state-reducers.es6",
"chars": 317,
"preview": "export function initialState(savedData) {\n if (savedData && savedData.tokenDataSource && savedData.tableDataSource) {\n "
},
{
"path": "packages/client-app/internal_packages/composer-mail-merge/package.json",
"chars": 534,
"preview": "{\n \"name\": \"composer-mail-merge\",\n \"title\":\"Mail Merge\",\n \"description\": \"Send personalized emails at scale using CSV"
},
{
"path": "packages/client-app/internal_packages/composer-mail-merge/spec/fixtures.es6",
"chars": 1551,
"preview": "import {Table} from 'nylas-component-kit'\nimport TokenDataSource from '../lib/token-data-source'\n\nconst {TableDataSource"
},
{
"path": "packages/client-app/internal_packages/composer-mail-merge/spec/mail-merge-draft-editing-session-spec.es6",
"chars": 3708,
"preview": "import {Message} from 'nylas-exports'\nimport {MailMergeDraftEditingSession} from '../lib/mail-merge-draft-editing-sessio"
},
{
"path": "packages/client-app/internal_packages/composer-mail-merge/spec/mail-merge-utils-spec.es6",
"chars": 7430,
"preview": "import Papa from 'papaparse'\nimport {\n Message,\n Contact,\n DraftHelpers,\n Actions,\n DatabaseWriter,\n} from 'nylas-e"
},
{
"path": "packages/client-app/internal_packages/composer-mail-merge/spec/selection-state-reducers-spec.es6",
"chars": 5441,
"preview": "import {\n clearTableData,\n loadTableData,\n addColumn,\n removeLastColumn,\n addRow,\n removeRow,\n updateCell,\n setS"
},
{
"path": "packages/client-app/internal_packages/composer-mail-merge/spec/send-many-drafts-task-spec.es6",
"chars": 8797,
"preview": "import {\n Task,\n Actions,\n Message,\n TaskQueue,\n DraftStore,\n DatabaseStore,\n SendDraftTask,\n TaskQueueStatusSto"
},
{
"path": "packages/client-app/internal_packages/composer-mail-merge/spec/table-state-reducers-spec.es6",
"chars": 4872,
"preview": "import {\n initialState,\n fromJSON,\n toJSON,\n clearTableData,\n loadTableData,\n addColumn,\n removeLastColumn,\n add"
},
{
"path": "packages/client-app/internal_packages/composer-mail-merge/spec/token-state-reducers-spec.es6",
"chars": 5461,
"preview": "import {Contact} from 'nylas-exports'\nimport {\n toDraftChanges,\n toJSON,\n initialState,\n loadTableData,\n linkToDraf"
},
{
"path": "packages/client-app/internal_packages/composer-mail-merge/spec/workspace-state-reducers-spec.es6",
"chars": 798,
"preview": "import {\n initialState,\n toggleWorkspace,\n} from '../lib/workspace-state-reducers'\nimport {testState} from './fixtures"
},
{
"path": "packages/client-app/internal_packages/composer-mail-merge/stylesheets/mail-merge.less",
"chars": 4206,
"preview": "@import 'ui-variables';\n\n.mail-merge-workspace {\n width: 100%;\n height: 250px;\n z-index: 1;\n border-top: 1px solid l"
},
{
"path": "packages/client-app/internal_packages/composer-markdown/README.md",
"chars": 834,
"preview": "\n# N1 Markdown Composer\n\nA plugin for N1 that allows you to compose emails using markdown.\n\n![Markdown Screenshot Editor"
},
{
"path": "packages/client-app/internal_packages/composer-markdown/lib/main.cjsx",
"chars": 717,
"preview": "# Markdown Editor\n# Last Revised: April 23, 2015 by Ben Gotow\n#\n# Markdown editor is a simple React component that allow"
},
{
"path": "packages/client-app/internal_packages/composer-markdown/lib/markdown-composer-extension.coffee",
"chars": 570,
"preview": "marked = require 'marked'\nUtils = require './utils'\n{ComposerExtension} = require 'nylas-exports'\n\nrawBodies = {}\n\nclass"
},
{
"path": "packages/client-app/internal_packages/composer-markdown/lib/markdown-editor.cjsx",
"chars": 4072,
"preview": "Utils = require './utils'\nSimpleMDE = require 'simplemde'\n{React, ReactDOM, QuotedHTMLTransformer} = require 'nylas-expo"
},
{
"path": "packages/client-app/internal_packages/composer-markdown/lib/utils.coffee",
"chars": 169,
"preview": "\nclass Utils\n\n @getTextFromHtml: (html) ->\n div = document.createElement('div')\n div.innerHTML = html\n div.tex"
},
{
"path": "packages/client-app/internal_packages/composer-markdown/package.json",
"chars": 456,
"preview": "{\n \"name\": \"composer-markdown\",\n \"version\": \"0.1.0\",\n \"main\": \"./lib/main\",\n \"title\": \"Markdown (Experimental)\",\n \""
},
{
"path": "packages/client-app/internal_packages/composer-markdown/stylesheets/index.less",
"chars": 722,
"preview": "@import \"../internal_packages/composer-markdown/node_modules/simplemde/dist/simplemde.min.css\";\n@import \"ui-variables\";\n"
},
{
"path": "packages/client-app/internal_packages/composer-scheduler/README.md",
"chars": 1006,
"preview": "# QuickSchedule\n\nSay goodbye to the hassle of scheduling! This new plugin lets you avoid\nthe typical back-and-forth of p"
},
{
"path": "packages/client-app/internal_packages/composer-scheduler/lib/calendar/proposed-time-calendar-data-source.es6",
"chars": 647,
"preview": "import {Rx, CalendarDataSource} from 'nylas-exports'\nimport ProposedTimeCalendarStore from '../proposed-time-calendar-st"
},
{
"path": "packages/client-app/internal_packages/composer-scheduler/lib/calendar/proposed-time-event.jsx",
"chars": 1536,
"preview": "import React from 'react'\nimport classnames from 'classnames'\nimport SchedulerActions from '../scheduler-actions'\nimport"
},
{
"path": "packages/client-app/internal_packages/composer-scheduler/lib/calendar/proposed-time-picker.jsx",
"chars": 4573,
"preview": "import React from 'react'\nimport {Utils} from 'nylas-exports'\nimport {NylasCalendar} from 'nylas-component-kit'\nimport S"
},
{
"path": "packages/client-app/internal_packages/composer-scheduler/lib/composer/email-b64-images.es6",
"chars": 5153,
"preview": "export const b64Images = {\n location: `data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2"
},
{
"path": "packages/client-app/internal_packages/composer-scheduler/lib/composer/email-images.json",
"chars": 5130,
"preview": "{\n \"location\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZ"
},
{
"path": "packages/client-app/internal_packages/composer-scheduler/lib/composer/event-datetime-input.jsx",
"chars": 1802,
"preview": "import React from 'react';\nimport moment from 'moment-timezone'\nimport {DateUtils} from 'nylas-exports'\n\nfunction getDat"
},
{
"path": "packages/client-app/internal_packages/composer-scheduler/lib/composer/event-prep-helper.es6",
"chars": 402,
"preview": "export const prepareEvent = (inEvent, draft, proposals = []) => {\n const event = inEvent\n if (!event.title) {\n even"
},
{
"path": "packages/client-app/internal_packages/composer-scheduler/lib/composer/new-event-card-container.jsx",
"chars": 4252,
"preview": "import React, {Component, PropTypes} from 'react';\nimport {Utils, Event} from 'nylas-exports';\n\nimport SchedulerActions "
},
{
"path": "packages/client-app/internal_packages/composer-scheduler/lib/composer/new-event-card.jsx",
"chars": 7398,
"preview": "import React from 'react';\nimport moment from 'moment-timezone'\nimport {\n RetinaImg,\n DatePicker,\n TimePicker,\n TabG"
},
{
"path": "packages/client-app/internal_packages/composer-scheduler/lib/composer/new-event-helper.es6",
"chars": 2654,
"preview": "import moment from 'moment-round'\nimport {\n Event,\n Calendar,\n DatabaseStore,\n} from 'nylas-exports'\n\nimport {PLUGIN_"
},
{
"path": "packages/client-app/internal_packages/composer-scheduler/lib/composer/new-event-preview.jsx",
"chars": 3311,
"preview": "import moment from 'moment-timezone'\nimport React from 'react'\nimport {Event, DateUtils} from 'nylas-exports'\nimport b64"
},
{
"path": "packages/client-app/internal_packages/composer-scheduler/lib/composer/proposed-time-list.jsx",
"chars": 5857,
"preview": "import _ from 'underscore'\nimport moment from 'moment-timezone'\nimport React from 'react'\nimport {DateUtils} from 'nylas"
},
{
"path": "packages/client-app/internal_packages/composer-scheduler/lib/composer/remove-event-helper.es6",
"chars": 1101,
"preview": "import {PLUGIN_ID} from '../scheduler-constants'\n\n/**\n * Removing a proposed event can happen through various mechansism"
},
{
"path": "packages/client-app/internal_packages/composer-scheduler/lib/composer/scheduler-composer-button.jsx",
"chars": 4683,
"preview": "import React from 'react'\nimport ReactDOM from 'react-dom'\nimport {\n Actions,\n APIError,\n NylasAPI,\n NylasAPIHelpers"
},
{
"path": "packages/client-app/internal_packages/composer-scheduler/lib/composer/scheduler-composer-extension.es6",
"chars": 2543,
"preview": "import {\n Event,\n Actions,\n ComposerExtension,\n} from 'nylas-exports'\n\nimport {PLUGIN_ID} from '../scheduler-constant"
},
{
"path": "packages/client-app/internal_packages/composer-scheduler/lib/main.es6",
"chars": 2056,
"preview": "import {\n WorkspaceStore,\n ComponentRegistry,\n ExtensionRegistry,\n CustomContenteditableComponents,\n} from 'nylas-ex"
}
]
// ... and 1560 more files (download for full content)
About this extraction
This page contains the full source code of the nylas/nylas-mail GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1760 files (8.0 MB), approximately 2.2M tokens, and a symbol index with 1804 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.