diff --git a/.eslintrc.json b/.eslintrc.json index bffb357..5ad64cf 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,3 +1,7 @@ { - "extends": "next/core-web-vitals" + "extends": "next/core-web-vitals", + "rules": { + "react/no-unescaped-entities": "off", + "@next/next/no-page-custom-font": "off" + } } diff --git a/.lintstagedrc.js b/.lintstagedrc.js new file mode 100644 index 0000000..caa6c80 --- /dev/null +++ b/.lintstagedrc.js @@ -0,0 +1,12 @@ +const path = require("path"); + +const buildEslintCommand = (filenames) => + `next lint --fix --file ${filenames + .map((f) => path.relative(process.cwd(), f)) + .join(" --file ")}`; + +const buildPrettierCommand = "npx prettier --write ."; + +module.exports = { + "*.{js,jsx,ts,tsx}": [buildEslintCommand, buildPrettierCommand], +}; diff --git a/components/Footer.tsx b/components/Footer.tsx index 974a05e..85ab2f6 100644 --- a/components/Footer.tsx +++ b/components/Footer.tsx @@ -1,20 +1,26 @@ export const Footer = () => { - return ( - - ) -} + return ( + + ); +}; -export default Footer \ No newline at end of file +export default Footer; diff --git a/components/Header.tsx b/components/Header.tsx index 0b9aed4..05dd88b 100644 --- a/components/Header.tsx +++ b/components/Header.tsx @@ -1,9 +1,11 @@ -import Link from "next/link" +import Link from "next/link"; export const Header = () => { - return ( -
- Unconditional. -
- ) -} + return ( +
+ + Unconditional. + +
+ ); +}; diff --git a/generated/core/ApiError.ts b/generated/core/ApiError.ts index 99d7929..7c04458 100644 --- a/generated/core/ApiError.ts +++ b/generated/core/ApiError.ts @@ -1,24 +1,28 @@ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { ApiRequestOptions } from './ApiRequestOptions'; -import type { ApiResult } from './ApiResult'; +import type { ApiRequestOptions } from "./ApiRequestOptions"; +import type { ApiResult } from "./ApiResult"; export class ApiError extends Error { - public readonly url: string; - public readonly status: number; - public readonly statusText: string; - public readonly body: any; - public readonly request: ApiRequestOptions; + public readonly url: string; + public readonly status: number; + public readonly statusText: string; + public readonly body: any; + public readonly request: ApiRequestOptions; - constructor(request: ApiRequestOptions, response: ApiResult, message: string) { - super(message); + constructor( + request: ApiRequestOptions, + response: ApiResult, + message: string + ) { + super(message); - this.name = 'ApiError'; - this.url = response.url; - this.status = response.status; - this.statusText = response.statusText; - this.body = response.body; - this.request = request; - } + this.name = "ApiError"; + this.url = response.url; + this.status = response.status; + this.statusText = response.statusText; + this.body = response.body; + this.request = request; + } } diff --git a/generated/core/ApiRequestOptions.ts b/generated/core/ApiRequestOptions.ts index c7b7753..b6d725f 100644 --- a/generated/core/ApiRequestOptions.ts +++ b/generated/core/ApiRequestOptions.ts @@ -2,15 +2,22 @@ /* tslint:disable */ /* eslint-disable */ export type ApiRequestOptions = { - readonly method: 'GET' | 'PUT' | 'POST' | 'DELETE' | 'OPTIONS' | 'HEAD' | 'PATCH'; - readonly url: string; - readonly path?: Record; - readonly cookies?: Record; - readonly headers?: Record; - readonly query?: Record; - readonly formData?: Record; - readonly body?: any; - readonly mediaType?: string; - readonly responseHeader?: string; - readonly errors?: Record; + readonly method: + | "GET" + | "PUT" + | "POST" + | "DELETE" + | "OPTIONS" + | "HEAD" + | "PATCH"; + readonly url: string; + readonly path?: Record; + readonly cookies?: Record; + readonly headers?: Record; + readonly query?: Record; + readonly formData?: Record; + readonly body?: any; + readonly mediaType?: string; + readonly responseHeader?: string; + readonly errors?: Record; }; diff --git a/generated/core/ApiResult.ts b/generated/core/ApiResult.ts index b095dc7..91f60ae 100644 --- a/generated/core/ApiResult.ts +++ b/generated/core/ApiResult.ts @@ -2,9 +2,9 @@ /* tslint:disable */ /* eslint-disable */ export type ApiResult = { - readonly url: string; - readonly ok: boolean; - readonly status: number; - readonly statusText: string; - readonly body: any; + readonly url: string; + readonly ok: boolean; + readonly status: number; + readonly statusText: string; + readonly body: any; }; diff --git a/generated/core/CancelablePromise.ts b/generated/core/CancelablePromise.ts index 26ad303..63c9819 100644 --- a/generated/core/CancelablePromise.ts +++ b/generated/core/CancelablePromise.ts @@ -2,127 +2,126 @@ /* tslint:disable */ /* eslint-disable */ export class CancelError extends Error { - - constructor(message: string) { - super(message); - this.name = 'CancelError'; - } - - public get isCancelled(): boolean { - return true; - } + constructor(message: string) { + super(message); + this.name = "CancelError"; + } + + public get isCancelled(): boolean { + return true; + } } export interface OnCancel { - readonly isResolved: boolean; - readonly isRejected: boolean; - readonly isCancelled: boolean; + readonly isResolved: boolean; + readonly isRejected: boolean; + readonly isCancelled: boolean; - (cancelHandler: () => void): void; + (cancelHandler: () => void): void; } export class CancelablePromise implements Promise { - readonly [Symbol.toStringTag]!: string; - - private _isResolved: boolean; - private _isRejected: boolean; - private _isCancelled: boolean; - private readonly _cancelHandlers: (() => void)[]; - private readonly _promise: Promise; - private _resolve?: (value: T | PromiseLike) => void; - private _reject?: (reason?: any) => void; - - constructor( - executor: ( - resolve: (value: T | PromiseLike) => void, - reject: (reason?: any) => void, - onCancel: OnCancel - ) => void - ) { - this._isResolved = false; - this._isRejected = false; - this._isCancelled = false; - this._cancelHandlers = []; - this._promise = new Promise((resolve, reject) => { - this._resolve = resolve; - this._reject = reject; - - const onResolve = (value: T | PromiseLike): void => { - if (this._isResolved || this._isRejected || this._isCancelled) { - return; - } - this._isResolved = true; - this._resolve?.(value); - }; - - const onReject = (reason?: any): void => { - if (this._isResolved || this._isRejected || this._isCancelled) { - return; - } - this._isRejected = true; - this._reject?.(reason); - }; - - const onCancel = (cancelHandler: () => void): void => { - if (this._isResolved || this._isRejected || this._isCancelled) { - return; - } - this._cancelHandlers.push(cancelHandler); - }; - - Object.defineProperty(onCancel, 'isResolved', { - get: (): boolean => this._isResolved, - }); - - Object.defineProperty(onCancel, 'isRejected', { - get: (): boolean => this._isRejected, - }); - - Object.defineProperty(onCancel, 'isCancelled', { - get: (): boolean => this._isCancelled, - }); - - return executor(onResolve, onReject, onCancel as OnCancel); - }); - } - - public then( - onFulfilled?: ((value: T) => TResult1 | PromiseLike) | null, - onRejected?: ((reason: any) => TResult2 | PromiseLike) | null - ): Promise { - return this._promise.then(onFulfilled, onRejected); - } - - public catch( - onRejected?: ((reason: any) => TResult | PromiseLike) | null - ): Promise { - return this._promise.catch(onRejected); - } + readonly [Symbol.toStringTag]!: string; + + private _isResolved: boolean; + private _isRejected: boolean; + private _isCancelled: boolean; + private readonly _cancelHandlers: (() => void)[]; + private readonly _promise: Promise; + private _resolve?: (value: T | PromiseLike) => void; + private _reject?: (reason?: any) => void; + + constructor( + executor: ( + resolve: (value: T | PromiseLike) => void, + reject: (reason?: any) => void, + onCancel: OnCancel + ) => void + ) { + this._isResolved = false; + this._isRejected = false; + this._isCancelled = false; + this._cancelHandlers = []; + this._promise = new Promise((resolve, reject) => { + this._resolve = resolve; + this._reject = reject; + + const onResolve = (value: T | PromiseLike): void => { + if (this._isResolved || this._isRejected || this._isCancelled) { + return; + } + this._isResolved = true; + this._resolve?.(value); + }; - public finally(onFinally?: (() => void) | null): Promise { - return this._promise.finally(onFinally); - } + const onReject = (reason?: any): void => { + if (this._isResolved || this._isRejected || this._isCancelled) { + return; + } + this._isRejected = true; + this._reject?.(reason); + }; - public cancel(): void { + const onCancel = (cancelHandler: () => void): void => { if (this._isResolved || this._isRejected || this._isCancelled) { - return; + return; } - this._isCancelled = true; - if (this._cancelHandlers.length) { - try { - for (const cancelHandler of this._cancelHandlers) { - cancelHandler(); - } - } catch (error) { - console.warn('Cancellation threw an error', error); - return; - } + this._cancelHandlers.push(cancelHandler); + }; + + Object.defineProperty(onCancel, "isResolved", { + get: (): boolean => this._isResolved, + }); + + Object.defineProperty(onCancel, "isRejected", { + get: (): boolean => this._isRejected, + }); + + Object.defineProperty(onCancel, "isCancelled", { + get: (): boolean => this._isCancelled, + }); + + return executor(onResolve, onReject, onCancel as OnCancel); + }); + } + + public then( + onFulfilled?: ((value: T) => TResult1 | PromiseLike) | null, + onRejected?: ((reason: any) => TResult2 | PromiseLike) | null + ): Promise { + return this._promise.then(onFulfilled, onRejected); + } + + public catch( + onRejected?: ((reason: any) => TResult | PromiseLike) | null + ): Promise { + return this._promise.catch(onRejected); + } + + public finally(onFinally?: (() => void) | null): Promise { + return this._promise.finally(onFinally); + } + + public cancel(): void { + if (this._isResolved || this._isRejected || this._isCancelled) { + return; + } + this._isCancelled = true; + if (this._cancelHandlers.length) { + try { + for (const cancelHandler of this._cancelHandlers) { + cancelHandler(); } - this._cancelHandlers.length = 0; - this._reject?.(new CancelError('Request aborted')); + } catch (error) { + console.warn("Cancellation threw an error", error); + return; + } } + this._cancelHandlers.length = 0; + this._reject?.(new CancelError("Request aborted")); + } - public get isCancelled(): boolean { - return this._isCancelled; - } + public get isCancelled(): boolean { + return this._isCancelled; + } } diff --git a/generated/core/OpenAPI.ts b/generated/core/OpenAPI.ts index cfe254a..afafa8e 100644 --- a/generated/core/OpenAPI.ts +++ b/generated/core/OpenAPI.ts @@ -1,31 +1,31 @@ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { ApiRequestOptions } from './ApiRequestOptions'; +import type { ApiRequestOptions } from "./ApiRequestOptions"; type Resolver = (options: ApiRequestOptions) => Promise; type Headers = Record; export type OpenAPIConfig = { - BASE: string; - VERSION: string; - WITH_CREDENTIALS: boolean; - CREDENTIALS: 'include' | 'omit' | 'same-origin'; - TOKEN?: string | Resolver; - USERNAME?: string | Resolver; - PASSWORD?: string | Resolver; - HEADERS?: Headers | Resolver; - ENCODE_PATH?: (path: string) => string; + BASE: string; + VERSION: string; + WITH_CREDENTIALS: boolean; + CREDENTIALS: "include" | "omit" | "same-origin"; + TOKEN?: string | Resolver; + USERNAME?: string | Resolver; + PASSWORD?: string | Resolver; + HEADERS?: Headers | Resolver; + ENCODE_PATH?: (path: string) => string; }; export const OpenAPI: OpenAPIConfig = { - BASE: process.env.NEXT_PUBLIC_API_BASE || 'http://localhost:8080', - VERSION: '1.0', - WITH_CREDENTIALS: false, - CREDENTIALS: 'include', - TOKEN: undefined, - USERNAME: undefined, - PASSWORD: undefined, - HEADERS: undefined, - ENCODE_PATH: undefined, + BASE: process.env.NEXT_PUBLIC_API_BASE || "http://localhost:8080", + VERSION: "1.0", + WITH_CREDENTIALS: false, + CREDENTIALS: "include", + TOKEN: undefined, + USERNAME: undefined, + PASSWORD: undefined, + HEADERS: undefined, + ENCODE_PATH: undefined, }; diff --git a/generated/core/request.ts b/generated/core/request.ts index 0a87eb5..89593c3 100644 --- a/generated/core/request.ts +++ b/generated/core/request.ts @@ -1,270 +1,291 @@ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import { ApiError } from './ApiError'; -import type { ApiRequestOptions } from './ApiRequestOptions'; -import type { ApiResult } from './ApiResult'; -import { CancelablePromise } from './CancelablePromise'; -import type { OnCancel } from './CancelablePromise'; -import type { OpenAPIConfig } from './OpenAPI'; - -const isDefined = (value: T | null | undefined): value is Exclude => { - return value !== undefined && value !== null; +import { ApiError } from "./ApiError"; +import type { ApiRequestOptions } from "./ApiRequestOptions"; +import type { ApiResult } from "./ApiResult"; +import { CancelablePromise } from "./CancelablePromise"; +import type { OnCancel } from "./CancelablePromise"; +import type { OpenAPIConfig } from "./OpenAPI"; + +const isDefined = ( + value: T | null | undefined +): value is Exclude => { + return value !== undefined && value !== null; }; const isString = (value: any): value is string => { - return typeof value === 'string'; + return typeof value === "string"; }; const isStringWithValue = (value: any): value is string => { - return isString(value) && value !== ''; + return isString(value) && value !== ""; }; const isBlob = (value: any): value is Blob => { - return ( - typeof value === 'object' && - typeof value.type === 'string' && - typeof value.stream === 'function' && - typeof value.arrayBuffer === 'function' && - typeof value.constructor === 'function' && - typeof value.constructor.name === 'string' && - /^(Blob|File)$/.test(value.constructor.name) && - /^(Blob|File)$/.test(value[Symbol.toStringTag]) - ); + return ( + typeof value === "object" && + typeof value.type === "string" && + typeof value.stream === "function" && + typeof value.arrayBuffer === "function" && + typeof value.constructor === "function" && + typeof value.constructor.name === "string" && + /^(Blob|File)$/.test(value.constructor.name) && + /^(Blob|File)$/.test(value[Symbol.toStringTag]) + ); }; const isFormData = (value: any): value is FormData => { - return value instanceof FormData; + return value instanceof FormData; }; const base64 = (str: string): string => { - try { - return btoa(str); - } catch (err) { - // @ts-ignore - return Buffer.from(str).toString('base64'); - } + try { + return btoa(str); + } catch (err) { + // @ts-ignore + return Buffer.from(str).toString("base64"); + } }; const getQueryString = (params: Record): string => { - const qs: string[] = []; + const qs: string[] = []; - const append = (key: string, value: any) => { - qs.push(`${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`); - }; + const append = (key: string, value: any) => { + qs.push(`${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`); + }; - const process = (key: string, value: any) => { - if (isDefined(value)) { - if (Array.isArray(value)) { - value.forEach(v => { - process(key, v); - }); - } else if (typeof value === 'object') { - Object.entries(value).forEach(([k, v]) => { - process(`${key}[${k}]`, v); - }); - } else { - append(key, value); - } - } - }; + const process = (key: string, value: any) => { + if (isDefined(value)) { + if (Array.isArray(value)) { + value.forEach((v) => { + process(key, v); + }); + } else if (typeof value === "object") { + Object.entries(value).forEach(([k, v]) => { + process(`${key}[${k}]`, v); + }); + } else { + append(key, value); + } + } + }; - Object.entries(params).forEach(([key, value]) => { - process(key, value); - }); + Object.entries(params).forEach(([key, value]) => { + process(key, value); + }); - if (qs.length > 0) { - return `?${qs.join('&')}`; - } + if (qs.length > 0) { + return `?${qs.join("&")}`; + } - return ''; + return ""; }; const getUrl = (config: OpenAPIConfig, options: ApiRequestOptions): string => { - const encoder = config.ENCODE_PATH || encodeURI; - - const path = options.url - .replace('{api-version}', config.VERSION) - .replace(/{(.*?)}/g, (substring: string, group: string) => { - if (options.path?.hasOwnProperty(group)) { - return encoder(String(options.path[group])); - } - return substring; - }); + const encoder = config.ENCODE_PATH || encodeURI; + + const path = options.url + .replace("{api-version}", config.VERSION) + .replace(/{(.*?)}/g, (substring: string, group: string) => { + if (options.path?.hasOwnProperty(group)) { + return encoder(String(options.path[group])); + } + return substring; + }); - const url = `${config.BASE}${path}`; - if (options.query) { - return `${url}${getQueryString(options.query)}`; - } - return url; + const url = `${config.BASE}${path}`; + if (options.query) { + return `${url}${getQueryString(options.query)}`; + } + return url; }; const getFormData = (options: ApiRequestOptions): FormData | undefined => { - if (options.formData) { - const formData = new FormData(); - - const process = (key: string, value: any) => { - if (isString(value) || isBlob(value)) { - formData.append(key, value); - } else { - formData.append(key, JSON.stringify(value)); - } - }; + if (options.formData) { + const formData = new FormData(); - Object.entries(options.formData) - .filter(([_, value]) => isDefined(value)) - .forEach(([key, value]) => { - if (Array.isArray(value)) { - value.forEach(v => process(key, v)); - } else { - process(key, value); - } - }); - - return formData; - } - return undefined; + const process = (key: string, value: any) => { + if (isString(value) || isBlob(value)) { + formData.append(key, value); + } else { + formData.append(key, JSON.stringify(value)); + } + }; + + Object.entries(options.formData) + .filter(([_, value]) => isDefined(value)) + .forEach(([key, value]) => { + if (Array.isArray(value)) { + value.forEach((v) => process(key, v)); + } else { + process(key, value); + } + }); + + return formData; + } + return undefined; }; type Resolver = (options: ApiRequestOptions) => Promise; -const resolve = async (options: ApiRequestOptions, resolver?: T | Resolver): Promise => { - if (typeof resolver === 'function') { - return (resolver as Resolver)(options); - } - return resolver; +const resolve = async ( + options: ApiRequestOptions, + resolver?: T | Resolver +): Promise => { + if (typeof resolver === "function") { + return (resolver as Resolver)(options); + } + return resolver; }; -const getHeaders = async (config: OpenAPIConfig, options: ApiRequestOptions): Promise => { - const token = await resolve(options, config.TOKEN); - const username = await resolve(options, config.USERNAME); - const password = await resolve(options, config.PASSWORD); - const additionalHeaders = await resolve(options, config.HEADERS); - - const headers = Object.entries({ - Accept: 'application/json', - ...additionalHeaders, - ...options.headers, - }) - .filter(([_, value]) => isDefined(value)) - .reduce((headers, [key, value]) => ({ - ...headers, - [key]: String(value), - }), {} as Record); - - if (isStringWithValue(token)) { - headers['Authorization'] = `Bearer ${token}`; - } - - if (isStringWithValue(username) && isStringWithValue(password)) { - const credentials = base64(`${username}:${password}`); - headers['Authorization'] = `Basic ${credentials}`; - } +const getHeaders = async ( + config: OpenAPIConfig, + options: ApiRequestOptions +): Promise => { + const token = await resolve(options, config.TOKEN); + const username = await resolve(options, config.USERNAME); + const password = await resolve(options, config.PASSWORD); + const additionalHeaders = await resolve(options, config.HEADERS); + + const headers = Object.entries({ + Accept: "application/json", + ...additionalHeaders, + ...options.headers, + }) + .filter(([_, value]) => isDefined(value)) + .reduce( + (headers, [key, value]) => ({ + ...headers, + [key]: String(value), + }), + {} as Record + ); - if (options.body) { - if (options.mediaType) { - headers['Content-Type'] = options.mediaType; - } else if (isBlob(options.body)) { - headers['Content-Type'] = options.body.type || 'application/octet-stream'; - } else if (isString(options.body)) { - headers['Content-Type'] = 'text/plain'; - } else if (!isFormData(options.body)) { - headers['Content-Type'] = 'application/json'; - } + if (isStringWithValue(token)) { + headers["Authorization"] = `Bearer ${token}`; + } + + if (isStringWithValue(username) && isStringWithValue(password)) { + const credentials = base64(`${username}:${password}`); + headers["Authorization"] = `Basic ${credentials}`; + } + + if (options.body) { + if (options.mediaType) { + headers["Content-Type"] = options.mediaType; + } else if (isBlob(options.body)) { + headers["Content-Type"] = options.body.type || "application/octet-stream"; + } else if (isString(options.body)) { + headers["Content-Type"] = "text/plain"; + } else if (!isFormData(options.body)) { + headers["Content-Type"] = "application/json"; } + } - return new Headers(headers); + return new Headers(headers); }; const getRequestBody = (options: ApiRequestOptions): any => { - if (options.body) { - if (options.mediaType?.includes('/json')) { - return JSON.stringify(options.body) - } else if (isString(options.body) || isBlob(options.body) || isFormData(options.body)) { - return options.body; - } else { - return JSON.stringify(options.body); - } + if (options.body) { + if (options.mediaType?.includes("/json")) { + return JSON.stringify(options.body); + } else if ( + isString(options.body) || + isBlob(options.body) || + isFormData(options.body) + ) { + return options.body; + } else { + return JSON.stringify(options.body); } - return undefined; + } + return undefined; }; export const sendRequest = async ( - config: OpenAPIConfig, - options: ApiRequestOptions, - url: string, - body: any, - formData: FormData | undefined, - headers: Headers, - onCancel: OnCancel + config: OpenAPIConfig, + options: ApiRequestOptions, + url: string, + body: any, + formData: FormData | undefined, + headers: Headers, + onCancel: OnCancel ): Promise => { - const controller = new AbortController(); + const controller = new AbortController(); - const request: RequestInit = { - headers, - body: body ?? formData, - method: options.method, - signal: controller.signal, - }; + const request: RequestInit = { + headers, + body: body ?? formData, + method: options.method, + signal: controller.signal, + }; - if (config.WITH_CREDENTIALS) { - request.credentials = config.CREDENTIALS; - } + if (config.WITH_CREDENTIALS) { + request.credentials = config.CREDENTIALS; + } - onCancel(() => controller.abort()); + onCancel(() => controller.abort()); - return await fetch(url, request); + return await fetch(url, request); }; -const getResponseHeader = (response: Response, responseHeader?: string): string | undefined => { - if (responseHeader) { - const content = response.headers.get(responseHeader); - if (isString(content)) { - return content; - } +const getResponseHeader = ( + response: Response, + responseHeader?: string +): string | undefined => { + if (responseHeader) { + const content = response.headers.get(responseHeader); + if (isString(content)) { + return content; } - return undefined; + } + return undefined; }; const getResponseBody = async (response: Response): Promise => { - if (response.status !== 204) { - try { - const contentType = response.headers.get('Content-Type'); - if (contentType) { - const isJSON = contentType.toLowerCase().startsWith('application/json'); - if (isJSON) { - return await response.json(); - } else { - return await response.text(); - } - } - } catch (error) { - console.error(error); + if (response.status !== 204) { + try { + const contentType = response.headers.get("Content-Type"); + if (contentType) { + const isJSON = contentType.toLowerCase().startsWith("application/json"); + if (isJSON) { + return await response.json(); + } else { + return await response.text(); } + } + } catch (error) { + console.error(error); } - return undefined; + } + return undefined; }; -const catchErrorCodes = (options: ApiRequestOptions, result: ApiResult): void => { - const errors: Record = { - 400: 'Bad Request', - 401: 'Unauthorized', - 403: 'Forbidden', - 404: 'Not Found', - 500: 'Internal Server Error', - 502: 'Bad Gateway', - 503: 'Service Unavailable', - ...options.errors, - } - - const error = errors[result.status]; - if (error) { - throw new ApiError(options, result, error); - } - - if (!result.ok) { - throw new ApiError(options, result, 'Generic Error'); - } +const catchErrorCodes = ( + options: ApiRequestOptions, + result: ApiResult +): void => { + const errors: Record = { + 400: "Bad Request", + 401: "Unauthorized", + 403: "Forbidden", + 404: "Not Found", + 500: "Internal Server Error", + 502: "Bad Gateway", + 503: "Service Unavailable", + ...options.errors, + }; + + const error = errors[result.status]; + if (error) { + throw new ApiError(options, result, error); + } + + if (!result.ok) { + throw new ApiError(options, result, "Generic Error"); + } }; /** @@ -274,33 +295,47 @@ const catchErrorCodes = (options: ApiRequestOptions, result: ApiResult): void => * @returns CancelablePromise * @throws ApiError */ -export const request = (config: OpenAPIConfig, options: ApiRequestOptions): CancelablePromise => { - return new CancelablePromise(async (resolve, reject, onCancel) => { - try { - const url = getUrl(config, options); - const formData = getFormData(options); - const body = getRequestBody(options); - const headers = await getHeaders(config, options); - - if (!onCancel.isCancelled) { - const response = await sendRequest(config, options, url, body, formData, headers, onCancel); - const responseBody = await getResponseBody(response); - const responseHeader = getResponseHeader(response, options.responseHeader); - - const result: ApiResult = { - url, - ok: response.ok, - status: response.status, - statusText: response.statusText, - body: responseHeader ?? responseBody, - }; - - catchErrorCodes(options, result); - - resolve(result.body); - } - } catch (error) { - reject(error); - } - }); +export const request = ( + config: OpenAPIConfig, + options: ApiRequestOptions +): CancelablePromise => { + return new CancelablePromise(async (resolve, reject, onCancel) => { + try { + const url = getUrl(config, options); + const formData = getFormData(options); + const body = getRequestBody(options); + const headers = await getHeaders(config, options); + + if (!onCancel.isCancelled) { + const response = await sendRequest( + config, + options, + url, + body, + formData, + headers, + onCancel + ); + const responseBody = await getResponseBody(response); + const responseHeader = getResponseHeader( + response, + options.responseHeader + ); + + const result: ApiResult = { + url, + ok: response.ok, + status: response.status, + statusText: response.statusText, + body: responseHeader ?? responseBody, + }; + + catchErrorCodes(options, result); + + resolve(result.body); + } + } catch (error) { + reject(error); + } + }); }; diff --git a/generated/index.ts b/generated/index.ts index edb898a..37f6832 100644 --- a/generated/index.ts +++ b/generated/index.ts @@ -1,13 +1,13 @@ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -export { ApiError } from './core/ApiError'; -export { CancelablePromise, CancelError } from './core/CancelablePromise'; -export { OpenAPI } from './core/OpenAPI'; -export type { OpenAPIConfig } from './core/OpenAPI'; +export { ApiError } from "./core/ApiError"; +export { CancelablePromise, CancelError } from "./core/CancelablePromise"; +export { OpenAPI } from "./core/OpenAPI"; +export type { OpenAPIConfig } from "./core/OpenAPI"; -export type { Error } from './models/Error'; -export type { FeedImage } from './models/FeedImage'; -export type { FeedItem } from './models/FeedItem'; +export type { Error } from "./models/Error"; +export type { FeedImage } from "./models/FeedImage"; +export type { FeedItem } from "./models/FeedItem"; -export { DefaultService } from './services/DefaultService'; +export { DefaultService } from "./services/DefaultService"; diff --git a/generated/models/Error.ts b/generated/models/Error.ts index 42afe5a..6a630f7 100644 --- a/generated/models/Error.ts +++ b/generated/models/Error.ts @@ -3,7 +3,6 @@ /* eslint-disable */ export type Error = { - message: string; - code: number; + message: string; + code: number; }; - diff --git a/generated/models/FeedImage.ts b/generated/models/FeedImage.ts index 79e412e..01da40a 100644 --- a/generated/models/FeedImage.ts +++ b/generated/models/FeedImage.ts @@ -3,7 +3,6 @@ /* eslint-disable */ export type FeedImage = { - url: string; - title: string; + url: string; + title: string; }; - diff --git a/generated/models/FeedItem.ts b/generated/models/FeedItem.ts index 03134dd..97532b3 100644 --- a/generated/models/FeedItem.ts +++ b/generated/models/FeedItem.ts @@ -2,15 +2,14 @@ /* tslint:disable */ /* eslint-disable */ -import type { FeedImage } from './FeedImage'; +import type { FeedImage } from "./FeedImage"; export type FeedItem = { - title: string; - summary: string; - link: string; - source: string; - language: string; - image?: FeedImage; - date: string; + title: string; + summary: string; + link: string; + source: string; + language: string; + image?: FeedImage; + date: string; }; - diff --git a/generated/services/DefaultService.ts b/generated/services/DefaultService.ts index efdc709..6f4473a 100644 --- a/generated/services/DefaultService.ts +++ b/generated/services/DefaultService.ts @@ -1,32 +1,30 @@ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { FeedItem } from '../models/FeedItem'; +import type { FeedItem } from "../models/FeedItem"; -import type { CancelablePromise } from '../core/CancelablePromise'; -import { OpenAPI } from '../core/OpenAPI'; -import { request as __request } from '../core/request'; +import type { CancelablePromise } from "../core/CancelablePromise"; +import { OpenAPI } from "../core/OpenAPI"; +import { request as __request } from "../core/request"; export class DefaultService { - - /** - * @param query - * @returns FeedItem OK - * @throws ApiError - */ - public static getV1SearchFeed( - query: string, - ): CancelablePromise> { - return __request(OpenAPI, { - method: 'GET', - url: '/v1/search/feed/{query}', - path: { - 'query': query, - }, - errors: { - 500: `Internal Server Error`, - }, - }); - } - + /** + * @param query + * @returns FeedItem OK + * @throws ApiError + */ + public static getV1SearchFeed( + query: string + ): CancelablePromise> { + return __request(OpenAPI, { + method: "GET", + url: "/v1/search/feed/{query}", + path: { + query: query, + }, + errors: { + 500: `Internal Server Error`, + }, + }); + } } diff --git a/next.config.js b/next.config.js index ae88795..3d3bc99 100644 --- a/next.config.js +++ b/next.config.js @@ -2,6 +2,6 @@ const nextConfig = { reactStrictMode: true, swcMinify: true, -} +}; -module.exports = nextConfig +module.exports = nextConfig; diff --git a/package.json b/package.json index 72cd03a..9e7757a 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,7 @@ "build": "next build", "start": "next start", "lint": "next lint", + "format": "npx prettier --write .", "generate": "openapi --input /Users/luigibarbato/Dev/Projects/api/swagger.yaml --output ./generated", "prepare": "husky install" }, @@ -30,8 +31,5 @@ "eslint": "8.25.0", "eslint-config-next": "12.3.1", "typescript": "4.8.4" - }, - "lint-staged": { - "*.js": "eslint --cache --fix" } -} \ No newline at end of file +} diff --git a/pages/_app.tsx b/pages/_app.tsx index 3f5c9d5..8c4d5de 100644 --- a/pages/_app.tsx +++ b/pages/_app.tsx @@ -1,8 +1,8 @@ -import '../styles/globals.css' -import type { AppProps } from 'next/app' +import "../styles/globals.css"; +import type { AppProps } from "next/app"; function MyApp({ Component, pageProps }: AppProps) { - return + return ; } -export default MyApp +export default MyApp; diff --git a/pages/about.tsx b/pages/about.tsx index 0e9c31c..cd7cea0 100644 --- a/pages/about.tsx +++ b/pages/about.tsx @@ -1,29 +1,63 @@ -import type { NextPage } from 'next' -import Link from 'next/link' -import Footer from '../components/Footer' -import { Header } from '../components/Header' +import type { NextPage } from "next"; +import Link from "next/link"; +import Footer from "../components/Footer"; +import { Header } from "../components/Header"; const About: NextPage = () => { - return ( -
-
-
-

A place free of any outside influence for an unconditional and spontaneous information research.

-

Unconditional aims to be a place free of any outside influence for free and spontaneous information research. This project was born above all from a personal need: To inform ourselves by developing our own critical sense and thinking and not to let someone else do it for us.

-

Where you are the only one who can decide what to think.

-

This project uses no targeting system, no recommendation or ranking system, and no profiling. The "database" referred to is a public static file made available to the community, for the community. In fact, the sources are decided by it. The only thing that is done is to make the information available in a structured way, so that it can be easily consulted and used.

-

It is much simpler than you think, help us.

-

The project is completely open source and anyone can contribute by improving its code,usability and the sources of information it refers to. The server is re-deployed hourly by indexing and serving the new articles served by the sources it finds in the public source file. That's it! nothing more and nothing less.

-

The most important thing

-

Let us be clear, the project is intended to provide independent and free information, not disinformation. We in no way accept biased, disrespectful and discriminatory sources We believe in public information and respect the great work that different news outlets do every day.

+ return ( +
+
+
+

+ A place free of any outside influence for an unconditional and + spontaneous information research. +

+

+ Unconditional aims to be a place free of any outside influence for + free and spontaneous information research. This project was born above + all from a personal need: To inform ourselves by developing our own + critical sense and thinking and not to let someone else do it for us. +

+

Where you are the only one who can decide what to think.

+

+ {" "} + This project uses no targeting system, no recommendation or ranking + system, and no profiling. The "database" referred to is a + public static file made available to the community, for the community. + In fact, the sources are decided by it. The only thing that is done is + to make the information available in a structured way, so that it can + be easily consulted and used. +

+

It is much simpler than you think, help us.

+

+ The project is completely open source and anyone + can contribute by improving its code,usability and the sources of + information it refers to. The server is re-deployed hourly by indexing + and serving the new articles served by the sources it finds in the{" "} + public source file. That"s it! nothing more + and nothing less. +

+

The most important thing

+

+ {" "} + Let us be clear, the project is intended to provide independent and + free information, not disinformation. We in no way accept biased, + disrespectful and discriminatory sources We believe in public + information and respect the great work that different news outlets do + every day.{" "} +

- Start your Unconditional. + + Start your Unconditional. + +
-
+
+
+ ); +}; -