From 6899a16efb2bc12883669486b170abbc523792fe Mon Sep 17 00:00:00 2001 From: centdix <40307056+centdix@users.noreply.github.com> Date: Tue, 27 Jan 2026 16:14:42 +0100 Subject: [PATCH] fix(cli): make `wmill app new` respects nonDottedPaths setting from wmill.yaml (#7700) * update dnt * fix nondottedpath settings --- cli/deno.lock | 40 ++++++++++++++++++++++---- cli/dnt.ts | 2 +- cli/src/commands/app/dev.ts | 46 ++--------------------------- cli/src/commands/app/new.ts | 8 +++++- cli/src/utils/resource_folders.ts | 48 ++++++++++++++++++++++++++++++- 5 files changed, 92 insertions(+), 52 deletions(-) diff --git a/cli/deno.lock b/cli/deno.lock index a19622b94e..59a1002364 100644 --- a/cli/deno.lock +++ b/cli/deno.lock @@ -2,8 +2,10 @@ "version": "5", "specifiers": { "jsr:@david/code-block-writer@^13.0.2": "13.0.2", + "jsr:@david/code-block-writer@^13.0.3": "13.0.3", "jsr:@deno/cache-dir@~0.10.3": "0.10.3", "jsr:@deno/dnt@0.41.3": "0.41.3", + "jsr:@deno/dnt@0.42.3": "0.42.3", "jsr:@deno/dnt@~0.41.3": "0.41.3", "jsr:@deno/graph@~0.73.1": "0.73.1", "jsr:@std/assert@0.223": "0.223.0", @@ -20,7 +22,7 @@ "jsr:@std/fmt@~0.225.4": "0.225.6", "jsr:@std/fs@*": "1.0.22", "jsr:@std/fs@0.223": "0.223.0", - "jsr:@std/fs@1": "1.0.20", + "jsr:@std/fs@1": "1.0.22", "jsr:@std/fs@^1.0.11": "1.0.22", "jsr:@std/fs@^1.0.21": "1.0.22", "jsr:@std/fs@~0.229.3": "0.229.3", @@ -32,7 +34,7 @@ "jsr:@std/log@*": "0.224.14", "jsr:@std/path@*": "1.1.4", "jsr:@std/path@0.223": "0.223.0", - "jsr:@std/path@1": "1.1.3", + "jsr:@std/path@1": "1.1.4", "jsr:@std/path@1.0.0-rc.1": "1.0.0-rc.1", "jsr:@std/path@1.0.0-rc.2": "1.0.0-rc.2", "jsr:@std/path@^1.1.3": "1.1.4", @@ -42,7 +44,9 @@ "jsr:@std/yaml@*": "1.0.10", "jsr:@std/yaml@^1.0.10": "1.0.10", "jsr:@ts-morph/bootstrap@0.24": "0.24.0", + "jsr:@ts-morph/bootstrap@0.27": "0.27.0", "jsr:@ts-morph/common@0.24": "0.24.0", + "jsr:@ts-morph/common@0.27": "0.27.0", "jsr:@windmill-labs/cliffy-ansi@1.0.0-rc.5": "1.0.0-rc.5", "jsr:@windmill-labs/cliffy-command@1.0.0-rc.5": "1.0.0-rc.5", "jsr:@windmill-labs/cliffy-flags@1.0.0-rc.5": "1.0.0-rc.5", @@ -90,6 +94,9 @@ "@david/code-block-writer@13.0.2": { "integrity": "14dd3baaafa3a2dea8bf7dfbcddeccaa13e583da2d21d666c01dc6d681cd74ad" }, + "@david/code-block-writer@13.0.3": { + "integrity": "f98c77d320f5957899a61bfb7a9bead7c6d83ad1515daee92dbacc861e13bb7f" + }, "@deno/cache-dir@0.10.3": { "integrity": "eb022f84ecc49c91d9d98131c6e6b118ff63a29e343624d058646b9d50404776", "dependencies": [ @@ -103,12 +110,22 @@ "@deno/dnt@0.41.3": { "integrity": "b2ef2c8a5111eef86cb5bfcae103d6a2938e8e649e2461634a7befb7fc59d6d2", "dependencies": [ - "jsr:@david/code-block-writer", + "jsr:@david/code-block-writer@^13.0.2", "jsr:@deno/cache-dir", "jsr:@std/fmt@1", "jsr:@std/fs@1", "jsr:@std/path@1", - "jsr:@ts-morph/bootstrap" + "jsr:@ts-morph/bootstrap@0.24" + ] + }, + "@deno/dnt@0.42.3": { + "integrity": "62a917a0492f3c8af002dce90605bb0d41f7d29debc06aca40dba72ab65d8ae3", + "dependencies": [ + "jsr:@david/code-block-writer@^13.0.3", + "jsr:@std/fmt@1", + "jsr:@std/fs@1", + "jsr:@std/path@1", + "jsr:@ts-morph/bootstrap@0.27" ] }, "@deno/graph@0.73.1": { @@ -236,7 +253,13 @@ "@ts-morph/bootstrap@0.24.0": { "integrity": "a826a2ef7fa8a7c3f1042df2c034d20744d94da2ee32bf29275bcd4dffd3c060", "dependencies": [ - "jsr:@ts-morph/common" + "jsr:@ts-morph/common@0.24" + ] + }, + "@ts-morph/bootstrap@0.27.0": { + "integrity": "b8d7bc8f7942ce853dde4161b28f9aa96769cef3d8eebafb379a81800b9e2448", + "dependencies": [ + "jsr:@ts-morph/common@0.27" ] }, "@ts-morph/common@0.24.0": { @@ -246,6 +269,13 @@ "jsr:@std/path@~0.225.2" ] }, + "@ts-morph/common@0.27.0": { + "integrity": "c7b73592d78ce8479b356fd4f3d6ec3c460d77753a8680ff196effea7a939052", + "dependencies": [ + "jsr:@std/fs@1", + "jsr:@std/path@1" + ] + }, "@windmill-labs/cliffy-ansi@1.0.0-rc.5": { "integrity": "1109cbcb0c415b57779352f708f5969b8c645f56bc555cbafc6ea5e0c6a360a4", "dependencies": [ diff --git a/cli/dnt.ts b/cli/dnt.ts index 9f576a3a2c..dd4ce1110e 100644 --- a/cli/dnt.ts +++ b/cli/dnt.ts @@ -1,5 +1,5 @@ // ex. scripts/build_npm.ts -import { build, emptyDir } from "jsr:@deno/dnt@0.41.3"; +import { build, emptyDir } from "jsr:@deno/dnt@0.42.3"; import { VERSION } from "./src/main.ts"; await emptyDir("./npm"); diff --git a/cli/src/commands/app/dev.ts b/cli/src/commands/app/dev.ts index 86d335c5ac..ba31909ed3 100644 --- a/cli/src/commands/app/dev.ts +++ b/cli/src/commands/app/dev.ts @@ -39,54 +39,12 @@ import { regenerateAgentDocs } from "./generate_agents.ts"; import { getFolderSuffix, hasFolderSuffix, - setNonDottedPaths, + loadNonDottedPathsSetting, } from "../../utils/resource_folders.ts"; const DEFAULT_PORT = 4000; const DEFAULT_HOST = "localhost"; -/** - * Search for wmill.yaml by traversing upward from the current directory. - * Unlike the standard findWmillYaml() in conf.ts, this does not stop at - * the git root - it continues searching until the filesystem root. - * This is needed for `app dev` which runs from inside a raw_app folder - * that may be deeply nested within a larger git repository. - */ -async function findAndLoadNonDottedPathsSetting(): Promise { - let currentDir = process.cwd(); - - while (true) { - const wmillYamlPath = path.join(currentDir, "wmill.yaml"); - - if (fs.existsSync(wmillYamlPath)) { - try { - const config = await yamlParseFile(wmillYamlPath) as { - nonDottedPaths?: boolean; - }; - setNonDottedPaths(config?.nonDottedPaths ?? false); - log.debug( - `Found wmill.yaml at ${wmillYamlPath}, nonDottedPaths=${ - config?.nonDottedPaths ?? false - }`, - ); - } catch (e) { - log.debug(`Failed to parse wmill.yaml at ${wmillYamlPath}: ${e}`); - } - return; - } - - // Check if we've reached the filesystem root - const parentDir = path.dirname(currentDir); - if (parentDir === currentDir) { - // Reached filesystem root without finding wmill.yaml - log.debug("No wmill.yaml found, using default dotted paths"); - return; - } - - currentDir = parentDir; - } -} - // HTML template with live reload and SQL migration modal const createHTML = (jsPath: string, cssPath: string) => ` @@ -353,7 +311,7 @@ async function dev(opts: DevOptions) { // Search for wmill.yaml by traversing upward (without git root constraint) // to initialize nonDottedPaths setting before using folder suffix functions - await findAndLoadNonDottedPathsSetting(); + await loadNonDottedPathsSetting(); // Validate that we're in a .raw_app folder const cwd = process.cwd(); diff --git a/cli/src/commands/app/new.ts b/cli/src/commands/app/new.ts index 21b1d05c6e..7dd5cf7d6e 100644 --- a/cli/src/commands/app/new.ts +++ b/cli/src/commands/app/new.ts @@ -14,7 +14,10 @@ import { resolveWorkspace } from "../../core/context.ts"; import { requireLogin } from "../../core/auth.ts"; import * as wmill from "../../../gen/services.gen.ts"; import path from "node:path"; -import { buildFolderPath } from "../../utils/resource_folders.ts"; +import { + buildFolderPath, + loadNonDottedPathsSetting, +} from "../../utils/resource_folders.ts"; // Framework templates - adapted from frontend/src/routes/(root)/(logged)/apps_raw/add/templates.ts const reactIndex = ` @@ -472,6 +475,9 @@ CREATE SCHEMA IF NOT EXISTS ${schemaName}; ); } + // Load nonDottedPaths setting from wmill.yaml before creating folder + await loadNonDottedPathsSetting(); + // Create the directory structure - preserve full path (e.g., f/foobar/x/y becomes f/foobar/x/y.raw_app) const folderName = buildFolderPath(appPath, "raw_app"); const appDir = path.join(Deno.cwd(), folderName); diff --git a/cli/src/utils/resource_folders.ts b/cli/src/utils/resource_folders.ts index b939e15be2..5d7fc7c1ca 100644 --- a/cli/src/utils/resource_folders.ts +++ b/cli/src/utils/resource_folders.ts @@ -8,7 +8,10 @@ * (.flow, .app, .raw_app) or dunder-prefixed names (__flow, __app, __raw_app). */ -import { log, SEP } from "../../deps.ts"; +import { log, SEP, yamlParseFile } from "../../deps.ts"; +import * as fs from "node:fs"; +import * as path from "node:path"; +import process from "node:process"; // Resource types that use folder-based storage export type FolderResourceType = "flow" | "app" | "raw_app"; @@ -56,6 +59,49 @@ export function getNonDottedPaths(): boolean { return _nonDottedPaths; } +/** + * Search for wmill.yaml by traversing upward from the current directory + * and initialize the nonDottedPaths setting. + * Unlike findWmillYaml() in conf.ts, this does not stop at the git root - + * it continues searching until the filesystem root. + * This is needed for commands like `app dev` and `app new` which may run + * from inside folders that are deeply nested within a larger git repository. + */ +export async function loadNonDottedPathsSetting(): Promise { + let currentDir = process.cwd(); + + while (true) { + const wmillYamlPath = path.join(currentDir, "wmill.yaml"); + + if (fs.existsSync(wmillYamlPath)) { + try { + const config = (await yamlParseFile(wmillYamlPath)) as { + nonDottedPaths?: boolean; + }; + setNonDottedPaths(config?.nonDottedPaths ?? false); + log.debug( + `Found wmill.yaml at ${wmillYamlPath}, nonDottedPaths=${ + config?.nonDottedPaths ?? false + }` + ); + } catch (e) { + log.debug(`Failed to parse wmill.yaml at ${wmillYamlPath}: ${e}`); + } + return; + } + + // Check if we've reached the filesystem root + const parentDir = path.dirname(currentDir); + if (parentDir === currentDir) { + // Reached filesystem root without finding wmill.yaml + log.debug("No wmill.yaml found, using default dotted paths"); + return; + } + + currentDir = parentDir; + } +} + /** * Get the folder suffixes based on the global configuration. */