windmill-labs/windmill · error
No entry point in ${appDir}: expected one of ${candidates.jo
Error message
No entry point in ${appDir}: expected one of ${candidates.join(", ")} What it means
Thrown by entryPointFor in the bundle command when no expected raw-app entry file exists in the app directory. The candidate list is framework-aware (detectFrameworks decides it): ['index.ts','index.tsx','index.js'] when Svelte or Vue is detected, ['index.tsx','index.ts','index.js'] otherwise. The error names every candidate tried, so the directory was checked and none of them present — the raw app is missing its entry file or you pointed the command at the wrong directory.
Source
Thrown at cli/src/commands/app/bundle_command.ts:23
import * as log from "../../core/log.ts";
import { colors } from "@cliffy/ansi/colors";
import { createBundle, detectFrameworks } from "./bundle.ts";
interface BundleOptions {
out?: string;
minify?: boolean;
}
/** Every entry point a raw app may have, most specific first, with the
* framework's preferred one promoted — Svelte and Vue mount from a `.ts`. */
function entryPointFor(appDir: string): string {
const frameworks = detectFrameworks(appDir);
const candidates = frameworks.svelte || frameworks.vue
? ["index.ts", "index.tsx", "index.js"]
: ["index.tsx", "index.ts", "index.js"];
const entry = candidates.find((c) => fs.existsSync(path.join(appDir, c)));
if (!entry) {
throw new Error(
`No entry point in ${appDir}: expected one of ${candidates.join(", ")}`,
);
}
return path.join(appDir, entry);
}
/**
* Bundle a raw app folder without deploying it. `wmill app push` bundles as part
* of deploying; this exposes the same build on its own, so anything that needs a
* raw app's js/css — the server-side bundler behind `/apps/update_raw_source`,
* most of all — runs this exact build rather than reimplementing it.
*
* The result goes to files, not stdout: the build logs to stdout as it runs, so
* a caller can't read the bundle off the pipe.
*/
async function bundleApp(opts: BundleOptions, appFolder?: string) {
const appDir = path.resolve(appFolder ?? process.cwd());
View on GitHub (pinned to e474e8803c)
Solutions
- Create one of the listed candidate files in the app dir — for Svelte/Vue apps index.ts, otherwise index.tsx is conventional
- Rename an existing differently-named entry (e.g. main.tsx, App.tsx) to the expected index.* name
- Verify the directory passed to the bundle command is actually the raw app root
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at cli/src/commands/app/bundle_command.ts:23 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of windmill-labs/windmill@e474e8803c (2026-09-03).
Data as JSON: /api/errors/f2ecc36dd62dfa5d.
Report an issue: GitHub.