diff --git a/[core]/esx_identity/config.lua b/[core]/esx_identity/config.lua index 3da197d0f..817f902b0 100644 --- a/[core]/esx_identity/config.lua +++ b/[core]/esx_identity/config.lua @@ -16,4 +16,4 @@ Config.MaxHeight = 220 -- 220 cm max height. Config.MaxAge = 100 -- 100 years old is the oldest you can be. Config.FullCharDelete = true -- Delete all reference to character. -Config.EnableDebugging = ESX.GetConfig().EnableDebug -- prints for debugging :) +Config.EnableDebugging = ESX.GetConfig().EnableDebug -- prints for debugging :) \ No newline at end of file diff --git a/[core]/esx_identity/fxmanifest.lua b/[core]/esx_identity/fxmanifest.lua index dad5391ab..72e23c7e3 100644 --- a/[core]/esx_identity/fxmanifest.lua +++ b/[core]/esx_identity/fxmanifest.lua @@ -14,6 +14,15 @@ server_scripts { '@oxmysql/lib/MySQL.lua', 'locales/*.lua', 'config.lua', + 'server/module/registry.lua', + 'server/module/validation.lua', + 'server/module/util.lua', + 'server/module/database.lua', + 'server/module/identity.lua', + 'server/module/multichar.lua', + 'server/module/callback.lua', + 'server/module/commands.lua', + 'server/module/debugging.lua', 'server/main.lua' } diff --git a/[core]/esx_identity/server/main.lua b/[core]/esx_identity/server/main.lua index 584425b9a..0d79fde45 100644 --- a/[core]/esx_identity/server/main.lua +++ b/[core]/esx_identity/server/main.lua @@ -1,409 +1,8 @@ -local playerIdentity = {} -local alreadyRegistered = {} -local multichar = ESX.GetConfig().Multichar - -local function deleteIdentityFromDatabase(xPlayer) - MySQL.query.await("UPDATE users SET firstname = ?, lastname = ?, dateofbirth = ?, sex = ?, height = ?, skin = ? WHERE identifier = ?", { nil, nil, nil, nil, nil, nil, xPlayer.identifier }) - - if Config.FullCharDelete then - MySQL.update.await("UPDATE addon_account_data SET money = 0 WHERE account_name IN (?) AND owner = ?", { { "bank_savings", "caution" }, xPlayer.identifier }) - - MySQL.prepare.await("UPDATE datastore_data SET data = ? WHERE name IN (?) AND owner = ?", { "'{}'", { "user_ears", "user_glasses", "user_helmet", "user_mask" }, xPlayer.identifier }) - end -end - ----@param xPlayer StaticPlayer|xPlayer ----@param data {firstName:string?, lastName:string?, dateOfBirth:string?, height:number?, sex:"m"|"f"?} -function SetPlayerData(xPlayer, data) - local name = ("%s %s"):format(data.firstName, data.lastName) - xPlayer.setName(name) - xPlayer.set("firstName", data.firstName) - xPlayer.set("lastName", data.lastName) - xPlayer.set("dateofbirth", data.dateOfBirth) - xPlayer.set("sex", data.sex) - xPlayer.set("height", data.height) - - local state = Player(xPlayer.getSource()).state - state:set("name", name, true) - state:set("firstName", data.firstName, true) - state:set("lastName", data.lastName, true) - state:set("dateofbirth", data.dateOfBirth, true) - state:set("sex", data.sex, true) - state:set("height", data.height, true) -end - ----@param xPlayer xPlayer -local function deleteIdentity(xPlayer) - if not alreadyRegistered[xPlayer.identifier] then - return - end - - SetPlayerData(xPlayer, { firstName = nil, lastName = nil, dateOfBirth = nil, sex = nil, height = nil }) - deleteIdentityFromDatabase(xPlayer) -end - - -local function saveIdentityToDatabase(identifier, identity) - MySQL.update.await("UPDATE users SET firstname = ?, lastname = ?, dateofbirth = ?, sex = ?, height = ? WHERE identifier = ?", { identity.firstName, identity.lastName, identity.dateOfBirth, identity.sex, identity.height, identifier }) -end - ----@param year number Year ----@return boolean: true if the year is a leap year, false otherwise -local function isLeapYear(year) - return (year % 4 == 0 and year % 100 ~= 0) or (year % 400 == 0) -end - ----@param dob string Date of Birth in the format DD/MM/YYYY ----@return boolean: true if the date is valid, false otherwise -local function checkDOBFormat(dob) - dob = tostring(dob) - - local dayStr, monthStr, yearStr = dob:match("^(%d%d?)/(%d%d?)/(%d%d%d%d)$") - if not dayStr or not monthStr or not yearStr then - return false - end - - local day, month, year = tonumber(dayStr), tonumber(monthStr), tonumber(yearStr) - if not day or not month or not year then - return false - end - - local currentYear = os.date("*t").year - local minYear = currentYear - Config.MaxAge - local maxYear = currentYear - 18 - - if year < minYear or year > maxYear then return false end - if month < 1 or month > 12 then return false end - - -- Days in each month (starting from January.) - local daysInMonth = { 31, isLeapYear(year) and 29 or 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 } - return day >= 1 and day <= daysInMonth[month] -end - -local function formatDate(str) - local d, m, y = string.match(str, "(%d+)/(%d+)/(%d+)") - local date = str - - if Config.DateFormat == "MM/DD/YYYY" then - date = m .. "/" .. d .. "/" .. y - elseif Config.DateFormat == "YYYY/MM/DD" then - date = y .. "/" .. m .. "/" .. d - end - - return date -end - -local function checkNameFormat(name) - if ESX.IsValidLocaleString(name) then - local stringLength = string.len(name) - return stringLength > 0 and stringLength < Config.MaxNameLength - end - - return false -end - -local function checkSexFormat(sex) - if not sex then - return false - end - return sex == "m" or sex == "M" or sex == "f" or sex == "F" -end - -local function checkHeightFormat(height) - local numHeight = tonumber(height) or 0 - return numHeight >= Config.MinHeight and numHeight <= Config.MaxHeight -end - -local function convertToLowerCase(str) - return string.lower(str) -end - -local function convertFirstLetterToUpper(str) - return str:gsub("^%l", string.upper) -end - -local function formatName(name) - local loweredName = convertToLowerCase(name) - return convertFirstLetterToUpper(loweredName) -end - ----@param xPlayer StaticPlayer -local function setIdentity(xPlayer) - local playerIdentifier = xPlayer.getIdentifier() - if not alreadyRegistered[playerIdentifier] then - return - end - local currentIdentity = playerIdentity[playerIdentifier] - SetPlayerData(xPlayer, currentIdentity) - - TriggerClientEvent("esx_identity:setPlayerData", xPlayer.src, currentIdentity) - if currentIdentity.saveToDatabase then - saveIdentityToDatabase(playerIdentifier, currentIdentity) - end - - playerIdentity[playerIdentifier] = nil -end - ----@param xPlayer StaticPlayer -local function checkIdentity(xPlayer) - local playerIdentifier = xPlayer.getIdentifier() - MySQL.single("SELECT firstname, lastname, dateofbirth, sex, height FROM users WHERE identifier = ?", { playerIdentifier }, function(result) - if not result then - return TriggerClientEvent("esx_identity:showRegisterIdentity", xPlayer.src) - end - if not result.firstname then - playerIdentity[playerIdentifier] = nil - alreadyRegistered[playerIdentifier] = false - return TriggerClientEvent("esx_identity:showRegisterIdentity", xPlayer.src) - end - - playerIdentity[playerIdentifier] = { - firstName = result.firstname, - lastName = result.lastname, - dateOfBirth = result.dateofbirth, - sex = result.sex, - height = result.height, - } - - alreadyRegistered[playerIdentifier] = true - setIdentity(xPlayer) - end) -end - -if not multichar then - AddEventHandler("playerConnecting", function(_, _, deferrals) - deferrals.defer() - local _, identifier = source, nil - - local correctLicense, _ = pcall(function() - identifier = ESX.GetIdentifier(source) - end) - - Wait(40) - - if not identifier or not correctLicense then - return deferrals.done(TranslateCap("no_identifier")) - end - MySQL.single("SELECT firstname, lastname, dateofbirth, sex, height FROM users WHERE identifier = ?", { identifier }, function(result) - if not result then - playerIdentity[identifier] = nil - alreadyRegistered[identifier] = false - return deferrals.done() - end - if not result.firstname then - playerIdentity[identifier] = nil - alreadyRegistered[identifier] = false - return deferrals.done() - end - - playerIdentity[identifier] = { - firstName = result.firstname, - lastName = result.lastname, - dateOfBirth = result.dateofbirth, - sex = result.sex, - height = result.height, - } - - alreadyRegistered[identifier] = true - - deferrals.done() - end) - end) - - AddEventHandler("onResourceStart", function(resource) - if resource ~= GetCurrentResourceName() then - return - end - Wait(300) - - while not ESX do - Wait(0) - end - - local xPlayers = ESX.ExtendedPlayers() --[=[@as StaticPlayer[]]=] - - for i = 1, #xPlayers do - if xPlayers[i] then - checkIdentity(xPlayers[i]) - end - end - end) - - RegisterNetEvent("esx:playerLoaded", function(_, xPlayer) - local currentIdentity = playerIdentity[xPlayer.identifier] - - if currentIdentity and alreadyRegistered[xPlayer.identifier] then - SetPlayerData(xPlayer, currentIdentity) - - TriggerClientEvent("esx_identity:setPlayerData", xPlayer.source, currentIdentity) - if currentIdentity.saveToDatabase then - saveIdentityToDatabase(xPlayer.identifier, currentIdentity) - end - - Wait(0) - - TriggerClientEvent("esx_identity:alreadyRegistered", xPlayer.source) - - playerIdentity[xPlayer.identifier] = nil - else - TriggerClientEvent("esx_identity:showRegisterIdentity", xPlayer.source) - end - end) -end +Modules.Multichar.RegisterHandlers() ESX.RegisterServerCallback("esx_identity:registerIdentity", function(source, cb, data) - local xPlayer = ESX.Player(source) - - if not checkNameFormat(data.firstname) then - TriggerClientEvent("esx:showNotification", source, TranslateCap("invalid_firstname_format"), "error") - return cb(false) - end - if not checkNameFormat(data.lastname) then - TriggerClientEvent("esx:showNotification", source, TranslateCap("invalid_lastname_format"), "error") - return cb(false) - end - if not checkSexFormat(data.sex) then - TriggerClientEvent("esx:showNotification", source, TranslateCap("invalid_sex_format"), "error") - return cb(false) - end - if not checkDOBFormat(data.dateofbirth) then - TriggerClientEvent("esx:showNotification", source, TranslateCap("invalid_dob_format"), "error") - return cb(false) - end - if not checkHeightFormat(data.height) then - TriggerClientEvent("esx:showNotification", source, TranslateCap("invalid_height_format"), "error") - return cb(false) - end - - if xPlayer then - local identifier = xPlayer.getIdentifier() - if alreadyRegistered[identifier] then - xPlayer.showNotification(TranslateCap("already_registered"), "error") - return cb(false) - end - - playerIdentity[identifier] = { - firstName = formatName(data.firstname), - lastName = formatName(data.lastname), - dateOfBirth = formatDate(data.dateofbirth), - sex = data.sex, - height = data.height, - } - - local currentIdentity = playerIdentity[identifier] - - SetPlayerData(xPlayer, currentIdentity) - - TriggerClientEvent("esx_identity:setPlayerData", xPlayer.src, currentIdentity) - saveIdentityToDatabase(identifier, currentIdentity) - alreadyRegistered[identifier] = true - playerIdentity[identifier] = nil - return cb(true) - end - - if not multichar then - TriggerClientEvent("esx:showNotification", source, TranslateCap("data_incorrect"), "error") - return cb(false) - end - - local formattedFirstName = formatName(data.firstname) - local formattedLastName = formatName(data.lastname) - local formattedDate = formatDate(data.dateofbirth) - - data.firstname = formattedFirstName - data.lastname = formattedLastName - data.dateofbirth = formattedDate - local Identity = { - firstName = formattedFirstName, - lastName = formattedLastName, - dateOfBirth = formattedDate, - sex = data.sex, - height = data.height, - } - - TriggerEvent("esx_identity:completedRegistration", source, data) - TriggerClientEvent("esx_identity:setPlayerData", source, Identity) - cb(true) + Modules.Callback.RegisterIdentity(source, cb, data) end) -if Config.EnableCommands then - ESX.RegisterCommand("char", "user", function(xPlayer) - if xPlayer and xPlayer.getName() then - xPlayer.showNotification(TranslateCap("active_character", xPlayer.getName())) - else - xPlayer.showNotification(TranslateCap("error_active_character")) - end - end, false, { help = TranslateCap("show_active_character") }) - - ESX.RegisterCommand("chardel", "user", function(xPlayer) - if xPlayer and xPlayer.getName() then - local identifier = xPlayer.getIdentifier() - if Config.UseDeferrals then - xPlayer.kick(TranslateCap("deleted_identity")) - Wait(1500) - deleteIdentity(xPlayer) - xPlayer.showNotification(TranslateCap("deleted_character")) - playerIdentity[identifier] = nil - alreadyRegistered[identifier] = false - else - deleteIdentity(xPlayer) - xPlayer.showNotification(TranslateCap("deleted_character")) - playerIdentity[identifier] = nil - alreadyRegistered[identifier] = false - TriggerClientEvent("esx_identity:showRegisterIdentity", xPlayer.source) - end - else - xPlayer.showNotification(TranslateCap("error_delete_character")) - end - end, false, { help = TranslateCap("delete_character") }) -end - -if Config.EnableDebugging then - ESX.RegisterCommand("xPlayerGetFirstName", "user", function(xPlayer) - if xPlayer and xPlayer.get("firstName") then - xPlayer.showNotification(TranslateCap("return_debug_xPlayer_get_first_name", xPlayer.get("firstName"))) - else - xPlayer.showNotification(TranslateCap("error_debug_xPlayer_get_first_name")) - end - end, false, { help = TranslateCap("debug_xPlayer_get_first_name") }) - - ESX.RegisterCommand("xPlayerGetLastName", "user", function(xPlayer) - if xPlayer and xPlayer.get("lastName") then - xPlayer.showNotification(TranslateCap("return_debug_xPlayer_get_last_name", xPlayer.get("lastName"))) - else - xPlayer.showNotification(TranslateCap("error_debug_xPlayer_get_last_name")) - end - end, false, { help = TranslateCap("debug_xPlayer_get_last_name") }) - - ESX.RegisterCommand("xPlayerGetFullName", "user", function(xPlayer) - if xPlayer and xPlayer.getName() then - xPlayer.showNotification(TranslateCap("return_debug_xPlayer_get_full_name", xPlayer.getName())) - else - xPlayer.showNotification(TranslateCap("error_debug_xPlayer_get_full_name")) - end - end, false, { help = TranslateCap("debug_xPlayer_get_full_name") }) - - ESX.RegisterCommand("xPlayerGetSex", "user", function(xPlayer) - if xPlayer and xPlayer.get("sex") then - xPlayer.showNotification(TranslateCap("return_debug_xPlayer_get_sex", xPlayer.get("sex"))) - else - xPlayer.showNotification(TranslateCap("error_debug_xPlayer_get_sex")) - end - end, false, { help = TranslateCap("debug_xPlayer_get_sex") }) - - ESX.RegisterCommand("xPlayerGetDOB", "user", function(xPlayer) - if xPlayer and xPlayer.get("dateofbirth") then - xPlayer.showNotification(TranslateCap("return_debug_xPlayer_get_dob", xPlayer.get("dateofbirth"))) - else - xPlayer.showNotification(TranslateCap("error_debug_xPlayer_get_dob")) - end - end, false, { help = TranslateCap("debug_xPlayer_get_dob") }) - - ESX.RegisterCommand("xPlayerGetHeight", "user", function(xPlayer) - if xPlayer and xPlayer.get("height") then - xPlayer.showNotification(TranslateCap("return_debug_xPlayer_get_height", xPlayer.get("height"))) - else - xPlayer.showNotification(TranslateCap("error_debug_xPlayer_get_height")) - end - end, false, { help = TranslateCap("debug_xPlayer_get_height") }) -end +Modules.Commands.Register() +Modules.Debugging.Register() diff --git a/[core]/esx_identity/server/module/callback.lua b/[core]/esx_identity/server/module/callback.lua new file mode 100644 index 000000000..75e72581f --- /dev/null +++ b/[core]/esx_identity/server/module/callback.lua @@ -0,0 +1,77 @@ +local Callback = {} + +local function validateRegistrationData(source, data) + local validationRules = { + { Modules.Validation.CheckNameFormat(data.firstname), "invalid_firstname_format" }, + { Modules.Validation.CheckNameFormat(data.lastname), "invalid_lastname_format" }, + { Modules.Validation.CheckSexFormat(data.sex), "invalid_sex_format" }, + { Modules.Validation.CheckDOBFormat(data.dateofbirth), "invalid_dob_format" }, + { Modules.Validation.CheckHeightFormat(data.height), "invalid_height_format" }, + } + + for _, rule in ipairs(validationRules) do + if not rule[1] then + Modules.Identity.SendNotification(source, rule[2]) + return false, rule[2] + end + end + + return true +end + +function Callback.RegisterIdentity(source, cb, data) + local xPlayer = ESX.Player(source) + + local isValid, errorKey = validateRegistrationData(source, data) + if not isValid then + return cb(false) + end + + if xPlayer then + local identifier = xPlayer.getIdentifier() + if Modules.Identity.IsRegistered(identifier) then + xPlayer.showNotification(TranslateCap("already_registered"), "error") + return cb(false) + end + + local formattedIdentity = { + firstName = Modules.Util.FormatName(data.firstname), + lastName = Modules.Util.FormatName(data.lastname), + dateOfBirth = Modules.Util.FormatDate(data.dateofbirth), + sex = data.sex, + height = data.height, + } + + Modules.Identity.SetPlayerData(xPlayer, formattedIdentity) + TriggerClientEvent("esx_identity:setPlayerData", xPlayer.src, formattedIdentity) + Modules.Database.SaveIdentity(identifier, formattedIdentity) + Modules.Identity.MarkAsRegistered(identifier) + Modules.Identity.ClearPlayerIdentity(identifier) + return cb(true) + end + + if not Modules.Multichar.IsEnabled() then + Modules.Identity.SendNotification(source, "data_incorrect") + return cb(false) + end + + local formattedIdentity = { + firstName = Modules.Util.FormatName(data.firstname), + lastName = Modules.Util.FormatName(data.lastname), + dateOfBirth = Modules.Util.FormatDate(data.dateofbirth), + sex = data.sex, + height = data.height, + } + + data.firstname = formattedIdentity.firstName + data.lastname = formattedIdentity.lastName + data.dateofbirth = formattedIdentity.dateOfBirth + + TriggerEvent("esx_identity:completedRegistration", source, data) + TriggerClientEvent("esx_identity:setPlayerData", source, formattedIdentity) + cb(true) +end + +Modules.Callback = Callback +return Callback + diff --git a/[core]/esx_identity/server/module/commands.lua b/[core]/esx_identity/server/module/commands.lua new file mode 100644 index 000000000..4f10281f1 --- /dev/null +++ b/[core]/esx_identity/server/module/commands.lua @@ -0,0 +1,43 @@ +local Commands = {} + +function Commands.Register() + if not Config.EnableCommands then + return + end + + ESX.RegisterCommand("char", "user", function(xPlayer) + if xPlayer and xPlayer.getName() then + xPlayer.showNotification(TranslateCap("active_character", xPlayer.getName())) + else + xPlayer.showNotification(TranslateCap("error_active_character")) + end + end, false, { help = TranslateCap("show_active_character") }) + + ESX.RegisterCommand("chardel", "user", function(xPlayer) + if xPlayer and xPlayer.getName() then + local identifier = xPlayer.getIdentifier() + if Config.UseDeferrals then + xPlayer.kick(TranslateCap("deleted_identity")) + Wait(1500) + Modules.Database.DeleteIdentity(xPlayer) + Modules.Identity.SetPlayerData(xPlayer, { firstName = nil, lastName = nil, dateOfBirth = nil, sex = nil, height = nil }) + xPlayer.showNotification(TranslateCap("deleted_character")) + Modules.Identity.ClearPlayerIdentity(identifier) + Modules.Identity.MarkAsNotRegistered(identifier) + else + Modules.Database.DeleteIdentity(xPlayer) + Modules.Identity.SetPlayerData(xPlayer, { firstName = nil, lastName = nil, dateOfBirth = nil, sex = nil, height = nil }) + xPlayer.showNotification(TranslateCap("deleted_character")) + Modules.Identity.ClearPlayerIdentity(identifier) + Modules.Identity.MarkAsNotRegistered(identifier) + TriggerClientEvent("esx_identity:showRegisterIdentity", xPlayer.source) + end + else + xPlayer.showNotification(TranslateCap("error_delete_character")) + end + end, false, { help = TranslateCap("delete_character") }) +end + +Modules.Commands = Commands +return Commands + diff --git a/[core]/esx_identity/server/module/database.lua b/[core]/esx_identity/server/module/database.lua new file mode 100644 index 000000000..3ef1a6edd --- /dev/null +++ b/[core]/esx_identity/server/module/database.lua @@ -0,0 +1,23 @@ +local Database = {} + +function Database.SaveIdentity(identifier, identity) + MySQL.update.await("UPDATE users SET firstname = ?, lastname = ?, dateofbirth = ?, sex = ?, height = ? WHERE identifier = ?", { identity.firstName, identity.lastName, identity.dateOfBirth, identity.sex, identity.height, identifier }) +end + +function Database.DeleteIdentity(xPlayer) + MySQL.query.await("UPDATE users SET firstname = ?, lastname = ?, dateofbirth = ?, sex = ?, height = ?, skin = ? WHERE identifier = ?", { nil, nil, nil, nil, nil, nil, xPlayer.identifier }) + + if Config.FullCharDelete then + MySQL.update.await("UPDATE addon_account_data SET money = 0 WHERE account_name IN (?) AND owner = ?", { { "bank_savings", "caution" }, xPlayer.identifier }) + + MySQL.prepare.await("UPDATE datastore_data SET data = ? WHERE name IN (?) AND owner = ?", { "'{}'", { "user_ears", "user_glasses", "user_helmet", "user_mask" }, xPlayer.identifier }) + end +end + +function Database.GetIdentity(identifier, callback) + MySQL.single("SELECT firstname, lastname, dateofbirth, sex, height FROM users WHERE identifier = ?", { identifier }, callback) +end + +Modules.Database = Database +return Database + diff --git a/[core]/esx_identity/server/module/debugging.lua b/[core]/esx_identity/server/module/debugging.lua new file mode 100644 index 000000000..4a20a550e --- /dev/null +++ b/[core]/esx_identity/server/module/debugging.lua @@ -0,0 +1,59 @@ +local Debugging = {} + +function Debugging.Register() + if not Config.EnableDebugging then + return + end + + ESX.RegisterCommand("xPlayerGetFirstName", "user", function(xPlayer) + if xPlayer and xPlayer.get("firstName") then + xPlayer.showNotification(TranslateCap("return_debug_xPlayer_get_first_name", xPlayer.get("firstName"))) + else + xPlayer.showNotification(TranslateCap("error_debug_xPlayer_get_first_name")) + end + end, false, { help = TranslateCap("debug_xPlayer_get_first_name") }) + + ESX.RegisterCommand("xPlayerGetLastName", "user", function(xPlayer) + if xPlayer and xPlayer.get("lastName") then + xPlayer.showNotification(TranslateCap("return_debug_xPlayer_get_last_name", xPlayer.get("lastName"))) + else + xPlayer.showNotification(TranslateCap("error_debug_xPlayer_get_last_name")) + end + end, false, { help = TranslateCap("debug_xPlayer_get_last_name") }) + + ESX.RegisterCommand("xPlayerGetFullName", "user", function(xPlayer) + if xPlayer and xPlayer.getName() then + xPlayer.showNotification(TranslateCap("return_debug_xPlayer_get_full_name", xPlayer.getName())) + else + xPlayer.showNotification(TranslateCap("error_debug_xPlayer_get_full_name")) + end + end, false, { help = TranslateCap("debug_xPlayer_get_full_name") }) + + ESX.RegisterCommand("xPlayerGetSex", "user", function(xPlayer) + if xPlayer and xPlayer.get("sex") then + xPlayer.showNotification(TranslateCap("return_debug_xPlayer_get_sex", xPlayer.get("sex"))) + else + xPlayer.showNotification(TranslateCap("error_debug_xPlayer_get_sex")) + end + end, false, { help = TranslateCap("debug_xPlayer_get_sex") }) + + ESX.RegisterCommand("xPlayerGetDOB", "user", function(xPlayer) + if xPlayer and xPlayer.get("dateofbirth") then + xPlayer.showNotification(TranslateCap("return_debug_xPlayer_get_dob", xPlayer.get("dateofbirth"))) + else + xPlayer.showNotification(TranslateCap("error_debug_xPlayer_get_dob")) + end + end, false, { help = TranslateCap("debug_xPlayer_get_dob") }) + + ESX.RegisterCommand("xPlayerGetHeight", "user", function(xPlayer) + if xPlayer and xPlayer.get("height") then + xPlayer.showNotification(TranslateCap("return_debug_xPlayer_get_height", xPlayer.get("height"))) + else + xPlayer.showNotification(TranslateCap("error_debug_xPlayer_get_height")) + end + end, false, { help = TranslateCap("debug_xPlayer_get_height") }) +end + +Modules.Debugging = Debugging +return Debugging + diff --git a/[core]/esx_identity/server/module/identity.lua b/[core]/esx_identity/server/module/identity.lua new file mode 100644 index 000000000..8988cfde4 --- /dev/null +++ b/[core]/esx_identity/server/module/identity.lua @@ -0,0 +1,54 @@ +local Identity = {} + +local playerIdentity = {} +local alreadyRegistered = {} + +function Identity.SetPlayerData(xPlayer, data) + local name = ("%s %s"):format(data.firstName, data.lastName) + xPlayer.setName(name) + xPlayer.set("firstName", data.firstName) + xPlayer.set("lastName", data.lastName) + xPlayer.set("dateofbirth", data.dateOfBirth) + xPlayer.set("sex", data.sex) + xPlayer.set("height", data.height) + + local state = Player(xPlayer.getSource()).state + state:set("name", name, true) + state:set("firstName", data.firstName, true) + state:set("lastName", data.lastName, true) + state:set("dateofbirth", data.dateOfBirth, true) + state:set("sex", data.sex, true) + state:set("height", data.height, true) +end + +function Identity.IsRegistered(identifier) + return alreadyRegistered[identifier] == true +end + +function Identity.MarkAsRegistered(identifier) + alreadyRegistered[identifier] = true +end + +function Identity.MarkAsNotRegistered(identifier) + alreadyRegistered[identifier] = false +end + +function Identity.SetPlayerIdentity(identifier, identity) + playerIdentity[identifier] = identity +end + +function Identity.GetPlayerIdentity(identifier) + return playerIdentity[identifier] +end + +function Identity.ClearPlayerIdentity(identifier) + playerIdentity[identifier] = nil +end + +function Identity.SendNotification(source, translationKey, translationParams) + TriggerClientEvent("esx:showNotification", source, TranslateCap(translationKey, translationParams), "error") +end + +Modules.Identity = Identity +return Identity + diff --git a/[core]/esx_identity/server/module/multichar.lua b/[core]/esx_identity/server/module/multichar.lua new file mode 100644 index 000000000..c45eb3e0a --- /dev/null +++ b/[core]/esx_identity/server/module/multichar.lua @@ -0,0 +1,136 @@ +local Multichar = {} + +local multichar = ESX.GetConfig().Multichar + +function Multichar.IsEnabled() + return multichar +end + +local function setIdentity(xPlayer) + local playerIdentifier = xPlayer.getIdentifier() + if not Modules.Identity.IsRegistered(playerIdentifier) then + return + end + local currentIdentity = Modules.Identity.GetPlayerIdentity(playerIdentifier) + Modules.Identity.SetPlayerData(xPlayer, currentIdentity) + + TriggerClientEvent("esx_identity:setPlayerData", xPlayer.src, currentIdentity) + if currentIdentity.saveToDatabase then + Modules.Database.SaveIdentity(playerIdentifier, currentIdentity) + end + + Modules.Identity.ClearPlayerIdentity(playerIdentifier) +end + +local function checkIdentity(xPlayer) + local playerIdentifier = xPlayer.getIdentifier() + Modules.Database.GetIdentity(playerIdentifier, function(result) + if not result then + return TriggerClientEvent("esx_identity:showRegisterIdentity", xPlayer.src) + end + if not result.firstname then + Modules.Identity.ClearPlayerIdentity(playerIdentifier) + Modules.Identity.MarkAsNotRegistered(playerIdentifier) + return TriggerClientEvent("esx_identity:showRegisterIdentity", xPlayer.src) + end + + Modules.Identity.SetPlayerIdentity(playerIdentifier, { + firstName = result.firstname, + lastName = result.lastname, + dateOfBirth = result.dateofbirth, + sex = result.sex, + height = result.height, + }) + + Modules.Identity.MarkAsRegistered(playerIdentifier) + setIdentity(xPlayer) + end) +end + +function Multichar.RegisterHandlers() + if multichar then + return + end + + AddEventHandler("playerConnecting", function(_, _, deferrals) + deferrals.defer() + local _, identifier = source, nil + + local correctLicense, _ = pcall(function() + identifier = ESX.GetIdentifier(source) + end) + + Wait(40) + + if not identifier or not correctLicense then + return deferrals.done(TranslateCap("no_identifier")) + end + + Modules.Database.GetIdentity(identifier, function(result) + if not result then + Modules.Identity.ClearPlayerIdentity(identifier) + Modules.Identity.MarkAsNotRegistered(identifier) + return deferrals.done() + end + if not result.firstname then + Modules.Identity.ClearPlayerIdentity(identifier) + Modules.Identity.MarkAsNotRegistered(identifier) + return deferrals.done() + end + + Modules.Identity.SetPlayerIdentity(identifier, { + firstName = result.firstname, + lastName = result.lastname, + dateOfBirth = result.dateofbirth, + sex = result.sex, + height = result.height, + }) + + Modules.Identity.MarkAsRegistered(identifier) + deferrals.done() + end) + end) + + AddEventHandler("onResourceStart", function(resource) + if resource ~= GetCurrentResourceName() then + return + end + Wait(300) + + while not ESX do + Wait(0) + end + + local xPlayers = ESX.ExtendedPlayers() + + for i = 1, #xPlayers do + if xPlayers[i] then + checkIdentity(xPlayers[i]) + end + end + end) + + RegisterNetEvent("esx:playerLoaded", function(_, xPlayer) + local currentIdentity = Modules.Identity.GetPlayerIdentity(xPlayer.identifier) + + if currentIdentity and Modules.Identity.IsRegistered(xPlayer.identifier) then + Modules.Identity.SetPlayerData(xPlayer, currentIdentity) + + TriggerClientEvent("esx_identity:setPlayerData", xPlayer.source, currentIdentity) + if currentIdentity.saveToDatabase then + Modules.Database.SaveIdentity(xPlayer.identifier, currentIdentity) + end + + Wait(0) + + TriggerClientEvent("esx_identity:alreadyRegistered", xPlayer.source) + + Modules.Identity.ClearPlayerIdentity(xPlayer.identifier) + else + TriggerClientEvent("esx_identity:showRegisterIdentity", xPlayer.source) + end + end) +end + +Modules.Multichar = Multichar +return Multichar diff --git a/[core]/esx_identity/server/module/registry.lua b/[core]/esx_identity/server/module/registry.lua new file mode 100644 index 000000000..e490a30bd --- /dev/null +++ b/[core]/esx_identity/server/module/registry.lua @@ -0,0 +1,2 @@ +Modules = {} + diff --git a/[core]/esx_identity/server/module/util.lua b/[core]/esx_identity/server/module/util.lua new file mode 100644 index 000000000..60acdfa8f --- /dev/null +++ b/[core]/esx_identity/server/module/util.lua @@ -0,0 +1,31 @@ +local Util = {} + +local function convertToLowerCase(str) + return string.lower(str) +end + +local function convertFirstLetterToUpper(str) + return str:gsub("^%l", string.upper) +end + +function Util.FormatName(name) + local loweredName = convertToLowerCase(name) + return convertFirstLetterToUpper(loweredName) +end + +function Util.FormatDate(str) + local d, m, y = string.match(str, "(%d+)/(%d+)/(%d+)") + local date = str + + if Config.DateFormat == "MM/DD/YYYY" then + date = m .. "/" .. d .. "/" .. y + elseif Config.DateFormat == "YYYY/MM/DD" then + date = y .. "/" .. m .. "/" .. d + end + + return date +end + +Modules.Util = Util +return Util + diff --git a/[core]/esx_identity/server/module/validation.lua b/[core]/esx_identity/server/module/validation.lua new file mode 100644 index 000000000..509372b07 --- /dev/null +++ b/[core]/esx_identity/server/module/validation.lua @@ -0,0 +1,54 @@ +local Validation = {} + +function Validation.CheckNameFormat(name) + if ESX.IsValidLocaleString(name) then + local stringLength = string.len(name) + return stringLength > 0 and stringLength < Config.MaxNameLength + end + + return false +end + +function Validation.CheckSexFormat(sex) + if not sex then + return false + end + return sex == "m" or sex == "M" or sex == "f" or sex == "F" +end + +function Validation.CheckHeightFormat(height) + local numHeight = tonumber(height) or 0 + return numHeight >= Config.MinHeight and numHeight <= Config.MaxHeight +end + +local function isLeapYear(year) + return (year % 4 == 0 and year % 100 ~= 0) or (year % 400 == 0) +end + +function Validation.CheckDOBFormat(dob) + dob = tostring(dob) + + local dayStr, monthStr, yearStr = dob:match("^(%d%d?)/(%d%d?)/(%d%d%d%d)$") + if not dayStr or not monthStr or not yearStr then + return false + end + + local day, month, year = tonumber(dayStr), tonumber(monthStr), tonumber(yearStr) + if not day or not month or not year then + return false + end + + local currentYear = os.date("*t").year + local minYear = currentYear - Config.MaxAge + local maxYear = currentYear - 18 + + if year < minYear or year > maxYear then return false end + if month < 1 or month > 12 then return false end + + local daysInMonth = { 31, isLeapYear(year) and 29 or 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 } + return day >= 1 and day <= daysInMonth[month] +end + +Modules.Validation = Validation +return Validation + diff --git a/[core]/esx_identity/web/package-lock.json b/[core]/esx_identity/web/package-lock.json deleted file mode 100644 index 98ec28e7d..000000000 --- a/[core]/esx_identity/web/package-lock.json +++ /dev/null @@ -1,1186 +0,0 @@ -{ - "name": "esx_identity_new", - "version": "0.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "esx_identity_new", - "version": "0.0.0", - "dependencies": { - "moment": "^2.30.1", - "vee-validate": "^4.14.3", - "vue": "^3.5.10", - "yup": "^1.4.0" - }, - "devDependencies": { - "@vitejs/plugin-vue": "^5.1.4", - "vite": "^5.4.8" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz", - "integrity": "sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz", - "integrity": "sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.8.tgz", - "integrity": "sha512-HcttkxzdPucv3nNFmfOOMfFf64KgdJVqm1KaCm25dPGMLElo9nsLvXeJECQg8UzPuBGLyTSA0ZzqCtDSzKTEoQ==", - "dependencies": { - "@babel/types": "^7.25.8" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/types": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.8.tgz", - "integrity": "sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg==", - "dependencies": { - "@babel/helper-string-parser": "^7.25.7", - "@babel/helper-validator-identifier": "^7.25.7", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.0.tgz", - "integrity": "sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.0.tgz", - "integrity": "sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.0.tgz", - "integrity": "sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.0.tgz", - "integrity": "sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.0.tgz", - "integrity": "sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.0.tgz", - "integrity": "sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.0.tgz", - "integrity": "sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.0.tgz", - "integrity": "sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.0.tgz", - "integrity": "sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.0.tgz", - "integrity": "sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.0.tgz", - "integrity": "sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.0.tgz", - "integrity": "sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.0.tgz", - "integrity": "sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.0.tgz", - "integrity": "sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.0.tgz", - "integrity": "sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.0.tgz", - "integrity": "sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", - "dev": true - }, - "node_modules/@vitejs/plugin-vue": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.1.4.tgz", - "integrity": "sha512-N2XSI2n3sQqp5w7Y/AN/L2XDjBIRGqXko+eDp42sydYSBeJuSm5a1sLf8zakmo8u7tA8NmBgoDLA1HeOESjp9A==", - "dev": true, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "vite": "^5.0.0", - "vue": "^3.2.25" - } - }, - "node_modules/@vue/compiler-core": { - "version": "3.5.12", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.12.tgz", - "integrity": "sha512-ISyBTRMmMYagUxhcpyEH0hpXRd/KqDU4ymofPgl2XAkY9ZhQ+h0ovEZJIiPop13UmR/54oA2cgMDjgroRelaEw==", - "dependencies": { - "@babel/parser": "^7.25.3", - "@vue/shared": "3.5.12", - "entities": "^4.5.0", - "estree-walker": "^2.0.2", - "source-map-js": "^1.2.0" - } - }, - "node_modules/@vue/compiler-dom": { - "version": "3.5.12", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.12.tgz", - "integrity": "sha512-9G6PbJ03uwxLHKQ3P42cMTi85lDRvGLB2rSGOiQqtXELat6uI4n8cNz9yjfVHRPIu+MsK6TE418Giruvgptckg==", - "dependencies": { - "@vue/compiler-core": "3.5.12", - "@vue/shared": "3.5.12" - } - }, - "node_modules/@vue/compiler-sfc": { - "version": "3.5.12", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.12.tgz", - "integrity": "sha512-2k973OGo2JuAa5+ZlekuQJtitI5CgLMOwgl94BzMCsKZCX/xiqzJYzapl4opFogKHqwJk34vfsaKpfEhd1k5nw==", - "dependencies": { - "@babel/parser": "^7.25.3", - "@vue/compiler-core": "3.5.12", - "@vue/compiler-dom": "3.5.12", - "@vue/compiler-ssr": "3.5.12", - "@vue/shared": "3.5.12", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.11", - "postcss": "^8.4.47", - "source-map-js": "^1.2.0" - } - }, - "node_modules/@vue/compiler-ssr": { - "version": "3.5.12", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.12.tgz", - "integrity": "sha512-eLwc7v6bfGBSM7wZOGPmRavSWzNFF6+PdRhE+VFJhNCgHiF8AM7ccoqcv5kBXA2eWUfigD7byekvf/JsOfKvPA==", - "dependencies": { - "@vue/compiler-dom": "3.5.12", - "@vue/shared": "3.5.12" - } - }, - "node_modules/@vue/devtools-api": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.5.2.tgz", - "integrity": "sha512-VxPbAQxJrYSIkoGVvQ2oOoKW8u4CMpvRLySTxhoJA38z8bQEGy9GO33eoRY/DulJbSFRfjZFNvH+dh8B4qpesQ==", - "dependencies": { - "@vue/devtools-kit": "^7.5.2" - } - }, - "node_modules/@vue/devtools-kit": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.5.2.tgz", - "integrity": "sha512-0leUOE2HBfl8sHf9ePKzxqnCFskkU22tWWqd9OfeSlslAKE30/TViYvWcF4vgQmPlJnAAdHU0WfW5dYlCeOiuw==", - "dependencies": { - "@vue/devtools-shared": "^7.5.2", - "birpc": "^0.2.19", - "hookable": "^5.5.3", - "mitt": "^3.0.1", - "perfect-debounce": "^1.0.0", - "speakingurl": "^14.0.1", - "superjson": "^2.2.1" - } - }, - "node_modules/@vue/devtools-shared": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.5.2.tgz", - "integrity": "sha512-+zmcixnD6TAo+zwm30YuwZckhL9iIi4u+gFwbq9C8zpm3SMndTlEYZtNhAHUhOXB+bCkzyunxw80KQ/T0trF4w==", - "dependencies": { - "rfdc": "^1.4.1" - } - }, - "node_modules/@vue/reactivity": { - "version": "3.5.12", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.12.tgz", - "integrity": "sha512-UzaN3Da7xnJXdz4Okb/BGbAaomRHc3RdoWqTzlvd9+WBR5m3J39J1fGcHes7U3za0ruYn/iYy/a1euhMEHvTAg==", - "dependencies": { - "@vue/shared": "3.5.12" - } - }, - "node_modules/@vue/runtime-core": { - "version": "3.5.12", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.12.tgz", - "integrity": "sha512-hrMUYV6tpocr3TL3Ad8DqxOdpDe4zuQY4HPY3X/VRh+L2myQO8MFXPAMarIOSGNu0bFAjh1yBkMPXZBqCk62Uw==", - "dependencies": { - "@vue/reactivity": "3.5.12", - "@vue/shared": "3.5.12" - } - }, - "node_modules/@vue/runtime-dom": { - "version": "3.5.12", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.12.tgz", - "integrity": "sha512-q8VFxR9A2MRfBr6/55Q3umyoN7ya836FzRXajPB6/Vvuv0zOPL+qltd9rIMzG/DbRLAIlREmnLsplEF/kotXKA==", - "dependencies": { - "@vue/reactivity": "3.5.12", - "@vue/runtime-core": "3.5.12", - "@vue/shared": "3.5.12", - "csstype": "^3.1.3" - } - }, - "node_modules/@vue/server-renderer": { - "version": "3.5.12", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.12.tgz", - "integrity": "sha512-I3QoeDDeEPZm8yR28JtY+rk880Oqmj43hreIBVTicisFTx/Dl7JpG72g/X7YF8hnQD3IFhkky5i2bPonwrTVPg==", - "dependencies": { - "@vue/compiler-ssr": "3.5.12", - "@vue/shared": "3.5.12" - }, - "peerDependencies": { - "vue": "3.5.12" - } - }, - "node_modules/@vue/shared": { - "version": "3.5.12", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.12.tgz", - "integrity": "sha512-L2RPSAwUFbgZH20etwrXyVyCBu9OxRSi8T/38QsvnkJyvq2LufW2lDCOzm7t/U9C1mkhJGWYfCuFBCmIuNivrg==" - }, - "node_modules/birpc": { - "version": "0.2.19", - "resolved": "https://registry.npmjs.org/birpc/-/birpc-0.2.19.tgz", - "integrity": "sha512-5WeXXAvTmitV1RqJFppT5QtUiz2p1mRSYU000Jkft5ZUCLJIk4uQriYNO50HknxKwM6jd8utNc66K1qGIwwWBQ==", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/copy-anything": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz", - "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==", - "dependencies": { - "is-what": "^4.1.8" - }, - "engines": { - "node": ">=12.13" - }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" - } - }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, - "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/hookable": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", - "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==" - }, - "node_modules/is-what": { - "version": "4.1.16", - "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz", - "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", - "engines": { - "node": ">=12.13" - }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" - } - }, - "node_modules/magic-string": { - "version": "0.30.12", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz", - "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" - } - }, - "node_modules/mitt": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", - "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==" - }, - "node_modules/moment": { - "version": "2.30.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", - "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", - "engines": { - "node": "*" - } - }, - "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/perfect-debounce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", - "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" - }, - "node_modules/postcss": { - "version": "8.4.47", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", - "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.1.0", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/property-expr": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.6.tgz", - "integrity": "sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==" - }, - "node_modules/rfdc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==" - }, - "node_modules/rollup": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.0.tgz", - "integrity": "sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==", - "dev": true, - "dependencies": { - "@types/estree": "1.0.6" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.24.0", - "@rollup/rollup-android-arm64": "4.24.0", - "@rollup/rollup-darwin-arm64": "4.24.0", - "@rollup/rollup-darwin-x64": "4.24.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.24.0", - "@rollup/rollup-linux-arm-musleabihf": "4.24.0", - "@rollup/rollup-linux-arm64-gnu": "4.24.0", - "@rollup/rollup-linux-arm64-musl": "4.24.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.24.0", - "@rollup/rollup-linux-riscv64-gnu": "4.24.0", - "@rollup/rollup-linux-s390x-gnu": "4.24.0", - "@rollup/rollup-linux-x64-gnu": "4.24.0", - "@rollup/rollup-linux-x64-musl": "4.24.0", - "@rollup/rollup-win32-arm64-msvc": "4.24.0", - "@rollup/rollup-win32-ia32-msvc": "4.24.0", - "@rollup/rollup-win32-x64-msvc": "4.24.0", - "fsevents": "~2.3.2" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/speakingurl": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", - "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/superjson": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.1.tgz", - "integrity": "sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA==", - "dependencies": { - "copy-anything": "^3.0.2" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/tiny-case": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-case/-/tiny-case-1.0.3.tgz", - "integrity": "sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==" - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "engines": { - "node": ">=4" - } - }, - "node_modules/toposort": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz", - "integrity": "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==" - }, - "node_modules/type-fest": { - "version": "4.26.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.26.1.tgz", - "integrity": "sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg==", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vee-validate": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/vee-validate/-/vee-validate-4.14.3.tgz", - "integrity": "sha512-o4yABwgmCxyNz63hAFiDuLtK4qSrJ3+Ri5kbbJ9RQecXpaMp6NzJUEGE3LOcScakkSmtLDzvliQ2yBdFyPWDIw==", - "dependencies": { - "@vue/devtools-api": "^7.5.2", - "type-fest": "^4.8.3" - }, - "peerDependencies": { - "vue": "^3.4.26" - } - }, - "node_modules/vite": { - "version": "5.4.9", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.9.tgz", - "integrity": "sha512-20OVpJHh0PAM0oSOELa5GaZNWeDjcAvQjGXy2Uyr+Tp+/D2/Hdz6NLgpJLsarPTA2QJ6v8mX2P1ZfbsSKvdMkg==", - "dev": true, - "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vue": { - "version": "3.5.12", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.12.tgz", - "integrity": "sha512-CLVZtXtn2ItBIi/zHZ0Sg1Xkb7+PU32bJJ8Bmy7ts3jxXTcbfsEfBivFYYWz1Hur+lalqGAh65Coin0r+HRUfg==", - "dependencies": { - "@vue/compiler-dom": "3.5.12", - "@vue/compiler-sfc": "3.5.12", - "@vue/runtime-dom": "3.5.12", - "@vue/server-renderer": "3.5.12", - "@vue/shared": "3.5.12" - }, - "peerDependencies": { - "typescript": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/yup": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/yup/-/yup-1.4.0.tgz", - "integrity": "sha512-wPbgkJRCqIf+OHyiTBQoJiP5PFuAXaWiJK6AmYkzQAh5/c2K9hzSApBZG5wV9KoKSePF7sAxmNSvh/13YHkFDg==", - "dependencies": { - "property-expr": "^2.0.5", - "tiny-case": "^1.0.3", - "toposort": "^2.0.2", - "type-fest": "^2.19.0" - } - }, - "node_modules/yup/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/[core]/esx_identity/web/package.json b/[core]/esx_identity/web/package.json deleted file mode 100644 index c40a19182..000000000 --- a/[core]/esx_identity/web/package.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "esx_identity_new", - "private": true, - "version": "0.0.0", - "type": "module", - "scripts": { - "dev": "vite", - "build": "vite build", - "preview": "vite preview" - }, - "dependencies": { - "moment": "^2.30.1", - "vee-validate": "^4.14.3", - "vue": "^3.5.10", - "yup": "^1.4.0" - }, - "devDependencies": { - "@vitejs/plugin-vue": "^5.1.4", - "vite": "^5.4.8" - } -}