import * as d3Fetch from 'd3-fetch';
import { DSVParsedArray, DSVRowString } from 'd3-dsv';

interface MyType {
    foo: string;
}

const url = 'foo.bar';

const init: RequestInit = {};

let p1: Promise<Blob> = d3Fetch.blob(url);
p1 = d3Fetch.blob(url, init);

let p2: Promise<ArrayBuffer> = d3Fetch.buffer(url);
p2 = d3Fetch.buffer(url, init);

let p3: Promise<HTMLImageElement> = d3Fetch.image(url);
const imageProperties = {
    width: '300px',
    height: '500px'
};
p3 = d3Fetch.image(url, imageProperties);

let p4: Promise<any> = d3Fetch.json(url);
p4 = d3Fetch.json(url, init);
let p5: Promise<MyType> = d3Fetch.json<MyType>(url);
p5 = d3Fetch.json<MyType>(url, init);

let myString: Promise<string>;
myString = d3Fetch.text(url);
const map = new Map<string, number>();

const imageProperties = {
    width: 300,
    height: 500,
    crossOrigin: "anonymous",
};

// ----------------------------------------------------------------------------
// Non DSV file format
// ----------------------------------------------------------------------------

blobPromise = d3Fetch.blob(url);
blobPromise = d3Fetch.blob(url, init);

arrayPromise = d3Fetch.buffer(url);
arrayPromise = d3Fetch.buffer(url, init);

imagePromise = d3Fetch.image(url);
imagePromise = d3Fetch.image(url, imageProperties);
// $ExpectError
imagePromise = d3Fetch.image(url, {width: "500px"}); // fails, string not assignable to number | undefined

anyPromise = d3Fetch.json(url);
anyPromise = d3Fetch.json(url, init);

carPromise = d3Fetch.json<Car>(url);
carPromise = d3Fetch.json<Car>(url, init);

stringPromise = d3Fetch.text(url);
stringPromise = d3Fetch.text(url, init);