[{"data":1,"prerenderedAt":730},["ShallowReactive",2],{"sanity-rUcTz11W3M3XFYrDD9021x2YSYEoywrDZEciPZpDzXE":3,"sanity-AU_XPtL_xLCU8r9Dt-hUga9aWOF2A-vYRRq3W0fZx9w":27},{"data":4,"sourceMap":10},[5],{"language":6,"slug":7},"en",{"_type":8,"current":9},"slug","how-a-missing-at-symbol-in-a-filename-broke-my-netlify-build",{"documents":11,"paths":15,"mappings":18},[12],{"_id":13,"_type":14},"95785274-5f1e-45d3-b7ed-f671c866f0c1","blogPost",[16,17],"$['language']","$['slug']",{"$[0]['language']":19,"$[0]['slug']":24},{"source":20,"type":23},{"document":21,"path":21,"type":22},0,"documentValue","value",{"source":25,"type":23},{"document":21,"path":26,"type":22},1,{"data":28,"sourceMap":705},{"_id":13,"content":29,"language":6,"publishedAt":702,"slug":703,"title":704},[30,41,50,55,71,96,112,121,129,132,163,172,187,195,219,227,243,247,284,292,300,303,311,314,337,353,397,412,450,458,466,495,498,506,535,543,558,565,573,595,603,611,618,626,642,657,672,687],{"_key":31,"_type":32,"children":33,"markDefs":39,"style":40},"2a2b2e0b113f","block",[34],{"_key":35,"_type":36,"marks":37,"text":38},"b29b5b71f0e4","span",[],"It was fine three months ago :(",[],"h1",{"_key":42,"_type":32,"children":43,"markDefs":48,"style":49},"cfe3b923dd7e",[44],{"_key":45,"_type":36,"marks":46,"text":47},"34510862b180",[],"Three months ago I deployed this Qwik site to Netlify. And after some while, this week I pushed an unrelated content change and the build died without touching a thing on it’s codebase:",[],"normal",{"_key":51,"_type":52,"code":53,"language":54},"fb4cd5e89bf6","code","Edge Functions bundling\n────────────────────────────────────────────────────────────────\n\nPackaging Edge Functions from .netlify/edge-functions directory:\n - entry.netlify-edge\n\n[Error: ENOENT: no such file or directory, stat '/tmp/tmp-2269-6qAdCcbGEFml/qwik-city-not-found-paths.js'] {\n  errno: -2,\n  code: 'ENOENT',\n  syscall: 'stat',\n  path: '/tmp/tmp-2269-6qAdCcbGEFml/qwik-city-not-found-paths.js'\n}\nNode.js v22.22.1","text",{"_key":56,"_type":32,"children":57,"markDefs":70,"style":49},"15eea3666985",[58,62,66],{"_key":59,"_type":36,"marks":60,"text":61},"49d775e203b0",[],"No version bumps in ",{"_key":63,"_type":36,"marks":64,"text":65},"b083ed542065",[52],"package.json",{"_key":67,"_type":36,"marks":68,"text":69},"d9fee9db9002",[],". No config changes. The build itself (client, server) compiled cleanly. If it worked three months ago with the exact same versions, why was it broken now?",[],{"_key":72,"_type":32,"children":73,"markDefs":95,"style":49},"b38003fb196c",[74,78,82,86,91],{"_key":75,"_type":36,"marks":76,"text":77},"613cee90cd5f",[],"I did the usual steps: Cleared cache and ran the build, failed. But build process worked fine on local machine. Upgraded all dependencies with ",{"_key":79,"_type":36,"marks":80,"text":81},"e179d120f40c",[52],"ncu",{"_key":83,"_type":36,"marks":84,"text":85},"c92dfe7ab867",[]," to their latest versions, upload, still failed. Until I created a brand new Qwik hello-world project, pushed it to Netlify. ",{"_key":87,"_type":36,"marks":88,"text":90},"79a0d9030d5c",[89],"em","Still failed",{"_key":92,"_type":36,"marks":93,"text":94},"dae5517e4848",[],", that’s when I know there must be something wrong on Netlify’s side.",[],{"_key":97,"_type":32,"children":98,"markDefs":111,"style":49},"df37e3a86ca1",[99,103,107],{"_key":100,"_type":36,"marks":101,"text":102},"e4723de5dc66",[],"Searching online for ",{"_key":104,"_type":36,"marks":105,"text":106},"14a211f70830",[52],"\"qwik netlify build error ENOENT file not found\"",{"_key":108,"_type":36,"marks":109,"text":110},"ae93f037e6bf",[]," wasn't really helpful, found only one forum post describing the same issue. No replies. Auto-closed after seven days. So I posted on Netlify's answers forum and hope someone could give a solution. A response did come eventually, but hours later.The site was down and needed to come back up ASAP, so I wasn't going to sit there refreshing a forum tab. I started digging deep.",[],{"_key":113,"_type":32,"children":114,"markDefs":119,"style":120},"704cf3c07c3f",[115],{"_key":116,"_type":36,"marks":117,"text":118},"0002eab728a4",[],"The First Clue: A Missing @",[],"h2",{"_key":122,"_type":32,"children":123,"markDefs":128,"style":49},"7abdaaec479f",[124],{"_key":125,"_type":36,"marks":126,"text":127},"8bb06ebef4df",[],"I noticed the failure was in the Edge Functions bundling step, an additional step after everything else was done. I opened the output directory on my local machine expecting to see the missing file:",[],{"_key":130,"_type":52,"code":131},"fdbda85c099c",".netlify/edge-functions/entry.netlify-edge/\n├── @qwik-city-not-found-paths.js  ← Here it is!\n├── @qwik-city-plan.js\n├── @qwik-city-static-paths.js\n├── entry.netlify-edge.js\n└── ...",{"_key":133,"_type":32,"children":134,"markDefs":162,"style":49},"0ec8df412860",[135,139,143,147,151,155,158],{"_key":136,"_type":36,"marks":137,"text":138},"2dfba0026c1f",[],"That's when it gets interesting, the file existed. It just had an ",{"_key":140,"_type":36,"marks":141,"text":142},"78893980f482",[52],"@",{"_key":144,"_type":36,"marks":145,"text":146},"129366d4f046",[]," in front of it. Yet the error occurs when attempting to call ",{"_key":148,"_type":36,"marks":149,"text":150},"164653530410",[52],"stat",{"_key":152,"_type":36,"marks":153,"text":154},"408b3b7d3cee",[]," on a file with a filename that is almost identical, except for the missing ",{"_key":156,"_type":36,"marks":157,"text":142},"97c0b9020811",[52],{"_key":159,"_type":36,"marks":160,"text":161},"4d4a48fc1cb8",[],"?",[],{"_key":164,"_type":32,"children":165,"markDefs":171,"style":49},"77f93e428406",[166],{"_key":167,"_type":36,"marks":168,"text":170},"cc656a528897",[169],"strong","If the bundler knew this file existed, why was it looking for a file with the wrong name?",[],{"_key":173,"_type":32,"children":174,"markDefs":186,"style":49},"1a47b525f60d",[175,179,182],{"_key":176,"_type":36,"marks":177,"text":178},"b570ef4dbdf9",[],"Something was stripping the ",{"_key":180,"_type":36,"marks":181,"text":142},"4aca086faf0b",[52],{"_key":183,"_type":36,"marks":184,"text":185},"ca543e6c767d",[]," somewhere in the process.",[],{"_key":188,"_type":32,"children":189,"markDefs":194,"style":120},"b5c0a0fad94e",[190],{"_key":191,"_type":36,"marks":192,"text":193},"693aff24a731",[],"Following the Trail",[],{"_key":196,"_type":32,"children":197,"markDefs":218,"style":49},"73d5d62cbf1c",[198,202,206,210,214],{"_key":199,"_type":36,"marks":200,"text":201},"78ca0db53728",[],"I pulled down the source of ",{"_key":203,"_type":36,"marks":204,"text":205},"5a276ed50f4f",[52],"@netlify/build",{"_key":207,"_type":36,"marks":208,"text":209},"382e0467de94",[]," from Netlify’s GitHub repo including the package ",{"_key":211,"_type":36,"marks":212,"text":213},"da08bdde2b99",[52],"edge-bundler",{"_key":215,"_type":36,"marks":216,"text":217},"8610b5a8a7ac",[],", which responsible for that Edge Functions bundling step. I followed the call chain:",[],{"_key":220,"_type":32,"children":221,"markDefs":226,"style":49},"5c33b303ddcc",[222],{"_key":223,"_type":36,"marks":224,"text":225},"d190357de370",[52],"edge_functions/index.ts → bundler.ts → formats/tarball.ts",[],{"_key":228,"_type":32,"children":229,"markDefs":242,"style":49},"bcaa021093c7",[230,234,238],{"_key":231,"_type":36,"marks":232,"text":233},"bcc5b162a1fc",[],"In ",{"_key":235,"_type":36,"marks":236,"text":237},"1709535ac0bd",[52],"tarball.ts",{"_key":239,"_type":36,"marks":240,"text":241},"dec4ad9cb626",[],", I found the function file list being built:",[],{"_key":244,"_type":52,"code":245,"language":246},"8ca0be1bc41d","const files = (await listRecursively(bundleDir.path))\n  .map((p) => path.relative(bundleDir.path, p))\n  .map((p) => getUnixPath(p))\n  .sort()\n\nawait tar.create({ cwd: bundleDir.path, file: tarballPath, gzip: true }, files)","typescript",{"_key":248,"_type":32,"children":249,"markDefs":283,"style":49},"745d8ea276fb",[250,254,258,262,265,269,272,276,279],{"_key":251,"_type":36,"marks":252,"text":253},"a637127f0fc9",[],"the code packs bundled edge functions into a tarball for deployment. It calls ",{"_key":255,"_type":36,"marks":256,"text":257},"2aa2de6af4b1",[52],"tar.create()",{"_key":259,"_type":36,"marks":260,"text":261},"8e6222d0cc73",[]," with a list of filenames. And at that point, the filenames still had their ",{"_key":263,"_type":36,"marks":264,"text":142},"3f020c345c67",[52],{"_key":266,"_type":36,"marks":267,"text":268},"bcb69e1bee21",[]," prefix intact. The correct name was being passed in. So the issue wasn't in the path calculation. The ",{"_key":270,"_type":36,"marks":271,"text":142},"7e4b6081e040",[52],{"_key":273,"_type":36,"marks":274,"text":275},"ec5836e6c00b",[]," was being stripped inside ",{"_key":277,"_type":36,"marks":278,"text":257},"666df2ac65c4",[52],{"_key":280,"_type":36,"marks":281,"text":282},"9e2fcfa30f30",[]," itself.",[],{"_key":285,"_type":32,"children":286,"markDefs":291,"style":120},"309a9fb3c6c4",[287],{"_key":288,"_type":36,"marks":289,"text":290},"86f44700fec9",[],"Reproducing the Bug",[],{"_key":293,"_type":32,"children":294,"markDefs":299,"style":49},"1b1f449203e1",[295],{"_key":296,"_type":36,"marks":297,"text":298},"400b1d77949c",[],"To confirm, I put together a minimal reproduction with some help from Claude:",[],{"_key":301,"_type":52,"code":302,"language":246},"eef5ca0afde7","import * as tar from 'tar'\nimport fs from 'fs'\nimport os from 'os'\nimport path from 'path'\n\nconst tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'test-'))\nfs.writeFileSync(path.join(tmpDir, '@test-file.js'), 'export default 1')\n\n// Without fix: ENOENT — @ is stripped\nawait tar.create(\n  { cwd: tmpDir, file: '/tmp/out.tar.gz', gzip: true },\n  ['@test-file.js']\n)",{"_key":304,"_type":32,"children":305,"markDefs":310,"style":49},"a041c377d5dc",[306],{"_key":307,"_type":36,"marks":308,"text":309},"7ab6f3b44538",[],"And i got:",[],{"_key":312,"_type":52,"code":313},"a0fdc96aa27d","[Error: ENOENT: no such file or directory, stat '.../test-file.js']",{"_key":315,"_type":32,"children":316,"markDefs":336,"style":49},"6871736fc6b7",[317,321,325,329,332],{"_key":318,"_type":36,"marks":319,"text":320},"13f99024f5bc",[],"The bug was confirmed: ",{"_key":322,"_type":36,"marks":323,"text":324},"c2516ef74c7b",[52],"node-tar",{"_key":326,"_type":36,"marks":327,"text":328},"09c94a406377",[]," WAS doing something on filenames that result in the removal of the ",{"_key":330,"_type":36,"marks":331,"text":142},"1824001d1a92",[52],{"_key":333,"_type":36,"marks":334,"text":335},"915e2ba9d800",[]," symbol.",[],{"_key":338,"_type":32,"children":339,"markDefs":352,"style":120},"9466dec7b0bc",[340,344,348],{"_key":341,"_type":36,"marks":342,"text":343},"a49272978afd",[],"Root Cause: bsdtar (libarchive)’s ",{"_key":345,"_type":36,"marks":346,"text":347},"fc64d55e56fb",[52],"@archive",{"_key":349,"_type":36,"marks":350,"text":351},"c1422950ed30",[]," syntax",[],{"_key":354,"_type":32,"children":355,"markDefs":396,"style":49},"e028b5fdcc4b",[356,360,363,367,371,375,378,382,385,389,392],{"_key":357,"_type":36,"marks":358,"text":359},"f9e2793491f5",[],"After some digging online, bsdtar/libarchive has a feature where entries starting with ",{"_key":361,"_type":36,"marks":362,"text":142},"87e4a4911bb8",[52],{"_key":364,"_type":36,"marks":365,"text":366},"4e50528095a1",[]," have special meaning: ",{"_key":368,"_type":36,"marks":369,"text":370},"392381213139",[52],"@archive.tar",{"_key":372,"_type":36,"marks":373,"text":374},"74f55f8e972d",[]," means \"open that archive and include its contents\". ",{"_key":376,"_type":36,"marks":377,"text":324},"c568e5bd187e",[52],{"_key":379,"_type":36,"marks":380,"text":381},"425ba13374ba",[],", as a tar implementation, inherited this behavior. When it sees a filename starting with ",{"_key":383,"_type":36,"marks":384,"text":142},"cb6abac1d605",[52],{"_key":386,"_type":36,"marks":387,"text":388},"2f59f64a9957",[]," in the files list, it strips the ",{"_key":390,"_type":36,"marks":391,"text":142},"fcb3d46cc97a",[52],{"_key":393,"_type":36,"marks":394,"text":395},"247660d33cdc",[]," symbol and tries to open the remainder as a tar archive to read entries from.",[],{"_key":398,"_type":32,"children":399,"markDefs":411,"style":49},"228fee1c48ae",[400,404,407],{"_key":401,"_type":36,"marks":402,"text":403},"a1f0ed6b3d97",[],"So when ",{"_key":405,"_type":36,"marks":406,"text":324},"80b444c06c0b",[52],{"_key":408,"_type":36,"marks":409,"text":410},"00687cfdfa4f",[]," anything starts with a @ symbol:",[],{"_key":413,"_type":32,"children":414,"markDefs":449,"style":49},"f8b8038080ea",[415,419,423,427,431,435,438,442,445],{"_key":416,"_type":36,"marks":417,"text":418},"94fc62278be4",[],"→ Interpret this as an ",{"_key":420,"_type":36,"marks":421,"text":422},"4bcb7a521fee",[52],"archive-include",{"_key":424,"_type":36,"marks":425,"text":426},"5e9eb3de4a8e",[]," directive\n→ It tried to open ",{"_key":428,"_type":36,"marks":429,"text":430},"263b755e1f1f",[52],"qwik-city-not-found-paths.js",{"_key":432,"_type":36,"marks":433,"text":434},"b09a966881f8",[]," as a tar archive\n→ Run ",{"_key":436,"_type":36,"marks":437,"text":150},"8e4882bdc814",[52],{"_key":439,"_type":36,"marks":440,"text":441},"55590493c2bc",[]," on ",{"_key":443,"_type":36,"marks":444,"text":430},"1646c313f698",[52],{"_key":446,"_type":36,"marks":447,"text":448},"ddb658aedfbb",[],"\n→ ENOENT",[],{"_key":451,"_type":32,"children":452,"markDefs":457,"style":49},"141f34661e0f",[453],{"_key":454,"_type":36,"marks":455,"text":456},"b07571aafde4",[],"",[],{"_key":459,"_type":32,"children":460,"markDefs":465,"style":120},"cc6583d0b3d2",[461],{"_key":462,"_type":36,"marks":463,"text":464},"ddebdcbbf42e",[],"The Fix",[],{"_key":467,"_type":32,"children":468,"markDefs":494,"style":49},"05bb0c7c4081",[469,472,475,479,482,486,490],{"_key":470,"_type":36,"marks":471,"text":233},"f379b7184719",[],{"_key":473,"_type":36,"marks":474,"text":237},"c3e60ccc16f0",[52],{"_key":476,"_type":36,"marks":477,"text":478},"1ee521c033ed",[],", where the files array is passed to ",{"_key":480,"_type":36,"marks":481,"text":257},"a50cb82c16c0",[52],{"_key":483,"_type":36,"marks":484,"text":485},"14457b4a0a12",[],", prefix each entry with ",{"_key":487,"_type":36,"marks":488,"text":489},"a933d33eb166",[52],"./",{"_key":491,"_type":36,"marks":492,"text":493},"d6c8500f866d",[],":",[],{"_key":496,"_type":52,"code":497,"language":246},"b783df130701","// Before\nconst files = (await listRecursively(bundleDir.path))\n  .map((p) => path.relative(bundleDir.path, p))\n  .map((p) => getUnixPath(p))\n  .sort()\n\n// After\nconst files = (await listRecursively(bundleDir.path))\n  .map((p) => path.relative(bundleDir.path, p))\n  .map((p) => './' + getUnixPath(p))  // ← this line\n  .sort()",{"_key":499,"_type":32,"children":500,"markDefs":505,"style":120},"46248836838d",[501],{"_key":502,"_type":36,"marks":503,"text":504},"3ed7dd48b2de",[],"The Chain Reaction",[],{"_key":507,"_type":32,"children":508,"markDefs":534,"style":49},"f2348d05e4e3",[509,513,516,520,523,527,530],{"_key":510,"_type":36,"marks":511,"text":512},"26610d81aad0",[],"After the PR was merged into ",{"_key":514,"_type":36,"marks":515,"text":205},"2abbe0ef8624",[52],{"_key":517,"_type":36,"marks":518,"text":519},"6d0ef73eed60",[],", the maintainer traced the issue further upstream and submitted a PR to ",{"_key":521,"_type":36,"marks":522,"text":324},"81f59c57a0d6",[52],{"_key":524,"_type":36,"marks":525,"text":526},"52e5f0d71eaa",[]," itself — fixing the error handling so that errors from ",{"_key":528,"_type":36,"marks":529,"text":142},"06ca504e3ba2",[52],{"_key":531,"_type":36,"marks":532,"text":533},"682cdb3d023d",[],"-prefixed entries are properly catchable instead of becoming unhandled promise rejections that the caller couldn't catch.",[],{"_key":536,"_type":32,"children":537,"markDefs":542,"style":49},"8d8dc2622582",[538],{"_key":539,"_type":36,"marks":540,"text":541},"3a574b902b75",[],"Moreover, somehow it also uncovered a CI coverage gap: the test suite for tarball handling had a describe block that was being silently skipped because of a wrong Deno version number in the test configuration. An entire set of tarball tests had been passing CI without actually running.",[],{"_key":544,"_type":32,"children":545,"markDefs":557,"style":49},"a2157bff6f5f",[546,550,553],{"_key":547,"_type":36,"marks":548,"text":549},"f44fa96e8384",[],"One missing ",{"_key":551,"_type":36,"marks":552,"text":142},"070f01c6552b",[52],{"_key":554,"_type":36,"marks":555,"text":556},"c9be058f13e8",[],", and suddenly there were three fixes flowing in different directions.",[],{"_key":559,"_type":32,"children":560,"markDefs":564,"style":49},"6faead21cd56",[561],{"_key":562,"_type":36,"marks":563,"text":456},"7708383bd1b6",[],[],{"_key":566,"_type":32,"children":567,"markDefs":572,"style":120},"4ac7add6141d",[568],{"_key":569,"_type":36,"marks":570,"text":571},"afbf069e6278",[],"Looking Back",[],{"_key":574,"_type":32,"children":575,"markDefs":594,"style":49},"d72779513091",[576,580,583,587,590],{"_key":577,"_type":36,"marks":578,"text":579},"c49ddb33f5d0",[],"Reading someone else's TypeScript to find out why my site wouldn't deploy is not something I'd done before this week. The typical workaround for this kind of issue you would find online, is to duplicate the files without the ",{"_key":581,"_type":36,"marks":582,"text":142},"57f35b11e180",[52],{"_key":584,"_type":36,"marks":585,"text":586},"a6d37e90d1f8",[],". That works. Your build passes. You move on. But somewhere the same bug is still waiting for the next person. And the next. Until someone reads the function that's eating the ",{"_key":588,"_type":36,"marks":589,"text":142},"9c53a8dd10a4",[52],{"_key":591,"_type":36,"marks":592,"text":593},"880006d4bdeb",[],".",[],{"_key":596,"_type":32,"children":597,"markDefs":602,"style":49},"6d7fd06241ae",[598],{"_key":599,"_type":36,"marks":600,"text":601},"65ebc5491da9",[],"There's something I've been thinking about since. The experienced developers who maintain these projects, they do this kind of invisible work all the time, and they do it faster than I ever could. They trace a bug, fix it, and the result is that thousands of people simply never encounter the problem. Nobody knows it was ever there.",[],{"_key":604,"_type":32,"children":605,"markDefs":610,"style":49},"ae38d15de43c",[606],{"_key":607,"_type":36,"marks":608,"text":609},"e71faa7091da",[],"I'm not a developer by trade. If these projects had been closed-source, my story would have ended at the forum post with no replies, waiting for someone on the other side to notice. But because the code was right there, I could pull it down and find the answer myself. A workaround solves your problem. A root cause fix solves everyone's.",[],{"_key":612,"_type":32,"children":613,"markDefs":617,"style":49},"c8e9694225f0",[614],{"_key":615,"_type":36,"marks":616,"text":456},"a75cec0a8c39",[],[],{"_key":619,"_type":32,"children":620,"markDefs":625,"style":120},"1fe8af92cfe7",[621],{"_key":622,"_type":36,"marks":623,"text":624},"6c87ad9c3ec5",[],"Links",[],{"_key":627,"_type":32,"children":628,"level":26,"listItem":637,"markDefs":638,"style":49},"217c1ee7c458",[629,632],{"_key":622,"_type":36,"marks":630,"text":631},[]," Post on netlify forum: ",{"_key":633,"_type":36,"marks":634,"text":636},"b1af8248933b",[635],"fb042170772f","Edge Functions bundling failed for Qwik: ENOENT: no such file or directory, stat ‘@qwik-city-not-found-paths.js’ (Vite 7) - #6 by statusbot - Support - Netlify Support Forums","bullet",[639],{"_key":635,"_type":640,"href":641},"link","https://answers.netlify.com/t/edge-functions-bundling-failed-for-qwik-enoent-no-such-file-or-directory-stat-qwik-city-not-found-paths-js-vite-7/160697",{"_key":643,"_type":32,"children":644,"level":26,"listItem":637,"markDefs":654,"style":49},"40720596d54c",[645,649],{"_key":646,"_type":36,"marks":647,"text":648},"76feb6872455",[],"PR: netlify/build: ",{"_key":650,"_type":36,"marks":651,"text":653},"e60f2d437257",[652],"38b09054024b","fix: add ./ prefix to tar entries to handle @ prefixed filenames",[655],{"_key":652,"_type":640,"href":656},"https://github.com/netlify/build/pull/6990",{"_key":658,"_type":32,"children":659,"level":26,"listItem":637,"markDefs":669,"style":49},"284a2ccd34ca",[660,664],{"_key":661,"_type":36,"marks":662,"text":663},"d6f7df565b05",[],"Upstream: node-tar: fix from pieh: ",{"_key":665,"_type":36,"marks":666,"text":668},"a8e0e3f4b200",[667],"fd06de57580c","error from @ file entry should be catchable",[670],{"_key":667,"_type":640,"href":671},"https://github.com/isaacs/node-tar/commit/01082a42c3256ca6054f9627911cce4dbfe00d92",{"_key":673,"_type":32,"children":674,"level":26,"listItem":637,"markDefs":684,"style":49},"27323841f7e5",[675,679],{"_key":676,"_type":36,"marks":677,"text":678},"2cc3a47d2a49",[],"Upstream: node-tar: where stripping @ symbol as directives: ",{"_key":680,"_type":36,"marks":681,"text":683},"7d197d73d04a",[682],"1a703c38be70","node-tar/src/create.ts at main · isaacs/node-tar",[685],{"_key":682,"_type":640,"href":686},"https://github.com/isaacs/node-tar/blob/main/src/create.ts#L43",{"_key":688,"_type":32,"children":689,"level":26,"listItem":637,"markDefs":699,"style":49},"ad6d7413ef52",[690,694],{"_key":691,"_type":36,"marks":692,"text":693},"132eb4cbb24c",[],"Bug reproducing repo: ",{"_key":695,"_type":36,"marks":696,"text":698},"969c4f4726a2",[697],"4facf785e161","osmiumsilver/demo-tar-at-file",[700],{"_key":697,"_type":640,"href":701},"https://github.com/osmiumsilver/demo-tar-at-file","2026-04-14T07:53:00.000Z",{"_type":8,"current":9},"How a missing @ in a filename broke my Netlify build",{"documents":706,"paths":708,"mappings":713},[707],{"_id":13,"_type":14},[709,710,16,711,17,712],"$['_id']","$['content']","$['publishedAt']","$['title']",{"$['_id']":714,"$['content']":716,"$['language']":718,"$['publishedAt']":721,"$['slug']":724,"$['title']":727},{"source":715,"type":23},{"document":21,"path":21,"type":22},{"source":717,"type":23},{"document":21,"path":26,"type":22},{"source":719,"type":23},{"document":21,"path":720,"type":22},2,{"source":722,"type":23},{"document":21,"path":723,"type":22},3,{"source":725,"type":23},{"document":21,"path":726,"type":22},4,{"source":728,"type":23},{"document":21,"path":729,"type":22},5,1777291183352]