import _locreq from "locreq"; import { promises as fs } from "fs"; import { formatWithPrettier } from "./utils/prettier.js"; import recursive from "recursive-readdir"; import path, { dirname } from "path"; import { toKebabCase, toPascalCase } from "js-convert-case"; const target_locreq = _locreq(process.cwd()); export async function generateStimulusControllers( controller_dirs: string[] ): Promise { const output_file = "src/front/controllers.ts"; const stimulus_search_dirs = [ target_locreq.resolve("src/"), ...controller_dirs, ]; console.info("Looking for controllers in ", stimulus_search_dirs); const controller_names = ( await Promise.all(stimulus_search_dirs.map((dir) => recursive(dir))) ) .flat() .filter((c) => c.endsWith(".stimulus.ts")) .sort(); const controller_data = controller_names .map( (p) => "./" + path .relative(target_locreq.resolve(dirname(output_file)), p) .replace(/\.[tj]sx?$/, ".js") ) .map((relative_path) => { const name = relative_path.match(/\/([^/]+).stimulus/)?.[1]; return { name, relative_path }; }); const content = `// DO NOT EDIT! This file is generated automaticaly with 'npm run generate-stimulus' import * as Turbo from "@hotwired/turbo"; import { Application } from "stimulus"; const application = Application.start(); ${controller_data .map( (c) => ` import { default as ${toPascalCase(c.name)} } from "${c.relative_path}"; application.register("${toKebabCase(c.name)}", ${toPascalCase(c.name)});` ) .join("\n")} export { Turbo }; `; await fs.writeFile( target_locreq.resolve(output_file), await formatWithPrettier(content) ); console.info(`Successfuly generated new ${output_file} file`); }