{"record":{"id":"dd57979414e88d80","repo":"oven-sh/bun","slug":"vendor-name-does-not-have-a-test-directory","errorCode":null,"errorMessage":"Vendor '${name}' does not have a test directory: ${testParentPath}","messagePattern":"Vendor '(.+?)' does not have a test directory: (.+?)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"scripts/runner.node.mjs","lineNumber":2433,"sourceCode":"        if (!ok) throw new Error(`failed to fetch tag ${tag} for vendor '${name}': ${error}`);\n\n        ({ ok, error } = await spawnSafe({\n          command: \"git\",\n          args: [\"checkout\", tag],\n          timeout: testTimeout,\n          cwd: vendorPath,\n        }));\n        if (!ok) throw new Error(`failed to checkout tag ${tag} for vendor '${name}': ${error}`);\n\n        const packageJsonPath = join(vendorPath, \"package.json\");\n        if (!existsSync(packageJsonPath)) {\n          throw new Error(`Vendor '${name}' does not have a package.json: ${packageJsonPath}`);\n        }\n\n        const testPathPrefix = testPath || \"test\";\n        const testParentPath = join(vendorPath, testPathPrefix);\n        if (!existsSync(testParentPath)) {\n          throw new Error(`Vendor '${name}' does not have a test directory: ${testParentPath}`);\n        }\n\n        const isTest = path => {\n          if (!isJavaScriptTest(path)) {\n            return false;\n          }\n\n          if (typeof skipTests === \"boolean\") {\n            return !skipTests;\n          }\n\n          if (typeof skipTests === \"object\") {\n            for (const [glob, reason] of Object.entries(skipTests)) {\n              const pattern = new RegExp(`^${glob.replace(/\\*/g, \".*\")}$`);\n              if (pattern.test(path) && reason) {\n                return false;\n              }\n            }","sourceCodeStart":2415,"sourceCodeEnd":2451,"githubUrl":"https://github.com/oven-sh/bun/blob/8c5296ac459e8252d3cd702f3fbcbb0c249d95d5/scripts/runner.node.mjs#L2415-L2451","documentation":"Thrown during vendor test setup: after cloning and checking out the vendor repo at its pinned tag, the runner sanity-checks that the checkout contains the files it needs to run tests. This variant fires when the vendor's test parent directory is absent, meaning the pinned tag either moved its tests or ships without them, so the runner cannot discover any test files to execute.","triggerScenarios":"Thrown at scripts/runner.node.mjs:2433 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Fix the testPath entries in test/vendor.json to match the repo layout","Update the tag if the test directory moved"],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"8c5296ac459e8252d3cd702f3fbcbb0c249d95d5","analyzedAt":"2026-08-16T08:01:58.794Z","contentChangedAt":"2026-08-16T08:01:58.794Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}