From 4c903118873181ad43add47c54662a8bdaea44b0 Mon Sep 17 00:00:00 2001 From: Ben Carter Date: Fri, 23 Feb 2024 12:14:49 -0500 Subject: [PATCH] Standard ETS project fies from init --- .vscode/instanceevents.code-snippets | 94 ++++ .vscode/playerevents.code-snippets | 378 +++++++++++++++ package-lock.json | 658 +++++++++++++++++++++++++++ package.json | 5 +- plugins/aio-plugin.ts | 247 ++++++++++ snippets-test/instance.events.ts | 49 ++ snippets-test/player.events.ts | 207 +++++++++ tsconfig.json | 45 ++ tstl.schema.json | 111 +++++ 9 files changed, 1793 insertions(+), 1 deletion(-) create mode 100644 .vscode/instanceevents.code-snippets create mode 100644 .vscode/playerevents.code-snippets create mode 100644 package-lock.json create mode 100644 plugins/aio-plugin.ts create mode 100644 snippets-test/instance.events.ts create mode 100644 snippets-test/player.events.ts create mode 100644 tsconfig.json create mode 100644 tstl.schema.json diff --git a/.vscode/instanceevents.code-snippets b/.vscode/instanceevents.code-snippets new file mode 100644 index 0000000..a65a5c5 --- /dev/null +++ b/.vscode/instanceevents.code-snippets @@ -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" + } +} diff --git a/.vscode/playerevents.code-snippets b/.vscode/playerevents.code-snippets new file mode 100644 index 0000000..0d3b3ec --- /dev/null +++ b/.vscode/playerevents.code-snippets @@ -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" + } +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..df3348b --- /dev/null +++ b/package-lock.json @@ -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" + } + } + } +} diff --git a/package.json b/package.json index de420e5..aa6d7c4 100644 --- a/package.json +++ b/package.json @@ -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" + } } diff --git a/plugins/aio-plugin.ts b/plugins/aio-plugin.ts new file mode 100644 index 0000000..47e6d16 --- /dev/null +++ b/plugins/aio-plugin.ts @@ -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 = 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 = 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, 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; diff --git a/snippets-test/instance.events.ts b/snippets-test/instance.events.ts new file mode 100644 index 0000000..97b270c --- /dev/null +++ b/snippets-test/instance.events.ts @@ -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)); \ No newline at end of file diff --git a/snippets-test/player.events.ts b/snippets-test/player.events.ts new file mode 100644 index 0000000..f9258f8 --- /dev/null +++ b/snippets-test/player.events.ts @@ -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)); \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..709ee5d --- /dev/null +++ b/tsconfig.json @@ -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" + } + ] + } +} \ No newline at end of file diff --git a/tstl.schema.json b/tstl.schema.json new file mode 100644 index 0000000..25dd934 --- /dev/null +++ b/tstl.schema.json @@ -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 +} \ No newline at end of file