Skip to content

Commit

Permalink
feat(pipe): add swag-ofetch js and ts gen package
Browse files Browse the repository at this point in the history
  • Loading branch information
hairyf committed May 24, 2023
1 parent c015187 commit cdbf63c
Show file tree
Hide file tree
Showing 11 changed files with 329 additions and 3 deletions.
25 changes: 25 additions & 0 deletions packages/@swag/ofetch-js/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
{
"name": "@genapi/swag-ofetch-js",
"version": "1.0.0",
"main": "src/index.ts",
"scripts": {
"build": "ptsup -r src --dts --meta --clean",
"lint": "eslint ./"
},
"publishConfig": {
"directory": "dist",
"main": "index.js",
"types": "./index.d.ts",
"linkDirectory": false
},
"dependencies": {
"@genapi/config": "workspace:*",
"@genapi/core": "*",
"@genapi/pipeline": "workspace:*",
"@genapi/swag-parser": "workspace:*"
},
"devDependencies": {
"ofetch": "^1.0.1",
"openapi-specification-types": "^0.0.1"
}
}
19 changes: 19 additions & 0 deletions packages/@swag/ofetch-js/src/config/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import type { ApiPipeline } from '@genapi/config'
import { replaceMainext } from '@genapi/config'
import { readConfig as _readConfig } from '@genapi/pipeline'

export function readConfig(config: ApiPipeline.Config): ApiPipeline.ConfigRead {
config.import = config.import || {}
config.output = config.output || {}
config.import.http = config.import.http || 'ofetch'
config.output = replaceMainext(config.output) || 'src/api/index.js'

const configRead = _readConfig(config)

configRead.graphs.imports.push({
name: 'ofetch',
value: config.import.http,
})

return configRead
}
20 changes: 20 additions & 0 deletions packages/@swag/ofetch-js/src/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { compiler, dest, generate, original } from '@genapi/pipeline'
import type { ApiPipeline } from '@genapi/config'
import { pipeline } from '@genapi/core'
import { readConfig } from './config'
import { parser } from './parser'

function OpenAPI2Typescript(config: ApiPipeline.Config) {
const process = pipeline(
config => readConfig(config),
configRead => original(configRead),
configRead => parser(configRead),
configRead => compiler(configRead),
configRead => generate(configRead),
configRead => dest(configRead),
)
return process(config)
}
export { readConfig, original, parser, compiler, generate, dest }

export default OpenAPI2Typescript
97 changes: 97 additions & 0 deletions packages/@swag/ofetch-js/src/parser/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
import type { ApiPipeline, StatementFunction, StatementInterface } from '@genapi/config'
import type { Paths } from 'openapi-specification-types'
import {
literalFieldsToString,
parseHeaderCommits,
parseMethodMetadata,
parseMethodParameters,
parseOpenAPISpecification32,
transformBaseURL,
transformDefinitions,
transformParameters,
transformQueryParams,
transformUrlSyntax,
traversePaths,
} from '@genapi/swag-parser'

export interface PathsTransformOptions {
configRead: ApiPipeline.ConfigRead
interfaces: StatementInterface[]
functions: StatementFunction[]
}

export function parser(configRead: ApiPipeline.ConfigRead) {
const source = parseOpenAPISpecification32(configRead.source)

const comments = parseHeaderCommits(source)

const interfaces: StatementInterface[] = []
const functions: StatementFunction[] = []

transformBaseURL(source, {
configRead,
})

transformDefinitions(source.definitions, {
interfaces,
})

transformPaths(source.paths, {
configRead,
functions,
interfaces,
})
configRead.graphs.comments = comments
configRead.graphs.functions = functions
configRead.graphs.interfaces = interfaces

return configRead
}

export function transformPaths(paths: Paths, { configRead, functions, interfaces }: PathsTransformOptions) {
traversePaths(paths, (config) => {
/**
* function params/function options/function use interfaces
*/
const { parameters, interfaces: attachInters, options } = parseMethodParameters(config, {
formData: 'body',
query: 'params',
})

let { name, description, url, responseType, body } = parseMethodMetadata(config)

interfaces.push(...attachInters)
parameters.push({
name: 'options',
type: 'import(\'ofetch\').FetchOptions',
required: false,
})
options.push(['...', 'options'])
options.unshift(['method', `"${config.method}"`])
if (configRead.config.baseURL)
options.unshift('baseURL')

transformParameters(parameters, {
syntax: 'ecmascript',
configRead,
description,
interfaces,
responseType,
})

url = transformQueryParams('query', { body, options, url })
url = transformUrlSyntax(url, { baseURL: configRead.config.baseURL })

functions.push({
export: true,
async: true,
name,
description,
parameters,
body: [
...body,
`return ofetch(${url}, {${literalFieldsToString(options)}})`,
],
})
})
}
24 changes: 24 additions & 0 deletions packages/@swag/ofetch-ts/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
{
"name": "@genapi/swag-ofetch-ts",
"version": "1.0.0",
"main": "src/index.ts",
"scripts": {
"build": "ptsup -r src --dts --meta --clean",
"lint": "eslint ./"
},
"publishConfig": {
"directory": "dist",
"main": "index.js",
"types": "./index.d.ts",
"linkDirectory": false
},
"dependencies": {
"@genapi/config": "workspace:*",
"@genapi/core": "*",
"@genapi/pipeline": "workspace:*",
"@genapi/swag-parser": "workspace:*"
},
"devDependencies": {
"openapi-specification-types": "^0.0.1"
}
}
24 changes: 24 additions & 0 deletions packages/@swag/ofetch-ts/src/config/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import type { ApiPipeline } from '@genapi/config'
import { readConfig as _readConfig } from '@genapi/pipeline'

export function readConfig(config: ApiPipeline.Config): ApiPipeline.ConfigRead {
config.import = config.import || {}
config.import.http = config.import.http || 'ofetch'

const configRead = _readConfig(config)

configRead.graphs.imports.push({
name: 'ofetch',
names: config.import.http === 'ofetch' ? ['FetchOptions'] : undefined,
value: config.import.http,
})

if (config.import.http !== 'ofetch') {
configRead.graphs.imports.push({
names: ['FetchOptions'],
value: 'ofetch',
})
}

return configRead
}
20 changes: 20 additions & 0 deletions packages/@swag/ofetch-ts/src/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { compiler, dest, generate, original } from '@genapi/pipeline'
import type { ApiPipeline } from '@genapi/config'
import { pipeline } from '@genapi/core'
import { readConfig } from './config'
import { parser } from './parser'

function OpenAPI2Typescript(config: ApiPipeline.Config) {
const process = pipeline(
config => readConfig(config),
configRead => original(configRead),
configRead => parser(configRead),
configRead => compiler(configRead),
configRead => generate(configRead),
configRead => dest(configRead),
)
return process(config)
}
export { readConfig, original, parser, compiler, generate, dest }

export default OpenAPI2Typescript
96 changes: 96 additions & 0 deletions packages/@swag/ofetch-ts/src/parser/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
import type { ApiPipeline, StatementFunction, StatementInterface } from '@genapi/config'
import type { Paths } from 'openapi-specification-types'
import {
literalFieldsToString,
parseHeaderCommits,
parseMethodMetadata,
parseMethodParameters,
parseOpenAPISpecification32,
transformBaseURL,
transformDefinitions,
transformParameters,
transformQueryParams,
transformUrlSyntax,
traversePaths,
} from '@genapi/swag-parser'

export interface PathsTransformOptions {
configRead: ApiPipeline.ConfigRead
interfaces: StatementInterface[]
functions: StatementFunction[]
}

export function parser(configRead: ApiPipeline.ConfigRead) {
const source = parseOpenAPISpecification32(configRead.source)

const comments = parseHeaderCommits(source)

const interfaces: StatementInterface[] = []
const functions: StatementFunction[] = []

transformBaseURL(source, {
configRead,
})

transformDefinitions(source.definitions, {
interfaces,
})

transformPaths(source.paths, {
configRead,
functions,
interfaces,
})

configRead.graphs.comments = comments
configRead.graphs.functions = functions
configRead.graphs.interfaces = interfaces

return configRead
}

export function transformPaths(paths: Paths, { configRead, functions, interfaces }: PathsTransformOptions) {
traversePaths(paths, (config) => {
/**
* function params/function options/function use interfaces
*/
const { parameters, interfaces: attachInters, options } = parseMethodParameters(config, {
formData: 'body',
query: 'params',
})

let { name, description, url, responseType, body } = parseMethodMetadata(config)

interfaces.push(...attachInters)
parameters.push({
name: 'options',
type: 'FetchOptions',
required: false,
})
options.push(['...', 'options'])
options.unshift(['method', `"${config.method}"`])
if (configRead.config.baseURL)
options.unshift('baseURL')

const { spaceResponseType } = transformParameters(parameters, {
syntax: 'typescript',
configRead,
description,
interfaces,
responseType,
})

url = transformQueryParams('query', { body, options, url })
url = transformUrlSyntax(url)

functions.push({
export: true,
name,
description,
parameters,
body: [
`return ofetch<${spaceResponseType}>(${url}, {${literalFieldsToString(options)}})`,
],
})
})
}
1 change: 0 additions & 1 deletion packages/@tests/bin/index.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
#!/usr/bin/env node

require('esbuild-register')
require('@genapi/cli/src/bin/index.ts')
2 changes: 1 addition & 1 deletion packages/@tests/genapi.config.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { defineConfig } from '@genapi/config'

const config = defineConfig({
pipeline: 'swag-axios-js',
pipeline: 'swag-ofetch-ts',
input: 'https://petstore.swagger.io/v2/swagger.json',
output: 'dist/index.ts',
})
Expand Down
4 changes: 3 additions & 1 deletion packages/@tests/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,9 @@
"@genapi/swag-got-js": "workspace:*",
"@genapi/swag-got-ts": "workspace:*",
"@genapi/swag-ky-js": "workspace:*",
"@genapi/swag-ky-ts": "workspace:*"
"@genapi/swag-ky-ts": "workspace:*",
"@genapi/swag-ofetch-js": "workspace:*",
"@genapi/swag-ofetch-ts": "workspace:*"
},
"devDependencies": {
"@types/node": "^18.14.0",
Expand Down

0 comments on commit cdbf63c

Please sign in to comment.