From 4b9123f5f6d40d437ff34b02fb40f70fa9359ac8 Mon Sep 17 00:00:00 2001 From: Helloyunho Date: Thu, 22 Oct 2020 01:30:42 +0900 Subject: [PATCH] Project start Co-Authored-By: Lee Hyun Co-Authored-By: yky4589 <8479056+yky4589@users.noreply.github.com> Co-Authored-By: Choi Minseo Co-Authored-By: Aki --- .eslintrc.js | 19 ++++++ .gitignore | 4 ++ .vscode/settings.json | 6 ++ README.md | 3 +- package.json | 22 +++++++ src/consts/urlsAndVersions.ts | 7 +++ src/models/gateway.ts | 114 ++++++++++++++++++++++++++++++++++ src/structures/base.ts | 10 +++ src/structures/channel.ts | 0 src/structures/embed.ts | 0 src/structures/guild.ts | 0 src/structures/message.ts | 1 + src/structures/textChannel.ts | 0 src/types/endpoint.ts | 66 ++++++++++++++++++++ src/types/gatewayResponse.ts | 14 +++++ src/types/gatewayTypes.ts | 58 +++++++++++++++++ src/types/permissionFlags.ts | 45 ++++++++++++++ src/types/voiceTypes.ts | 29 +++++++++ tsconfig.json | 75 ++++++++++++++++++++++ 19 files changed, 472 insertions(+), 1 deletion(-) create mode 100644 .eslintrc.js create mode 100644 .vscode/settings.json create mode 100644 package.json create mode 100644 src/consts/urlsAndVersions.ts create mode 100644 src/models/gateway.ts create mode 100644 src/structures/base.ts create mode 100644 src/structures/channel.ts create mode 100644 src/structures/embed.ts create mode 100644 src/structures/guild.ts create mode 100644 src/structures/message.ts create mode 100644 src/structures/textChannel.ts create mode 100644 src/types/endpoint.ts create mode 100644 src/types/gatewayResponse.ts create mode 100644 src/types/gatewayTypes.ts create mode 100644 src/types/permissionFlags.ts create mode 100644 src/types/voiceTypes.ts create mode 100644 tsconfig.json diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..910b2d3 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,19 @@ +module.exports = { + env: { + es2021: true, + node: true + }, + extends: [ + 'standard-with-typescript', + 'prettier', + 'prettier/@typescript-eslint', + 'prettier/standard' + ], + parser: '@typescript-eslint/parser', + parserOptions: { + ecmaVersion: 12, + sourceType: 'module' + }, + plugins: ['@typescript-eslint'], + rules: {} +} diff --git a/.gitignore b/.gitignore index 6704566..ddf707b 100644 --- a/.gitignore +++ b/.gitignore @@ -102,3 +102,7 @@ dist # TernJS port file .tern-port + +# Used ESLint for linting so block package-lock +package-lock.json +yarn.lock diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..0dd8765 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "deno.enable": true, + "deno.lint": false, + "deno.unstable": false, + "deepscan.enable": true +} \ No newline at end of file diff --git a/README.md b/README.md index 27c38f5..bab4ebe 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,3 @@ # discord.deno -Discord Deno API that is easy to use + +## Feature diff --git a/package.json b/package.json new file mode 100644 index 0000000..4854cdd --- /dev/null +++ b/package.json @@ -0,0 +1,22 @@ +{ + "name": "discord.deno", + "version": "1.0.0", + "description": "Discord Deno API that is easy to use.", + "main": "index.js", + "repository": "https://github.com/Helloyunho/discord.deno.git", + "author": "Helloyunho ", + "license": "MIT", + "devDependencies": { + "@typescript-eslint/eslint-plugin": "^4.5.0", + "@typescript-eslint/parser": "^4.5.0", + "eslint": "^7.11.0", + "eslint-config-prettier": "^6.13.0", + "eslint-config-standard": "^14.1.1", + "eslint-config-standard-with-typescript": "^19.0.1", + "eslint-plugin-import": "^2.22.1", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-promise": "^4.2.1", + "eslint-plugin-standard": "^4.0.1", + "typescript": "^4.0.3" + } +} diff --git a/src/consts/urlsAndVersions.ts b/src/consts/urlsAndVersions.ts new file mode 100644 index 0000000..7e7ef2f --- /dev/null +++ b/src/consts/urlsAndVersions.ts @@ -0,0 +1,7 @@ +export const DISCORD_API_URL = 'https://discord.com/api' //여기 v8 들어가야하는거 아닌가... <- gateway.ts 참조바람 왜 거기 endpoint에서 import에서 에러나지 왜?? + +export const DISCORD_GATEWAY_URL = 'wss://gateway.discord.com' + +export const DISCORD_CDN_URL = 'https://cdn.discordapp.com' + +export const DISCORD_API_VERSION = 8 diff --git a/src/models/gateway.ts b/src/models/gateway.ts new file mode 100644 index 0000000..d68bf3b --- /dev/null +++ b/src/models/gateway.ts @@ -0,0 +1,114 @@ +import { inflate } from 'https://deno.land/x/denoflate/mod.ts' +import { + DISCORD_GATEWAY_URL, + DISCORD_API_VERSION +} from '../consts/urlsAndVersions.ts' +import { GatewayResponse } from '../types/gatewayResponse.ts' +import { GatewayOpcodes, GatewayIntents } from '../types/gatewayTypes.ts' + +/** + * Handles Discord gateway connection. + * You should not use this and rather use Client class. + * + * @beta + */ +class Gateway { + websocket: WebSocket + token: string + intents: [GatewayIntents] + connected = false + initialized = false + heartbeatInterval = 0 + heartbeatIntervalID?: number + sequenceID?: number + heartbeatServerResponded = false + + constructor (token: string, intents: [GatewayIntents]) { + this.websocket = new WebSocket( + `${DISCORD_GATEWAY_URL}/?v=${DISCORD_API_VERSION}&encoding=json` + ) + this.token = token + this.intents = intents + } + + onopen () { + this.connected = true + } + + onmessage (event: MessageEvent) { + let data = event.data + if (data instanceof ArrayBuffer) { + data = new Uint8Array(data) + } + if (data instanceof Uint8Array) { + const dataSuffix = data.slice(-4) + + if ( + dataSuffix[0] === 0 && + dataSuffix[1] === 0 && + dataSuffix[2] === 0xff && + dataSuffix[3] === 0xff + ) { + data = inflate(data) + } + } + + const { op, d, s, t }: GatewayResponse = JSON.parse(data) + + switch (op) { + case GatewayOpcodes.HELLO: + this.heartbeatInterval = d.heartbeat_interval + this.heartbeatIntervalID = setInterval(() => { + this.websocket.send( + JSON.stringify({ + op: GatewayOpcodes.HEARTBEAT, + d: this.sequenceID ?? null + }) + ) + + if (this.heartbeatServerResponded) { + this.heartbeatServerResponded = false + } else { + // TODO: Add heartbeat failed error + } + }, this.heartbeatInterval) + + this.websocket.send( + JSON.stringify({ + token: this.token, + properties: { + $os: Deno.build.os, + $browser: 'discord.deno', + $device: 'discord.deno' + }, + compress: true, + shard: [0, 1], // TODO: Make sharding possible + intents: this.intents.reduce( + (previous, current) => previous | current, + 0 + ), + presence: { + // TODO: User should can customize this + status: 'online', + since: null, + afk: false + } + }) + ) + break + + case GatewayOpcodes.HEARTBEAT_ACK: + this.heartbeatServerResponded = true + break + + case GatewayOpcodes.DISPATCH: + switch (t) { + } + + default: + return + } + } +} + +export { Gateway } diff --git a/src/structures/base.ts b/src/structures/base.ts new file mode 100644 index 0000000..a2ccbc5 --- /dev/null +++ b/src/structures/base.ts @@ -0,0 +1,10 @@ +// 일단 대충 여러 봇 라이브러리에서 본 구조 가져오는 중.. + +class Base { + id?: string + constructor (id: string | undefined) { + if (id) { + this.id = id + } + } +} diff --git a/src/structures/channel.ts b/src/structures/channel.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/structures/embed.ts b/src/structures/embed.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/structures/guild.ts b/src/structures/guild.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/structures/message.ts b/src/structures/message.ts new file mode 100644 index 0000000..3c63375 --- /dev/null +++ b/src/structures/message.ts @@ -0,0 +1 @@ +// 여긴가 diff --git a/src/structures/textChannel.ts b/src/structures/textChannel.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/types/endpoint.ts b/src/types/endpoint.ts new file mode 100644 index 0000000..18fc567 --- /dev/null +++ b/src/types/endpoint.ts @@ -0,0 +1,66 @@ +//Being Written by Choi Donghan, Catry + +import { + DISCORD_API_URL, + DISCORD_API_VERSION, + DISCORD_CDN_URL +} from '../consts/urlsAndVersions.ts' + +//Guild Endpoints +const GUILDS = `${DISCORD_API_URL}/v${DISCORD_API_VERSION}/guilds` +const GUILD = (guildID: string) => + `${DISCORD_API_URL}/v${DISCORD_API_VERSION}/guilds/${guildID}` +const GUILD_ICON = (guildID: string, iconID: string) => + `${DISCORD_API_URL}/v${DISCORD_API_VERSION}/guilds/${guildID}/${iconID}` +const GUILD_BANNER = (guildID: string, iconID: string) => + `${DISCORD_CDN_URL}/${guildID}/${iconID}` +const GUILD_AUDIT_LOGS = (guildID: string) => + `${DISCORD_API_URL}/v${DISCORD_API_VERSION}/guilds/${guildID}/audit-logs` +const GUILD_WIDGET = (guildID: string) => + `${DISCORD_API_URL}/v${DISCORD_API_VERSION}/guilds/${guildID}/widget` +const GUILD_EMOJI = (guildID: string, emoji_id: string) => + `${DISCORD_API_URL}/v${DISCORD_API_VERSION}/guilds/${guildID}/emojis/${emoji_id}` +const GUILD_EMOJIS = (guildID: string) => + `${DISCORD_API_URL}/v${DISCORD_API_VERSION}/guilds/${guildID}/emojis` +const GUILD_REGIONS = (guildID: string) => + `${DISCORD_API_URL}/v${DISCORD_API_VERSION}/guilds/${guildID}/regions` +const GUILD_ROLE = (guildID: string, roleID: string) => + `${DISCORD_API_URL}/v${DISCORD_API_VERSION}/guilds/${guildID}/roles/${roleID}` +const GUILD_ROLES = (guildID: string) => + `${DISCORD_API_URL}/v${DISCORD_API_VERSION}/guilds/${guildID}/roles` +const GUILD_MEMBER_ROLE = (guildID: string, memberID: string, roleID: string) => + `${DISCORD_API_URL}/v${DISCORD_API_VERSION}/guilds/${guildID}/members/${memberID}/roles/${roleID}` +const GUILD_INTEGRATION = (guildID: string, integrationID: string) => + `${DISCORD_API_URL}/v${DISCORD_API_VERSION}/guilds/${guildID}/integrations/${integrationID}` +const GUILD_INTEGRATIONS = (guildID: string) => + `${DISCORD_API_URL}/v${DISCORD_API_VERSION}/guilds/${guildID}/integrations` +const GUILD_INTEGARTION_SYNC = (guildID: string) => + `${DISCORD_API_URL}/v${DISCORD_API_VERSION}/guilds/${guildID}/integrations?include_appilications=true` + +//Channel Endpoints +const CHANNEL = (channelID: string) => + `${DISCORD_API_URL}/v${DISCORD_API_VERSION}/channels/${channelID}` +const CHANNELS = (channelID: string) => + `${DISCORD_API_URL}/v${DISCORD_API_VERSION}/guilds/${channelID}/channels` +const CHANNEL_MESSAGES = (channelID: string) => + `${DISCORD_API_URL}/v${DISCORD_API_VERSION}/channels/${channelID}/messages` +const CHANNEL_MESSAGE = (channelID: string, messageID: string) => + `${DISCORD_API_URL}/v${DISCORD_API_VERSION}/channels/${channelID}/messages/${messageID}` +const CHANNEL_CROSSPOST = (channelID: string, messageID: string) => + `${DISCORD_API_URL}/v${DISCORD_API_VERSION}/channels/${channelID}/messages/${messageID}/crosspost` +const MESSAGE_REACTION = ( + channelID: string, + messageID: string, + emoji: string +) => + `${DISCORD_API_URL}/v${DISCORD_API_VERSION}/channels/${channelID}/messages/${messageID}/reactions/${emoji}/@me` + +//User Endpoints +const USER = (userID: string) => + `${DISCORD_API_URL}/v${DISCORD_API_VERSION}/users/${userID}` +const USER_AVATAR_DEFAULT = (iconID: number) => + `${DISCORD_API_URL}/v${DISCORD_API_VERSION}/embed/avatars${iconID}.png` +const USER_AVATAR = (userID: string, iconID: string) => + `${DISCORD_API_URL}/v${DISCORD_API_VERSION}/avatars/${userID}/${iconID}.png` +const USER_CREATE_DM = () => + `${DISCORD_API_URL}/v${DISCORD_API_VERSION}/users/@me/channels` diff --git a/src/types/gatewayResponse.ts b/src/types/gatewayResponse.ts new file mode 100644 index 0000000..2399f5f --- /dev/null +++ b/src/types/gatewayResponse.ts @@ -0,0 +1,14 @@ +import { GatewayOpcodes } from '../types/gatewayTypes.ts' + +/** + * Gateway response from Discord. + * + */ +interface GatewayResponse { + op: GatewayOpcodes + d: any + s?: number + t?: string +} + +export { GatewayResponse } diff --git a/src/types/gatewayTypes.ts b/src/types/gatewayTypes.ts new file mode 100644 index 0000000..3875d89 --- /dev/null +++ b/src/types/gatewayTypes.ts @@ -0,0 +1,58 @@ +// https://discord.com/developers/docs/topics/opcodes-and-status-codes#gateway + +/** + * Gateway OPcodes from Discord docs. + */ +enum GatewayOpcodes { // 문서를 확인해본 결과 Opcode 5번은 비어있다. - UnderC - + DISPATCH = 0, + HEARTBEAT = 1, + IDENTIFY = 2, + PRESENCE_UPDATE = 3, + VOICE_STATE_UPDATE = 4, + RESUME = 6, + RECONNECT = 7, + REQUEST_GUILD_MEMBERS = 8, + INVALID_SESSION = 9, + HELLO = 10, + HEARTBEAT_ACK = 11 +} + +/** + * Gateway Close Codes from Discord docs. + */ +enum GatewayCloseCodes { + UNKNOWN_ERROR = 4000, + UNKNOWN_OPCODE = 4001, + DECODE_ERROR = 4002, + NOT_AUTHENTICATED = 4003, + AUTHENTICATION_FAILED = 4004, + ALREADY_AUTHENTICATED = 4005, + INVALID_SEQ = 4007, + RATE_LIMITED = 4008, + SESSION_TIMED_OUT = 4009, + INVALID_SHARD = 4010, + SHARDING_REQUIRED = 4011, + INVALID_API_VERSION = 4012, + INVALID_INTENTS = 4013, + DISALLOWED_INTENTS = 4014 +} + +enum GatewayIntents { + GUILDS = 1 << 0, + GUILD_MEMBERS = 1 << 1, + GUILD_BANS = 1 << 2, + GUILD_EMOJIS = 1 << 3, + GUILD_INTEGRATIONS = 1 << 4, + GUILD_WEBHOOKS = 1 << 5, + GUILD_INVITES = 1 << 6, + GUILD_VOICE_STATES = 1 << 7, + GUILD_PRESENCES = 1 << 8, + GUILD_MESSAGES = 1 << 9, + GUILD_MESSAGE_REACTIONS = 1 << 10, + GUILD_MESSAGE_TYPING = 1 << 11, + DIRECT_MESSAGES = 1 << 12, + DIRECT_MESSAGE_REACTIONS = 1 << 13, + DIRECT_MESSAGE_TYPING = 1 << 13 +} + +export { GatewayCloseCodes, GatewayOpcodes, GatewayIntents } diff --git a/src/types/permissionFlags.ts b/src/types/permissionFlags.ts new file mode 100644 index 0000000..47a6e96 --- /dev/null +++ b/src/types/permissionFlags.ts @@ -0,0 +1,45 @@ +// https://discord.com/developers/docs/topics/permissions#permissions-bitwise-permission-flags +// 귀하는 해갈 +// 그렇습니다 + +//이거 필요한건가 -와갈드- -UnderC- + +enum PermissionFlags { + CREATE_INSTANT_INVITE = 0x00000001, + + KICK_MEMBERS = 0x00000002, + BAN_MEMBERS = 0x00000004, + ADMINISTRATOR = 0x00000008, + MANAGE_CHANNELS = 0x00000010, + MANAGE_GUILD = 0x00000020, + + ADD_REACTIONS = 0x00000040, + VIEW_AUDIT_LOG = 0x00000080, + PRIORITY_SPEAKER = 0x00000100, + STREAM = 0x00000200, + + VIEW_CHANNEL = 0x00000400, + SEND_MESSAGES = 0x00000800, + SEND_TTS_MESSAGES = 0x00001000, + MANAGE_MESSAGES = 0x00002000, + + EMBED_LINKS = 0x00004000, + ATTACH_FILES = 0x00008000, + READ_MESSAGE_HISTORY = 0x00010000, + MENTION_EVERYONE = 0x00020000, + USE_EXTERNAL_EMOJIS = 0x00040000, + VIEW_GUILD_INSIGHTS = 0x00080000, + + CONNECT = 0x00100000, + SPEAK = 0x00200000, + MUTE_MEMBERS = 0x00400000, + DEAFEN_MEMBERS = 0x00800000, + MOVE_MEMBERS = 0x01000000, + USE_VAD = 0x02000000, + + CHANGE_NICKNAME = 0x04000000, + MANAGE_NICKNAMES = 0x08000000, + MANAGE_ROLES = 0x10000000, + MANAGE_WEBHOOKS = 0x20000000, + MANAGE_EMOJIS = 0x40000000 +} diff --git a/src/types/voiceTypes.ts b/src/types/voiceTypes.ts new file mode 100644 index 0000000..7cff333 --- /dev/null +++ b/src/types/voiceTypes.ts @@ -0,0 +1,29 @@ +// https://discord.com/developers/docs/topics/opcodes-and-status-codes#voice + +enum VoiceOpcodes { // VoiceOpcodes 추가 - UnderC - + IDENTIFY = 0, + SELECT_PROTOCOL = 1, + READY = 2, + HEARTBEAT = 3, + SESSION_DESCRIPTION = 4, + SPEAKING = 6, + HEARTBEAT_ACK = 6, + RESUME = 7, + HELLO = 8, + RESUMED = 9, + CLIENT_DISCONNECT = 13 +} + +enum VoiceCloseCodes { + UNKNOWN_OPCODE = 4001, + NOT_AUTHENTICATED = 4003, + AUTHENTICATION_FAILED = 4004, + ALREADY_AUTHENTICATED = 4005, + SESSION_NO_LONGER_VALID = 4006, + SESSION_TIMEOUT = 4009, + SERVER_NOT_FOUNT = 4011, + UNKNOWN_PROTOCOL = 4012, + DISCONNECTED = 4014, + VOICE_SERVER_CRASHED = 4015, + UNKNOWN_ENCRYPTION_MODE = 4016 +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..4cbd33c --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,75 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig.json to read more about this file */ + + /* Basic Options */ + // "incremental": true, /* Enable incremental compilation */ + "target": "ESNEXT", + /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */ + "module": "ESNext", + /* 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', or 'react'. */ + // "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": "./", /* 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. */ + + /* 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. */ + } +} \ No newline at end of file