From 9d5693d20491c832dc9e31e3dd1dd8fec6215ed8 Mon Sep 17 00:00:00 2001 From: Jean Date: Sun, 14 Dec 2025 16:58:48 +0100 Subject: [PATCH 1/2] feat: create shortname aliases for factories --- src/controllers/controllers.ts | 2 + src/factory-aliases.test.ts | 80 ++++++++++++++++++++++++++++++++++ src/fastify/adapters.ts | 2 + src/fastify/installers.ts | 2 + src/hooks/hooks.ts | 2 + src/modules/module.ts | 2 + src/providers/providers.ts | 2 + 7 files changed, 92 insertions(+) create mode 100644 src/factory-aliases.test.ts 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..b0ae70f --- /dev/null +++ b/src/factory-aliases.test.ts @@ -0,0 +1,80 @@ +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, From a060faf7e0fd668fac4d6ce50dba1eb133d14504 Mon Sep 17 00:00:00 2001 From: Jean Date: Sun, 14 Dec 2025 17:09:16 +0100 Subject: [PATCH 2/2] fix: lint --- src/factory-aliases.test.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/factory-aliases.test.ts b/src/factory-aliases.test.ts index b0ae70f..202cc0b 100644 --- a/src/factory-aliases.test.ts +++ b/src/factory-aliases.test.ts @@ -29,7 +29,10 @@ describe("factory aliases", () => { adaps: { version: versionAdapter }, build: async ({ builder, deps, adaps }) => { builder.addHook("onRequest", async (_req, reply) => { - reply.header("x-alias-hooks", `${deps.users.find()}@${adaps.version}`); + reply.header( + "x-alias-hooks", + `${deps.users.find()}@${adaps.version}`, + ); }); }, });