| name | evernote-upgrade-migration |
| description | Upgrade Evernote SDK versions and migrate between API versions.
Use when upgrading SDK, handling breaking changes,
or migrating to newer API patterns.
Trigger with phrases like "upgrade evernote sdk", "evernote migration",
"update evernote", "evernote breaking changes".
|
| allowed-tools | Read, Write, Edit, Bash(npm:*), Grep |
| version | 1.0.0 |
| license | MIT |
| author | Jeremy Longshore <jeremy@intentsolutions.io> |
Evernote Upgrade & Migration
Overview
Guide for upgrading Evernote SDK versions, handling breaking changes, and migrating legacy integrations to current API patterns.
Prerequisites
- Existing Evernote integration
- Test environment for validation
- Understanding of current implementation
SDK Version History
| Version | Node.js | Key Changes |
|---|
| 2.0.x | 10+ | Promise-based API, ES6 modules |
| 1.25.x | 8+ | Legacy callback pattern |
| 1.x | 6+ | Original SDK |
Instructions
Step 1: Check Current Version
npm list evernote
npm view evernote versions
npm outdated evernote
Step 2: Review Breaking Changes
var Evernote = require('evernote').Evernote;
var client = new Evernote.Client({
consumerKey: 'key',
consumerSecret: 'secret',
sandbox: true
});
const Evernote = require('evernote');
const client = new Evernote.Client({
consumerKey: 'key',
consumerSecret: 'secret',
sandbox: true
});
noteStore.listNotebooks(function(err, notebooks) {
if (err) console.error(err);
else console.log(notebooks);
});
noteStore.listNotebooks()
.then(notebooks => console.log(notebooks))
.( .(err));
notebooks = noteStore.();
note = .();
note = ..();
Step 3: Migration Script
const fs = require('fs');
const path = require('path');
const glob = require('glob');
const migrations = [
{
pattern: /require\(['"]evernote['"]\)\.Evernote/g,
replacement: "require('evernote')"
},
{
pattern: /new Evernote\.Note\(\)/g,
replacement: 'new Evernote.Types.Note()'
},
{
pattern: /new Evernote\.Notebook\(\)/g,
replacement: 'new Evernote.Types.Notebook()'
},
{
pattern: /new Evernote\.Tag\(\)/g,
replacement: 'new Evernote.Types.Tag()'
},
{
pattern: /new Evernote\.Resource\(\)/g,
replacement: 'new Evernote.Types.Resource()'
},
{
pattern: /new Evernote\.NoteFilter\(\)/g,
replacement: 'new Evernote.NoteStore.NoteFilter()'
},
{
pattern: /new Evernote\.NotesMetadataResultSpec\(\)/g,
replacement: 'new Evernote.NoteStore.NotesMetadataResultSpec()'
}
];
function migrateFile(filePath) {
content = fs.(filePath, );
modified = ;
( { pattern, replacement } migrations) {
(pattern.(content)) {
content = content.(pattern, replacement);
modified = ;
}
}
(modified) {
fs.(, fs.(filePath));
fs.(filePath, content);
.();
;
}
;
}
files = glob.();
migratedCount = ;
( file files) {
((file)) {
migratedCount++;
}
}
.();
.();
Step 4: Convert Callbacks to Promises
function promisifyNoteStore(noteStore) {
const promisified = {};
const methods = [
'listNotebooks',
'getNotebook',
'createNotebook',
'updateNotebook',
'listTags',
'getTag',
'createTag',
'getNote',
'createNote',
'updateNote',
'deleteNote',
'findNotesMetadata',
'getNoteContent',
'getResource'
];
for (const method of methods) {
promisified[method] = (...args) => {
return new Promise((resolve, reject) => {
noteStore[method](...args, (err, result) => {
if (err) reject(err);
else resolve(result);
});
});
};
}
return promisified;
}
module.exports = { promisifyNoteStore };
Step 5: Upgrade Dependencies
npm install evernote@latest
npm install @types/evernote@latest --save-dev
npm update
Step 6: Test Suite Updates
const assert = require('assert');
const Evernote = require('evernote');
describe('SDK v2 Migration Tests', () => {
let client;
let noteStore;
before(() => {
client = new Evernote.Client({
token: process.env.EVERNOTE_ACCESS_TOKEN,
sandbox: true
});
noteStore = client.getNoteStore();
});
describe('Type Constructors', () => {
it('should create Note using Types namespace', () => {
const note = new Evernote.Types.Note();
assert(note);
note.title = 'Test';
assert.equal(note.title, 'Test');
});
it('should create NoteFilter using NoteStore namespace', () => {
const filter = new Evernote.NoteStore.NoteFilter({
:
});
(filter);
assert.(filter., );
});
});
(, {
(, () => {
result = noteStore.();
(result );
});
(, () => {
notebooks = noteStore.();
(.(notebooks));
});
});
(, {
(, () => {
note = ..();
{
noteStore.(note);
assert.();
} (error) {
(error. !== );
}
});
});
});
Step 7: Compatibility Layer
class CompatibleNoteStore {
constructor(noteStore) {
this.store = noteStore;
}
listNotebooks(callback) {
const promise = this.store.listNotebooks();
if (callback) {
promise
.then(result => callback(null, result))
.catch(error => callback(error, null));
return;
}
return promise;
}
getNote(guid, withContent, withResources, withRecognition, withAlternate, callback) {
const promise = this.store.getNote(
guid,
withContent,
withResources,
withRecognition,
withAlternate
);
if (callback) {
promise
.then(result => callback(null, result))
.catch(error => callback(error, null));
;
}
promise;
}
() {
promise = ..(note);
(callback) {
promise
.( (, result))
.( (error, ));
;
}
promise;
}
}
. = ;
Step 8: Deprecation Warnings
const deprecations = new Set();
function warnOnce(message) {
if (!deprecations.has(message)) {
deprecations.add(message);
console.warn(`[DEPRECATION WARNING] ${message}`);
}
}
function wrapWithDeprecationWarnings(noteStore) {
return new Proxy(noteStore, {
get(target, prop) {
if (prop === 'getNote') {
return (...args) => {
if (args.length === 6 && typeof args[5] === 'function') {
warnOnce(
'Callback pattern is deprecated. ' +
'Use Promise: noteStore.getNote(...).then(note => ...)'
);
}
return target[prop](...args);
};
}
return target[prop];
}
});
}
module.exports = { wrapWithDeprecationWarnings };
Migration Checklist
## SDK v2 Migration Checklist
### Pre-Migration
- [ ] Backup current codebase
- [ ] Document current SDK version
- [ ] Review breaking changes
- [ ] Set up test environment
### Code Changes
- [ ] Update import statements
- [ ] Update type constructors (Types namespace)
- [ ] Update filter constructors (NoteStore namespace)
- [ ] Convert callbacks to Promises/async-await
- [ ] Update error handling for Promise rejections
### Testing
- [ ] Run migration script on test branch
- [ ] Execute full test suite
- [ ] Test OAuth flow end-to-end
- [ ] Test note CRUD operations
- [ ] Test search functionality
- [ ] Verify error handling
### Deployment
- [ ] Deploy to staging
- [ ] Run integration tests
- [ ] Monitor for errors
- [ ] Deploy to production
- [ ] Monitor metrics
### Cleanup
- [ ] Remove compatibility layers (after validation period)
- [ ] Remove backup files
- [ ] Update documentation
- [ ] Archive migration scripts
Output
- SDK version comparison
- Automated migration script
- Callback to Promise conversion
- Compatibility layer for gradual migration
- Migration test suite
- Deprecation warning system
Error Handling
| Issue | Cause | Solution |
|---|
Evernote.Note is not a constructor | Old import style | Use Evernote.Types.Note |
callback is not a function | Mixed patterns | Use Promise or callback, not both |
Cannot read property 'then' | Using old callback-only method | Update to Promise-based method |
Resources
Next Steps
For CI/CD integration, see evernote-ci-integration.