[{"data":1,"prerenderedAt":2620},["ShallowReactive",2],{"navLinks":3,"sidebar_docs_navigation_\u002Fdocs\u002Futils":64,"navigation":263,"navLinks_footer":835,"\u002Fdocs\u002Futils\u002Fserver\u002Freplace_page":848,"\u002Fdocs\u002Futils\u002Fserver\u002Freplace_surround":1840,"\u002Fdocs\u002Futils\u002Fserver\u002Freplace":1843},{"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":105,"body":850,"description":1832,"extension":1833,"icon":1834,"meta":1835,"module":1836,"navigation":8,"path":106,"rawbody":1837,"seo":1838,"stem":107,"__hash__":1839},"docs\u002Fdocs\u002Futils\u002Fserver\u002Freplace.md",{"type":851,"value":852,"toc":1814},"minimark",[853,857,860,866,869,877,888,895,901,906,1065,1069,1127,1129,1135,1141,1144,1150,1153,1270,1273,1319,1321,1326,1333,1336,1424,1427,1461,1463,1467,1471,1474,1636,1640,1643,1805,1810],[854,855,856],"p",{},"The file replacement module provides a robust way to update local files without risking corruption. By using an atomic-swap strategy, these functions ensure that a destination file is never left in a partial or corrupted state if a write operation is interrupted or fails.",[854,858,859],{},"Instead of writing directly to a target, the logic stages changes in temporary files and keeps timestamped backups. This is particularly useful for sensitive files or configuration assets where uptime and integrity are non negotiable.",[861,862,863],"caution",{},[854,864,865],{},"Do not pass untrusted paths or contents to these utilities",[867,868],"hr",{},[870,871,873],"h2",{"id":872},"replacefile",[874,875,876],"code",{},"replaceFile",[854,878,879,880,883,884,887],{},"This is the core atomic primitive. When called, it resolves both paths and ensures the destination's parent directory exists. It then copies the existing file to a ",[874,881,882],{},".bak"," extension. The new content is staged in a ",[874,885,886],{},".tmp"," file using a combination of a timestamp and a random hash to avoid collisions.",[854,889,890,891,894],{},"If the operation succeeds, both the source (",[874,892,893],{},"newFile",") and the backup are purged. If an error occurs, it automatically attempts to copy the backup back to the original destination, ensuring the system returns to its last known good state.",[896,897,898],"warning",{},[854,899,900],{},"Upon a successful replacement, the newFile source is permanently deleted from the filesystem. Do not point newFile to a file you intend to keep.",[902,903,905],"h3",{"id":904},"definition","Definition",[907,908,913],"pre",{"className":909,"code":910,"language":911,"meta":912,"style":912},"language-ts shiki shiki-themes light-plus light-plus dracula","\u002F**\n * Executes a safe file replacement by using an atomic swap strategy to preserve \n * data integrity. The process begins by creating a timestamped backup of the target file \n * and staging the new content in a unique temporary location within the same directory. \n * Once staged, it performs an atomic `rename` to finalize the replacement. If the operation \n * succeeds, both the source and the backup are purged; if any step fails, the function \n * attempts to restore the original file from the backup before propagating the error.\n * @param existentFile - The path to the file for replacement.\n * @param newFile - The source path providing the updated content.\n * @throws An error if the swap fails or if the rollback procedure cannot be completed.\n *\u002F\nexport async function replaceFile(existentFile: string, newFile: string): Promise\u003Cvoid>\n","ts","",[874,914,915,924,930,936,942,948,954,960,977,990,1001,1007],{"__ignoreMap":912},[916,917,920],"span",{"class":918,"line":919},"line",1,[916,921,923],{"class":922},"sghk6","\u002F**\n",[916,925,927],{"class":918,"line":926},2,[916,928,929],{"class":922}," * Executes a safe file replacement by using an atomic swap strategy to preserve \n",[916,931,933],{"class":918,"line":932},3,[916,934,935],{"class":922}," * data integrity. The process begins by creating a timestamped backup of the target file \n",[916,937,939],{"class":918,"line":938},4,[916,940,941],{"class":922}," * and staging the new content in a unique temporary location within the same directory. \n",[916,943,945],{"class":918,"line":944},5,[916,946,947],{"class":922}," * Once staged, it performs an atomic `rename` to finalize the replacement. If the operation \n",[916,949,951],{"class":918,"line":950},6,[916,952,953],{"class":922}," * succeeds, both the source and the backup are purged; if any step fails, the function \n",[916,955,957],{"class":918,"line":956},7,[916,958,959],{"class":922}," * attempts to restore the original file from the backup before propagating the error.\n",[916,961,963,966,970,974],{"class":918,"line":962},8,[916,964,965],{"class":922}," * ",[916,967,969],{"class":968},"sl46w","@param",[916,971,973],{"class":972},"sygFZ"," existentFile",[916,975,976],{"class":922}," - The path to the file for replacement.\n",[916,978,980,982,984,987],{"class":918,"line":979},9,[916,981,965],{"class":922},[916,983,969],{"class":968},[916,985,986],{"class":972}," newFile",[916,988,989],{"class":922}," - The source path providing the updated content.\n",[916,991,993,995,998],{"class":918,"line":992},10,[916,994,965],{"class":922},[916,996,997],{"class":968},"@throws",[916,999,1000],{"class":922}," An error if the swap fails or if the rollback procedure cannot be completed.\n",[916,1002,1004],{"class":918,"line":1003},11,[916,1005,1006],{"class":922}," *\u002F\n",[916,1008,1010,1014,1017,1020,1024,1028,1031,1035,1039,1042,1044,1046,1048,1051,1053,1056,1059,1062],{"class":918,"line":1009},12,[916,1011,1013],{"class":1012},"sZ328","export",[916,1015,1016],{"class":968}," async",[916,1018,1019],{"class":968}," function",[916,1021,1023],{"class":1022},"sHOzp"," replaceFile",[916,1025,1027],{"class":1026},"sDd4n","(",[916,1029,1030],{"class":972},"existentFile",[916,1032,1034],{"class":1033},"saOXh",":",[916,1036,1038],{"class":1037},"sFs1U"," string",[916,1040,1041],{"class":1026},", ",[916,1043,893],{"class":972},[916,1045,1034],{"class":1033},[916,1047,1038],{"class":1037},[916,1049,1050],{"class":1026},")",[916,1052,1034],{"class":1033},[916,1054,1055],{"class":1037}," Promise",[916,1057,1058],{"class":1026},"\u003C",[916,1060,1061],{"class":1037},"void",[916,1063,1064],{"class":1026},">\n",[902,1066,1068],{"id":1067},"parameters","Parameters",[1070,1071,1072,1091],"table",{},[1073,1074,1075],"thead",{},[1076,1077,1078,1082,1085,1088],"tr",{},[1079,1080,1081],"th",{},"Parameter",[1079,1083,1084],{},"Type",[1079,1086,1087],{},"Required",[1079,1089,1090],{},"Description",[1092,1093,1094,1112],"tbody",{},[1076,1095,1096,1101,1106,1109],{},[1097,1098,1099],"td",{},[874,1100,1030],{},[1097,1102,1103],{},[874,1104,1105],{},"string",[1097,1107,1108],{},"Yes",[1097,1110,1111],{},"The target file path to be replaced.",[1076,1113,1114,1118,1122,1124],{},[1097,1115,1116],{},[874,1117,893],{},[1097,1119,1120],{},[874,1121,1105],{},[1097,1123,1108],{},[1097,1125,1126],{},"The source file containing the updated content.",[867,1128],{},[870,1130,1132],{"id":1131},"replacedircontent",[874,1133,1134],{},"replaceDirContent",[854,1136,1137,1138,1140],{},"This utility extends atomic safety to entire directory trees. It walks the source directory recursively, replicating the folder structure in the destination as it goes. For every file encountered, it triggers ",[874,1139,876],{},".",[854,1142,1143],{},"Because directory synchronization can involve hundreds of files, the utility halts immediately upon the first failure.",[1145,1146,1147],"note",{},[854,1148,1149],{},"Rollbacks occur strictly on a per-file basis. If a failure occurs midway through a directory sync, the currently processing file is rolled back, but previously successful file replacements in that run are preserved.",[902,1151,905],{"id":1152},"definition-1",[907,1154,1156],{"className":909,"code":1155,"language":911,"meta":912,"style":912},"\u002F**\n * Synchronizes directory content by recursively traversing the source path and applying \n * atomic updates to the destination. It ensures that the target's internal structure \n * mirrors the source by creating nested directories as they are encountered. \n * Replacement happens on a per-file basis; if an individual file swap fail, \n * that specific file is rolled back and the entire process halts immediately to \n * prevent inconsistent states across the directory tree.\n * @param existentDir - The target directory whose contents will be updated or created.\n * @param newDir - The source directory containing the new versions of the files and folders.\n * @throws An error if any single file replacement fails or if directory traversal is interrupted.\n *\u002F\nexport async function replaceDirContent(existentDir: string, newDir: string): Promise\u003Cvoid>\n",[874,1157,1158,1162,1167,1172,1177,1182,1187,1192,1204,1216,1225,1229],{"__ignoreMap":912},[916,1159,1160],{"class":918,"line":919},[916,1161,923],{"class":922},[916,1163,1164],{"class":918,"line":926},[916,1165,1166],{"class":922}," * Synchronizes directory content by recursively traversing the source path and applying \n",[916,1168,1169],{"class":918,"line":932},[916,1170,1171],{"class":922}," * atomic updates to the destination. It ensures that the target's internal structure \n",[916,1173,1174],{"class":918,"line":938},[916,1175,1176],{"class":922}," * mirrors the source by creating nested directories as they are encountered. \n",[916,1178,1179],{"class":918,"line":944},[916,1180,1181],{"class":922}," * Replacement happens on a per-file basis; if an individual file swap fail, \n",[916,1183,1184],{"class":918,"line":950},[916,1185,1186],{"class":922}," * that specific file is rolled back and the entire process halts immediately to \n",[916,1188,1189],{"class":918,"line":956},[916,1190,1191],{"class":922}," * prevent inconsistent states across the directory tree.\n",[916,1193,1194,1196,1198,1201],{"class":918,"line":962},[916,1195,965],{"class":922},[916,1197,969],{"class":968},[916,1199,1200],{"class":972}," existentDir",[916,1202,1203],{"class":922}," - The target directory whose contents will be updated or created.\n",[916,1205,1206,1208,1210,1213],{"class":918,"line":979},[916,1207,965],{"class":922},[916,1209,969],{"class":968},[916,1211,1212],{"class":972}," newDir",[916,1214,1215],{"class":922}," - The source directory containing the new versions of the files and folders.\n",[916,1217,1218,1220,1222],{"class":918,"line":992},[916,1219,965],{"class":922},[916,1221,997],{"class":968},[916,1223,1224],{"class":922}," An error if any single file replacement fails or if directory traversal is interrupted.\n",[916,1226,1227],{"class":918,"line":1003},[916,1228,1006],{"class":922},[916,1230,1231,1233,1235,1237,1240,1242,1245,1247,1249,1251,1254,1256,1258,1260,1262,1264,1266,1268],{"class":918,"line":1009},[916,1232,1013],{"class":1012},[916,1234,1016],{"class":968},[916,1236,1019],{"class":968},[916,1238,1239],{"class":1022}," replaceDirContent",[916,1241,1027],{"class":1026},[916,1243,1244],{"class":972},"existentDir",[916,1246,1034],{"class":1033},[916,1248,1038],{"class":1037},[916,1250,1041],{"class":1026},[916,1252,1253],{"class":972},"newDir",[916,1255,1034],{"class":1033},[916,1257,1038],{"class":1037},[916,1259,1050],{"class":1026},[916,1261,1034],{"class":1033},[916,1263,1055],{"class":1037},[916,1265,1058],{"class":1026},[916,1267,1061],{"class":1037},[916,1269,1064],{"class":1026},[902,1271,1068],{"id":1272},"parameters-1",[1070,1274,1275,1287],{},[1073,1276,1277],{},[1076,1278,1279,1281,1283,1285],{},[1079,1280,1081],{},[1079,1282,1084],{},[1079,1284,1087],{},[1079,1286,1090],{},[1092,1288,1289,1304],{},[1076,1290,1291,1295,1299,1301],{},[1097,1292,1293],{},[874,1294,1244],{},[1097,1296,1297],{},[874,1298,1105],{},[1097,1300,1108],{},[1097,1302,1303],{},"The target directory to be updated.",[1076,1305,1306,1310,1314,1316],{},[1097,1307,1308],{},[874,1309,1253],{},[1097,1311,1312],{},[874,1313,1105],{},[1097,1315,1108],{},[1097,1317,1318],{},"The source directory containing new files\u002Ffolders.",[867,1320],{},[870,1322,1324],{"id":1323},"exists",[874,1325,1323],{},[854,1327,1328,1329,1332],{},"This utility simplifies path verification by wrapping ",[874,1330,1331],{},"fs.access",". Rather than requiring the caller to handle caught exceptions, it returns a boolean. It is designed to verify both presence and the current process's permission to interact with the file or directory.",[902,1334,905],{"id":1335},"definition-2",[907,1337,1339],{"className":909,"code":1338,"language":911,"meta":912,"style":912},"\u002F**\n * Determines the presence and accessibility of a filesystem path by attempting to reach it \n * via the access API. This function returns a simple boolean to indicate \n * whether the path is reachable by the current process, effectively swallowing \n * any access-related errors into a false result.\n * @param path - The absolute or relative filesystem path to verify.\n * @returns A promise that resolves to true if the path is accessible, or false otherwise.\n *\u002F\nexport async function exists(path: string): Promise\u003Cboolean>\n",[874,1340,1341,1345,1350,1355,1360,1365,1377,1387,1391],{"__ignoreMap":912},[916,1342,1343],{"class":918,"line":919},[916,1344,923],{"class":922},[916,1346,1347],{"class":918,"line":926},[916,1348,1349],{"class":922}," * Determines the presence and accessibility of a filesystem path by attempting to reach it \n",[916,1351,1352],{"class":918,"line":932},[916,1353,1354],{"class":922}," * via the access API. This function returns a simple boolean to indicate \n",[916,1356,1357],{"class":918,"line":938},[916,1358,1359],{"class":922}," * whether the path is reachable by the current process, effectively swallowing \n",[916,1361,1362],{"class":918,"line":944},[916,1363,1364],{"class":922}," * any access-related errors into a false result.\n",[916,1366,1367,1369,1371,1374],{"class":918,"line":950},[916,1368,965],{"class":922},[916,1370,969],{"class":968},[916,1372,1373],{"class":972}," path",[916,1375,1376],{"class":922}," - The absolute or relative filesystem path to verify.\n",[916,1378,1379,1381,1384],{"class":918,"line":956},[916,1380,965],{"class":922},[916,1382,1383],{"class":968},"@returns",[916,1385,1386],{"class":922}," A promise that resolves to true if the path is accessible, or false otherwise.\n",[916,1388,1389],{"class":918,"line":962},[916,1390,1006],{"class":922},[916,1392,1393,1395,1397,1399,1402,1404,1407,1409,1411,1413,1415,1417,1419,1422],{"class":918,"line":979},[916,1394,1013],{"class":1012},[916,1396,1016],{"class":968},[916,1398,1019],{"class":968},[916,1400,1401],{"class":1022}," exists",[916,1403,1027],{"class":1026},[916,1405,1406],{"class":972},"path",[916,1408,1034],{"class":1033},[916,1410,1038],{"class":1037},[916,1412,1050],{"class":1026},[916,1414,1034],{"class":1033},[916,1416,1055],{"class":1037},[916,1418,1058],{"class":1026},[916,1420,1421],{"class":1037},"boolean",[916,1423,1064],{"class":1026},[902,1425,1068],{"id":1426},"parameters-2",[1070,1428,1429,1441],{},[1073,1430,1431],{},[1076,1432,1433,1435,1437,1439],{},[1079,1434,1081],{},[1079,1436,1084],{},[1079,1438,1087],{},[1079,1440,1090],{},[1092,1442,1443],{},[1076,1444,1445,1449,1453,1455],{},[1097,1446,1447],{},[874,1448,1406],{},[1097,1450,1451],{},[874,1452,1105],{},[1097,1454,1108],{},[1097,1456,1457,1458,1460],{},"The target ",[874,1459,1406],{}," to check.",[867,1462],{},[870,1464,1466],{"id":1465},"example-usage","Example Usage",[902,1468,1470],{"id":1469},"atomic-file-swap","Atomic File Swap",[854,1472,1473],{},"This example demonstrates a safe way to update a single configuration file.",[907,1475,1478],{"className":909,"code":1476,"filename":1477,"language":911,"meta":912,"style":912},"import { replaceFile } from '@riavzon\u002Futils\u002Fserver'\n\nasync function updateConfig() {\n  try {\n    \u002F\u002F Stages new-config.json, renames it to config.json, and rolls back if it fails\n    await replaceFile('.\u002Fconfig.json', '.\u002Fnew-config.json')\n    console.log('Config updated.')\n  } catch (err) {\n    console.error('failed: Original config preserved.')\n  }\n}\n","example.ts",[874,1479,1480,1508,1513,1526,1534,1539,1568,1589,1606,1626,1631],{"__ignoreMap":912},[916,1481,1482,1485,1488,1491,1494,1497,1501,1505],{"class":918,"line":919},[916,1483,1484],{"class":1012},"import",[916,1486,1487],{"class":1026}," { ",[916,1489,876],{"class":1490},"sjsA6",[916,1492,1493],{"class":1026}," } ",[916,1495,1496],{"class":1012},"from",[916,1498,1500],{"class":1499},"sFkSl"," '",[916,1502,1504],{"class":1503},"sFB1V","@riavzon\u002Futils\u002Fserver",[916,1506,1507],{"class":1499},"'\n",[916,1509,1510],{"class":918,"line":926},[916,1511,1512],{"emptyLinePlaceholder":8},"\n",[916,1514,1515,1518,1520,1523],{"class":918,"line":932},[916,1516,1517],{"class":968},"async",[916,1519,1019],{"class":968},[916,1521,1522],{"class":1022}," updateConfig",[916,1524,1525],{"class":1026},"() {\n",[916,1527,1528,1531],{"class":918,"line":938},[916,1529,1530],{"class":1012},"  try",[916,1532,1533],{"class":1026}," {\n",[916,1535,1536],{"class":918,"line":944},[916,1537,1538],{"class":922},"    \u002F\u002F Stages new-config.json, renames it to config.json, and rolls back if it fails\n",[916,1540,1541,1544,1546,1548,1551,1554,1556,1558,1560,1563,1565],{"class":918,"line":950},[916,1542,1543],{"class":1012},"    await",[916,1545,1023],{"class":1022},[916,1547,1027],{"class":1026},[916,1549,1550],{"class":1499},"'",[916,1552,1553],{"class":1503},".\u002Fconfig.json",[916,1555,1550],{"class":1499},[916,1557,1041],{"class":1026},[916,1559,1550],{"class":1499},[916,1561,1562],{"class":1503},".\u002Fnew-config.json",[916,1564,1550],{"class":1499},[916,1566,1567],{"class":1026},")\n",[916,1569,1570,1573,1575,1578,1580,1582,1585,1587],{"class":918,"line":956},[916,1571,1572],{"class":1490},"    console",[916,1574,1140],{"class":1026},[916,1576,1577],{"class":1022},"log",[916,1579,1027],{"class":1026},[916,1581,1550],{"class":1499},[916,1583,1584],{"class":1503},"Config updated.",[916,1586,1550],{"class":1499},[916,1588,1567],{"class":1026},[916,1590,1591,1594,1597,1600,1603],{"class":918,"line":962},[916,1592,1593],{"class":1026},"  } ",[916,1595,1596],{"class":1012},"catch",[916,1598,1599],{"class":1026}," (",[916,1601,1602],{"class":1490},"err",[916,1604,1605],{"class":1026},") {\n",[916,1607,1608,1610,1612,1615,1617,1619,1622,1624],{"class":918,"line":979},[916,1609,1572],{"class":1490},[916,1611,1140],{"class":1026},[916,1613,1614],{"class":1022},"error",[916,1616,1027],{"class":1026},[916,1618,1550],{"class":1499},[916,1620,1621],{"class":1503},"failed: Original config preserved.",[916,1623,1550],{"class":1499},[916,1625,1567],{"class":1026},[916,1627,1628],{"class":918,"line":992},[916,1629,1630],{"class":1026},"  }\n",[916,1632,1633],{"class":918,"line":1003},[916,1634,1635],{"class":1026},"}\n",[902,1637,1639],{"id":1638},"recursive-directory-sync","Recursive Directory Sync",[854,1641,1642],{},"Useful for deploying new data sets or static assets while maintaining a nested structure.",[907,1644,1646],{"className":909,"code":1645,"filename":1477,"language":911,"meta":912,"style":912},"import { replaceDirContent } from '@riavzon\u002Futils\u002Fserver'\n\nasync function deployDataSources() {\n  const currentDir = '.\u002Fdata\u002Factive'\n  const stagingDir = '.\u002Fdata\u002Fstaging-v2'\n\n  try {\n    \u002F\u002F Replicates .\u002Fdata\u002Fstaging-v2\u002F into .\u002Fdata\u002Factive\u002F\n    \u002F\u002F including all nested subdirectories like active\u002Fdir\u002Ffile.txt\n    await replaceDirContent(currentDir, stagingDir)\n  } catch (err) {\n    \u002F\u002F Process halted on the first file failure to prevent state mismatch\n    console.error('Sync failed:', err)\n  }\n}\n",[874,1647,1648,1666,1670,1681,1700,1716,1720,1726,1731,1736,1754,1766,1771,1795,1800],{"__ignoreMap":912},[916,1649,1650,1652,1654,1656,1658,1660,1662,1664],{"class":918,"line":919},[916,1651,1484],{"class":1012},[916,1653,1487],{"class":1026},[916,1655,1134],{"class":1490},[916,1657,1493],{"class":1026},[916,1659,1496],{"class":1012},[916,1661,1500],{"class":1499},[916,1663,1504],{"class":1503},[916,1665,1507],{"class":1499},[916,1667,1668],{"class":918,"line":926},[916,1669,1512],{"emptyLinePlaceholder":8},[916,1671,1672,1674,1676,1679],{"class":918,"line":932},[916,1673,1517],{"class":968},[916,1675,1019],{"class":968},[916,1677,1678],{"class":1022}," deployDataSources",[916,1680,1525],{"class":1026},[916,1682,1683,1686,1690,1693,1695,1698],{"class":918,"line":938},[916,1684,1685],{"class":968},"  const",[916,1687,1689],{"class":1688},"s3JHE"," currentDir",[916,1691,1692],{"class":1033}," =",[916,1694,1500],{"class":1499},[916,1696,1697],{"class":1503},".\u002Fdata\u002Factive",[916,1699,1507],{"class":1499},[916,1701,1702,1704,1707,1709,1711,1714],{"class":918,"line":944},[916,1703,1685],{"class":968},[916,1705,1706],{"class":1688}," stagingDir",[916,1708,1692],{"class":1033},[916,1710,1500],{"class":1499},[916,1712,1713],{"class":1503},".\u002Fdata\u002Fstaging-v2",[916,1715,1507],{"class":1499},[916,1717,1718],{"class":918,"line":950},[916,1719,1512],{"emptyLinePlaceholder":8},[916,1721,1722,1724],{"class":918,"line":956},[916,1723,1530],{"class":1012},[916,1725,1533],{"class":1026},[916,1727,1728],{"class":918,"line":962},[916,1729,1730],{"class":922},"    \u002F\u002F Replicates .\u002Fdata\u002Fstaging-v2\u002F into .\u002Fdata\u002Factive\u002F\n",[916,1732,1733],{"class":918,"line":979},[916,1734,1735],{"class":922},"    \u002F\u002F including all nested subdirectories like active\u002Fdir\u002Ffile.txt\n",[916,1737,1738,1740,1742,1744,1747,1749,1752],{"class":918,"line":992},[916,1739,1543],{"class":1012},[916,1741,1239],{"class":1022},[916,1743,1027],{"class":1026},[916,1745,1746],{"class":1490},"currentDir",[916,1748,1041],{"class":1026},[916,1750,1751],{"class":1490},"stagingDir",[916,1753,1567],{"class":1026},[916,1755,1756,1758,1760,1762,1764],{"class":918,"line":1003},[916,1757,1593],{"class":1026},[916,1759,1596],{"class":1012},[916,1761,1599],{"class":1026},[916,1763,1602],{"class":1490},[916,1765,1605],{"class":1026},[916,1767,1768],{"class":918,"line":1009},[916,1769,1770],{"class":922},"    \u002F\u002F Process halted on the first file failure to prevent state mismatch\n",[916,1772,1774,1776,1778,1780,1782,1784,1787,1789,1791,1793],{"class":918,"line":1773},13,[916,1775,1572],{"class":1490},[916,1777,1140],{"class":1026},[916,1779,1614],{"class":1022},[916,1781,1027],{"class":1026},[916,1783,1550],{"class":1499},[916,1785,1786],{"class":1503},"Sync failed:",[916,1788,1550],{"class":1499},[916,1790,1041],{"class":1026},[916,1792,1602],{"class":1490},[916,1794,1567],{"class":1026},[916,1796,1798],{"class":918,"line":1797},14,[916,1799,1630],{"class":1026},[916,1801,1803],{"class":918,"line":1802},15,[916,1804,1635],{"class":1026},[1145,1806,1807],{},[854,1808,1809],{},"The temporary files and backups created during these operations include high-resolution timestamps. While they are automatically cleaned up on success or successful rollback, you should ensure your application has write permissions in the target directory to allow these sidecar files to be created.",[1811,1812,1813],"style",{},"html pre.shiki code .sghk6, html code.shiki .sghk6{--shiki-light:#008000;--shiki-default:#008000;--shiki-dark:#6272A4}html pre.shiki code .sl46w, html code.shiki .sl46w{--shiki-light:#0000FF;--shiki-default:#0000FF;--shiki-dark:#FF79C6}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 .sZ328, html code.shiki .sZ328{--shiki-light:#AF00DB;--shiki-default:#AF00DB;--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 .sDd4n, html code.shiki .sDd4n{--shiki-light:#000000;--shiki-default:#000000;--shiki-dark:#F8F8F2}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 .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 .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 .s3JHE, html code.shiki .s3JHE{--shiki-light:#0070C1;--shiki-default:#0070C1;--shiki-dark:#F8F8F2}",{"title":912,"searchDepth":926,"depth":926,"links":1815},[1816,1820,1824,1828],{"id":872,"depth":926,"text":876,"children":1817},[1818,1819],{"id":904,"depth":932,"text":905},{"id":1067,"depth":932,"text":1068},{"id":1131,"depth":926,"text":1134,"children":1821},[1822,1823],{"id":1152,"depth":932,"text":905},{"id":1272,"depth":932,"text":1068},{"id":1323,"depth":926,"text":1323,"children":1825},[1826,1827],{"id":1335,"depth":932,"text":905},{"id":1426,"depth":932,"text":1068},{"id":1465,"depth":926,"text":1466,"children":1829},[1830,1831],{"id":1469,"depth":932,"text":1470},{"id":1638,"depth":932,"text":1639},"Server-side utilities for performing atomic file and directory updates with built-in rollback protection.","md","i-lucide-file-sync",{},null,"---\ntitle: File Replacements\ndescription: Server-side utilities for performing atomic file and directory updates with built-in rollback protection.\nicon: i-lucide-file-sync\n---\n\nThe file replacement module provides a robust way to update local files without risking corruption. By using an atomic-swap strategy, these functions ensure that a destination file is never left in a partial or corrupted state if a write operation is interrupted or fails.\n\nInstead of writing directly to a target, the logic stages changes in temporary files and keeps timestamped backups. This is particularly useful for sensitive files or configuration assets where uptime and integrity are non negotiable.\n\n\n::caution \nDo not pass untrusted paths or contents to these utilities\n::\n\n---\n\n## `replaceFile`\n\nThis is the core atomic primitive. When called, it resolves both paths and ensures the destination's parent directory exists. It then copies the existing file to a `.bak` extension. The new content is staged in a `.tmp` file using a combination of a timestamp and a random hash to avoid collisions.\n\nIf the operation succeeds, both the source (`newFile`) and the backup are purged. If an error occurs, it automatically attempts to copy the backup back to the original destination, ensuring the system returns to its last known good state.\n\n::warning\nUpon a successful replacement, the newFile source is permanently deleted from the filesystem. Do not point newFile to a file you intend to keep.\n::\n\n### Definition\n\n```ts\n\u002F**\n * Executes a safe file replacement by using an atomic swap strategy to preserve \n * data integrity. The process begins by creating a timestamped backup of the target file \n * and staging the new content in a unique temporary location within the same directory. \n * Once staged, it performs an atomic `rename` to finalize the replacement. If the operation \n * succeeds, both the source and the backup are purged; if any step fails, the function \n * attempts to restore the original file from the backup before propagating the error.\n * @param existentFile - The path to the file for replacement.\n * @param newFile - The source path providing the updated content.\n * @throws An error if the swap fails or if the rollback procedure cannot be completed.\n *\u002F\nexport async function replaceFile(existentFile: string, newFile: string): Promise\u003Cvoid>\n```\n\n### Parameters\n\n| Parameter | Type | Required | Description |\n| --- | --- | --- | --- |\n| `existentFile` | `string` | Yes | The target file path to be replaced. |\n| `newFile` | `string` | Yes | The source file containing the updated content. |\n\n---\n\n## `replaceDirContent`\n\nThis utility extends atomic safety to entire directory trees. It walks the source directory recursively, replicating the folder structure in the destination as it goes. For every file encountered, it triggers `replaceFile`.\n\n\nBecause directory synchronization can involve hundreds of files, the utility halts immediately upon the first failure. \n\n::note\nRollbacks occur strictly on a per-file basis. If a failure occurs midway through a directory sync, the currently processing file is rolled back, but previously successful file replacements in that run are preserved.\n::\n\n### Definition\n\n```ts\n\u002F**\n * Synchronizes directory content by recursively traversing the source path and applying \n * atomic updates to the destination. It ensures that the target's internal structure \n * mirrors the source by creating nested directories as they are encountered. \n * Replacement happens on a per-file basis; if an individual file swap fail, \n * that specific file is rolled back and the entire process halts immediately to \n * prevent inconsistent states across the directory tree.\n * @param existentDir - The target directory whose contents will be updated or created.\n * @param newDir - The source directory containing the new versions of the files and folders.\n * @throws An error if any single file replacement fails or if directory traversal is interrupted.\n *\u002F\nexport async function replaceDirContent(existentDir: string, newDir: string): Promise\u003Cvoid>\n```\n\n### Parameters\n\n| Parameter | Type | Required | Description |\n| --- | --- | --- | --- |\n| `existentDir` | `string` | Yes | The target directory to be updated. |\n| `newDir` | `string` | Yes | The source directory containing new files\u002Ffolders. |\n\n---\n\n## `exists`\n\nThis utility simplifies path verification by wrapping `fs.access`. Rather than requiring the caller to handle caught exceptions, it returns a boolean. It is designed to verify both presence and the current process's permission to interact with the file or directory.\n\n### Definition\n\n```ts\n\u002F**\n * Determines the presence and accessibility of a filesystem path by attempting to reach it \n * via the access API. This function returns a simple boolean to indicate \n * whether the path is reachable by the current process, effectively swallowing \n * any access-related errors into a false result.\n * @param path - The absolute or relative filesystem path to verify.\n * @returns A promise that resolves to true if the path is accessible, or false otherwise.\n *\u002F\nexport async function exists(path: string): Promise\u003Cboolean>\n```\n\n### Parameters\n\n| Parameter | Type | Required | Description |\n| --- | --- | --- | --- |\n| `path` | `string` | Yes | The target `path` to check. |\n\n---\n\n## Example Usage\n\n### Atomic File Swap\n\nThis example demonstrates a safe way to update a single configuration file.\n\n```ts [example.ts]\nimport { replaceFile } from '@riavzon\u002Futils\u002Fserver'\n\nasync function updateConfig() {\n  try {\n    \u002F\u002F Stages new-config.json, renames it to config.json, and rolls back if it fails\n    await replaceFile('.\u002Fconfig.json', '.\u002Fnew-config.json')\n    console.log('Config updated.')\n  } catch (err) {\n    console.error('failed: Original config preserved.')\n  }\n}\n```\n### Recursive Directory Sync\n\nUseful for deploying new data sets or static assets while maintaining a nested structure.\n\n```ts [example.ts]\nimport { replaceDirContent } from '@riavzon\u002Futils\u002Fserver'\n\nasync function deployDataSources() {\n  const currentDir = '.\u002Fdata\u002Factive'\n  const stagingDir = '.\u002Fdata\u002Fstaging-v2'\n\n  try {\n    \u002F\u002F Replicates .\u002Fdata\u002Fstaging-v2\u002F into .\u002Fdata\u002Factive\u002F\n    \u002F\u002F including all nested subdirectories like active\u002Fdir\u002Ffile.txt\n    await replaceDirContent(currentDir, stagingDir)\n  } catch (err) {\n    \u002F\u002F Process halted on the first file failure to prevent state mismatch\n    console.error('Sync failed:', err)\n  }\n}\n```\n\n::note\nThe temporary files and backups created during these operations include high-resolution timestamps. While they are automatically cleaned up on success or successful rollback, you should ensure your application has write permissions in the target directory to allow these sidecar files to be created.\n::\n",{"title":105,"description":1832},"RmoUMlrJHUYw99d8Uiu9r6t9AMkPVVv_oMr8HRXTYHo",[1841,1842],{"title":101,"path":102,"stem":103,"children":-1},{"title":109,"path":110,"stem":111,"children":-1},{"id":849,"title":105,"body":1844,"description":1832,"extension":1833,"icon":1834,"meta":2618,"module":1836,"navigation":8,"path":106,"rawbody":1837,"seo":2619,"stem":107,"__hash__":1839},{"type":851,"value":1845,"toc":2600},[1846,1848,1850,1854,1856,1860,1866,1870,1874,1876,1978,1980,2024,2026,2030,2034,2036,2040,2042,2144,2146,2190,2192,2196,2200,2202,2278,2280,2312,2314,2316,2318,2320,2446,2448,2450,2594,2598],[854,1847,856],{},[854,1849,859],{},[861,1851,1852],{},[854,1853,865],{},[867,1855],{},[870,1857,1858],{"id":872},[874,1859,876],{},[854,1861,879,1862,883,1864,887],{},[874,1863,882],{},[874,1865,886],{},[854,1867,890,1868,894],{},[874,1869,893],{},[896,1871,1872],{},[854,1873,900],{},[902,1875,905],{"id":904},[907,1877,1878],{"className":909,"code":910,"language":911,"meta":912,"style":912},[874,1879,1880,1884,1888,1892,1896,1900,1904,1908,1918,1928,1936,1940],{"__ignoreMap":912},[916,1881,1882],{"class":918,"line":919},[916,1883,923],{"class":922},[916,1885,1886],{"class":918,"line":926},[916,1887,929],{"class":922},[916,1889,1890],{"class":918,"line":932},[916,1891,935],{"class":922},[916,1893,1894],{"class":918,"line":938},[916,1895,941],{"class":922},[916,1897,1898],{"class":918,"line":944},[916,1899,947],{"class":922},[916,1901,1902],{"class":918,"line":950},[916,1903,953],{"class":922},[916,1905,1906],{"class":918,"line":956},[916,1907,959],{"class":922},[916,1909,1910,1912,1914,1916],{"class":918,"line":962},[916,1911,965],{"class":922},[916,1913,969],{"class":968},[916,1915,973],{"class":972},[916,1917,976],{"class":922},[916,1919,1920,1922,1924,1926],{"class":918,"line":979},[916,1921,965],{"class":922},[916,1923,969],{"class":968},[916,1925,986],{"class":972},[916,1927,989],{"class":922},[916,1929,1930,1932,1934],{"class":918,"line":992},[916,1931,965],{"class":922},[916,1933,997],{"class":968},[916,1935,1000],{"class":922},[916,1937,1938],{"class":918,"line":1003},[916,1939,1006],{"class":922},[916,1941,1942,1944,1946,1948,1950,1952,1954,1956,1958,1960,1962,1964,1966,1968,1970,1972,1974,1976],{"class":918,"line":1009},[916,1943,1013],{"class":1012},[916,1945,1016],{"class":968},[916,1947,1019],{"class":968},[916,1949,1023],{"class":1022},[916,1951,1027],{"class":1026},[916,1953,1030],{"class":972},[916,1955,1034],{"class":1033},[916,1957,1038],{"class":1037},[916,1959,1041],{"class":1026},[916,1961,893],{"class":972},[916,1963,1034],{"class":1033},[916,1965,1038],{"class":1037},[916,1967,1050],{"class":1026},[916,1969,1034],{"class":1033},[916,1971,1055],{"class":1037},[916,1973,1058],{"class":1026},[916,1975,1061],{"class":1037},[916,1977,1064],{"class":1026},[902,1979,1068],{"id":1067},[1070,1981,1982,1994],{},[1073,1983,1984],{},[1076,1985,1986,1988,1990,1992],{},[1079,1987,1081],{},[1079,1989,1084],{},[1079,1991,1087],{},[1079,1993,1090],{},[1092,1995,1996,2010],{},[1076,1997,1998,2002,2006,2008],{},[1097,1999,2000],{},[874,2001,1030],{},[1097,2003,2004],{},[874,2005,1105],{},[1097,2007,1108],{},[1097,2009,1111],{},[1076,2011,2012,2016,2020,2022],{},[1097,2013,2014],{},[874,2015,893],{},[1097,2017,2018],{},[874,2019,1105],{},[1097,2021,1108],{},[1097,2023,1126],{},[867,2025],{},[870,2027,2028],{"id":1131},[874,2029,1134],{},[854,2031,1137,2032,1140],{},[874,2033,876],{},[854,2035,1143],{},[1145,2037,2038],{},[854,2039,1149],{},[902,2041,905],{"id":1152},[907,2043,2044],{"className":909,"code":1155,"language":911,"meta":912,"style":912},[874,2045,2046,2050,2054,2058,2062,2066,2070,2074,2084,2094,2102,2106],{"__ignoreMap":912},[916,2047,2048],{"class":918,"line":919},[916,2049,923],{"class":922},[916,2051,2052],{"class":918,"line":926},[916,2053,1166],{"class":922},[916,2055,2056],{"class":918,"line":932},[916,2057,1171],{"class":922},[916,2059,2060],{"class":918,"line":938},[916,2061,1176],{"class":922},[916,2063,2064],{"class":918,"line":944},[916,2065,1181],{"class":922},[916,2067,2068],{"class":918,"line":950},[916,2069,1186],{"class":922},[916,2071,2072],{"class":918,"line":956},[916,2073,1191],{"class":922},[916,2075,2076,2078,2080,2082],{"class":918,"line":962},[916,2077,965],{"class":922},[916,2079,969],{"class":968},[916,2081,1200],{"class":972},[916,2083,1203],{"class":922},[916,2085,2086,2088,2090,2092],{"class":918,"line":979},[916,2087,965],{"class":922},[916,2089,969],{"class":968},[916,2091,1212],{"class":972},[916,2093,1215],{"class":922},[916,2095,2096,2098,2100],{"class":918,"line":992},[916,2097,965],{"class":922},[916,2099,997],{"class":968},[916,2101,1224],{"class":922},[916,2103,2104],{"class":918,"line":1003},[916,2105,1006],{"class":922},[916,2107,2108,2110,2112,2114,2116,2118,2120,2122,2124,2126,2128,2130,2132,2134,2136,2138,2140,2142],{"class":918,"line":1009},[916,2109,1013],{"class":1012},[916,2111,1016],{"class":968},[916,2113,1019],{"class":968},[916,2115,1239],{"class":1022},[916,2117,1027],{"class":1026},[916,2119,1244],{"class":972},[916,2121,1034],{"class":1033},[916,2123,1038],{"class":1037},[916,2125,1041],{"class":1026},[916,2127,1253],{"class":972},[916,2129,1034],{"class":1033},[916,2131,1038],{"class":1037},[916,2133,1050],{"class":1026},[916,2135,1034],{"class":1033},[916,2137,1055],{"class":1037},[916,2139,1058],{"class":1026},[916,2141,1061],{"class":1037},[916,2143,1064],{"class":1026},[902,2145,1068],{"id":1272},[1070,2147,2148,2160],{},[1073,2149,2150],{},[1076,2151,2152,2154,2156,2158],{},[1079,2153,1081],{},[1079,2155,1084],{},[1079,2157,1087],{},[1079,2159,1090],{},[1092,2161,2162,2176],{},[1076,2163,2164,2168,2172,2174],{},[1097,2165,2166],{},[874,2167,1244],{},[1097,2169,2170],{},[874,2171,1105],{},[1097,2173,1108],{},[1097,2175,1303],{},[1076,2177,2178,2182,2186,2188],{},[1097,2179,2180],{},[874,2181,1253],{},[1097,2183,2184],{},[874,2185,1105],{},[1097,2187,1108],{},[1097,2189,1318],{},[867,2191],{},[870,2193,2194],{"id":1323},[874,2195,1323],{},[854,2197,1328,2198,1332],{},[874,2199,1331],{},[902,2201,905],{"id":1335},[907,2203,2204],{"className":909,"code":1338,"language":911,"meta":912,"style":912},[874,2205,2206,2210,2214,2218,2222,2226,2236,2244,2248],{"__ignoreMap":912},[916,2207,2208],{"class":918,"line":919},[916,2209,923],{"class":922},[916,2211,2212],{"class":918,"line":926},[916,2213,1349],{"class":922},[916,2215,2216],{"class":918,"line":932},[916,2217,1354],{"class":922},[916,2219,2220],{"class":918,"line":938},[916,2221,1359],{"class":922},[916,2223,2224],{"class":918,"line":944},[916,2225,1364],{"class":922},[916,2227,2228,2230,2232,2234],{"class":918,"line":950},[916,2229,965],{"class":922},[916,2231,969],{"class":968},[916,2233,1373],{"class":972},[916,2235,1376],{"class":922},[916,2237,2238,2240,2242],{"class":918,"line":956},[916,2239,965],{"class":922},[916,2241,1383],{"class":968},[916,2243,1386],{"class":922},[916,2245,2246],{"class":918,"line":962},[916,2247,1006],{"class":922},[916,2249,2250,2252,2254,2256,2258,2260,2262,2264,2266,2268,2270,2272,2274,2276],{"class":918,"line":979},[916,2251,1013],{"class":1012},[916,2253,1016],{"class":968},[916,2255,1019],{"class":968},[916,2257,1401],{"class":1022},[916,2259,1027],{"class":1026},[916,2261,1406],{"class":972},[916,2263,1034],{"class":1033},[916,2265,1038],{"class":1037},[916,2267,1050],{"class":1026},[916,2269,1034],{"class":1033},[916,2271,1055],{"class":1037},[916,2273,1058],{"class":1026},[916,2275,1421],{"class":1037},[916,2277,1064],{"class":1026},[902,2279,1068],{"id":1426},[1070,2281,2282,2294],{},[1073,2283,2284],{},[1076,2285,2286,2288,2290,2292],{},[1079,2287,1081],{},[1079,2289,1084],{},[1079,2291,1087],{},[1079,2293,1090],{},[1092,2295,2296],{},[1076,2297,2298,2302,2306,2308],{},[1097,2299,2300],{},[874,2301,1406],{},[1097,2303,2304],{},[874,2305,1105],{},[1097,2307,1108],{},[1097,2309,1457,2310,1460],{},[874,2311,1406],{},[867,2313],{},[870,2315,1466],{"id":1465},[902,2317,1470],{"id":1469},[854,2319,1473],{},[907,2321,2322],{"className":909,"code":1476,"filename":1477,"language":911,"meta":912,"style":912},[874,2323,2324,2342,2346,2356,2362,2366,2390,2408,2420,2438,2442],{"__ignoreMap":912},[916,2325,2326,2328,2330,2332,2334,2336,2338,2340],{"class":918,"line":919},[916,2327,1484],{"class":1012},[916,2329,1487],{"class":1026},[916,2331,876],{"class":1490},[916,2333,1493],{"class":1026},[916,2335,1496],{"class":1012},[916,2337,1500],{"class":1499},[916,2339,1504],{"class":1503},[916,2341,1507],{"class":1499},[916,2343,2344],{"class":918,"line":926},[916,2345,1512],{"emptyLinePlaceholder":8},[916,2347,2348,2350,2352,2354],{"class":918,"line":932},[916,2349,1517],{"class":968},[916,2351,1019],{"class":968},[916,2353,1522],{"class":1022},[916,2355,1525],{"class":1026},[916,2357,2358,2360],{"class":918,"line":938},[916,2359,1530],{"class":1012},[916,2361,1533],{"class":1026},[916,2363,2364],{"class":918,"line":944},[916,2365,1538],{"class":922},[916,2367,2368,2370,2372,2374,2376,2378,2380,2382,2384,2386,2388],{"class":918,"line":950},[916,2369,1543],{"class":1012},[916,2371,1023],{"class":1022},[916,2373,1027],{"class":1026},[916,2375,1550],{"class":1499},[916,2377,1553],{"class":1503},[916,2379,1550],{"class":1499},[916,2381,1041],{"class":1026},[916,2383,1550],{"class":1499},[916,2385,1562],{"class":1503},[916,2387,1550],{"class":1499},[916,2389,1567],{"class":1026},[916,2391,2392,2394,2396,2398,2400,2402,2404,2406],{"class":918,"line":956},[916,2393,1572],{"class":1490},[916,2395,1140],{"class":1026},[916,2397,1577],{"class":1022},[916,2399,1027],{"class":1026},[916,2401,1550],{"class":1499},[916,2403,1584],{"class":1503},[916,2405,1550],{"class":1499},[916,2407,1567],{"class":1026},[916,2409,2410,2412,2414,2416,2418],{"class":918,"line":962},[916,2411,1593],{"class":1026},[916,2413,1596],{"class":1012},[916,2415,1599],{"class":1026},[916,2417,1602],{"class":1490},[916,2419,1605],{"class":1026},[916,2421,2422,2424,2426,2428,2430,2432,2434,2436],{"class":918,"line":979},[916,2423,1572],{"class":1490},[916,2425,1140],{"class":1026},[916,2427,1614],{"class":1022},[916,2429,1027],{"class":1026},[916,2431,1550],{"class":1499},[916,2433,1621],{"class":1503},[916,2435,1550],{"class":1499},[916,2437,1567],{"class":1026},[916,2439,2440],{"class":918,"line":992},[916,2441,1630],{"class":1026},[916,2443,2444],{"class":918,"line":1003},[916,2445,1635],{"class":1026},[902,2447,1639],{"id":1638},[854,2449,1642],{},[907,2451,2452],{"className":909,"code":1645,"filename":1477,"language":911,"meta":912,"style":912},[874,2453,2454,2472,2476,2486,2500,2514,2518,2524,2528,2532,2548,2560,2564,2586,2590],{"__ignoreMap":912},[916,2455,2456,2458,2460,2462,2464,2466,2468,2470],{"class":918,"line":919},[916,2457,1484],{"class":1012},[916,2459,1487],{"class":1026},[916,2461,1134],{"class":1490},[916,2463,1493],{"class":1026},[916,2465,1496],{"class":1012},[916,2467,1500],{"class":1499},[916,2469,1504],{"class":1503},[916,2471,1507],{"class":1499},[916,2473,2474],{"class":918,"line":926},[916,2475,1512],{"emptyLinePlaceholder":8},[916,2477,2478,2480,2482,2484],{"class":918,"line":932},[916,2479,1517],{"class":968},[916,2481,1019],{"class":968},[916,2483,1678],{"class":1022},[916,2485,1525],{"class":1026},[916,2487,2488,2490,2492,2494,2496,2498],{"class":918,"line":938},[916,2489,1685],{"class":968},[916,2491,1689],{"class":1688},[916,2493,1692],{"class":1033},[916,2495,1500],{"class":1499},[916,2497,1697],{"class":1503},[916,2499,1507],{"class":1499},[916,2501,2502,2504,2506,2508,2510,2512],{"class":918,"line":944},[916,2503,1685],{"class":968},[916,2505,1706],{"class":1688},[916,2507,1692],{"class":1033},[916,2509,1500],{"class":1499},[916,2511,1713],{"class":1503},[916,2513,1507],{"class":1499},[916,2515,2516],{"class":918,"line":950},[916,2517,1512],{"emptyLinePlaceholder":8},[916,2519,2520,2522],{"class":918,"line":956},[916,2521,1530],{"class":1012},[916,2523,1533],{"class":1026},[916,2525,2526],{"class":918,"line":962},[916,2527,1730],{"class":922},[916,2529,2530],{"class":918,"line":979},[916,2531,1735],{"class":922},[916,2533,2534,2536,2538,2540,2542,2544,2546],{"class":918,"line":992},[916,2535,1543],{"class":1012},[916,2537,1239],{"class":1022},[916,2539,1027],{"class":1026},[916,2541,1746],{"class":1490},[916,2543,1041],{"class":1026},[916,2545,1751],{"class":1490},[916,2547,1567],{"class":1026},[916,2549,2550,2552,2554,2556,2558],{"class":918,"line":1003},[916,2551,1593],{"class":1026},[916,2553,1596],{"class":1012},[916,2555,1599],{"class":1026},[916,2557,1602],{"class":1490},[916,2559,1605],{"class":1026},[916,2561,2562],{"class":918,"line":1009},[916,2563,1770],{"class":922},[916,2565,2566,2568,2570,2572,2574,2576,2578,2580,2582,2584],{"class":918,"line":1773},[916,2567,1572],{"class":1490},[916,2569,1140],{"class":1026},[916,2571,1614],{"class":1022},[916,2573,1027],{"class":1026},[916,2575,1550],{"class":1499},[916,2577,1786],{"class":1503},[916,2579,1550],{"class":1499},[916,2581,1041],{"class":1026},[916,2583,1602],{"class":1490},[916,2585,1567],{"class":1026},[916,2587,2588],{"class":918,"line":1797},[916,2589,1630],{"class":1026},[916,2591,2592],{"class":918,"line":1802},[916,2593,1635],{"class":1026},[1145,2595,2596],{},[854,2597,1809],{},[1811,2599,1813],{},{"title":912,"searchDepth":926,"depth":926,"links":2601},[2602,2606,2610,2614],{"id":872,"depth":926,"text":876,"children":2603},[2604,2605],{"id":904,"depth":932,"text":905},{"id":1067,"depth":932,"text":1068},{"id":1131,"depth":926,"text":1134,"children":2607},[2608,2609],{"id":1152,"depth":932,"text":905},{"id":1272,"depth":932,"text":1068},{"id":1323,"depth":926,"text":1323,"children":2611},[2612,2613],{"id":1335,"depth":932,"text":905},{"id":1426,"depth":932,"text":1068},{"id":1465,"depth":926,"text":1466,"children":2615},[2616,2617],{"id":1469,"depth":932,"text":1470},{"id":1638,"depth":932,"text":1639},{},{"title":105,"description":1832},1780436295266]