Migrating Nango Deletion Detection
Do this
- Find legacy usage:
- deleteRecordsFromPreviousExecutions( - trackDeletes: / track_deletes
- For each sync + model that needs automatic deletion detection:
- Add await nango.trackDeletesStart('ModelName') at the start of exec (before fetching/saving). - Replace await nango.deleteRecordsFromPreviousExecutions('ModelName') with await nango.trackDeletesEnd('ModelName'). - Keep trackDeletesEnd after all batchSave/batchUpdate/batchDelete calls.
- Safety:
- Only call trackDeletesEnd if the full dataset was fetched + saved between trackDeletesStart and trackDeletesEnd (otherwise you can cause false deletions). - Prefer letting exceptions bubble. If you catch, re-throw when data is incomplete.
Checkpointed full refresh (multi-execution)
- Call
trackDeletesStart('ModelName')at the beginning of each execution in the refresh window (it is safe/idempotent while the window is open). - Call
trackDeletesEnd('ModelName')only in the execution that finishes saving the full dataset.
Tests
- Re-record mocks after code changes:
- nango dryrun <sync-name> <connection-id> --validate -e dev --no-interactive --auto-confirm - nango dryrun <sync-name> <connection-id> --save -e dev --no-interactive --auto-confirm - nango generate:tests && npm test
- Never hand-edit
*.test.json.
Before/after
// Before
for await (const page of nango.paginate(cfg)) {
await nango.batchSave(page, 'Ticket');
}
await nango.deleteRecordsFromPreviousExecutions('Ticket');// After
await nango.trackDeletesStart('Ticket');
for await (const page of nango.paginate(cfg)) {
await nango.batchSave(page, 'Ticket');
}
await nango.trackDeletesEnd('Ticket');