[{"data":1,"prerenderedAt":2723},["ShallowReactive",2],{"navLinks":3,"sidebar_docs_navigation_\u002Fdocs\u002Futils":64,"navigation":263,"navLinks_footer":835,"\u002Fdocs\u002Futils\u002Fserver\u002Fuploadcsv_page":848,"\u002Fdocs\u002Futils\u002Fserver\u002Fuploadcsv_surround":1898,"\u002Fdocs\u002Futils\u002Fserver\u002Fuploadcsv":1901},{"id":4,"extension":5,"links":6,"meta":61,"stem":62,"__hash__":63},"navigationMenu\u002Fnavigation.json","json",[7,52,57],{"nested":8,"label":9,"icon":10,"to":11,"children":12},true,"Docs","i-lucide-book-open","\u002Fdocs\u002Fgetting-started",[13,19,26,32,39,45],{"label":14,"icon":15,"to":11,"description":16,"github":17,"badge":18},"Getting Started","i-lucide-rocket","An introduction to help you understand the core components.","https:\u002F\u002Fgithub.com\u002FSergo706\u002Fdocshub","Start Here",{"label":20,"icon":21,"to":22,"description":23,"github":24,"badge":25},"Auth H3 Client","i-lucide-key-round","\u002Fdocs\u002Fauth-h3client","Seamlessly enforce OAuth 2.0 authentication and session management integrated directly as the client of the IAM module.","https:\u002F\u002Fgithub.com\u002FSergo706\u002Fauth-h3client","Core",{"label":27,"icon":28,"to":29,"description":30,"github":31,"badge":25},"IAM","i-lucide-shield-check","\u002Fdocs\u002Fiam","Identity and Access Management featuring granular roles, permissions, and security policies.","https:\u002F\u002Fgithub.com\u002FSergo706\u002Fauth",{"label":33,"icon":34,"to":35,"description":36,"github":37,"badge":38},"Bot Detection","i-lucide-cpu","\u002Fdocs\u002Fbot-detection","Advanced behavioral analysis and request fingerprinting to stop malicious automated traffic.","https:\u002F\u002Fgithub.com\u002FSergo706\u002Fbot-detector","Security",{"label":40,"icon":41,"to":42,"description":43,"github":44,"badge":38},"Shield Base","i-lucide-database-zap","\u002Fdocs\u002Fshield-base","CLI and programmatic toolkit for compiling offline-ready IP intelligence databases from BGP, GeoIP, Tor, FireHOL, and other public threat feeds.","https:\u002F\u002Fgithub.com\u002FSergo706\u002Fshield-base-cli",{"label":46,"icon":47,"to":48,"description":49,"github":50,"badge":51},"Utils","i-lucide-wrench","\u002Fdocs\u002Futils","A standard library of highly optimized helpers for formatting, validation, and core logic.","https:\u002F\u002Fgithub.com\u002FSergo706\u002Futils","Library",{"nested":53,"label":54,"icon":55,"to":56},false,"Blog","i-lucide-pen-line","\u002Fblog",{"nested":53,"label":58,"icon":59,"to":60},"Website","lucide:app-window-mac","https:\u002F\u002Friavzon.com",{},"navigation","gkaQ0xRGxSLrLyM3kttLe0oBwkrR1EBjlepF8LSbwF8",[65],{"title":9,"path":66,"stem":67,"children":68,"page":53},"\u002Fdocs","docs",[69],{"title":70,"path":48,"stem":71,"children":72},"Utilities","docs\u002Futils\u002Findex",[73,74,91,124,221],{"title":70,"path":48,"stem":71},{"title":75,"path":76,"stem":77,"children":78,"page":53},"Eslint","\u002Fdocs\u002Futils\u002Feslint","docs\u002Futils\u002Feslint",[79,83,87],{"title":80,"path":81,"stem":82},"React Config","\u002Fdocs\u002Futils\u002Feslint\u002Freact","docs\u002Futils\u002Feslint\u002Freact",{"title":84,"path":85,"stem":86},"TypeScript Config","\u002Fdocs\u002Futils\u002Feslint\u002Ftypescript","docs\u002Futils\u002Feslint\u002Ftypescript",{"title":88,"path":89,"stem":90},"Vue Config","\u002Fdocs\u002Futils\u002Feslint\u002Fvue","docs\u002Futils\u002Feslint\u002Fvue",{"title":92,"path":93,"stem":94,"children":95,"page":53},"Server","\u002Fdocs\u002Futils\u002Fserver","docs\u002Futils\u002Fserver",[96,100,104,108,112,116,120],{"title":97,"path":98,"stem":99},"Encryption","\u002Fdocs\u002Futils\u002Fserver\u002Fencryption","docs\u002Futils\u002Fserver\u002Fencryption",{"title":101,"path":102,"stem":103},"Path Resolver","\u002Fdocs\u002Futils\u002Fserver\u002Fpathresolver","docs\u002Futils\u002Fserver\u002FpathResolver",{"title":105,"path":106,"stem":107},"File Replacements","\u002Fdocs\u002Futils\u002Fserver\u002Freplace","docs\u002Futils\u002Fserver\u002Freplace",{"title":109,"path":110,"stem":111},"run","\u002Fdocs\u002Futils\u002Fserver\u002Frun","docs\u002Futils\u002Fserver\u002Frun",{"title":113,"path":114,"stem":115},"scheduleTask","\u002Fdocs\u002Futils\u002Fserver\u002Fscheduletask","docs\u002Futils\u002Fserver\u002FscheduleTask",{"title":117,"path":118,"stem":119},"spawnRun","\u002Fdocs\u002Futils\u002Fserver\u002Fspawnrun","docs\u002Futils\u002Fserver\u002FspawnRun",{"title":121,"path":122,"stem":123},"uploadCsv","\u002Fdocs\u002Futils\u002Fserver\u002Fuploadcsv","docs\u002Futils\u002Fserver\u002FuploadCsv",{"title":125,"path":126,"stem":127,"children":128,"page":53},"Shared","\u002Fdocs\u002Futils\u002Fshared","docs\u002Futils\u002Fshared",[129,133,137,141,145,149,153,157,161,165,169,173,177,181,185,189,193,197,201,205,209,213,217],{"title":130,"path":131,"stem":132},"BatchQueue","\u002Fdocs\u002Futils\u002Fshared\u002Fbatchqueue","docs\u002Futils\u002Fshared\u002FbatchQueue",{"title":134,"path":135,"stem":136},"capitalize","\u002Fdocs\u002Futils\u002Fshared\u002Fcapitalize","docs\u002Futils\u002Fshared\u002Fcapitalize",{"title":138,"path":139,"stem":140},"chunkProcess","\u002Fdocs\u002Futils\u002Fshared\u002Fchunkprocess","docs\u002Futils\u002Fshared\u002FchunkProcess",{"title":142,"path":143,"stem":144},"cleanObject","\u002Fdocs\u002Futils\u002Fshared\u002Fcleanobject","docs\u002Futils\u002Fshared\u002FcleanObject",{"title":146,"path":147,"stem":148},"createConfigManager","\u002Fdocs\u002Futils\u002Fshared\u002Fconfigurationdefiner","docs\u002Futils\u002Fshared\u002FconfigurationDefiner",{"title":150,"path":151,"stem":152},"debounce","\u002Fdocs\u002Futils\u002Fshared\u002Fdebounce","docs\u002Futils\u002Fshared\u002Fdebounce",{"title":154,"path":155,"stem":156},"ensureArray","\u002Fdocs\u002Futils\u002Fshared\u002Fensurearray","docs\u002Futils\u002Fshared\u002FensureArray",{"title":158,"path":159,"stem":160},"fetchWithRetry","\u002Fdocs\u002Futils\u002Fshared\u002Ffetchwithretry","docs\u002Futils\u002Fshared\u002FfetchWithRetry",{"title":162,"path":163,"stem":164},"filterEmptyValues","\u002Fdocs\u002Futils\u002Fshared\u002Ffilteremptyvalues","docs\u002Futils\u002Fshared\u002FfilterEmptyValues",{"title":166,"path":167,"stem":168},"findStringsInObject","\u002Fdocs\u002Futils\u002Fshared\u002Ffindobjectvalues","docs\u002Futils\u002Fshared\u002FfindObjectValues",{"title":170,"path":171,"stem":172},"fisherYatesShuffle","\u002Fdocs\u002Futils\u002Fshared\u002Ffisheryatesshuffle","docs\u002Futils\u002Fshared\u002FfisherYatesShuffle",{"title":174,"path":175,"stem":176},"getRandomImage","\u002Fdocs\u002Futils\u002Fshared\u002Fgetrandomimage","docs\u002Futils\u002Fshared\u002FgetRandomImage",{"title":178,"path":179,"stem":180},"isObjectHasValues","\u002Fdocs\u002Futils\u002Fshared\u002Fisobjecthasvalues","docs\u002Futils\u002Fshared\u002FisObjectHasValues",{"title":182,"path":183,"stem":184},"isAsyncOrPromise","\u002Fdocs\u002Futils\u002Fshared\u002Fispromise","docs\u002Futils\u002Fshared\u002FisPromise",{"title":186,"path":187,"stem":188},"MiniCache","\u002Fdocs\u002Futils\u002Fshared\u002Fminicache","docs\u002Futils\u002Fshared\u002FminiCache",{"title":190,"path":191,"stem":192},"parseCookies","\u002Fdocs\u002Futils\u002Fshared\u002Fparserawcookies","docs\u002Futils\u002Fshared\u002FparseRawCookies",{"title":194,"path":195,"stem":196},"safeAction","\u002Fdocs\u002Futils\u002Fshared\u002Fpromiselocker","docs\u002Futils\u002Fshared\u002FpromiseLocker",{"title":198,"path":199,"stem":200},"Random","\u002Fdocs\u002Futils\u002Fshared\u002Frandom","docs\u002Futils\u002Fshared\u002Frandom",{"title":202,"path":203,"stem":204},"range","\u002Fdocs\u002Futils\u002Fshared\u002Frange","docs\u002Futils\u002Fshared\u002Frange",{"title":206,"path":207,"stem":208},"rateLimiters","\u002Fdocs\u002Futils\u002Fshared\u002Fratelimiters","docs\u002Futils\u002Fshared\u002FrateLimiters",{"title":210,"path":211,"stem":212},"safeObjectMerge","\u002Fdocs\u002Futils\u002Fshared\u002Fsafemerge","docs\u002Futils\u002Fshared\u002FsafeMerge",{"title":214,"path":215,"stem":216},"textTruncation","\u002Fdocs\u002Futils\u002Fshared\u002Ftexttruncation","docs\u002Futils\u002Fshared\u002FtextTruncation",{"title":218,"path":219,"stem":220},"validateZodSchema","\u002Fdocs\u002Futils\u002Fshared\u002Fvalidatezodschema","docs\u002Futils\u002Fshared\u002FvalidateZodSchema",{"title":222,"path":223,"stem":224,"children":225},"Utility Types","\u002Fdocs\u002Futils\u002Ftypes","docs\u002Futils\u002Ftypes\u002Findex",[226,227,231,235,239,243,247,251,255,259],{"title":222,"path":223,"stem":224},{"title":228,"path":229,"stem":230},"Brand","\u002Fdocs\u002Futils\u002Ftypes\u002Fbrand","docs\u002Futils\u002Ftypes\u002FBrand",{"title":232,"path":233,"stem":234},"DeepPartial","\u002Fdocs\u002Futils\u002Ftypes\u002Fdeeppartial","docs\u002Futils\u002Ftypes\u002FDeepPartial",{"title":236,"path":237,"stem":238},"Merge","\u002Fdocs\u002Futils\u002Ftypes\u002Fmerge","docs\u002Futils\u002Ftypes\u002FMerge",{"title":240,"path":241,"stem":242},"NonNullable","\u002Fdocs\u002Futils\u002Ftypes\u002Fnonnullable","docs\u002Futils\u002Ftypes\u002FNonNullable",{"title":244,"path":245,"stem":246},"Prettify","\u002Fdocs\u002Futils\u002Ftypes\u002Fprettify","docs\u002Futils\u002Ftypes\u002FPrettify",{"title":248,"path":249,"stem":250},"PromiseType","\u002Fdocs\u002Futils\u002Ftypes\u002Fpromisetype","docs\u002Futils\u002Ftypes\u002FPromiseType",{"title":252,"path":253,"stem":254},"RequireKeys","\u002Fdocs\u002Futils\u002Ftypes\u002Frequirekeys","docs\u002Futils\u002Ftypes\u002FRequireKeys",{"title":256,"path":257,"stem":258},"StandardResponse","\u002Fdocs\u002Futils\u002Ftypes\u002Fstandardresponse","docs\u002Futils\u002Ftypes\u002FStandardResponse",{"title":260,"path":261,"stem":262},"ValueOf","\u002Fdocs\u002Futils\u002Ftypes\u002Fvalueof","docs\u002Futils\u002Ftypes\u002FValueOf",[264],{"title":9,"path":66,"stem":67,"children":265,"page":53},[266,413,531,536,714,781],{"title":20,"path":22,"stem":267,"children":268},"docs\u002Fauth-h3client\u002Findex",[269,270,279,316,342,364,367,388,392],{"title":20,"path":22,"stem":267},{"title":14,"path":271,"stem":272,"children":273},"\u002Fdocs\u002Fauth-h3client\u002Fgetting-started","docs\u002Fauth-h3client\u002F00.getting-started\u002Findex",[274,275],{"title":14,"path":271,"stem":272},{"title":276,"path":277,"stem":278},"Nuxt Module","\u002Fdocs\u002Fauth-h3client\u002Fgetting-started\u002Fnuxt","docs\u002Fauth-h3client\u002F00.getting-started\u002F00.nuxt",{"title":280,"path":281,"stem":282,"children":283},"Essentials","\u002Fdocs\u002Fauth-h3client\u002Fessentials","docs\u002Fauth-h3client\u002F01.essentials\u002Findex",[284,285,289,293,297,301,305,308,312],{"title":280,"path":281,"stem":282},{"title":286,"path":287,"stem":288},"Session Management","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fsession","docs\u002Fauth-h3client\u002F01.essentials\u002F00.session",{"title":290,"path":291,"stem":292},"Route Protection","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Froute-protection","docs\u002Fauth-h3client\u002F01.essentials\u002F01.route-protection",{"title":294,"path":295,"stem":296},"CSRF Protection","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fcsrf","docs\u002Fauth-h3client\u002F01.essentials\u002F02.csrf",{"title":298,"path":299,"stem":300},"Auth Flows","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fauth-flows","docs\u002Fauth-h3client\u002F01.essentials\u002F03.auth-flows",{"title":302,"path":303,"stem":304},"OAuth and OIDC","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Foauth","docs\u002Fauth-h3client\u002F01.essentials\u002F04.oauth",{"title":33,"path":306,"stem":307},"\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fbot-detection","docs\u002Fauth-h3client\u002F01.essentials\u002F05.bot-detection",{"title":309,"path":310,"stem":311},"Cookies","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fcookies","docs\u002Fauth-h3client\u002F01.essentials\u002F06.cookies",{"title":313,"path":314,"stem":315},"Logging","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Flogging","docs\u002Fauth-h3client\u002F01.essentials\u002F07.logging",{"title":317,"path":318,"stem":319,"children":320},"MFA","\u002Fdocs\u002Fauth-h3client\u002Fmfa","docs\u002Fauth-h3client\u002F02.mfa\u002Findex",[321,322,326,330,334,338],{"title":317,"path":318,"stem":319},{"title":323,"path":324,"stem":325},"Built-in MFA","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fbuilt-in-flow","docs\u002Fauth-h3client\u002F02.mfa\u002F01.built-in-flow",{"title":327,"path":328,"stem":329},"Password Reset","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fpassword-reset","docs\u002Fauth-h3client\u002F02.mfa\u002F02.password-reset",{"title":331,"path":332,"stem":333},"Email Change","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Femail-change","docs\u002Fauth-h3client\u002F02.mfa\u002F03.email-change",{"title":335,"path":336,"stem":337},"Custom MFA Flow","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fcustom-flow","docs\u002Fauth-h3client\u002F02.mfa\u002F04.custom-flow",{"title":339,"path":340,"stem":341},"Client-Side MFA","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fclient-side","docs\u002Fauth-h3client\u002F02.mfa\u002F05.client-side",{"title":343,"path":344,"stem":345,"children":346},"Client-side","\u002Fdocs\u002Fauth-h3client\u002Fclient","docs\u002Fauth-h3client\u002F03.client\u002Findex",[347,348,352,356,360],{"title":343,"path":344,"stem":345},{"title":349,"path":350,"stem":351},"useAuthData","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fuse-auth-data","docs\u002Fauth-h3client\u002F03.client\u002F00.use-auth-data",{"title":353,"path":354,"stem":355},"useMagicLink","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fuse-magic-link","docs\u002Fauth-h3client\u002F03.client\u002F01.use-magic-link",{"title":357,"path":358,"stem":359},"executeRequest","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fexecute-request","docs\u002Fauth-h3client\u002F03.client\u002F02.execute-request",{"title":361,"path":362,"stem":363},"getCsrfToken","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fget-csrf-token","docs\u002Fauth-h3client\u002F03.client\u002F03.get-csrf-token",{"title":38,"path":365,"stem":366},"\u002Fdocs\u002Fauth-h3client\u002Fsecurity","docs\u002Fauth-h3client\u002F04.security",{"title":368,"path":369,"stem":370,"children":371,"page":53},"Guides","\u002Fdocs\u002Fauth-h3client\u002Fguides","docs\u002Fauth-h3client\u002F05.guides",[372,376,380,384],{"title":373,"path":374,"stem":375},"H3 and Nitro Setup","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fh3-nitro","docs\u002Fauth-h3client\u002F05.guides\u002F00.h3-nitro",{"title":377,"path":378,"stem":379},"HMAC Inter-service Auth","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fhmac","docs\u002Fauth-h3client\u002F05.guides\u002Fhmac",{"title":381,"path":382,"stem":383},"Image Upload","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fimage-upload","docs\u002Fauth-h3client\u002F05.guides\u002Fimage-upload",{"title":385,"path":386,"stem":387},"mTLS Configuration","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fmtls","docs\u002Fauth-h3client\u002F05.guides\u002Fmtls",{"title":389,"path":390,"stem":391},"Configuration","\u002Fdocs\u002Fauth-h3client\u002Fconfiguration","docs\u002Fauth-h3client\u002F06.configuration",{"title":393,"path":394,"stem":395,"children":396},"API Reference","\u002Fdocs\u002Fauth-h3client\u002Fapi","docs\u002Fauth-h3client\u002F07.api\u002Findex",[397,398,402,406,410],{"title":393,"path":394,"stem":395},{"title":399,"path":400,"stem":401},"Routes Reference","\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Fcontrollers","docs\u002Fauth-h3client\u002F07.api\u002F00.controllers",{"title":403,"path":404,"stem":405},"Middleware Reference","\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Fmiddleware","docs\u002Fauth-h3client\u002F07.api\u002F01.middleware",{"title":407,"path":408,"stem":409},"Client-side Reference","\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Fcomposables","docs\u002Fauth-h3client\u002F07.api\u002F02.composables",{"title":70,"path":411,"stem":412},"\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Futilities","docs\u002Fauth-h3client\u002F07.api\u002F03.utilities",{"title":414,"path":35,"stem":415,"children":416},"Bot Detector","docs\u002Fbot-detection\u002Findex",[417,418,421,425,429,448,522,525,528],{"title":414,"path":35,"stem":415},{"title":14,"path":419,"stem":420},"\u002Fdocs\u002Fbot-detection\u002Fgetting-started","docs\u002Fbot-detection\u002F00.getting-started",{"title":422,"path":423,"stem":424},"CLI","\u002Fdocs\u002Fbot-detection\u002Fcli","docs\u002Fbot-detection\u002F01.cli",{"title":426,"path":427,"stem":428},"Data Sources","\u002Fdocs\u002Fbot-detection\u002Fdata-sources","docs\u002Fbot-detection\u002F02.data-sources",{"title":368,"path":430,"stem":431,"children":432,"page":53},"\u002Fdocs\u002Fbot-detection\u002Fguides","docs\u002Fbot-detection\u002F03.guides",[433,437,441,444],{"title":434,"path":435,"stem":436},"Custom Checkers","\u002Fdocs\u002Fbot-detection\u002Fguides\u002Fcustom","docs\u002Fbot-detection\u002F03.guides\u002FCUSTOM",{"title":438,"path":439,"stem":440},"Scheduling Database Generation","\u002Fdocs\u002Fbot-detection\u002Fguides\u002Fgenerate","docs\u002Fbot-detection\u002F03.guides\u002FGENERATE",{"title":313,"path":442,"stem":443},"\u002Fdocs\u002Fbot-detection\u002Fguides\u002Flogging","docs\u002Fbot-detection\u002F03.guides\u002FLOGGING",{"title":445,"path":446,"stem":447},"Score Modes and Reputation Healing","\u002Fdocs\u002Fbot-detection\u002Fguides\u002Fscore","docs\u002Fbot-detection\u002F03.guides\u002FSCORE",{"title":449,"path":450,"stem":451,"children":452},"Checkers","\u002Fdocs\u002Fbot-detection\u002Fcheckers","docs\u002Fbot-detection\u002F04.checkers\u002Findex",[453,454,458,462,466,470,474,478,482,486,490,494,498,502,506,510,514,518],{"title":449,"path":450,"stem":451},{"title":455,"path":456,"stem":457},"IP Validation","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fip-validation","docs\u002Fbot-detection\u002F04.checkers\u002F01.ip-validation",{"title":459,"path":460,"stem":461},"Good \u002F Bad Bot Verification","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fgood-bots","docs\u002Fbot-detection\u002F04.checkers\u002F02.good-bots",{"title":463,"path":464,"stem":465},"Browser & Device Fingerprint","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fbrowser-device","docs\u002Fbot-detection\u002F04.checkers\u002F03.browser-device",{"title":467,"path":468,"stem":469},"Locale Map","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Flocale-map","docs\u002Fbot-detection\u002F04.checkers\u002F04.locale-map",{"title":471,"path":472,"stem":473},"Known Threats","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fknown-threats","docs\u002Fbot-detection\u002F04.checkers\u002F05.known-threats",{"title":475,"path":476,"stem":477},"ASN Classification","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fasn-classification","docs\u002Fbot-detection\u002F04.checkers\u002F06.asn-classification",{"title":479,"path":480,"stem":481},"Tor Analysis","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Ftor-analysis","docs\u002Fbot-detection\u002F04.checkers\u002F07.tor-analysis",{"title":483,"path":484,"stem":485},"Timezone Consistency","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Ftimezone-consistency","docs\u002Fbot-detection\u002F04.checkers\u002F08.timezone-consistency",{"title":487,"path":488,"stem":489},"Honeypot","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fhoneypot","docs\u002Fbot-detection\u002F04.checkers\u002F09.honeypot",{"title":491,"path":492,"stem":493},"Known Bad IPs","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fknown-bad-ips","docs\u002Fbot-detection\u002F04.checkers\u002F10.known-bad-ips",{"title":495,"path":496,"stem":497},"Behavior Rate","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fbehavior-rate","docs\u002Fbot-detection\u002F04.checkers\u002F11.behavior-rate",{"title":499,"path":500,"stem":501},"Proxy \u002F ISP \u002F Cookie","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fproxy-isp-cookies","docs\u002Fbot-detection\u002F04.checkers\u002F12.proxy-isp-cookies",{"title":503,"path":504,"stem":505},"Session Coherence","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fsession-coherence","docs\u002Fbot-detection\u002F04.checkers\u002F13.session-coherence",{"title":507,"path":508,"stem":509},"Velocity Fingerprint","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fvelocity-fingerprint","docs\u002Fbot-detection\u002F04.checkers\u002F14.velocity-fingerprint",{"title":511,"path":512,"stem":513},"UA & Header Analysis","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fua-header","docs\u002Fbot-detection\u002F04.checkers\u002F15.ua-header",{"title":515,"path":516,"stem":517},"Geolocation","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fgeolocation","docs\u002Fbot-detection\u002F04.checkers\u002F16.geolocation",{"title":519,"path":520,"stem":521},"Known Bad User-Agents","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fknown-bad-ua","docs\u002Fbot-detection\u002F04.checkers\u002F17.known-bad-ua",{"title":38,"path":523,"stem":524},"\u002Fdocs\u002Fbot-detection\u002Fsecurity","docs\u002Fbot-detection\u002F04.security",{"title":393,"path":526,"stem":527},"\u002Fdocs\u002Fbot-detection\u002Fapi","docs\u002Fbot-detection\u002F05.api",{"title":389,"path":529,"stem":530},"\u002Fdocs\u002Fbot-detection\u002Fconfiguration","docs\u002Fbot-detection\u002F06.configuration",{"title":532,"path":11,"stem":533,"children":534},"Introduction","docs\u002Fgetting-started\u002Findex",[535],{"title":532,"path":11,"stem":533},{"title":27,"path":29,"stem":537,"children":538},"docs\u002Fiam\u002Findex",[539,540,543,678,681,697,700],{"title":27,"path":29,"stem":537},{"title":14,"path":541,"stem":542},"\u002Fdocs\u002Fiam\u002Fgetting-started","docs\u002Fiam\u002F00.getting-started",{"title":280,"path":544,"stem":545,"children":546},"\u002Fdocs\u002Fiam\u002Fessentials","docs\u002Fiam\u002F01.essentials\u002Findex",[547,548,552,556,560,564,568,572,576,580,584,588,591,595,599,603,607,610,614,618,621,625,628],{"title":280,"path":544,"stem":545},{"title":549,"path":550,"stem":551},"Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Ftokens","docs\u002Fiam\u002F01.essentials\u002F00.tokens",{"title":553,"path":554,"stem":555},"Access Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Faccess-tokens","docs\u002Fiam\u002F01.essentials\u002F01.access-tokens",{"title":557,"path":558,"stem":559},"Refresh Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Frefresh-tokens","docs\u002Fiam\u002F01.essentials\u002F02.refresh-tokens",{"title":561,"path":562,"stem":563},"Anomaly Detection","\u002Fdocs\u002Fiam\u002Fessentials\u002Fanomalies","docs\u002Fiam\u002F01.essentials\u002F03.anomalies",{"title":565,"path":566,"stem":567},"Signup","\u002Fdocs\u002Fiam\u002Fessentials\u002Fsignup","docs\u002Fiam\u002F01.essentials\u002F04.signup",{"title":569,"path":570,"stem":571},"Login","\u002Fdocs\u002Fiam\u002Fessentials\u002Flogin","docs\u002Fiam\u002F01.essentials\u002F05.login",{"title":573,"path":574,"stem":575},"Logout","\u002Fdocs\u002Fiam\u002Fessentials\u002Flogout","docs\u002Fiam\u002F01.essentials\u002F06.logout",{"title":577,"path":578,"stem":579},"OAuth","\u002Fdocs\u002Fiam\u002Fessentials\u002Foauth","docs\u002Fiam\u002F01.essentials\u002F07.oauth",{"title":581,"path":582,"stem":583},"Magic Links","\u002Fdocs\u002Fiam\u002Fessentials\u002Fmagic-links","docs\u002Fiam\u002F01.essentials\u002F08.magic-links",{"title":585,"path":586,"stem":587},"Emails","\u002Fdocs\u002Fiam\u002Fessentials\u002Femails","docs\u002Fiam\u002F01.essentials\u002F09.emails",{"title":317,"path":589,"stem":590},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fmfa","docs\u002Fiam\u002F01.essentials\u002F10.mfa",{"title":592,"path":593,"stem":594},"Fingerprinting","\u002Fdocs\u002Fiam\u002Fessentials\u002Ffingerprinting","docs\u002Fiam\u002F01.essentials\u002F11.fingerprinting",{"title":596,"path":597,"stem":598},"Backend for Frontend","\u002Fdocs\u002Fiam\u002Fessentials\u002Fbff","docs\u002Fiam\u002F01.essentials\u002F12.bff",{"title":600,"path":601,"stem":602},"HMAC Authentication","\u002Fdocs\u002Fiam\u002Fessentials\u002Fhmac","docs\u002Fiam\u002F01.essentials\u002F13.hmac",{"title":604,"path":605,"stem":606},"XSS Protection","\u002Fdocs\u002Fiam\u002Fessentials\u002Fxss","docs\u002Fiam\u002F01.essentials\u002F14.xss",{"title":313,"path":608,"stem":609},"\u002Fdocs\u002Fiam\u002Fessentials\u002Flogging","docs\u002Fiam\u002F01.essentials\u002F15.logging",{"title":611,"path":612,"stem":613},"Rate Limiting","\u002Fdocs\u002Fiam\u002Fessentials\u002Frate-limiting","docs\u002Fiam\u002F01.essentials\u002F16.rate-limiting",{"title":615,"path":616,"stem":617},"Database","\u002Fdocs\u002Fiam\u002Fessentials\u002Fdatabase","docs\u002Fiam\u002F01.essentials\u002F17.database",{"title":309,"path":619,"stem":620},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fcookies","docs\u002Fiam\u002F01.essentials\u002F18.cookies",{"title":622,"path":623,"stem":624},"Service Startup","\u002Fdocs\u002Fiam\u002Fessentials\u002Fservice","docs\u002Fiam\u002F01.essentials\u002F19.service",{"title":327,"path":626,"stem":627},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fpassword-reset","docs\u002Fiam\u002F01.essentials\u002F20.password-reset",{"title":629,"path":630,"stem":631,"children":632},"API Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi","docs\u002Fiam\u002F01.essentials\u002F21.api\u002Findex",[633,634,638,642,672,675],{"title":629,"path":630,"stem":631},{"title":635,"path":636,"stem":637},"Creating Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fcreation","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F00.creation",{"title":639,"path":640,"stem":641},"Verifying Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fverification","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F01.verification",{"title":643,"path":644,"stem":645,"children":646},"Manage Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002Findex",[647,648,652,656,660,664,668],{"title":643,"path":644,"stem":645},{"title":649,"path":650,"stem":651},"Privileges","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fprivilege","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F00.privilege",{"title":653,"path":654,"stem":655},"Revocation","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Frevocation","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F01.revocation",{"title":657,"path":658,"stem":659},"Rotation","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Frotation","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F02.rotation",{"title":661,"path":662,"stem":663},"IP Restriction","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fip-updates","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F03.ip-updates",{"title":665,"path":666,"stem":667},"Metadata","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fmetadata","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F04.metadata",{"title":669,"path":670,"stem":671},"Token Listing","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Flist","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F05.list",{"title":611,"path":673,"stem":674},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Frate-limiting","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F03.rate-limiting",{"title":38,"path":676,"stem":677},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fsecurity","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F04.security",{"title":38,"path":679,"stem":680},"\u002Fdocs\u002Fiam\u002Fsecurity","docs\u002Fiam\u002F02.security",{"title":368,"path":682,"stem":683,"children":684,"page":53},"\u002Fdocs\u002Fiam\u002Fguides","docs\u002Fiam\u002F03.guides",[685,689,693],{"title":686,"path":687,"stem":688},"Deployment","\u002Fdocs\u002Fiam\u002Fguides\u002Fdeployment","docs\u002Fiam\u002F03.guides\u002Fdeployment",{"title":690,"path":691,"stem":692},"Operation Scripts","\u002Fdocs\u002Fiam\u002Fguides\u002Foperation-scripts","docs\u002Fiam\u002F03.guides\u002Foperation-scripts",{"title":694,"path":695,"stem":696},"Role-Based Access Control","\u002Fdocs\u002Fiam\u002Fguides\u002Frbac","docs\u002Fiam\u002F03.guides\u002Frbac",{"title":389,"path":698,"stem":699},"\u002Fdocs\u002Fiam\u002Fconfiguration","docs\u002Fiam\u002F04.configuration",{"title":701,"path":702,"stem":703,"children":704,"page":53},"Api","\u002Fdocs\u002Fiam\u002Fapi","docs\u002Fiam\u002F05.API",[705,708,711],{"title":393,"path":706,"stem":707},"\u002Fdocs\u002Fiam\u002Fapi\u002Fapi","docs\u002Fiam\u002F05.API\u002F00.api",{"title":403,"path":709,"stem":710},"\u002Fdocs\u002Fiam\u002Fapi\u002Fmiddlewares","docs\u002Fiam\u002F05.API\u002F02.middlewares",{"title":399,"path":712,"stem":713},"\u002Fdocs\u002Fiam\u002Fapi\u002Froutes","docs\u002Fiam\u002F05.API\u002F03.routes",{"title":40,"path":42,"stem":715,"children":716},"docs\u002Fshield-base\u002Findex",[717,718,721,725,766,770,774,778],{"title":40,"path":42,"stem":715},{"title":14,"path":719,"stem":720},"\u002Fdocs\u002Fshield-base\u002Fgetting-started","docs\u002Fshield-base\u002F00.getting-started",{"title":722,"path":723,"stem":724},"CLI Reference","\u002Fdocs\u002Fshield-base\u002Fcli","docs\u002Fshield-base\u002F01.cli",{"title":426,"path":726,"stem":727,"children":728},"\u002Fdocs\u002Fshield-base\u002Fdata-sources","docs\u002Fshield-base\u002F02.data-sources\u002Findex",[729,730,734,738,742,746,750,754,758,762],{"title":426,"path":726,"stem":727},{"title":731,"path":732,"stem":733},"BGP \u002F ASN","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fbgp","docs\u002Fshield-base\u002F02.data-sources\u002Fbgp",{"title":735,"path":736,"stem":737},"City Geolocation","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fcity","docs\u002Fshield-base\u002F02.data-sources\u002Fcity",{"title":739,"path":740,"stem":741},"Country Geolocation","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fcountry","docs\u002Fshield-base\u002F02.data-sources\u002Fcountry",{"title":743,"path":744,"stem":745},"Verified Crawlers","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fcrawlers","docs\u002Fshield-base\u002F02.data-sources\u002Fcrawlers",{"title":747,"path":748,"stem":749},"Disposable Emails","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Femail","docs\u002Fshield-base\u002F02.data-sources\u002Femail",{"title":751,"path":752,"stem":753},"FireHOL Threat Intelligence","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Ffirehol","docs\u002Fshield-base\u002F02.data-sources\u002Ffirehol",{"title":755,"path":756,"stem":757},"Proxy Detection","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fproxy","docs\u002Fshield-base\u002F02.data-sources\u002Fproxy",{"title":759,"path":760,"stem":761},"Tor Nodes","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Ftor","docs\u002Fshield-base\u002F02.data-sources\u002Ftor",{"title":763,"path":764,"stem":765},"Suspicious User-Agents","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fuseragent","docs\u002Fshield-base\u002F02.data-sources\u002Fuseragent",{"title":767,"path":768,"stem":769},"Programmatic Usage","\u002Fdocs\u002Fshield-base\u002Fusage","docs\u002Fshield-base\u002F03.usage",{"title":771,"path":772,"stem":773},"Custom Data Sources","\u002Fdocs\u002Fshield-base\u002Fcustom-data-sources","docs\u002Fshield-base\u002F04.custom-data-sources",{"title":775,"path":776,"stem":777},"TypeScript Types","\u002Fdocs\u002Fshield-base\u002Ftypes","docs\u002Fshield-base\u002F05.types",{"title":393,"path":779,"stem":780},"\u002Fdocs\u002Fshield-base\u002Fapi","docs\u002Fshield-base\u002F06.api",{"title":70,"path":48,"stem":71,"children":782},[783,784,789,798,823],{"title":70,"path":48,"stem":71},{"title":75,"path":76,"stem":77,"children":785,"page":53},[786,787,788],{"title":80,"path":81,"stem":82},{"title":84,"path":85,"stem":86},{"title":88,"path":89,"stem":90},{"title":92,"path":93,"stem":94,"children":790,"page":53},[791,792,793,794,795,796,797],{"title":97,"path":98,"stem":99},{"title":101,"path":102,"stem":103},{"title":105,"path":106,"stem":107},{"title":109,"path":110,"stem":111},{"title":113,"path":114,"stem":115},{"title":117,"path":118,"stem":119},{"title":121,"path":122,"stem":123},{"title":125,"path":126,"stem":127,"children":799,"page":53},[800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822],{"title":130,"path":131,"stem":132},{"title":134,"path":135,"stem":136},{"title":138,"path":139,"stem":140},{"title":142,"path":143,"stem":144},{"title":146,"path":147,"stem":148},{"title":150,"path":151,"stem":152},{"title":154,"path":155,"stem":156},{"title":158,"path":159,"stem":160},{"title":162,"path":163,"stem":164},{"title":166,"path":167,"stem":168},{"title":170,"path":171,"stem":172},{"title":174,"path":175,"stem":176},{"title":178,"path":179,"stem":180},{"title":182,"path":183,"stem":184},{"title":186,"path":187,"stem":188},{"title":190,"path":191,"stem":192},{"title":194,"path":195,"stem":196},{"title":198,"path":199,"stem":200},{"title":202,"path":203,"stem":204},{"title":206,"path":207,"stem":208},{"title":210,"path":211,"stem":212},{"title":214,"path":215,"stem":216},{"title":218,"path":219,"stem":220},{"title":222,"path":223,"stem":224,"children":824},[825,826,827,828,829,830,831,832,833,834],{"title":222,"path":223,"stem":224},{"title":228,"path":229,"stem":230},{"title":232,"path":233,"stem":234},{"title":236,"path":237,"stem":238},{"title":240,"path":241,"stem":242},{"title":244,"path":245,"stem":246},{"title":248,"path":249,"stem":250},{"title":252,"path":253,"stem":254},{"title":256,"path":257,"stem":258},{"title":260,"path":261,"stem":262},{"id":4,"extension":5,"links":836,"meta":847,"stem":62,"__hash__":63},[837,845,846],{"nested":8,"label":9,"icon":10,"to":11,"children":838},[839,840,841,842,843,844],{"label":14,"icon":15,"to":11,"description":16,"github":17,"badge":18},{"label":20,"icon":21,"to":22,"description":23,"github":24,"badge":25},{"label":27,"icon":28,"to":29,"description":30,"github":31,"badge":25},{"label":33,"icon":34,"to":35,"description":36,"github":37,"badge":38},{"label":40,"icon":41,"to":42,"description":43,"github":44,"badge":38},{"label":46,"icon":47,"to":48,"description":49,"github":50,"badge":51},{"nested":53,"label":54,"icon":55,"to":56},{"nested":53,"label":58,"icon":59,"to":60},{},{"id":849,"title":121,"body":850,"description":1890,"extension":1891,"icon":1892,"meta":1893,"module":1894,"navigation":8,"path":122,"rawbody":1895,"seo":1896,"stem":123,"__hash__":1897},"docs\u002Fdocs\u002Futils\u002Fserver\u002FuploadCsv.md",{"type":851,"value":852,"toc":1881},"minimark",[853,873,884,921,926,1114,1118,1255,1259,1262,1595,1598,1782,1786,1864,1877],[854,855,856,857,860,861,864,865,868,869,872],"p",{},"The ",[858,859,121],"code",{}," utility bulk loads a CSV file into a MySQL or PostgreSQL table using each database's native bulk-load mechanism. For MySQL it issues a ",[858,862,863],{},"LOAD DATA LOCAL INFILE"," statement; for PostgreSQL it uses ",[858,866,867],{},"COPY ... FROM",". Both paths return a standardized ",[858,870,871],{},"Results"," object so the caller handles success and failure uniformly.",[854,874,875,876,879,880,883],{},"An optional ",[858,877,878],{},"limit"," parameter restricts how many data rows are inserted. When specified, the function streams the file through Node.js ",[858,881,882],{},"readline"," to slice it. No Unix shell tools are required, so this works on all platforms including Windows.",[885,886,889,908],"callout",{"color":887,"icon":888},"error","i-lucide-alert-triangle",[854,890,891,895,896,899,900,903,904,907],{},[892,893,894],"strong",{},"MySQL",": The ",[858,897,898],{},"mysql2\u002Fpromise"," pool ",[892,901,902],{},"must"," be configured with ",[858,905,906],{},"flags: ['+LOCAL_FILES']"," or the query will hang indefinitely.",[854,909,910,913,914,917,918,920],{},[892,911,912],{},"PostgreSQL",": The database user requires the ",[858,915,916],{},"pg_read_server_files"," privilege for the ",[858,919,867],{}," command.",[922,923,925],"h2",{"id":924},"definition","Definition",[927,928,934],"pre",{"className":929,"code":930,"filename":931,"language":932,"meta":933,"style":933},"language-ts shiki shiki-themes light-plus light-plus dracula","import type { Results } from '@riavzon\u002Futils'\n\nexport async function uploadCsv(\n  paths: string,\n  tableName: string,\n  pool: unknown,\n  dialect: 'mysql' | 'pg',\n  limit?: number,\n  timeoutMs?: number\n): Promise\u003CResults>\n","uploadCsv.ts","ts","",[858,935,936,972,978,998,1016,1028,1041,1069,1083,1094],{"__ignoreMap":933},[937,938,941,945,948,952,955,958,961,965,969],"span",{"class":939,"line":940},"line",1,[937,942,944],{"class":943},"sZ328","import",[937,946,947],{"class":943}," type",[937,949,951],{"class":950},"sDd4n"," { ",[937,953,871],{"class":954},"sjsA6",[937,956,957],{"class":950}," } ",[937,959,960],{"class":943},"from",[937,962,964],{"class":963},"sFkSl"," '",[937,966,968],{"class":967},"sFB1V","@riavzon\u002Futils",[937,970,971],{"class":963},"'\n",[937,973,975],{"class":939,"line":974},2,[937,976,977],{"emptyLinePlaceholder":8},"\n",[937,979,981,984,988,991,995],{"class":939,"line":980},3,[937,982,983],{"class":943},"export",[937,985,987],{"class":986},"sl46w"," async",[937,989,990],{"class":986}," function",[937,992,994],{"class":993},"sHOzp"," uploadCsv",[937,996,997],{"class":950},"(\n",[937,999,1001,1005,1009,1013],{"class":939,"line":1000},4,[937,1002,1004],{"class":1003},"sygFZ","  paths",[937,1006,1008],{"class":1007},"saOXh",":",[937,1010,1012],{"class":1011},"sFs1U"," string",[937,1014,1015],{"class":950},",\n",[937,1017,1019,1022,1024,1026],{"class":939,"line":1018},5,[937,1020,1021],{"class":1003},"  tableName",[937,1023,1008],{"class":1007},[937,1025,1012],{"class":1011},[937,1027,1015],{"class":950},[937,1029,1031,1034,1036,1039],{"class":939,"line":1030},6,[937,1032,1033],{"class":1003},"  pool",[937,1035,1008],{"class":1007},[937,1037,1038],{"class":1011}," unknown",[937,1040,1015],{"class":950},[937,1042,1044,1047,1049,1051,1054,1057,1060,1062,1065,1067],{"class":939,"line":1043},7,[937,1045,1046],{"class":1003},"  dialect",[937,1048,1008],{"class":1007},[937,1050,964],{"class":963},[937,1052,1053],{"class":967},"mysql",[937,1055,1056],{"class":963},"'",[937,1058,1059],{"class":1007}," |",[937,1061,964],{"class":963},[937,1063,1064],{"class":967},"pg",[937,1066,1056],{"class":963},[937,1068,1015],{"class":950},[937,1070,1072,1075,1078,1081],{"class":939,"line":1071},8,[937,1073,1074],{"class":1003},"  limit",[937,1076,1077],{"class":1007},"?:",[937,1079,1080],{"class":1011}," number",[937,1082,1015],{"class":950},[937,1084,1086,1089,1091],{"class":939,"line":1085},9,[937,1087,1088],{"class":1003},"  timeoutMs",[937,1090,1077],{"class":1007},[937,1092,1093],{"class":1011}," number\n",[937,1095,1097,1100,1102,1105,1108,1111],{"class":939,"line":1096},10,[937,1098,1099],{"class":950},")",[937,1101,1008],{"class":1007},[937,1103,1104],{"class":1011}," Promise",[937,1106,1107],{"class":950},"\u003C",[937,1109,871],{"class":1110},"sW-rI",[937,1112,1113],{"class":950},">\n",[922,1115,1117],{"id":1116},"parameters","Parameters",[1119,1120,1121,1140],"table",{},[1122,1123,1124],"thead",{},[1125,1126,1127,1131,1134,1137],"tr",{},[1128,1129,1130],"th",{},"Parameter",[1128,1132,1133],{},"Type",[1128,1135,1136],{},"Required",[1128,1138,1139],{},"Description",[1141,1142,1143,1166,1182,1205,1222,1239],"tbody",{},[1125,1144,1145,1151,1156,1159],{},[1146,1147,1148],"td",{},[858,1149,1150],{},"paths",[1146,1152,1153],{},[858,1154,1155],{},"string",[1146,1157,1158],{},"Yes",[1146,1160,1161,1162,1165],{},"Relative or absolute path to the CSV file. Resolves from ",[858,1163,1164],{},"process.cwd()",".",[1125,1167,1168,1173,1177,1179],{},[1146,1169,1170],{},[858,1171,1172],{},"tableName",[1146,1174,1175],{},[858,1176,1155],{},[1146,1178,1158],{},[1146,1180,1181],{},"The exact name of the target database table.",[1125,1183,1184,1189,1194,1196],{},[1146,1185,1186],{},[858,1187,1188],{},"pool",[1146,1190,1191],{},[858,1192,1193],{},"unknown",[1146,1195,1158],{},[1146,1197,1198,1199,1201,1202,1204],{},"A configured ",[858,1200,898],{}," or ",[858,1203,1064],{}," connection pool.",[1125,1206,1207,1212,1217,1219],{},[1146,1208,1209],{},[858,1210,1211],{},"dialect",[1146,1213,1214],{},[858,1215,1216],{},"'mysql' | 'pg'",[1146,1218,1158],{},[1146,1220,1221],{},"The database dialect to use for the bulk-load command.",[1125,1223,1224,1228,1233,1236],{},[1146,1225,1226],{},[858,1227,878],{},[1146,1229,1230],{},[858,1231,1232],{},"number",[1146,1234,1235],{},"No",[1146,1237,1238],{},"Maximum number of data rows to insert (header row excluded).",[1125,1240,1241,1246,1250,1252],{},[1146,1242,1243],{},[858,1244,1245],{},"timeoutMs",[1146,1247,1248],{},[858,1249,1232],{},[1146,1251,1235],{},[1146,1253,1254],{},"Abort the upload after this many milliseconds.",[922,1256,1258],{"id":1257},"example-usage","Example Usage",[1260,1261,894],"h3",{"id":1053},[927,1263,1266],{"className":929,"code":1264,"filename":1265,"language":932,"meta":933,"style":933},"import { uploadCsv } from '@riavzon\u002Futils\u002Fserver'\nimport mysql from 'mysql2\u002Fpromise'\n\nconst pool = mysql.createPool({\n  host: process.env.DB_HOST,\n  user: process.env.DB_USER,\n  password: process.env.DB_PASSWORD,\n  database: process.env.DB_NAME,\n  \u002F\u002F Required for LOAD DATA LOCAL INFILE\n  flags: ['+LOCAL_FILES'],\n})\n \nconst result = await uploadCsv('.\u002Fseed\u002Frecords.csv', 'records', pool, 'mysql')\n\nif (result.ok) {\n  console.log('Upload successful')\n} else {\n  console.error('Upload failed:', result.reason)\n}\n","db\u002Fseed.ts",[858,1267,1268,1287,1303,1307,1329,1353,1373,1393,1413,1419,1439,1445,1451,1501,1506,1526,1548,1560,1589],{"__ignoreMap":933},[937,1269,1270,1272,1274,1276,1278,1280,1282,1285],{"class":939,"line":940},[937,1271,944],{"class":943},[937,1273,951],{"class":950},[937,1275,121],{"class":954},[937,1277,957],{"class":950},[937,1279,960],{"class":943},[937,1281,964],{"class":963},[937,1283,1284],{"class":967},"@riavzon\u002Futils\u002Fserver",[937,1286,971],{"class":963},[937,1288,1289,1291,1294,1297,1299,1301],{"class":939,"line":974},[937,1290,944],{"class":943},[937,1292,1293],{"class":954}," mysql",[937,1295,1296],{"class":943}," from",[937,1298,964],{"class":963},[937,1300,898],{"class":967},[937,1302,971],{"class":963},[937,1304,1305],{"class":939,"line":980},[937,1306,977],{"emptyLinePlaceholder":8},[937,1308,1309,1312,1316,1319,1321,1323,1326],{"class":939,"line":1000},[937,1310,1311],{"class":986},"const",[937,1313,1315],{"class":1314},"s3JHE"," pool",[937,1317,1318],{"class":1007}," =",[937,1320,1293],{"class":954},[937,1322,1165],{"class":950},[937,1324,1325],{"class":993},"createPool",[937,1327,1328],{"class":950},"({\n",[937,1330,1331,1334,1337,1340,1342,1345,1347,1351],{"class":939,"line":1018},[937,1332,1333],{"class":954},"  host",[937,1335,1008],{"class":1336},"s34zl",[937,1338,1339],{"class":954}," process",[937,1341,1165],{"class":950},[937,1343,1344],{"class":954},"env",[937,1346,1165],{"class":950},[937,1348,1350],{"class":1349},"sPzPf","DB_HOST",[937,1352,1015],{"class":950},[937,1354,1355,1358,1360,1362,1364,1366,1368,1371],{"class":939,"line":1030},[937,1356,1357],{"class":954},"  user",[937,1359,1008],{"class":1336},[937,1361,1339],{"class":954},[937,1363,1165],{"class":950},[937,1365,1344],{"class":954},[937,1367,1165],{"class":950},[937,1369,1370],{"class":1349},"DB_USER",[937,1372,1015],{"class":950},[937,1374,1375,1378,1380,1382,1384,1386,1388,1391],{"class":939,"line":1043},[937,1376,1377],{"class":954},"  password",[937,1379,1008],{"class":1336},[937,1381,1339],{"class":954},[937,1383,1165],{"class":950},[937,1385,1344],{"class":954},[937,1387,1165],{"class":950},[937,1389,1390],{"class":1349},"DB_PASSWORD",[937,1392,1015],{"class":950},[937,1394,1395,1398,1400,1402,1404,1406,1408,1411],{"class":939,"line":1071},[937,1396,1397],{"class":954},"  database",[937,1399,1008],{"class":1336},[937,1401,1339],{"class":954},[937,1403,1165],{"class":950},[937,1405,1344],{"class":954},[937,1407,1165],{"class":950},[937,1409,1410],{"class":1349},"DB_NAME",[937,1412,1015],{"class":950},[937,1414,1415],{"class":939,"line":1085},[937,1416,1418],{"class":1417},"sghk6","  \u002F\u002F Required for LOAD DATA LOCAL INFILE\n",[937,1420,1421,1424,1426,1429,1431,1434,1436],{"class":939,"line":1096},[937,1422,1423],{"class":954},"  flags",[937,1425,1008],{"class":1336},[937,1427,1428],{"class":950}," [",[937,1430,1056],{"class":963},[937,1432,1433],{"class":967},"+LOCAL_FILES",[937,1435,1056],{"class":963},[937,1437,1438],{"class":950},"],\n",[937,1440,1442],{"class":939,"line":1441},11,[937,1443,1444],{"class":950},"})\n",[937,1446,1448],{"class":939,"line":1447},12,[937,1449,1450],{"class":950}," \n",[937,1452,1454,1456,1459,1461,1464,1466,1469,1471,1474,1476,1479,1481,1484,1486,1488,1490,1492,1494,1496,1498],{"class":939,"line":1453},13,[937,1455,1311],{"class":986},[937,1457,1458],{"class":1314}," result",[937,1460,1318],{"class":1007},[937,1462,1463],{"class":943}," await",[937,1465,994],{"class":993},[937,1467,1468],{"class":950},"(",[937,1470,1056],{"class":963},[937,1472,1473],{"class":967},".\u002Fseed\u002Frecords.csv",[937,1475,1056],{"class":963},[937,1477,1478],{"class":950},", ",[937,1480,1056],{"class":963},[937,1482,1483],{"class":967},"records",[937,1485,1056],{"class":963},[937,1487,1478],{"class":950},[937,1489,1188],{"class":954},[937,1491,1478],{"class":950},[937,1493,1056],{"class":963},[937,1495,1053],{"class":967},[937,1497,1056],{"class":963},[937,1499,1500],{"class":950},")\n",[937,1502,1504],{"class":939,"line":1503},14,[937,1505,977],{"emptyLinePlaceholder":8},[937,1507,1509,1512,1515,1518,1520,1523],{"class":939,"line":1508},15,[937,1510,1511],{"class":943},"if",[937,1513,1514],{"class":950}," (",[937,1516,1517],{"class":954},"result",[937,1519,1165],{"class":950},[937,1521,1522],{"class":954},"ok",[937,1524,1525],{"class":950},") {\n",[937,1527,1529,1532,1534,1537,1539,1541,1544,1546],{"class":939,"line":1528},16,[937,1530,1531],{"class":954},"  console",[937,1533,1165],{"class":950},[937,1535,1536],{"class":993},"log",[937,1538,1468],{"class":950},[937,1540,1056],{"class":963},[937,1542,1543],{"class":967},"Upload successful",[937,1545,1056],{"class":963},[937,1547,1500],{"class":950},[937,1549,1551,1554,1557],{"class":939,"line":1550},17,[937,1552,1553],{"class":950},"} ",[937,1555,1556],{"class":943},"else",[937,1558,1559],{"class":950}," {\n",[937,1561,1563,1565,1567,1569,1571,1573,1576,1578,1580,1582,1584,1587],{"class":939,"line":1562},18,[937,1564,1531],{"class":954},[937,1566,1165],{"class":950},[937,1568,887],{"class":993},[937,1570,1468],{"class":950},[937,1572,1056],{"class":963},[937,1574,1575],{"class":967},"Upload failed:",[937,1577,1056],{"class":963},[937,1579,1478],{"class":950},[937,1581,1517],{"class":954},[937,1583,1165],{"class":950},[937,1585,1586],{"class":954},"reason",[937,1588,1500],{"class":950},[937,1590,1592],{"class":939,"line":1591},19,[937,1593,1594],{"class":950},"}\n",[1260,1596,912],{"id":1597},"postgresql",[927,1599,1601],{"className":929,"code":1600,"filename":1265,"language":932,"meta":933,"style":933},"import { uploadCsv } from '@riavzon\u002Futils\u002Fserver'\nimport { Pool } from 'pg'\n\nconst pool = new Pool({\n  connectionString: process.env.DATABASE_URL,\n})\n\nconst result = await uploadCsv('.\u002Fseed\u002Frecords.csv', 'records', pool, 'pg')\n\nif (!result.ok) {\n  console.error('Upload failed:', result.reason)\n}\n",[858,1602,1603,1621,1640,1644,1661,1681,1685,1689,1731,1735,1752,1778],{"__ignoreMap":933},[937,1604,1605,1607,1609,1611,1613,1615,1617,1619],{"class":939,"line":940},[937,1606,944],{"class":943},[937,1608,951],{"class":950},[937,1610,121],{"class":954},[937,1612,957],{"class":950},[937,1614,960],{"class":943},[937,1616,964],{"class":963},[937,1618,1284],{"class":967},[937,1620,971],{"class":963},[937,1622,1623,1625,1627,1630,1632,1634,1636,1638],{"class":939,"line":974},[937,1624,944],{"class":943},[937,1626,951],{"class":950},[937,1628,1629],{"class":954},"Pool",[937,1631,957],{"class":950},[937,1633,960],{"class":943},[937,1635,964],{"class":963},[937,1637,1064],{"class":967},[937,1639,971],{"class":963},[937,1641,1642],{"class":939,"line":980},[937,1643,977],{"emptyLinePlaceholder":8},[937,1645,1646,1648,1650,1652,1656,1659],{"class":939,"line":1000},[937,1647,1311],{"class":986},[937,1649,1315],{"class":1314},[937,1651,1318],{"class":1007},[937,1653,1655],{"class":1654},"sakC6"," new",[937,1657,1658],{"class":993}," Pool",[937,1660,1328],{"class":950},[937,1662,1663,1666,1668,1670,1672,1674,1676,1679],{"class":939,"line":1018},[937,1664,1665],{"class":954},"  connectionString",[937,1667,1008],{"class":1336},[937,1669,1339],{"class":954},[937,1671,1165],{"class":950},[937,1673,1344],{"class":954},[937,1675,1165],{"class":950},[937,1677,1678],{"class":1349},"DATABASE_URL",[937,1680,1015],{"class":950},[937,1682,1683],{"class":939,"line":1030},[937,1684,1444],{"class":950},[937,1686,1687],{"class":939,"line":1043},[937,1688,977],{"emptyLinePlaceholder":8},[937,1690,1691,1693,1695,1697,1699,1701,1703,1705,1707,1709,1711,1713,1715,1717,1719,1721,1723,1725,1727,1729],{"class":939,"line":1071},[937,1692,1311],{"class":986},[937,1694,1458],{"class":1314},[937,1696,1318],{"class":1007},[937,1698,1463],{"class":943},[937,1700,994],{"class":993},[937,1702,1468],{"class":950},[937,1704,1056],{"class":963},[937,1706,1473],{"class":967},[937,1708,1056],{"class":963},[937,1710,1478],{"class":950},[937,1712,1056],{"class":963},[937,1714,1483],{"class":967},[937,1716,1056],{"class":963},[937,1718,1478],{"class":950},[937,1720,1188],{"class":954},[937,1722,1478],{"class":950},[937,1724,1056],{"class":963},[937,1726,1064],{"class":967},[937,1728,1056],{"class":963},[937,1730,1500],{"class":950},[937,1732,1733],{"class":939,"line":1085},[937,1734,977],{"emptyLinePlaceholder":8},[937,1736,1737,1739,1741,1744,1746,1748,1750],{"class":939,"line":1096},[937,1738,1511],{"class":943},[937,1740,1514],{"class":950},[937,1742,1743],{"class":1007},"!",[937,1745,1517],{"class":954},[937,1747,1165],{"class":950},[937,1749,1522],{"class":954},[937,1751,1525],{"class":950},[937,1753,1754,1756,1758,1760,1762,1764,1766,1768,1770,1772,1774,1776],{"class":939,"line":1441},[937,1755,1531],{"class":954},[937,1757,1165],{"class":950},[937,1759,887],{"class":993},[937,1761,1468],{"class":950},[937,1763,1056],{"class":963},[937,1765,1575],{"class":967},[937,1767,1056],{"class":963},[937,1769,1478],{"class":950},[937,1771,1517],{"class":954},[937,1773,1165],{"class":950},[937,1775,1586],{"class":954},[937,1777,1500],{"class":950},[937,1779,1780],{"class":939,"line":1447},[937,1781,1594],{"class":950},[1260,1783,1785],{"id":1784},"with-row-limit-and-timeout","With Row Limit and Timeout",[927,1787,1789],{"className":929,"code":1788,"filename":1265,"language":932,"meta":933,"style":933},"\u002F\u002F Insert at most 500 rows, abort if the upload takes longer than 20 seconds.\nconst result = await uploadCsv(\n  '.\u002Fseed\u002Frecords.csv',\n  'records',\n  pool,\n  'pg',\n  500,\n  20_000\n)\n",[858,1790,1791,1796,1810,1821,1831,1837,1847,1855,1860],{"__ignoreMap":933},[937,1792,1793],{"class":939,"line":940},[937,1794,1795],{"class":1417},"\u002F\u002F Insert at most 500 rows, abort if the upload takes longer than 20 seconds.\n",[937,1797,1798,1800,1802,1804,1806,1808],{"class":939,"line":974},[937,1799,1311],{"class":986},[937,1801,1458],{"class":1314},[937,1803,1318],{"class":1007},[937,1805,1463],{"class":943},[937,1807,994],{"class":993},[937,1809,997],{"class":950},[937,1811,1812,1815,1817,1819],{"class":939,"line":980},[937,1813,1814],{"class":963},"  '",[937,1816,1473],{"class":967},[937,1818,1056],{"class":963},[937,1820,1015],{"class":950},[937,1822,1823,1825,1827,1829],{"class":939,"line":1000},[937,1824,1814],{"class":963},[937,1826,1483],{"class":967},[937,1828,1056],{"class":963},[937,1830,1015],{"class":950},[937,1832,1833,1835],{"class":939,"line":1018},[937,1834,1033],{"class":954},[937,1836,1015],{"class":950},[937,1838,1839,1841,1843,1845],{"class":939,"line":1030},[937,1840,1814],{"class":963},[937,1842,1064],{"class":967},[937,1844,1056],{"class":963},[937,1846,1015],{"class":950},[937,1848,1849,1853],{"class":939,"line":1043},[937,1850,1852],{"class":1851},"spgvN","  500",[937,1854,1015],{"class":950},[937,1856,1857],{"class":939,"line":1071},[937,1858,1859],{"class":1851},"  20_000\n",[937,1861,1862],{"class":939,"line":1085},[937,1863,1500],{"class":950},[885,1865,1868],{"color":1866,"icon":1867},"info","i-lucide-info",[854,1869,1870,1871,1873,1874,1876],{},"When ",[858,1872,878],{}," is set, the file is sliced in memory using Node.js ",[858,1875,882],{},". No Unix shell commands are invoked, making this fully cross-platform.",[1878,1879,1880],"style",{},"html pre.shiki code .sZ328, html code.shiki .sZ328{--shiki-light:#AF00DB;--shiki-default:#AF00DB;--shiki-dark:#FF79C6}html pre.shiki code .sDd4n, html code.shiki .sDd4n{--shiki-light:#000000;--shiki-default:#000000;--shiki-dark:#F8F8F2}html pre.shiki code .sjsA6, html code.shiki .sjsA6{--shiki-light:#001080;--shiki-default:#001080;--shiki-dark:#F8F8F2}html pre.shiki code .sFkSl, html code.shiki .sFkSl{--shiki-light:#A31515;--shiki-default:#A31515;--shiki-dark:#E9F284}html pre.shiki code .sFB1V, html code.shiki .sFB1V{--shiki-light:#A31515;--shiki-default:#A31515;--shiki-dark:#F1FA8C}html pre.shiki code .sl46w, html code.shiki .sl46w{--shiki-light:#0000FF;--shiki-default:#0000FF;--shiki-dark:#FF79C6}html pre.shiki code .sHOzp, html code.shiki .sHOzp{--shiki-light:#795E26;--shiki-default:#795E26;--shiki-dark:#50FA7B}html pre.shiki code .sygFZ, html code.shiki .sygFZ{--shiki-light:#001080;--shiki-light-font-style:inherit;--shiki-default:#001080;--shiki-default-font-style:inherit;--shiki-dark:#FFB86C;--shiki-dark-font-style:italic}html pre.shiki code .saOXh, html code.shiki .saOXh{--shiki-light:#000000;--shiki-default:#000000;--shiki-dark:#FF79C6}html pre.shiki code .sFs1U, html code.shiki .sFs1U{--shiki-light:#267F99;--shiki-light-font-style:inherit;--shiki-default:#267F99;--shiki-default-font-style:inherit;--shiki-dark:#8BE9FD;--shiki-dark-font-style:italic}html pre.shiki code .sW-rI, html code.shiki .sW-rI{--shiki-light:#267F99;--shiki-light-font-style:inherit;--shiki-default:#267F99;--shiki-default-font-style:inherit;--shiki-dark:#FFB86C;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s3JHE, html code.shiki .s3JHE{--shiki-light:#0070C1;--shiki-default:#0070C1;--shiki-dark:#F8F8F2}html pre.shiki code .s34zl, html code.shiki .s34zl{--shiki-light:#001080;--shiki-default:#001080;--shiki-dark:#FF79C6}html pre.shiki code .sPzPf, html code.shiki .sPzPf{--shiki-light:#0070C1;--shiki-default:#0070C1;--shiki-dark:#BD93F9}html pre.shiki code .sghk6, html code.shiki .sghk6{--shiki-light:#008000;--shiki-default:#008000;--shiki-dark:#6272A4}html pre.shiki code .sakC6, html code.shiki .sakC6{--shiki-light:#0000FF;--shiki-light-font-weight:inherit;--shiki-default:#0000FF;--shiki-default-font-weight:inherit;--shiki-dark:#FF79C6;--shiki-dark-font-weight:bold}html pre.shiki code .spgvN, html code.shiki .spgvN{--shiki-light:#098658;--shiki-default:#098658;--shiki-dark:#BD93F9}",{"title":933,"searchDepth":974,"depth":974,"links":1882},[1883,1884,1885],{"id":924,"depth":974,"text":925},{"id":1116,"depth":974,"text":1117},{"id":1257,"depth":974,"text":1258,"children":1886},[1887,1888,1889],{"id":1053,"depth":980,"text":894},{"id":1597,"depth":980,"text":912},{"id":1784,"depth":980,"text":1785},"Bulk loads data from a CSV file directly into a MySQL or PostgreSQL table using native database bulk-load commands.","md","i-lucide-database",{},null,"---\ntitle: uploadCsv\ndescription: Bulk loads data from a CSV file directly into a MySQL or PostgreSQL table using native database bulk-load commands.\nicon: i-lucide-database\n---\n\nThe `uploadCsv` utility bulk loads a CSV file into a MySQL or PostgreSQL table using each database's native bulk-load mechanism. For MySQL it issues a `LOAD DATA LOCAL INFILE` statement; for PostgreSQL it uses `COPY ... FROM`. Both paths return a standardized `Results` object so the caller handles success and failure uniformly.\n\nAn optional `limit` parameter restricts how many data rows are inserted. When specified, the function streams the file through Node.js `readline` to slice it. No Unix shell tools are required, so this works on all platforms including Windows.\n\n::callout{icon=\"i-lucide-alert-triangle\" color=\"error\"}\n**MySQL**: The `mysql2\u002Fpromise` pool **must** be configured with `flags: ['+LOCAL_FILES']` or the query will hang indefinitely.\n\n**PostgreSQL**: The database user requires the `pg_read_server_files` privilege for the `COPY ... FROM` command.\n::\n\n## Definition\n\n```ts [uploadCsv.ts]\nimport type { Results } from '@riavzon\u002Futils'\n\nexport async function uploadCsv(\n  paths: string,\n  tableName: string,\n  pool: unknown,\n  dialect: 'mysql' | 'pg',\n  limit?: number,\n  timeoutMs?: number\n): Promise\u003CResults>\n```\n\n## Parameters\n\n| Parameter | Type | Required | Description |\n| --- | --- | --- | --- |\n| `paths` | `string` | Yes | Relative or absolute path to the CSV file. Resolves from `process.cwd()`. |\n| `tableName` | `string` | Yes | The exact name of the target database table. |\n| `pool` | `unknown` | Yes | A configured `mysql2\u002Fpromise` or `pg` connection pool. |\n| `dialect` | `'mysql' \\| 'pg'` | Yes | The database dialect to use for the bulk-load command. |\n| `limit` | `number` | No | Maximum number of data rows to insert (header row excluded). |\n| `timeoutMs` | `number` | No | Abort the upload after this many milliseconds. |\n\n## Example Usage\n\n### MySQL\n\n```ts [db\u002Fseed.ts]\nimport { uploadCsv } from '@riavzon\u002Futils\u002Fserver'\nimport mysql from 'mysql2\u002Fpromise'\n\nconst pool = mysql.createPool({\n  host: process.env.DB_HOST,\n  user: process.env.DB_USER,\n  password: process.env.DB_PASSWORD,\n  database: process.env.DB_NAME,\n  \u002F\u002F Required for LOAD DATA LOCAL INFILE\n  flags: ['+LOCAL_FILES'],\n})\n \nconst result = await uploadCsv('.\u002Fseed\u002Frecords.csv', 'records', pool, 'mysql')\n\nif (result.ok) {\n  console.log('Upload successful')\n} else {\n  console.error('Upload failed:', result.reason)\n}\n```\n\n### PostgreSQL\n\n```ts [db\u002Fseed.ts]\nimport { uploadCsv } from '@riavzon\u002Futils\u002Fserver'\nimport { Pool } from 'pg'\n\nconst pool = new Pool({\n  connectionString: process.env.DATABASE_URL,\n})\n\nconst result = await uploadCsv('.\u002Fseed\u002Frecords.csv', 'records', pool, 'pg')\n\nif (!result.ok) {\n  console.error('Upload failed:', result.reason)\n}\n```\n\n### With Row Limit and Timeout\n\n```ts [db\u002Fseed.ts]\n\u002F\u002F Insert at most 500 rows, abort if the upload takes longer than 20 seconds.\nconst result = await uploadCsv(\n  '.\u002Fseed\u002Frecords.csv',\n  'records',\n  pool,\n  'pg',\n  500,\n  20_000\n)\n```\n\n::callout{icon=\"i-lucide-info\" color=\"info\"}\nWhen `limit` is set, the file is sliced in memory using Node.js `readline`. No Unix shell commands are invoked, making this fully cross-platform.\n::\n",{"title":121,"description":1890},"qydKcBaENWB_PuzhJq5GISl5pOTYNJfS0vl6LmSHSSU",[1899,1900],{"title":117,"path":118,"stem":119,"children":-1},{"title":130,"path":131,"stem":132,"children":-1},{"id":849,"title":121,"body":1902,"description":1890,"extension":1891,"icon":1892,"meta":2721,"module":1894,"navigation":8,"path":122,"rawbody":1895,"seo":2722,"stem":123,"__hash__":1897},{"type":851,"value":1903,"toc":2712},[1904,1914,1920,1940,1942,2066,2068,2174,2176,2178,2450,2452,2628,2630,2702,2710],[854,1905,856,1906,860,1908,864,1910,868,1912,872],{},[858,1907,121],{},[858,1909,863],{},[858,1911,867],{},[858,1913,871],{},[854,1915,875,1916,879,1918,883],{},[858,1917,878],{},[858,1919,882],{},[885,1921,1922,1932],{"color":887,"icon":888},[854,1923,1924,895,1926,899,1928,903,1930,907],{},[892,1925,894],{},[858,1927,898],{},[892,1929,902],{},[858,1931,906],{},[854,1933,1934,913,1936,917,1938,920],{},[892,1935,912],{},[858,1937,916],{},[858,1939,867],{},[922,1941,925],{"id":924},[927,1943,1944],{"className":929,"code":930,"filename":931,"language":932,"meta":933,"style":933},[858,1945,1946,1966,1970,1982,1992,2002,2012,2034,2044,2052],{"__ignoreMap":933},[937,1947,1948,1950,1952,1954,1956,1958,1960,1962,1964],{"class":939,"line":940},[937,1949,944],{"class":943},[937,1951,947],{"class":943},[937,1953,951],{"class":950},[937,1955,871],{"class":954},[937,1957,957],{"class":950},[937,1959,960],{"class":943},[937,1961,964],{"class":963},[937,1963,968],{"class":967},[937,1965,971],{"class":963},[937,1967,1968],{"class":939,"line":974},[937,1969,977],{"emptyLinePlaceholder":8},[937,1971,1972,1974,1976,1978,1980],{"class":939,"line":980},[937,1973,983],{"class":943},[937,1975,987],{"class":986},[937,1977,990],{"class":986},[937,1979,994],{"class":993},[937,1981,997],{"class":950},[937,1983,1984,1986,1988,1990],{"class":939,"line":1000},[937,1985,1004],{"class":1003},[937,1987,1008],{"class":1007},[937,1989,1012],{"class":1011},[937,1991,1015],{"class":950},[937,1993,1994,1996,1998,2000],{"class":939,"line":1018},[937,1995,1021],{"class":1003},[937,1997,1008],{"class":1007},[937,1999,1012],{"class":1011},[937,2001,1015],{"class":950},[937,2003,2004,2006,2008,2010],{"class":939,"line":1030},[937,2005,1033],{"class":1003},[937,2007,1008],{"class":1007},[937,2009,1038],{"class":1011},[937,2011,1015],{"class":950},[937,2013,2014,2016,2018,2020,2022,2024,2026,2028,2030,2032],{"class":939,"line":1043},[937,2015,1046],{"class":1003},[937,2017,1008],{"class":1007},[937,2019,964],{"class":963},[937,2021,1053],{"class":967},[937,2023,1056],{"class":963},[937,2025,1059],{"class":1007},[937,2027,964],{"class":963},[937,2029,1064],{"class":967},[937,2031,1056],{"class":963},[937,2033,1015],{"class":950},[937,2035,2036,2038,2040,2042],{"class":939,"line":1071},[937,2037,1074],{"class":1003},[937,2039,1077],{"class":1007},[937,2041,1080],{"class":1011},[937,2043,1015],{"class":950},[937,2045,2046,2048,2050],{"class":939,"line":1085},[937,2047,1088],{"class":1003},[937,2049,1077],{"class":1007},[937,2051,1093],{"class":1011},[937,2053,2054,2056,2058,2060,2062,2064],{"class":939,"line":1096},[937,2055,1099],{"class":950},[937,2057,1008],{"class":1007},[937,2059,1104],{"class":1011},[937,2061,1107],{"class":950},[937,2063,871],{"class":1110},[937,2065,1113],{"class":950},[922,2067,1117],{"id":1116},[1119,2069,2070,2082],{},[1122,2071,2072],{},[1125,2073,2074,2076,2078,2080],{},[1128,2075,1130],{},[1128,2077,1133],{},[1128,2079,1136],{},[1128,2081,1139],{},[1141,2083,2084,2100,2114,2132,2146,2160],{},[1125,2085,2086,2090,2094,2096],{},[1146,2087,2088],{},[858,2089,1150],{},[1146,2091,2092],{},[858,2093,1155],{},[1146,2095,1158],{},[1146,2097,1161,2098,1165],{},[858,2099,1164],{},[1125,2101,2102,2106,2110,2112],{},[1146,2103,2104],{},[858,2105,1172],{},[1146,2107,2108],{},[858,2109,1155],{},[1146,2111,1158],{},[1146,2113,1181],{},[1125,2115,2116,2120,2124,2126],{},[1146,2117,2118],{},[858,2119,1188],{},[1146,2121,2122],{},[858,2123,1193],{},[1146,2125,1158],{},[1146,2127,1198,2128,1201,2130,1204],{},[858,2129,898],{},[858,2131,1064],{},[1125,2133,2134,2138,2142,2144],{},[1146,2135,2136],{},[858,2137,1211],{},[1146,2139,2140],{},[858,2141,1216],{},[1146,2143,1158],{},[1146,2145,1221],{},[1125,2147,2148,2152,2156,2158],{},[1146,2149,2150],{},[858,2151,878],{},[1146,2153,2154],{},[858,2155,1232],{},[1146,2157,1235],{},[1146,2159,1238],{},[1125,2161,2162,2166,2170,2172],{},[1146,2163,2164],{},[858,2165,1245],{},[1146,2167,2168],{},[858,2169,1232],{},[1146,2171,1235],{},[1146,2173,1254],{},[922,2175,1258],{"id":1257},[1260,2177,894],{"id":1053},[927,2179,2180],{"className":929,"code":1264,"filename":1265,"language":932,"meta":933,"style":933},[858,2181,2182,2200,2214,2218,2234,2252,2270,2288,2306,2310,2326,2330,2334,2376,2380,2394,2412,2420,2446],{"__ignoreMap":933},[937,2183,2184,2186,2188,2190,2192,2194,2196,2198],{"class":939,"line":940},[937,2185,944],{"class":943},[937,2187,951],{"class":950},[937,2189,121],{"class":954},[937,2191,957],{"class":950},[937,2193,960],{"class":943},[937,2195,964],{"class":963},[937,2197,1284],{"class":967},[937,2199,971],{"class":963},[937,2201,2202,2204,2206,2208,2210,2212],{"class":939,"line":974},[937,2203,944],{"class":943},[937,2205,1293],{"class":954},[937,2207,1296],{"class":943},[937,2209,964],{"class":963},[937,2211,898],{"class":967},[937,2213,971],{"class":963},[937,2215,2216],{"class":939,"line":980},[937,2217,977],{"emptyLinePlaceholder":8},[937,2219,2220,2222,2224,2226,2228,2230,2232],{"class":939,"line":1000},[937,2221,1311],{"class":986},[937,2223,1315],{"class":1314},[937,2225,1318],{"class":1007},[937,2227,1293],{"class":954},[937,2229,1165],{"class":950},[937,2231,1325],{"class":993},[937,2233,1328],{"class":950},[937,2235,2236,2238,2240,2242,2244,2246,2248,2250],{"class":939,"line":1018},[937,2237,1333],{"class":954},[937,2239,1008],{"class":1336},[937,2241,1339],{"class":954},[937,2243,1165],{"class":950},[937,2245,1344],{"class":954},[937,2247,1165],{"class":950},[937,2249,1350],{"class":1349},[937,2251,1015],{"class":950},[937,2253,2254,2256,2258,2260,2262,2264,2266,2268],{"class":939,"line":1030},[937,2255,1357],{"class":954},[937,2257,1008],{"class":1336},[937,2259,1339],{"class":954},[937,2261,1165],{"class":950},[937,2263,1344],{"class":954},[937,2265,1165],{"class":950},[937,2267,1370],{"class":1349},[937,2269,1015],{"class":950},[937,2271,2272,2274,2276,2278,2280,2282,2284,2286],{"class":939,"line":1043},[937,2273,1377],{"class":954},[937,2275,1008],{"class":1336},[937,2277,1339],{"class":954},[937,2279,1165],{"class":950},[937,2281,1344],{"class":954},[937,2283,1165],{"class":950},[937,2285,1390],{"class":1349},[937,2287,1015],{"class":950},[937,2289,2290,2292,2294,2296,2298,2300,2302,2304],{"class":939,"line":1071},[937,2291,1397],{"class":954},[937,2293,1008],{"class":1336},[937,2295,1339],{"class":954},[937,2297,1165],{"class":950},[937,2299,1344],{"class":954},[937,2301,1165],{"class":950},[937,2303,1410],{"class":1349},[937,2305,1015],{"class":950},[937,2307,2308],{"class":939,"line":1085},[937,2309,1418],{"class":1417},[937,2311,2312,2314,2316,2318,2320,2322,2324],{"class":939,"line":1096},[937,2313,1423],{"class":954},[937,2315,1008],{"class":1336},[937,2317,1428],{"class":950},[937,2319,1056],{"class":963},[937,2321,1433],{"class":967},[937,2323,1056],{"class":963},[937,2325,1438],{"class":950},[937,2327,2328],{"class":939,"line":1441},[937,2329,1444],{"class":950},[937,2331,2332],{"class":939,"line":1447},[937,2333,1450],{"class":950},[937,2335,2336,2338,2340,2342,2344,2346,2348,2350,2352,2354,2356,2358,2360,2362,2364,2366,2368,2370,2372,2374],{"class":939,"line":1453},[937,2337,1311],{"class":986},[937,2339,1458],{"class":1314},[937,2341,1318],{"class":1007},[937,2343,1463],{"class":943},[937,2345,994],{"class":993},[937,2347,1468],{"class":950},[937,2349,1056],{"class":963},[937,2351,1473],{"class":967},[937,2353,1056],{"class":963},[937,2355,1478],{"class":950},[937,2357,1056],{"class":963},[937,2359,1483],{"class":967},[937,2361,1056],{"class":963},[937,2363,1478],{"class":950},[937,2365,1188],{"class":954},[937,2367,1478],{"class":950},[937,2369,1056],{"class":963},[937,2371,1053],{"class":967},[937,2373,1056],{"class":963},[937,2375,1500],{"class":950},[937,2377,2378],{"class":939,"line":1503},[937,2379,977],{"emptyLinePlaceholder":8},[937,2381,2382,2384,2386,2388,2390,2392],{"class":939,"line":1508},[937,2383,1511],{"class":943},[937,2385,1514],{"class":950},[937,2387,1517],{"class":954},[937,2389,1165],{"class":950},[937,2391,1522],{"class":954},[937,2393,1525],{"class":950},[937,2395,2396,2398,2400,2402,2404,2406,2408,2410],{"class":939,"line":1528},[937,2397,1531],{"class":954},[937,2399,1165],{"class":950},[937,2401,1536],{"class":993},[937,2403,1468],{"class":950},[937,2405,1056],{"class":963},[937,2407,1543],{"class":967},[937,2409,1056],{"class":963},[937,2411,1500],{"class":950},[937,2413,2414,2416,2418],{"class":939,"line":1550},[937,2415,1553],{"class":950},[937,2417,1556],{"class":943},[937,2419,1559],{"class":950},[937,2421,2422,2424,2426,2428,2430,2432,2434,2436,2438,2440,2442,2444],{"class":939,"line":1562},[937,2423,1531],{"class":954},[937,2425,1165],{"class":950},[937,2427,887],{"class":993},[937,2429,1468],{"class":950},[937,2431,1056],{"class":963},[937,2433,1575],{"class":967},[937,2435,1056],{"class":963},[937,2437,1478],{"class":950},[937,2439,1517],{"class":954},[937,2441,1165],{"class":950},[937,2443,1586],{"class":954},[937,2445,1500],{"class":950},[937,2447,2448],{"class":939,"line":1591},[937,2449,1594],{"class":950},[1260,2451,912],{"id":1597},[927,2453,2454],{"className":929,"code":1600,"filename":1265,"language":932,"meta":933,"style":933},[858,2455,2456,2474,2492,2496,2510,2528,2532,2536,2578,2582,2598,2624],{"__ignoreMap":933},[937,2457,2458,2460,2462,2464,2466,2468,2470,2472],{"class":939,"line":940},[937,2459,944],{"class":943},[937,2461,951],{"class":950},[937,2463,121],{"class":954},[937,2465,957],{"class":950},[937,2467,960],{"class":943},[937,2469,964],{"class":963},[937,2471,1284],{"class":967},[937,2473,971],{"class":963},[937,2475,2476,2478,2480,2482,2484,2486,2488,2490],{"class":939,"line":974},[937,2477,944],{"class":943},[937,2479,951],{"class":950},[937,2481,1629],{"class":954},[937,2483,957],{"class":950},[937,2485,960],{"class":943},[937,2487,964],{"class":963},[937,2489,1064],{"class":967},[937,2491,971],{"class":963},[937,2493,2494],{"class":939,"line":980},[937,2495,977],{"emptyLinePlaceholder":8},[937,2497,2498,2500,2502,2504,2506,2508],{"class":939,"line":1000},[937,2499,1311],{"class":986},[937,2501,1315],{"class":1314},[937,2503,1318],{"class":1007},[937,2505,1655],{"class":1654},[937,2507,1658],{"class":993},[937,2509,1328],{"class":950},[937,2511,2512,2514,2516,2518,2520,2522,2524,2526],{"class":939,"line":1018},[937,2513,1665],{"class":954},[937,2515,1008],{"class":1336},[937,2517,1339],{"class":954},[937,2519,1165],{"class":950},[937,2521,1344],{"class":954},[937,2523,1165],{"class":950},[937,2525,1678],{"class":1349},[937,2527,1015],{"class":950},[937,2529,2530],{"class":939,"line":1030},[937,2531,1444],{"class":950},[937,2533,2534],{"class":939,"line":1043},[937,2535,977],{"emptyLinePlaceholder":8},[937,2537,2538,2540,2542,2544,2546,2548,2550,2552,2554,2556,2558,2560,2562,2564,2566,2568,2570,2572,2574,2576],{"class":939,"line":1071},[937,2539,1311],{"class":986},[937,2541,1458],{"class":1314},[937,2543,1318],{"class":1007},[937,2545,1463],{"class":943},[937,2547,994],{"class":993},[937,2549,1468],{"class":950},[937,2551,1056],{"class":963},[937,2553,1473],{"class":967},[937,2555,1056],{"class":963},[937,2557,1478],{"class":950},[937,2559,1056],{"class":963},[937,2561,1483],{"class":967},[937,2563,1056],{"class":963},[937,2565,1478],{"class":950},[937,2567,1188],{"class":954},[937,2569,1478],{"class":950},[937,2571,1056],{"class":963},[937,2573,1064],{"class":967},[937,2575,1056],{"class":963},[937,2577,1500],{"class":950},[937,2579,2580],{"class":939,"line":1085},[937,2581,977],{"emptyLinePlaceholder":8},[937,2583,2584,2586,2588,2590,2592,2594,2596],{"class":939,"line":1096},[937,2585,1511],{"class":943},[937,2587,1514],{"class":950},[937,2589,1743],{"class":1007},[937,2591,1517],{"class":954},[937,2593,1165],{"class":950},[937,2595,1522],{"class":954},[937,2597,1525],{"class":950},[937,2599,2600,2602,2604,2606,2608,2610,2612,2614,2616,2618,2620,2622],{"class":939,"line":1441},[937,2601,1531],{"class":954},[937,2603,1165],{"class":950},[937,2605,887],{"class":993},[937,2607,1468],{"class":950},[937,2609,1056],{"class":963},[937,2611,1575],{"class":967},[937,2613,1056],{"class":963},[937,2615,1478],{"class":950},[937,2617,1517],{"class":954},[937,2619,1165],{"class":950},[937,2621,1586],{"class":954},[937,2623,1500],{"class":950},[937,2625,2626],{"class":939,"line":1447},[937,2627,1594],{"class":950},[1260,2629,1785],{"id":1784},[927,2631,2632],{"className":929,"code":1788,"filename":1265,"language":932,"meta":933,"style":933},[858,2633,2634,2638,2652,2662,2672,2678,2688,2694,2698],{"__ignoreMap":933},[937,2635,2636],{"class":939,"line":940},[937,2637,1795],{"class":1417},[937,2639,2640,2642,2644,2646,2648,2650],{"class":939,"line":974},[937,2641,1311],{"class":986},[937,2643,1458],{"class":1314},[937,2645,1318],{"class":1007},[937,2647,1463],{"class":943},[937,2649,994],{"class":993},[937,2651,997],{"class":950},[937,2653,2654,2656,2658,2660],{"class":939,"line":980},[937,2655,1814],{"class":963},[937,2657,1473],{"class":967},[937,2659,1056],{"class":963},[937,2661,1015],{"class":950},[937,2663,2664,2666,2668,2670],{"class":939,"line":1000},[937,2665,1814],{"class":963},[937,2667,1483],{"class":967},[937,2669,1056],{"class":963},[937,2671,1015],{"class":950},[937,2673,2674,2676],{"class":939,"line":1018},[937,2675,1033],{"class":954},[937,2677,1015],{"class":950},[937,2679,2680,2682,2684,2686],{"class":939,"line":1030},[937,2681,1814],{"class":963},[937,2683,1064],{"class":967},[937,2685,1056],{"class":963},[937,2687,1015],{"class":950},[937,2689,2690,2692],{"class":939,"line":1043},[937,2691,1852],{"class":1851},[937,2693,1015],{"class":950},[937,2695,2696],{"class":939,"line":1071},[937,2697,1859],{"class":1851},[937,2699,2700],{"class":939,"line":1085},[937,2701,1500],{"class":950},[885,2703,2704],{"color":1866,"icon":1867},[854,2705,1870,2706,1873,2708,1876],{},[858,2707,878],{},[858,2709,882],{},[1878,2711,1880],{},{"title":933,"searchDepth":974,"depth":974,"links":2713},[2714,2715,2716],{"id":924,"depth":974,"text":925},{"id":1116,"depth":974,"text":1117},{"id":1257,"depth":974,"text":1258,"children":2717},[2718,2719,2720],{"id":1053,"depth":980,"text":894},{"id":1597,"depth":980,"text":912},{"id":1784,"depth":980,"text":1785},{},{"title":121,"description":1890},1780436295698]