mirror of
https://github.com/araxiaonline/ets-snippets-test.git
synced 2026-06-13 02:52:22 -04:00
Standard ETS project fies from init
This commit is contained in:
94
.vscode/instanceevents.code-snippets
vendored
Normal file
94
.vscode/instanceevents.code-snippets
vendored
Normal 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
378
.vscode/playerevents.code-snippets
vendored
Normal 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
658
package-lock.json
generated
Normal 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"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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
247
plugins/aio-plugin.ts
Normal 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;
|
||||
49
snippets-test/instance.events.ts
Normal file
49
snippets-test/instance.events.ts
Normal 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));
|
||||
207
snippets-test/player.events.ts
Normal file
207
snippets-test/player.events.ts
Normal 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
45
tsconfig.json
Normal 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
111
tstl.schema.json
Normal 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
|
||||
}
|
||||
Reference in New Issue
Block a user