Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 53 additions & 6 deletions src/code_transformer/rc_file_transformer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -440,12 +440,18 @@ export default defineConfig({

/**
* Add a new assembler hook
* The format `thunk` write `() => import(path)`.
*
* @param type - The type of hook to add
* @param path - The path to the hook file
* @param value - The path to the hook file or value to write
* @param raw - Wether to write a thunk import or as raw value
* @returns This RcFileTransformer instance for method chaining
*/
addAssemblerHook(type: keyof Exclude<AssemblerRcFile['hooks'], undefined>, path: string) {
addAssemblerHook(
type: keyof Exclude<AssemblerRcFile['hooks'], undefined>,
value: string,
raw: boolean = false
) {
const hooksProperty = this.#getPropertyAssignmentInDefineConfigCall('hooks', '{}')

const hooks = hooksProperty.getInitializerIfKindOrThrow(SyntaxKind.ObjectLiteralExpression)
Expand All @@ -456,12 +462,53 @@ export default defineConfig({
}

const hooksArray = hookArray.getInitializerIfKindOrThrow(SyntaxKind.ArrayLiteralExpression)
const existingHooks = this.#extractModulesFromArray(hooksArray)
if (existingHooks.includes(path)) {
return this

if (raw) {
hooksArray.addElement(value)
} else {
const existingHooks = this.#extractModulesFromArray(hooksArray)
if (existingHooks.includes(value)) {
return this
}

hooksArray.addElement(`() => import('${value}')`)
}

hooksArray.addElement(`() => import('${path}')`)
return this
}

/**
* Add a named import
*
* @param specifier - The module specifier to import
* @param names - Names to import from the module
* @returns This RcFileTransformer instance for method chaining
*/
addNamedImport(specifier: string, names: string[]) {
const file = this.#getRcFileOrThrow()

file.addImportDeclaration({
moduleSpecifier: specifier,
namedImports: names,
})

return this
}

/**
* Add a default import
*
* @param specifier - The module specifier to import
* @param name - Name of the default import
* @returns This RcFileTransformer instance for method chaining
*/
addDefaultImport(specifier: string, name: string) {
const file = this.#getRcFileOrThrow()

file.addImportDeclaration({
moduleSpecifier: specifier,
defaultImport: name,
})

return this
}
Expand Down
11 changes: 11 additions & 0 deletions src/types/code_transformer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,17 @@ export type EnvValidationNode = {
variables: Record<string, string>
}

export type HookNode =
| {
type: 'thunk'
path: string
}
| {
type: 'import'
path: string
name?: string
}

/**
* The supported package managers for installing packages and managing lockfiles.
* Each package manager has specific lockfiles and install commands.
Expand Down
95 changes: 95 additions & 0 deletions tests/__snapshots__/code_transformer.spec.ts.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -431,3 +431,98 @@ export default defineConfig({
})
"`

exports[`Code Transformer | addAssemblerHook > add raw assembler hook to the assembler file 1`] = `"import { defineConfig } from '@adonisjs/core/app'

export default defineConfig({
typescript: true,
preloads: [
() => import('./start/routes.ts'),
{
file: () => import('./start/ace.ts'),
environment: ['console'],
},
],
providers: [
() => import('@adonisjs/core/providers/app_provider'),
{
file: () => import('@adonisjs/core/providers/repl_provider'),
environment: ['repl'],
}
],
metaFiles: [
{
pattern: 'public/**',
reloadServer: true
},
],
commands: [
() => import('@adonisjs/core/commands')
],
hooks: {
init: [indexPages()]
}
})
"`

exports[`Code Transformer | addDefaultImport > add default import to the assembler file 1`] = `"import { defineConfig } from '@adonisjs/core/app'
import indexPages from '@adonisjs/inertia'

export default defineConfig({
typescript: true,
preloads: [
() => import('./start/routes.ts'),
{
file: () => import('./start/ace.ts'),
environment: ['console'],
},
],
providers: [
() => import('@adonisjs/core/providers/app_provider'),
{
file: () => import('@adonisjs/core/providers/repl_provider'),
environment: ['repl'],
}
],
metaFiles: [
{
pattern: 'public/**',
reloadServer: true
},
],
commands: [
() => import('@adonisjs/core/commands')
]
})
"`

exports[`Code Transformer | addNamedImport > add named import to the assembler file 1`] = `"import { defineConfig } from '@adonisjs/core/app'
import { indexPages } from '@adonisjs/inertia'

export default defineConfig({
typescript: true,
preloads: [
() => import('./start/routes.ts'),
{
file: () => import('./start/ace.ts'),
environment: ['console'],
},
],
providers: [
() => import('@adonisjs/core/providers/app_provider'),
{
file: () => import('@adonisjs/core/providers/repl_provider'),
environment: ['repl'],
}
],
metaFiles: [
{
pattern: 'public/**',
reloadServer: true
},
],
commands: [
() => import('@adonisjs/core/commands')
]
})
"`

41 changes: 41 additions & 0 deletions tests/code_transformer.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1284,4 +1284,45 @@ test.group('Code Transformer | addAssemblerHook', (group) => {

assert.equal(occurrences, 1)
})

test('add raw assembler hook to the assembler file', async ({ assert, fs }) => {
const transformer = new CodeTransformer(fs.baseUrl)

await transformer.updateRcFile((rcFile) =>
rcFile.addAssemblerHook('init', 'indexPages()', true)
)

const file = await fs.contents('adonisrc.ts')
assert.snapshot(file).match()
})
})

test.group('Code Transformer | addDefaultImport', (group) => {
group.each.setup(async ({ context }) => setupFakeAdonisproject(context.fs))

test('add default import to the assembler file', async ({ assert, fs }) => {
const transformer = new CodeTransformer(fs.baseUrl)

await transformer.updateRcFile((rcFile) =>
rcFile.addDefaultImport('@adonisjs/inertia', 'indexPages')
)

const file = await fs.contents('adonisrc.ts')
assert.snapshot(file).match()
})
})

test.group('Code Transformer | addNamedImport', (group) => {
group.each.setup(async ({ context }) => setupFakeAdonisproject(context.fs))

test('add named import to the assembler file', async ({ assert, fs }) => {
const transformer = new CodeTransformer(fs.baseUrl)

await transformer.updateRcFile((rcFile) =>
rcFile.addNamedImport('@adonisjs/inertia', ['indexPages'])
)

const file = await fs.contents('adonisrc.ts')
assert.snapshot(file).match()
})
})
Loading