diff --git a/Directory.Build.props b/Directory.Build.props index be60cef..219d40d 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,8 +1,8 @@ - 3.3.0 - 3.1.0 + 3.4.0 + 3.3.0 12.0 enable enable diff --git a/ReleaseNotes.md b/ReleaseNotes.md index b991ca3..ae0400a 100644 --- a/ReleaseNotes.md +++ b/ReleaseNotes.md @@ -2,6 +2,10 @@ These are the NuGet package releases. See also [npm Release Notes](ReleaseNotesNpm.md). +## 3.4.0 + +* Export generated HttpClient class, allowing the class to be extended. + ## 3.3.0 * Allow for request scoped services in fastify plugin. diff --git a/conformance/src/conformanceApi.ts b/conformance/src/conformanceApi.ts index 2b3c152..ba1848e 100644 --- a/conformance/src/conformanceApi.ts +++ b/conformance/src/conformanceApi.ts @@ -6,8 +6,8 @@ import { IConformanceApi, IGetApiInfoRequest, IGetApiInfoResponse, IGetWidgetsRe export * from './conformanceApiTypes'; /** Provides access to ConformanceApi over HTTP via fetch. */ -export function createHttpClient({ fetch, baseUri }: IHttpClientOptions): IConformanceApi { - return new ConformanceApiHttpClient(fetch, baseUri); +export function createHttpClient(options: IHttpClientOptions): IConformanceApi { + return new ConformanceApiHttpClient(options); } const { fetchResponse, createResponseError, createRequiredRequestFieldError } = HttpClientUtility; @@ -27,8 +27,9 @@ function parseBoolean(value: string | undefined) { return undefined; } -class ConformanceApiHttpClient implements IConformanceApi { - constructor(fetch: IFetch, baseUri?: string) { +/** Provides access to ConformanceApi over HTTP via fetch. */ +export class ConformanceApiHttpClient implements IConformanceApi { + constructor({ fetch, baseUri }: IHttpClientOptions) { if (typeof fetch !== 'function') { throw new TypeError('fetch must be a function.'); } diff --git a/conformance/src/jsConformanceApi.js b/conformance/src/jsConformanceApi.js index b4d23b3..93e3408 100644 --- a/conformance/src/jsConformanceApi.js +++ b/conformance/src/jsConformanceApi.js @@ -5,8 +5,8 @@ import { HttpClientUtility } from 'facility-core'; /** Provides access to JsConformanceApi over HTTP via fetch. */ -export function createHttpClient({ fetch, baseUri }) { - return new JsConformanceApiHttpClient(fetch, baseUri); +export function createHttpClient(options) { + return new JsConformanceApiHttpClient(options); } const { fetchResponse, createResponseError, createRequiredRequestFieldError } = HttpClientUtility; @@ -24,8 +24,9 @@ function parseBoolean(value) { return undefined; } -class JsConformanceApiHttpClient { - constructor(fetch, baseUri) { +/** Provides access to JsConformanceApi over HTTP via fetch. */ +export class JsConformanceApiHttpClient { + constructor({ fetch, baseUri }) { if (typeof fetch !== 'function') { throw new TypeError('fetch must be a function.'); } diff --git a/example/js/exampleApi.js b/example/js/exampleApi.js index 4b68e95..57c4e1c 100644 --- a/example/js/exampleApi.js +++ b/example/js/exampleApi.js @@ -5,14 +5,15 @@ import { HttpClientUtility } from 'facility-core'; /** Provides access to ExampleApi over HTTP via fetch. */ -export function createHttpClient({ fetch, baseUri }) { - return new ExampleApiHttpClient(fetch, baseUri); +export function createHttpClient(options) { + return new ExampleApiHttpClient(options); } const { fetchResponse, createResponseError, createRequiredRequestFieldError } = HttpClientUtility; -class ExampleApiHttpClient { - constructor(fetch, baseUri) { +/** Provides access to ExampleApi over HTTP via fetch. */ +export class ExampleApiHttpClient { + constructor({ fetch, baseUri }) { if (typeof fetch !== 'function') { throw new TypeError('fetch must be a function.'); } diff --git a/example/ts/src/exampleApi.ts b/example/ts/src/exampleApi.ts index fd6775b..b4a734f 100644 --- a/example/ts/src/exampleApi.ts +++ b/example/ts/src/exampleApi.ts @@ -6,16 +6,17 @@ import { IExampleApi, IGetWidgetsRequest, IGetWidgetsResponse, ICreateWidgetRequ export * from './exampleApiTypes'; /** Provides access to ExampleApi over HTTP via fetch. */ -export function createHttpClient({ fetch, baseUri }: IHttpClientOptions): IExampleApi { - return new ExampleApiHttpClient(fetch, baseUri); +export function createHttpClient(options: IHttpClientOptions): IExampleApi { + return new ExampleApiHttpClient(options); } const { fetchResponse, createResponseError, createRequiredRequestFieldError } = HttpClientUtility; type IFetch = HttpClientUtility.IFetch; type IFetchRequest = HttpClientUtility.IFetchRequest; -class ExampleApiHttpClient implements IExampleApi { - constructor(fetch: IFetch, baseUri?: string) { +/** Provides access to ExampleApi over HTTP via fetch. */ +export class ExampleApiHttpClient implements IExampleApi { + constructor({ fetch, baseUri }: IHttpClientOptions) { if (typeof fetch !== 'function') { throw new TypeError('fetch must be a function.'); } diff --git a/src/Facility.CodeGen.JavaScript/JavaScriptGenerator.cs b/src/Facility.CodeGen.JavaScript/JavaScriptGenerator.cs index 1432cc7..02a1665 100644 --- a/src/Facility.CodeGen.JavaScript/JavaScriptGenerator.cs +++ b/src/Facility.CodeGen.JavaScript/JavaScriptGenerator.cs @@ -162,8 +162,8 @@ public override CodeGenOutput GenerateOutput(ServiceInfo service) code.WriteLine(); WriteJsDoc(code, $"Provides access to {capModuleName} over HTTP via fetch."); - using (code.Block("export function createHttpClient({ fetch, baseUri }" + IfTypeScript(": IHttpClientOptions") + ")" + IfTypeScript($": I{capModuleName}") + " {", "}")) - code.WriteLine($"return new {capModuleName}HttpClient(fetch, baseUri);"); + using (code.Block("export function createHttpClient(options" + IfTypeScript(": IHttpClientOptions") + ")" + IfTypeScript($": I{capModuleName}") + " {", "}")) + code.WriteLine($"return new {capModuleName}HttpClient(options);"); code.WriteLine(); code.WriteLine("const { fetchResponse, createResponseError, createRequiredRequestFieldError } = HttpClientUtility;"); @@ -192,9 +192,10 @@ public override CodeGenOutput GenerateOutput(ServiceInfo service) } code.WriteLine(); - using (code.Block($"class {capModuleName}HttpClient" + IfTypeScript($" implements I{capModuleName}") + " {", "}")) + WriteJsDoc(code, $"Provides access to {capModuleName} over HTTP via fetch."); + using (code.Block($"export class {capModuleName}HttpClient" + IfTypeScript($" implements I{capModuleName}") + " {", "}")) { - using (code.Block("constructor(fetch" + IfTypeScript(": IFetch") + ", baseUri" + IfTypeScript("?: string") + ") {", "}")) + using (code.Block("constructor({ fetch, baseUri }" + IfTypeScript(": IHttpClientOptions") + ") {", "}")) { using (code.Block("if (typeof fetch !== 'function') {", "}")) code.WriteLine("throw new TypeError('fetch must be a function.');");