From 9c8468eca84d5d4aa361621e6e9e2525a67e0462 Mon Sep 17 00:00:00 2001 From: Noah Spannbauer Date: Mon, 10 Feb 2025 18:55:08 -0600 Subject: [PATCH] adding api --- api/.eslintrc.js | 25 +++++ api/.funcignore | 7 ++ api/.gitignore | 56 ++++++++++ api/.prettierrc | 4 + api/README.md | 73 +++++++++++++ api/host.json | 3 + api/local.settings.json | 13 +++ api/main/function.json | 17 +++ api/main/index.ts | 7 ++ api/main/sample.dat | 3 + api/nest-cli.json | 8 ++ api/package.json | 80 ++++++++++++++ api/proxies.json | 4 + api/src/app.controller.spec.ts | 22 ++++ api/src/app.module.ts | 17 +++ api/src/config/configuration.ts | 4 + api/src/filters/http-exception.filter.ts | 25 +++++ api/src/github/github-content.interface.ts | 20 ++++ api/src/github/github-repo.interface.ts | 120 +++++++++++++++++++++ api/src/github/github.controller.ts | 35 ++++++ api/src/github/github.module.ts | 18 ++++ api/src/github/github.service.ts | 39 +++++++ api/src/main.azure.ts | 26 +++++ api/src/main.ts | 9 ++ api/test/app.e2e-spec.ts | 24 +++++ api/test/jest-e2e.json | 9 ++ api/tsconfig.build.json | 4 + api/tsconfig.json | 21 ++++ 28 files changed, 693 insertions(+) create mode 100644 api/.eslintrc.js create mode 100644 api/.funcignore create mode 100644 api/.gitignore create mode 100644 api/.prettierrc create mode 100644 api/README.md create mode 100644 api/host.json create mode 100644 api/local.settings.json create mode 100644 api/main/function.json create mode 100644 api/main/index.ts create mode 100644 api/main/sample.dat create mode 100644 api/nest-cli.json create mode 100644 api/package.json create mode 100644 api/proxies.json create mode 100644 api/src/app.controller.spec.ts create mode 100644 api/src/app.module.ts create mode 100644 api/src/config/configuration.ts create mode 100644 api/src/filters/http-exception.filter.ts create mode 100644 api/src/github/github-content.interface.ts create mode 100644 api/src/github/github-repo.interface.ts create mode 100644 api/src/github/github.controller.ts create mode 100644 api/src/github/github.module.ts create mode 100644 api/src/github/github.service.ts create mode 100644 api/src/main.azure.ts create mode 100644 api/src/main.ts create mode 100644 api/test/app.e2e-spec.ts create mode 100644 api/test/jest-e2e.json create mode 100644 api/tsconfig.build.json create mode 100644 api/tsconfig.json diff --git a/api/.eslintrc.js b/api/.eslintrc.js new file mode 100644 index 0000000..259de13 --- /dev/null +++ b/api/.eslintrc.js @@ -0,0 +1,25 @@ +module.exports = { + parser: '@typescript-eslint/parser', + parserOptions: { + project: 'tsconfig.json', + tsconfigRootDir: __dirname, + sourceType: 'module', + }, + plugins: ['@typescript-eslint/eslint-plugin'], + extends: [ + 'plugin:@typescript-eslint/recommended', + 'plugin:prettier/recommended', + ], + root: true, + env: { + node: true, + jest: true, + }, + ignorePatterns: ['.eslintrc.js'], + rules: { + '@typescript-eslint/interface-name-prefix': 'off', + '@typescript-eslint/explicit-function-return-type': 'off', + '@typescript-eslint/explicit-module-boundary-types': 'off', + '@typescript-eslint/no-explicit-any': 'off', + }, +}; diff --git a/api/.funcignore b/api/.funcignore new file mode 100644 index 0000000..5179222 --- /dev/null +++ b/api/.funcignore @@ -0,0 +1,7 @@ +*.js.map +*.ts +.git* +.vscode +local.settings.json +test +tsconfig.json \ No newline at end of file diff --git a/api/.gitignore b/api/.gitignore new file mode 100644 index 0000000..4b56acf --- /dev/null +++ b/api/.gitignore @@ -0,0 +1,56 @@ +# compiled output +/dist +/node_modules +/build + +# Logs +logs +*.log +npm-debug.log* +pnpm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# OS +.DS_Store + +# Tests +/coverage +/.nyc_output + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# temp directory +.temp +.tmp + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json diff --git a/api/.prettierrc b/api/.prettierrc new file mode 100644 index 0000000..dcb7279 --- /dev/null +++ b/api/.prettierrc @@ -0,0 +1,4 @@ +{ + "singleQuote": true, + "trailingComma": "all" +} \ No newline at end of file diff --git a/api/README.md b/api/README.md new file mode 100644 index 0000000..00a13b1 --- /dev/null +++ b/api/README.md @@ -0,0 +1,73 @@ +

+ Nest Logo +

+ +[circleci-image]: https://img.shields.io/circleci/build/github/nestjs/nest/master?token=abc123def456 +[circleci-url]: https://circleci.com/gh/nestjs/nest + +

A progressive Node.js framework for building efficient and scalable server-side applications.

+

+NPM Version +Package License +NPM Downloads +CircleCI +Coverage +Discord +Backers on Open Collective +Sponsors on Open Collective + + Support us + +

+ + +## Description + +[Nest](https://github.com/nestjs/nest) framework TypeScript starter repository. + +## Installation + +```bash +$ npm install +``` + +## Running the app + +```bash +# development +$ npm run start + +# watch mode +$ npm run start:dev + +# production mode +$ npm run start:prod +``` + +## Test + +```bash +# unit tests +$ npm run test + +# e2e tests +$ npm run test:e2e + +# test coverage +$ npm run test:cov +``` + +## Support + +Nest is an MIT-licensed open source project. It can grow thanks to the sponsors and support by the amazing backers. If you'd like to join them, please [read more here](https://docs.nestjs.com/support). + +## Stay in touch + +- Author - [Kamil Myƛliwiec](https://kamilmysliwiec.com) +- Website - [https://nestjs.com](https://nestjs.com/) +- Twitter - [@nestframework](https://twitter.com/nestframework) + +## License + +Nest is [MIT licensed](LICENSE). diff --git a/api/host.json b/api/host.json new file mode 100644 index 0000000..d2059a4 --- /dev/null +++ b/api/host.json @@ -0,0 +1,3 @@ +{ + "version": "2.0" +} diff --git a/api/local.settings.json b/api/local.settings.json new file mode 100644 index 0000000..3603ddd --- /dev/null +++ b/api/local.settings.json @@ -0,0 +1,13 @@ +{ + "IsEncrypted": false, + "Values": { + "AzureWebJobsStorage": "", + "AZURE_STORAGE_CONNECTION_STRING": "DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;TableEndpoint=http://localhost:10002/devstoreaccount1;", + "FUNCTIONS_WORKER_RUNTIME": "node", + "GITHUB_API_USERNAME": "noahspannbauer", + "GITHUB_API_PAT": "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" + }, + "Host": { + "CORS": "*" + } +} diff --git a/api/main/function.json b/api/main/function.json new file mode 100644 index 0000000..1e5c89e --- /dev/null +++ b/api/main/function.json @@ -0,0 +1,17 @@ +{ + "bindings": [ + { + "authLevel": "anonymous", + "type": "httpTrigger", + "direction": "in", + "name": "req", + "route": "{*segments}" + }, + { + "type": "http", + "direction": "out", + "name": "res" + } + ], + "scriptFile": "../dist/main/index.js" +} diff --git a/api/main/index.ts b/api/main/index.ts new file mode 100644 index 0000000..71f010c --- /dev/null +++ b/api/main/index.ts @@ -0,0 +1,7 @@ +import { Context, HttpRequest } from '@azure/functions'; +import { AzureHttpAdapter } from '@nestjs/azure-func-http'; +import { createApp } from '../src/main.azure'; + +export default function(context: Context, req: HttpRequest): void { + AzureHttpAdapter.handle(createApp, context, req); +} diff --git a/api/main/sample.dat b/api/main/sample.dat new file mode 100644 index 0000000..26aac46 --- /dev/null +++ b/api/main/sample.dat @@ -0,0 +1,3 @@ +{ + "name": "Azure" +} \ No newline at end of file diff --git a/api/nest-cli.json b/api/nest-cli.json new file mode 100644 index 0000000..f9aa683 --- /dev/null +++ b/api/nest-cli.json @@ -0,0 +1,8 @@ +{ + "$schema": "https://json.schemastore.org/nest-cli", + "collection": "@nestjs/schematics", + "sourceRoot": "src", + "compilerOptions": { + "deleteOutDir": true + } +} diff --git a/api/package.json b/api/package.json new file mode 100644 index 0000000..7037a2f --- /dev/null +++ b/api/package.json @@ -0,0 +1,80 @@ +{ + "name": "api", + "version": "0.0.1", + "description": "", + "author": "", + "private": true, + "license": "UNLICENSED", + "scripts": { + "build": "nest build", + "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"", + "start": "nest start", + "start:dev": "nest start --watch", + "start:debug": "nest start --debug --watch", + "start:prod": "node dist/main", + "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix", + "test": "jest", + "test:watch": "jest --watch", + "test:cov": "jest --coverage", + "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", + "test:e2e": "jest --config ./test/jest-e2e.json", + "start:azure": "npm run build && func host start" + }, + "dependencies": { + "@azure/functions": "^1.0.3", + "@nestjs/axios": "^4.0.0", + "@nestjs/azure-func-http": "^0.10.0", + "@nestjs/common": "^10.0.0", + "@nestjs/config": "^4.0.0", + "@nestjs/core": "^10.0.0", + "@nestjs/platform-express": "^10.0.0", + "@noahspan/azure-database": "^3.1.2", + "@noahspan/noahspan-modules": "^0.5.2", + "axios": "^1.7.9", + "reflect-metadata": "^0.1.14", + "rxjs": "^7.8.1", + "uuid": "^11.0.5" + }, + "devDependencies": { + "@angular-devkit/schematics": "^19.1.4", + "@nestjs/cli": "^10.0.0", + "@nestjs/schematics": "^10.0.0", + "@nestjs/testing": "^10.0.0", + "@schematics/angular": "^19.1.4", + "@types/express": "^4.17.17", + "@types/jest": "^29.5.2", + "@types/node": "^20.3.1", + "@types/supertest": "^6.0.0", + "@typescript-eslint/eslint-plugin": "^6.0.0", + "@typescript-eslint/parser": "^6.0.0", + "eslint": "^8.42.0", + "eslint-config-prettier": "^9.0.0", + "eslint-plugin-prettier": "^5.0.0", + "jest": "^29.5.0", + "prettier": "^3.0.0", + "source-map-support": "^0.5.21", + "supertest": "^6.3.3", + "ts-jest": "^29.1.0", + "ts-loader": "^9.4.3", + "ts-node": "^10.9.1", + "tsconfig-paths": "^4.2.0", + "typescript": "^5.1.3" + }, + "jest": { + "moduleFileExtensions": [ + "js", + "json", + "ts" + ], + "rootDir": "src", + "testRegex": ".*\\.spec\\.ts$", + "transform": { + "^.+\\.(t|j)s$": "ts-jest" + }, + "collectCoverageFrom": [ + "**/*.(t|j)s" + ], + "coverageDirectory": "../coverage", + "testEnvironment": "node" + } +} \ No newline at end of file diff --git a/api/proxies.json b/api/proxies.json new file mode 100644 index 0000000..b385252 --- /dev/null +++ b/api/proxies.json @@ -0,0 +1,4 @@ +{ + "$schema": "http://json.schemastore.org/proxies", + "proxies": {} +} diff --git a/api/src/app.controller.spec.ts b/api/src/app.controller.spec.ts new file mode 100644 index 0000000..d22f389 --- /dev/null +++ b/api/src/app.controller.spec.ts @@ -0,0 +1,22 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { AppController } from './app.controller'; +import { AppService } from './app.service'; + +describe('AppController', () => { + let appController: AppController; + + beforeEach(async () => { + const app: TestingModule = await Test.createTestingModule({ + controllers: [AppController], + providers: [AppService], + }).compile(); + + appController = app.get(AppController); + }); + + describe('root', () => { + it('should return "Hello World!"', () => { + expect(appController.getHello()).toBe('Hello World!'); + }); + }); +}); diff --git a/api/src/app.module.ts b/api/src/app.module.ts new file mode 100644 index 0000000..115ceb1 --- /dev/null +++ b/api/src/app.module.ts @@ -0,0 +1,17 @@ +import { Module } from '@nestjs/common'; +import { GitHubApiModule } from './github/github.module'; +import { APP_FILTER } from '@nestjs/core'; +import { HttpExceptionFilter } from './filters/http-exception.filter'; + +@Module({ + imports: [ + GitHubApiModule + ], + providers: [ + { + provide: APP_FILTER, + useClass: HttpExceptionFilter + } + ] +}) +export class AppModule {} diff --git a/api/src/config/configuration.ts b/api/src/config/configuration.ts new file mode 100644 index 0000000..dbaedbb --- /dev/null +++ b/api/src/config/configuration.ts @@ -0,0 +1,4 @@ +export default () => ({ + githubApiUsername: process.env.GITHUB_API_USERNAME, + githubApiPassword: process.env.GITHUB_API_PAT +}) \ No newline at end of file diff --git a/api/src/filters/http-exception.filter.ts b/api/src/filters/http-exception.filter.ts new file mode 100644 index 0000000..a1942a0 --- /dev/null +++ b/api/src/filters/http-exception.filter.ts @@ -0,0 +1,25 @@ +import { + ExceptionFilter, + Catch, + ArgumentsHost, + HttpException +} from '@nestjs/common'; +import { Request, Response } from 'express'; + +@Catch(HttpException) +export class HttpExceptionFilter implements ExceptionFilter { + catch(excpetion: HttpException, host: ArgumentsHost) { + const ctx = host.switchToHttp(); + const response = ctx.getResponse(); + const request = ctx.getRequest(); + const status = excpetion.getStatus(); + + response.status(status).json({ + name: excpetion.cause, + message: excpetion.message, + statusCode: status, + timestamp: new Date().toISOString(), + path: request.url + }); + } +} diff --git a/api/src/github/github-content.interface.ts b/api/src/github/github-content.interface.ts new file mode 100644 index 0000000..e62b49e --- /dev/null +++ b/api/src/github/github-content.interface.ts @@ -0,0 +1,20 @@ +export interface Content { + name: string + path: string + sha: string + size: number + url: string + html_url: string + git_url: string + download_url: string + type: string + content: string + encoding: string + _links: Links +} + +interface Links { + self: string + git: string + html: string +} \ No newline at end of file diff --git a/api/src/github/github-repo.interface.ts b/api/src/github/github-repo.interface.ts new file mode 100644 index 0000000..2e56c11 --- /dev/null +++ b/api/src/github/github-repo.interface.ts @@ -0,0 +1,120 @@ +export interface Repo { + id: number + node_id: string + name: string + full_name: string + private: boolean + owner: Owner + html_url: string + description?: string + fork: boolean + url: string + forks_url: string + keys_url: string + collaborators_url: string + teams_url: string + hooks_url: string + issue_events_url: string + events_url: string + assignees_url: string + branches_url: string + tags_url: string + blobs_url: string + git_tags_url: string + git_refs_url: string + trees_url: string + statuses_url: string + languages_url: string + stargazers_url: string + contributors_url: string + subscribers_url: string + subscription_url: string + commits_url: string + git_commits_url: string + comments_url: string + issue_comment_url: string + contents_url: string + compare_url: string + merges_url: string + archive_url: string + downloads_url: string + issues_url: string + pulls_url: string + milestones_url: string + notifications_url: string + labels_url: string + releases_url: string + deployments_url: string + created_at: string + updated_at: string + pushed_at: string + git_url: string + ssh_url: string + clone_url: string + svn_url: string + homepage?: string + size: number + stargazers_count: number + watchers_count: number + language?: string + has_issues: boolean + has_projects: boolean + has_downloads: boolean + has_wiki: boolean + has_pages: boolean + has_discussions: boolean + forks_count: number + mirror_url: any + archived: boolean + disabled: boolean + open_issues_count: number + license?: License + allow_forking: boolean + is_template: boolean + web_commit_signoff_required: boolean + topics: any[] + visibility: string + forks: number + open_issues: number + watchers: number + default_branch: string + permissions: Permissions +} + +interface Owner { + login: string + id: number + node_id: string + avatar_url: string + gravatar_id: string + url: string + html_url: string + followers_url: string + following_url: string + gists_url: string + starred_url: string + subscriptions_url: string + organizations_url: string + repos_url: string + events_url: string + received_events_url: string + type: string + user_view_type: string + site_admin: boolean +} + +interface License { + key: string + name: string + spdx_id: string + url: string + node_id: string +} + +interface Permissions { + admin: boolean + maintain: boolean + push: boolean + triage: boolean + pull: boolean +} diff --git a/api/src/github/github.controller.ts b/api/src/github/github.controller.ts new file mode 100644 index 0000000..40721d1 --- /dev/null +++ b/api/src/github/github.controller.ts @@ -0,0 +1,35 @@ +import { Controller, Get, HttpException, Query } from '@nestjs/common'; +import { GitHubApiService } from './github.service'; +import { AxiosError } from 'axios' +import { Content } from './github-content.interface'; +import { Repo } from './github-repo.interface'; + +@Controller('github') +export class GitHubApiController { + constructor(private readonly githubApiService: GitHubApiService) {} + + @Get('readme') + async getReadMe(@Query() query: any): Promise { + try { + const repoName = query['repoName']; + + return await this.githubApiService.getReadMeContent(repoName) + } catch (error) { + const axiosError = error as AxiosError; + + throw new HttpException(axiosError.message, axiosError.status) + } + } + + @Get('repos') + async getRepos(): Promise { + try { + return await this.githubApiService.getRepos(); + } catch (error) { + const axiosError = error as AxiosError + + throw new HttpException(axiosError.message, axiosError.status) + } + } +} + diff --git a/api/src/github/github.module.ts b/api/src/github/github.module.ts new file mode 100644 index 0000000..f050b17 --- /dev/null +++ b/api/src/github/github.module.ts @@ -0,0 +1,18 @@ +import { Module } from '@nestjs/common'; +import { GitHubApiController } from './github.controller'; +import { GitHubApiService } from './github.service'; +import { ConfigModule } from '@nestjs/config'; +import configuration from '../config/configuration'; +import { HttpModule } from '@nestjs/axios'; + +@Module({ + imports: [ + ConfigModule.forRoot({ + load: [configuration] + }), + HttpModule + ], + controllers: [GitHubApiController], + providers: [GitHubApiService], +}) +export class GitHubApiModule {} diff --git a/api/src/github/github.service.ts b/api/src/github/github.service.ts new file mode 100644 index 0000000..8c68fa0 --- /dev/null +++ b/api/src/github/github.service.ts @@ -0,0 +1,39 @@ +import { Injectable } from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; +import { HttpService } from '@nestjs/axios'; +import { AxiosResponse } from 'axios'; +import { Repo } from './github-repo.interface'; +import { Content } from './github-content.interface'; + +@Injectable() +export class GitHubApiService { + constructor( + private readonly configService: ConfigService, + private readonly httpService: HttpService + ) {} + + async getReadMeContent(repoName: string): Promise { + const githubApiUsername = this.configService.get('githubApiUsername') + const response: AxiosResponse = await this.httpService.axiosRef.get(`https://api.github.com/repos/${githubApiUsername}/${repoName}/contents/README.md`, { + auth: { + username: this.configService.get('githubApiUsername'), + password: this.configService.get('githubApiPassword') + } + }) + const content: Content = response.data + + return content; + } + + async getRepos(): Promise { + const response: AxiosResponse = await this.httpService.axiosRef.get('https://api.github.com/user/repos', { + auth: { + username: this.configService.get('githubApiUsername'), + password: this.configService.get('githubApiPassword') + } + }) + const repos: Repo[] = response.data + + return repos; + } +} diff --git a/api/src/main.azure.ts b/api/src/main.azure.ts new file mode 100644 index 0000000..b0a02ed --- /dev/null +++ b/api/src/main.azure.ts @@ -0,0 +1,26 @@ +import { INestApplication, InternalServerErrorException } from '@nestjs/common'; +import { NestFactory } from '@nestjs/core'; +import { AppModule } from './app.module'; +import { HttpService } from '@nestjs/axios' +import { HttpExceptionFilter } from './filters/http-exception.filter'; + +export async function createApp(): Promise { + const httpService = new HttpService(); + const app = await NestFactory.create(AppModule); + + app.setGlobalPrefix('api'); + app.useGlobalFilters(new HttpExceptionFilter()); + httpService.axiosRef.interceptors.response.use( + (response) => { + return response; + }, + (error) => { + console.error('Internal server error exception', error); + + throw new InternalServerErrorException(); + } + ); + + await app.init(); + return app; +} diff --git a/api/src/main.ts b/api/src/main.ts new file mode 100644 index 0000000..3541ee6 --- /dev/null +++ b/api/src/main.ts @@ -0,0 +1,9 @@ +import { NestFactory } from '@nestjs/core'; +import { AppModule } from './app.module'; + +async function bootstrap() { + const app = await NestFactory.create(AppModule); + + await app.listen(3000); +} +bootstrap(); diff --git a/api/test/app.e2e-spec.ts b/api/test/app.e2e-spec.ts new file mode 100644 index 0000000..50cda62 --- /dev/null +++ b/api/test/app.e2e-spec.ts @@ -0,0 +1,24 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { INestApplication } from '@nestjs/common'; +import * as request from 'supertest'; +import { AppModule } from './../src/app.module'; + +describe('AppController (e2e)', () => { + let app: INestApplication; + + beforeEach(async () => { + const moduleFixture: TestingModule = await Test.createTestingModule({ + imports: [AppModule], + }).compile(); + + app = moduleFixture.createNestApplication(); + await app.init(); + }); + + it('/ (GET)', () => { + return request(app.getHttpServer()) + .get('/') + .expect(200) + .expect('Hello World!'); + }); +}); diff --git a/api/test/jest-e2e.json b/api/test/jest-e2e.json new file mode 100644 index 0000000..e9d912f --- /dev/null +++ b/api/test/jest-e2e.json @@ -0,0 +1,9 @@ +{ + "moduleFileExtensions": ["js", "json", "ts"], + "rootDir": ".", + "testEnvironment": "node", + "testRegex": ".e2e-spec.ts$", + "transform": { + "^.+\\.(t|j)s$": "ts-jest" + } +} diff --git a/api/tsconfig.build.json b/api/tsconfig.build.json new file mode 100644 index 0000000..64f86c6 --- /dev/null +++ b/api/tsconfig.build.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig.json", + "exclude": ["node_modules", "test", "dist", "**/*spec.ts"] +} diff --git a/api/tsconfig.json b/api/tsconfig.json new file mode 100644 index 0000000..95f5641 --- /dev/null +++ b/api/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "module": "commonjs", + "declaration": true, + "removeComments": true, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "allowSyntheticDefaultImports": true, + "target": "ES2021", + "sourceMap": true, + "outDir": "./dist", + "baseUrl": "./", + "incremental": true, + "skipLibCheck": true, + "strictNullChecks": false, + "noImplicitAny": false, + "strictBindCallApply": false, + "forceConsistentCasingInFileNames": false, + "noFallthroughCasesInSwitch": false + } +}