Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings
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
4 changes: 2 additions & 2 deletions 4 Directory.Build.props
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
<Project>

<PropertyGroup>
<VersionPrefix>3.5.0</VersionPrefix>
<PackageValidationBaselineVersion>3.4.0</PackageValidationBaselineVersion>
<VersionPrefix>3.6.0</VersionPrefix>
<PackageValidationBaselineVersion>3.5.0</PackageValidationBaselineVersion>
<LangVersion>12.0</LangVersion>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
Expand Down
4 changes: 4 additions & 0 deletions 4 ReleaseNotes.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@

These are the NuGet package releases. See also [npm Release Notes](ReleaseNotesNpm.md).

## 3.6.0

* Add client support for events (Server-Sent Events).

## 3.5.0

* Add option to omit generated HTTP client.
Expand Down
4 changes: 4 additions & 0 deletions 4 ReleaseNotesNpm.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@

These are `facility-core` npm package releases. See also [Release Notes](ReleaseNotes.md).

## 2.3.0

* Add support for Server-Sent Events.

## 2.2.0

* Add `context` to request methods.
Expand Down
4 changes: 2 additions & 2 deletions 4 conformance/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion 2 conformance/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
"fastify-cli": "^7.3.0",
"mocha": "^10.0.0",
"node-fetch": "^2.6.7",
"typescript": "^5.7.2"
"typescript": "~5.7.2"
},
"dependencies": {
"facility-core": "file:../ts",
Expand Down
17 changes: 15 additions & 2 deletions 17 conformance/src/conformanceApi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,15 @@
/* eslint-disable */

import { HttpClientUtility, IServiceResult, IHttpClientOptions } from 'facility-core';
import { IConformanceApi, IGetApiInfoRequest, IGetApiInfoResponse, IGetWidgetsRequest, IGetWidgetsResponse, ICreateWidgetRequest, ICreateWidgetResponse, IGetWidgetRequest, IGetWidgetResponse, IDeleteWidgetRequest, IDeleteWidgetResponse, IGetWidgetBatchRequest, IGetWidgetBatchResponse, IMirrorFieldsRequest, IMirrorFieldsResponse, ICheckQueryRequest, ICheckQueryResponse, ICheckPathRequest, ICheckPathResponse, IMirrorHeadersRequest, IMirrorHeadersResponse, IMixedRequest, IMixedResponse, IRequiredRequest, IRequiredResponse, IMirrorBytesRequest, IMirrorBytesResponse, IMirrorTextRequest, IMirrorTextResponse, IBodyTypesRequest, IBodyTypesResponse, IWidget, IAny, IAnyArray, IAnyMap, IAnyResult, IAnyNullable, IHasWidget, Answer, ApiErrors } from './conformanceApiTypes';
import { IConformanceApi, IGetApiInfoRequest, IGetApiInfoResponse, IGetWidgetsRequest, IGetWidgetsResponse, ICreateWidgetRequest, ICreateWidgetResponse, IGetWidgetRequest, IGetWidgetResponse, IDeleteWidgetRequest, IDeleteWidgetResponse, IGetWidgetBatchRequest, IGetWidgetBatchResponse, IMirrorFieldsRequest, IMirrorFieldsResponse, ICheckQueryRequest, ICheckQueryResponse, ICheckPathRequest, ICheckPathResponse, IMirrorHeadersRequest, IMirrorHeadersResponse, IMixedRequest, IMixedResponse, IRequiredRequest, IRequiredResponse, IMirrorBytesRequest, IMirrorBytesResponse, IMirrorTextRequest, IMirrorTextResponse, IBodyTypesRequest, IBodyTypesResponse, IFibonacciRequest, IFibonacciResponse, IWidget, IAny, IAnyArray, IAnyMap, IAnyResult, IAnyNullable, IHasWidget, Answer, ApiErrors } from './conformanceApiTypes';
export * from './conformanceApiTypes';

/** Provides access to ConformanceApi over HTTP via fetch. */
export function createHttpClient(options: IHttpClientOptions): IConformanceApi {
return new ConformanceApiHttpClient(options);
}

const { fetchResponse, createResponseError, createRequiredRequestFieldError } = HttpClientUtility;
const { fetchResponse, createResponseError, createRequiredRequestFieldError, createFetchEventStream } = HttpClientUtility;
type IFetch = HttpClientUtility.IFetch;
type IFetchRequest = HttpClientUtility.IFetchRequest;

Expand Down Expand Up @@ -603,6 +603,19 @@ export class ConformanceApiHttpClient implements IConformanceApi {
});
}

public fibonacci(request: IFibonacciRequest, context?: unknown): Promise<IServiceResult<AsyncIterable<IServiceResult<IFibonacciResponse>>>> {
let uri = 'fibonacci';
const query: string[] = [];
request.count == null || query.push('count=' + request.count.toString());
if (query.length) {
uri = uri + '?' + query.join('&');
}
const fetchRequest: IFetchRequest = {
method: 'GET',
};
return HttpClientUtility.createFetchEventStream<IFibonacciResponse>(this._fetch, this._baseUri + uri, fetchRequest, context);
}

private _fetch: IFetch;
private _baseUri: string;
}
142 changes: 120 additions & 22 deletions 142 conformance/src/conformanceApiService.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,39 @@
import { IServiceError, IServiceResult } from "facility-core";
import { IConformanceApi, IGetApiInfoRequest, IGetApiInfoResponse, IGetWidgetsRequest, IGetWidgetsResponse, ICreateWidgetRequest, ICreateWidgetResponse, IGetWidgetRequest, IGetWidgetResponse, IDeleteWidgetRequest, IDeleteWidgetResponse, IGetWidgetBatchRequest, IGetWidgetBatchResponse, IMirrorFieldsRequest, IMirrorFieldsResponse, ICheckQueryRequest, ICheckQueryResponse, ICheckPathRequest, ICheckPathResponse, IMirrorHeadersRequest, IMirrorHeadersResponse, IMixedRequest, IMixedResponse, IRequiredRequest, IRequiredResponse, IMirrorBytesRequest, IMirrorBytesResponse, IMirrorTextRequest, IMirrorTextResponse, IBodyTypesRequest, IBodyTypesResponse } from "./conformanceApiTypes";
import {
IConformanceApi,
IGetApiInfoRequest,
IGetApiInfoResponse,
IGetWidgetsRequest,
IGetWidgetsResponse,
ICreateWidgetRequest,
ICreateWidgetResponse,
IGetWidgetRequest,
IGetWidgetResponse,
IDeleteWidgetRequest,
IDeleteWidgetResponse,
IGetWidgetBatchRequest,
IGetWidgetBatchResponse,
IMirrorFieldsRequest,
IMirrorFieldsResponse,
ICheckQueryRequest,
ICheckQueryResponse,
ICheckPathRequest,
ICheckPathResponse,
IMirrorHeadersRequest,
IMirrorHeadersResponse,
IMixedRequest,
IMixedResponse,
IRequiredRequest,
IRequiredResponse,
IMirrorBytesRequest,
IMirrorBytesResponse,
IMirrorTextRequest,
IMirrorTextResponse,
IBodyTypesRequest,
IBodyTypesResponse,
IFibonacciRequest,
IFibonacciResponse,
} from "./conformanceApiTypes";

export type ConformanceApiTest = {
test: string;
Expand All @@ -14,68 +48,127 @@ export class ConformanceApiService implements IConformanceApi {
this._tests = tests;
}

getApiInfo(request: IGetApiInfoRequest, context?: unknown): Promise<IServiceResult<IGetApiInfoResponse>> {
getApiInfo(
request: IGetApiInfoRequest,
context?: unknown
): Promise<IServiceResult<IGetApiInfoResponse>> {
return this.execute("getApiInfo", request);
}

getWidgets(request: IGetWidgetsRequest, context?: unknown): Promise<IServiceResult<IGetWidgetsResponse>> {
getWidgets(
request: IGetWidgetsRequest,
context?: unknown
): Promise<IServiceResult<IGetWidgetsResponse>> {
return this.execute("getWidgets", request);
}

createWidget(request: ICreateWidgetRequest, context?: unknown): Promise<IServiceResult<ICreateWidgetResponse>> {
createWidget(
request: ICreateWidgetRequest,
context?: unknown
): Promise<IServiceResult<ICreateWidgetResponse>> {
return this.execute("createWidget", request);
}

getWidget(request: IGetWidgetRequest, context?: unknown): Promise<IServiceResult<IGetWidgetResponse>> {
getWidget(
request: IGetWidgetRequest,
context?: unknown
): Promise<IServiceResult<IGetWidgetResponse>> {
return this.execute("getWidget", request);
}

deleteWidget(request: IDeleteWidgetRequest, context?: unknown): Promise<IServiceResult<IDeleteWidgetResponse>> {
deleteWidget(
request: IDeleteWidgetRequest,
context?: unknown
): Promise<IServiceResult<IDeleteWidgetResponse>> {
return this.execute("deleteWidget", request);
}

getWidgetBatch(request: IGetWidgetBatchRequest, context?: unknown): Promise<IServiceResult<IGetWidgetBatchResponse>> {
getWidgetBatch(
request: IGetWidgetBatchRequest,
context?: unknown
): Promise<IServiceResult<IGetWidgetBatchResponse>> {
return this.execute("getWidgetBatch", request);
}

mirrorFields(request: IMirrorFieldsRequest, context?: unknown): Promise<IServiceResult<IMirrorFieldsResponse>> {
mirrorFields(
request: IMirrorFieldsRequest,
context?: unknown
): Promise<IServiceResult<IMirrorFieldsResponse>> {
return this.execute("mirrorFields", request);
}

checkQuery(request: ICheckQueryRequest, context?: unknown): Promise<IServiceResult<ICheckQueryResponse>> {
checkQuery(
request: ICheckQueryRequest,
context?: unknown
): Promise<IServiceResult<ICheckQueryResponse>> {
return this.execute("checkQuery", request);
}

checkPath(request: ICheckPathRequest, context?: unknown): Promise<IServiceResult<ICheckPathResponse>> {
checkPath(
request: ICheckPathRequest,
context?: unknown
): Promise<IServiceResult<ICheckPathResponse>> {
return this.execute("checkPath", request);
}

mirrorHeaders(request: IMirrorHeadersRequest, context?: unknown): Promise<IServiceResult<IMirrorHeadersResponse>> {
mirrorHeaders(
request: IMirrorHeadersRequest,
context?: unknown
): Promise<IServiceResult<IMirrorHeadersResponse>> {
return this.execute("mirrorHeaders", request);
}

mixed(request: IMixedRequest, context?: unknown): Promise<IServiceResult<IMixedResponse>> {
mixed(
request: IMixedRequest,
context?: unknown
): Promise<IServiceResult<IMixedResponse>> {
return this.execute("mixed", request);
}

required(request: IRequiredRequest, context?: unknown): Promise<IServiceResult<IRequiredResponse>> {
required(
request: IRequiredRequest,
context?: unknown
): Promise<IServiceResult<IRequiredResponse>> {
return this.execute("required", request);
}

mirrorBytes(request: IMirrorBytesRequest, context?: unknown): Promise<IServiceResult<IMirrorBytesResponse>> {
mirrorBytes(
request: IMirrorBytesRequest,
context?: unknown
): Promise<IServiceResult<IMirrorBytesResponse>> {
return this.execute("mirrorBytes", request);
}

mirrorText(request: IMirrorTextRequest, context?: unknown): Promise<IServiceResult<IMirrorTextResponse>> {
mirrorText(
request: IMirrorTextRequest,
context?: unknown
): Promise<IServiceResult<IMirrorTextResponse>> {
return this.execute("mirrorText", request);
}

bodyTypes(request: IBodyTypesRequest, context?: unknown): Promise<IServiceResult<IBodyTypesResponse>> {
bodyTypes(
request: IBodyTypesRequest,
context?: unknown
): Promise<IServiceResult<IBodyTypesResponse>> {
return this.execute("bodyTypes", request);
}

private async execute<TRequest, TResponse>(methodName: string, request: TRequest): Promise<IServiceResult<TResponse>> {
const testsWithMethodName = this._tests.filter((x) => x.method === methodName);
fibonacci(
request: IFibonacciRequest,
context?: unknown
): Promise<
IServiceResult<AsyncIterable<IServiceResult<IFibonacciResponse>>>
> {
return this.execute("fibonacci", request);
}

private async execute<TRequest, TResponse>(
methodName: string,
request: TRequest
): Promise<IServiceResult<TResponse>> {
const testsWithMethodName = this._tests.filter(
(x) => x.method === methodName
);

if (testsWithMethodName.length === 0) {
return this.failure({
Expand All @@ -96,13 +189,18 @@ export class ConformanceApiService implements IConformanceApi {
}

var testInfo = testsWithMatchingRequest[0];
return testInfo.error ? this.failure(testInfo.error) : this.success(testInfo.response as TResponse);
return testInfo.error
? this.failure(testInfo.error)
: this.success(testInfo.response as TResponse);
}

private success<T>(result: T): IServiceResult<T> { return { value: result }; }
private success<T>(result: T): IServiceResult<T> {
return { value: result };
}

private failure<T>(error: IServiceError): IServiceResult<T> { return { error}; }
private failure<T>(error: IServiceError): IServiceResult<T> {
return { error };
}

private readonly _tests: readonly ConformanceApiTest[];

}
12 changes: 12 additions & 0 deletions 12 conformance/src/conformanceApiTypes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@ export interface IConformanceApi {
mirrorText(request: IMirrorTextRequest, context?: unknown): Promise<IServiceResult<IMirrorTextResponse>>;

bodyTypes(request: IBodyTypesRequest, context?: unknown): Promise<IServiceResult<IBodyTypesResponse>>;

fibonacci(request: IFibonacciRequest, context?: unknown): Promise<IServiceResult<AsyncIterable<IServiceResult<IFibonacciResponse>>>>;
}

/** Request for GetApiInfo. */
Expand Down Expand Up @@ -330,6 +332,16 @@ export interface IBodyTypesResponse {
content?: string;
}

/** Request for Fibonacci. */
export interface IFibonacciRequest {
count: number;
}

/** Response for Fibonacci. */
export interface IFibonacciResponse {
value: number;
}

/** A widget. */
export interface IWidget {
/** A unique identifier for the widget. */
Expand Down
12 changes: 12 additions & 0 deletions 12 conformance/src/fastify/conformanceApiPlugin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -874,6 +874,8 @@ export interface IConformanceApi {
mirrorText(request: IMirrorTextRequest, context?: unknown): Promise<IServiceResult<IMirrorTextResponse>>;

bodyTypes(request: IBodyTypesRequest, context?: unknown): Promise<IServiceResult<IBodyTypesResponse>>;

fibonacci(request: IFibonacciRequest, context?: unknown): Promise<IServiceResult<AsyncIterable<IServiceResult<IFibonacciResponse>>>>;
}

/** Request for GetApiInfo. */
Expand Down Expand Up @@ -1164,6 +1166,16 @@ export interface IBodyTypesResponse {
content?: string;
}

/** Request for Fibonacci. */
export interface IFibonacciRequest {
count: number;
}

/** Response for Fibonacci. */
export interface IFibonacciResponse {
value: number;
}

/** A widget. */
export interface IWidget {
/** A unique identifier for the widget. */
Expand Down
15 changes: 14 additions & 1 deletion 15 conformance/src/jsConformanceApi.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ export function createHttpClient(options) {
return new JsConformanceApiHttpClient(options);
}

const { fetchResponse, createResponseError, createRequiredRequestFieldError } = HttpClientUtility;
const { fetchResponse, createResponseError, createRequiredRequestFieldError, createFetchEventStream } = HttpClientUtility;

function parseBoolean(value) {
if (typeof value === 'string') {
Expand Down Expand Up @@ -599,4 +599,17 @@ export class JsConformanceApiHttpClient {
return { value: value };
});
}

fibonacci(request, context) {
let uri = 'fibonacci';
const query = [];
request.count == null || query.push('count=' + request.count.toString());
if (query.length) {
uri = uri + '?' + query.join('&');
}
const fetchRequest = {
method: 'GET',
};
return createFetchEventStream(this._fetch, this._baseUri + uri, fetchRequest, context);
}
}
Loading
Morty Proxy This is a proxified and sanitized view of the page, visit original site.