fix(cli): revert findCodebase change that broke ../shared codebases (#7740)

* fix(cli): revert findCodebase relative_path check that broke ../shared codebases

The previous change added a check to ensure script paths start with the
codebase's relative_path. However, this broke cases where relative_path
uses parent directory references (e.g., "../shared") because:

1. path.join normalizes paths, so "/project/../shared/f/script.ts" becomes
   "/shared/f/script.ts"
2. FSFSElement strips the cwd prefix, resulting in "f/script.ts"
3. The check "f/script.ts".startsWith("../shared/") failed

The original behavior was correct - relative_path indicates where to find
codebase files, while includes/excludes patterns match against the normalized
paths that get passed during sync.

Fixes regression reported in #7729 comments.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* test(cli): add preview test for codebase with imports

Tests that codebase bundling correctly includes imported modules,
which is the key functionality needed for ../shared codebases.
The test creates a helper module and a main script that imports
from it, then verifies the bundled script executes correctly.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Ruben Fiszel
2026-01-29 17:09:02 +00:00
committed by GitHub
parent fe4a230833
commit 20357f41f5
2 changed files with 81 additions and 14 deletions

View File

@@ -306,6 +306,85 @@ export function main(name: string = "World") {
sanitizeOps: false,
});
Deno.test({
name: "script preview: codebase with imports (simulates ../shared layout)",
async fn() {
await withTestBackend(async (backend, tempDir) => {
// This test simulates a codebase that could be in a parent directory.
// The structure is:
// tempDir/
// wmill.yaml (codebase at ".")
// f/
// lib/
// helper.ts (shared module)
// main_script.ts (imports helper)
//
// This tests that codebase bundling correctly includes imported modules,
// which is the key functionality needed for ../shared codebases during sync.
// Note: Preview requires valid windmill paths (u/, g/, f/), so we run
// from within the codebase directory.
await createWmillConfig(tempDir, {
defaultTs: "bun",
codebases: [{ relative_path: ".", includes: ["**"] }],
});
// Create helper module
await Deno.mkdir(`${tempDir}/f/lib`, { recursive: true });
await Deno.writeTextFile(
`${tempDir}/f/lib/helper.ts`,
`export function greet(name: string): string {
return \`Hello from shared codebase, \${name}!\`;
}`
);
// Create main script that imports the helper
await Deno.writeTextFile(
`${tempDir}/f/lib/main_script.ts`,
`import { greet } from "./helper";
export function main(name: string = "World") {
console.log("Running codebase script with imports");
return greet(name);
}`
);
// Create script metadata
await Deno.writeTextFile(
`${tempDir}/f/lib/main_script.script.yaml`,
`summary: "Test script with imports"
description: "Test script that imports from helper module"
lock: ""
schema:
$schema: "https://json-schema.org/draft/2020-12/schema"
type: object
properties:
name:
type: string
default: "World"
required: []
`
);
// Run preview - the script should be bundled with the helper module
const result = await backend.runCLICommand(
["script", "preview", "f/lib/main_script.ts"],
tempDir
);
assertEquals(result.code, 0, `Preview failed: ${result.stderr}\n${result.stdout}`);
// The script should be bundled (includes the helper) and run successfully
assertStringIncludes(
result.stdout + result.stderr,
"Hello from shared codebase, World!",
`Expected codebase script output not found. Got: ${result.stdout}\n${result.stderr}`
);
});
},
sanitizeResources: false,
sanitizeOps: false,
});
// =============================================================================
// FLOW PREVIEW TESTS
// =============================================================================