Standard ETS project fies from init

This commit is contained in:
2024-02-23 12:14:49 -05:00
parent f0c406d478
commit 4c90311887
9 changed files with 1793 additions and 1 deletions

94
.vscode/instanceevents.code-snippets vendored Normal file
View File

@@ -0,0 +1,94 @@
{
"Instance Initialize": {
"prefix": "instance_initialize",
"body": [
"const $1: instance_event_on_initialize = (event: number, instanceData: number[], map: EMap) => {",
"\t// Implementation",
"};",
"",
"// Register",
"RegisterMapEvent($2, InstanceEvents.INSTANCE_EVENT_ON_INITIALIZE, (...args) => $1(...args));"
],
"description": "Instance Event on Initialize",
"scope": "typescript"
},
"Instance Load": {
"prefix": "instance_load",
"body": [
"const $1: instance_event_on_load = (event: number, instanceData: number[], map: EMap) => {",
"\t// Implementation",
"};",
"",
"// Register",
"RegisterMapEvent($2, InstanceEvents.INSTANCE_EVENT_ON_LOAD, (...args) => $1(...args));"
],
"description": "Instance Event on Load",
"scope": "typescript"
},
"Instance Update": {
"prefix": "instance_update",
"body": [
"const $1: instance_event_on_update = (event: number, instanceData: number[], map: EMap, diff: number) => {",
"\t// Implementation",
"};",
"",
"// Register",
"RegisterMapEvent($2, InstanceEvents.INSTANCE_EVENT_ON_UPDATE, (...args) => $1(...args));"
],
"description": "Instance Event on Update",
"scope": "typescript"
},
"Instance Player Enter": {
"prefix": "instance_player_enter",
"body": [
"const $1: instance_event_on_player_enter = (event: number, instanceData: number[], map: EMap, player: Player) => {",
"\t// Implementation",
"};",
"",
"// Register",
"RegisterMapEvent($2, InstanceEvents.INSTANCE_EVENT_ON_PLAYER_ENTER, (...args) => $1(...args));"
],
"description": "Instance Event on Player Enter",
"scope": "typescript"
},
"Instance Creature Create": {
"prefix": "instance_creature_create",
"body": [
"const $1: instance_event_on_creature_create = (event: number, instanceData: number[], map: EMap, creature: Creature) => {",
"\t// Implementation",
"};",
"",
"// Register",
"RegisterMapEvent($2, InstanceEvents.INSTANCE_EVENT_ON_CREATURE_CREATE, (...args) => $1(...args));"
],
"description": "Instance Event on Creature Create",
"scope": "typescript"
},
"Instance GameObject Create": {
"prefix": "instance_gameobject_create",
"body": [
"const $1: instance_event_on_gameobject_create = (event: number, instanceData: number[], map: EMap, gameObject: GameObject) => {",
"\t// Implementation",
"};",
"",
"// Register",
"RegisterMapEvent($2, InstanceEvents.INSTANCE_EVENT_ON_GAMEOBJECT_CREATE, (...args) => $1(...args));"
],
"description": "Instance Event on GameObject Create",
"scope": "typescript"
},
"Instance Check Encounter in Progress": {
"prefix": "instance_check_encounter_in_progress",
"body": [
"const $1: instance_event_on_check_encounter_in_progress = (event: number, instanceData: number[], map: EMap): boolean => {",
"\t// Implementation",
"\treturn true;",
"};",
"",
"// Register",
"RegisterMapEvent($2, InstanceEvents.INSTANCE_EVENT_ON_CHECK_ENCOUNTER_IN_PROGRESS, (...args) => $1(...args));"
],
"description": "Instance Event on Check Encounter in Progress",
"scope": "typescript"
}
}

378
.vscode/playerevents.code-snippets vendored Normal file
View File

@@ -0,0 +1,378 @@
{
"Character Create": {
"prefix": "player_character_create",
"body": [
"const $1: player_event_on_character_create = (event: number, player: Player) => {",
"\t// Implementation",
"};",
"",
"// Register",
"RegisterPlayerEvent(PlayerEvents.PLAYER_EVENT_ON_CHARACTER_CREATE, (...args) => $1(...args));"
],
"description": "Player Event on Character Create",
"scope": "typescript"
},
"Character Delete": {
"prefix": "player_character_delete",
"body": [
"const $1: player_event_on_character_delete = (event: number, guid: number) => {",
"\t// Implementation",
"};",
"",
"// Register",
"RegisterPlayerEvent(PlayerEvents.PLAYER_EVENT_ON_CHARACTER_DELETE, (...args) => $1(...args));"
],
"description": "Player Event on Character Delete",
"scope": "typescript"
},
"Login": {
"prefix": "player_login",
"body": [
"const $1: player_event_on_login = (event: number, player: Player) => {",
"\t// Implementation",
"};",
"",
"// Register",
"RegisterPlayerEvent(PlayerEvents.PLAYER_EVENT_ON_LOGIN, (...args) => $1(...args));"
],
"description": "Player Event on Login",
"scope": "typescript"
},
"Logout": {
"prefix": "player_logout",
"body": [
"const $1: player_event_on_logout = (event: number, player: Player) => {",
"\t// Implementation",
"};",
"",
"// Register",
"RegisterPlayerEvent(PlayerEvents.PLAYER_EVENT_ON_LOGOUT, (...args) => $1(...args));"
],
"description": "Player Event on Logout",
"scope": "typescript"
},
"Spell Cast": {
"prefix": "player_spell_cast",
"body": [
"const $1: player_event_on_spell_cast = (event: number, player: Player, spell: Spell, skipCheck: boolean) => {",
"\t// Implementation",
"};",
"",
"// Register",
"RegisterPlayerEvent(PlayerEvents.PLAYER_EVENT_ON_SPELL_CAST, (...args) => $1(...args));"
],
"description": "Player Event on Spell Cast",
"scope": "typescript"
},
"Kill Player": {
"prefix": "player_kill_player",
"body": [
"const $1: player_event_on_kill_player = (event: number, killer: Player, killed: Player) => {",
"\t// Implementation",
"};",
"",
"// Register",
"RegisterPlayerEvent(PlayerEvents.PLAYER_EVENT_ON_KILL_PLAYER, (...args) => $1(...args));"
],
"description": "Player Event on Kill Player",
"scope": "typescript"
},
"Kill Creature": {
"prefix": "player_kill_creature",
"body": [
"const $1: player_event_on_kill_creature = (event: number, killer: Player, killed: Creature) => {",
"\t// Implementation",
"};",
"",
"// Register",
"RegisterPlayerEvent(PlayerEvents.PLAYER_EVENT_ON_KILL_CREATURE, (...args) => $1(...args));"
],
"description": "Player Event on Kill Creature",
"scope": "typescript"
},
"Killed by Creature": {
"prefix": "player_killed_by_creature",
"body": [
"const $1: player_event_on_killed_by_creature = (event: number, killer: Creature, killed: Player) => {",
"\t// Implementation",
"};",
"",
"// Register",
"RegisterPlayerEvent(PlayerEvents.PLAYER_EVENT_ON_KILLED_BY_CREATURE, (...args) => $1(...args));"
],
"description": "Player Event on Killed by Creature",
"scope": "typescript"
},
"Duel Request": {
"prefix": "player_duel_request",
"body": [
"const $1: player_event_on_duel_request = (event: number, target: Player, challenger: Player) => {",
"\t// Implementation",
"};",
"",
"// Register",
"RegisterPlayerEvent(PlayerEvents.PLAYER_EVENT_ON_DUEL_REQUEST, (...args) => $1(...args));"
],
"description": "Player Event on Duel Request",
"scope": "typescript"
},
"Duel Start": {
"prefix": "player_duel_start",
"body": [
"const $1: player_event_on_duel_start = (event: number, starter: Player, challenger: Player) => {",
"\t// Implementation",
"};",
"",
"// Register",
"RegisterPlayerEvent(PlayerEvents.PLAYER_EVENT_ON_DUEL_START, (...args) => $1(...args));"
],
"description": "Player Event on Duel Start",
"scope": "typescript"
},
"Duel End": {
"prefix": "player_duel_end",
"body": [
"const $1: player_event_on_duel_end = (event: number, winner: Player, loser: Player, type: DuelCompleteType) => {",
"\t// Implementation",
"};",
"",
"// Register",
"RegisterPlayerEvent(PlayerEvents.PLAYER_EVENT_ON_DUEL_END, (...args) => $1(...args));"
],
"description": "Player Event on Duel End",
"scope": "typescript"
},
"Give XP": {
"prefix": "player_give_xp",
"body": [
"const $1: player_event_on_give_xp = (event: number, player: Player, amount: number, victim: Player) => {",
"\t// Implementation",
"};",
"",
"// Register",
"RegisterPlayerEvent(PlayerEvents.PLAYER_EVENT_ON_GIVE_XP, (...args) => $1(...args));"
],
"description": "Player Event on Give XP",
"scope": "typescript"
},
"Level Change": {
"prefix": "player_level_change",
"body": [
"const $1: player_event_on_level_change = (event: number, player: Player, oldLevel: number) => {",
"\t// Implementation",
"};",
"",
"// Register",
"RegisterPlayerEvent(PlayerEvents.PLAYER_EVENT_ON_LEVEL_CHANGE, (...args) => $1(...args));"
],
"description": "Player Event on Level Change",
"scope": "typescript"
},
"Money Change": {
"prefix": "player_money_change",
"body": [
"const $1: player_event_on_money_change = (event: number, player: Player, amount: number) => {",
"\t// Implementation",
"};",
"",
"// Register",
"RegisterPlayerEvent(PlayerEvents.PLAYER_EVENT_ON_MONEY_CHANGE, (...args) => $1(...args));"
],
"description": "Player Event on Money Change",
"scope": "typescript"
},
"Reputation Change": {
"prefix": "player_reputation_change",
"body": [
"const $1: player_event_on_reputation_change = (event: number, player: Player, factionId: number, standing: number, incremental: boolean) => {",
"\t// Implementation",
"};",
"",
"// Register",
"RegisterPlayerEvent(PlayerEvents.PLAYER_EVENT_ON_REPUTATION_CHANGE, (...args) => $1(...args));"
],
"description": "Player Event on Reputation Change",
"scope": "typescript"
},
"Talents Change": {
"prefix": "player_talents_change",
"body": [
"const $1: player_event_on_talents_change = (event: number, player: Player, points: number) => {",
"\t// Implementation",
"};",
"",
"// Register",
"RegisterPlayerEvent(PlayerEvents.PLAYER_EVENT_ON_TALENTS_CHANGE, (...args) => $1(...args));"
],
"description": "Player Event on Talents Change",
"scope": "typescript"
},
"Talents Reset": {
"prefix": "player_talents_reset",
"body": [
"const $1: player_event_on_talents_reset = (event: number, player: Player, noCost: boolean) => {",
"\t// Implementation",
"};",
"",
"// Register",
"RegisterPlayerEvent(PlayerEvents.PLAYER_EVENT_ON_TALENTS_RESET, (...args) => $1(...args));"
],
"description": "Player Event on Talents Reset",
"scope": "typescript"
},
"Chat": {
"prefix": "player_chat",
"body": [
"const $1: player_event_on_chat = (event: number, player: Player, msg: string, Type: ChatMsg, lang: Language): string | boolean => {",
"\t// Implementation",
"\treturn '' // Return a string to override the message, or return nothing to keep the original message;",
"\treturn false // Return false to block the message, or return true to allow the message;",
"};",
"",
"// Register",
"RegisterPlayerEvent(PlayerEvents.PLAYER_EVENT_ON_CHAT, (...args) => $1(...args));"
],
"description": "Player Event on Chat",
"scope": "typescript"
},
"Whisper": {
"prefix": "player_whisper",
"body": [
"const $1: player_event_on_whisper = (event: number, player: Player, msg: string, Type: ChatMsg, lang: Language, receiver: Player): string | boolean => {",
"\t// Implementation",
"\treturn '' // Return a string to override the message, or return nothing to keep the original message;",
"\treturn false // Return false to block the message, or return true to allow the message;",
"};",
"",
"// Register",
"RegisterPlayerEvent(PlayerEvents.PLAYER_EVENT_ON_WHISPER, (...args) => $1(...args));"
],
"description": "Player Event on Whisper",
"scope": "typescript"
},
"Group Chat": {
"prefix": "player_group_chat",
"body": [
"const $1: player_event_on_group_chat = (event: number, player: Player, msg: string, Type: ChatMsg, lang: Language, group: Group): string | boolean => {",
"\t// Implementation",
"\treturn '' // Return a string to override the message, or return nothing to keep the original message;",
"\treturn false // Return false to block the message, or return true to allow the message;",
"};",
"",
"// Register",
"RegisterPlayerEvent(PlayerEvents.PLAYER_EVENT_ON_GROUP_CHAT, (...args) => $1(...args));"
],
"description": "Player Event on Group Chat",
"scope": "typescript"
},
"Guild Chat": {
"prefix": "player_guild_chat",
"body": [
"const $1: player_event_on_guild_chat = (event: number, player: Player, msg: string, Type: ChatMsg, lang: Language, guild: Guild): string | boolean => {",
"\t// Implementation",
"\treturn '' // Return a string to override the message, or return nothing to keep the original message;",
"\treturn false // Return false to block the message, or return true to allow the message;",
"};",
"",
"// Register",
"RegisterPlayerEvent(PlayerEvents.PLAYER_EVENT_ON_GUILD_CHAT, (...args) => $1(...args));"
],
"description": "Player Event on Guild Chat",
"scope": "typescript"
},
"Channel Chat": {
"prefix": "player_channel_chat",
"body": [
"const $1: player_event_on_channel_chat = (event: number, player: Player, msg: string, Type: ChatMsg, lang: Language, channel: number): string | boolean => {",
"\t// Implementation",
"\treturn '' // Return a string to override the message, or return nothing to keep the original message;",
"\treturn false // Return false to block the message, or return true to allow the message;",
"};",
"",
"// Register",
"RegisterPlayerEvent(PlayerEvents.PLAYER_EVENT_ON_CHANNEL_CHAT, (...args) => $1(...args));"
],
"description": "Player Event on Channel Chat",
"scope": "typescript"
},
"Emote": {
"prefix": "player_emote",
"body": [
"const $1: player_event_on_emote = (event: number, player: Player, emote: EmoteType) => {",
"\t// Implementation",
"};",
"",
"// Register",
"RegisterPlayerEvent(PlayerEvents.PLAYER_EVENT_ON_EMOTE, (...args) => $1(...args));"
],
"description": "Player Event on Emote",
"scope": "typescript"
},
"Text Emote": {
"prefix": "player_text_emote",
"body": [
"const $1: player_event_on_text_emote = (event: number, player: Player, textEmote: string, emoteNum: number, guid: number) => {",
"\t// Implementation",
"};",
"",
"// Register",
"RegisterPlayerEvent(PlayerEvents.PLAYER_EVENT_ON_TEXT_EMOTE, (...args) => $1(...args));"
],
"description": "Player Event on Text Emote",
"scope": "typescript"
},
"Save": {
"prefix": "player_save",
"body": [
"const $1: player_event_on_save = (event: number, player: Player) => {",
"\t// Implementation",
"};",
"",
"// Register",
"RegisterPlayerEvent(PlayerEvents.PLAYER_EVENT_ON_SAVE, (...args) => $1(...args));"
],
"description": "Player Event on Save",
"scope": "typescript"
},
"Bind to Instance": {
"prefix": "player_bind_to_instance",
"body": [
"const $1: player_event_on_bind_to_instance = (event: number, player: Player, difficulty: Difficulty, mapid: number, permanent: boolean) => {",
"\t// Implementation",
"};",
"",
"// Register",
"RegisterPlayerEvent(PlayerEvents.PLAYER_EVENT_ON_BIND_TO_INSTANCE, (...args) => $1(...args));"
],
"description": "Player Event on Bind to Instance",
"scope": "typescript"
},
"Update Zone": {
"prefix": "player_update_zone",
"body": [
"const $1: player_event_on_update_zone = (event: number, player: Player, newZone: ZoneIdType, newArea: number) => {",
"\tif(newZone === ZoneIdType.Dalaran) {",
"\t\t// Implementation",
"\t}",
"};",
"",
"// Register",
"RegisterPlayerEvent(PlayerEvents.PLAYER_EVENT_ON_UPDATE_ZONE, (...args) => $1(...args));"
],
"description": "Player Event on Update Zone",
"scope": "typescript"
},
"Map Change": {
"prefix": "player_map_change",
"body": [
"const $1: player_event_on_map_change = (event: number, player: Player) => {",
"\t// Implementation",
"};",
"",
"// Register",
"RegisterPlayerEvent(PlayerEvents.PLAYER_EVENT_ON_MAP_CHANGE, (...args) => $1(...args));"
],
"description": "Player Event on Map Change",
"scope": "typescript"
}
}

658
package-lock.json generated Normal file
View File

@@ -0,0 +1,658 @@
{
"name": "ets-snippets-test",
"version": "1.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "ets-snippets-test",
"version": "1.0.0",
"license": "MIT",
"dependencies": {
"wow-eluna-ts-module": "^1.9.5"
}
},
"node_modules/@araxiaonline/wow-wotlk-declarations": {
"version": "3.3.5-8",
"resolved": "https://registry.npmjs.org/@araxiaonline/wow-wotlk-declarations/-/wow-wotlk-declarations-3.3.5-8.tgz",
"integrity": "sha512-E8xoJph6EddGBu+9hI6VZ5FJNeVYWQog3GXV5MyIILchS5aDhJaix/2trhe8NWWyhZqaPJQrzB+psCFp76HY0A=="
},
"node_modules/@cspotcode/source-map-support": {
"version": "0.8.1",
"resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz",
"integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==",
"dependencies": {
"@jridgewell/trace-mapping": "0.3.9"
},
"engines": {
"node": ">=12"
}
},
"node_modules/@jridgewell/resolve-uri": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
"integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@jridgewell/sourcemap-codec": {
"version": "1.4.15",
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
"integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="
},
"node_modules/@jridgewell/trace-mapping": {
"version": "0.3.9",
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz",
"integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==",
"dependencies": {
"@jridgewell/resolve-uri": "^3.0.3",
"@jridgewell/sourcemap-codec": "^1.4.10"
}
},
"node_modules/@tsconfig/node10": {
"version": "1.0.9",
"resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz",
"integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA=="
},
"node_modules/@tsconfig/node12": {
"version": "1.0.11",
"resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz",
"integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag=="
},
"node_modules/@tsconfig/node14": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz",
"integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow=="
},
"node_modules/@tsconfig/node16": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz",
"integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA=="
},
"node_modules/@types/node": {
"version": "20.11.20",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.20.tgz",
"integrity": "sha512-7/rR21OS+fq8IyHTgtLkDK949uzsa6n8BkziAKtPVpugIkO6D+/ooXMvzXxDnZrmtXVfjb1bKQafYpb8s89LOg==",
"peer": true,
"dependencies": {
"undici-types": "~5.26.4"
}
},
"node_modules/@typescript-to-lua/language-extensions": {
"version": "1.19.0",
"resolved": "https://registry.npmjs.org/@typescript-to-lua/language-extensions/-/language-extensions-1.19.0.tgz",
"integrity": "sha512-Os5wOKwviTD4LeqI29N0btYOjokSJ97iCf45EOjIABlb5IwNQy7AE/AqZJobRw3ywHH8+KzJUMkEirWPzh2tUA=="
},
"node_modules/acorn": {
"version": "8.11.3",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
"integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",
"bin": {
"acorn": "bin/acorn"
},
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/acorn-walk": {
"version": "8.3.2",
"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz",
"integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==",
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/arg": {
"version": "4.1.3",
"resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
"integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA=="
},
"node_modules/asn1": {
"version": "0.2.6",
"resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
"integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
"dependencies": {
"safer-buffer": "~2.1.0"
}
},
"node_modules/bcrypt-pbkdf": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
"integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
"dependencies": {
"tweetnacl": "^0.14.3"
}
},
"node_modules/buildcheck": {
"version": "0.0.6",
"resolved": "https://registry.npmjs.org/buildcheck/-/buildcheck-0.0.6.tgz",
"integrity": "sha512-8f9ZJCUXyT1M35Jx7MkBgmBMo3oHTTBIPLiY9xyL0pl3T5RwcPEY8cUHr5LBNfu/fk6c2T4DJZuVM/8ZZT2D2A==",
"optional": true,
"engines": {
"node": ">=10.0.0"
}
},
"node_modules/commander": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
"integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
"engines": {
"node": ">= 10"
}
},
"node_modules/cpu-features": {
"version": "0.0.9",
"resolved": "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.9.tgz",
"integrity": "sha512-AKjgn2rP2yJyfbepsmLfiYcmtNn/2eUvocUyM/09yB0YDiz39HteK/5/T4Onf0pmdYDMgkBoGvRLvEguzyL7wQ==",
"hasInstallScript": true,
"optional": true,
"dependencies": {
"buildcheck": "~0.0.6",
"nan": "^2.17.0"
},
"engines": {
"node": ">=10.0.0"
}
},
"node_modules/create-require": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
"integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ=="
},
"node_modules/cross-spawn": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
"integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
"dependencies": {
"path-key": "^3.1.0",
"shebang-command": "^2.0.0",
"which": "^2.0.1"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/diff": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
"integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
"engines": {
"node": ">=0.3.1"
}
},
"node_modules/dotenv": {
"version": "9.0.2",
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-9.0.2.tgz",
"integrity": "sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg==",
"engines": {
"node": ">=10"
}
},
"node_modules/duplexer": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz",
"integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg=="
},
"node_modules/enhanced-resolve": {
"version": "5.15.0",
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz",
"integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==",
"dependencies": {
"graceful-fs": "^4.2.4",
"tapable": "^2.2.0"
},
"engines": {
"node": ">=10.13.0"
}
},
"node_modules/event-stream": {
"version": "3.3.4",
"resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz",
"integrity": "sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==",
"dependencies": {
"duplexer": "~0.1.1",
"from": "~0",
"map-stream": "~0.1.0",
"pause-stream": "0.0.11",
"split": "0.3",
"stream-combiner": "~0.0.4",
"through": "~2.3.1"
}
},
"node_modules/from": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz",
"integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g=="
},
"node_modules/fs-extra": {
"version": "11.2.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz",
"integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==",
"dependencies": {
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
},
"engines": {
"node": ">=14.14"
}
},
"node_modules/function-bind": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/graceful-fs": {
"version": "4.2.11",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
"integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
},
"node_modules/hasown": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz",
"integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==",
"dependencies": {
"function-bind": "^1.1.2"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/is-core-module": {
"version": "2.13.1",
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz",
"integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==",
"dependencies": {
"hasown": "^2.0.0"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/isexe": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
"integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
},
"node_modules/jsonfile": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
"integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
"dependencies": {
"universalify": "^2.0.0"
},
"optionalDependencies": {
"graceful-fs": "^4.1.6"
}
},
"node_modules/lodash": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
},
"node_modules/lua-types": {
"version": "2.13.1",
"resolved": "https://registry.npmjs.org/lua-types/-/lua-types-2.13.1.tgz",
"integrity": "sha512-rRwtvX6kS+5MpuO3xpvKsnYjdSDDI064Qq1OqX8gY+r+0l7m3dFLiZPDFoHqH22jaBpEvcHcPs6+WD7qkdmFsA=="
},
"node_modules/make-error": {
"version": "1.3.6",
"resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
"integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw=="
},
"node_modules/map-stream": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz",
"integrity": "sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g=="
},
"node_modules/nan": {
"version": "2.18.0",
"resolved": "https://registry.npmjs.org/nan/-/nan-2.18.0.tgz",
"integrity": "sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==",
"optional": true
},
"node_modules/node-cleanup": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/node-cleanup/-/node-cleanup-2.1.2.tgz",
"integrity": "sha512-qN8v/s2PAJwGUtr1/hYTpNKlD6Y9rc4p8KSmJXyGdYGZsDGKXrGThikLFP9OCHFeLeEpQzPwiAtdIvBLqm//Hw=="
},
"node_modules/node-scp": {
"version": "0.0.23",
"resolved": "https://registry.npmjs.org/node-scp/-/node-scp-0.0.23.tgz",
"integrity": "sha512-He+Jxt1WwuAZBfdPxoq+wQSrXMSHobB4+oo1LUDhKGqzbub7D/Q6JpDja3SzFvaxIhhnhgituP91BU97viCMjA==",
"dependencies": {
"ssh2": "^1.14.0"
}
},
"node_modules/path-key": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
"integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
"engines": {
"node": ">=8"
}
},
"node_modules/path-parse": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
},
"node_modules/pause-stream": {
"version": "0.0.11",
"resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz",
"integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==",
"dependencies": {
"through": "~2.3"
}
},
"node_modules/picomatch": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
"engines": {
"node": ">=8.6"
},
"funding": {
"url": "https://github.com/sponsors/jonschlinkert"
}
},
"node_modules/ps-tree": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.2.0.tgz",
"integrity": "sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==",
"dependencies": {
"event-stream": "=3.3.4"
},
"bin": {
"ps-tree": "bin/ps-tree.js"
},
"engines": {
"node": ">= 0.10"
}
},
"node_modules/resolve": {
"version": "1.22.8",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
"integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
"dependencies": {
"is-core-module": "^2.13.0",
"path-parse": "^1.0.7",
"supports-preserve-symlinks-flag": "^1.0.0"
},
"bin": {
"resolve": "bin/resolve"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
},
"node_modules/shebang-command": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
"integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
"dependencies": {
"shebang-regex": "^3.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/shebang-regex": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
"engines": {
"node": ">=8"
}
},
"node_modules/source-map": {
"version": "0.7.4",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
"integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
"engines": {
"node": ">= 8"
}
},
"node_modules/split": {
"version": "0.3.3",
"resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz",
"integrity": "sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==",
"dependencies": {
"through": "2"
},
"engines": {
"node": "*"
}
},
"node_modules/ssh2": {
"version": "1.15.0",
"resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.15.0.tgz",
"integrity": "sha512-C0PHgX4h6lBxYx7hcXwu3QWdh4tg6tZZsTfXcdvc5caW/EMxaB4H9dWsl7qk+F7LAW762hp8VbXOX7x4xUYvEw==",
"hasInstallScript": true,
"dependencies": {
"asn1": "^0.2.6",
"bcrypt-pbkdf": "^1.0.2"
},
"engines": {
"node": ">=10.16.0"
},
"optionalDependencies": {
"cpu-features": "~0.0.9",
"nan": "^2.18.0"
}
},
"node_modules/stream-combiner": {
"version": "0.0.4",
"resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz",
"integrity": "sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==",
"dependencies": {
"duplexer": "~0.1.1"
}
},
"node_modules/string-argv": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz",
"integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==",
"engines": {
"node": ">=0.6.19"
}
},
"node_modules/supports-preserve-symlinks-flag": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
"integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/tapable": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
"integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
"engines": {
"node": ">=6"
}
},
"node_modules/through": {
"version": "2.3.8",
"resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
"integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg=="
},
"node_modules/ts-node": {
"version": "10.9.2",
"resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz",
"integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==",
"dependencies": {
"@cspotcode/source-map-support": "^0.8.0",
"@tsconfig/node10": "^1.0.7",
"@tsconfig/node12": "^1.0.7",
"@tsconfig/node14": "^1.0.0",
"@tsconfig/node16": "^1.0.2",
"acorn": "^8.4.1",
"acorn-walk": "^8.1.1",
"arg": "^4.1.0",
"create-require": "^1.1.0",
"diff": "^4.0.1",
"make-error": "^1.1.1",
"v8-compile-cache-lib": "^3.0.1",
"yn": "3.1.1"
},
"bin": {
"ts-node": "dist/bin.js",
"ts-node-cwd": "dist/bin-cwd.js",
"ts-node-esm": "dist/bin-esm.js",
"ts-node-script": "dist/bin-script.js",
"ts-node-transpile-only": "dist/bin-transpile.js",
"ts-script": "dist/bin-script-deprecated.js"
},
"peerDependencies": {
"@swc/core": ">=1.2.50",
"@swc/wasm": ">=1.2.50",
"@types/node": "*",
"typescript": ">=2.7"
},
"peerDependenciesMeta": {
"@swc/core": {
"optional": true
},
"@swc/wasm": {
"optional": true
}
}
},
"node_modules/tsc-watch": {
"version": "6.0.4",
"resolved": "https://registry.npmjs.org/tsc-watch/-/tsc-watch-6.0.4.tgz",
"integrity": "sha512-cHvbvhjO86w2aGlaHgSCeQRl+Aqw6X6XN4sQMPZKF88GoP30O+oTuh5lRIJr5pgFWrRpF1AgXnJJ2DoFEIPHyg==",
"dependencies": {
"cross-spawn": "^7.0.3",
"node-cleanup": "^2.1.2",
"ps-tree": "^1.2.0",
"string-argv": "^0.3.1"
},
"bin": {
"tsc-watch": "dist/lib/tsc-watch.js"
},
"engines": {
"node": ">=12.12.0"
},
"peerDependencies": {
"typescript": "*"
}
},
"node_modules/tweetnacl": {
"version": "0.14.5",
"resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
"integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA=="
},
"node_modules/typescript": {
"version": "5.3.3",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz",
"integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==",
"peer": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
},
"engines": {
"node": ">=14.17"
}
},
"node_modules/typescript-to-lua": {
"version": "1.24.1",
"resolved": "https://registry.npmjs.org/typescript-to-lua/-/typescript-to-lua-1.24.1.tgz",
"integrity": "sha512-IqHKVMkgRk9cd8S8nhu5wKP+AiK9QeCJ9OUphKcNzQMNpEirrQKHvbQwoeVNWNsIaiCUvrdM1SuyxDX1B3TRZw==",
"dependencies": {
"@typescript-to-lua/language-extensions": "1.19.0",
"enhanced-resolve": "^5.8.2",
"picomatch": "^2.3.1",
"resolve": "^1.15.1",
"source-map": "^0.7.3"
},
"bin": {
"tstl": "dist/tstl.js"
},
"engines": {
"node": ">=16.10.0"
},
"peerDependencies": {
"typescript": "5.3.3"
}
},
"node_modules/undici-types": {
"version": "5.26.5",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
"integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
"peer": true
},
"node_modules/universalify": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
"integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
"engines": {
"node": ">= 10.0.0"
}
},
"node_modules/v8-compile-cache-lib": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz",
"integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg=="
},
"node_modules/which": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
"dependencies": {
"isexe": "^2.0.0"
},
"bin": {
"node-which": "bin/node-which"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/wow-eluna-ts-module": {
"version": "1.9.5",
"resolved": "https://registry.npmjs.org/wow-eluna-ts-module/-/wow-eluna-ts-module-1.9.5.tgz",
"integrity": "sha512-z5Yu+EzDS0oAmrLx2g9QTGHqaPk/FBAgb7RGW/VuTRiHBTGvDk7bgpxNkSuHK7GOW0ESpc98SpWG8E8ibe2DBQ==",
"dependencies": {
"@araxiaonline/wow-wotlk-declarations": "^3.3.5-6",
"@typescript-to-lua/language-extensions": "^1.19.0",
"commander": "^7.2.0",
"dotenv": "^9.0.2",
"fs-extra": "^11.1.1",
"lodash": "^4.17.21",
"lua-types": "^2.10.1",
"node-scp": "^0.0.23",
"ts-node": "^10.9.1",
"tsc-watch": "^6.0.4",
"typescript-to-lua": "^1.19.0"
},
"bin": {
"eluna-reload": ".bin/send-reload-eluna.sh",
"ets": ".bin/ets.js"
}
},
"node_modules/yn": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
"integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
"engines": {
"node": ">=6"
}
}
}
}

View File

@@ -22,5 +22,8 @@
"bugs": {
"url": "https://github.com/araxiaonline/ets-snippets-test/issues"
},
"homepage": "https://github.com/araxiaonline/ets-snippets-test#readme"
"homepage": "https://github.com/araxiaonline/ets-snippets-test#readme",
"dependencies": {
"wow-eluna-ts-module": "^1.9.5"
}
}

247
plugins/aio-plugin.ts Normal file
View File

@@ -0,0 +1,247 @@
import * as ts from "typescript";
import * as tstl from "typescript-to-lua";
import * as path from "node:path";
import { readFileSync, existsSync, ensureDirSync, mkdtempSync } from "fs-extra";
import * as os from "node:os";
require('dotenv').config({
path: 'ets.env'
});
type RequiredDefintion = {
module: string,
variable: string
}
const requires: Map<string, RequiredDefintion[]> = new Map();
const resolvedModules: string[] = [];
/**
* Identifies the require symbol in code and parses into module and path.
*/
function requireSymbol(code: string): string[] | null {
let matcher = code.match(/____(.+) = require\(\"(.+)\"\)/);
if(matcher) {
return new Array(matcher[1], matcher[2]);
} else {
return null;
}
}
/**
* This creates a consistent key for use in the source map that can identify values
* in both beforeEmit and afterPrint hooks
*/
function keyifyFile(file: string, program: ts.Program): string {
const newpath = file.replace(tstl.getProjectRoot(program), '').replace(path.normalize('/dist'), '');
return newpath.replace(/\.ts|\.lua/g, '');
}
/**
* Builds a source map of modules to their code.
*/
function buildSourceMap(files: tstl.EmitFile[], program: ts.Program) {
const sourceMap: Map<string, string> = new Map();
for(const file of files) {
let sourceKey = file.outputPath.replace(program.getCompilerOptions().outDir + '/' ?? '', '');
sourceKey = sourceKey.replace('.lua', '');
sourceMap.set(sourceKey, file.code);
}
return sourceMap;
}
/**
* This recursively (I hope) resolves module names to their respective code in the sourceMap
* that is built from files during the before Emit process.
* It only resolves modules once to avoid collistions in AddOn Namespace.
*/
function resolveRequire(modulepath: string, sourceMap: Map<string, string>, code?: string): string {
// de-lua-ify the module name to a path.
let filepath = modulepath.replace(/\./g, "/");
let output: string = code || '';
// skip resolved modules only want to include them once to avoid namespace issues.
if(resolvedModules.includes(modulepath)) {
console.log('skipping already resolved module: ', modulepath);
return '';
}
// have to check if the file we are resolving also has requires that need to be resolved.
let filecode = sourceMap.get(filepath) ?? '';
if(requireSymbol(filecode)) {
for(const line of filecode.split("\n")) {
if(line.includes("lualib")) {
filecode = filecode.replace(line+"\n", '');
continue;
}
const [variable, module] = requireSymbol(line) ?? ["", ""];
if(module) {
output += resolveRequire(module, sourceMap, output);
}
}
}
output += filecode;
resolvedModules.push(modulepath);
return output;
}
/**
* Removes tstl code that is added expecting the code to be exported only used for resolving module code.
*/
function resolveExports(code: string, name: string) {
return code
.replace(/local ____exports = \{\}/g,'')
.replace(/return ____exports/g,'')
.replace(/____exports/g, `____${name}`);
}
/**
* The default mechanism for transpiling files is "require" the common Polyfill bundle code. This is actually great
* for server side code, however breaks client side code. So this hook transpiles the client code with "inline"
* setting so any used Polyfills from TS are added inline into the source code removing the require to lualib modules
* tstl puts in.
*
* This also handles building a map of the requires that will later be resolved in the beforeEmit handler.
*/
function afterPrint(
program: ts.Program,
options: tstl.CompilerOptions,
emitHost: tstl.EmitHost,
result: tstl.ProcessedFile[]
) {
for (const file of result) {
const mapKey = keyifyFile(file.fileName, program);
if (file.fileName.includes(".client.ts")) {
const sourceCode = readFileSync(file.fileName, "utf-8");
const tmpPath = path.join(os.tmpdir(), 'ets-compile');
const result = tstl.transpileFiles([file.fileName],{
outDir: tmpPath,
luaLibImport: tstl.LuaLibImportKind.Inline,
luaTarget: tstl.LuaTarget.Lua52,
strict: false,
target: ts.ScriptTarget.ESNext,
skipLibCheck: true,
noHeader: true,
lib: [ 'lib.esnext.d.ts', 'lib.dom.d.ts' ],
types: [
'lua-types/5.2',
'@typescript-to-lua/language-extensions',
'wow-eluna-ts-module',
'@araxiaonline/wow-wotlk-declarations',
'node'
],
});
result.diagnostics.forEach((d) => {
console.error(`\x1b[31mTRANSPILE ERROR: ${d.messageText}\x1b[0m`);
});
const luaPath = file.fileName.replace(tstl.getSourceDir(program), '').replace('.ts', '.lua');
const fallback = path.join(tmpPath, path.basename(file.fileName.replace('.ts', '.lua')));
let transpiled:string | null = null;
if(existsSync(path.join(tmpPath,luaPath))) {
transpiled = readFileSync(path.join(tmpPath,luaPath), 'utf-8');
} else if(existsSync(fallback)) {
transpiled = readFileSync(fallback, 'utf-8');
} else {
console.error(`\x1b[31mTRANSPILE ERROR: ${fallback} not found in ${tmpPath}\x1b[0m`);
}
file.code = transpiled ?? file.code;
for (const line of file.code.split("\n")) {
const [variable, module] = requireSymbol(line) ?? ["", ""];
if (module && module !== "AIO") {
file.code = file.code.replace(line, `local ____${variable} = {}\n-- INLINE(${module})`);
const currentRequires = requires.get(mapKey) ?? [];
requires.set(mapKey, [...currentRequires, { module, variable }]);
}
}
}
}
}
/**
* This plugin will add AIO to the transpile process from TS assuming
* there is a Global installation of AIO installed in the directory, which is
* that follows Rochet2's instructions.
*
* Jan 31, 2024 Update
* The WoW Api Client does not support requires in Lua, instead it uses .toc files / xml which are not
* currently supported in AIO.
*
* When TypescriptToLua handles imports it replaces them with lua require statements. This creates a problem
* in runtime as that method is not present. This plugin now handles that by resolving the AIO client files
* by resolving the code and placing at the top of the transpiled file. This allows imports
* to effectively function as they would in TS land for client code.
*
* Caveats:
* - Your code must use the pattern if(!AIO.AddAddOn()) I realize there is otherways to use this but this is how the code identifies client files currently
* - filenames have to be *client.ts making it reserved now
* - the functions methods are all in the same namespace which could cause conflicts, I believe I handeled them in the background
* but have not done thorough user testing to verify
* - Don't go crazy my methodology here is pretty simple and it is going to work best for sharing common functions / constants / enums etcs that
* are often repeated when building UI components.
*
* @author @ben-of-codecraft
* @since 2024-01-31
*/
const plugin: tstl.Plugin = {
afterPrint,
beforeEmit(
program: ts.Program,
options: tstl.CompilerOptions,
emitHost: tstl.EmitHost,
result: tstl.EmitFile[],
) {
// build a source map first for resolving requires
const sourceMap = buildSourceMap(result, program);
for (const file of result) {
const mapKey = keyifyFile(file.outputPath, program);
if(file.code.includes("aio = {}")) {
// Handle necessary AIO replaces post transpile
file.code = file.code.replace("-- @ts-expect-error", "");
file.code = file.code.replace("aio = {}", "local AIO = AIO or require(\"AIO\")");
file.code = file.code.replace(/aio[\.\:]/g, "AIO.");
// Is targetted for AIO Client.
if(file.code.includes("if not AIO.AddAddon() then")) {
requires.forEach( (requiredModules: RequiredDefintion[], caller) => {
if(mapKey !== caller) {
return;
}
requiredModules.forEach((requiredModule) => {
const moduleCode = resolveExports(resolveRequire(requiredModule.module, sourceMap), requiredModule.variable);
file.code = file.code.replace(`-- INLINE(${requiredModule.module})\n`, `-- INLINE(${requiredModule.module})\n` + moduleCode);
});
});
}
/* Weirdness with import transpilation "local local"*/
file.code = file.code.replace("local local AIO = AIO or require(\"AIO\")", "local AIO = AIO or require(\"AIO\")");
}
}
}
};
export default plugin;

View File

@@ -0,0 +1,49 @@
const onInstanceCheckEncounter: instance_event_on_check_encounter_in_progress = (event: number, instanceData: number[], map: EMap): boolean => {
// Implementation
return true;
};
// Register
RegisterMapEvent(MapIdType.Arathi_Basin, InstanceEvents.INSTANCE_EVENT_ON_CHECK_ENCOUNTER_IN_PROGRESS, (...args) => onInstanceCheckEncounter(...args));
const onInstanceCreature: instance_event_on_creature_create = (event: number, instanceData: number[], map: EMap, creature: Creature) => {
// Implementation
};
// Register
RegisterMapEvent(MapIdType.Arathi_Basin, InstanceEvents.INSTANCE_EVENT_ON_CREATURE_CREATE, (...args) => onInstanceCreature(...args));
const onGameObjectCreate: instance_event_on_gameobject_create = (event: number, instanceData: number[], map: EMap, gameObject: GameObject) => {
// Implementation
};
// Register
RegisterMapEvent(MapIdType.Alterac_Valley, InstanceEvents.INSTANCE_EVENT_ON_GAMEOBJECT_CREATE, (...args) => onGameObjectCreate(...args));
const onInit: instance_event_on_initialize = (event: number, instanceData: number[], map: EMap) => {
// Implementation
};
// Register
RegisterMapEvent(MapIdType.Black_Temple, InstanceEvents.INSTANCE_EVENT_ON_INITIALIZE, (...args) => onInit(...args));
const onPlayerEnter: instance_event_on_player_enter = (event: number, instanceData: number[], map: EMap, player: Player) => {
// Implementation
};
// Register
RegisterMapEvent(MapIdType.Blackfathom_Deeps, InstanceEvents.INSTANCE_EVENT_ON_PLAYER_ENTER, (...args) => onPlayerEnter(...args));
const onLoad: instance_event_on_load = (event: number, instanceData: number[], map: EMap) => {
// Implementation
};
// Register
RegisterMapEvent(MapIdType.AhnQiraj_Temple, InstanceEvents.INSTANCE_EVENT_ON_LOAD, (...args) => onLoad(...args));
const onInstanceUpdate: instance_event_on_update = (event: number, instanceData: number[], map: EMap, diff: number) => {
// Implementation
};
// Register
RegisterMapEvent(MapIdType.Ahn_kahet_The_Old_Kingdom, InstanceEvents.INSTANCE_EVENT_ON_UPDATE, (...args) => onInstanceUpdate(...args));

View File

@@ -0,0 +1,207 @@
const onBindInstance: player_event_on_bind_to_instance = (event: number, player: Player, difficulty: Difficulty, mapid: number, permanent: boolean) => {
// Implementation
};
// Register
RegisterPlayerEvent(PlayerEvents.PLAYER_EVENT_ON_BIND_TO_INSTANCE, (...args) => onBindInstance(...args));
const onChannelChat: player_event_on_channel_chat = (event: number, player: Player, msg: string, Type: ChatMsg, lang: Language, channel: number): string | boolean => {
// Implementation
return '' // Return a string to override the message, or return nothing to keep the original message;
return false // Return false to block the message, or return true to allow the message;
};
// Register
RegisterPlayerEvent(PlayerEvents.PLAYER_EVENT_ON_CHANNEL_CHAT, (...args) => onChannelChat(...args));
const onCreatePlayer: player_event_on_character_create = (event: number, player: Player) => {
// Implementation
};
// Register
RegisterPlayerEvent(PlayerEvents.PLAYER_EVENT_ON_CHARACTER_CREATE, (...args) => onCreatePlayer(...args));
const onDeletePlayer: player_event_on_character_delete = (event: number, guid: number) => {
// Implementation
};
// Register
RegisterPlayerEvent(PlayerEvents.PLAYER_EVENT_ON_CHARACTER_DELETE, (...args) => onDeletePlayer(...args));
const onChat: player_event_on_chat = (event: number, player: Player, msg: string, Type: ChatMsg, lang: Language) : string | boolean => {
// Implementation
return '' // Return a string to override the message, or return nothing to keep the original message;
return false // Return false to block the message, or return true to allow the message;
};
// Register
RegisterPlayerEvent(PlayerEvents.PLAYER_EVENT_ON_CHAT, (...args) => onChat(...args));
const onDuelEnd: player_event_on_duel_end = (event: number, winner: Player, loser: Player, type: DuelCompleteType) => {
// Implementation
};
// Register
RegisterPlayerEvent(PlayerEvents.PLAYER_EVENT_ON_DUEL_END, (...args) => onDuelEnd(...args));
const onDuelReq: player_event_on_duel_request = (event: number, target: Player, challenger: Player) => {
// Implementation
};
// Register
RegisterPlayerEvent(PlayerEvents.PLAYER_EVENT_ON_DUEL_REQUEST, (...args) => onDuelReq(...args));
const onDuelStart: player_event_on_duel_start = (event: number, starter: Player, challenger: Player) => {
// Implementation
};
// Register
RegisterPlayerEvent(PlayerEvents.PLAYER_EVENT_ON_DUEL_START, (...args) => onDuelStart(...args));
const onEmote: player_event_on_emote = (event: number, player: Player, emote: EmoteType) => {
// Implementation
};
// Register
RegisterPlayerEvent(PlayerEvents.PLAYER_EVENT_ON_EMOTE, (...args) => onEmote(...args));
const onXp: player_event_on_give_xp = (event: number, player: Player, amount: number, victim: Player) => {
// Implementation
};
// Register
RegisterPlayerEvent(PlayerEvents.PLAYER_EVENT_ON_GIVE_XP, (...args) => onXp(...args));
const onGroupChat: player_event_on_group_chat = (event: number, player: Player, msg: string, Type: ChatMsg, lang: Language, group: Group) => {
// Implementation
return '' // Return a string to override the message, or return nothing to keep the original message;
return false // Return false to block the message, or return true to allow the message;
};
// Register
RegisterPlayerEvent(PlayerEvents.PLAYER_EVENT_ON_GROUP_CHAT, (...args) => onGroupChat(...args));
const onGuildChat: player_event_on_guild_chat = (event: number, player: Player, msg: string, Type: ChatMsg, lang: Language, guild: Guild) => {
// Implementation
return '' // Return a string to override the message, or return nothing to keep the original message;
return false // Return false to block the message, or return true to allow the message;
};
// Register
RegisterPlayerEvent(PlayerEvents.PLAYER_EVENT_ON_GUILD_CHAT, (...args) => onGuildChat(...args));
const onKillCreature: player_event_on_kill_creature = (event: number, killer: Player, killed: Creature) => {
// Implementation
};
// Register
RegisterPlayerEvent(PlayerEvents.PLAYER_EVENT_ON_KILL_CREATURE, (...args) => onKillCreature(...args));
const onKillPlayer: player_event_on_kill_player = (event: number, killer: Player, killed: Player) => {
// Implementation
};
// Register
RegisterPlayerEvent(PlayerEvents.PLAYER_EVENT_ON_KILL_PLAYER, (...args) => onKillPlayer(...args));
const onKilledByCreat: player_event_on_killed_by_creature = (event: number, killer: Creature, killed: Player) => {
// Implementation
};
// Register
RegisterPlayerEvent(PlayerEvents.PLAYER_EVENT_ON_KILLED_BY_CREATURE, (...args) => onKilledByCreat(...args));
const onLevelChange: player_event_on_level_change = (event: number, player: Player, oldLevel: number) => {
// Implementation
};
// Register
RegisterPlayerEvent(PlayerEvents.PLAYER_EVENT_ON_LEVEL_CHANGE, (...args) => onLevelChange(...args));
const onLogin: player_event_on_login = (event: number, player: Player) => {
// Implementation
};
// Register
RegisterPlayerEvent(PlayerEvents.PLAYER_EVENT_ON_LOGIN, (...args) => onLogin(...args));
const onLogout: player_event_on_logout = (event: number, player: Player) => {
// Implementation
};
// Register
RegisterPlayerEvent(PlayerEvents.PLAYER_EVENT_ON_LOGOUT, (...args) => onLogout(...args));
const onMapChange: player_event_on_map_change = (event: number, player: Player) => {
// Implementation
};
// Register
RegisterPlayerEvent(PlayerEvents.PLAYER_EVENT_ON_MAP_CHANGE, (...args) => onMapChange(...args));
const onMoneyChange: player_event_on_money_change = (event: number, player: Player, amount: number) => {
// Implementation
};
// Register
RegisterPlayerEvent(PlayerEvents.PLAYER_EVENT_ON_MONEY_CHANGE, (...args) => onMoneyChange(...args));
const onRepChange: player_event_on_reputation_change = (event: number, player: Player, factionId: number, standing: number, incremental: boolean) => {
// Implementation
};
// Register
RegisterPlayerEvent(PlayerEvents.PLAYER_EVENT_ON_REPUTATION_CHANGE, (...args) => onRepChange(...args));
const onSave: player_event_on_save = (event: number, player: Player) => {
// Implementation
};
// Register
RegisterPlayerEvent(PlayerEvents.PLAYER_EVENT_ON_SAVE, (...args) => onSave(...args));
const onSpellCast: player_event_on_spell_cast = (event: number, player: Player, spell: Spell, skipCheck: boolean) => {
// Implementation
};
// Register
RegisterPlayerEvent(PlayerEvents.PLAYER_EVENT_ON_SPELL_CAST, (...args) => onSpellCast(...args));
const onTalentChange: player_event_on_talents_change = (event: number, player: Player, points: number) => {
// Implementation
};
// Register
RegisterPlayerEvent(PlayerEvents.PLAYER_EVENT_ON_TALENTS_CHANGE, (...args) => onTalentChange(...args));
const onTalentReset: player_event_on_talents_reset = (event: number, player: Player, noCost: boolean) => {
// Implementation
};
// Register
RegisterPlayerEvent(PlayerEvents.PLAYER_EVENT_ON_TALENTS_RESET, (...args) => onTalentReset(...args));
const onTextEmote: player_event_on_text_emote = (event: number, player: Player, textEmote: string, emoteNum: number, guid: number) => {
// Implementation
};
// Register
RegisterPlayerEvent(PlayerEvents.PLAYER_EVENT_ON_TEXT_EMOTE, (...args) => onTextEmote(...args));
const onUpdatezone: player_event_on_update_zone = (event: number, player: Player, newZone: ZoneIdType, newArea: number) => {
if(newZone === ZoneIdType.Dalaran) {
// Implementation
}
};
// Register
RegisterPlayerEvent(PlayerEvents.PLAYER_EVENT_ON_UPDATE_ZONE, (...args) => onUpdatezone(...args));
const onWhisper: player_event_on_whisper = (event: number, player: Player, msg: string, Type: ChatMsg, lang: Language, receiver: Player): string | boolean => {
// Implementation
return '' // Return a string to override the message, or return nothing to keep the original message;
return false // Return false to block the message, or return true to allow the message;
};
// Register
RegisterPlayerEvent(PlayerEvents.PLAYER_EVENT_ON_WHISPER, (...args) => onWhisper(...args));

45
tsconfig.json Normal file
View File

@@ -0,0 +1,45 @@
{
"$schema": "./tstl.schema.json",
"compilerOptions": {
"strict": false,
"target": "esnext",
"outDir": "./dist",
"skipLibCheck": true,
"lib": [
"esnext",
"DOM"
],
"moduleResolution": "node",
"types": [
"lua-types/5.2",
"@typescript-to-lua/language-extensions",
"wow-eluna-ts-module",
"@araxiaonline/wow-wotlk-declarations"
],
"rootDir": "./"
},
"include": [
"modules/**/*.ts",
"snippets-test/*.ts"
],
"exclude": [
"node_modules",
"**/node_modules",
"test",
"**/*spec.ts",
"**/__tests__",
"**/__mocks__",
"dist/"
],
"tstl": {
"luaTarget": "5.2",
"noHeader": true,
"luaLibImport": "require",
"luaBundleEntry": "./modules/index.ts",
"luaPlugins": [
{
"name": "./plugins/aio-plugin.ts"
}
]
}
}

111
tstl.schema.json Normal file
View File

@@ -0,0 +1,111 @@
{
"title": "tsconfig.json with TSTL",
"description": "JSON schema for the TypeScript compiler's configuration file with TSTL",
"$schema": "http://json-schema.org/draft-07/schema",
"allOf": [
{
"$ref": "https://json.schemastore.org/tsconfig"
}
],
"properties": {
"tstl": {
"description": "TypeScriptToLua compiler options.",
"type": "object",
"definitions": {
"//": {
"reference": "https://typescripttolua.github.io/docs/configuration#custom-options"
}
},
"properties": {
"buildMode": {
"description": "Use buildMode: \"library\" to build publishable library packages.",
"type": "string",
"default": "library",
"enum": ["default", "library"]
},
"extension": {
"description": "File extension for the resulting Lua files. Defaults to \".lua\"",
"type": "string"
},
"lua51AllowTryCatchInAsyncAwait": {
"description": "Disable the warning that try/catch is not allowed in async functions in Lua 5.1, in case you are using a patched 5.1 lua version that supports this.",
"type": "boolean",
"default": false
},
"luaBundle": {
"description": "The name of the lua file to bundle output lua to. Requires luaBundleEntry.",
"type": "string",
"default": ""
},
"luaBundleEntry": {
"description": "The entry *.ts file that will be executed when entering the luaBundle. Requires luaBundle.",
"type": "string"
},
"luaLibImport": {
"description": "Specifies how js standard features missing in lua are imported.",
"type": "string",
"default": "require",
"enum": ["none", "inline", "require", "require-minimal"]
},
"luaTarget": {
"description": "Specifies the Lua version you want to generate code for.",
"type": "string",
"default": "universal",
"enum": ["5.0", "universal", "5.1", "5.2", "5.3", "5.4", "JIT"]
},
"noImplicitGlobalVariables": {
"description": "Always declare all root-level variables as local, even if the file is not a module and they would be global in TypeScript.",
"type": "boolean",
"default": false
},
"noImplicitSelf": {
"description": "If true, treats all project files as if they were prefixed with\n/** @noSelfInFile **/.",
"type": "boolean",
"default": false
},
"noHeader": {
"description": "Specify if a header will be added to compiled files.",
"type": "boolean",
"default": false
},
"noResolvePaths": {
"description": "An array of import paths that should not be resolved but copied verbatim to output lua.",
"type": "array"
},
"sourceMapTraceback": {
"description": "Applies the source map to show source TS files and lines in error tracebacks.",
"default": false,
"type": "boolean"
},
"tstlVerbose": {
"description": "Give verbose tstl output, helpful when diagnosing tstl issues.",
"type": "boolean",
"default": false
},
"luaPlugins": {
"description": "List of TypeScriptToLua plugins.",
"type": "array",
"items": {
"description": "Describes TypeScriptToLua plugin",
"type": "object",
"required": ["name"],
"properties": {
"name": {
"description": "Path to the JS file, that contains the plugin code",
"type": "string"
},
"import": {
"type": "string"
}
}
}
},
"measurePerformance": {
"description": "Measure and report performance of the tstl compiler.",
"type": "boolean"
}
}
}
},
"allowTrailingCommas": true
}