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

  1. Create one of the listed candidate files in the app dir — for Svelte/Vue apps index.ts, otherwise index.tsx is conventional
  2. Rename an existing differently-named entry (e.g. main.tsx, App.tsx) to the expected index.* name
  3. 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.