61 Commits

Author SHA1 Message Date
Ben Gotow
6760c0fd1e Implement Calendar event syncback for changes (#2574)
* Add implementation plan for calendar ICS helpers and recurring event dialog

This plan addresses two issues with calendar event drag persistence:

1. ICS data inconsistency - currently only cached fields are updated,
   not the underlying ICS data. Plan includes a new ics-event-helpers.ts
   module with functions to create, update, and modify ICS data.

2. Missing recurring event handling - no dialog asking whether to modify
   this occurrence or all occurrences. Plan includes a confirmation
   dialog component and integration with the drag persistence flow.

* Implement ICS helpers and recurring event dialog for calendar events

This change ensures calendar event modifications properly update the
underlying ICS data, not just the cached recurrenceStart/recurrenceEnd fields.

New files:
- ics-event-helpers.ts: Centralized helpers for ICS manipulation
  - createICSString: Create new ICS events from scratch
  - updateEventTimes: Update DTSTART/DTEND in existing ICS
  - createRecurrenceException: Create EXDATE + exception event
  - updateRecurringEventTimes: Shift entire recurring series
  - isRecurringEvent/getRecurrenceInfo: Query recurrence status

- recurring-event-dialog.ts: Dialog asking "this occurrence only"
  vs "all occurrences" when modifying recurring events

Modified files:
- mailspring-calendar.tsx: Updated _persistDragChange to use ICS helpers
  and show recurring event dialog. Added separate methods for simple
  event changes, single occurrence exceptions, and all-occurrences updates.
  Undo/redo now properly restores ICS data.

- calendar-event-popover.tsx: Updated saveEdits to use ICS helpers
  and handle recurring events with the same dialog flow.

- mailspring-exports.js/d.ts: Export ICSEventHelpers module

Fixes the issue where dragging events appeared to move them but the
underlying ICS data was not updated, causing sync inconsistencies.

* Add remaining work plan for calendar ICS implementation

Documents the prioritized list of remaining issues identified during
code review, including:
- High: recurring event deletion, quick event ICS generation, undo fix
- Medium: deprecated lifecycle, race conditions, timezone handling
- Low: validation, null checks, localization

Includes implementation details and recommended order of work.

* Add ICS generation, recurring deletion dialog, and fix deprecated lifecycle

Three improvements to calendar event handling:

1. Quick Event Creation (quick-event-popover.tsx):
   - Now generates proper ICS data using ICSEventHelpers.createICSString()
   - Sets ics and icsuid fields on new Event models
   - Exported generateUID() from ics-event-helpers.ts

2. Recurring Event Deletion (mailspring-calendar.tsx):
   - Added recurring event dialog to _onDeleteSelectedEvents
   - "This occurrence only" adds EXDATE to master event
   - "All occurrences" deletes the entire series
   - Added addExclusionDate() helper to ics-event-helpers.ts
   - Split deletion logic into _deleteEvent, _deleteOccurrence, _deleteEntireEvent

3. React Lifecycle Fix (mailspring-calendar.tsx):
   - Changed deprecated componentWillMount to componentDidMount
   - Improves React 18 compatibility

* Improve timezone handling and add validation in ICS helpers

Timezone improvements:
- createICALTime now properly preserves timezone from original events
- Uses convertToZone for correct timezone conversion instead of just
  attaching zone after creation
- formatDateOnly now uses local date (not UTC) for all-day events to
  prevent off-by-one day errors
- createICSString now accepts optional timezone parameter
- createRecurrenceException preserves master event's timezone

Validation improvements:
- Added validateTimestamps helper to check for valid positive numbers
- Validates that end time is not before start time
- Added null checks for VEVENT component in all functions that need it
- Functions now throw descriptive errors for malformed ICS

Also renamed formatDateTime to formatDateTimeUTC for clarity.

* Replace any types with proper TypeScript interfaces and extract recurring event utility

- Add UndoBlock interface to UndoRedoStore with public queueUndoBlock method
- Export UndoBlock from mailspring-exports for external use
- Replace `any[]` attendees type with EventAttendee interface
- Fix HTMLMetaElement cast in extractNotesFromDescription
- Add proper types to EventAttendeesInput props and methods
- Create recurring-event-actions.ts shared utility with:
  - modifySimpleEvent: Update non-recurring events
  - createOccurrenceException: Create exception for single occurrence
  - modifyAllOccurrences: Shift entire recurring series
  - modifyEventWithRecurringSupport: Main entry point with dialog handling
- Refactor mailspring-calendar.tsx to use shared utility (removes ~90 lines)
- Refactor calendar-event-popover.tsx to use shared utility (removes ~70 lines)
- Remove duplicate recurring event handling code from both components

* Use task-based undo for calendar events instead of custom UndoBlock

Following the established pattern from SyncbackMetadataTask, this change
enhances SyncbackEventTask to support undo by storing original event data:

- Add undoData and taskDescription attributes to SyncbackEventTask
- Add canBeUndone getter that returns true when undoData is provided
- Implement createUndoTask() that swaps current/original state (like redo)
- Update forUpdating() to accept undoData and description parameters

Update recurring-event-actions.ts to use task-based undo:
- Capture event snapshot before modifications
- Pass undoData to SyncbackEventTask.forUpdating() calls
- Pass description for undo toast display

Remove custom UndoBlock from UndoRedoStore:
- Remove exported UndoBlock interface
- Remove queueUndoBlock method
- Keep internal UndoBlock type for task-based undo

Update mailspring-calendar.tsx:
- Remove manual _registerUndoAction method
- Update keyboard handler to pass undoData to task
- Update drag handler to pass description to shared utility
- Undo is now automatically handled by UndoRedoStore._onQueue

This aligns with how other undoable tasks work (ChangeStarredTask,
SyncbackMetadataTask) and removes the need for custom undo handling.

* Add undo-redo task pattern documentation for future implementers

- Create docs/undo-redo-task-pattern.md with comprehensive guide
- Document toggle pattern (ChangeStarredTask) and snapshot pattern
- Include implementation steps, anti-patterns, and related files
- Update CLAUDE.md to reference the new documentation

* Fix recurring event handling and undo/redo issues in calendar

- Keyboard events (arrow keys) now show recurring event dialog like drag does
- Single occurrence deletion now supports undo via undoData
- Add newData snapshot to SyncbackEventTask for reliable redo
- Override createIdenticalTask to use captured snapshots

Fixes three PR review findings:
1. Arrow key changes bypassed recurring event dialog
2. _deleteOccurrence didn't pass undoData (not undoable)
3. Redo now uses captured snapshots instead of potentially stale event refs

* Improve TypeScript typing and add user error feedback

- Add type annotation to constructor props parameter
- Show error dialogs when calendar operations fail (delete, keyboard move, drag)
- Add documentation about Event.clone() deep clone requirement for undo/redo

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-01-20 10:28:02 -06:00
Ben Gotow
7547c24112 Fix RSVP calendar event handling bugs (#2575)
* Fix RSVP calendar event handling bugs

- Add missing return after error dialog in _onRSVP to prevent queuing
  task with null organizer email
- Improve emailFromParticipantURI to parse more URI formats including
  bare emails, non-mailto URIs, and embedded email patterns
- Add handling for CANCEL method to show cancellation notice instead
  of RSVP buttons when event is cancelled
- Add styling for cancelled event notice

* Add EventRSVPTask sync engine specification document

Documents the RFC 5546 (iTIP) and RFC 6047 (iMIP) requirements for
properly formatting RSVP reply emails. Includes:

- Required MIME message structure with Content-Type parameters
- Required iCalendar properties for METHOD:REPLY
- Common implementation mistakes to avoid
- Complete examples and validation checklist

This specification is intended for the C++ mailsync codebase to
ensure RSVP replies are properly formatted and accepted by major
calendar providers.

* Fix EventRSVPTask to include only the replying attendee

Per RFC 5546, a METHOD:REPLY must have exactly one ATTENDEE - the
replying user. Previously, the code kept all attendees from the
original invite and only updated the self-participant's PARTSTAT.

Now we remove all other attendees from the VEVENT, keeping only
the self-participant with the updated participation status. This
satisfies the sync engine's input validation requirements.

* Fix bare email validation in emailFromParticipantURI

Use RegExpUtils.emailRegex() consistently throughout the function,
which supports international characters per RFC 6531. Changes:

- Bare email validation now uses emailRegex and verifies the match
  covers the entire string to reject malformed inputs
- Fallback extraction also uses emailRegex instead of hardcoded ASCII-only pattern
- Removed redundant "after colon" special case since the fallback handles it
- Reset regex lastIndex between exec() calls since it has the 'g' flag

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-01-20 09:50:51 -06:00
Ben Gotow
5a0a7dce0a Add calendar event drag interactions (#2554) 2026-01-09 09:43:20 -06:00
Evan Morikawa
9f6889b03f [nylas-mail] move nylas-mail into /packages 2017-02-16 13:15:10 -08:00
Michael Grinich
d51a99d020 Add built docs 2017-01-30 02:49:48 -08:00
Michael Grinich
05da3a6c0d Update documentation with GitBook 2017-01-30 02:38:37 -08:00
Evan Morikawa
fcfae5d490 Fix references for ~/.nylas to ~/.nylas-mail
Summary: Fix references to nylas-mail

Test Plan: manual

Reviewers: jackie, juan

Reviewed By: juan

Differential Revision: https://phab.nylas.com/D3674
2017-01-13 18:54:37 -08:00
Jackie Luo
78a7388318 🎨(rename): Update Nylas N1 to Nylas Mail
Test Plan: Tested locally.

Reviewers: halla, juan, evan

Reviewed By: juan, evan

Differential Revision: https://phab.nylas.com/D3645
2017-01-12 12:05:44 -08:00
Ben Gotow
d52ba1a290 fix(docs): We no longer support Node 4 for building 2016-11-09 15:51:05 -08:00
Ben Gotow
c7d4e7b0ee fix(readme): More Win32-specific instructions 2016-10-12 16:37:04 -07:00
Ben Gotow
bc2a933784 Update Windows.md 2016-10-11 18:35:00 -07:00
Ben Gotow
18d294c42f feat(transforms): Replace regexp body transforms with DOM approach
Summary:
We originally didn't do this because creating a DOM tree was loading images.
Using range.createContextualFragment seems to do it without the tree ever
being attached.

Accompanying changes to src/pro are here:
https://phab.nylas.com/D3300
https://github.com/nylas/edgehill/compare/bengotow/draft-dom-transformations?expand=1

Also rename applyTransformsToDraft => applyTransformsForSending. Needed
a new name because the function signature has changed. AFAIK there are no
open source plugins using the old functions.

Test Plan: All specs updated

Reviewers: evan, juan

Reviewed By: evan, juan

Differential Revision: https://phab.nylas.com/D3299
2016-09-23 16:36:08 -07:00
Ben Gotow
688147b2e3 Update Windows.py to remove Node 0.10x 2016-07-08 10:52:08 -07:00
Akash Nimare
a3d62cf8f1 Fixed broken links. (#2470) 2016-06-16 15:09:24 -07:00
Keith Armstrong
f8d0c82647 Update broken links for guides, docs, and API (#2455)
Also updated schemes of some links to https for consistency
2016-06-15 15:29:52 -07:00
Ben Gotow
cf4b99aba4 fix(db): Remove - from table names, which was a bad idea 2016-04-04 17:44:45 -07:00
Ben Gotow
466bca813b fix(syncback): Bidirectional transforms, ready-to-send saved state
Summary:
This diff replaces "finalizeSessionBeforeSending" with a
plugin hook that is bidirectional and allows us to put the draft in
the "ready to send" state every time we save it, and restore it to
the "ready to edit" state every time a draft session is created to
edit it.

This diff also significantly restructures the draft tasks:

1. SyncbackDraftUploadsTask:
   - ensures that `uploads` are converted to `files` and that any
     existing files on the draft are part of the correct account.

1. SyncbackDraftTask:
   - saves the draft, nothing else.

3. SendDraftTask
   - sends the draft, nothing else.
   - deletes the entire uploads directory for the draft

Test Plan: WIP

Reviewers: juan, evan

Reviewed By: evan

Differential Revision: https://phab.nylas.com/D2753
2016-03-16 19:27:12 -07:00
Ben Gotow
ea5e8e0b9e rm(Nilas-contact-elements): Remove unused package 2016-02-01 19:12:06 -08:00
Ben Gotow
459eb26d4f fix(activity): "Long Polling" => "Delta Streaming" because we don't really poll. 2016-01-29 16:06:33 -08:00
Ben Gotow
ff01c3a502 DataView => ListDataSource 2016-01-14 12:26:54 -08:00
Evan Morikawa
11b731891f feat(extension): async extensions
Summary:
WIP:

This is a quick patch for Drew to make extensions async

We'll need to think through the upgrade/deprecation plan to roll out async
extensions across all of our APIs.

Test Plan: TODO

Reviewers: drew, evan, bengotow

Reviewed By: bengotow

Differential Revision: https://phab.nylas.com/D2392
2015-12-30 18:04:52 -05:00
Juan Tejada
6315bc9d80 fix(extension-adapter): Update adapter to support all versions of extension api we've used
Summary:
- Rewrites composer extension adpater to support all versions of the
  ComposerExtension API we've ever declared. This will allow old plugins (or
  plugins that haven't been reinstalled after update) to keep functioning
  without breaking N1
- Adds specs

Test Plan: - Unit tests

Reviewers: evan, bengotow

Reviewed By: bengotow

Differential Revision: https://phab.nylas.com/D2399
2015-12-30 15:11:37 -05:00
Evan Morikawa
8fe4a7a02f docs(tests): add docs about integration testing 2015-12-11 16:25:25 -05:00
Ben Gotow
7f87ffbe17 fix(license): GPLv3 => GPL-3.0 2015-12-07 10:50:47 -08:00
Juan Tejada
cfdc401c54 update(extensions): Rename DraftStoreExtension and MessageStoreExtension
Summary:
- Rename DraftStoreExtension to ComposerExtension
- Rename MessageStoreExtension to MessageViewExtension
- Rename ContenteditablePlugin to ContenteditableExtension
  - Update Contenteditable to use new naming convention
  - Adds support for extension handlers as props
- Add ExtensionRegistry to register extensions:
  - ContenteditableExtensions will not be registered through the
    ExtensionRegistry. They are meant for internal use, or if anyone wants
    to use our Contenteditable component directly in their plugins.
  - Adds specs
- Refactors internal_packages and src to use new names and new ExtensionRegistry api
- Adds deprecation util function and deprecation notices for old api methods:
  - DraftStore.{registerExtension, unregisterExtension}
  - MessageStore.{registerExtension, unregisterExtension}
  - DraftStoreExtension.{onMouseUp, onTabDown}
  - MessageStoreExtension
- Adds and updates docs

Test Plan: - Unit tests

Reviewers: bengotow, evan

Reviewed By: evan

Differential Revision: https://phab.nylas.com/D2293
2015-11-30 16:08:05 -08:00
Ben Gotow
eeb976167e fix(license): Mark a few additional packages as GPLv3 2015-11-25 14:41:10 -08:00
Ben Gotow
942f29c7e5 futureproof(packages): Give all example packages engine version range 2015-11-24 17:51:12 -08:00
Ben Gotow
46a01de651 fix(copy): Call split / list modes "Single Panel / Two Panel"
Fixes T5907
2015-11-23 17:34:56 -08:00
Evan Morikawa
488dff0f90 refactor(env): new NylasEnv global
Converted all references of global atom to NylasEnv

Temporary rename atom.io

find -E . -regex ".*\.(coffee|cjsx|js|md|cmd|es6)" -print0 | xargs -0 sed
-i "" 's/atom.io/temporaryAtomIoReplacement/g'

atom.config to NylasEnv.config

find -E . -regex ".*\.(coffee|cjsx|js|md|cmd|es6)" -print0 | xargs -0 sed
-i "" 's/atom.config/NylasEnv.config/g'

atom.packages -> NylasEnv.packages

atom.commands -> NylasEnv.commands atom.getLoadSettings

find -E . -regex ".*\.(coffee|cjsx|js|md|cmd|es6)" -print0 | xargs -0 sed
-i "" 's/atom.commands/NylasEnv.commands/g'
find -E . -regex ".*\.(coffee|cjsx|js|md|cmd|es6)" -print0 | xargs -0 sed
-i "" 's/atom.getLoadSettings/NylasEnv.getLoadSettings/g'

More common atom methods

find -E . -regex ".*\.(coffee|cjsx|js|md|cmd|es6)" -print0 | xargs -0 sed
-i "" 's/atom.styles/NylasEnv.styles/g'
find -E . -regex ".*\.(coffee|cjsx|js|md|cmd|es6)" -print0 | xargs -0 sed
-i "" 's/atom.emitError/NylasEnv.emitError/g'
find -E . -regex ".*\.(coffee|cjsx|js|md|cmd|es6)" -print0 | xargs -0 sed
-i "" 's/atom.inSpecMode/NylasEnv.inSpecMode/g'
find -E . -regex ".*\.(coffee|cjsx|js|md|cmd|es6)" -print0 | xargs -0 sed
-i "" 's/atom.inDevMode/NylasEnv.inDevMode/g'
find -E . -regex ".*\.(coffee|cjsx|js|md|cmd|es6)" -print0 | xargs -0 sed
-i "" 's/atom.getWindowType/NylasEnv.getWindowType/g'
find -E . -regex ".*\.(coffee|cjsx|js|md|cmd|es6)" -print0 | xargs -0 sed
-i "" 's/atom.displayWindow/NylasEnv.displayWindow/g'
find -E . -regex ".*\.(coffee|cjsx|js|md|cmd|es6)" -print0 | xargs -0 sed
-i "" 's/atom.quit/NylasEnv.quit/g'
find -E . -regex ".*\.(coffee|cjsx|js|md|cmd|es6)" -print0 | xargs -0 sed
-i "" 's/atom.close/NylasEnv.close/g'

More atom method changes

find -E . -regex ".*\.(coffee|cjsx|js|md|cmd|es6)" -print0 | xargs -0 sed
-i "" 's/atom.keymaps/NylasEnv.keymaps/g'
find -E . -regex ".*\.(coffee|cjsx|js|md|cmd|es6)" -print0 | xargs -0 sed
-i "" 's/atom.hide/NylasEnv.hide/g'
find -E . -regex ".*\.(coffee|cjsx|js|md|cmd|es6)" -print0 | xargs -0 sed
-i "" 's/atom.getCurrentWindow/NylasEnv.getCurrentWindow/g'
find -E . -regex ".*\.(coffee|cjsx|js|md|cmd|es6)" -print0 | xargs -0 sed
-i "" 's/atom.menu/NylasEnv.menu/g'
find -E . -regex ".*\.(coffee|cjsx|js|md|cmd|es6)" -print0 | xargs -0 sed
-i "" 's/atom.getConfigDirPath/NylasEnv.getConfigDirPath/g'
find -E . -regex ".*\.(coffee|cjsx|js|md|cmd|es6)" -print0 | xargs -0 sed
-i "" 's/atom.isMainWindow/NylasEnv.isMainWindow/g'
find -E . -regex ".*\.(coffee|cjsx|js|md|cmd|es6)" -print0 | xargs -0 sed
-i "" 's/atom.finishUnload/NylasEnv.finishUnload/g'
find -E . -regex ".*\.(coffee|cjsx|js|md|cmd|es6)" -print0 | xargs -0 sed
-i "" 's/atom.isWorkWindow/NylasEnv.isWorkWindow/g'
find -E . -regex ".*\.(coffee|cjsx|js|md|cmd|es6)" -print0 | xargs -0 sed
-i "" 's/atom.showSaveDialog/NylasEnv.showSaveDialog/g'
find -E . -regex ".*\.(coffee|cjsx|js|md|cmd|es6)" -print0 | xargs -0 sed
-i "" 's/atom.append/NylasEnv.append/g'
find -E . -regex ".*\.(coffee|cjsx|js|md|cmd|es6)" -print0 | xargs -0 sed
-i "" 's/atom.confirm/NylasEnv.confirm/g'
find -E . -regex ".*\.(coffee|cjsx|js|md|cmd|es6)" -print0 | xargs -0 sed
-i "" 's/atom.clipboard/NylasEnv.clipboard/g'
find -E . -regex ".*\.(coffee|cjsx|js|md|cmd|es6)" -print0 | xargs -0 sed
-i "" 's/atom.getVersion/NylasEnv.getVersion/g'

More atom renaming

Rename atom methods

More atom methods

Fix grunt config variable

Change atom.cmd to N1.cmd

Rename atom.coffee and atom.js to nylas-env.coffee nylas-env.js

Fix atom global reference in specs manually

Fix atom requires

Change engine from atom to nylas

got rid of global/nylas-env

rename to nylas-win-bootup

Fix onWindowPropsChanged to onWindowPropsReceived

fix nylas-workspace

atom-text-editor to nylas-theme-wrap

atom-text-editor -> nylas-theme-wrap

Replacing atom keyword

AtomWindow -> NylasWindow

Replace Atom -> N1

Rename atom items

nylas.asar -> atom.asar

Remove more atom references

Remove 6to5 references

Remove license exception for atom
2015-11-17 16:41:20 -08:00
Evan Morikawa
bab3c18bd4 fix(docs): fix docs so they compile properly. 2015-11-17 15:48:59 -08:00
Evan Morikawa
e1529efbf5 feat(windows): updated docs and fix for building on 64-bit 2015-10-23 12:55:44 -07:00
Ben Gotow
e0ddfb736d fix(*): Packages => Plugins in a few more places
Resolves T4289
2015-10-22 14:55:30 -07:00
Jose Browne
31cf0bc348 Fix Broken link to DraftStoreExtensions.md 2015-10-11 17:36:13 -07:00
Michael Grinich
f04682031c actually no more gh-pages 2015-10-05 05:08:53 -07:00
dillon
71edc1ad1d fix assorted problems in docs 2015-10-04 15:24:08 -07:00
Ben Gotow
c20599d471 feat(dev-mode): Toggle dev mode, sticky through restarts 2015-10-03 19:04:19 -07:00
Ben Gotow
c3a3886b5b fix(docs): Push examples to the correct /examples URL 2015-10-02 16:09:49 -07:00
Ben Gotow
b8635bdd24 fix(specs): Fix specs for environment config 2015-10-02 15:31:05 -07:00
Evan Morikawa
b9bd402b3d copy(readme): update readmes 2015-10-02 13:24:39 -07:00
Ben Gotow
59096942e6 fix(docs): Moving to use jekyll on gh-pages 2015-10-02 10:55:18 -07:00
Ben Gotow
b268643c3b fix(docs): Updating docs (round 1 of many) 2015-10-01 13:19:34 -07:00
Evan Morikawa
1b12ac8959 refactor(docs): move docs-templates into docs 2015-10-01 09:58:51 -07:00
Ben Gotow
3ccc5e3d99 rename(Nylas Mail): Replace Nylas Mail > N1 2015-09-29 09:44:30 -07:00
dillon
89e507fe76 fix capitalization of JavaScript and CoffeeScript
Summary: i accidentally messed up phab and arcanist locally, so this diff is to fix these mistakes i made. it's the combination of D2037 and D2028.

Test Plan: tested manually

Reviewers: bengotow, evan

Differential Revision: https://phab.nylas.com/D2043
2015-09-18 11:10:14 -07:00
Ben Gotow
fc7abce49b feat(docs): Move docs to gh-pages, deploy as part of ci build on darwin 2015-09-16 11:00:51 -07:00
Michael Grinich
de9402e426 Move guides from Edgehill repo to Redwood and only generate docs from classes 2015-06-02 16:24:56 -07:00
Ben Gotow
8133cc88d6 feat(logging): Developer bar, verbose logging to logstash, Electron 0.26.0
Summary:
- We now make verbose log files continuously as you use the app
- We ship the logs to LogStash via S3 when an exception occurs
- We log the DatabaseStore, ActionBridge and Analytics packages

- We are now on the latest version of Electron 0.26.0
- We are now on Chrome 42 and io.js 1.4.3
- We should be setup to use ASAR soon.

Update atom.sh to reflect that we're now electron

oniguruma was unnecessary

correctly find log files that haven't been shipped yet

Fix a small issue with nodeIsVisible after upgrade to Chrome 42

Delete old logs, better logging from database store, don't ship empty logs

Test Plan: Run existing tests

Reviewers: evan

Reviewed By: evan

Differential Revision: https://phab.nylas.com/D1531
2015-05-19 17:02:46 -07:00
Ben Gotow
0efdec5fd5 fix(initial-sync): Make initial sync more robust, show progress, retry on failure
Summary:
Rename ActivityBar => DeveloperBar

Expose sync workers and make them observable

New activity sidebar that replaces momentary notifications

Updated specs

Test Plan: Run new specs!

Reviewers: evan

Reviewed By: evan

Maniphest Tasks: T1131

Differential Revision: https://phab.nylas.com/D1521
2015-05-19 15:59:37 -07:00
Ben Gotow
684a8ef4c0 [naming] Nylas Mail => Nylas, Nilas => Nylas 2015-05-18 19:21:54 -07:00
Ben Gotow
23e09b0830 Update docs 2015-05-15 11:09:39 -07:00