astraea

help developer output the typescript interfaces of api by swagger or json

Usage no npm install needed!

<script type="module">
  import astraea from 'https://cdn.skypack.dev/astraea';
</script>

README

Astraea

travis ci badge version license downloads downloads-month

Description

help developer output the typescript interfaces of api by swagger.json or json

Install

npm install astraea

Usage

swagger

Demo

Test

options

  • input, swagger.json
  • dir, output directory
  • opt,
    • blackList, filter path
    • optional, boolean, all params are optinaol
    • suffix, file format, eg: ts or d.ts
const astraea = require('astraea');
const swagger = require('./swagger.json');
astraea.swagger(
  swagger, 
  './example/swagger', 
  {
    blackList: ['DELETE/pet/:petId']
  }
)

json

Demo

Test

options

  • input, json description
  • dir, output directory
  • opt,
    • blackList, filter path
    • optional, boolean, all params are optinaol
    • suffix, file format, eg: ts or d.ts
const astraea = require('astraea');

astraea.json(
  {
    get: {
      '/api/persion/detail': {
        a: 1,
      },
      '/api/pet/detail': {
        a: 1,
      }
    },
    post: {
      '/api/persion/create': () => [{
        a: 1,
        b: [
          {
            v: 1
          }
        ]
      }],
    }
  }, 
  './example/json', 
  {
    blackList: [ 'GET/api/persion/detail'],
    optional: true,
  }
)

scan

astraea.scan based on astraea.json, it will scan all .js files of inputDir.

Demo

Test

options

  • inputDir, .js dir
  • outputDir, output directory
  • opt,
    • blackList, filter path
    • optional, boolean, all params are optinaol
    • suffix, file format, eg: ts or d.ts
const astraea = require('../index.js');
const path = require('path');

astraea.scan({
  inputDir: path.resolve(__dirname, './scanData'),
  outputDir: path.resolve(__dirname, '../example/scan'),
  request: {
    optional: true,
  },
  response: {},
});

How to use?

this is a simple example, you need to rework if use in prod!

import {
  IGetRoutes as ISwaggerGetRoutes,
  IPostRoutes as ISwaggerPostRoutes,
  IPutRoutes as ISwaggerPutRoutes,
  IDeleteRoutes as ISwaggerDeleteRoutes,
} from './swagger/routes';

import {
  IGetRoutes as IJsonGetRoutes,
  IPostRoutes as IJsonPostRoutes,
  IPutRoutes as IJsonPutRoutes,
  IDeleteRoutes as IJsonDeleteRoutes,
} from './json/routes';

export interface IGetRoutes extends ISwaggerGetRoutes, IJsonGetRoutes {}

export interface IPostRoutes extends ISwaggerPostRoutes,  IJsonPostRoutes {}

export interface IPutRoutes extends ISwaggerPutRoutes, IJsonPutRoutes {}

export interface IDeleteRoutes extends ISwaggerDeleteRoutes, IJsonDeleteRoutes {}

const get: <K extends keyof IGetRoutes>(url: K) => IGetRoutes[K];
const post: <K extends keyof IPostRoutes>(url: K) => IPostRoutes[K];
const dl: <K extends keyof IPutRoutes>(url: K) => IPutRoutes[K];
const put: <K extends keyof IDeleteRoutes>(url: K) => IDeleteRoutes[K];

get('/pet/:petId').category.id;
post('/api/persion/create');
dl('/pet');
put('/store/order/:orderId');

Examlpe

here

routes.ts

click here

import { RootObject as GetPetFindByStatus } from './GET/pet/findByStatus';
import { RootObject as GetPetFindByTags } from './GET/pet/findByTags';
import { RootObject as GetPetPetId } from './GET/pet/:petId';
import { RootObject as GetStoreInventory } from './GET/store/inventory';
import { RootObject as GetStoreOrderOrderId } from './GET/store/order/:orderId';
import { RootObject as GetUserLogin } from './GET/user/login';
import { RootObject as GetUserLogout } from './GET/user/logout';
import { RootObject as GetUserUsername } from './GET/user/:username';
import { RootObject as PostPet } from './POST/pet';
import { RootObject as PostPetPetId } from './POST/pet/:petId';
import { RootObject as PostPetPetIdUploadImage } from './POST/pet/:petId/uploadImage';
import { RootObject as PostStoreOrder } from './POST/store/order';
import { RootObject as PostUser } from './POST/user';
import { RootObject as PostUserCreateWithArray } from './POST/user/createWithArray';
import { RootObject as PostUserCreateWithList } from './POST/user/createWithList';
import { RootObject as PutPet } from './PUT/pet';
import { RootObject as PutUserUsername } from './PUT/user/:username';
import { RootObject as DeletePetPetId } from './DELETE/pet/:petId';
import { RootObject as DeleteStoreOrderOrderId } from './DELETE/store/order/:orderId';
import { RootObject as DeleteUserUsername } from './DELETE/user/:username';

export interface IGetRoutes {
  '/pet/findByStatus': GetPetFindByStatus;
  '/pet/findByTags': GetPetFindByTags;
  '/pet/:petId': GetPetPetId;
  '/store/inventory': GetStoreInventory;
  '/store/order/:orderId': GetStoreOrderOrderId;
  '/user/login': GetUserLogin;
  '/user/logout': GetUserLogout;
  '/user/:username': GetUserUsername;
} 

export interface IPostRoutes {
  '/pet': PostPet;
  '/pet/:petId': PostPetPetId;
  '/pet/:petId/uploadImage': PostPetPetIdUploadImage;
  '/store/order': PostStoreOrder;
  '/user': PostUser;
  '/user/createWithArray': PostUserCreateWithArray;
  '/user/createWithList': PostUserCreateWithList;
} 

export interface IPutRoutes {
  '/pet': PutPet;
  '/user/:username': PutUserUsername;
} 

export interface IDeleteRoutes {
  '/pet/:petId': DeletePetPetId;
  '/store/order/:orderId': DeleteStoreOrderOrderId;
  '/user/:username': DeleteUserUsername;
}