diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0f59a2e..5790d1d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -51,13 +51,20 @@ jobs: run: | node bin/gember.js component foo --cwd=test-app node bin/gember.js component-test foo --cwd=test-app + node bin/gember.js controller foo --cwd=test-app + node bin/gember.js controller-test foo --cwd=test-app node bin/gember.js helper foo --cwd=test-app node bin/gember.js helper-test foo --cwd=test-app node bin/gember.js modifier foo --cwd=test-app node bin/gember.js modifier-test foo --cwd=test-app + node bin/gember.js route foo --cwd=test-app + node bin/gember.js route-test foo --cwd=test-app node bin/gember.js service foo --cwd=test-app node bin/gember.js service-test foo --cwd=test-app + node bin/gember.js util foo --cwd=test-app + node bin/gember.js util-test foo --cwd=test-app - name: Run tests in test app run: | cd test-app + pnpm lint:format pnpm test diff --git a/README.md b/README.md index b7d4aeb..c273524 100644 --- a/README.md +++ b/README.md @@ -61,23 +61,51 @@ yarn add -D @bertdeblock/gember ```shell Generate components, helpers, modifiers and services in v1/v2 apps/addons. (gember v1.4.0) -USAGE `gember component|component-test|helper|helper-test|modifier|modifier-test|service|service-test|acceptance-test` +USAGE `gember acceptance-test|component|component-test|controller|controller-test|helper|helper-test|modifier|modifier-test|route|route-test|service|service-test|util|util-test` COMMANDS + `acceptance-test` Generate a new acceptance-test `component` Generate a new component `component-test` Generate a new component-test + `controller` Generate a new controller + `controller-test` Generate a new controller-test `helper` Generate a new helper `helper-test` Generate a new helper-test `modifier` Generate a new modifier `modifier-test` Generate a new modifier-test + `route` Generate a new route + `route-test` Generate a new route-test `service` Generate a new service `service-test` Generate a new service-test - `acceptance-test` Generate a new acceptance-test + `util` Generate a new util + `util-test` Generate a new util-test Use `gember --help` for more information about a command. ``` +### acceptance-test + +```shell +Generate a new acceptance-test (acceptance-test) + +USAGE `acceptance-test [OPTIONS] ` + +ARGUMENTS + + `NAME` The acceptance-test's name + +OPTIONS + + `--copy` Copy the generated acceptance-test to the clipboard, instead of writing it to disk + `--cwd` The current working directory to run the acceptance-test generator in + `-d, --destroy` Destroy a acceptance-test by name + `--log` Log the generated acceptance-test to the console, instead of writing it to disk + `--path` Generate a acceptance-test at a custom path, e.g. `--path=src/-private` + `-ts, --typescript` Generate a `.ts` acceptance-test, instead of a `.js` acceptance-test + +``` + ### component ```shell @@ -125,6 +153,51 @@ OPTIONS ``` +### controller + +```shell +Generate a new controller (controller) + +USAGE `controller [OPTIONS] ` + +ARGUMENTS + + `NAME` The controller's name + +OPTIONS + + `--copy` Copy the generated controller to the clipboard, instead of writing it to disk + `--cwd` The current working directory to run the controller generator in + `-d, --destroy` Destroy a controller by name + `--log` Log the generated controller to the console, instead of writing it to disk + `--path` Generate a controller at a custom path, e.g. `--path=src/-private` + `--test` Generate a corresponding controller-test + `-ts, --typescript` Generate a `.ts` controller, instead of a `.js` controller + +``` + +### controller-test + +```shell +Generate a new controller-test (controller-test) + +USAGE `controller-test [OPTIONS] ` + +ARGUMENTS + + `NAME` The controller-test's name + +OPTIONS + + `--copy` Copy the generated controller-test to the clipboard, instead of writing it to disk + `--cwd` The current working directory to run the controller-test generator in + `-d, --destroy` Destroy a controller-test by name + `--log` Log the generated controller-test to the console, instead of writing it to disk + `--path` Generate a controller-test at a custom path, e.g. `--path=src/-private` + `-ts, --typescript` Generate a `.ts` controller-test, instead of a `.js` controller-test + +``` + ### helper ```shell @@ -217,6 +290,51 @@ OPTIONS ``` +### route + +```shell +Generate a new route (route) + +USAGE `route [OPTIONS] ` + +ARGUMENTS + + `NAME` The route's name + +OPTIONS + + `--copy` Copy the generated route to the clipboard, instead of writing it to disk + `--cwd` The current working directory to run the route generator in + `-d, --destroy` Destroy a route by name + `--log` Log the generated route to the console, instead of writing it to disk + `--path` Generate a route at a custom path, e.g. `--path=src/-private` + `--test` Generate a corresponding route-test + `-ts, --typescript` Generate a `.ts` route, instead of a `.js` route + +``` + +### route-test + +```shell +Generate a new route-test (route-test) + +USAGE `route-test [OPTIONS] ` + +ARGUMENTS + + `NAME` The route-test's name + +OPTIONS + + `--copy` Copy the generated route-test to the clipboard, instead of writing it to disk + `--cwd` The current working directory to run the route-test generator in + `-d, --destroy` Destroy a route-test by name + `--log` Log the generated route-test to the console, instead of writing it to disk + `--path` Generate a route-test at a custom path, e.g. `--path=src/-private` + `-ts, --typescript` Generate a `.ts` route-test, instead of a `.js` route-test + +``` + ### service ```shell @@ -262,25 +380,48 @@ OPTIONS ``` -### acceptance-test +### util ```shell -Generate a new acceptance-test (acceptance-test) +Generate a new util (util) -USAGE `acceptance-test [OPTIONS] ` +USAGE `util [OPTIONS] ` ARGUMENTS - `NAME` The acceptance-test's name + `NAME` The util's name OPTIONS - `--copy` Copy the generated acceptance-test to the clipboard, instead of writing it to disk - `--cwd` The current working directory to run the acceptance-test generator in - `-d, --destroy` Destroy a acceptance-test by name - `--log` Log the generated acceptance-test to the console, instead of writing it to disk - `--path` Generate a acceptance-test at a custom path, e.g. `--path=src/-private` - `-ts, --typescript` Generate a `.ts` acceptance-test, instead of a `.js` acceptance-test + `--copy` Copy the generated util to the clipboard, instead of writing it to disk + `--cwd` The current working directory to run the util generator in + `-d, --destroy` Destroy a util by name + `--log` Log the generated util to the console, instead of writing it to disk + `--path` Generate a util at a custom path, e.g. `--path=src/-private` + `--test` Generate a corresponding util-test + `-ts, --typescript` Generate a `.ts` util, instead of a `.js` util + +``` + +### util-test + +```shell +Generate a new util-test (util-test) + +USAGE `util-test [OPTIONS] ` + +ARGUMENTS + + `NAME` The util-test's name + +OPTIONS + + `--copy` Copy the generated util-test to the clipboard, instead of writing it to disk + `--cwd` The current working directory to run the util-test generator in + `-d, --destroy` Destroy a util-test by name + `--log` Log the generated util-test to the console, instead of writing it to disk + `--path` Generate a util-test at a custom path, e.g. `--path=src/-private` + `-ts, --typescript` Generate a `.ts` util-test, instead of a `.js` util-test ``` @@ -314,6 +455,20 @@ export default defineConfig(async () => ({})); ```ts export type Config = { generators?: { + "acceptance-test"?: { + // Copy the generated acceptance-test to the clipboard, instead of writing it to disk: + copy?: boolean; + // The current working directory to run the acceptance-test generator in: + cwd?: string; + // Destroy a acceptance-test by name: + destroy?: boolean; + // Log the generated acceptance-test to the console, instead of writing it to disk: + log?: boolean; + // Generate a acceptance-test at a custom path, e.g. `--path=src/-private`: + path?: string; + // Generate a `.ts` acceptance-test, instead of a `.js` acceptance-test: + typescript?: boolean; + }; component?: { // Generate a `class-based` component, instead of a `template-only` component: classBased?: boolean; @@ -348,6 +503,36 @@ export type Config = { // Generate a `.gts` component-test, instead of a `.gjs` component-test: typescript?: boolean; }; + controller?: { + // Copy the generated controller to the clipboard, instead of writing it to disk: + copy?: boolean; + // The current working directory to run the controller generator in: + cwd?: string; + // Destroy a controller by name: + destroy?: boolean; + // Log the generated controller to the console, instead of writing it to disk: + log?: boolean; + // Generate a controller at a custom path, e.g. `--path=src/-private`: + path?: string; + // Generate a corresponding controller-test: + test?: boolean; + // Generate a `.ts` controller, instead of a `.js` controller: + typescript?: boolean; + }; + "controller-test"?: { + // Copy the generated controller-test to the clipboard, instead of writing it to disk: + copy?: boolean; + // The current working directory to run the controller-test generator in: + cwd?: string; + // Destroy a controller-test by name: + destroy?: boolean; + // Log the generated controller-test to the console, instead of writing it to disk: + log?: boolean; + // Generate a controller-test at a custom path, e.g. `--path=src/-private`: + path?: string; + // Generate a `.ts` controller-test, instead of a `.js` controller-test: + typescript?: boolean; + }; helper?: { // Generate a `class-based` helper, instead of a `function-based` helper: classBased?: boolean; @@ -412,6 +597,36 @@ export type Config = { // Generate a `.gts` modifier-test, instead of a `.gjs` modifier-test: typescript?: boolean; }; + route?: { + // Copy the generated route to the clipboard, instead of writing it to disk: + copy?: boolean; + // The current working directory to run the route generator in: + cwd?: string; + // Destroy a route by name: + destroy?: boolean; + // Log the generated route to the console, instead of writing it to disk: + log?: boolean; + // Generate a route at a custom path, e.g. `--path=src/-private`: + path?: string; + // Generate a corresponding route-test: + test?: boolean; + // Generate a `.ts` route, instead of a `.js` route: + typescript?: boolean; + }; + "route-test"?: { + // Copy the generated route-test to the clipboard, instead of writing it to disk: + copy?: boolean; + // The current working directory to run the route-test generator in: + cwd?: string; + // Destroy a route-test by name: + destroy?: boolean; + // Log the generated route-test to the console, instead of writing it to disk: + log?: boolean; + // Generate a route-test at a custom path, e.g. `--path=src/-private`: + path?: string; + // Generate a `.ts` route-test, instead of a `.js` route-test: + typescript?: boolean; + }; service?: { // Copy the generated service to the clipboard, instead of writing it to disk: copy?: boolean; @@ -442,18 +657,34 @@ export type Config = { // Generate a `.ts` service-test, instead of a `.js` service-test: typescript?: boolean; }; - "acceptance-test"?: { - // Copy the generated acceptance-test to the clipboard, instead of writing it to disk: + util?: { + // Copy the generated util to the clipboard, instead of writing it to disk: copy?: boolean; - // The current working directory to run the acceptance-test generator in: + // The current working directory to run the util generator in: cwd?: string; - // Destroy a acceptance-test by name: + // Destroy a util by name: destroy?: boolean; - // Log the generated acceptance-test to the console, instead of writing it to disk: + // Log the generated util to the console, instead of writing it to disk: log?: boolean; - // Generate a acceptance-test at a custom path, e.g. `--path=src/-private`: + // Generate a util at a custom path, e.g. `--path=src/-private`: path?: string; - // Generate a `.ts` acceptance-test, instead of a `.js` acceptance-test: + // Generate a corresponding util-test: + test?: boolean; + // Generate a `.ts` util, instead of a `.js` util: + typescript?: boolean; + }; + "util-test"?: { + // Copy the generated util-test to the clipboard, instead of writing it to disk: + copy?: boolean; + // The current working directory to run the util-test generator in: + cwd?: string; + // Destroy a util-test by name: + destroy?: boolean; + // Log the generated util-test to the console, instead of writing it to disk: + log?: boolean; + // Generate a util-test at a custom path, e.g. `--path=src/-private`: + path?: string; + // Generate a `.ts` util-test, instead of a `.js` util-test: typescript?: boolean; }; }; diff --git a/package.json b/package.json index 6f0550c..4d59bbd 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "build": "tsc --project tsconfig.json", "dev": "pnpm build --watch", "format": "prettier . --cache --write", - "gember": "GEMBER_PATH=test/output bin/gember.js", + "gember": "GEMBER_CWD=test/output bin/gember.js", "lint": "concurrently --group --prefix-colors auto \"npm:lint:*(!fix)\"", "lint:fix": "concurrently --group --prefix-colors auto \"npm:lint:*:fix\"", "lint:format": "prettier . --cache --check", diff --git a/src/config.ts b/src/config.ts index 88eb4d7..af2bf06 100644 --- a/src/config.ts +++ b/src/config.ts @@ -6,6 +6,20 @@ import { logger } from "./logger.js"; export type Config = { generators?: { + "acceptance-test"?: { + // Copy the generated acceptance-test to the clipboard, instead of writing it to disk: + copy?: boolean; + // The current working directory to run the acceptance-test generator in: + cwd?: string; + // Destroy a acceptance-test by name: + destroy?: boolean; + // Log the generated acceptance-test to the console, instead of writing it to disk: + log?: boolean; + // Generate a acceptance-test at a custom path, e.g. `--path=src/-private`: + path?: string; + // Generate a `.ts` acceptance-test, instead of a `.js` acceptance-test: + typescript?: boolean; + }; component?: { // Generate a `class-based` component, instead of a `template-only` component: classBased?: boolean; @@ -40,6 +54,36 @@ export type Config = { // Generate a `.gts` component-test, instead of a `.gjs` component-test: typescript?: boolean; }; + controller?: { + // Copy the generated controller to the clipboard, instead of writing it to disk: + copy?: boolean; + // The current working directory to run the controller generator in: + cwd?: string; + // Destroy a controller by name: + destroy?: boolean; + // Log the generated controller to the console, instead of writing it to disk: + log?: boolean; + // Generate a controller at a custom path, e.g. `--path=src/-private`: + path?: string; + // Generate a corresponding controller-test: + test?: boolean; + // Generate a `.ts` controller, instead of a `.js` controller: + typescript?: boolean; + }; + "controller-test"?: { + // Copy the generated controller-test to the clipboard, instead of writing it to disk: + copy?: boolean; + // The current working directory to run the controller-test generator in: + cwd?: string; + // Destroy a controller-test by name: + destroy?: boolean; + // Log the generated controller-test to the console, instead of writing it to disk: + log?: boolean; + // Generate a controller-test at a custom path, e.g. `--path=src/-private`: + path?: string; + // Generate a `.ts` controller-test, instead of a `.js` controller-test: + typescript?: boolean; + }; helper?: { // Generate a `class-based` helper, instead of a `function-based` helper: classBased?: boolean; @@ -104,6 +148,36 @@ export type Config = { // Generate a `.gts` modifier-test, instead of a `.gjs` modifier-test: typescript?: boolean; }; + route?: { + // Copy the generated route to the clipboard, instead of writing it to disk: + copy?: boolean; + // The current working directory to run the route generator in: + cwd?: string; + // Destroy a route by name: + destroy?: boolean; + // Log the generated route to the console, instead of writing it to disk: + log?: boolean; + // Generate a route at a custom path, e.g. `--path=src/-private`: + path?: string; + // Generate a corresponding route-test: + test?: boolean; + // Generate a `.ts` route, instead of a `.js` route: + typescript?: boolean; + }; + "route-test"?: { + // Copy the generated route-test to the clipboard, instead of writing it to disk: + copy?: boolean; + // The current working directory to run the route-test generator in: + cwd?: string; + // Destroy a route-test by name: + destroy?: boolean; + // Log the generated route-test to the console, instead of writing it to disk: + log?: boolean; + // Generate a route-test at a custom path, e.g. `--path=src/-private`: + path?: string; + // Generate a `.ts` route-test, instead of a `.js` route-test: + typescript?: boolean; + }; service?: { // Copy the generated service to the clipboard, instead of writing it to disk: copy?: boolean; @@ -134,18 +208,34 @@ export type Config = { // Generate a `.ts` service-test, instead of a `.js` service-test: typescript?: boolean; }; - "acceptance-test"?: { - // Copy the generated acceptance-test to the clipboard, instead of writing it to disk: + util?: { + // Copy the generated util to the clipboard, instead of writing it to disk: copy?: boolean; - // The current working directory to run the acceptance-test generator in: + // The current working directory to run the util generator in: cwd?: string; - // Destroy a acceptance-test by name: + // Destroy a util by name: destroy?: boolean; - // Log the generated acceptance-test to the console, instead of writing it to disk: + // Log the generated util to the console, instead of writing it to disk: log?: boolean; - // Generate a acceptance-test at a custom path, e.g. `--path=src/-private`: + // Generate a util at a custom path, e.g. `--path=src/-private`: path?: string; - // Generate a `.ts` acceptance-test, instead of a `.js` acceptance-test: + // Generate a corresponding util-test: + test?: boolean; + // Generate a `.ts` util, instead of a `.js` util: + typescript?: boolean; + }; + "util-test"?: { + // Copy the generated util-test to the clipboard, instead of writing it to disk: + copy?: boolean; + // The current working directory to run the util-test generator in: + cwd?: string; + // Destroy a util-test by name: + destroy?: boolean; + // Log the generated util-test to the console, instead of writing it to disk: + log?: boolean; + // Generate a util-test at a custom path, e.g. `--path=src/-private`: + path?: string; + // Generate a `.ts` util-test, instead of a `.js` util-test: typescript?: boolean; }; }; diff --git a/src/generators/generator.ts b/src/generators/generator.ts index b2b778e..2d4d118 100644 --- a/src/generators/generator.ts +++ b/src/generators/generator.ts @@ -89,7 +89,7 @@ export function defineGenerator({ .sort((a, b) => a.name.localeCompare(b.name)); async function run(args: Args): Promise { - const packagePath = args.cwd ?? processCwd(); + const packagePath = args.cwd ?? env.GEMBER_CWD ?? processCwd(); const packageJson = await readPackageJson(packagePath); const config = await resolveConfig(packagePath); const resolvedArgs = resolveArgs( diff --git a/src/generators/generators.ts b/src/generators/generators.ts index 015855b..ba608a6 100644 --- a/src/generators/generators.ts +++ b/src/generators/generators.ts @@ -11,6 +11,13 @@ import { } from "./generator.js"; export const generators: Generator[] = [ + defineTestGenerator({ + args: [typescript()], + name: "acceptance", + testsDir: "acceptance", + testsSubDir: "", + }), + defineGenerator({ args: [ classBased({ functionBasedName: "template-only" }), @@ -30,6 +37,17 @@ export const generators: Generator[] = [ testsDir: "integration", }), + defineGenerator({ + args: [test(), typescript()], + name: "controller", + }), + + defineTestGenerator({ + args: [typescript()], + name: "controller", + testsDir: "unit", + }), + defineGenerator({ args: [classBased(), test(), typescript()], name: "helper", @@ -52,6 +70,17 @@ export const generators: Generator[] = [ testsDir: "integration", }), + defineGenerator({ + args: [test(), typescript()], + name: "route", + }), + + defineTestGenerator({ + args: [typescript()], + name: "route", + testsDir: "unit", + }), + defineGenerator({ args: [test(), typescript()], name: "service", @@ -63,11 +92,15 @@ export const generators: Generator[] = [ testsDir: "unit", }), + defineGenerator({ + args: [test(), typescript()], + name: "util", + }), + defineTestGenerator({ args: [typescript()], - name: "acceptance", - testsDir: "acceptance", - testsSubDir: "", + name: "util", + testsDir: "unit", }), ]; diff --git a/src/package-json.ts b/src/package-json.ts index ebf6fb7..47a486f 100644 --- a/src/package-json.ts +++ b/src/package-json.ts @@ -1,4 +1,4 @@ -import { readJson } from "fs-extra/esm"; +import { pathExists, readJson } from "fs-extra/esm"; import { join } from "node:path"; import type { PackageJson } from "type-fest"; @@ -22,10 +22,18 @@ export function isV2Addon(packageJson: EmberPackageJson): boolean { return false; } -export function readPackageJson( +export async function readPackageJson( packagePath: string, ): Promise { - return readJson(join(packagePath, "package.json")); + const packageJsonPath = join(packagePath, "package.json"); + + if (await pathExists(packageJsonPath)) { + return readJson(packageJsonPath); + } else { + return { + name: "not-a-package", + } as ReturnType; + } } export type EmberPackageJson = PackageJson & { diff --git a/templates/component/component.class-based.gjs b/templates/component/component.class-based.gjs index 89f570a..efbc0ff 100644 --- a/templates/component/component.class-based.gjs +++ b/templates/component/component.class-based.gjs @@ -1,4 +1,4 @@ -import Component from "@glimmer/component"; +import Component from '@glimmer/component'; export default class {{name.pascal}} extends Component { diff --git a/templates/component/component.class-based.gts b/templates/component/component.class-based.gts index 879951d..1bc552d 100644 --- a/templates/component/component.class-based.gts +++ b/templates/component/component.class-based.gts @@ -1,4 +1,4 @@ -import Component from "@glimmer/component"; +import Component from '@glimmer/component'; export interface {{name.signature}} { Args: {}; diff --git a/templates/controller-test/controller-test.js b/templates/controller-test/controller-test.js new file mode 100644 index 0000000..ef6e796 --- /dev/null +++ b/templates/controller-test/controller-test.js @@ -0,0 +1,12 @@ +import { module, test } from 'qunit'; +import { setupTest } from '{{testHelpersImportPath}}'; + +module('Unit | Controller | {{name.pascal}}', function (hooks) { + setupTest(hooks); + + test('it exists', function (assert) { + const controller = this.owner.lookup('controller:{{name.path}}'); + + assert.ok(controller); + }); +}); diff --git a/templates/controller/controller.js b/templates/controller/controller.js new file mode 100644 index 0000000..3f7d90f --- /dev/null +++ b/templates/controller/controller.js @@ -0,0 +1,3 @@ +import Controller from '@ember/controller'; + +export default class {{name.pascal}}Controller extends Controller {} diff --git a/templates/helper/helper.class-based.js b/templates/helper/helper.class-based.js index eec4ea4..d3f7fc2 100644 --- a/templates/helper/helper.class-based.js +++ b/templates/helper/helper.class-based.js @@ -1,4 +1,4 @@ -import Helper from "@ember/component/helper"; +import Helper from '@ember/component/helper'; export default class {{name.camel}} extends Helper { compute(positional, named) { diff --git a/templates/helper/helper.class-based.ts b/templates/helper/helper.class-based.ts index 05a6422..38153d8 100644 --- a/templates/helper/helper.class-based.ts +++ b/templates/helper/helper.class-based.ts @@ -1,4 +1,4 @@ -import Helper from "@ember/component/helper"; +import Helper from '@ember/component/helper'; type Named = {}; type Positional = []; diff --git a/templates/modifier-test/modifier-test.gjs b/templates/modifier-test/modifier-test.gjs index c002ff7..edbaaca 100644 --- a/templates/modifier-test/modifier-test.gjs +++ b/templates/modifier-test/modifier-test.gjs @@ -7,7 +7,11 @@ module('Integration | Modifier | {{name.camel}}', function (hooks) { setupRenderingTest(hooks); test('it renders', async function (assert) { - await render(); + await render( + + ); assert.ok(true); }); diff --git a/templates/modifier/modifier.class-based.js b/templates/modifier/modifier.class-based.js index d9f41f2..4ab3bd6 100644 --- a/templates/modifier/modifier.class-based.js +++ b/templates/modifier/modifier.class-based.js @@ -1,4 +1,4 @@ -import Modifier from "ember-modifier"; +import Modifier from 'ember-modifier'; export default class {{name.camel}} extends Modifier { modify(element, positional, named) {} diff --git a/templates/modifier/modifier.class-based.ts b/templates/modifier/modifier.class-based.ts index c142544..5251dec 100644 --- a/templates/modifier/modifier.class-based.ts +++ b/templates/modifier/modifier.class-based.ts @@ -1,4 +1,4 @@ -import Modifier from "ember-modifier"; +import Modifier from 'ember-modifier'; type Named = {}; type Positional = []; diff --git a/templates/modifier/modifier.function-based.js b/templates/modifier/modifier.function-based.js index 0079342..e12995c 100644 --- a/templates/modifier/modifier.function-based.js +++ b/templates/modifier/modifier.function-based.js @@ -1,3 +1,3 @@ -import { modifier } from "ember-modifier"; +import { modifier } from 'ember-modifier'; export default modifier(function {{name.camel}}(element, positional, named) {}); diff --git a/templates/modifier/modifier.function-based.ts b/templates/modifier/modifier.function-based.ts index d162971..d4c58eb 100644 --- a/templates/modifier/modifier.function-based.ts +++ b/templates/modifier/modifier.function-based.ts @@ -1,4 +1,4 @@ -import { modifier } from "ember-modifier"; +import { modifier } from 'ember-modifier'; export interface {{name.signature}} { Args: { diff --git a/templates/route-test/route-test.js b/templates/route-test/route-test.js new file mode 100644 index 0000000..7eac1f0 --- /dev/null +++ b/templates/route-test/route-test.js @@ -0,0 +1,12 @@ +import { module, test } from 'qunit'; +import { setupTest } from '{{testHelpersImportPath}}'; + +module('Unit | Route | {{name.pascal}}', function (hooks) { + setupTest(hooks); + + test('it exists', function (assert) { + const route = this.owner.lookup('route:{{name.path}}'); + + assert.ok(route); + }); +}); diff --git a/templates/route/route.js b/templates/route/route.js new file mode 100644 index 0000000..85dda6b --- /dev/null +++ b/templates/route/route.js @@ -0,0 +1,3 @@ +import Route from '@ember/routing/route'; + +export default class {{name.pascal}}Route extends Route {} diff --git a/templates/service/service.js b/templates/service/service.js index 6ab1bb2..1d6d02a 100644 --- a/templates/service/service.js +++ b/templates/service/service.js @@ -1,3 +1,3 @@ -import Service from "@ember/service"; +import Service from '@ember/service'; export default class {{name.pascal}}Service extends Service {} diff --git a/templates/service/service.ts b/templates/service/service.ts index 393941c..c3d9a21 100644 --- a/templates/service/service.ts +++ b/templates/service/service.ts @@ -1,8 +1,8 @@ -import Service from "@ember/service"; +import Service from '@ember/service'; export default class {{name.pascal}}Service extends Service {} -declare module "@ember/service" { +declare module '@ember/service' { interface Registry { {{{name.pathMaybeQuotes}}}: {{name.pascal}}Service; } diff --git a/templates/util-test/util-test.js b/templates/util-test/util-test.js new file mode 100644 index 0000000..3c877e2 --- /dev/null +++ b/templates/util-test/util-test.js @@ -0,0 +1,10 @@ +import {{name.camel}} from '{{package.name}}/utils/{{name.path}}'; +import { module, test } from 'qunit'; + +module('Unit | Util | {{name.camel}}', function () { + test('it works', function (assert) { + const result = {{name.camel}}(); + + assert.ok(result); + }); +}); diff --git a/templates/util/util.js b/templates/util/util.js new file mode 100644 index 0000000..29ed98b --- /dev/null +++ b/templates/util/util.js @@ -0,0 +1,3 @@ +export default function {{name.camel}}() { + return true; +} diff --git a/test/__snapshots__/config.test.ts.snap b/test/__snapshots__/config.test.ts.snap index b07f12c..ee8a8c2 100644 --- a/test/__snapshots__/config.test.ts.snap +++ b/test/__snapshots__/config.test.ts.snap @@ -1,7 +1,7 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html exports[`applies specific generator options 1`] = ` -"import Component from "@glimmer/component"; +"import Component from '@glimmer/component'; export interface FooSignature { Args: {}; @@ -25,7 +25,7 @@ exports[`runs the \`postGenerate\` hook 1`] = ` "files": [ { "base": "foo.gts", - "content": "import Component from \\"@glimmer/component\\";\\n\\nexport interface FooSignature {\\n Args: {};\\n Blocks: {\\n default: [];\\n };\\n Element: null;\\n}\\n\\nexport default class Foo extends Component {\\n \\n}\\n", + "content": "import Component from '@glimmer/component';\\n\\nexport interface FooSignature {\\n Args: {};\\n Blocks: {\\n default: [];\\n };\\n Element: null;\\n}\\n\\nexport default class Foo extends Component {\\n \\n}\\n", "dir": "test/output/post-generate-info/src/components", "ext": ".gts", "name": "foo", diff --git a/test/generators/__snapshots__/component.test.ts.snap b/test/generators/__snapshots__/component.test.ts.snap index ce56f5f..0b7b54a 100644 --- a/test/generators/__snapshots__/component.test.ts.snap +++ b/test/generators/__snapshots__/component.test.ts.snap @@ -1,7 +1,7 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html exports[`generates a class-based \`.gjs\` component 1`] = ` -"import Component from "@glimmer/component"; +"import Component from '@glimmer/component'; export default class Foo extends Component { @@ -10,7 +10,7 @@ export default class Foo extends Component { `; exports[`generates a class-based \`.gts\` component 1`] = ` -"import Component from "@glimmer/component"; +"import Component from '@glimmer/component'; export interface FooSignature { Args: {}; diff --git a/test/generators/__snapshots__/controller-test.test.ts.snap b/test/generators/__snapshots__/controller-test.test.ts.snap new file mode 100644 index 0000000..4005dfe --- /dev/null +++ b/test/generators/__snapshots__/controller-test.test.ts.snap @@ -0,0 +1,65 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`generates a \`.js\` controller-test 1`] = ` +"import { module, test } from 'qunit'; +import { setupTest } from 'v2-addon/tests/helpers'; + +module('Unit | Controller | Foo', function (hooks) { + setupTest(hooks); + + test('it exists', function (assert) { + const controller = this.owner.lookup('controller:foo'); + + assert.ok(controller); + }); +}); +" +`; + +exports[`generates a \`.js\` controller-test at a custom path 1`] = ` +"import { module, test } from 'qunit'; +import { setupTest } from 'v2-addon/tests/helpers'; + +module('Unit | Controller | Foo', function (hooks) { + setupTest(hooks); + + test('it exists', function (assert) { + const controller = this.owner.lookup('controller:foo'); + + assert.ok(controller); + }); +}); +" +`; + +exports[`generates a \`.ts\` controller-test 1`] = ` +"import { module, test } from 'qunit'; +import { setupTest } from 'v2-addon/tests/helpers'; + +module('Unit | Controller | Foo', function (hooks) { + setupTest(hooks); + + test('it exists', function (assert) { + const controller = this.owner.lookup('controller:foo'); + + assert.ok(controller); + }); +}); +" +`; + +exports[`generates a \`.ts\` controller-test at a custom path 1`] = ` +"import { module, test } from 'qunit'; +import { setupTest } from 'v2-addon/tests/helpers'; + +module('Unit | Controller | Foo', function (hooks) { + setupTest(hooks); + + test('it exists', function (assert) { + const controller = this.owner.lookup('controller:foo'); + + assert.ok(controller); + }); +}); +" +`; diff --git a/test/generators/__snapshots__/controller.test.ts.snap b/test/generators/__snapshots__/controller.test.ts.snap new file mode 100644 index 0000000..3b0c17d --- /dev/null +++ b/test/generators/__snapshots__/controller.test.ts.snap @@ -0,0 +1,43 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`generates a \`.js\` controller 1`] = ` +"import Controller from '@ember/controller'; + +export default class FooController extends Controller {} +" +`; + +exports[`generates a \`.js\` controller at a custom path 1`] = ` +"import Controller from '@ember/controller'; + +export default class FooController extends Controller {} +" +`; + +exports[`generates a \`.ts\` controller 1`] = ` +"import Controller from '@ember/controller'; + +export default class FooController extends Controller {} +" +`; + +exports[`generates a \`.ts\` controller at a custom path 1`] = ` +"import Controller from '@ember/controller'; + +export default class FooController extends Controller {} +" +`; + +exports[`generates a nested \`.js\` controller 1`] = ` +"import Controller from '@ember/controller'; + +export default class FooBarController extends Controller {} +" +`; + +exports[`generates a nested \`.ts\` controller 1`] = ` +"import Controller from '@ember/controller'; + +export default class FooBarController extends Controller {} +" +`; diff --git a/test/generators/__snapshots__/helper.test.ts.snap b/test/generators/__snapshots__/helper.test.ts.snap index ed53681..5e4ad60 100644 --- a/test/generators/__snapshots__/helper.test.ts.snap +++ b/test/generators/__snapshots__/helper.test.ts.snap @@ -1,7 +1,7 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html exports[`generates a class-based \`.js\` helper 1`] = ` -"import Helper from "@ember/component/helper"; +"import Helper from '@ember/component/helper'; export default class foo extends Helper { compute(positional, named) { @@ -12,7 +12,7 @@ export default class foo extends Helper { `; exports[`generates a class-based \`.ts\` helper 1`] = ` -"import Helper from "@ember/component/helper"; +"import Helper from '@ember/component/helper'; type Named = {}; type Positional = []; diff --git a/test/generators/__snapshots__/modifier-test.test.ts.snap b/test/generators/__snapshots__/modifier-test.test.ts.snap index 14d9253..0a3acf7 100644 --- a/test/generators/__snapshots__/modifier-test.test.ts.snap +++ b/test/generators/__snapshots__/modifier-test.test.ts.snap @@ -10,7 +10,11 @@ module('Integration | Modifier | foo', function (hooks) { setupRenderingTest(hooks); test('it renders', async function (assert) { - await render(); + await render( + + ); assert.ok(true); }); @@ -28,7 +32,11 @@ module('Integration | Modifier | foo', function (hooks) { setupRenderingTest(hooks); test('it renders', async function (assert) { - await render(); + await render( + + ); assert.ok(true); }); @@ -46,7 +54,11 @@ module('Integration | Modifier | foo', function (hooks) { setupRenderingTest(hooks); test('it renders', async function (assert) { - await render(); + await render( + + ); assert.ok(true); }); @@ -64,7 +76,11 @@ module('Integration | Modifier | foo', function (hooks) { setupRenderingTest(hooks); test('it renders', async function (assert) { - await render(); + await render( + + ); assert.ok(true); }); diff --git a/test/generators/__snapshots__/modifier.test.ts.snap b/test/generators/__snapshots__/modifier.test.ts.snap index 2abef1d..0cb409a 100644 --- a/test/generators/__snapshots__/modifier.test.ts.snap +++ b/test/generators/__snapshots__/modifier.test.ts.snap @@ -1,7 +1,7 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html exports[`generates a class-based \`.js\` modifier 1`] = ` -"import Modifier from "ember-modifier"; +"import Modifier from 'ember-modifier'; export default class foo extends Modifier { modify(element, positional, named) {} @@ -10,7 +10,7 @@ export default class foo extends Modifier { `; exports[`generates a class-based \`.ts\` modifier 1`] = ` -"import Modifier from "ember-modifier"; +"import Modifier from 'ember-modifier'; type Named = {}; type Positional = []; @@ -31,21 +31,21 @@ export default class foo extends Modifier { `; exports[`generates a function-based \`.js\` modifier 1`] = ` -"import { modifier } from "ember-modifier"; +"import { modifier } from 'ember-modifier'; export default modifier(function foo(element, positional, named) {}); " `; exports[`generates a function-based \`.js\` modifier at a custom path 1`] = ` -"import { modifier } from "ember-modifier"; +"import { modifier } from 'ember-modifier'; export default modifier(function foo(element, positional, named) {}); " `; exports[`generates a function-based \`.ts\` modifier 1`] = ` -"import { modifier } from "ember-modifier"; +"import { modifier } from 'ember-modifier'; export interface FooSignature { Args: { @@ -60,7 +60,7 @@ export default modifier(function foo(element, positional, named) { `; exports[`generates a function-based \`.ts\` modifier at a custom path 1`] = ` -"import { modifier } from "ember-modifier"; +"import { modifier } from 'ember-modifier'; export interface FooSignature { Args: { @@ -75,7 +75,7 @@ export default modifier(function foo(element, positional, named) { `; exports[`generates a nested function-based \`.js\` modifier 1`] = ` -"import { modifier } from "ember-modifier"; +"import { modifier } from 'ember-modifier'; export default modifier(function fooBar(element, positional, named) {}); " diff --git a/test/generators/__snapshots__/route-test.test.ts.snap b/test/generators/__snapshots__/route-test.test.ts.snap new file mode 100644 index 0000000..ef26204 --- /dev/null +++ b/test/generators/__snapshots__/route-test.test.ts.snap @@ -0,0 +1,65 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`generates a \`.js\` route-test 1`] = ` +"import { module, test } from 'qunit'; +import { setupTest } from 'v2-addon/tests/helpers'; + +module('Unit | Route | Foo', function (hooks) { + setupTest(hooks); + + test('it exists', function (assert) { + const route = this.owner.lookup('route:foo'); + + assert.ok(route); + }); +}); +" +`; + +exports[`generates a \`.js\` route-test at a custom path 1`] = ` +"import { module, test } from 'qunit'; +import { setupTest } from 'v2-addon/tests/helpers'; + +module('Unit | Route | Foo', function (hooks) { + setupTest(hooks); + + test('it exists', function (assert) { + const route = this.owner.lookup('route:foo'); + + assert.ok(route); + }); +}); +" +`; + +exports[`generates a \`.ts\` route-test 1`] = ` +"import { module, test } from 'qunit'; +import { setupTest } from 'v2-addon/tests/helpers'; + +module('Unit | Route | Foo', function (hooks) { + setupTest(hooks); + + test('it exists', function (assert) { + const route = this.owner.lookup('route:foo'); + + assert.ok(route); + }); +}); +" +`; + +exports[`generates a \`.ts\` route-test at a custom path 1`] = ` +"import { module, test } from 'qunit'; +import { setupTest } from 'v2-addon/tests/helpers'; + +module('Unit | Route | Foo', function (hooks) { + setupTest(hooks); + + test('it exists', function (assert) { + const route = this.owner.lookup('route:foo'); + + assert.ok(route); + }); +}); +" +`; diff --git a/test/generators/__snapshots__/route.test.ts.snap b/test/generators/__snapshots__/route.test.ts.snap new file mode 100644 index 0000000..7fc33a4 --- /dev/null +++ b/test/generators/__snapshots__/route.test.ts.snap @@ -0,0 +1,43 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`generates a \`.js\` route 1`] = ` +"import Route from '@ember/routing/route'; + +export default class FooRoute extends Route {} +" +`; + +exports[`generates a \`.js\` route at a custom path 1`] = ` +"import Route from '@ember/routing/route'; + +export default class FooRoute extends Route {} +" +`; + +exports[`generates a \`.ts\` route 1`] = ` +"import Route from '@ember/routing/route'; + +export default class FooRoute extends Route {} +" +`; + +exports[`generates a \`.ts\` route at a custom path 1`] = ` +"import Route from '@ember/routing/route'; + +export default class FooRoute extends Route {} +" +`; + +exports[`generates a nested \`.js\` route 1`] = ` +"import Route from '@ember/routing/route'; + +export default class FooBarRoute extends Route {} +" +`; + +exports[`generates a nested \`.ts\` route 1`] = ` +"import Route from '@ember/routing/route'; + +export default class FooBarRoute extends Route {} +" +`; diff --git a/test/generators/__snapshots__/service.test.ts.snap b/test/generators/__snapshots__/service.test.ts.snap index 3f449fd..3df449c 100644 --- a/test/generators/__snapshots__/service.test.ts.snap +++ b/test/generators/__snapshots__/service.test.ts.snap @@ -1,25 +1,25 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html exports[`generates a \`.js\` service 1`] = ` -"import Service from "@ember/service"; +"import Service from '@ember/service'; export default class FooService extends Service {} " `; exports[`generates a \`.js\` service at a custom path 1`] = ` -"import Service from "@ember/service"; +"import Service from '@ember/service'; export default class FooService extends Service {} " `; exports[`generates a \`.ts\` service 1`] = ` -"import Service from "@ember/service"; +"import Service from '@ember/service'; export default class FooService extends Service {} -declare module "@ember/service" { +declare module '@ember/service' { interface Registry { foo: FooService; } @@ -28,11 +28,11 @@ declare module "@ember/service" { `; exports[`generates a \`.ts\` service at a custom path 1`] = ` -"import Service from "@ember/service"; +"import Service from '@ember/service'; export default class FooService extends Service {} -declare module "@ember/service" { +declare module '@ember/service' { interface Registry { foo: FooService; } @@ -41,18 +41,18 @@ declare module "@ember/service" { `; exports[`generates a nested \`.js\` service 1`] = ` -"import Service from "@ember/service"; +"import Service from '@ember/service'; export default class FooBarService extends Service {} " `; exports[`generates a nested \`.ts\` service 1`] = ` -"import Service from "@ember/service"; +"import Service from '@ember/service'; export default class FooBarService extends Service {} -declare module "@ember/service" { +declare module '@ember/service' { interface Registry { "foo/bar": FooBarService; } diff --git a/test/generators/__snapshots__/util-test.test.ts.snap b/test/generators/__snapshots__/util-test.test.ts.snap new file mode 100644 index 0000000..f492f30 --- /dev/null +++ b/test/generators/__snapshots__/util-test.test.ts.snap @@ -0,0 +1,57 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`generates a \`.js\` util-test 1`] = ` +"import foo from 'v2-addon/utils/foo'; +import { module, test } from 'qunit'; + +module('Unit | Util | foo', function () { + test('it works', function (assert) { + const result = foo(); + + assert.ok(result); + }); +}); +" +`; + +exports[`generates a \`.js\` util-test at a custom path 1`] = ` +"import foo from 'v2-addon/utils/foo'; +import { module, test } from 'qunit'; + +module('Unit | Util | foo', function () { + test('it works', function (assert) { + const result = foo(); + + assert.ok(result); + }); +}); +" +`; + +exports[`generates a \`.ts\` util-test 1`] = ` +"import foo from 'v2-addon/utils/foo'; +import { module, test } from 'qunit'; + +module('Unit | Util | foo', function () { + test('it works', function (assert) { + const result = foo(); + + assert.ok(result); + }); +}); +" +`; + +exports[`generates a \`.ts\` util-test at a custom path 1`] = ` +"import foo from 'v2-addon/utils/foo'; +import { module, test } from 'qunit'; + +module('Unit | Util | foo', function () { + test('it works', function (assert) { + const result = foo(); + + assert.ok(result); + }); +}); +" +`; diff --git a/test/generators/__snapshots__/util.test.ts.snap b/test/generators/__snapshots__/util.test.ts.snap new file mode 100644 index 0000000..43c14e4 --- /dev/null +++ b/test/generators/__snapshots__/util.test.ts.snap @@ -0,0 +1,43 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`generates a \`.js\` util 1`] = ` +"export default function foo() { + return true; +} +" +`; + +exports[`generates a \`.js\` util at a custom path 1`] = ` +"export default function foo() { + return true; +} +" +`; + +exports[`generates a \`.ts\` util 1`] = ` +"export default function foo() { + return true; +} +" +`; + +exports[`generates a \`.ts\` util at a custom path 1`] = ` +"export default function foo() { + return true; +} +" +`; + +exports[`generates a nested \`.js\` util 1`] = ` +"export default function fooBar() { + return true; +} +" +`; + +exports[`generates a nested \`.ts\` util 1`] = ` +"export default function fooBar() { + return true; +} +" +`; diff --git a/test/generators/controller-test.test.ts b/test/generators/controller-test.test.ts new file mode 100644 index 0000000..6141e4b --- /dev/null +++ b/test/generators/controller-test.test.ts @@ -0,0 +1,67 @@ +import { afterEach, it } from "vitest"; +import { Package } from "../helpers.ts"; + +let pkg: Package; + +afterEach(() => pkg.cleanUp()); + +it("generates a `.js` controller-test", async (ctx) => { + pkg = await Package.create("v2-addon"); + + await pkg.gember("controller-test", "foo"); + + const content = await pkg.readFile("tests/unit/controllers/foo-test.js"); + + ctx.expect(content).toMatchSnapshot(); +}); + +it("generates a `.js` controller-test at a custom path", async (ctx) => { + pkg = await Package.create("v2-addon"); + + await pkg.gember("controller-test", "foo", "--path=tests/foo"); + + const content = await pkg.readFile("tests/foo/foo-test.js"); + + ctx.expect(content).toMatchSnapshot(); +}); + +it("generates a `.ts` controller-test", async (ctx) => { + pkg = await Package.create("v2-addon"); + + await pkg.gember("controller-test", "foo", "--typescript"); + + const content = await pkg.readFile("tests/unit/controllers/foo-test.ts"); + + ctx.expect(content).toMatchSnapshot(); +}); + +it("generates a `.ts` controller-test at a custom path", async (ctx) => { + pkg = await Package.create("v2-addon"); + + await pkg.gember( + "controller-test", + "foo", + "--path=tests/foo", + "--typescript", + ); + + const content = await pkg.readFile("tests/foo/foo-test.ts"); + + ctx.expect(content).toMatchSnapshot(); +}); + +it("destroys a controller-test", async (ctx) => { + pkg = await Package.create("v2-addon"); + + await pkg.gember("controller-test", "foo"); + + ctx + .expect(await pkg.pathExists("tests/unit/controllers/foo-test.js")) + .to.equal(true); + + await pkg.gember("controller-test", "foo", "--destroy"); + + ctx + .expect(await pkg.pathExists("tests/unit/controllers/foo-test.js")) + .to.equal(false); +}); diff --git a/test/generators/controller.test.ts b/test/generators/controller.test.ts new file mode 100644 index 0000000..26186d5 --- /dev/null +++ b/test/generators/controller.test.ts @@ -0,0 +1,89 @@ +import { afterEach, it } from "vitest"; +import { Package } from "../helpers.ts"; + +let pkg: Package; + +afterEach(() => pkg.cleanUp()); + +it("generates a `.js` controller", async (ctx) => { + pkg = await Package.create("v2-addon"); + + await pkg.gember("controller", "foo"); + + const content = await pkg.readFile("src/controllers/foo.js"); + + ctx.expect(content).toMatchSnapshot(); +}); + +it("generates a `.ts` controller", async (ctx) => { + pkg = await Package.create("v2-addon"); + + await pkg.gember("controller", "foo", "--typescript"); + + const content = await pkg.readFile("src/controllers/foo.ts"); + + ctx.expect(content).toMatchSnapshot(); +}); + +it("generates a `.js` controller at a custom path", async (ctx) => { + pkg = await Package.create("v2-addon"); + + await pkg.gember("controller", "foo", "--path=src/-private"); + + const content = await pkg.readFile("src/-private/foo.js"); + + ctx.expect(content).toMatchSnapshot(); +}); + +it("generates a `.ts` controller at a custom path", async (ctx) => { + pkg = await Package.create("v2-addon"); + + await pkg.gember("controller", "foo", "--path=src/-private", "--typescript"); + + const content = await pkg.readFile("src/-private/foo.ts"); + + ctx.expect(content).toMatchSnapshot(); +}); + +it("generates a nested `.js` controller", async (ctx) => { + pkg = await Package.create("v2-addon"); + + await pkg.gember("controller", "foo/bar"); + + const content = await pkg.readFile("src/controllers/foo/bar.js"); + + ctx.expect(content).toMatchSnapshot(); +}); + +it("generates a nested `.ts` controller", async (ctx) => { + pkg = await Package.create("v2-addon"); + + await pkg.gember("controller", "foo/bar", "--typescript"); + + const content = await pkg.readFile("src/controllers/foo/bar.ts"); + + ctx.expect(content).toMatchSnapshot(); +}); + +it("generates a corresponding controller-test", async (ctx) => { + pkg = await Package.create("v2-addon"); + + await pkg.gember("controller", "foo", "--test"); + + ctx.expect(await pkg.pathExists("src/controllers/foo.js")).to.equal(true); + ctx + .expect(await pkg.pathExists("tests/unit/controllers/foo-test.js")) + .to.equal(true); +}); + +it("destroys a controller", async (ctx) => { + pkg = await Package.create("v2-addon"); + + await pkg.gember("controller", "foo"); + + ctx.expect(await pkg.pathExists("src/controllers/foo.js")).to.equal(true); + + await pkg.gember("controller", "foo", "--destroy"); + + ctx.expect(await pkg.pathExists("src/controllers/foo.js")).to.equal(false); +}); diff --git a/test/generators/route-test.test.ts b/test/generators/route-test.test.ts new file mode 100644 index 0000000..6166579 --- /dev/null +++ b/test/generators/route-test.test.ts @@ -0,0 +1,62 @@ +import { afterEach, it } from "vitest"; +import { Package } from "../helpers.ts"; + +let pkg: Package; + +afterEach(() => pkg.cleanUp()); + +it("generates a `.js` route-test", async (ctx) => { + pkg = await Package.create("v2-addon"); + + await pkg.gember("route-test", "foo"); + + const content = await pkg.readFile("tests/unit/routes/foo-test.js"); + + ctx.expect(content).toMatchSnapshot(); +}); + +it("generates a `.js` route-test at a custom path", async (ctx) => { + pkg = await Package.create("v2-addon"); + + await pkg.gember("route-test", "foo", "--path=tests/foo"); + + const content = await pkg.readFile("tests/foo/foo-test.js"); + + ctx.expect(content).toMatchSnapshot(); +}); + +it("generates a `.ts` route-test", async (ctx) => { + pkg = await Package.create("v2-addon"); + + await pkg.gember("route-test", "foo", "--typescript"); + + const content = await pkg.readFile("tests/unit/routes/foo-test.ts"); + + ctx.expect(content).toMatchSnapshot(); +}); + +it("generates a `.ts` route-test at a custom path", async (ctx) => { + pkg = await Package.create("v2-addon"); + + await pkg.gember("route-test", "foo", "--path=tests/foo", "--typescript"); + + const content = await pkg.readFile("tests/foo/foo-test.ts"); + + ctx.expect(content).toMatchSnapshot(); +}); + +it("destroys a route-test", async (ctx) => { + pkg = await Package.create("v2-addon"); + + await pkg.gember("route-test", "foo"); + + ctx + .expect(await pkg.pathExists("tests/unit/routes/foo-test.js")) + .to.equal(true); + + await pkg.gember("route-test", "foo", "--destroy"); + + ctx + .expect(await pkg.pathExists("tests/unit/routes/foo-test.js")) + .to.equal(false); +}); diff --git a/test/generators/route.test.ts b/test/generators/route.test.ts new file mode 100644 index 0000000..122993f --- /dev/null +++ b/test/generators/route.test.ts @@ -0,0 +1,89 @@ +import { afterEach, it } from "vitest"; +import { Package } from "../helpers.ts"; + +let pkg: Package; + +afterEach(() => pkg.cleanUp()); + +it("generates a `.js` route", async (ctx) => { + pkg = await Package.create("v2-addon"); + + await pkg.gember("route", "foo"); + + const content = await pkg.readFile("src/routes/foo.js"); + + ctx.expect(content).toMatchSnapshot(); +}); + +it("generates a `.ts` route", async (ctx) => { + pkg = await Package.create("v2-addon"); + + await pkg.gember("route", "foo", "--typescript"); + + const content = await pkg.readFile("src/routes/foo.ts"); + + ctx.expect(content).toMatchSnapshot(); +}); + +it("generates a `.js` route at a custom path", async (ctx) => { + pkg = await Package.create("v2-addon"); + + await pkg.gember("route", "foo", "--path=src/-private"); + + const content = await pkg.readFile("src/-private/foo.js"); + + ctx.expect(content).toMatchSnapshot(); +}); + +it("generates a `.ts` route at a custom path", async (ctx) => { + pkg = await Package.create("v2-addon"); + + await pkg.gember("route", "foo", "--path=src/-private", "--typescript"); + + const content = await pkg.readFile("src/-private/foo.ts"); + + ctx.expect(content).toMatchSnapshot(); +}); + +it("generates a nested `.js` route", async (ctx) => { + pkg = await Package.create("v2-addon"); + + await pkg.gember("route", "foo/bar"); + + const content = await pkg.readFile("src/routes/foo/bar.js"); + + ctx.expect(content).toMatchSnapshot(); +}); + +it("generates a nested `.ts` route", async (ctx) => { + pkg = await Package.create("v2-addon"); + + await pkg.gember("route", "foo/bar", "--typescript"); + + const content = await pkg.readFile("src/routes/foo/bar.ts"); + + ctx.expect(content).toMatchSnapshot(); +}); + +it("generates a corresponding route-test", async (ctx) => { + pkg = await Package.create("v2-addon"); + + await pkg.gember("route", "foo", "--test"); + + ctx.expect(await pkg.pathExists("src/routes/foo.js")).to.equal(true); + ctx + .expect(await pkg.pathExists("tests/unit/routes/foo-test.js")) + .to.equal(true); +}); + +it("destroys a route", async (ctx) => { + pkg = await Package.create("v2-addon"); + + await pkg.gember("route", "foo"); + + ctx.expect(await pkg.pathExists("src/routes/foo.js")).to.equal(true); + + await pkg.gember("route", "foo", "--destroy"); + + ctx.expect(await pkg.pathExists("src/routes/foo.js")).to.equal(false); +}); diff --git a/test/generators/util-test.test.ts b/test/generators/util-test.test.ts new file mode 100644 index 0000000..e323920 --- /dev/null +++ b/test/generators/util-test.test.ts @@ -0,0 +1,62 @@ +import { afterEach, it } from "vitest"; +import { Package } from "../helpers.ts"; + +let pkg: Package; + +afterEach(() => pkg.cleanUp()); + +it("generates a `.js` util-test", async (ctx) => { + pkg = await Package.create("v2-addon"); + + await pkg.gember("util-test", "foo"); + + const content = await pkg.readFile("tests/unit/utils/foo-test.js"); + + ctx.expect(content).toMatchSnapshot(); +}); + +it("generates a `.js` util-test at a custom path", async (ctx) => { + pkg = await Package.create("v2-addon"); + + await pkg.gember("util-test", "foo", "--path=tests/foo"); + + const content = await pkg.readFile("tests/foo/foo-test.js"); + + ctx.expect(content).toMatchSnapshot(); +}); + +it("generates a `.ts` util-test", async (ctx) => { + pkg = await Package.create("v2-addon"); + + await pkg.gember("util-test", "foo", "--typescript"); + + const content = await pkg.readFile("tests/unit/utils/foo-test.ts"); + + ctx.expect(content).toMatchSnapshot(); +}); + +it("generates a `.ts` util-test at a custom path", async (ctx) => { + pkg = await Package.create("v2-addon"); + + await pkg.gember("util-test", "foo", "--path=tests/foo", "--typescript"); + + const content = await pkg.readFile("tests/foo/foo-test.ts"); + + ctx.expect(content).toMatchSnapshot(); +}); + +it("destroys a util-test", async (ctx) => { + pkg = await Package.create("v2-addon"); + + await pkg.gember("util-test", "foo"); + + ctx + .expect(await pkg.pathExists("tests/unit/utils/foo-test.js")) + .to.equal(true); + + await pkg.gember("util-test", "foo", "--destroy"); + + ctx + .expect(await pkg.pathExists("tests/unit/utils/foo-test.js")) + .to.equal(false); +}); diff --git a/test/generators/util.test.ts b/test/generators/util.test.ts new file mode 100644 index 0000000..14783ce --- /dev/null +++ b/test/generators/util.test.ts @@ -0,0 +1,89 @@ +import { afterEach, it } from "vitest"; +import { Package } from "../helpers.ts"; + +let pkg: Package; + +afterEach(() => pkg.cleanUp()); + +it("generates a `.js` util", async (ctx) => { + pkg = await Package.create("v2-addon"); + + await pkg.gember("util", "foo"); + + const content = await pkg.readFile("src/utils/foo.js"); + + ctx.expect(content).toMatchSnapshot(); +}); + +it("generates a `.ts` util", async (ctx) => { + pkg = await Package.create("v2-addon"); + + await pkg.gember("util", "foo", "--typescript"); + + const content = await pkg.readFile("src/utils/foo.ts"); + + ctx.expect(content).toMatchSnapshot(); +}); + +it("generates a `.js` util at a custom path", async (ctx) => { + pkg = await Package.create("v2-addon"); + + await pkg.gember("util", "foo", "--path=src/-private"); + + const content = await pkg.readFile("src/-private/foo.js"); + + ctx.expect(content).toMatchSnapshot(); +}); + +it("generates a `.ts` util at a custom path", async (ctx) => { + pkg = await Package.create("v2-addon"); + + await pkg.gember("util", "foo", "--path=src/-private", "--typescript"); + + const content = await pkg.readFile("src/-private/foo.ts"); + + ctx.expect(content).toMatchSnapshot(); +}); + +it("generates a nested `.js` util", async (ctx) => { + pkg = await Package.create("v2-addon"); + + await pkg.gember("util", "foo/bar"); + + const content = await pkg.readFile("src/utils/foo/bar.js"); + + ctx.expect(content).toMatchSnapshot(); +}); + +it("generates a nested `.ts` util", async (ctx) => { + pkg = await Package.create("v2-addon"); + + await pkg.gember("util", "foo/bar", "--typescript"); + + const content = await pkg.readFile("src/utils/foo/bar.ts"); + + ctx.expect(content).toMatchSnapshot(); +}); + +it("generates a corresponding util-test", async (ctx) => { + pkg = await Package.create("v2-addon"); + + await pkg.gember("util", "foo", "--test"); + + ctx.expect(await pkg.pathExists("src/utils/foo.js")).to.equal(true); + ctx + .expect(await pkg.pathExists("tests/unit/utils/foo-test.js")) + .to.equal(true); +}); + +it("destroys a util", async (ctx) => { + pkg = await Package.create("v2-addon"); + + await pkg.gember("util", "foo"); + + ctx.expect(await pkg.pathExists("src/utils/foo.js")).to.equal(true); + + await pkg.gember("util", "foo", "--destroy"); + + ctx.expect(await pkg.pathExists("src/utils/foo.js")).to.equal(false); +});