An experimental TypeSpec syntax for Lexicon

upwards

+48 -11
+48 -11
packages/cli/src/commands/init.ts
··· 49 49 console.log("Initializing typelex project...\n"); 50 50 console.log("Installing dependencies...\n"); 51 51 52 - // Detect package manager 52 + // Detect package manager and lexicons directory by walking up directory tree 53 53 let packageManager = "npm"; 54 - try { 55 - await access(resolve(cwd, "pnpm-lock.yaml")); 56 - packageManager = "pnpm"; 57 - } catch { 58 - try { 59 - await access(resolve(cwd, "yarn.lock")); 60 - packageManager = "yarn"; 61 - } catch { 62 - // Default to npm 54 + let lexiconsDir: string | null = null; 55 + let currentDir = cwd; 56 + const root = resolve("/"); 57 + 58 + // First, move up one directory (we only want lexicons from parent directories) 59 + const parentDir = resolve(currentDir, ".."); 60 + if (parentDir !== currentDir) { 61 + currentDir = parentDir; 62 + 63 + while (currentDir !== root) { 64 + // Check for package manager lockfiles 65 + if (packageManager === "npm") { 66 + try { 67 + await access(resolve(currentDir, "pnpm-lock.yaml")); 68 + packageManager = "pnpm"; 69 + } catch { 70 + try { 71 + await access(resolve(currentDir, "yarn.lock")); 72 + packageManager = "yarn"; 73 + } catch { 74 + // Continue 75 + } 76 + } 77 + } 78 + 79 + // Check for lexicons directory (only in parent directories) 80 + if (!lexiconsDir) { 81 + try { 82 + const lexiconsPath = resolve(currentDir, "lexicons"); 83 + await access(lexiconsPath); 84 + // Calculate relative path from cwd to this lexicons directory 85 + const relative = require("path").relative(cwd, lexiconsPath); 86 + lexiconsDir = relative; 87 + } catch { 88 + // Continue 89 + } 90 + } 91 + 92 + // Move up one directory 93 + const nextParent = resolve(currentDir, ".."); 94 + if (nextParent === currentDir) break; // Reached root 95 + currentDir = nextParent; 63 96 } 64 97 } 65 98 ··· 136 169 packageJson.scripts = {}; 137 170 } 138 171 if (!packageJson.scripts["build:typelex"]) { 139 - packageJson.scripts["build:typelex"] = `typelex compile ${namespace}`; 172 + const outFlag = lexiconsDir ? ` --out ${lexiconsDir}` : ""; 173 + packageJson.scripts["build:typelex"] = `typelex compile ${namespace}${outFlag}`; 140 174 await writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2) + "\n", "utf-8"); 141 175 console.log("✓ Added build:typelex script to package.json"); 176 + if (lexiconsDir) { 177 + console.log(` Using existing lexicons directory: ${lexiconsDir}`); 178 + } 142 179 } else { 143 180 console.log("✓ build:typelex script already exists in package.json"); 144 181 }