Merge pull request #3210 from Steve-Fenton/master

Type Definitions for node-imap
This commit is contained in:
Masahiro Wakame
2014-11-24 13:19:36 +09:00
2 changed files with 228 additions and 0 deletions

126
node-imap/imap-tests.ts Normal file
View File

@@ -0,0 +1,126 @@
import Imap = require('imap');
var inspect = require('util').inspect;
var imap = new Imap({
user: 'mygmailname@gmail.com',
password: 'mygmailpassword',
host: 'imap.gmail.com',
port: 993,
tls: true
});
imap.once('ready', function () {
imap.openBox('INBOX', true,function (err, box) {
if (err) throw err;
var f = imap.seq.fetch('1:3', {
bodies: 'HEADER.FIELDS (FROM TO SUBJECT DATE)',
struct: true
});
f.on('message', function (msg, seqno) {
console.log('Message #%d', seqno);
var prefix = '(#' + seqno + ') ';
msg.on('body', function (stream, info) {
var buffer = '';
stream.on('data', function (chunk) {
buffer += chunk.toString('utf8');
});
stream.once('end', function () {
console.log(prefix + 'Parsed header: %s', inspect(Imap.parseHeader(buffer)));
});
});
msg.once('attributes', function (attrs) {
console.log(prefix + 'Attributes: %s', inspect(attrs, false, 8));
});
msg.once('end', function () {
console.log(prefix + 'Finished');
});
});
f.once('error', function (err) {
console.log('Fetch error: ' + err);
});
f.once('end', function () {
console.log('Done fetching all messages!');
imap.end();
});
});
});
imap.once('error', function (err) {
console.log(err);
});
imap.once('end', function () {
console.log('Connection ended');
});
imap.connect();
imap.openBox('INBOX', true, function (err, box) {
if (err) throw err;
var f = imap.seq.fetch(box.messages.total + ':*', { bodies: ['HEADER.FIELDS (FROM)', 'TEXT'] });
f.on('message', function (msg, seqno) {
console.log('Message #%d', seqno);
var prefix = '(#' + seqno + ') ';
msg.on('body', function (stream, info) {
if (info.which === 'TEXT')
console.log(prefix + 'Body [%s] found, %d total bytes', inspect(info.which), info.size);
var buffer = '', count = 0;
stream.on('data', function (chunk) {
count += chunk.length;
buffer += chunk.toString('utf8');
if (info.which === 'TEXT')
console.log(prefix + 'Body [%s] (%d/%d)', inspect(info.which), count, info.size);
});
stream.once('end', function () {
if (info.which !== 'TEXT')
console.log(prefix + 'Parsed header: %s', inspect(Imap.parseHeader(buffer)));
else
console.log(prefix + 'Body [%s] Finished', inspect(info.which));
});
});
msg.once('attributes', function (attrs) {
console.log(prefix + 'Attributes: %s', inspect(attrs, false, 8));
});
msg.once('end', function () {
console.log(prefix + 'Finished');
});
});
f.once('error', function (err) {
console.log('Fetch error: ' + err);
});
f.once('end', function () {
console.log('Done fetching all messages!');
imap.end();
});
});
var fs = require('fs'), fileStream : any;
imap.openBox('INBOX', true,function (err, box) {
if (err) throw err;
imap.search(['UNSEEN', ['SINCE', 'May 20, 2010']], function (err : Error, results: any) {
if (err) throw err;
var f = imap.fetch(results, { bodies: '' });
f.on('message', function (msg, seqno) {
console.log('Message #%d', seqno);
var prefix = '(#' + seqno + ') ';
msg.on('body', function (stream, info) {
console.log(prefix + 'Body');
stream.pipe(fs.createWriteStream('msg-' + seqno + '-body.txt'));
});
msg.once('attributes', function (attrs) {
console.log(prefix + 'Attributes: %s', inspect(attrs, false, 8));
});
msg.once('end', function () {
console.log(prefix + 'Finished');
});
});
f.once('error', function (err) {
console.log('Fetch error: ' + err);
});
f.once('end', function () {
console.log('Done fetching all messages!');
imap.end();
});
});
});

102
node-imap/imap.d.ts vendored Normal file
View File

@@ -0,0 +1,102 @@
// Type definitions for node imap
// Project: https://github.com/mscdex/node-imap
// Definitions by: Steve Fenton <https://github.com/Steve-Fenton>
// Definitions: https://github.com/borisyankov/DefinitelyTyped
/// <reference path="../node/node.d.ts" />
declare module "imap" {
interface ImapOptions {
user: string;
password: string;
host: string;
port: number;
tls: boolean;
}
interface ImapBox {
name: string;
readOnly: boolean;
newKeywords: boolean;
uidvalidity: number;
uidnext: number;
flags: any[]; // TODO
permFlags: any[]; // TODO
persistentUIDs: boolean;
messages: {
total: number;
'new': number;
unseen: number;
}
}
interface ImapChunk {
toString(charset: string): string;
length: number;
}
interface ImapFetch {
once(event: 'end', callback: () => void): void;
once(event: 'error', callback: (error: Error) => void): void;
once(event: string, callback: Function): void;
on(event: 'message', callback: (msg: ImapMessage, seqno: number) => void): void;
on(event: string, callback: Function): void;
}
interface ImapBodyStream {
once(event: 'end', callback: () => void): void;
once(event: string, callback: Function): void;
on(event: 'data', callback: (chunk: ImapChunk) => void): void;
on(event: string, callback: Function): void;
pipe(stream: any): void;
}
interface ImapMessage {
// TODO: typeof attributes
once(event: 'attributes', callback: (attributes: any) => void): void;
once(event: string, callback: Function): void;
// TODO: typeof info
on(event: 'body', callback: (stream: ImapBodyStream, info: any) => void): void;
on(event: string, callback: Function): void;
}
class Imap {
constructor(options: ImapOptions);
connect(): void;
//TODO:
// param a
openBox(name: string, a: boolean, callback: (err: Error, box: ImapBox) => void) : void;
//TODO:
// param a
// param b
once(event: 'end', callback: () => void): void;
once(event: 'error', callback: (error: Error) => void): void;
once(a: string, callback: Function) : void;
end(): void;
//TODO:
// return type
parseHeader(header: string): any;
static parseHeader(header: string): any;
search(searchTerms: any[], callback: Function): void;
fetch(results: any, options: {}): ImapFetch;
//TODO:
// type
seq: {
fetch(messageSourceQuery: string, options: {}): ImapFetch;
};
}
export = Imap;
}