Skip to content

Commit f91bb49

Browse files
committed
include copyright, replace winjs (local custom) with winjs-node
1 parent dc2a3da commit f91bb49

21 files changed

+249
-72
lines changed

COPYRIGHT

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
WinJS (https://github.com/winjs/winjs)
2+
3+
Copyright (c) Microsoft Corporation
4+
All rights reserved.
5+
MIT License
6+
7+
8+
q (https://github.com/kriskowal/q)
9+
Copyright 2009–2014 Kristopher Michael Kowal. All rights reserved.
10+
MIT License
11+
12+
13+
xmldom (https://github.com/jindw/xmldom)
14+
selected MIT license (http://opensource.org/licenses/MIT)
15+
[xmldom is licensed under MIT or LGPL]
16+
17+
18+
moment/moment-timezone (http://momentjs.com, https://github.com/moment/)
19+
MIT License

LICENSE

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
The MIT License (MIT)
22

3-
Copyright (c) 2014 Gautam Singh
3+
Copyright (c) 2014-2015 Gautam Singh
44

55
Permission is hereby granted, free of charge, to any person obtaining a copy
66
of this software and associated documentation files (the "Software"), to deal

README.md

+132-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,134 @@
1-
ews-typescript-api
1+
ews-javascript-api
22
==================
3+
##Exchange Web Service in JavaScript, available cross platform on Windows/Mac/Linux/Cordova
34

4-
EWS API for TypeScript/JavaScript - code based on OfficeDev/ews-managed-api
5+
EWS managed API for TypeScript/JavaScript - code ported from OfficeDev/ews-managed-api. availbale for node.js and mobile devices (cordova)
6+
7+
All http operation is wrapped in promise using (WinJS promise or Q promise - configurable at build or in initialization).
8+
Coding style is highly compatible with EWS managed api 2.1 except it is async :).
9+
10+
##Documentation
11+
more documents available in wiki (publishig soon)
12+
13+
###install in node
14+
```shell
15+
[sudo] npm install ews-managed-api
16+
```
17+
18+
#### Use in node
19+
#####Autodiscover user settings
20+
```javascript
21+
//import ews module
22+
var ews = require('ews-javascript-api');
23+
//create AutodiscoverService object
24+
var autod = new ews.AutodiscoverService(new ews.Uri("https://autodiscover-.outlook.com/autodiscover/autodiscover.svc"), ews.ExchangeVersion.Exchange2010);
25+
//you can omit url and it will autodiscover the url, version helps throw error on client side for unsupported operations.example - //var autod = new ews.AutodiscoverService(ews.ExchangeVersion.Exchange2010);
26+
//set credential for service
27+
autod.Credentials = new ews.ExchangeCredentials("userName", "password");
28+
//create array to include list of desired settings
29+
var settings = [
30+
ews.UserSettingName.InternalEwsUrl,
31+
ews.UserSettingName.ExternalEwsUrl,
32+
ews.UserSettingName.UserDisplayName,
33+
ews.UserSettingName.UserDN,
34+
ews.UserSettingName.EwsPartnerUrl,
35+
ews.UserSettingName.DocumentSharingLocations,
36+
ews.UserSettingName.MailboxDN,
37+
ews.UserSettingName.ActiveDirectoryServer,
38+
ews.UserSettingName.CasVersion,
39+
ews.UserSettingName.ExternalWebClientUrls,
40+
ews.UserSettingName.ExternalImap4Connections,
41+
ews.UserSettingName.AlternateMailboxes
42+
];
43+
//get the setting
44+
autod.GetUserSettings(["[email protected]", "[email protected]"], settings)
45+
.then(function (response) {
46+
//do what you want with user settings
47+
var tabcount = 0;
48+
var tabs = function () { return ews.StringHelper.Repeat("\t", tabcount); };
49+
console.log(autod.Url.ToString());
50+
//uncoment next line to see full response from autodiscover, you will need to add var util = require('util');
51+
//console.log(util.inspect(response, { showHidden: false, depth: null, colors: true }));
52+
for (var _i = 0, _a = response.Responses; _i < _a.length; _i++) {
53+
var resp = _a[_i];
54+
console.log(ews.StringHelper.Format("{0}settings for email: {1}", tabs(), resp.SmtpAddress));
55+
tabcount++;
56+
for (var setting in resp.Settings) {
57+
console.log(ews.StringHelper.Format("{0}{1} = {2}", tabs(), ews.UserSettingName[setting], resp.Settings[setting]));
58+
}
59+
tabcount--;
60+
}
61+
}, function (e) {
62+
//log errors or do something with errors
63+
});
64+
```
65+
66+
#####Use EWS operations
67+
Example of user availability
68+
```javascript
69+
var ews = require('ews-javascript-api');
70+
//create ExchangeService object
71+
var exch = new ews.ExchangeService(ews.ExchangeVersion.Exchange2013);
72+
exch.Credentials = new ews.ExchangeCredentials("userName", "password");
73+
//set ews endpoint url to use
74+
exch.Url = new ews.Uri("https://outlook.office365.com/Ews/Exchange.asmx"); // you can also use exch.AutodiscoverUrl
75+
76+
var attendee =[ new ews.AttendeeInfo("[email protected]"), new ews.AttendeeInfo("[email protected]")];
77+
//create timewindow object o request avaiability suggestions for next 48 hours, DateTime and TimeSpan object is created to mimic portion of .net datetime/timespan object using momentjs
78+
var timeWindow = new ews.TimeWindow(ews.DateTime.Now, new ews.DateTime(ews.DateTime.Now.TotalMilliSeconds + ews.TimeSpan.FromHours(48).asMilliseconds()));
79+
exch.GetUserAvailability(attendee, timeWindow, ews.AvailabilityData.FreeBusyAndSuggestions)
80+
.then(function (availabilityResponse) {
81+
//do what you want with user availability
82+
}, function (errors) {
83+
//log errors or do something with errors
84+
});
85+
86+
```
87+
88+
####Other Opetations
89+
#####Folder Operations
90+
* BindToFolder
91+
* CopyFolder
92+
* CreateFolder
93+
* DeleteFolder
94+
* EmptyFolder
95+
* FindFolders
96+
* LoadPropertiesForFolder
97+
* MarkAllItemsAsRead
98+
* MoveFolder
99+
* UpdateFolder
100+
101+
#####Item Operations
102+
103+
* ArchiveItem*
104+
* BindToItem*
105+
* CopyItem[s]*
106+
* CreateItem*
107+
* DeleteItem[s]*
108+
* FindAppointments*
109+
* FindItems
110+
* MarkAsJunk*
111+
* MoveItem*
112+
* SendItem*
113+
* UpdateItem[s]*
114+
115+
#####Availability Operations
116+
117+
118+
* GetUserAvailability
119+
120+
[*--Work in progress for next minor release]
121+
122+
#####many more operations to be available soon
123+
124+
125+
####Use in Cordova
126+
AMD module for require.js to be included in build system, will be publishing bower module and documentation soon with.
127+
128+
129+
#Tests
130+
in progress....
131+
132+
133+
#License
134+
Licensed under MIT

bower.json

+4-1
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@
2727
],
2828
"dependencies": {
2929
"requirejs": "~2.1.18",
30-
"winjs": "~4.0.1"
30+
"winjs": "~4.0.1",
31+
"moment-timezone": "~0.4.0",
32+
"moment": "~2.10.3",
33+
"requirejs-plugins": "~1.0.3"
3134
}
3235
}

gulpfile.js

+8-16
Original file line numberDiff line numberDiff line change
@@ -118,22 +118,6 @@ gulp.task('ts-compile-amd', function (done) {
118118
runTSC('.', outdir, ["--module", "amd"], done);
119119
});
120120

121-
// function runTSCAmd(directory, done) {
122-
// var tscjs = path.join(process.cwd(), 'node_modules/typescript/bin/tsc.js');
123-
// var outdir = path.join(process.cwd(), 'build/output/amd');
124-
// var childProcessAmd = cp.spawn('node', [tscjs, '-p', directory, '--outDir', outdir, "--module", "amd"], { cwd: process.cwd() });
125-
// childProcessAmd.stdout.on('data', function (data) {
126-
// // Ticino will read the output
127-
// console.log(data.toString());
128-
// });
129-
// childProcessAmd.stderr.on('data', function (data) {
130-
// // Ticino will read the output
131-
// console.log(data.toString());
132-
// });
133-
// childProcessAmd.on('close', function () {
134-
// done();
135-
// });
136-
// }
137121

138122
/**
139123
* Compiles *.js files, sourcemaps,
@@ -182,6 +166,14 @@ gulp.task('serve-dev',function(done){
182166

183167
});
184168

169+
gulp.task("npm-prep", function(){
170+
return gulp.src([
171+
"./README.md",
172+
"./LICENSE",
173+
"./package.json"
174+
])
175+
.pipe(gulp.dest("./build/output/node/src"));
176+
});
185177

186178

187179
/**

package.json

+8-4
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
{
22
"name": "ews-javascript-api",
3-
"version": "0.0.1",
3+
"version": "0.1.1",
44
"description": "EWS Managed api in JavaScript",
5-
"main": "build/main.js",
5+
"main": "js/ExchangeWebService.js",
66
"scripts": {
77
"test": "echo \"Error: no test specified\" && exit 1"
88
},
@@ -11,7 +11,10 @@
1111
"url": "https://github.com/gautamsi/ews-javascript-api.git"
1212
},
1313
"keywords": [
14-
"ews"
14+
"ews",
15+
"ews javascript api",
16+
"ews-javascript-api",
17+
"exchange web service"
1518
],
1619
"author": "Gautam Singh (gautamsi)",
1720
"license": "MIT",
@@ -22,7 +25,7 @@
2225
"dependencies": {
2326
"moment": "^2.10.3",
2427
"moment-timezone": "^0.4.0",
25-
"winjs": "^1.0.0",
28+
"winjs-node": "^0.1.0",
2629
"xmldom": "^0.1.19"
2730
},
2831
"devDependencies": {
@@ -41,6 +44,7 @@
4144
"mocha": "^2.2.5",
4245
"node-notifier": "^4.0.3",
4346
"q": "^1.0.1",
47+
"r": "0.0.5",
4448
"typescript": "^1.5.0-beta",
4549
"yargs": "^1.3.3"
4650
}

projects/vs2015/ews-javascript-api.njsproj

+1
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@
140140
<Folder Include="typings\node\" />
141141
<Folder Include="typings\q\" />
142142
<Folder Include="typings\winjs\" />
143+
<Folder Include="typings\winston\" />
143144
</ItemGroup>
144145
<!-- Do not delete the following Import Project. While this appears to do nothing it is a marker for setting TypeScript properties before our import that depends on them. -->
145146
<PropertyGroup Condition="'$(Configuration)' == 'Debug'">

src/js/AltDictionary.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ export interface KeyValuePair<TKey, TValue> {
1616
interface StringPropertyDefinitionArray<TKey, TValue> {
1717
[index: string]: TValue;
1818
}
19-
interface StringKeyPicker<TValue> {
19+
export interface StringKeyPicker<TValue> {
2020
(value: TValue): string;
2121
}
2222
export class Dictionary<TKey, TValue>{

src/js/Autodiscover/AutodiscoverService.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1007,7 +1007,7 @@ export class AutodiscoverService extends ExchangeServiceBase {
10071007
}
10081008

10091009
//ref: converted to delegate type interface
1010-
interface GetSettingsMethod<TGetSettingsResponseCollection, TSettingName> {
1010+
export interface GetSettingsMethod<TGetSettingsResponseCollection, TSettingName> {
10111011
(smtpAddresses: string[], settings: TSettingName[], requestedVersion: ExchangeVersion, autodiscoverUrl: IRefParam<Uri>, thisref: AutodiscoverService): IPromise<TGetSettingsResponseCollection>
10121012
}
10131013
//class GetSettingsMethod<TGetSettingsResponseCollection, TSettingName> extends System.MulticastDelegate {

src/js/ComplexProperties/TimeZones/TimeZoneTransitionGroup.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import {StringHelper} from "../../ExtensionMethods";
1111
import {Strings} from "../../Strings";
1212
import {ComplexProperty} from "../ComplexProperty";
1313

14-
class CustomTimeZoneCreateParams {
14+
export class CustomTimeZoneCreateParams {
1515
private baseOffsetToUtc: TimeSpan = null;//TimeSpan = null;
1616
private standardDisplayName: string = null;
1717
private daylightDisplayName: string = null;

src/js/Core/EwsUtilities.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -569,11 +569,11 @@ export class EwsUtilities {
569569
}
570570

571571

572-
interface EnumToExhcangeVersionDelegateDictionary {
572+
export interface EnumToExhcangeVersionDelegateDictionary {
573573
[index: string]: EnumVersionDelegate;
574574
}
575575

576-
interface EnumVersionDelegate {
576+
export interface EnumVersionDelegate {
577577
(value: number): ExchangeVersion;
578578
}
579579

src/js/Core/ExchangeService.ts

+8-8
Original file line numberDiff line numberDiff line change
@@ -145,14 +145,6 @@ export class ExchangeService extends ExchangeServiceBase {
145145

146146
/* #region Folder operations */
147147

148-
CreateFolder(folder: Folder, parentFolderId: FolderId): IPromise<void> {
149-
var request: CreateFolderRequest = new CreateFolderRequest(this, ServiceErrorHandling.ThrowOnError);
150-
request.Folders = [folder];
151-
request.ParentFolderId = parentFolderId;
152-
return request.Execute().then((value) => {
153-
return null;
154-
});
155-
}
156148
BindToFolderAs<TFolder extends Folder>(folderId: FolderId, propertySet: PropertySet): IPromise<TFolder> {
157149
// debugger;
158150
return this.BindToFolder(folderId, propertySet);
@@ -194,6 +186,14 @@ export class ExchangeService extends ExchangeServiceBase {
194186
return responses.__thisIndexer(0).Folder;
195187
});
196188
}
189+
CreateFolder(folder: Folder, parentFolderId: FolderId): IPromise<void> {
190+
var request: CreateFolderRequest = new CreateFolderRequest(this, ServiceErrorHandling.ThrowOnError);
191+
request.Folders = [folder];
192+
request.ParentFolderId = parentFolderId;
193+
return request.Execute().then((value) => {
194+
return null;
195+
});
196+
}
197197
DeleteFolder(folderId: FolderId, deleteMode: DeleteMode): IPromise<void> {
198198
EwsUtilities.ValidateParam(folderId, "folderId");
199199
var request: DeleteFolderRequest = new DeleteFolderRequest(this, ServiceErrorHandling.ThrowOnError);

src/js/Core/LazyMember.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ export class LazyMember<T> {
2727
}
2828

2929

30-
interface InitializeLazyMember<T> {
30+
export interface InitializeLazyMember<T> {
3131
(): T;
3232

3333
//export class InitializeLazyMember<T> extends System.MulticastDelegate {

src/js/ExtensionMethods.ts

+14-7
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,13 @@ export module StringHelper {
1717
}
1818

1919
export var Empty = "";
20+
21+
export function Repeat(str: string = "", times: number = 1): string {
22+
return new Array(times + 1).join(str);
23+
}
24+
export function Tabs(times: number = 0): string {
25+
return Repeat("\t", times);
26+
}
2027
}
2128

2229
export module EnumHelper {
@@ -26,7 +33,7 @@ export module EnumHelper {
2633
export function ToString(enumObj: any, checkFlag: number, includeZero: boolean = false): string {
2734
if ((checkFlag & (checkFlag - 1)) == 0)
2835
return enumObj[checkFlag];
29-
var ret: string[] = [];
36+
var result: string[] = [];
3037
var diff = checkFlag;
3138

3239
var largestFlag = 0;// = Math.pow(2, Math.floor(Math.pow(checkFlag, (1 / 2))));
@@ -35,13 +42,13 @@ export module EnumHelper {
3542
diff = diff - largestFlag;
3643
var largestValue = enumObj[largestFlag];
3744
if (largestValue === undefined) return undefined;
38-
ret.push(largestValue);
45+
result.push(largestValue);
3946
}
40-
if (diff == 1) ret.push(enumObj[1]);
41-
if (includeZero && enumObj[0]) ret.push(enumObj[0]);
47+
if (diff == 1) result.push(enumObj[1]);
48+
if (includeZero && enumObj[0]) result.push(enumObj[0]);
4249

43-
ret.reverse();
44-
return ret.join(",");
50+
result.reverse();
51+
return result.join(",");
4552
}
4653
}
4754

@@ -307,7 +314,7 @@ export class xml2JsObject {
307314
module Parsers {
308315

309316
}
310-
interface ParsedUrl {
317+
export interface ParsedUrl {
311318
scheme: string;
312319
authority: string;
313320
path: string;

0 commit comments

Comments
 (0)