diff --git a/CrossPlatformModules.csproj b/CrossPlatformModules.csproj index 52a85dee5..bf4f8b10b 100644 --- a/CrossPlatformModules.csproj +++ b/CrossPlatformModules.csproj @@ -288,10 +288,7 @@ - - - - + file-name-resolver.d.ts @@ -813,6 +810,7 @@ + PreserveNewest diff --git a/fetch/body.ts b/fetch/body.ts deleted file mode 100644 index 1070006b5..000000000 --- a/fetch/body.ts +++ /dev/null @@ -1,100 +0,0 @@ -// https://fetch.spec.whatwg.org/#json -type object = JSON; - -type body = Object; // byte stream - -// https://fetch.spec.whatwg.org/#bodyinit -type BodyInit = Blob | BufferSource | FormData | URLSearchParams | USVString - -// https://fetch.spec.whatwg.org/#body -interface IBody { - // readonly property - bodyUsed: boolean; - - // method - arrayBuffer(): Promise; - blob(): Promise; - formData(): Promise; - json(): Promise; - text(): Promise; -}; - -// https://fetch.spec.whatwg.org/#body -class Body implements IBody { - private _bodyUsed: boolean; - private _body: body; - private _usedFlag: boolean; - private _mimeType: string; - - get bodyUsed(): boolean { - return this._bodyUsed; - } - - get body(): body { - return this._body; - } - - get usedFlag(): boolean { - return this._usedFlag; - } - - get mimeType(): string { - return this._mimeType; - } - - consumeBody(_type: string): any { - // step 1 - var p = new Promise((resolve, reject) => { - // step 2 - if (this._bodyUsed == true) { - return reject(new TypeError("body was already used")); - } - - // step 3 - this._bodyUsed = true; - - // step 3-1 - var stream = this._body; - - // step 3-2 - if (stream == null) { - stream = []; - } - - // step 3-3 - // TODO: Let bytes be the result of reading from stream until it returns end-of-stream. - var bytes; - - // step 4 - // TODO: implement me - switch(_type) { - case "ArrayBuffer": - case "Blob": - case "FormData": - case "JSON": - case "text": - } - }); - return p; - } - - arrayBuffer(): Promise { - return this.consumeBody("ArrayBuffer"); - } - - blob(): Promise { - return this.consumeBody("Blob"); - } - - formData(): Promise { - return this.consumeBody("FormData"); - } - - json(): Promise { - return this.consumeBody("JSON"); - } - - text(): Promise { - return this.consumeBody("text"); - } -} diff --git a/fetch/fetch.d.ts b/fetch/fetch.d.ts new file mode 100644 index 000000000..8be44d6c1 --- /dev/null +++ b/fetch/fetch.d.ts @@ -0,0 +1,87 @@ +// Type definitions for fetch API +// Project: https://github.com/github/fetch +// Definitions by: Ryan Graham +// Definitions: https://github.com/borisyankov/DefinitelyTyped + +/// + +declare module "fetch" { + + class Request { + constructor(input: string|Request, init?: RequestInit); + method: string; + url: string; + headers: Headers; + context: RequestContext; + referrer: string; + mode: RequestMode; + credentials: RequestCredentials; + cache: RequestCache; + } + + interface RequestInit { + method?: string; + headers?: HeaderInit|{ [index: string]: string }; + body?: BodyInit; + mode?: RequestMode; + credentials?: RequestCredentials; + cache?: RequestCache; + } + + enum RequestContext { + "audio", "beacon", "cspreport", "download", "embed", "eventsource", "favicon", "fetch", + "font", "form", "frame", "hyperlink", "iframe", "image", "imageset", "import", + "internal", "location", "manifest", "object", "ping", "plugin", "prefetch", "script", + "serviceworker", "sharedworker", "subresource", "style", "track", "video", "worker", + "xmlhttprequest", "xslt" + } + + enum RequestMode { "same-origin", "no-cors", "cors" } + enum RequestCredentials { "omit", "same-origin", "include" } + enum RequestCache { "default", "no-store", "reload", "no-cache", "force-cache", "only-if-cached" } + + class Headers { + append(name: string, value: string): void; + delete(name: string): void; + get(name: string): string; + getAll(name: string): Array; + has(name: string): boolean; + set(name: string, value: string): void; + } + + class Body { + bodyUsed: boolean; + arrayBuffer(): Promise; + blob(): Promise; + formData(): Promise; + json(): Promise; + text(): Promise; + } + + class Response extends Body { + constructor(body?: BodyInit, init?: ResponseInit); + error(): Response; + redirect(url: string, status: number): Response; + type: ResponseType; + url: string; + status: number; + ok: boolean; + statusText: string; + headers: Headers; + clone(): Response; + } + + enum ResponseType { "basic", "cors", "default", "error", "opaque" } + + class ResponseInit { + status: number; + statusText: string; + headers: HeaderInit; + } + + type HeaderInit = Headers|Array; + type BodyInit = Blob|FormData|string; + type RequestInfo = Request|string; + + function fetch(url: string, init?: RequestInit): Promise; +} \ No newline at end of file diff --git a/fetch/fetch.ts b/fetch/fetch.ts deleted file mode 100644 index c2dbc6f75..000000000 --- a/fetch/fetch.ts +++ /dev/null @@ -1,677 +0,0 @@ -/// -/// -/// - -// http://heycam.github.io/webidl/#common-BufferSource -class BufferSource { -} - -// https://url.spec.whatwg.org/#urlsearchparams -class URLSearchParams { -} - -// https://fetch.spec.whatwg.org/#concept-method -enum MethodEnum { - OPTIONS, - GET, - HEAD, - POST, - PUT, - DELETE, - TRACE, - CONNECT, -} - -// https://fetch.spec.whatwg.org/#simple-method -enum SimpleMethodEnum { - GET, - HEAD, - POST -} - -function isSimpleMethod(method: ByteString): boolean { - if (SimpleMethodEnum[method] !== undefined) { - return true; - } - return false; -} - -// https://fetch.spec.whatwg.org/#forbidden-method -enum ForbiddenMethodEnum { - CONNECT, - TRACE, - TRACK -} - -function isForbiddenMethod(method: ByteString): boolean { - if (ForbiddenMethodEnum[method] !== undefined) { - return true; - } - return false -} - -// https://fetch.spec.whatwg.org/#requestcontext -type RequestContext = string; -enum RequestContextEnum { - "audio", "beacon", - "cspreport", "download", - "embed", "eventsource", - "favicon", "fetch", - "font", "form", - "frame", "hyperlink", - "iframe", "image", - "imageset", "import", - "internal", "location", - "manifest", "object", - "ping", "plugin", - "prefetch", "script", - "serviceworker", "sharedworker", - "subresource", "style", - "track", "video", - "worker", "xmlhttprequest", - "xslt" -}; - -// https://fetch.spec.whatwg.org/#concept-request-context-frame-type -enum ContextFrameTypeEnum { - "auxiliary", - "top-level", - "nested", - "none" -} - -// https://fetch.spec.whatwg.org/#concept-request-mode -type RequestMode = string; -enum RequestModeEnum { - "same-origin", - "no-cors", - "cors" -}; - -// https://fetch.spec.whatwg.org/#concept-request-credentials-mode -type RequestCredentials = string; -enum RequestCredentialsEnum { - "omit", - "same-origin", - "include" -}; - -// https://fetch.spec.whatwg.org/#concept-request-cache-mode -type RequestCache = string; -enum RequestCacheEnum { - "default", - "bypass", - "reload", - "revalidate", - "force-cache", - "offline" -}; - -// https://fetch.spec.whatwg.org/#concept-response-type -type ResponseType = string; -enum ResponseTypeEnum { - "basic", - "cors", - "default", - "error", - "opaque" -}; - -///////////////////////////// -/// Request -///////////////////////////// - -// https://fetch.spec.whatwg.org/#requestinfo -type RequestInfo = Request | USVString; - -// https://fetch.spec.whatwg.org/#request -interface IRequest extends IBody { - // readonly property - method: ByteString; - url: USVString; - headers: Headers; - context: RequestContext; - referrer: DOMString; - mode: RequestMode; - credentials: RequestCredentials; - cache: RequestCache; - - // method - clone(): IRequest; -}; - -// https://fetch.spec.whatwg.org/#requestinit -// dictionary RequestInit -interface RequestInit { - method: ByteString; - headers: HeadersInit; - body: BodyInit; - mode: RequestMode; - credentials: RequestCredentials; - cache: RequestCache; -}; - -type Client = Object; -type Referrer = Object; -type Context = Object; - -type request = { - method: string; - url: string; - headerList: Header[]; - unsafeRequestFlag: boolean; - body: body; - //TODO: client: Client; - context: Context; - //TODO: origin: string; - forceOriginHeaderFlag: boolean; - sameOriginDataURLFlag: boolean; - //TODO: referrer: Referrer; - mode: string; - credentialsMode: string; - cacheMode: string; -} - -class Request implements IRequest { - // readonly property on IRequest - private _method: ByteString; - private _url: USVString; - private _headers: Headers; - private _context: RequestContext; - private _referrer: DOMString; - private _mode: ByteString; - private _credentials: RequestCredentials; - private _cache: RequestCache; - - // readonly property on IBody - private _bodyUsed: boolean; - - // https://fetch.spec.whatwg.org/#dom-request-method - get method(): ByteString { - return this._method; - } - - // https://fetch.spec.whatwg.org/#dom-request-url - get url(): USVString { - return this._url; - } - - // https://fetch.spec.whatwg.org/#dom-request-headers - get headers(): Headers { - return this._headers; - } - - // https://fetch.spec.whatwg.org/#dom-request-context - get context(): RequestContext { - return this._context; - } - - // https://fetch.spec.whatwg.org/#dom-request-referrer - get referrer(): DOMString { - return null; - } - - // https://fetch.spec.whatwg.org/#dom-request-mode - get mode(): RequestMode { - return null; - } - - // https://fetch.spec.whatwg.org/#dom-request-credentials - get credentials(): RequestCredentials { - return this._credentials; - } - - // https://fetch.spec.whatwg.org/#dom-request-cache - get cache(): RequestCache { - return null; - } - - // https://fetch.spec.whatwg.org/#dom-body-bodyused - get bodyUsed(): boolean { - return this._bodyUsed; - } - - // https://fetch.spec.whatwg.org/#dom-request-clone - // method on IRequest - public clone(): IRequest { - return null; - } - - // https://fetch.spec.whatwg.org/#dom-body-arraybuffer - // method on IBody - public arrayBuffer(): Promise { - return null; - } - - // https://fetch.spec.whatwg.org/#dom-body-blob - public blob(): Promise { - return null; - } - - // https://fetch.spec.whatwg.org/#dom-body-formdata - public formData(): Promise { - return null; - } - - // https://fetch.spec.whatwg.org/#dom-body-json - public json(): Promise { - return null; - } - - // https://fetch.spec.whatwg.org/#dom-body-text - public text(): Promise { - return null; - } - - // Request - public request: request; - public body: body; - public usedFlag: boolean; - public mimeType: string; - - // https://fetch.spec.whatwg.org/#dom-request - constructor(input: RequestInfo, init?: RequestInit) { - // can't detect class by instanceof - // if (input instanceof Request) { } - - var request: request; - // step 1 - if (typeof input === "object" && input.body !== null) { // Request - // step 1-1 - if (input.usedFlag) { - throw new TypeError("Request already used"); - } - // step 1-2 - input.usedFlag = true; - - // step 2 - request = input.request; - } else { - // step 2 - // new request otherwise - request = { - url: null, - method: MethodEnum[MethodEnum.GET], - headerList: [], - unsafeRequestFlag: false, - body: null, - //TODO: client: entry settings object, - //TODO: origin: entry settings object.origin, - forceOriginHeaderFlag: false, - sameOriginDataURLFlag: false, - referrer: null, - context: null, - mode: RequestModeEnum[RequestModeEnum["no-cors"]], - credentialsMode: RequestCredentialsEnum[RequestCredentialsEnum.omit], - cacheMode: RequestCacheEnum[RequestCacheEnum.default], - } - } - - // step 3 - request = { - url: request.url, - method: request.method, - headerList: request.headerList, - unsafeRequestFlag: true, - body: request.body, - //TODO: client: entry settings object, - //TODO: origin: entry settings object.origin, - forceOriginHeaderFlag: true, - sameOriginDataURLFlag: true, - //TODO: referrer : request.client, - context: 'fetch', - mode: request.mode, - credentialsMode: request.credentialsMode, - cacheMode: request.cacheMode - } - - // step 4, 5, 6 - var fallbackMode: RequestMode = null; - var fallbackCredentials: RequestCredentials = null; - var fallbackCache: RequestCache = null; - - //TODO: - function parseURL(url: string): string { - return url; - } - // step 7 - if (typeof input === "string") { - // step 7-1 - var parsedURL; - - try { - parsedURL = parseURL(input); - } catch(err) { - // step 7-2 - throw new TypeError(err); - } - - // step 7-3 - request.url = parsedURL; - - // step 7-4, 7-5, 7-6 - fallbackMode = RequestModeEnum[RequestModeEnum.cors]; - fallbackCredentials = RequestCredentialsEnum[RequestCredentialsEnum.omit]; - fallbackCache = RequestCacheEnum[RequestCacheEnum.default]; - } - - // step 8 - var mode = init.mode? init.mode: fallbackMode; - - // step 9 - if (mode !== null) request.mode = mode; - - // step 10 - var credentials = init.credentials? init.credentials: fallbackCredentials; - - // step 11 - if (credentials !== null) request.credentialsMode = credentials; - - // step 12 - var cache = init.cache? init.cache: fallbackCache; - - // step 13 - if (cache !== null) request.cacheMode = cache; - - // step 14 - if (init.method) { - var method = init.method; - - // step 14-1 - if(isForbiddenMethod(method)) { - throw new TypeError("forbidden method " + method); - } - - // step 14-2 - method = method.toUpperCase(); - - // step 14-3 - request.method = method; - } - - // step 15 - var r = this; - r.request = request; - r._headers = new Headers(); - - // step 16 - var headers = r.headers; - - // step 17 - if (init.headers) { - headers = init.headers; - } - - // step 18 - r.request.headerList = []; - - // step 19 - if (r.request.mode === "no-cors") { - // 19-1 - if (!isSimpleMethod(this.request.method)) { - throw new TypeError("not simple method" + method); - } - // 19-2 - r.headers.guard = "request-no-CORS"; - } - - // step 20 - r._headers = headers; - - // step 21 - if (init.body) { - // step 21-1 - var result = extract(init.body); - - // step 21-2 - r.request.body = result.stream; - - // step 21-3 - if (result.contentType !== null) { - var hasContentType = request.headerList.some((header) => { - return header.name === "Content-Type"; - }); - - if (!hasContentType) { - r._headers.append("Content-Type", result.contentType); - } - } - } - - // step 22 - // FIXME implement mime type extract - r.mimeType = null; - } -} - -// https://fetch.spec.whatwg.org/#concept-bodyinit-extract -function extract(object: any): any { - // step 1 - var stream = []; - - // step 2 - var contentType = null; - - // step 3 - switch(object.constructor) { - // Blob - case Blob: - stream = object.contents; - - if (object.type) { - contentType = object.type; - } - case BufferSource: - // TODO: stream = copy(object); - case FormData: - // TODO: - case URLSearchParams: - stream = object.list.toString(); - contentType = "application/x-www-form-urlencoded;charset=UTF-8"; - case String: // USVString - // stream = encode(object); - contentType = "text/plain;charset=UTF-8"; - } - - // step 4 - return { stream: stream, contentType: contentType }; -} - - - -// https://fetch.spec.whatwg.org/#response -interface IResponse extends IBody { // Response implements Body; - // static Response error(); - // static Response redirect(USVString url, optional unsigned short status = 302); - - type: ResponseType; // readonly - url: USVString; // readonly - status: number; // readonly - statusText: ByteString; // readonly - headers: Headers; // readonly - // Response clone(); -}; - -// https://fetch.spec.whatwg.org/#responseinit -class ResponseInit { - status: number = 200; - statusText: ByteString = "OK"; - headers: HeadersInit; -}; - -class response { - type: string; - terminationReason: string; - url: string; - status: number; - statusMessage: string; - headerList: Header[]; - body: Body; - cacheState: string; - TLSState: string; - - constructor() { - this.type = "default"; - this.terminationReason = "timeout"; - this.url = null; - this.status = 200; - this.statusMessage = "OK"; - this.headerList = []; - this.body = null; - this.cacheState = "none"; - this.TLSState = "unauthenticated"; - } -} - -// https://fetch.spec.whatwg.org/#response -class Response implements IResponse { - // implements body - _bodyUsed: boolean; - - _type: ResponseType; // readonly - _url: USVString; // readonly - _status: number; // readonly - _statusText: ByteString; // readonly - _headers: Headers; // readonly - - _response: response; - - // https://fetch.spec.whatwg.org/#dom-response - // [Constructor(optional BodyInit body, optional ResponseInit init), Exposed=(Window,Worker)] - constructor(body?: BodyInit, init?: ResponseInit) { - if (init !== undefined) { - // step 1 - if (init.status < 200 && init.status > 599) { - throw new RangeError("status is not in the range 200 to 599"); - } - - // step 2 - if (init.statusText.indexOf("\r") < 0 || init.statusText.indexOf("\n") < 0) { - throw new TypeError("Invalid Reason-Phrase token production"); - } - } - - // step 3 - var r = this; - r._response = new response(); - r._headers = new Headers(); - - if (init !== undefined) { - // step 4 - r._response.status = init.status; - // step 5 - r._response.statusMessage = init.statusText; - } - - // step 6 - if (init.headers) { - // step 6-1 - r._response.headerList = []; - - // step 6-2 - // TODO: implements fill - // r._response.headerList =; - } - - // step 7 - if (body) { - // step 7-1 - var extracted = extract(body); - var stream = extracted.stream; - var contentType = extracted.contentType; - - // step 7-2 - r._response.body = stream; - - // step 7-3 - if (contentType !== null) { - var hasContentType = r._response.headerList.some((header) => { - return header.name === "Content-Type"; - }); - - if (!hasContentType) { - // TODO: append - // r._response.headerList.append(Header("Content-Type", contentType)); - } - } - - // step 8 - // TODO: extracting MIME type - - // step 9 - // TODO: TLS state - - // step 10 - return r; - } - } - - get bodyUsed(): boolean { - return this._bodyUsed; - } - - get type(): ResponseType { - return this._type; - } - - get url(): USVString { - return this._url; - } - - get status(): number { - return this._status; - } - - get statusText(): ByteString { - return this._statusText; - } - - get headers(): Headers { - return this._headers; - } - - arrayBuffer(): Promise { - return null; - } - - blob(): Promise { - return null; - } - - formData(): Promise { - return null; - } - - json(): Promise { - return null; - } - - text(): Promise { - return null; - } -} - - -// https://fetch.spec.whatwg.org/#globalfetch -// Window implements GlobalFetch; -interface Window { - fetch(input: RequestInfo, init?: RequestInit): Promise; -}; - -// WorkerGlobalScope implements GlobalFetch; -this.fetch = function(input: RequestInfo, init?: RequestInit): Promise { - // step 1 - var p = new Promise((resolve, reject) => { - try { - // step 2 - var r = (new Request(input, init)).request; - } catch(e) { - reject(e); - } - }); - - // step 4 - return p -} - -// WorkerGlobalScope implements GlobalFetch; diff --git a/fetch/headers.ts b/fetch/headers.ts deleted file mode 100644 index 33e3d2bf6..000000000 --- a/fetch/headers.ts +++ /dev/null @@ -1,341 +0,0 @@ -/// - -// https://fetch.spec.whatwg.org/#forbidden-header-name -var ForbiddenHeaderName = { - "Accept-Charset": "Accept-Charset", - "Accept-Encoding": "Accept-Encoding", - "Access-Control-Request-Headers": "Access-Control-Request-Headers", - "Access-Control-Request-Method": "Access-Control-Request-Method", - "Connection": "Connection", - "Content-Length": "Content-Length", - "Cookie": "Cookie", - "Cookie2": "Cookie2", - "Date": "Date", - "DNT": "DNT", - "Expect": "Expect", - "Host": "Host", - "Keep-Alive": "Keep-Alive", - "Origin": "Origin", - "Referer": "Referer", - "TE": "TE", - "Trailer": "Trailer", - "Transfer-Encoding": "Transfer-Encoding", - "Upgrade": "Upgrade", - "User-Agent": "User-Agent", - "Via": "Via" -}; -function isForbiddenHeaderName(name: ByteString): boolean { - if (ForbiddenHeaderName[name] !== undefined) { - return true; - } - var reg = /^(Proxy\-|Sec\-)/ - if (reg.exec(name)) { - return true; - } - - return false; -} - -// https://fetch.spec.whatwg.org/#forbidden-response-header-name -var ForbiddenResponseHeaderName = { - "Set-Cookie": "Set-Cookie", - "Set-Cookie2": "Set-Cookie2" -} -function isForbiddenResponseHeaderName(name: ByteString): boolean { - return ForbiddenResponseHeaderName[name] !== undefined; -} - -// https://fetch.spec.whatwg.org/#simple-header -var SimpleHeaderName = { - "Accept": "Accept", - "Accept-Language": "Accept-Language", - "Content-Language": "Content-Language" -} -var SimpleHeaderValue = { - "application/x-www-form-urlencoded": "application/x-www-form-urlencoded", - "multipart/form-data": "multipart/form-data", - "text/plain": "text/plain" -} -function isSimpleHeader(name, value: ByteString): boolean { - if (SimpleHeaderName[name] !== undefined) { - return true; - } - - if (name === "Content-Type") { - // TODO: parse value https://fetch.spec.whatwg.org/#concept-header-parse - if (SimpleHeaderValue[value] !== undefined) { - return true; - } - } - - return false; -} - -// https://fetch.spec.whatwg.org/#headersinit -// typedef (Headers or sequence> or OpenEndedDictionary) HeadersInit; -type HeadersInit = Headers | ByteString[][] | OpenEndedDictionary; - -// https://fetch.spec.whatwg.org/#headers -interface IHeaders { - append(name, value: ByteString): void; - delete(name: ByteString): void; - get(name: ByteString): ByteString; - getAll(name: ByteString): ByteString[]; - has(name: ByteString): boolean; - set(name, value: ByteString): void; - // iterable; -}; - -// https://fetch.spec.whatwg.org/#concept-header -class Header { - name: ByteString; - value: ByteString; - constructor(name, value: ByteString) { - // TODO: validation - this.name = name; - this.value = value; - } -} - -var Guard = { - "immutable": "immutable", - "request": "request", - "request-no-CORS": "request-no-CORS", - "response": "response", - "none": "none", -} - -function copy(obj: T): T { - return JSON.parse(JSON.stringify(obj)); -} - -// https://fetch.spec.whatwg.org/#headers -class Headers implements IHeaders{ - public headerList: Header[] = []; - public guard: string = Guard.none; - - // https://fetch.spec.whatwg.org/#dom-headers - constructor(init?: HeadersInit) { - // step 1 - var headers = this; // new Headers object - - // step 2 - if (init !== undefined) { - this.fill(headers, init); - } - - // step 3 - return headers; - } - - // https://fetch.spec.whatwg.org/#concept-headers-fill - private fill(headers: Headers, object: HeadersInit) { - // step 1 Headers - if (object instanceof Headers) { - var headerListCopy: Header[] = copy(object.headerList); - headerListCopy.forEach((header: Header) => { - headers.append(header.name, header.value); - }); - return; - } - - // step 2 ByteString[][] - if (Array.isArray(object)) { - var headerSequence = object; - headerSequence.forEach((header) => { - if(header.length !== 2) { - throw new TypeError("init for Headers was incorrect BytesString Sequence"); - } - headers.append(header[0], header[1]); - }); - return; - } - - // step 3 OpenEndedDictionary - if (typeof object === "object") { - Object.keys(object).forEach((key) => { - headers.append(key.toString(), object[key]); - }); - } - } - - // https://fetch.spec.whatwg.org/#dom-headers-append - append(name, value: ByteString): void { - // https://fetch.spec.whatwg.org/#concept-headers-append - // step 1 - if (!name || !value) { - // TODO name/value validation - throw new TypeError("invalid name/value"); - } - - // step 2, 3, 4, 5 - switch(this.guard) { - case Guard.immutable: - throw new TypeError("operation to immutable headers"); - case Guard.request: - if (isForbiddenHeaderName(name)) { - return; - } - case Guard["request-no-CORS"]: - if (!isSimpleHeader(name, value)) { - return; - } - case Guard.response: - if (isForbiddenResponseHeaderName(name)) { - return; - } - } - - // step 6 - name = name.toLowerCase(); - this.headerList.push(new Header(name, value)); - } - - // https://fetch.spec.whatwg.org/#dom-headers-delete - delete(name: ByteString): void { - // step 1 - if (!name) { - throw new TypeError("invalid name"); - } - - // step 2, 3, 4, 5 - switch(this.guard) { - case Guard.immutable: - throw new TypeError("operation to immutable headers"); - case Guard.request: - if (isForbiddenHeaderName(name)) { - return; - } - case Guard["request-no-CORS"]: - if (!isSimpleHeader(name, "invalid")) { - return; - } - case Guard.response: - if (isForbiddenResponseHeaderName(name)) { - return; - } - } - - name = name.toLowerCase(); - // step 6 - this.headerList = this.headerList.filter((header: Header) => { - return header.name !== name; - }); - } - - // https://fetch.spec.whatwg.org/#dom-headers-get - get(name: ByteString) :ByteString { - // step 1 - if (!name) { - throw new TypeError("invalid name"); - } - - // step 2 - var value: ByteString = null; - this.headerList.forEach((header: Header) => { - if (header.name === name) { - value = header.value; - return; - } - }); - - return value; - } - - // https://fetch.spec.whatwg.org/#dom-headers-getall - getAll(name: ByteString) :ByteString[] { - // step 1 - if (!name) { - throw new TypeError("invalid name"); - } - - // step 2 - var result: ByteString[] = this.headerList.reduce((acc: ByteString[], header: Header) => { - if (header.name === name) { - acc.push(header.value); - } - return acc; - }, []); - - return result; - } - - // https://fetch.spec.whatwg.org/#dom-headers-has - has(name: ByteString) :boolean { - // step 1 - if (!name) { - throw new TypeError("invalid name"); - } - - // step 2 - return this.headerList.some((header: Header) => { - return header.name === name; - }); - } - - // https://fetch.spec.whatwg.org/#dom-headers-set - set(name, value: ByteString): void { - // step 1 - if (!name || !value) { - throw new TypeError("invalid name/value"); - } - - switch(this.guard) { - // step 2 - case Guard.immutable: - throw new TypeError("operation to immutable headers"); - // step 3 - case Guard.request: - if (isForbiddenHeaderName(name)) { - return; - } - // step 4 - case Guard["request-no-CORS"]: - if (!isSimpleHeader(name, "invalid")) { - return; - } - // step 5 - case Guard.response: - if (isForbiddenResponseHeaderName(name)) { - return; - } - } - - // step 6 - // see https://fetch.spec.whatwg.org/#concept-header-list-set - - // step 6-1 - name = name.toLowerCase(); - - // find the all indexes of headers whos key is supplyed key - var indexes: number[] = this.headerList.reduce((acc: number[], header: Header, index: number) => { - if (header.name === name) { - acc.push(index); - } - return acc; - }, []); - - // count of existing headers - var len = indexes.length; - - // step 6-3 - // if there are no key - if (len === 0) { - // append to last and return - return this.append(name, value); - } - - // step 6-2 - // remove the headers in indexes from the last(because splice chenges index) - // and change first header value - indexes.reverse().forEach((e, i: number) => { - if(i === len - 1) { - // only replace first entry - this.headerList[e].value = value; - } else { - // remove duplicate from last - this.headerList.splice(e, 1); - } - }); - } -} diff --git a/fetch/package.json b/fetch/package.json index f19e3419b..3ec180e48 100644 --- a/fetch/package.json +++ b/fetch/package.json @@ -1,28 +1,2 @@ -{ - "name": "fetch-standard", - "author": "Jxck", - "license": "MIT", - "version": "0.0.0", - "description": "implementaion of https://fetch.spec.whatwg.org/", - "homepage": "https://github.com/Jxck/fetch", - "bugs": { - "url": "https://github.com/Jxck/fetch/issues" - }, - "keywords": [ - "fetch", - "whatwg" - ], - "repository": { - "type": "git", - "url": "https://github.com/Jxck/fetch" - }, - "main": "fetch.ts", - "scripts": { - "clean": "rm *.js", - "build": "tsc fetch.ts --target ES5", - "test": "npm run build && node fetch.js" - }, - "devDependencies": { - "typescript": "^1.4.1" - } -} +{ "name" : "fetch", + "main" : "fetch.js" } \ No newline at end of file diff --git a/fetch/webidl.d.ts b/fetch/webidl.d.ts deleted file mode 100644 index eab04ca20..000000000 --- a/fetch/webidl.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -// http://heycam.github.io/webidl/#idl-ByteString -declare type ByteString = string; - -// http://heycam.github.io/webidl/#idl-USVString -declare type USVString = string; - -// http://heycam.github.io/webidl/#idl-DOMString -declare type DOMString = string; - -// see: https://fetch.spec.whatwg.org/#headersinit -declare type OpenEndedDictionary = Object; \ No newline at end of file diff --git a/gruntfile.js b/gruntfile.js index 0311ffad2..e1fb7d72d 100644 --- a/gruntfile.js +++ b/gruntfile.js @@ -198,6 +198,7 @@ module.exports = function(grunt) { expand: true, src: [ "./js-libs/**/*.js", + "./fetch/**/*.js", ], dest: "<%= localCfg.outModulesDir %>/", cwd: localCfg.srcDir