Skip to main content
Home

A tool for converting OpenApi/Swagger/Apifox into code.

This package works with Node.js, Deno, BunIt is unknown whether this package works with Cloudflare Workers
It is unknown whether this package works with Cloudflare Workers
This package works with Node.js
This package works with Deno
This package works with Bun
JSR Score
100%
Published
3 months ago (2.7.5)

STC

logo

STC (Swagger Transform Code) is a tool for converting OpenApi/Swagger/Apifox into code.

New package: https://www.npmjs.com/package/@lonu/stc

Publish to release Publish Package to npmjs

JSR NPM Version

stc

Features

🚧 Encapsulate the "shared" directory.

  • 🐹 Support for Swagger 2/3(OpenApi) and Apifox.
  • 💡 Support plug-in development.
  • 🐣 Built-in transformation languages:
    • TypeScript, almost equivalent to handwriting. Depends on axios, wx.request, fetch.

    xhr/ajax、ofetch planned

    • JavaScript, from TypeScript to it.
    • Dart, dependency on dio.
    • 🚧 Swift ...

Quick start

Download executable files

download by system:

  • stc: Intel-based Mac
  • stc-m: M-series Mac
  • stc-linux:Linux
  • stc-win.exe: Windows

NPM

1.Install the @loongwoo/stc npm package.

pnpm add @loongwoo/stc -D

2.Open the project's package.json file and add the following command to scripts:

{
  "scripts": {
    "api": "stc --url=http://127.0.0.1:4523/export/openapi/2?version=3.1"
  }
}

Use

⚠️ Note: deno will not parse the ~ character as the user's home directory.

stc --url=https://petstore3.swagger.io/api/v3/openapi.json --outDir=out

终端输出信息

输出文件

Existing Project

Assume a project directory is:

.
├── src
│   └── apis # Copy the shared directory here.
│       └── shared
│       └── xxx.ts # Other files.

Axios

  1. Find the directory of outDir, copy the entire shared directory to the directory of the axios module you encapsulated.

  2. Open the shared > axios > index.ts file, copy the request method, and add it to the axios module you encapsulated. If it is not encapsulated, copy the index.ts file as a new file to avoid the problem of modification being overwritten.

  3. Taking Vue as an example, add the following code to the main.ts file:

import { createApiClient } from './apis/shared/fetchRuntime';

createApiClient({
  baseURL: 'https://api.xxx.com'
  // onError(msg) {
  //   // 处理错误信息
  // }
})

Wechat

  1. Find the directory of outDir, copy the entire directory of shared to the directory of the wechat module you encapsulated.

  2. Open the shared > wechat > ​​index.ts file, copy the request method, and add it to the wx.request code file you encapsulated. If it is not encapsulated, copy the index.ts file as a new file to avoid the problem of modification being overwritten.

  3. Add the following code to the app.ts file:

import { createApiClient } from './apis/shared/fetchRuntime';
// import Notify from './miniprogram_npm/@vant/weapp/notify/notify';

App<IAppOption>({
  onLaunch() {
    createApiClient({
      baseURL: 'https://api.xxx.com,
      onError(msg) {
        // Notify({ type: 'danger', message: msg, selector: '#v-notify'})
      }
    })
  }
});

Options

Option Alias Type Default Description
url string Swagger/OpenApi/Apifox document address, or local path.
outDir o string ./stc_out Output Directory.
client string axios http request client. When lang is ts/js, the possible values ​​are: axios, wechat, fetch.
lang l string ts Language, used for output file suffix.
tag number Specify the tag from the interface url. By default, the first tag is read for the file name.
filter f string[] Filter interfaces. Interfaces that meet the filter conditions will be generated. Example: --filter "/pet*", generate an interface for /pet, and support multiple --filter. For more usage information, please refer to micromatch
conjunction c string By The method's connector, the default value is By.
actionIndex number -1 The method name index, the default value is -1.
shared boolean true Whether to generate the shared directory. [default: true].
version v boolean Output version information.
help h boolean Output help information.

Plug-in development

For convenience, STC can not only develop plugins in Deno, but also provides @loongwoo/stc npm library, which can develop plugins in Node environment.

examples

Deno

⚠️ Prepare the Deno environment.

Create a myPlugin.ts file:

// 引用模块
// import { start } from 'https://deno.land/x/stc@2.7.5/mod.ts'
import { start } from 'jsr:@loongwoo/stc@^2.7.5'

// Defining plugins
const myPlugin: IPlugin = {
  name: 'stc:MyPlugin',
  lang: 'ts',
  setup(options) {
    console.log(options)
  },
  onTransform(def, action) {
    // definition
    const defContent: string = parserDefinition(
      def
    )
    // action
    const actionContent: Map<string, string> = parserAction(
      action
    )

    return {
      definition: {
        filename: '_types.ts',
        content: defContent,
      },
      action: actionContent // Here actionContent is of type Map<string, string>, key is the file name, value is the converted code.
    }
  },
  onEnd() {
    console.log('end')
  }
}

// 使用插件
start({
  // ...其他配置
  plugins: [myPlugin]
})

Node

  1. Create a myPlugin.ts file.

  2. Add the @loongwoo/stc reference and use the start method:

import { start } from '@loongwoo/stc'
  1. Implement the code that converts definition and action into the target language in the plugin's onTransform hook function.
export const myPlugin: IPlugin = {
  name: 'stc:MyPlugin',
  lang: 'ts',
  setup(options) {
    console.log(options)
  },
  onTransform(def, action) {
    // definition
    const defContent: string = parserDefinition(
      def
    )
    // action
    const actionContent: Map<string, string> = parserAction(
      action
    )

    return {
      definition: defContent,
      action: actionContent
    }
  },
  onEnd() {
    console.log('end')
  }
}

4.In the start method, add plugins:

start({
  // ...other options
  plugins: [myPlugin]
})

Who's Using This?


Examples

Example 1

import { start } from "https://deno.land/x/stc@$X_VERSION/mod.ts";

const myPlugin: IPlugin = {
 name: "stc:MyPlugin",
 setup(options) {
   console.log(options)
 },
 onTransform(def, action) {
   // 转换 definition
   const defContent: string = parserDefinition(def)
   // 转换 action
   const actionContent: Map<string, string> = parserAction(action)
   // 返回转换后的内容
   return {
     definition: defContent,
     action: actionContent
   }
 }
}

start({
 // ...其他配置
 plugins: [myPlugin]
})

New Ticket: Report package

Please provide a reason for reporting this package. We will review your report and take appropriate action.

Please review the JSR usage policy before submitting a report.

Add Package

deno add jsr:@loongwoo/stc

Import symbol

import * as stc from "@loongwoo/stc";
or

Import directly with a jsr specifier

import * as stc from "jsr:@loongwoo/stc";

Add Package

pnpm i jsr:@loongwoo/stc
or (using pnpm 10.8 or older)
pnpm dlx jsr add @loongwoo/stc

Import symbol

import * as stc from "@loongwoo/stc";

Add Package

yarn add jsr:@loongwoo/stc
or (using Yarn 4.8 or older)
yarn dlx jsr add @loongwoo/stc

Import symbol

import * as stc from "@loongwoo/stc";

Add Package

vlt install jsr:@loongwoo/stc

Import symbol

import * as stc from "@loongwoo/stc";

Add Package

npx jsr add @loongwoo/stc

Import symbol

import * as stc from "@loongwoo/stc";

Add Package

bunx jsr add @loongwoo/stc

Import symbol

import * as stc from "@loongwoo/stc";