From f836148ddddb1c8743a7abb8ad02635203a61c52 Mon Sep 17 00:00:00 2001 From: Ferran Basora Date: Fri, 3 Nov 2023 10:57:51 +0100 Subject: [PATCH] Refactor how Gat compiles templates A new way how Gat handles the template generation. --- src/cli.ts | 62 +++---------------------------------------------- src/workflow.ts | 19 ++++++++++++--- 2 files changed, 19 insertions(+), 62 deletions(-) diff --git a/src/cli.ts b/src/cli.ts index 5b7c76e..d8d1c51 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -4,83 +4,27 @@ import path from "path"; import { exec } from "child_process"; import { Command } from "commander"; import { promisify } from "util"; -import debounce from "lodash/debounce"; const execPromise = promisify(exec); -const writeFilePromise = promisify(fs.writeFile); const folder = path.join(process.cwd(), ".github", "templates"); -const parseFile = async (templateFile: string) => { - // NOTE: can we improve this using ts-node or typescript programatically? - const { stdout } = await execPromise( - `npx ts-node ${ - process.env["GAT_BUILD_FLAGS"] ?? "--swc -T" - } ${templateFile}` - ); - - await writeFilePromise( - path.join( - process.cwd(), - ".github", - "workflows", - templateFile.split("/").at(-1)!.replace(".ts", ".yml") - ), - stdout - ); -}; - const cli = new Command(); cli - .version("1.0.0") + .version("2.0.0") .description("Write your GitHub Actions workflows using TypeScript"); cli .command("build") .description("Transpile all Gat templates into GitHub Actions workflows.") - .argument("[file]", "(Optional) A Gat template file") - .action(async (file) => { + .action(async () => { if (!fs.existsSync(path.join(folder, "..", "workflows"))) { fs.mkdirSync(path.join(folder, "..", "workflows")); } - if (file !== undefined) { - await parseFile(file); - } else { - await Promise.all( - fs.readdirSync(folder).map(async (templateFile) => { - if (!templateFile.match(/^shared$/)) { - await parseFile(`${path.join(folder, templateFile)}`); - } - }) - ); - } + await execPromise(`npx ts-node ${process.env["GAT_BUILD_FLAGS"] ?? "--swc -T"} ${path.join(folder, 'index.ts')}`); process.exit(0); }); -cli - .command("watch") - .description( - "Watch file changes in your Gat templates folder and transpile them automatically." - ) - .action(async () => { - const parseWatchedFile = debounce(async (fileName) => { - const start = process.hrtime.bigint(); - process.stdout.write( - `😸 Detected change on file ${fileName}. Transpiling... ` - ); - await parseFile(path.join(folder, fileName.toString())); - console.log( - `Done in ${( - Number(process.hrtime.bigint() - start) / 1_000_000 - ).toFixed(2)}ms` - ); - }, 1000); - console.log(`😼 Watching file changes on ${folder}...`); - fs.watch(folder).on("change", (_eventName, fileName) => { - parseWatchedFile(fileName); - }); - }); - cli.parse(process.argv); diff --git a/src/workflow.ts b/src/workflow.ts index 2f355fa..e0c3ff4 100644 --- a/src/workflow.ts +++ b/src/workflow.ts @@ -1,10 +1,15 @@ import { dump } from "js-yaml"; import kebabCase from "lodash/kebabCase"; +import fs from "fs"; +import path from "path"; +import { promisify } from "util"; import { ConcurrencyGroup, Job, JobOptions, StringWithNoSpaces } from "./job"; import type { Event, EventName, EventOptions } from "./event"; import { BaseStep, Step } from "./step"; +const writeFilePromise = promisify(fs.writeFile); + const DEFAULT_RUNNERS = ["ubuntu-22.04"]; interface DefaultOptions { @@ -73,7 +78,7 @@ export class Workflow< return isSelfHosted ? ["self-hosted", runnerName] : runnerName; } - compile() { + compile(filepath?: string) { const result = { name: this.name, on: Object.fromEntries( @@ -187,8 +192,16 @@ export class Workflow< } )}`; - console.log(compiled); + if (!filepath) return compiled - return compiled; + return writeFilePromise( + path.join( + process.cwd(), + ".github", + "workflows", + filepath + ), + compiled + ); } }