diff --git a/lib/StockSocket.d.ts b/lib/StockSocket.d.ts new file mode 100644 index 0000000..b03f442 --- /dev/null +++ b/lib/StockSocket.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=StockSocket.d.ts.map \ No newline at end of file diff --git a/lib/StockSocket.d.ts.map b/lib/StockSocket.d.ts.map new file mode 100644 index 0000000..28c824e --- /dev/null +++ b/lib/StockSocket.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"StockSocket.d.ts","sourceRoot":"","sources":["../src/StockSocket.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/lib/StockSocket.js b/lib/StockSocket.js new file mode 100644 index 0000000..b05463f --- /dev/null +++ b/lib/StockSocket.js @@ -0,0 +1,152 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const puppeteer_1 = require("puppeteer"); +var browser; +var pagesArray; +pagesArray = {}; +var tickersArray; +tickersArray = []; +function addTickers(tickers, callback) { + return __awaiter(this, void 0, void 0, function* () { + //If browser has not been declared, launch it. + if (browser == undefined) { + browser = yield puppeteer_1.launch(); + } + //Format the inputted tickers, add them to tickersArray, begin operations. + for (var i = 0; i < tickers.length; i++) { + var tickerObject = { symbol: tickers[i], price: 0 }; + tickersArray.push(tickerObject); + startDataFeed(tickersArray[tickersArray.length - 1], callback); + } + }); +} +function addTicker(ticker, callback) { + return __awaiter(this, void 0, void 0, function* () { + //If browser has not been declared, launch it. + if (browser == undefined) { + browser = yield puppeteer_1.launch(); + } + //Push the new ticker to tickersArray. + tickersArray.push({ symbol: ticker, price: 0 }); + //Begin operations on the new ticker. + startDataFeed(tickersArray[tickersArray.length - 1], callback); + }); +} +//Stop data for a specific ticker. +function removeTicker(ticker) { + return __awaiter(this, void 0, void 0, function* () { + for (var key in pagesArray) { + if (key == ticker) { + yield pagesArray[key].close(); + delete pagesArray[key]; + break; + } + } + }); +} +//Stop data for a list of tickers. +function removeTickers(tickers) { + return __awaiter(this, void 0, void 0, function* () { + for (var i = 0; i < tickers.length; i++) { + removeTicker(tickers[i]); + } + }); +} +//Stop data for all tickers. +function removeAllTickers() { + return __awaiter(this, void 0, void 0, function* () { + for (var key in pagesArray) { + yield pagesArray[key].close(); + delete pagesArray[key]; + } + }); +} +function startDataFeed(ticker, callback) { + return __awaiter(this, void 0, void 0, function* () { + try { + //Configure Puppeteer page. + pagesArray[ticker.symbol] = yield browser.newPage(); + yield pagesArray[ticker.symbol].setBypassCSP(true); + yield pagesArray[ticker.symbol].setDefaultNavigationTimeout(0); + yield pagesArray[ticker.symbol].goto(`https://finance.yahoo.com/quote/${ticker.symbol}?p=${ticker.symbol}`); + yield pagesArray[ticker.symbol].exposeFunction("puppeteerMutationListener", puppeteerMutationListener); + //Eliminate consent page if outside of North America + yield pagesArray[ticker.symbol].evaluate(function () { + try { + if (document.querySelector("#consent-page > div > div > div > form > div.wizard-body > div.actions.couple > button")) { + var element = document.querySelector("#consent-page > div > div > div > form > div.wizard-body > div.actions.couple > button"); + element.click(); + return; + } + } + catch (e) { + console.log(e); + } + }); + //Wait for proper page to load. + yield pagesArray[ticker.symbol].waitForSelector("#quote-header-info"); + //Evaluate the actual page. + yield pagesArray[ticker.symbol].evaluate(function () { + var target; + const potentialSelectors = { + premarket: "#quote-header-info > div.Pos\\(r\\) > div.D\\(ib\\) > p > span", + regmarket: "#quote-header-info > div.Pos\\(r\\) > div > p > span", + postmarket: "#quote-header-info > div.Pos\\(r\\) > div > div > span", + crypto: "#quote-header-info > div.D\\(ib\\) > div > div > span", + }; + //Find correct query selector. + for (var key in potentialSelectors) { + if (document.querySelector(potentialSelectors[key])) { + target = document.querySelector(potentialSelectors[key]); + break; + } + } + if (target != undefined) { + //Initiatialize mutation observer. + var observer = new MutationObserver((mutationsList) => { + for (const mutation of mutationsList) { + puppeteerMutationListener(mutation.target.textContent); + } + }); + //Activate mutation observer. + observer.observe(target, { + attributes: true, + childList: true, + characterData: true, + subtree: true, + }); + } + }); + } + catch (err) { + console.log(err); + } + //Take action on the observed price mutation. + function puppeteerMutationListener(data) { + var parsedData = data; + parsedData = parsedData.replace(/\,/g, ""); + parsedData = parseFloat(parsedData); + if (ticker.price != parsedData) { + ticker.price = parsedData; + callback(ticker); + } + } + }); +} +module.exports = { + addTickers, + addTicker, + removeTicker, + removeTickers, + removeAllTickers, +}; +//# sourceMappingURL=StockSocket.js.map \ No newline at end of file diff --git a/lib/StockSocket.js.map b/lib/StockSocket.js.map new file mode 100644 index 0000000..4e1344e --- /dev/null +++ b/lib/StockSocket.js.map @@ -0,0 +1 @@ +{"version":3,"file":"StockSocket.js","sourceRoot":"","sources":["../src/StockSocket.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;;;;;;;;;;;AAEb,yCAAkD;AAClD,IAAI,OAAgB,CAAC;AAMrB,IAAI,UAAuB,CAAC;AAC5B,UAAU,GAAG,EAAE,CAAC;AAOhB,IAAI,YAA6B,CAAC;AAClC,YAAY,GAAG,EAAE,CAAC;AAElB,SAAe,UAAU,CACvB,OAAsB,EACtB,QAAgC;;QAEhC,8CAA8C;QAC9C,IAAI,OAAO,IAAI,SAAS,EAAE;YACxB,OAAO,GAAG,MAAM,kBAAM,EAAE,CAAC;SAC1B;QACD,0EAA0E;QAC1E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACvC,IAAI,YAAY,GAAkB,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;YACnE,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAChC,aAAa,CAAC,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;SAChE;IACH,CAAC;CAAA;AAED,SAAe,SAAS,CAAC,MAAc,EAAE,QAAgC;;QACvE,8CAA8C;QAC9C,IAAI,OAAO,IAAI,SAAS,EAAE;YACxB,OAAO,GAAG,MAAM,kBAAM,EAAE,CAAC;SAC1B;QAED,sCAAsC;QACtC,YAAY,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QAEhD,qCAAqC;QACrC,aAAa,CAAC,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IACjE,CAAC;CAAA;AAED,kCAAkC;AAClC,SAAe,YAAY,CAAC,MAAc;;QACxC,KAAK,IAAI,GAAG,IAAI,UAAU,EAAE;YAC1B,IAAI,GAAG,IAAI,MAAM,EAAE;gBACjB,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC;gBAC9B,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC;gBACvB,MAAM;aACP;SACF;IACH,CAAC;CAAA;AAED,kCAAkC;AAClC,SAAe,aAAa,CAAC,OAAsB;;QACjD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACvC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;SAC1B;IACH,CAAC;CAAA;AAED,4BAA4B;AAC5B,SAAe,gBAAgB;;QAC7B,KAAK,IAAI,GAAG,IAAI,UAAU,EAAE;YAC1B,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC;YAC9B,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC;SACxB;IACH,CAAC;CAAA;AAED,SAAe,aAAa,CAC1B,MAAyC,EACzC,QAAgC;;QAEhC,IAAI;YACF,2BAA2B;YAC3B,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;YACpD,MAAM,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YACnD,MAAM,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,CAAC;YAC/D,MAAM,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAClC,mCAAmC,MAAM,CAAC,MAAM,MAAM,MAAM,CAAC,MAAM,EAAE,CACtE,CAAC;YACF,MAAM,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAC5C,2BAA2B,EAC3B,yBAAyB,CAC1B,CAAC;YAEF,oDAAoD;YACpD,MAAM,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC;gBACvC,IAAI;oBACF,IACE,QAAQ,CAAC,aAAa,CACpB,wFAAwF,CACzF,EACD;wBACA,IAAI,OAAO,GAAG,QAAQ,CAAC,aAAa,CAClC,wFAAwF,CAC1E,CAAC;wBACjB,OAAO,CAAC,KAAK,EAAE,CAAC;wBAEhB,OAAO;qBACR;iBACF;gBAAC,OAAO,CAAC,EAAE;oBACV,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;iBAChB;YACH,CAAC,CAAC,CAAC;YAEH,+BAA+B;YAC/B,MAAM,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,oBAAoB,CAAC,CAAC;YAEtE,2BAA2B;YAC3B,MAAM,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC;gBACvC,IAAI,MAAM,CAAC;gBACX,MAAM,kBAAkB,GAA8B;oBACpD,SAAS,EACP,gEAAgE;oBAClE,SAAS,EAAE,sDAAsD;oBACjE,UAAU,EAAE,wDAAwD;oBACpE,MAAM,EAAE,uDAAuD;iBAChE,CAAC;gBAEF,8BAA8B;gBAC9B,KAAK,IAAI,GAAG,IAAI,kBAAkB,EAAE;oBAClC,IAAI,QAAQ,CAAC,aAAa,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,EAAE;wBACnD,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC;wBACzD,MAAM;qBACP;iBACF;gBAED,IAAI,MAAM,IAAI,SAAS,EAAE;oBACvB,kCAAkC;oBAClC,IAAI,QAAQ,GAAG,IAAI,gBAAgB,CAAC,CAAC,aAAa,EAAE,EAAE;wBACpD,KAAK,MAAM,QAAQ,IAAI,aAAa,EAAE;4BACpC,yBAAyB,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;yBACxD;oBACH,CAAC,CAAC,CAAC;oBACH,6BAA6B;oBAC7B,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE;wBACvB,UAAU,EAAE,IAAI;wBAChB,SAAS,EAAE,IAAI;wBACf,aAAa,EAAE,IAAI;wBACnB,OAAO,EAAE,IAAI;qBACd,CAAC,CAAC;iBACJ;YACH,CAAC,CAAC,CAAC;SACJ;QAAC,OAAO,GAAG,EAAE;YACZ,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;SAClB;QAED,6CAA6C;QAC7C,SAAS,yBAAyB,CAAC,IAAmB;YACpD,IAAI,UAAU,GAAQ,IAAI,CAAC;YAC3B,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC3C,UAAU,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;YAEpC,IAAI,MAAM,CAAC,KAAK,IAAI,UAAU,EAAE;gBAC9B,MAAM,CAAC,KAAK,GAAG,UAAU,CAAC;gBAC1B,QAAQ,CAAC,MAAM,CAAC,CAAC;aAClB;QACH,CAAC;IACH,CAAC;CAAA;AAED,MAAM,CAAC,OAAO,GAAG;IACf,UAAU;IACV,SAAS;IACT,YAAY;IACZ,aAAa;IACb,gBAAgB;CACjB,CAAC"} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 2d65d8d..f348347 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "stocksocket", - "version": "1.1.2", + "version": "1.2.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -39,8 +39,16 @@ "@types/node": { "version": "14.14.31", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.31.tgz", - "integrity": "sha512-vFHy/ezP5qI0rFgJ7aQnjDXwAMrG0KqqIH7tQG5PPv3BWBayOPIQNBjVc/P6hhdZfMx51REc6tfDNXHUio893g==", - "optional": true + "integrity": "sha512-vFHy/ezP5qI0rFgJ7aQnjDXwAMrG0KqqIH7tQG5PPv3BWBayOPIQNBjVc/P6hhdZfMx51REc6tfDNXHUio893g==" + }, + "@types/puppeteer": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/@types/puppeteer/-/puppeteer-5.4.3.tgz", + "integrity": "sha512-3nE8YgR9DIsgttLW+eJf6mnXxq8Ge+27m5SU3knWmrlfl6+KOG0Bf9f7Ua7K+C4BnaTMAh3/UpySqdAYvrsvjg==", + "dev": true, + "requires": { + "@types/node": "*" + } }, "@types/yauzl": { "version": "2.9.1", @@ -1886,6 +1894,12 @@ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "dev": true }, + "typescript": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.3.tgz", + "integrity": "sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw==", + "dev": true + }, "unbox-primitive": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.0.tgz", diff --git a/package.json b/package.json index 19c1528..7fab6be 100644 --- a/package.json +++ b/package.json @@ -1,9 +1,11 @@ { "name": "stocksocket", - "version": "1.2.0", + "version": "1.2.1", "description": "Real-time Yahoo Stock Prices", - "main": "stocksocket.js", + "main": "lib/stocksocket.js", + "types": "lib", "scripts": { + "build": "tsc -p .", "test": "mocha" }, "repository": { @@ -37,10 +39,12 @@ "puppeteer": "^8.0.0" }, "devDependencies": { + "@types/puppeteer": "^5.4.3", "assert": "^2.0.0", "chromedriver": "^88.0.0", "mocha": "^8.3.0", "request": "^2.88.2", - "selenium-webdriver": "^4.0.0-beta.1" + "selenium-webdriver": "^4.0.0-beta.1", + "typescript": "^4.2.3" } } diff --git a/StockSocket.js b/src/StockSocket.ts similarity index 69% rename from StockSocket.js rename to src/StockSocket.ts index 0e43506..a3feec1 100644 --- a/StockSocket.js +++ b/src/StockSocket.ts @@ -1,37 +1,54 @@ "use strict"; -const puppeteer = require("puppeteer"); -var browser; -var tickersArray = []; -var pagesArray = {}; +import { Browser, Page, launch } from "puppeteer"; +var browser: Browser; -async function addTickers(tickers, callbackFunc) { +//Pages Array +interface IPagesArray { + [key: string]: Page; +} +var pagesArray: IPagesArray; +pagesArray = {}; + +//Tickers Array +interface ITickersArray { + symbol: string; + price: number; +} +var tickersArray: ITickersArray[]; +tickersArray = []; + +async function addTickers( + tickers: Array, + callback: (arg0: object) => void +) { //If browser has not been declared, launch it. if (browser == undefined) { - browser = await puppeteer.launch(); + browser = await launch(); } //Format the inputted tickers, add them to tickersArray, begin operations. for (var i = 0; i < tickers.length; i++) { - tickersArray.push({ symbol: tickers[i], price: 0 }); - startDataFeed(tickersArray[tickersArray.length - 1], callbackFunc); + var tickerObject: ITickersArray = { symbol: tickers[i], price: 0 }; + tickersArray.push(tickerObject); + startDataFeed(tickersArray[tickersArray.length - 1], callback); } } -async function addTicker(ticker, callbackFunc) { +async function addTicker(ticker: string, callback: (arg0: object) => void) { //If browser has not been declared, launch it. if (browser == undefined) { - browser = await puppeteer.launch(); + browser = await launch(); } //Push the new ticker to tickersArray. tickersArray.push({ symbol: ticker, price: 0 }); //Begin operations on the new ticker. - startDataFeed(tickersArray[tickersArray.length - 1], callbackFunc); + startDataFeed(tickersArray[tickersArray.length - 1], callback); } //Stop data for a specific ticker. -async function removeTicker(ticker) { +async function removeTicker(ticker: string) { for (var key in pagesArray) { if (key == ticker) { await pagesArray[key].close(); @@ -42,7 +59,7 @@ async function removeTicker(ticker) { } //Stop data for a list of tickers. -async function removeTickers(tickers) { +async function removeTickers(tickers: Array) { for (var i = 0; i < tickers.length; i++) { removeTicker(tickers[i]); } @@ -56,7 +73,10 @@ async function removeAllTickers() { } } -async function startDataFeed(ticker, callbackFunc) { +async function startDataFeed( + ticker: { symbol: string; price: number }, + callback: (arg0: object) => void +) { try { //Configure Puppeteer page. pagesArray[ticker.symbol] = await browser.newPage(); @@ -78,11 +98,11 @@ async function startDataFeed(ticker, callbackFunc) { "#consent-page > div > div > div > form > div.wizard-body > div.actions.couple > button" ) ) { - document - .querySelector( - "#consent-page > div > div > div > form > div.wizard-body > div.actions.couple > button" - ) - .click(); + var element = document.querySelector( + "#consent-page > div > div > div > form > div.wizard-body > div.actions.couple > button" + ) as HTMLElement; + element.click(); + return; } } catch (e) { @@ -96,7 +116,7 @@ async function startDataFeed(ticker, callbackFunc) { //Evaluate the actual page. await pagesArray[ticker.symbol].evaluate(function () { var target; - const potentialSelectors = { + const potentialSelectors: { [key: string]: string } = { premarket: "#quote-header-info > div.Pos\\(r\\) > div.D\\(ib\\) > p > span", regmarket: "#quote-header-info > div.Pos\\(r\\) > div > p > span", @@ -133,10 +153,14 @@ async function startDataFeed(ticker, callbackFunc) { } //Take action on the observed price mutation. - function puppeteerMutationListener(data) { - if (ticker.price != data) { - ticker.price = data; - callbackFunc(ticker); + function puppeteerMutationListener(data: string | null) { + var parsedData: any = data; + parsedData = parsedData.replace(/\,/g, ""); + parsedData = parseFloat(parsedData); + + if (ticker.price != parsedData) { + ticker.price = parsedData; + callback(ticker); } } } diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..8644103 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,72 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig.json to read more about this file */ + + /* Basic Options */ + // "incremental": true, /* Enable incremental compilation */ + "target": "es6" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */, + "module": "CommonJS" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */, + // "lib": [], /* Specify library files to be included in the compilation. */ + // "allowJs": true, /* Allow javascript files to be compiled. */ + // "checkJs": true, /* Report errors in .js files. */ + // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', 'react', 'react-jsx' or 'react-jsxdev'. */ + "declaration": true /* Generates corresponding '.d.ts' file. */, + "declarationMap": true /* Generates a sourcemap for each corresponding '.d.ts' file. */, + "sourceMap": true /* Generates corresponding '.map' file. */, + // "outFile": "./" /* Concatenate and emit output to single file. */, + "outDir": "lib" /* Redirect output structure to the directory. */, + // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ + // "composite": true, /* Enable project compilation */ + // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ + // "removeComments": true, /* Do not emit comments to output. */ + // "noEmit": true, /* Do not emit outputs. */ + // "importHelpers": true, /* Import emit helpers from 'tslib'. */ + // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ + // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ + + /* Strict Type-Checking Options */ + "strict": true /* Enable all strict type-checking options. */, + // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* Enable strict null checks. */ + // "strictFunctionTypes": true, /* Enable strict checking of function types. */ + // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ + // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ + // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ + // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ + + /* Additional Checks */ + // "noUnusedLocals": true, /* Report errors on unused locals. */ + // "noUnusedParameters": true, /* Report errors on unused parameters. */ + // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ + // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ + // "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */ + // "noPropertyAccessFromIndexSignature": true, /* Require undeclared properties from index signatures to use element accesses. */ + + /* Module Resolution Options */ + // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ + // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ + // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ + // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ + // "typeRoots": [], /* List of folders to include type definitions from. */ + // "types": [], /* Type declaration files to be included in compilation. */ + // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ + "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */, + // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + + /* Source Map Options */ + // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ + // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ + + /* Experimental Options */ + // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ + // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ + + /* Advanced Options */ + "skipLibCheck": true /* Skip type checking of declaration files. */, + "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ + }, + "include": ["src"] +}