diff --git a/src/controllers/controllers.ts b/src/controllers/controllers.ts index 4e5521a..df5feb1 100644 --- a/src/controllers/controllers.ts +++ b/src/controllers/controllers.ts @@ -46,3 +46,5 @@ export function createController< }, }; } + +export const controller = createController; diff --git a/src/factory-aliases.test.ts b/src/factory-aliases.test.ts new file mode 100644 index 0000000..202cc0b --- /dev/null +++ b/src/factory-aliases.test.ts @@ -0,0 +1,83 @@ +import { describe, test, TestContext } from "node:test"; +import { + adapter, + controller, + createApp, + hooks, + installer, + mod, + provider, +} from "./index"; + +describe("factory aliases", () => { + test("compose modules using shorthand helpers", async (t: TestContext) => { + const users = provider({ + name: "alias-users", + expose: async () => ({ + find: () => "Jean", + }), + }); + + const versionAdapter = adapter({ + name: "alias-version", + expose: async ({ fastify }) => fastify.version, + }); + + const httpHooks = hooks({ + type: "http", + deps: { users }, + adaps: { version: versionAdapter }, + build: async ({ builder, deps, adaps }) => { + builder.addHook("onRequest", async (_req, reply) => { + reply.header( + "x-alias-hooks", + `${deps.users.find()}@${adaps.version}`, + ); + }); + }, + }); + + const decorators = installer({ + deps: { users }, + install: async ({ fastify, deps }) => { + fastify.decorate("aliasLookup", () => deps.users.find()); + }, + }); + + const aliasController = controller({ + deps: { users }, + build: ({ builder, deps }) => { + builder.addRoute({ + url: "/", + method: "GET", + handler: async (req) => { + const lookup = req.server.getDecorator<() => string>("aliasLookup"); + return { + viaController: deps.users.find(), + viaInstaller: lookup(), + }; + }, + }); + }, + }); + + const root = mod({ + name: "alias-root", + hooks: [httpHooks], + installers: [decorators], + controllers: [aliasController], + }); + + const app = await createApp({ root }); + const res = await app.inject({ method: "GET", url: "/" }); + const json = res.json(); + + t.assert.deepStrictEqual(json, { + viaController: "Jean", + viaInstaller: "Jean", + }); + t.assert.strictEqual(res.headers["x-alias-hooks"], `Jean@${app.version}`); + + await app.close(); + }); +}); diff --git a/src/fastify/adapters.ts b/src/fastify/adapters.ts index 3cf9b90..2a655f6 100644 --- a/src/fastify/adapters.ts +++ b/src/fastify/adapters.ts @@ -42,3 +42,5 @@ export async function resolveAdapterMap( return out as AdapterValues; } + +export const adapter = createAdapter; diff --git a/src/fastify/installers.ts b/src/fastify/installers.ts index 9aa6ff2..3a798c8 100644 --- a/src/fastify/installers.ts +++ b/src/fastify/installers.ts @@ -28,3 +28,5 @@ export function createInstaller( }, }; } + +export const installer = createInstaller; diff --git a/src/hooks/hooks.ts b/src/hooks/hooks.ts index 7e11b01..e3be9d5 100644 --- a/src/hooks/hooks.ts +++ b/src/hooks/hooks.ts @@ -72,3 +72,5 @@ export function createHooks< }, }; } + +export const hooks = createHooks; diff --git a/src/modules/module.ts b/src/modules/module.ts index 55f69e2..f796516 100644 --- a/src/modules/module.ts +++ b/src/modules/module.ts @@ -97,3 +97,5 @@ export async function resolveProviderMap( return out; } + +export const mod = createModule; diff --git a/src/providers/providers.ts b/src/providers/providers.ts index 6c1ab61..85ebb17 100644 --- a/src/providers/providers.ts +++ b/src/providers/providers.ts @@ -68,6 +68,8 @@ export function createProvider< return self; } +export const provider = createProvider; + export async function resolveDeps( container: Container, prov: ProviderAny,