├── typescript ├── .gitignore ├── fxmanifest.lua ├── client │ ├── tsconfig.json │ └── index.ts ├── server │ ├── tsconfig.json │ └── index.ts ├── tsconfig.json ├── package.json ├── build.js └── pnpm-lock.yaml └── lua ├── fxmanifest.lua ├── client.lua └── server.lua /typescript/.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules 2 | /dist 3 | .yarn.installed -------------------------------------------------------------------------------- /typescript/fxmanifest.lua: -------------------------------------------------------------------------------- 1 | fx_version 'cerulean' 2 | game 'gta5' 3 | 4 | client_script 'dist/client.js' 5 | server_script 'dist/server.js' 6 | -------------------------------------------------------------------------------- /typescript/client/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "compilerOptions": { 4 | "baseUrl": ".", 5 | "types": ["@citizenfx/client"] 6 | }, 7 | "include": ["./"] 8 | } 9 | -------------------------------------------------------------------------------- /typescript/server/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "compilerOptions": { 4 | "baseUrl": ".", 5 | "types": ["@types/node", "@citizenfx/server"] 6 | }, 7 | "include": ["./"] 8 | } 9 | -------------------------------------------------------------------------------- /lua/fxmanifest.lua: -------------------------------------------------------------------------------- 1 | fx_version 'cerulean' 2 | game 'gta5' 3 | lua54 'yes' 4 | use_experimental_fxv2_oal 'yes' 5 | 6 | shared_script '@ox_lib/init.lua' 7 | 8 | server_scripts { 9 | '@oxmysql/lib/MySQL.lua', 10 | '@ox_core/imports/server.lua', 11 | 'server.lua', 12 | } 13 | 14 | client_scripts { 15 | '@ox_core/imports/client.lua', 16 | 'client.lua', 17 | } 18 | -------------------------------------------------------------------------------- /typescript/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": ".", 4 | "noImplicitAny": true, 5 | "module": "es2020", 6 | "target": "es2021", 7 | "lib": ["es2021"], 8 | "resolveJsonModule": true, 9 | "esModuleInterop": true, 10 | "noEmit": true, 11 | "allowUnreachableCode": false, 12 | "strictFunctionTypes": true, 13 | "moduleResolution": "bundler", 14 | "noImplicitThis": true, 15 | "noUnusedLocals": true 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /typescript/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "module", 3 | "scripts": { 4 | "build": "node build.js --mode=production", 5 | "watch": "node build.js" 6 | }, 7 | "devDependencies": { 8 | "@citizenfx/client": "latest", 9 | "@citizenfx/server": "latest", 10 | "@types/node": "^16.18.83", 11 | "esbuild": "^0.20.1" 12 | }, 13 | "dependencies": { 14 | "@overextended/ox_core": "latest", 15 | "@overextended/ox_lib": "latest", 16 | "@overextended/oxmysql": "latest" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /lua/client.lua: -------------------------------------------------------------------------------- 1 | ---@param value number 2 | lib.onCache('vehicle', function(value) 3 | lib.notify({ 4 | title = 'Updated vehicle cache', 5 | description = ('%s updated to %s'):format(cache.vehicle, value), 6 | type = 'info', 7 | icon = 'car', 8 | }) 9 | end) 10 | 11 | RegisterCommand('saveveh', function() 12 | if not cache.vehicle then return end 13 | 14 | local data = lib.getVehicleProperties(cache.vehicle) 15 | TriggerServerEvent('saveProperties', VehToNet(cache.vehicle), data) 16 | end) 17 | 18 | local function init() 19 | local player = Ox.GetPlayer() 20 | 21 | if not player.charId then return end 22 | 23 | print(player) 24 | print(player.getCoords()) 25 | print(player.getGroup("police")) 26 | 27 | while player.charId do 28 | print(player.stateId) 29 | Wait(1000) 30 | end 31 | 32 | print('logged out!') 33 | end 34 | 35 | CreateThread(init) 36 | 37 | RegisterNetEvent('ox:playerLoaded', init) 38 | 39 | RegisterNetEvent('ox:playerLogout', function() 40 | print('logged out') 41 | end) 42 | -------------------------------------------------------------------------------- /typescript/client/index.ts: -------------------------------------------------------------------------------- 1 | import { GetPlayer } from "@overextended/ox_core/client"; 2 | import { notify, cache, onCache } from "@overextended/ox_lib/client"; 3 | 4 | onCache("vehicle", (value: number) => { 5 | notify({ 6 | title: "Updated vehicle cache", 7 | description: `${cache.vehicle} updated to ${value}`, 8 | type: "inform", 9 | icon: "car", 10 | }); 11 | }); 12 | 13 | RegisterCommand( 14 | "saveveh", 15 | () => { 16 | if (!cache.vehicle) return; 17 | 18 | const data = exports.ox_lib.getVehicleProperties(cache.vehicle); 19 | TriggerServerEvent("saveProperties", VehToNet(cache.vehicle), data); 20 | }, 21 | false 22 | ); 23 | 24 | async function init() { 25 | const player = GetPlayer(); 26 | 27 | if (!player.charId) return; 28 | 29 | console.log(player); 30 | console.log(player.getCoords()); 31 | console.log(player.getGroup("police")); 32 | 33 | while (player.charId) { 34 | console.log(player.stateId); 35 | await new Promise((resolve) => setTimeout(resolve, 1000, null)); 36 | } 37 | 38 | console.log("logged out!"); 39 | } 40 | 41 | setImmediate(init); 42 | 43 | onNet("ox:playerLoaded", init); 44 | 45 | onNet("ox:playerLogout", () => console.log("logged out")); 46 | -------------------------------------------------------------------------------- /typescript/build.js: -------------------------------------------------------------------------------- 1 | import esbuild from "esbuild"; 2 | import { writeFileSync } from "fs"; 3 | 4 | /** @type {import('esbuild').BuildOptions} */ 5 | const server = { 6 | platform: "node", 7 | target: ["node16"], 8 | format: "cjs", 9 | }; 10 | 11 | /** @type {import('esbuild').BuildOptions} */ 12 | const client = { 13 | platform: "browser", 14 | target: ["es2021"], 15 | format: "iife", 16 | }; 17 | 18 | const production = process.argv.includes("--mode=production"); 19 | const buildCmd = production ? esbuild.build : esbuild.context; 20 | 21 | writeFileSync( 22 | ".yarn.installed", 23 | new Date().toLocaleString("en-AU", { 24 | timeZone: "UTC", 25 | timeStyle: "long", 26 | dateStyle: "full", 27 | }) 28 | ); 29 | 30 | for (const context of ["client", "server"]) { 31 | buildCmd({ 32 | bundle: true, 33 | entryPoints: [`${context}/index.ts`], 34 | outfile: `dist/${context}.js`, 35 | keepNames: true, 36 | dropLabels: production ? ["DEV"] : undefined, 37 | legalComments: "inline", 38 | plugins: production 39 | ? undefined 40 | : [ 41 | { 42 | name: "rebuild", 43 | setup(build) { 44 | const cb = (result) => { 45 | if (!result || result.errors.length === 0) 46 | console.log(`Successfully built ${context}`); 47 | }; 48 | build.onEnd(cb); 49 | }, 50 | }, 51 | ], 52 | ...(context === "client" ? client : server), 53 | }) 54 | .then((build) => { 55 | if (production) return console.log(`Successfully built ${context}`); 56 | 57 | build.watch(); 58 | }) 59 | .catch(() => process.exit(1)); 60 | } 61 | -------------------------------------------------------------------------------- /lua/server.lua: -------------------------------------------------------------------------------- 1 | CreateThread(function() 2 | -- Get a map containing all players as instances of OxPlayer. 3 | local players = Ox.GetPlayers() 4 | 5 | -- Get the next entry. 6 | local player = players[next(players)] 7 | 8 | if player then 9 | -- Print the table, containing basic data about their player and active character. 10 | print(player) 11 | 12 | -- Set 'police' to a random grade. 13 | player.setGroup('police', math.random(0, 3)) 14 | 15 | -- Get the new grade and print it. 16 | local group = player.getGroup('police') 17 | print(player.source, 'police grade:', group) 18 | 19 | -- Retrieve the player's gender. These values are stored separately from the standard 'player' object. 20 | local gender = player.get("gender") 21 | print(gender) 22 | end 23 | end) 24 | 25 | CreateThread(function() 26 | -- Get an object containing all players in the police or sheriff groups, with grade 3 or higher. 27 | local players = Ox.GetPlayers({ 28 | groups = { sheriff = 3, police = 3 } 29 | }) 30 | 31 | print('cops', json.encode(players, { indent = true })) 32 | end) 33 | 34 | RegisterCommand('getveh', function(source) 35 | local player = Ox.GetPlayer(source) 36 | if not player then return end 37 | 38 | -- Fetch a vehicle owned by the player from the database. 39 | local vehicleId = MySQL.scalar.await("SELECT id FROM vehicles WHERE owner = ? AND stored IS NOT NULL LIMIT 1", 40 | { player.charId }) 41 | 42 | print('veh', vehicleId, player) 43 | 44 | if vehicleId then 45 | local coords = player.getCoords() 46 | 47 | -- Spawn it 48 | local vehicle = Ox.SpawnVehicle( 49 | vehicleId, 50 | { coords.x, coords.y + 3.0, coords.z + 1.0 }, 51 | GetEntityHeading(player.ped) 52 | ) 53 | 54 | if vehicle then 55 | -- Print the vehicle object. 56 | print(vehicle) 57 | print(vehicle.getCoords()) 58 | 59 | Wait(200) 60 | 61 | SetPedIntoVehicle(player.ped, vehicle.entity, -1) 62 | end 63 | end 64 | end) 65 | 66 | RegisterNetEvent('saveProperties', function(netid, data) 67 | local vehicle = Ox.GetVehicleFromNetId(netid) 68 | if not vehicle then return end 69 | 70 | vehicle.set('properties', data) 71 | vehicle.setStored('impound', true) 72 | end) 73 | 74 | 75 | SetInterval(function() 76 | local player = Ox.GetPlayers()[1] 77 | 78 | if player then 79 | -- Set a random number for the "test" metadata property, and replicate to client. 80 | player.set('test', math.random(1, 100), true) 81 | end 82 | end, 1000) 83 | -------------------------------------------------------------------------------- /typescript/server/index.ts: -------------------------------------------------------------------------------- 1 | import { oxmysql as MySQL } from "@overextended/oxmysql"; 2 | import { 3 | GetPlayer, 4 | GetPlayers, 5 | GetVehicleFromNetId, 6 | SpawnVehicle, 7 | } from "@overextended/ox_core/server"; 8 | import { sleep } from "@overextended/ox_lib"; 9 | 10 | function getRandomInt(min: number, max: number) { 11 | return Math.floor(Math.random() * (max - min + 1)) + min; 12 | } 13 | 14 | (async () => { 15 | // Get an array containing all players as instances of OxPlayer. 16 | const players = Object.values(GetPlayers()); 17 | 18 | // Get the first entry. 19 | const player = players[0]; 20 | 21 | if (player) { 22 | // Print the object, containing basic data about their player and active character. 23 | console.log(player); 24 | 25 | // Set 'police' to a random grade. 26 | player.setGroup("police", getRandomInt(0, 5)); 27 | 28 | // Get the new grade and print it. 29 | const group = player.getGroup("police"); 30 | console.log(player.source, "police grade:", group); 31 | 32 | // Retrieve the player's gender. These values are stored separately from the standard 'player' object. 33 | const gender = player.get("gender"); 34 | console.log(gender); 35 | } 36 | })(); 37 | 38 | (async () => { 39 | // Get an object containing all players in the police or sheriff groups, with grade 3 or higher. 40 | const players = GetPlayers({ 41 | groups: { sheriff: 3, police: 3 }, 42 | }); 43 | 44 | console.log('cops', players); 45 | })(); 46 | 47 | RegisterCommand( 48 | "getveh", 49 | async (source: number) => { 50 | const player = source > 0 && GetPlayer(source); 51 | if (!player) return; 52 | 53 | // Fetch a vehicle owned by the player from the database. 54 | const vehicleId = ( 55 | await MySQL.scalar( 56 | "SELECT id FROM vehicles WHERE owner = ? AND stored IS NOT NULL LIMIT 1", 57 | [player.charId] 58 | ) 59 | ); 60 | 61 | if (vehicleId) { 62 | const coords = player.getCoords(); 63 | 64 | // Spawn it 65 | const vehicle = await SpawnVehicle( 66 | vehicleId, 67 | [coords[0], coords[1] + 3.0, coords[2] + 1.0], 68 | GetEntityHeading(player.ped) 69 | ); 70 | 71 | if (vehicle) { 72 | // Print the vehicle object. 73 | console.log(vehicle); 74 | console.log(vehicle.getCoords()); 75 | 76 | await sleep(200); 77 | 78 | SetPedIntoVehicle(player.ped, vehicle.entity, -1); 79 | } 80 | } 81 | }, 82 | false 83 | ); 84 | 85 | onNet( 86 | "saveProperties", 87 | function (netId: number, data: Record) { 88 | console.log(netId); 89 | const vehicle = GetVehicleFromNetId(netId); 90 | if (!vehicle) return; 91 | 92 | vehicle.set("properties", data); 93 | vehicle.setStored("impound", true); 94 | } 95 | ); 96 | -------------------------------------------------------------------------------- /typescript/pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | dependencies: 8 | '@overextended/ox_core': 9 | specifier: latest 10 | version: 0.21.1 11 | '@overextended/ox_lib': 12 | specifier: latest 13 | version: 3.16.3 14 | '@overextended/oxmysql': 15 | specifier: latest 16 | version: 1.3.0 17 | 18 | devDependencies: 19 | '@citizenfx/client': 20 | specifier: latest 21 | version: 2.0.7521-1 22 | '@citizenfx/server': 23 | specifier: latest 24 | version: 2.0.7521-1 25 | '@types/node': 26 | specifier: ^16.18.83 27 | version: 16.18.83 28 | esbuild: 29 | specifier: ^0.20.1 30 | version: 0.20.1 31 | 32 | packages: 33 | 34 | /@citizenfx/client@2.0.7521-1: 35 | resolution: {integrity: sha512-53kbTvEOkOWrHHMTG75l6BtW2dDEVmYMU7otPuRvtFpVAXzRuBsdu0aYTYpTHwvh6LIjuwi+tWYw6y8pE/enGQ==} 36 | dev: true 37 | 38 | /@citizenfx/server@2.0.7521-1: 39 | resolution: {integrity: sha512-NlWqtFMa3gGjHungk2waF7shM+xfAnE50NeAw8Vg1+yqHTnAxZr7zn/hhYLKX/Bk9q+Olk45ZSjdpzUJmMVT7Q==} 40 | dev: true 41 | 42 | /@esbuild/aix-ppc64@0.20.1: 43 | resolution: {integrity: sha512-m55cpeupQ2DbuRGQMMZDzbv9J9PgVelPjlcmM5kxHnrBdBx6REaEd7LamYV7Dm8N7rCyR/XwU6rVP8ploKtIkA==} 44 | engines: {node: '>=12'} 45 | cpu: [ppc64] 46 | os: [aix] 47 | requiresBuild: true 48 | dev: true 49 | optional: true 50 | 51 | /@esbuild/android-arm64@0.20.1: 52 | resolution: {integrity: sha512-hCnXNF0HM6AjowP+Zou0ZJMWWa1VkD77BXe959zERgGJBBxB+sV+J9f/rcjeg2c5bsukD/n17RKWXGFCO5dD5A==} 53 | engines: {node: '>=12'} 54 | cpu: [arm64] 55 | os: [android] 56 | requiresBuild: true 57 | dev: true 58 | optional: true 59 | 60 | /@esbuild/android-arm@0.20.1: 61 | resolution: {integrity: sha512-4j0+G27/2ZXGWR5okcJi7pQYhmkVgb4D7UKwxcqrjhvp5TKWx3cUjgB1CGj1mfdmJBQ9VnUGgUhign+FPF2Zgw==} 62 | engines: {node: '>=12'} 63 | cpu: [arm] 64 | os: [android] 65 | requiresBuild: true 66 | dev: true 67 | optional: true 68 | 69 | /@esbuild/android-x64@0.20.1: 70 | resolution: {integrity: sha512-MSfZMBoAsnhpS+2yMFYIQUPs8Z19ajwfuaSZx+tSl09xrHZCjbeXXMsUF/0oq7ojxYEpsSo4c0SfjxOYXRbpaA==} 71 | engines: {node: '>=12'} 72 | cpu: [x64] 73 | os: [android] 74 | requiresBuild: true 75 | dev: true 76 | optional: true 77 | 78 | /@esbuild/darwin-arm64@0.20.1: 79 | resolution: {integrity: sha512-Ylk6rzgMD8klUklGPzS414UQLa5NPXZD5tf8JmQU8GQrj6BrFA/Ic9tb2zRe1kOZyCbGl+e8VMbDRazCEBqPvA==} 80 | engines: {node: '>=12'} 81 | cpu: [arm64] 82 | os: [darwin] 83 | requiresBuild: true 84 | dev: true 85 | optional: true 86 | 87 | /@esbuild/darwin-x64@0.20.1: 88 | resolution: {integrity: sha512-pFIfj7U2w5sMp52wTY1XVOdoxw+GDwy9FsK3OFz4BpMAjvZVs0dT1VXs8aQm22nhwoIWUmIRaE+4xow8xfIDZA==} 89 | engines: {node: '>=12'} 90 | cpu: [x64] 91 | os: [darwin] 92 | requiresBuild: true 93 | dev: true 94 | optional: true 95 | 96 | /@esbuild/freebsd-arm64@0.20.1: 97 | resolution: {integrity: sha512-UyW1WZvHDuM4xDz0jWun4qtQFauNdXjXOtIy7SYdf7pbxSWWVlqhnR/T2TpX6LX5NI62spt0a3ldIIEkPM6RHw==} 98 | engines: {node: '>=12'} 99 | cpu: [arm64] 100 | os: [freebsd] 101 | requiresBuild: true 102 | dev: true 103 | optional: true 104 | 105 | /@esbuild/freebsd-x64@0.20.1: 106 | resolution: {integrity: sha512-itPwCw5C+Jh/c624vcDd9kRCCZVpzpQn8dtwoYIt2TJF3S9xJLiRohnnNrKwREvcZYx0n8sCSbvGH349XkcQeg==} 107 | engines: {node: '>=12'} 108 | cpu: [x64] 109 | os: [freebsd] 110 | requiresBuild: true 111 | dev: true 112 | optional: true 113 | 114 | /@esbuild/linux-arm64@0.20.1: 115 | resolution: {integrity: sha512-cX8WdlF6Cnvw/DO9/X7XLH2J6CkBnz7Twjpk56cshk9sjYVcuh4sXQBy5bmTwzBjNVZze2yaV1vtcJS04LbN8w==} 116 | engines: {node: '>=12'} 117 | cpu: [arm64] 118 | os: [linux] 119 | requiresBuild: true 120 | dev: true 121 | optional: true 122 | 123 | /@esbuild/linux-arm@0.20.1: 124 | resolution: {integrity: sha512-LojC28v3+IhIbfQ+Vu4Ut5n3wKcgTu6POKIHN9Wpt0HnfgUGlBuyDDQR4jWZUZFyYLiz4RBBBmfU6sNfn6RhLw==} 125 | engines: {node: '>=12'} 126 | cpu: [arm] 127 | os: [linux] 128 | requiresBuild: true 129 | dev: true 130 | optional: true 131 | 132 | /@esbuild/linux-ia32@0.20.1: 133 | resolution: {integrity: sha512-4H/sQCy1mnnGkUt/xszaLlYJVTz3W9ep52xEefGtd6yXDQbz/5fZE5dFLUgsPdbUOQANcVUa5iO6g3nyy5BJiw==} 134 | engines: {node: '>=12'} 135 | cpu: [ia32] 136 | os: [linux] 137 | requiresBuild: true 138 | dev: true 139 | optional: true 140 | 141 | /@esbuild/linux-loong64@0.20.1: 142 | resolution: {integrity: sha512-c0jgtB+sRHCciVXlyjDcWb2FUuzlGVRwGXgI+3WqKOIuoo8AmZAddzeOHeYLtD+dmtHw3B4Xo9wAUdjlfW5yYA==} 143 | engines: {node: '>=12'} 144 | cpu: [loong64] 145 | os: [linux] 146 | requiresBuild: true 147 | dev: true 148 | optional: true 149 | 150 | /@esbuild/linux-mips64el@0.20.1: 151 | resolution: {integrity: sha512-TgFyCfIxSujyuqdZKDZ3yTwWiGv+KnlOeXXitCQ+trDODJ+ZtGOzLkSWngynP0HZnTsDyBbPy7GWVXWaEl6lhA==} 152 | engines: {node: '>=12'} 153 | cpu: [mips64el] 154 | os: [linux] 155 | requiresBuild: true 156 | dev: true 157 | optional: true 158 | 159 | /@esbuild/linux-ppc64@0.20.1: 160 | resolution: {integrity: sha512-b+yuD1IUeL+Y93PmFZDZFIElwbmFfIKLKlYI8M6tRyzE6u7oEP7onGk0vZRh8wfVGC2dZoy0EqX1V8qok4qHaw==} 161 | engines: {node: '>=12'} 162 | cpu: [ppc64] 163 | os: [linux] 164 | requiresBuild: true 165 | dev: true 166 | optional: true 167 | 168 | /@esbuild/linux-riscv64@0.20.1: 169 | resolution: {integrity: sha512-wpDlpE0oRKZwX+GfomcALcouqjjV8MIX8DyTrxfyCfXxoKQSDm45CZr9fanJ4F6ckD4yDEPT98SrjvLwIqUCgg==} 170 | engines: {node: '>=12'} 171 | cpu: [riscv64] 172 | os: [linux] 173 | requiresBuild: true 174 | dev: true 175 | optional: true 176 | 177 | /@esbuild/linux-s390x@0.20.1: 178 | resolution: {integrity: sha512-5BepC2Au80EohQ2dBpyTquqGCES7++p7G+7lXe1bAIvMdXm4YYcEfZtQrP4gaoZ96Wv1Ute61CEHFU7h4FMueQ==} 179 | engines: {node: '>=12'} 180 | cpu: [s390x] 181 | os: [linux] 182 | requiresBuild: true 183 | dev: true 184 | optional: true 185 | 186 | /@esbuild/linux-x64@0.20.1: 187 | resolution: {integrity: sha512-5gRPk7pKuaIB+tmH+yKd2aQTRpqlf1E4f/mC+tawIm/CGJemZcHZpp2ic8oD83nKgUPMEd0fNanrnFljiruuyA==} 188 | engines: {node: '>=12'} 189 | cpu: [x64] 190 | os: [linux] 191 | requiresBuild: true 192 | dev: true 193 | optional: true 194 | 195 | /@esbuild/netbsd-x64@0.20.1: 196 | resolution: {integrity: sha512-4fL68JdrLV2nVW2AaWZBv3XEm3Ae3NZn/7qy2KGAt3dexAgSVT+Hc97JKSZnqezgMlv9x6KV0ZkZY7UO5cNLCg==} 197 | engines: {node: '>=12'} 198 | cpu: [x64] 199 | os: [netbsd] 200 | requiresBuild: true 201 | dev: true 202 | optional: true 203 | 204 | /@esbuild/openbsd-x64@0.20.1: 205 | resolution: {integrity: sha512-GhRuXlvRE+twf2ES+8REbeCb/zeikNqwD3+6S5y5/x+DYbAQUNl0HNBs4RQJqrechS4v4MruEr8ZtAin/hK5iw==} 206 | engines: {node: '>=12'} 207 | cpu: [x64] 208 | os: [openbsd] 209 | requiresBuild: true 210 | dev: true 211 | optional: true 212 | 213 | /@esbuild/sunos-x64@0.20.1: 214 | resolution: {integrity: sha512-ZnWEyCM0G1Ex6JtsygvC3KUUrlDXqOihw8RicRuQAzw+c4f1D66YlPNNV3rkjVW90zXVsHwZYWbJh3v+oQFM9Q==} 215 | engines: {node: '>=12'} 216 | cpu: [x64] 217 | os: [sunos] 218 | requiresBuild: true 219 | dev: true 220 | optional: true 221 | 222 | /@esbuild/win32-arm64@0.20.1: 223 | resolution: {integrity: sha512-QZ6gXue0vVQY2Oon9WyLFCdSuYbXSoxaZrPuJ4c20j6ICedfsDilNPYfHLlMH7vGfU5DQR0czHLmJvH4Nzis/A==} 224 | engines: {node: '>=12'} 225 | cpu: [arm64] 226 | os: [win32] 227 | requiresBuild: true 228 | dev: true 229 | optional: true 230 | 231 | /@esbuild/win32-ia32@0.20.1: 232 | resolution: {integrity: sha512-HzcJa1NcSWTAU0MJIxOho8JftNp9YALui3o+Ny7hCh0v5f90nprly1U3Sj1Ldj/CvKKdvvFsCRvDkpsEMp4DNw==} 233 | engines: {node: '>=12'} 234 | cpu: [ia32] 235 | os: [win32] 236 | requiresBuild: true 237 | dev: true 238 | optional: true 239 | 240 | /@esbuild/win32-x64@0.20.1: 241 | resolution: {integrity: sha512-0MBh53o6XtI6ctDnRMeQ+xoCN8kD2qI1rY1KgF/xdWQwoFeKou7puvDfV8/Wv4Ctx2rRpET/gGdz3YlNtNACSA==} 242 | engines: {node: '>=12'} 243 | cpu: [x64] 244 | os: [win32] 245 | requiresBuild: true 246 | dev: true 247 | optional: true 248 | 249 | /@nativewrappers/client@1.7.33: 250 | resolution: {integrity: sha512-phuBBGdDPxZiZyw5CaFs1XWfvllnEtwATMdLaNucwMofVg/O/FjlP1bTUq4SOm4qhSZ4Zdo351ijHzBSIbZs6g==} 251 | dev: false 252 | 253 | /@overextended/ox_core@0.21.1: 254 | resolution: {integrity: sha512-aQrCrbzBQB21Kvkirv0/2gSWkSe98ybAN4RVYGdJjbycdZf3/94piuuj8eqztg2OvtoZbwX9nBk/Rquiwo82yw==} 255 | engines: {node: '>=16.9.1'} 256 | dependencies: 257 | '@overextended/ox_lib': 3.16.3 258 | mariadb: 3.2.3 259 | dev: false 260 | 261 | /@overextended/ox_lib@3.16.3: 262 | resolution: {integrity: sha512-vqx/WAey/DJIokzBB8fv76IlUBdMf/yWmuN/Rs44qFB8Zbg7sWPWprRRVXcCo65QaCfJS0Lo2i/OZQcBq/LhKQ==} 263 | dependencies: 264 | '@nativewrappers/client': 1.7.33 265 | fast-printf: 1.6.9 266 | typescript: 5.3.3 267 | dev: false 268 | 269 | /@overextended/oxmysql@1.3.0: 270 | resolution: {integrity: sha512-dpbcAT8HHUQiXyQMb0ei46tUEeCbh9mAgDf4y2vofPp+E3g4QEW8rh0/LuI510VLzJQ7gvTbalQSL84IiCncCw==} 271 | dev: false 272 | 273 | /@types/geojson@7946.0.14: 274 | resolution: {integrity: sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==} 275 | dev: false 276 | 277 | /@types/node@16.18.83: 278 | resolution: {integrity: sha512-TmBqzDY/GeCEmLob/31SunOQnqYE3ZiiuEh1U9o3HqE1E2cqKZQA5RQg4krEguCY3StnkXyDmCny75qyFLx/rA==} 279 | dev: true 280 | 281 | /@types/node@17.0.45: 282 | resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} 283 | dev: false 284 | 285 | /boolean@3.2.0: 286 | resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} 287 | dev: false 288 | 289 | /denque@2.1.0: 290 | resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} 291 | engines: {node: '>=0.10'} 292 | dev: false 293 | 294 | /esbuild@0.20.1: 295 | resolution: {integrity: sha512-OJwEgrpWm/PCMsLVWXKqvcjme3bHNpOgN7Tb6cQnR5n0TPbQx1/Xrn7rqM+wn17bYeT6MGB5sn1Bh5YiGi70nA==} 296 | engines: {node: '>=12'} 297 | hasBin: true 298 | requiresBuild: true 299 | optionalDependencies: 300 | '@esbuild/aix-ppc64': 0.20.1 301 | '@esbuild/android-arm': 0.20.1 302 | '@esbuild/android-arm64': 0.20.1 303 | '@esbuild/android-x64': 0.20.1 304 | '@esbuild/darwin-arm64': 0.20.1 305 | '@esbuild/darwin-x64': 0.20.1 306 | '@esbuild/freebsd-arm64': 0.20.1 307 | '@esbuild/freebsd-x64': 0.20.1 308 | '@esbuild/linux-arm': 0.20.1 309 | '@esbuild/linux-arm64': 0.20.1 310 | '@esbuild/linux-ia32': 0.20.1 311 | '@esbuild/linux-loong64': 0.20.1 312 | '@esbuild/linux-mips64el': 0.20.1 313 | '@esbuild/linux-ppc64': 0.20.1 314 | '@esbuild/linux-riscv64': 0.20.1 315 | '@esbuild/linux-s390x': 0.20.1 316 | '@esbuild/linux-x64': 0.20.1 317 | '@esbuild/netbsd-x64': 0.20.1 318 | '@esbuild/openbsd-x64': 0.20.1 319 | '@esbuild/sunos-x64': 0.20.1 320 | '@esbuild/win32-arm64': 0.20.1 321 | '@esbuild/win32-ia32': 0.20.1 322 | '@esbuild/win32-x64': 0.20.1 323 | dev: true 324 | 325 | /fast-printf@1.6.9: 326 | resolution: {integrity: sha512-FChq8hbz65WMj4rstcQsFB0O7Cy++nmbNfLYnD9cYv2cRn8EG6k/MGn9kO/tjO66t09DLDugj3yL+V2o6Qftrg==} 327 | engines: {node: '>=10.0'} 328 | dependencies: 329 | boolean: 3.2.0 330 | dev: false 331 | 332 | /iconv-lite@0.6.3: 333 | resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} 334 | engines: {node: '>=0.10.0'} 335 | dependencies: 336 | safer-buffer: 2.1.2 337 | dev: false 338 | 339 | /lru-cache@10.2.0: 340 | resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} 341 | engines: {node: 14 || >=16.14} 342 | dev: false 343 | 344 | /mariadb@3.2.3: 345 | resolution: {integrity: sha512-Hyc1ehdUJwzvvzcLU2juZS528wJ6oE8pUlpgY0BAOdpKWcdN1motuugi5lC3jkpCkFpyNknHG7Yg66KASl3aPg==} 346 | engines: {node: '>= 12'} 347 | dependencies: 348 | '@types/geojson': 7946.0.14 349 | '@types/node': 17.0.45 350 | denque: 2.1.0 351 | iconv-lite: 0.6.3 352 | lru-cache: 10.2.0 353 | dev: false 354 | 355 | /safer-buffer@2.1.2: 356 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 357 | dev: false 358 | 359 | /typescript@5.3.3: 360 | resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} 361 | engines: {node: '>=14.17'} 362 | hasBin: true 363 | dev: false 364 | --------------------------------------------------------------------------------