From 147b82a2f5048b04cb7e55094b91d0b25747e915 Mon Sep 17 00:00:00 2001 From: Julien Ripouteau Date: Wed, 15 Nov 2023 16:36:54 +0100 Subject: [PATCH 1/5] feat: add `addJapaPlugin` to code transformer --- src/code_transformer/main.ts | 36 +++++++++++++++++++ .../code_transformer.spec.ts.cjs | 11 ++++++ tests/code_transformer.spec.ts | 24 +++++++++++++ 3 files changed, 71 insertions(+) diff --git a/src/code_transformer/main.ts b/src/code_transformer/main.ts index e670eaa7..8114bb21 100644 --- a/src/code_transformer/main.ts +++ b/src/code_transformer/main.ts @@ -177,6 +177,42 @@ export class CodeTransformer { await file.save() } + /** + * Add a new Japa plugin in the `tests/bootstrap.ts` file + */ + async addJapaPlugin( + pluginCall: string, + importDeclaration: { isNamed: boolean; module: string; identifier: string } + ) { + /** + * Get the `tests/bootstrap.ts` source file + */ + const testBootstrapUrl = fileURLToPath(new URL('./tests/bootstrap.ts', this.#cwd)) + const file = this.#project.getSourceFileOrThrow(testBootstrapUrl) + + /** + * Add the import declaration + */ + file.addImportDeclaration({ + ...(importDeclaration.isNamed + ? { namedImports: [importDeclaration.identifier] } + : { defaultImport: importDeclaration.identifier }), + moduleSpecifier: importDeclaration.module, + }) + + /** + * Insert the plugin call in the `plugins` array + */ + const pluginsArray = file + .getVariableDeclaration('plugins') + ?.getInitializerIfKind(SyntaxKind.ArrayLiteralExpression) + + if (pluginsArray) pluginsArray.addElement(pluginCall) + + file.formatText(this.#editorSettings) + await file.save() + } + /** * Add new env variable validation in the * `env.ts` file diff --git a/tests/__snapshots__/code_transformer.spec.ts.cjs b/tests/__snapshots__/code_transformer.spec.ts.cjs index 0566dcca..8381b6d1 100644 --- a/tests/__snapshots__/code_transformer.spec.ts.cjs +++ b/tests/__snapshots__/code_transformer.spec.ts.cjs @@ -354,3 +354,14 @@ export default defineConfig({ }) "` +exports[`Code transformer | addPreloadFile > addJapaPlugin should works fine 1`] = `" +import app from '@adonisjs/core/services/app' +import { assert } from '@japa/assert' +import { fooPlugin } from \\"@adonisjs/foo/plugin/japa\\"; + +export const plugins: Config['plugins'] = [ + assert(), + fooPlugin(app) +] +"` + diff --git a/tests/code_transformer.spec.ts b/tests/code_transformer.spec.ts index ba2c9fb4..0cafe4d1 100644 --- a/tests/code_transformer.spec.ts +++ b/tests/code_transformer.spec.ts @@ -505,4 +505,28 @@ test.group('Code transformer | addPreloadFile', (group) => { assert.equal(occurrences, 1) }) + + test('addJapaPlugin should works fine', async ({ assert, fs }) => { + await fs.create( + 'tests/bootstrap.ts', + ` + import app from '@adonisjs/core/services/app' + import { assert } from '@japa/assert' + + export const plugins: Config['plugins'] = [ + assert(), + ]` + ) + + const transformer = new CodeTransformer(fs.baseUrl) + + await transformer.addJapaPlugin('fooPlugin(app)', { + module: '@adonisjs/foo/plugin/japa', + identifier: 'fooPlugin', + isNamed: true, + }) + + const file = await fs.contents('tests/bootstrap.ts') + assert.snapshot(file).match() + }) }) From f060dd48021739b3ae0899435071a7bdf0db9794 Mon Sep 17 00:00:00 2001 From: Julien Ripouteau Date: Wed, 15 Nov 2023 16:37:51 +0100 Subject: [PATCH 2/5] feat: use single quote for codemods --- src/code_transformer/main.ts | 3 ++- tests/__snapshots__/code_transformer.spec.ts.cjs | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/code_transformer/main.ts b/src/code_transformer/main.ts index 8114bb21..e15d5dd8 100644 --- a/src/code_transformer/main.ts +++ b/src/code_transformer/main.ts @@ -9,7 +9,7 @@ import { join } from 'node:path' import { fileURLToPath } from 'node:url' -import { CodeBlockWriter, Node, Project, SourceFile, SyntaxKind } from 'ts-morph' +import { CodeBlockWriter, Node, Project, QuoteKind, SourceFile, SyntaxKind } from 'ts-morph' import { RcFileTransformer } from './rc_file_transformer.js' import type { AddMiddlewareEntry, EnvValidationDefinition } from '../types.js' @@ -41,6 +41,7 @@ export class CodeTransformer { this.#cwd = cwd this.#project = new Project({ tsConfigFilePath: join(fileURLToPath(this.#cwd), 'tsconfig.json'), + manipulationSettings: { quoteKind: QuoteKind.Single }, }) } diff --git a/tests/__snapshots__/code_transformer.spec.ts.cjs b/tests/__snapshots__/code_transformer.spec.ts.cjs index 8381b6d1..edfcea8e 100644 --- a/tests/__snapshots__/code_transformer.spec.ts.cjs +++ b/tests/__snapshots__/code_transformer.spec.ts.cjs @@ -357,7 +357,7 @@ export default defineConfig({ exports[`Code transformer | addPreloadFile > addJapaPlugin should works fine 1`] = `" import app from '@adonisjs/core/services/app' import { assert } from '@japa/assert' -import { fooPlugin } from \\"@adonisjs/foo/plugin/japa\\"; +import { fooPlugin } from '@adonisjs/foo/plugin/japa'; export const plugins: Config['plugins'] = [ assert(), From d39676d5c5da1ecd56bb557c09ccc131e2c2238b Mon Sep 17 00:00:00 2001 From: Julien Ripouteau Date: Wed, 15 Nov 2023 16:41:25 +0100 Subject: [PATCH 3/5] feat: format using semicolons --- src/code_transformer/main.ts | 14 ++++++++++++-- tests/__snapshots__/code_transformer.spec.ts.cjs | 2 +- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/code_transformer/main.ts b/src/code_transformer/main.ts index e15d5dd8..f8b7083c 100644 --- a/src/code_transformer/main.ts +++ b/src/code_transformer/main.ts @@ -9,7 +9,15 @@ import { join } from 'node:path' import { fileURLToPath } from 'node:url' -import { CodeBlockWriter, Node, Project, QuoteKind, SourceFile, SyntaxKind } from 'ts-morph' +import { + CodeBlockWriter, + FormatCodeSettings, + Node, + Project, + QuoteKind, + SourceFile, + SyntaxKind, +} from 'ts-morph' import { RcFileTransformer } from './rc_file_transformer.js' import type { AddMiddlewareEntry, EnvValidationDefinition } from '../types.js' @@ -31,10 +39,12 @@ export class CodeTransformer { /** * Settings to use when persisting files */ - #editorSettings = { + #editorSettings: FormatCodeSettings = { indentSize: 2, convertTabsToSpaces: true, trimTrailingWhitespace: true, + // @ts-expect-error SemicolonPreference doesn't seem to be re-exported from ts-morph + semicolons: 'remove', } constructor(cwd: URL) { diff --git a/tests/__snapshots__/code_transformer.spec.ts.cjs b/tests/__snapshots__/code_transformer.spec.ts.cjs index edfcea8e..0586876c 100644 --- a/tests/__snapshots__/code_transformer.spec.ts.cjs +++ b/tests/__snapshots__/code_transformer.spec.ts.cjs @@ -357,7 +357,7 @@ export default defineConfig({ exports[`Code transformer | addPreloadFile > addJapaPlugin should works fine 1`] = `" import app from '@adonisjs/core/services/app' import { assert } from '@japa/assert' -import { fooPlugin } from '@adonisjs/foo/plugin/japa'; +import { fooPlugin } from '@adonisjs/foo/plugin/japa' export const plugins: Config['plugins'] = [ assert(), From 5b656325ed02f31736e26be058b04d9f918e101f Mon Sep 17 00:00:00 2001 From: Julien Ripouteau Date: Wed, 15 Nov 2023 16:47:07 +0100 Subject: [PATCH 4/5] refactor: move tests to its own group --- .../code_transformer.spec.ts.cjs | 13 +++++++- tests/code_transformer.spec.ts | 30 ++++++++++++++++++- 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/tests/__snapshots__/code_transformer.spec.ts.cjs b/tests/__snapshots__/code_transformer.spec.ts.cjs index 0586876c..244c90fc 100644 --- a/tests/__snapshots__/code_transformer.spec.ts.cjs +++ b/tests/__snapshots__/code_transformer.spec.ts.cjs @@ -354,7 +354,7 @@ export default defineConfig({ }) "` -exports[`Code transformer | addPreloadFile > addJapaPlugin should works fine 1`] = `" +exports[`Code transformer | addJapaPlugin > addJapaPlugin with named import 1`] = `" import app from '@adonisjs/core/services/app' import { assert } from '@japa/assert' import { fooPlugin } from '@adonisjs/foo/plugin/japa' @@ -365,3 +365,14 @@ export const plugins: Config['plugins'] = [ ] "` +exports[`Code transformer | addJapaPlugin > addJapaPlugin with default import 1`] = `" +import app from '@adonisjs/core/services/app' +import { assert } from '@japa/assert' +import fooPlugin from '@adonisjs/foo/plugin/japa' + +export const plugins: Config['plugins'] = [ + assert(), + fooPlugin() +] +"` + diff --git a/tests/code_transformer.spec.ts b/tests/code_transformer.spec.ts index 0cafe4d1..56640a22 100644 --- a/tests/code_transformer.spec.ts +++ b/tests/code_transformer.spec.ts @@ -505,8 +505,12 @@ test.group('Code transformer | addPreloadFile', (group) => { assert.equal(occurrences, 1) }) +}) + +test.group('Code transformer | addJapaPlugin', (group) => { + group.each.setup(async ({ context }) => setupFakeAdonisproject(context.fs)) - test('addJapaPlugin should works fine', async ({ assert, fs }) => { + test('addJapaPlugin with named import', async ({ assert, fs }) => { await fs.create( 'tests/bootstrap.ts', ` @@ -529,4 +533,28 @@ test.group('Code transformer | addPreloadFile', (group) => { const file = await fs.contents('tests/bootstrap.ts') assert.snapshot(file).match() }) + + test('addJapaPlugin with default import', async ({ assert, fs }) => { + await fs.create( + 'tests/bootstrap.ts', + ` + import app from '@adonisjs/core/services/app' + import { assert } from '@japa/assert' + + export const plugins: Config['plugins'] = [ + assert(), + ]` + ) + + const transformer = new CodeTransformer(fs.baseUrl) + + await transformer.addJapaPlugin('fooPlugin()', { + module: '@adonisjs/foo/plugin/japa', + identifier: 'fooPlugin', + isNamed: false, + }) + + const file = await fs.contents('tests/bootstrap.ts') + assert.snapshot(file).match() + }) }) From 4493026ef5c73a5fb492fa5a35ddfa69769be823 Mon Sep 17 00:00:00 2001 From: Julien Ripouteau Date: Wed, 15 Nov 2023 16:48:00 +0100 Subject: [PATCH 5/5] refactor: rename tests --- tests/code_transformer.spec.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/code_transformer.spec.ts b/tests/code_transformer.spec.ts index 56640a22..317baa1f 100644 --- a/tests/code_transformer.spec.ts +++ b/tests/code_transformer.spec.ts @@ -510,7 +510,7 @@ test.group('Code transformer | addPreloadFile', (group) => { test.group('Code transformer | addJapaPlugin', (group) => { group.each.setup(async ({ context }) => setupFakeAdonisproject(context.fs)) - test('addJapaPlugin with named import', async ({ assert, fs }) => { + test('add named import', async ({ assert, fs }) => { await fs.create( 'tests/bootstrap.ts', ` @@ -534,7 +534,7 @@ test.group('Code transformer | addJapaPlugin', (group) => { assert.snapshot(file).match() }) - test('addJapaPlugin with default import', async ({ assert, fs }) => { + test('add default import', async ({ assert, fs }) => { await fs.create( 'tests/bootstrap.ts', `