Skip to content
This repository has been archived by the owner on Jun 18, 2019. It is now read-only.

Commit

Permalink
update to simplify odata getAs & postAs + fix for extend
Browse files Browse the repository at this point in the history
  • Loading branch information
patrick-rodgers committed Dec 12, 2016
1 parent fb16d7e commit 9cd3c03
Show file tree
Hide file tree
Showing 13 changed files with 69 additions and 73 deletions.
4 changes: 2 additions & 2 deletions debug/debug.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,8 @@ Logger.activeLogLevel = LogLevel.Verbose;
// import { Example } from "./example";
// Example();

import { batch } from "./batch";
batch();
import { getAs } from "./getAs";
getAs();

// you can also set break points inside the src folder to examine how things are working
// within the library while debugging!
2 changes: 1 addition & 1 deletion debug/example.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// use of relative paths to the modules
import pnp from "../src/pnp";
import { Logger, LogLevel, ConsoleListener } from "../src/utils/logging";
import { Logger, LogLevel } from "../src/utils/logging";

export function Example() {

Expand Down
2 changes: 1 addition & 1 deletion src/configuration/providers/spListConfigurationProvider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ export default class SPListConfigurationProvider implements IConfigurationProvid
public getConfiguration(): Promise<TypedHash<string>> {

return this.web.lists.getByTitle(this.listTitle).items.select("Title", "Value")
.getAs<any, { Title: string, Value: string }[]>().then((data) => {
.getAs<{ Title: string, Value: string }[]>().then((data) => {
return data.reduce((configuration, item) => {

return Object.defineProperty(configuration, item.Title, {
Expand Down
6 changes: 3 additions & 3 deletions src/sharepoint/caching.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,13 +28,13 @@ export class CachingOptions implements ICachingOptions {
}
}

export class CachingParserWrapper<T, U> implements ODataParser<T, U> {
export class CachingParserWrapper<T> implements ODataParser<T> {

constructor(
private _parser: ODataParser<T, U>,
private _parser: ODataParser<T>,
private _cacheOptions: CachingOptions) { }

public parse(response: Response): Promise<U> {
public parse(response: Response): Promise<T> {

// add this to the cache based on the options
return this._parser.parse(response).then(data => {
Expand Down
2 changes: 1 addition & 1 deletion src/sharepoint/contenttypes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ export class ContentTypes extends QueryableCollection {
"contentTypeId": contentTypeId,
});

return new ContentTypes(this, `addAvailableContentType`).postAs<any, { id: string }>({ body: postBody }).then((data) => {
return new ContentTypes(this, `addAvailableContentType`).postAs<{ id: string }>({ body: postBody }).then((data) => {
return {
contentType: this.getById(data.id),
data: data,
Expand Down
4 changes: 2 additions & 2 deletions src/sharepoint/fields.ts
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ export class Fields extends QueryableCollection {

let q: Fields = new Fields(this, "createfieldasxml");

return q.postAs<any, { Id: string }>({ body: postBody }).then((data) => {
return q.postAs<{ Id: string }>({ body: postBody }).then((data) => {
return {
data: data,
field: this.getById(data.Id),
Expand All @@ -93,7 +93,7 @@ export class Fields extends QueryableCollection {
"Title": title,
}, properties));

return this.postAs<any, { Id: string }>({ body: postBody }).then((data) => {
return this.postAs<{ Id: string }>({ body: postBody }).then((data) => {
return {
data: data,
field: this.getById(data.Id),
Expand Down
6 changes: 3 additions & 3 deletions src/sharepoint/files.ts
Original file line number Diff line number Diff line change
Expand Up @@ -388,7 +388,7 @@ export class File extends QueryableInstance {
* @returns The size of the total uploaded data in bytes.
*/
private startUpload(uploadId: string, fragment: ArrayBuffer | Blob): Promise<number> {
return new File(this, `startUpload(uploadId=guid'${uploadId}')`).postAs<any, string>({ body: fragment }).then(n => parseFloat(n));
return new File(this, `startUpload(uploadId=guid'${uploadId}')`).postAs<string>({ body: fragment }).then(n => parseFloat(n));
}

/**
Expand All @@ -403,7 +403,7 @@ export class File extends QueryableInstance {
* @returns The size of the total uploaded data in bytes.
*/
private continueUpload(uploadId: string, fileOffset: number, fragment: ArrayBuffer | Blob): Promise<number> {
return new File(this, `continueUpload(uploadId=guid'${uploadId}',fileOffset=${fileOffset})`).postAs<any, string>({ body: fragment }).then(n => parseFloat(n));
return new File(this, `continueUpload(uploadId=guid'${uploadId}',fileOffset=${fileOffset})`).postAs<string>({ body: fragment }).then(n => parseFloat(n));
}

/**
Expand All @@ -418,7 +418,7 @@ export class File extends QueryableInstance {
*/
private finishUpload(uploadId: string, fileOffset: number, fragment: ArrayBuffer | Blob): Promise<FileAddResult> {
return new File(this, `finishUpload(uploadId=guid'${uploadId}',fileOffset=${fileOffset})`)
.postAs<any, { ServerRelativeUrl: string }>({ body: fragment }).then((response) => {
.postAs<{ ServerRelativeUrl: string }>({ body: fragment }).then((response) => {
return {
data: response,
file: new File(response.ServerRelativeUrl),
Expand Down
8 changes: 4 additions & 4 deletions src/sharepoint/items.ts
Original file line number Diff line number Diff line change
Expand Up @@ -63,13 +63,13 @@ export class Items extends QueryableCollection {

let parentList = this.getParent(QueryableInstance);

return parentList.select("ListItemEntityTypeFullName").getAs<any, { ListItemEntityTypeFullName: string }>().then((d) => {
return parentList.select("ListItemEntityTypeFullName").getAs<{ ListItemEntityTypeFullName: string }>().then((d) => {

let postBody = JSON.stringify(Util.extend({
"__metadata": { "type": d.ListItemEntityTypeFullName },
}, properties));

let promise = this.postAs<any, { Id: number }>({ body: postBody }).then((data) => {
let promise = this.postAs<{ Id: number }>({ body: postBody }).then((data) => {
return {
data: data,
item: this.getById(data.Id),
Expand Down Expand Up @@ -174,7 +174,7 @@ export class Item extends QueryableSecurable {

let parentList = this.getParent(QueryableInstance, this.parentUrl.substr(0, this.parentUrl.lastIndexOf("/")));

return parentList.select("ListItemEntityTypeFullName").getAs<any, { ListItemEntityTypeFullName: string }>().then((d) => {
return parentList.select("ListItemEntityTypeFullName").getAs<{ ListItemEntityTypeFullName: string }>().then((d) => {

let postBody = JSON.stringify(Util.extend({
"__metadata": { "type": d.ListItemEntityTypeFullName },
Expand Down Expand Up @@ -288,7 +288,7 @@ export class PagedItemCollection<T> {
}
}

class PagedItemCollectionParser extends ODataParserBase<any, PagedItemCollection<any>> {
class PagedItemCollectionParser extends ODataParserBase<PagedItemCollection<any>> {
public parse(r: Response): Promise<PagedItemCollection<any>> {

return r.json().then(json => {
Expand Down
50 changes: 25 additions & 25 deletions src/sharepoint/odata.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,11 @@ export function extractOdataId(candidate: any): string {
}
}

export interface ODataParser<T, U> {
export interface ODataParser<U> {
parse(r: Response): Promise<U>;
}

export abstract class ODataParserBase<T, U> implements ODataParser<T, U> {
export abstract class ODataParserBase<U> implements ODataParser<U> {

public parse(r: Response): Promise<U> {
return r.json().then(json => this.parseODataJSON(json));
Expand All @@ -42,36 +42,36 @@ export abstract class ODataParserBase<T, U> implements ODataParser<T, U> {
}
}

export class ODataDefaultParser extends ODataParserBase<any, any> {
export class ODataDefaultParser extends ODataParserBase<any> {
}

export class ODataRawParserImpl implements ODataParser<any, any> {
export class ODataRawParserImpl implements ODataParser<any> {
public parse(r: Response): Promise<any> {
return r.json();
}
}

class ODataValueParserImpl<T> extends ODataParserBase<any, T> {
class ODataValueParserImpl<T> extends ODataParserBase<T> {
public parse(r: Response): Promise<T> {
return super.parse(r).then(d => d as T);
}
}

class ODataEntityParserImpl<T> extends ODataParserBase<T, T> {
class ODataEntityParserImpl<T> extends ODataParserBase<T> {

constructor(protected factory: QueryableConstructor<T>) {
super();
}

public parse(r: Response): Promise<T> {
return super.parse(r).then(d => {
let o = new this.factory(getEntityUrl(d), null);
let o = <T>new this.factory(getEntityUrl(d), null);
return Util.extend(o, d);
});
}
}

class ODataEntityArrayParserImpl<T> extends ODataParserBase<T, T[]> {
class ODataEntityArrayParserImpl<T> extends ODataParserBase<T[]> {

constructor(protected factory: QueryableConstructor<T>) {
super();
Expand All @@ -80,7 +80,7 @@ class ODataEntityArrayParserImpl<T> extends ODataParserBase<T, T[]> {
public parse(r: Response): Promise<T[]> {
return super.parse(r).then((d: any[]) => {
return d.map(v => {
let o = new this.factory(getEntityUrl(v), null);
let o = <T>new this.factory(getEntityUrl(v), null);
return Util.extend(o, v);
});
});
Expand All @@ -89,12 +89,12 @@ class ODataEntityArrayParserImpl<T> extends ODataParserBase<T, T[]> {

function getEntityUrl(entity: any): string {

if (entity.hasOwnProperty("__metadata")) {
// we are dealing with verbose, which has an absolute uri
return entity.__metadata.uri;
} else if (entity.hasOwnProperty("odata.editLink")) {
if (entity.hasOwnProperty("odata.editLink")) {
// we are dealign with minimal metadata (default)
return Util.combinePaths("_api", entity["odata.editLink"]);
} else if (entity.hasOwnProperty("__metadata")) {
// we are dealing with verbose, which has an absolute uri
return entity.__metadata.uri;
} else {
// we are likely dealing with nometadata, so don't error but we won't be able to
// chain off these objects
Expand All @@ -105,16 +105,16 @@ function getEntityUrl(entity: any): string {

export let ODataRaw = new ODataRawParserImpl();

export function ODataValue<T>(): ODataParser<any, T> {
export function ODataValue<T>(): ODataParser<T> {
return new ODataValueParserImpl<T>();
}

export function ODataEntity<T>(factory: QueryableConstructor<T>): ODataParser<T, T> {
export function ODataEntity<T>(factory: QueryableConstructor<T>): ODataParser<T> {
return new ODataEntityParserImpl(factory);
}

export function ODataEntityArray<T>(factory: QueryableConstructor<T>): ODataParser<T, T[]> {
return new ODataEntityArrayParserImpl<T>(factory);
export function ODataEntityArray<T>(factory: QueryableConstructor<T>): ODataParser<T[]> {
return new ODataEntityArrayParserImpl(factory);
}

/**
Expand All @@ -138,18 +138,18 @@ export class ODataBatch {
* @param options Any options to include in the request
* @param parser The parser that will hadle the results of the request
*/
public add<U>(url: string, method: string, options: any, parser: ODataParser<any, U>): Promise<U> {
public add<T>(url: string, method: string, options: any, parser: ODataParser<T>): Promise<T> {

let info = {
method: method.toUpperCase(),
options: options,
parser: parser,
reject: <(reason?: any) => void>null,
resolve: <(value?: U | PromiseLike<U>) => void>null,
resolve: <(value?: T | PromiseLike<T>) => void>null,
url: url,
};

let p = new Promise<U>((resolve, reject) => {
let p = new Promise<T>((resolve, reject) => {
info.resolve = resolve;
info.reject = reject;
});
Expand Down Expand Up @@ -369,33 +369,33 @@ interface ODataBatchRequestInfo {
url: string;
method: string;
options: any;
parser: ODataParser<any, any>;
parser: ODataParser<any>;
resolve: (d: any) => void;
reject: (error: any) => void;
}

export class TextFileParser implements ODataParser<any, string> {
export class TextFileParser implements ODataParser<string> {

public parse(r: Response): Promise<string> {
return r.text();
}
}

export class BlobFileParser implements ODataParser<any, Blob> {
export class BlobFileParser implements ODataParser<Blob> {

public parse(r: Response): Promise<Blob> {
return r.blob();
}
}

export class JSONFileParser implements ODataParser<any, any> {
export class JSONFileParser implements ODataParser<any> {

public parse(r: Response): Promise<any> {
return r.json();
}
}

export class BufferFileParser implements ODataParser<any, ArrayBuffer> {
export class BufferFileParser implements ODataParser<ArrayBuffer> {

public parse(r: any): Promise<ArrayBuffer> {

Expand Down
26 changes: 13 additions & 13 deletions src/sharepoint/queryable.ts
Original file line number Diff line number Diff line change
Expand Up @@ -203,27 +203,27 @@ export class Queryable {
* Executes the currently built request
*
*/
public get(parser: ODataParser<any, any> = new ODataDefaultParser(), getOptions: FetchOptions = {}): Promise<any> {
public get(parser: ODataParser<any> = new ODataDefaultParser(), getOptions: FetchOptions = {}): Promise<any> {
return this.getImpl(getOptions, parser);
}

public getAs<T, U>(parser: ODataParser<T, U> = new ODataDefaultParser(), getOptions: FetchOptions = {}): Promise<U> {
public getAs<T>(parser: ODataParser<T> = new ODataDefaultParser(), getOptions: FetchOptions = {}): Promise<T> {
return this.getImpl(getOptions, parser);
}

protected post(postOptions: FetchOptions = {}, parser: ODataParser<any, any> = new ODataDefaultParser()): Promise<any> {
protected post(postOptions: FetchOptions = {}, parser: ODataParser<any> = new ODataDefaultParser()): Promise<any> {
return this.postImpl(postOptions, parser);
}

protected postAs<T, U>(postOptions: FetchOptions = {}, parser: ODataParser<T, U> = new ODataDefaultParser()): Promise<U> {
protected postAs<T>(postOptions: FetchOptions = {}, parser: ODataParser<T> = new ODataDefaultParser()): Promise<T> {
return this.postImpl(postOptions, parser);
}

protected patch(patchOptions: FetchOptions = {}, parser: ODataParser<any, any> = new ODataDefaultParser()): Promise<any> {
protected patch(patchOptions: FetchOptions = {}, parser: ODataParser<any> = new ODataDefaultParser()): Promise<any> {
return this.patchImpl(patchOptions, parser);
}

protected delete(deleteOptions: FetchOptions = {}, parser: ODataParser<any, any> = new ODataDefaultParser()): Promise<any> {
protected delete(deleteOptions: FetchOptions = {}, parser: ODataParser<any> = new ODataDefaultParser()): Promise<any> {
return this.deleteImpl(deleteOptions, parser);
}

Expand All @@ -245,7 +245,7 @@ export class Queryable {
return parent;
}

private getImpl<U>(getOptions: FetchOptions = {}, parser: ODataParser<any, U>): Promise<U> {
private getImpl<T>(getOptions: FetchOptions = {}, parser: ODataParser<T>): Promise<T> {

if (this._useCaching) {
let options = new CachingOptions(this.toUrlAndQuery().toLowerCase());
Expand Down Expand Up @@ -281,7 +281,7 @@ export class Queryable {
}
}

private postImpl<U>(postOptions: FetchOptions, parser: ODataParser<any, U>): Promise<U> {
private postImpl<T>(postOptions: FetchOptions, parser: ODataParser<T>): Promise<T> {

if (!this.hasBatch) {

Expand All @@ -296,7 +296,7 @@ export class Queryable {
}
}

private patchImpl<U>(patchOptions: FetchOptions, parser: ODataParser<any, U>): Promise<U> {
private patchImpl<T>(patchOptions: FetchOptions, parser: ODataParser<T>): Promise<T> {

if (!this.hasBatch) {

Expand All @@ -311,7 +311,7 @@ export class Queryable {
}
}

private deleteImpl<U>(deleteOptions: FetchOptions, parser: ODataParser<any, U>): Promise<U> {
private deleteImpl<T>(deleteOptions: FetchOptions, parser: ODataParser<T>): Promise<T> {

if (!this.hasBatch) {

Expand All @@ -326,9 +326,9 @@ export class Queryable {
}
}

private processHttpClientResponse<U>(response: Response, parser: ODataParser<any, U>): Promise<U> {
private processHttpClientResponse<T>(response: Response, parser: ODataParser<T>): Promise<T> {

return new Promise<U>((resolve, reject) => {
return new Promise<T>((resolve, reject) => {

// 200 = OK (get, delete)
// 201 = Created (create)
Expand All @@ -340,7 +340,7 @@ export class Queryable {

// in these cases the server has returned no content, so we create an empty object
// this was done because the fetch browser methods throw exceptions with no content
resolve(<U>{});
resolve(<T>{});
}

// pipe our parsed content
Expand Down
Loading

0 comments on commit 9cd3c03

Please sign in to comment.