Skip to content

Commit af5df9e

Browse files
committed
Allow for service or factory in fastify plugin options.
1 parent 580c68b commit af5df9e

File tree

4 files changed

+77
-49
lines changed

4 files changed

+77
-49
lines changed

conformance/src/fastify/app.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { jsConformanceApiPlugin } from "./jsConformanceApiPlugin.js";
66

77
const app: FastifyPluginAsync<FastifyServerOptions> = async (fastify): Promise<void> => {
88
const conformanceApiPluginOptions: ConformanceApiPluginOptions = {
9-
api: new ConformanceApiService(conformanceTestsJson.tests),
9+
serviceOrFactory: new ConformanceApiService(conformanceTestsJson.tests),
1010
caseInsenstiveQueryStringKeys: true,
1111
includeErrorDetails: true,
1212
};

conformance/src/fastify/conformanceApiPlugin.ts

Lines changed: 36 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// DO NOT EDIT: generated by fsdgenjs
22
/* eslint-disable */
33

4-
import { FastifyPluginAsync, RegisterOptions } from 'fastify';
4+
import type * as fastifyTypes from 'fastify';
55
import { IServiceResult, IServiceError } from 'facility-core';
66

77
const standardErrorCodes: { [code: string]: number } = {
@@ -32,14 +32,15 @@ function parseBoolean(value: string | undefined) {
3232
return undefined;
3333
}
3434

35-
export type ConformanceApiPluginOptions = RegisterOptions & {
36-
api: IConformanceApi;
35+
export type ConformanceApiPluginOptions = fastifyTypes.RegisterOptions & {
36+
serviceOrFactory: IConformanceApi | ((req: fastifyTypes.FastifyRequest) => IConformanceApi);
3737
caseInsenstiveQueryStringKeys?: boolean;
3838
includeErrorDetails?: boolean;
3939
}
4040

41-
export const conformanceApiPlugin: FastifyPluginAsync<ConformanceApiPluginOptions> = async (fastify, opts) => {
42-
const { api, caseInsenstiveQueryStringKeys, includeErrorDetails } = opts;
41+
export const conformanceApiPlugin: fastifyTypes.FastifyPluginAsync<ConformanceApiPluginOptions> = async (fastify, opts) => {
42+
const { serviceOrFactory, caseInsenstiveQueryStringKeys, includeErrorDetails } = opts;
43+
const getService = typeof serviceOrFactory === 'function' ? serviceOrFactory : () => serviceOrFactory;
4344

4445
for (const jsonSchema of jsonSchemas) {
4546
fastify.addSchema(jsonSchema);
@@ -94,7 +95,8 @@ export const conformanceApiPlugin: FastifyPluginAsync<ConformanceApiPluginOption
9495
handler: async function (req, res) {
9596
const request: IGetApiInfoRequest = {};
9697

97-
const result = await api.getApiInfo(request);
98+
const service = getService(req);
99+
const result = await service.getApiInfo(request);
98100

99101
if (result.error) {
100102
const status = result.error.code && standardErrorCodes[result.error.code];
@@ -130,7 +132,8 @@ export const conformanceApiPlugin: FastifyPluginAsync<ConformanceApiPluginOption
130132
const query = req.query as Record<string, string>;
131133
if (typeof query['q'] === 'string') request.query = query['q'];
132134

133-
const result = await api.getWidgets(request);
135+
const service = getService(req);
136+
const result = await service.getWidgets(request);
134137

135138
if (result.error) {
136139
const status = result.error.code && standardErrorCodes[result.error.code];
@@ -160,7 +163,8 @@ export const conformanceApiPlugin: FastifyPluginAsync<ConformanceApiPluginOption
160163

161164
request.widget = req.body as never;
162165

163-
const result = await api.createWidget(request);
166+
const service = getService(req);
167+
const result = await service.createWidget(request);
164168

165169
if (result.error) {
166170
const status = result.error.code && standardErrorCodes[result.error.code];
@@ -200,7 +204,8 @@ export const conformanceApiPlugin: FastifyPluginAsync<ConformanceApiPluginOption
200204
const headers = req.headers as Record<string, string>;
201205
if (typeof headers['if-none-match'] === 'string') request.ifNotETag = headers['if-none-match'];
202206

203-
const result = await api.getWidget(request);
207+
const service = getService(req);
208+
const result = await service.getWidget(request);
204209

205210
if (result.error) {
206211
const status = result.error.code && standardErrorCodes[result.error.code];
@@ -245,7 +250,8 @@ export const conformanceApiPlugin: FastifyPluginAsync<ConformanceApiPluginOption
245250
const headers = req.headers as Record<string, string>;
246251
if (typeof headers['if-match'] === 'string') request.ifETag = headers['if-match'];
247252

248-
const result = await api.deleteWidget(request);
253+
const service = getService(req);
254+
const result = await service.deleteWidget(request);
249255

250256
if (result.error) {
251257
const status = result.error.code && standardErrorCodes[result.error.code];
@@ -285,7 +291,8 @@ export const conformanceApiPlugin: FastifyPluginAsync<ConformanceApiPluginOption
285291

286292
request.ids = req.body as never;
287293

288-
const result = await api.getWidgetBatch(request);
294+
const service = getService(req);
295+
const result = await service.getWidgetBatch(request);
289296

290297
if (result.error) {
291298
const status = result.error.code && standardErrorCodes[result.error.code];
@@ -325,7 +332,8 @@ export const conformanceApiPlugin: FastifyPluginAsync<ConformanceApiPluginOption
325332
request.field = body.field;
326333
request.matrix = body.matrix;
327334

328-
const result = await api.mirrorFields(request);
335+
const service = getService(req);
336+
const result = await service.mirrorFields(request);
329337

330338
if (result.error) {
331339
const status = result.error.code && standardErrorCodes[result.error.code];
@@ -363,7 +371,8 @@ export const conformanceApiPlugin: FastifyPluginAsync<ConformanceApiPluginOption
363371
if (typeof query['enum'] === 'string') request.enum = query['enum'] as Answer;
364372
if (typeof query['datetime'] === 'string') request.datetime = query['datetime'];
365373

366-
const result = await api.checkQuery(request);
374+
const service = getService(req);
375+
const result = await service.checkQuery(request);
367376

368377
if (result.error) {
369378
const status = result.error.code && standardErrorCodes[result.error.code];
@@ -401,7 +410,8 @@ export const conformanceApiPlugin: FastifyPluginAsync<ConformanceApiPluginOption
401410
if (typeof params['enum'] === 'string') request.enum = params['enum'] as Answer;
402411
if (typeof params['datetime'] === 'string') request.datetime = params['datetime'];
403412

404-
const result = await api.checkPath(request);
413+
const service = getService(req);
414+
const result = await service.checkPath(request);
405415

406416
if (result.error) {
407417
const status = result.error.code && standardErrorCodes[result.error.code];
@@ -439,7 +449,8 @@ export const conformanceApiPlugin: FastifyPluginAsync<ConformanceApiPluginOption
439449
if (typeof headers['enum'] === 'string') request.enum = headers['enum'] as Answer;
440450
if (typeof headers['datetime'] === 'string') request.datetime = headers['datetime'];
441451

442-
const result = await api.mirrorHeaders(request);
452+
const service = getService(req);
453+
const result = await service.mirrorHeaders(request);
443454

444455
if (result.error) {
445456
const status = result.error.code && standardErrorCodes[result.error.code];
@@ -495,7 +506,8 @@ export const conformanceApiPlugin: FastifyPluginAsync<ConformanceApiPluginOption
495506
const body = req.body as Record<string, never>;
496507
request.normal = body.normal;
497508

498-
const result = await api.mixed(request);
509+
const service = getService(req);
510+
const result = await service.mixed(request);
499511

500512
if (result.error) {
501513
const status = result.error.code && standardErrorCodes[result.error.code];
@@ -554,7 +566,8 @@ export const conformanceApiPlugin: FastifyPluginAsync<ConformanceApiPluginOption
554566
request.hasWidget = body.hasWidget;
555567
request.point = body.point;
556568

557-
const result = await api.required(request);
569+
const service = getService(req);
570+
const result = await service.required(request);
558571

559572
if (result.error) {
560573
const status = result.error.code && standardErrorCodes[result.error.code];
@@ -587,7 +600,8 @@ export const conformanceApiPlugin: FastifyPluginAsync<ConformanceApiPluginOption
587600

588601
request.content = req.body as never;
589602

590-
const result = await api.mirrorBytes(request);
603+
const service = getService(req);
604+
const result = await service.mirrorBytes(request);
591605

592606
if (result.error) {
593607
const status = result.error.code && standardErrorCodes[result.error.code];
@@ -624,7 +638,8 @@ export const conformanceApiPlugin: FastifyPluginAsync<ConformanceApiPluginOption
624638

625639
request.content = req.body as never;
626640

627-
const result = await api.mirrorText(request);
641+
const service = getService(req);
642+
const result = await service.mirrorText(request);
628643

629644
if (result.error) {
630645
const status = result.error.code && standardErrorCodes[result.error.code];
@@ -658,7 +673,8 @@ export const conformanceApiPlugin: FastifyPluginAsync<ConformanceApiPluginOption
658673

659674
request.content = req.body as never;
660675

661-
const result = await api.bodyTypes(request);
676+
const service = getService(req);
677+
const result = await service.bodyTypes(request);
662678

663679
if (result.error) {
664680
const status = result.error.code && standardErrorCodes[result.error.code];

conformance/src/fastify/jsConformanceApiPlugin.js

Lines changed: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@ function parseBoolean(value) {
3232
}
3333

3434
export const jsConformanceApiPlugin = async (fastify, opts) => {
35-
const { api, caseInsenstiveQueryStringKeys, includeErrorDetails } = opts;
35+
const { serviceOrFactory, caseInsenstiveQueryStringKeys, includeErrorDetails } = opts;
36+
const getService = typeof serviceOrFactory === 'function' ? serviceOrFactory : () => serviceOrFactory;
3637

3738
for (const jsonSchema of jsonSchemas) {
3839
fastify.addSchema(jsonSchema);
@@ -87,7 +88,8 @@ export const jsConformanceApiPlugin = async (fastify, opts) => {
8788
handler: async function (req, res) {
8889
const request = {};
8990

90-
const result = await api.getApiInfo(request);
91+
const service = getService(req);
92+
const result = await service.getApiInfo(request);
9193

9294
if (result.error) {
9395
const status = result.error.code && standardErrorCodes[result.error.code];
@@ -123,7 +125,8 @@ export const jsConformanceApiPlugin = async (fastify, opts) => {
123125
const query = req.query;
124126
if (typeof query['q'] === 'string') request.query = query['q'];
125127

126-
const result = await api.getWidgets(request);
128+
const service = getService(req);
129+
const result = await service.getWidgets(request);
127130

128131
if (result.error) {
129132
const status = result.error.code && standardErrorCodes[result.error.code];
@@ -153,7 +156,8 @@ export const jsConformanceApiPlugin = async (fastify, opts) => {
153156

154157
request.widget = req.body;
155158

156-
const result = await api.createWidget(request);
159+
const service = getService(req);
160+
const result = await service.createWidget(request);
157161

158162
if (result.error) {
159163
const status = result.error.code && standardErrorCodes[result.error.code];
@@ -193,7 +197,8 @@ export const jsConformanceApiPlugin = async (fastify, opts) => {
193197
const headers = req.headers;
194198
if (typeof headers['if-none-match'] === 'string') request.ifNotETag = headers['if-none-match'];
195199

196-
const result = await api.getWidget(request);
200+
const service = getService(req);
201+
const result = await service.getWidget(request);
197202

198203
if (result.error) {
199204
const status = result.error.code && standardErrorCodes[result.error.code];
@@ -238,7 +243,8 @@ export const jsConformanceApiPlugin = async (fastify, opts) => {
238243
const headers = req.headers;
239244
if (typeof headers['if-match'] === 'string') request.ifETag = headers['if-match'];
240245

241-
const result = await api.deleteWidget(request);
246+
const service = getService(req);
247+
const result = await service.deleteWidget(request);
242248

243249
if (result.error) {
244250
const status = result.error.code && standardErrorCodes[result.error.code];
@@ -278,7 +284,8 @@ export const jsConformanceApiPlugin = async (fastify, opts) => {
278284

279285
request.ids = req.body;
280286

281-
const result = await api.getWidgetBatch(request);
287+
const service = getService(req);
288+
const result = await service.getWidgetBatch(request);
282289

283290
if (result.error) {
284291
const status = result.error.code && standardErrorCodes[result.error.code];
@@ -318,7 +325,8 @@ export const jsConformanceApiPlugin = async (fastify, opts) => {
318325
request.field = body.field;
319326
request.matrix = body.matrix;
320327

321-
const result = await api.mirrorFields(request);
328+
const service = getService(req);
329+
const result = await service.mirrorFields(request);
322330

323331
if (result.error) {
324332
const status = result.error.code && standardErrorCodes[result.error.code];
@@ -356,7 +364,8 @@ export const jsConformanceApiPlugin = async (fastify, opts) => {
356364
if (typeof query['enum'] === 'string') request.enum = query['enum'];
357365
if (typeof query['datetime'] === 'string') request.datetime = query['datetime'];
358366

359-
const result = await api.checkQuery(request);
367+
const service = getService(req);
368+
const result = await service.checkQuery(request);
360369

361370
if (result.error) {
362371
const status = result.error.code && standardErrorCodes[result.error.code];
@@ -394,7 +403,8 @@ export const jsConformanceApiPlugin = async (fastify, opts) => {
394403
if (typeof params['enum'] === 'string') request.enum = params['enum'];
395404
if (typeof params['datetime'] === 'string') request.datetime = params['datetime'];
396405

397-
const result = await api.checkPath(request);
406+
const service = getService(req);
407+
const result = await service.checkPath(request);
398408

399409
if (result.error) {
400410
const status = result.error.code && standardErrorCodes[result.error.code];
@@ -432,7 +442,8 @@ export const jsConformanceApiPlugin = async (fastify, opts) => {
432442
if (typeof headers['enum'] === 'string') request.enum = headers['enum'];
433443
if (typeof headers['datetime'] === 'string') request.datetime = headers['datetime'];
434444

435-
const result = await api.mirrorHeaders(request);
445+
const service = getService(req);
446+
const result = await service.mirrorHeaders(request);
436447

437448
if (result.error) {
438449
const status = result.error.code && standardErrorCodes[result.error.code];
@@ -488,7 +499,8 @@ export const jsConformanceApiPlugin = async (fastify, opts) => {
488499
const body = req.body;
489500
request.normal = body.normal;
490501

491-
const result = await api.mixed(request);
502+
const service = getService(req);
503+
const result = await service.mixed(request);
492504

493505
if (result.error) {
494506
const status = result.error.code && standardErrorCodes[result.error.code];
@@ -547,7 +559,8 @@ export const jsConformanceApiPlugin = async (fastify, opts) => {
547559
request.hasWidget = body.hasWidget;
548560
request.point = body.point;
549561

550-
const result = await api.required(request);
562+
const service = getService(req);
563+
const result = await service.required(request);
551564

552565
if (result.error) {
553566
const status = result.error.code && standardErrorCodes[result.error.code];
@@ -580,7 +593,8 @@ export const jsConformanceApiPlugin = async (fastify, opts) => {
580593

581594
request.content = req.body;
582595

583-
const result = await api.mirrorBytes(request);
596+
const service = getService(req);
597+
const result = await service.mirrorBytes(request);
584598

585599
if (result.error) {
586600
const status = result.error.code && standardErrorCodes[result.error.code];
@@ -617,7 +631,8 @@ export const jsConformanceApiPlugin = async (fastify, opts) => {
617631

618632
request.content = req.body;
619633

620-
const result = await api.mirrorText(request);
634+
const service = getService(req);
635+
const result = await service.mirrorText(request);
621636

622637
if (result.error) {
623638
const status = result.error.code && standardErrorCodes[result.error.code];
@@ -651,7 +666,8 @@ export const jsConformanceApiPlugin = async (fastify, opts) => {
651666

652667
request.content = req.body;
653668

654-
const result = await api.bodyTypes(request);
669+
const service = getService(req);
670+
const result = await service.bodyTypes(request);
655671

656672
if (result.error) {
657673
const status = result.error.code && standardErrorCodes[result.error.code];

src/Facility.CodeGen.JavaScript/JavaScriptGenerator.cs

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -554,14 +554,8 @@ private CodeGenOutput GenerateFastifyPluginOutput(ServiceInfo service)
554554

555555
code.WriteLine();
556556

557-
var fastifyImports = new List<string>();
558557
if (TypeScript)
559-
{
560-
fastifyImports.Add("FastifyPluginAsync");
561-
fastifyImports.Add("RegisterOptions");
562-
}
563-
564-
WriteImports(code, fastifyImports, "fastify");
558+
code.WriteLine("import type * as fastifyTypes from 'fastify';");
565559

566560
var facilityImports = new List<string>();
567561
if (TypeScript)
@@ -580,18 +574,19 @@ private CodeGenOutput GenerateFastifyPluginOutput(ServiceInfo service)
580574
if (TypeScript)
581575
{
582576
code.WriteLine();
583-
using (code.Block($"export type {capModuleName}PluginOptions = RegisterOptions & {{", "}"))
577+
using (code.Block($"export type {capModuleName}PluginOptions = fastifyTypes.RegisterOptions & {{", "}"))
584578
{
585-
code.WriteLine($"api: I{capModuleName};");
579+
code.WriteLine($"serviceOrFactory: I{capModuleName} | ((req: fastifyTypes.FastifyRequest) => I{capModuleName});");
586580
code.WriteLine("caseInsenstiveQueryStringKeys?: boolean;");
587581
code.WriteLine("includeErrorDetails?: boolean;");
588582
}
589583
}
590584

591585
code.WriteLine();
592-
using (code.Block($"export const {camelCaseModuleName}Plugin" + IfTypeScript($": FastifyPluginAsync<{capModuleName}PluginOptions>") + " = async (fastify, opts) => {", "}"))
586+
using (code.Block($"export const {camelCaseModuleName}Plugin" + IfTypeScript($": fastifyTypes.FastifyPluginAsync<{capModuleName}PluginOptions>") + " = async (fastify, opts) => {", "}"))
593587
{
594-
code.WriteLine("const { api, caseInsenstiveQueryStringKeys, includeErrorDetails } = opts;");
588+
code.WriteLine("const { serviceOrFactory, caseInsenstiveQueryStringKeys, includeErrorDetails } = opts;");
589+
code.WriteLine("const getService = typeof serviceOrFactory === 'function' ? serviceOrFactory : () => serviceOrFactory;");
595590

596591
code.WriteLine();
597592
using (code.Block("for (const jsonSchema of jsonSchemas) {", "}"))
@@ -738,7 +733,8 @@ private CodeGenOutput GenerateFastifyPluginOutput(ServiceInfo service)
738733
}
739734

740735
code.WriteLine();
741-
code.WriteLine($"const result = await api.{methodName}(request);");
736+
code.WriteLine("const service = getService(req);");
737+
code.WriteLine($"const result = await service.{methodName}(request);");
742738

743739
code.WriteLine();
744740
using (code.Block("if (result.error) {", "}"))

0 commit comments

Comments
 (0)