@chord-ts/rpc
Version:
💎 Cutting edge transport framework vanishing borders between frontend and backend
247 lines (246 loc) • 7.01 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.example = exports.SchemaGenerator = void 0;
const server_1 = require("../server");
class SchemaGenerator {
constructor(config) {
const openrpc = config?.openrpc ?? '1.2.6';
const info = config?.info ?? {
title: 'OpenRPC Docs',
description: 'Automatically generated by Chord RPC framework',
version: '0.0.1',
license: {
name: 'Apache 2.0'
}
};
const servers = config?.servers ?? [{ url: 'http://localhost:5173' }];
const methods = [];
for (const [, v] of server_1.Composer.methods.entries()) {
const desc = this.describeMethod(v);
if (!desc)
continue;
methods.push(desc);
}
this.schema = {
openrpc,
info,
servers,
methods
};
}
describeMethod(method) {
if (!method.validators?.in)
return;
return;
const name = method.key.toString();
const [serviceName, methodName] = name.split('.');
const tags = [{ name: serviceName }];
let params = [];
let result;
}
render() {
return JSON.stringify(this.schema, null, 2);
}
}
exports.SchemaGenerator = SchemaGenerator;
exports.example = {
openrpc: '1.2.1',
info: {
version: '1.0.0',
title: 'Petstore',
license: {
name: 'MIT'
}
},
servers: [
{
url: 'http://localhost:8080'
}
],
methods: [
{
name: 'list_pets',
summary: 'List all pets',
tags: [
{
name: 'pets'
}
],
params: [
{
name: 'limit',
description: 'How many items to return at one time (max 100)',
required: false,
schema: {
type: 'integer',
minimum: 1
}
}
],
result: {
name: 'pets',
description: 'A paged array of pets',
schema: {
$ref: '#/components/schemas/Pets'
}
},
errors: [
{
code: 100,
message: 'pets busy'
}
],
examples: [
{
name: 'listPetExample',
description: 'List pet example',
params: [
{
name: 'limit',
value: 1
}
],
result: {
name: 'listPetResultExample',
value: [
{
id: 7,
name: 'fluffy',
tag: 'poodle'
}
]
}
}
]
},
{
name: 'create_pet',
summary: 'Create a pet',
tags: [
{
name: 'pets'
}
],
params: [
{
name: 'newPetName',
description: 'Name of pet to create',
required: true,
schema: {
type: 'string'
}
},
{
name: 'newPetTag',
description: 'Pet tag to create',
schema: {
type: 'string'
}
}
],
examples: [
{
name: 'createPetExample',
description: 'Create pet example',
params: [
{
name: 'newPetName',
value: 'fluffy'
},
{
name: 'tag',
value: 'poodle'
}
],
result: {
name: 'listPetResultExample',
value: 7
}
}
],
result: {
$ref: '#/components/contentDescriptors/PetId'
}
},
{
name: 'get_pet',
summary: 'Info for a specific pet',
tags: [
{
name: 'pets'
}
],
params: [
{
$ref: '#/components/contentDescriptors/PetId'
}
],
result: {
name: 'pet',
description: 'Expected response to a valid request',
schema: {
$ref: '#/components/schemas/Pet'
}
},
examples: [
{
name: 'getPetExample',
description: 'get pet example',
params: [
{
name: 'petId',
value: 7
}
],
result: {
name: 'getPetExampleResult',
value: {
name: 'fluffy',
tag: 'poodle',
id: 7
}
}
}
]
}
],
components: {
contentDescriptors: {
PetId: {
name: 'petId',
required: true,
description: 'The id of the pet to retrieve',
schema: {
$ref: '#/components/schemas/PetId'
}
}
},
schemas: {
PetId: {
type: 'integer',
minimum: 0
},
Pet: {
type: 'object',
required: ['id', 'name'],
properties: {
id: {
$ref: '#/components/schemas/PetId'
},
name: {
type: 'string'
},
tag: {
type: 'string'
}
}
},
Pets: {
type: 'array',
items: {
$ref: '#/components/schemas/Pet'
}
}
}
}
};