From a450559c4d02a774d305aef3d04e8ce2e36e6e33 Mon Sep 17 00:00:00 2001 From: Bert De Block Date: Sun, 10 Mar 2024 20:30:28 +0100 Subject: [PATCH] Various internal improvements --- .scaffdog/documents/component.md | 4 +- .scaffdog/documents/helper.md | 2 +- .scaffdog/documents/modifier.md | 2 +- .scaffdog/documents/service.md | 4 +- README.md | 2 +- src/cli.ts | 17 ++++---- src/generate-document.ts | 22 +++++++--- src/generators.ts | 72 +++++++++++++++++++++++--------- test/generate-component.test.ts | 11 ++--- test/generate-helper.test.ts | 11 ++--- test/generate-modifier.test.ts | 11 ++--- test/generate-service.test.ts | 11 ++--- 12 files changed, 108 insertions(+), 61 deletions(-) diff --git a/.scaffdog/documents/component.md b/.scaffdog/documents/component.md index da9fb75..2e1093d 100644 --- a/.scaffdog/documents/component.md +++ b/.scaffdog/documents/component.md @@ -4,12 +4,12 @@ root: "." output: "**/*" --- -# [[inputs.name + (inputs.gts ? ".gts" : ".gjs")]] +# [[inputs.name]].[[inputs.authoringFormat]] ```gts [[name := pascal(inputs.name)-]] import Component from "@glimmer/component"; -[[if inputs.gts]] +[[if inputs.authoringFormat == "gts"]] export interface [[name]]Signature { Args: {}; Blocks: { diff --git a/.scaffdog/documents/helper.md b/.scaffdog/documents/helper.md index ec37e92..a91e227 100644 --- a/.scaffdog/documents/helper.md +++ b/.scaffdog/documents/helper.md @@ -4,7 +4,7 @@ root: "." output: "**/*" --- -# [[inputs.name + (inputs.ts ? ".ts" : ".js")]] +# [[inputs.name]].[[inputs.authoringFormat]] ```ts export default function [[camel(inputs.name)]]Helper(positional /*, named*/) { diff --git a/.scaffdog/documents/modifier.md b/.scaffdog/documents/modifier.md index cdef219..9db14cd 100644 --- a/.scaffdog/documents/modifier.md +++ b/.scaffdog/documents/modifier.md @@ -4,7 +4,7 @@ root: "." output: "**/*" --- -# [[inputs.name + (inputs.ts ? ".ts" : ".js")]] +# [[inputs.name]].[[inputs.authoringFormat]] ```ts import { modifier } from "ember-modifier"; diff --git a/.scaffdog/documents/service.md b/.scaffdog/documents/service.md index 70f769e..ee334b6 100644 --- a/.scaffdog/documents/service.md +++ b/.scaffdog/documents/service.md @@ -4,14 +4,14 @@ root: "." output: "**/*" --- -# [[inputs.name + (inputs.ts ? ".ts" : ".js")]] +# [[inputs.name]].[[inputs.authoringFormat]] ```ts [[name := pascal(inputs.name)-]] import Service from "@ember/service"; export default class [[name]]Service extends Service {} -[[if inputs.ts]] +[[if inputs.authoringFormat == "ts"]] declare module "@ember/service" { interface Registry { "[[inputs.name]]": [[name]]Service; diff --git a/README.md b/README.md index 82c8fcc..560bd45 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# @bertdeblock/gember +# 🫚 gember [![CI](https://github.com/bertdeblock/gember/workflows/CI/badge.svg)](https://github.com/bertdeblock/gember/actions?query=workflow%3ACI) [![NPM Version](https://badge.fury.io/js/%40bertdeblock%2Fgember.svg)](https://badge.fury.io/js/%40bertdeblock%2Fgember) diff --git a/src/cli.ts b/src/cli.ts index 81e6300..b852cf4 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -1,4 +1,3 @@ -import { cwd } from "node:process"; import { hideBin } from "yargs/helpers"; import yargs from "yargs/yargs"; import { @@ -32,8 +31,8 @@ yargs(hideBin(process.argv)) }); }, handler(options) { - generateComponent(options.name, cwd(), { - gts: options.gts, + generateComponent(options.name, { + authoringFormat: options.gts ? "gts" : "gjs", path: options.path, }); }, @@ -61,9 +60,9 @@ yargs(hideBin(process.argv)) }); }, handler(options) { - generateHelper(options.name, cwd(), { + generateHelper(options.name, { + authoringFormat: options.ts ? "ts" : "js", path: options.path, - ts: options.ts, }); }, }) @@ -90,9 +89,9 @@ yargs(hideBin(process.argv)) }); }, handler(options) { - generateModifier(options.name, cwd(), { + generateModifier(options.name, { + authoringFormat: options.ts ? "ts" : "js", path: options.path, - ts: options.ts, }); }, }) @@ -119,9 +118,9 @@ yargs(hideBin(process.argv)) }); }, handler(options) { - generateService(options.name, cwd(), { + generateService(options.name, { + authoringFormat: options.ts ? "ts" : "js", path: options.path, - ts: options.ts, }); }, }) diff --git a/src/generate-document.ts b/src/generate-document.ts index 2e39862..59f56c1 100644 --- a/src/generate-document.ts +++ b/src/generate-document.ts @@ -2,7 +2,8 @@ import chalk from "chalk"; import { execa } from "execa"; import { ensureDir } from "fs-extra"; import { writeFile } from "node:fs/promises"; -import { dirname, isAbsolute, join, parse } from "node:path"; +import { dirname, isAbsolute, join, parse, relative } from "node:path"; +import { cwd as processCwd } from "node:process"; import { fileURLToPath } from "node:url"; import { type GenerateInputs, loadScaffdog } from "scaffdog"; import { type DocumentName } from "./types.js"; @@ -17,8 +18,15 @@ const DOCUMENT_NAME_DIRECTORY: Record = { export async function generateDocument( documentName: DocumentName, entityName: string, - cwd: string, - { inputs = {}, path = "" }: { inputs?: GenerateInputs; path?: string } = {}, + { + cwd = processCwd(), + inputs = {}, + path = "", + }: { + cwd?: string; + inputs?: GenerateInputs; + path?: string; + } = {}, ) { const directory = dirname(fileURLToPath(import.meta.url)); const scaffdog = await loadScaffdog(join(directory, "..", ".scaffdog")); @@ -50,9 +58,13 @@ export async function generateDocument( // 🤫 } - console.log(chalk.green(`Generated "${file.path}"`)); + console.log( + chalk.green( + `🫚 Generated ${documentName} "${entityName}" at "${relative(cwd, file.path)}".`, + ), + ); } } else { - throw new Error(`Document "${documentName}" not found.`); + throw new Error(`[BUG] Document "${documentName}" not found.`); } } diff --git a/src/generators.ts b/src/generators.ts index 1895aff..3cd67d6 100644 --- a/src/generators.ts +++ b/src/generators.ts @@ -3,44 +3,76 @@ import { DocumentName } from "./types.js"; export function generateComponent( name: string, - cwd: string, - { gts = false, path = "" } = {}, + { + authoringFormat = "gjs", + cwd = "", + path = "", + }: { + authoringFormat?: "gjs" | "gts"; + cwd?: string; + path?: string; + } = {}, ) { - return generateDocument(DocumentName.Component, name, cwd, { - inputs: { gts }, - path: path, + return generateDocument(DocumentName.Component, name, { + cwd, + inputs: { authoringFormat }, + path, }); } export function generateHelper( name: string, - cwd: string, - { path = "", ts = false } = {}, + { + authoringFormat = "js", + cwd = "", + path = "", + }: { + authoringFormat?: "js" | "ts"; + cwd?: string; + path?: string; + } = {}, ) { - return generateDocument(DocumentName.Helper, name, cwd, { - inputs: { ts }, - path: path, + return generateDocument(DocumentName.Helper, name, { + cwd, + inputs: { authoringFormat }, + path, }); } export function generateModifier( name: string, - cwd: string, - { path = "", ts = false } = {}, + { + authoringFormat = "js", + cwd = "", + path = "", + }: { + authoringFormat?: "js" | "ts"; + cwd?: string; + path?: string; + } = {}, ) { - return generateDocument(DocumentName.Modifier, name, cwd, { - inputs: { ts }, - path: path, + return generateDocument(DocumentName.Modifier, name, { + cwd, + inputs: { authoringFormat }, + path, }); } export function generateService( name: string, - cwd: string, - { path = "", ts = false } = {}, + { + authoringFormat = "js", + cwd = "", + path = "", + }: { + authoringFormat?: "js" | "ts"; + cwd?: string; + path?: string; + } = {}, ) { - return generateDocument(DocumentName.Service, name, cwd, { - inputs: { ts }, - path: path, + return generateDocument(DocumentName.Service, name, { + cwd, + inputs: { authoringFormat }, + path, }); } diff --git a/test/generate-component.test.ts b/test/generate-component.test.ts index 04a1725..49f36e3 100644 --- a/test/generate-component.test.ts +++ b/test/generate-component.test.ts @@ -12,7 +12,7 @@ afterEach(() => fsExtra.remove(cwd)); it("generates a `.gjs` component", async (ctx) => { cwd = await copyBlueprint("v2-addon"); - await generateComponent("foo", cwd); + await generateComponent("foo", { cwd }); const content = await readFile(join(cwd, "src/components/foo.gjs"), "utf-8"); @@ -22,7 +22,7 @@ it("generates a `.gjs` component", async (ctx) => { it("generates a `.gts` component", async (ctx) => { cwd = await copyBlueprint("v2-addon"); - await generateComponent("foo", cwd, { gts: true }); + await generateComponent("foo", { authoringFormat: "gts", cwd }); const content = await readFile(join(cwd, "src/components/foo.gts"), "utf-8"); @@ -32,7 +32,7 @@ it("generates a `.gts` component", async (ctx) => { it("generates a `.gjs` component at a custom path", async (ctx) => { cwd = await copyBlueprint("v2-addon"); - await generateComponent("foo", cwd, { path: "src/-private" }); + await generateComponent("foo", { cwd, path: "src/-private" }); const content = await readFile(join(cwd, "src/-private/foo.gjs"), "utf-8"); @@ -42,8 +42,9 @@ it("generates a `.gjs` component at a custom path", async (ctx) => { it("generates a `.gts` component at a custom path", async (ctx) => { cwd = await copyBlueprint("v2-addon"); - await generateComponent("foo", cwd, { - gts: true, + await generateComponent("foo", { + authoringFormat: "gts", + cwd, path: "src/-private", }); diff --git a/test/generate-helper.test.ts b/test/generate-helper.test.ts index b9f7c4e..d53ae51 100644 --- a/test/generate-helper.test.ts +++ b/test/generate-helper.test.ts @@ -12,7 +12,7 @@ afterEach(() => fsExtra.remove(cwd)); it("generates a `.js` helper", async (ctx) => { cwd = await copyBlueprint("v2-addon"); - await generateHelper("foo", cwd); + await generateHelper("foo", { cwd }); const content = await readFile(join(cwd, "src/helpers/foo.js"), "utf-8"); @@ -22,7 +22,7 @@ it("generates a `.js` helper", async (ctx) => { it("generates a `.ts` helper", async (ctx) => { cwd = await copyBlueprint("v2-addon"); - await generateHelper("foo", cwd, { ts: true }); + await generateHelper("foo", { authoringFormat: "ts", cwd }); const content = await readFile(join(cwd, "src/helpers/foo.ts"), "utf-8"); @@ -32,7 +32,7 @@ it("generates a `.ts` helper", async (ctx) => { it("generates a `.js` helper at a custom path", async (ctx) => { cwd = await copyBlueprint("v2-addon"); - await generateHelper("foo", cwd, { path: "src/-private" }); + await generateHelper("foo", { cwd, path: "src/-private" }); const content = await readFile(join(cwd, "src/-private/foo.js"), "utf-8"); @@ -42,9 +42,10 @@ it("generates a `.js` helper at a custom path", async (ctx) => { it("generates a `.ts` helper at a custom path", async (ctx) => { cwd = await copyBlueprint("v2-addon"); - await generateHelper("foo", cwd, { + await generateHelper("foo", { + authoringFormat: "ts", + cwd, path: "src/-private", - ts: true, }); const content = await readFile(join(cwd, "src/-private/foo.ts"), "utf-8"); diff --git a/test/generate-modifier.test.ts b/test/generate-modifier.test.ts index 182b530..7f81af6 100644 --- a/test/generate-modifier.test.ts +++ b/test/generate-modifier.test.ts @@ -12,7 +12,7 @@ afterEach(() => fsExtra.remove(cwd)); it("generates a `.js` modifier", async (ctx) => { cwd = await copyBlueprint("v2-addon"); - await generateModifier("foo", cwd); + await generateModifier("foo", { cwd }); const content = await readFile(join(cwd, "src/modifiers/foo.js"), "utf-8"); @@ -22,7 +22,7 @@ it("generates a `.js` modifier", async (ctx) => { it("generates a `.ts` modifier", async (ctx) => { cwd = await copyBlueprint("v2-addon"); - await generateModifier("foo", cwd, { ts: true }); + await generateModifier("foo", { authoringFormat: "ts", cwd }); const content = await readFile(join(cwd, "src/modifiers/foo.ts"), "utf-8"); @@ -32,7 +32,7 @@ it("generates a `.ts` modifier", async (ctx) => { it("generates a `.js` modifier at a custom path", async (ctx) => { cwd = await copyBlueprint("v2-addon"); - await generateModifier("foo", cwd, { path: "src/-private" }); + await generateModifier("foo", { cwd, path: "src/-private" }); const content = await readFile(join(cwd, "src/-private/foo.js"), "utf-8"); @@ -42,9 +42,10 @@ it("generates a `.js` modifier at a custom path", async (ctx) => { it("generates a `.ts` modifier at a custom path", async (ctx) => { cwd = await copyBlueprint("v2-addon"); - await generateModifier("foo", cwd, { + await generateModifier("foo", { + authoringFormat: "ts", + cwd, path: "src/-private", - ts: true, }); const content = await readFile(join(cwd, "src/-private/foo.ts"), "utf-8"); diff --git a/test/generate-service.test.ts b/test/generate-service.test.ts index d2f0b53..a657a3d 100644 --- a/test/generate-service.test.ts +++ b/test/generate-service.test.ts @@ -12,7 +12,7 @@ afterEach(() => fsExtra.remove(cwd)); it("generates a `.js` service", async (ctx) => { cwd = await copyBlueprint("v2-addon"); - await generateService("foo", cwd); + await generateService("foo", { cwd }); const content = await readFile(join(cwd, "src/services/foo.js"), "utf-8"); @@ -22,7 +22,7 @@ it("generates a `.js` service", async (ctx) => { it("generates a `.ts` service", async (ctx) => { cwd = await copyBlueprint("v2-addon"); - await generateService("foo", cwd, { ts: true }); + await generateService("foo", { authoringFormat: "ts", cwd }); const content = await readFile(join(cwd, "src/services/foo.ts"), "utf-8"); @@ -32,7 +32,7 @@ it("generates a `.ts` service", async (ctx) => { it("generates a `.js` service at a custom path", async (ctx) => { cwd = await copyBlueprint("v2-addon"); - await generateService("foo", cwd, { path: "src/-private" }); + await generateService("foo", { cwd, path: "src/-private" }); const content = await readFile(join(cwd, "src/-private/foo.js"), "utf-8"); @@ -42,9 +42,10 @@ it("generates a `.js` service at a custom path", async (ctx) => { it("generates a `.ts` service at a custom path", async (ctx) => { cwd = await copyBlueprint("v2-addon"); - await generateService("foo", cwd, { + await generateService("foo", { + authoringFormat: "ts", + cwd, path: "src/-private", - ts: true, }); const content = await readFile(join(cwd, "src/-private/foo.ts"), "utf-8");