feat: подготовка к публикации npm-пакета
- переименование в @gromlab/api-codegen, версия 1.0.3 - добавлена MIT лицензия - динамическое чтение версии из package.json - настроен build с копированием шаблонов и external biome - загрузка спецификации по URL для извлечения title - moduleNameFirstTag: true, cleanOutput: false
This commit is contained in:
21
LICENSE
Normal file
21
LICENSE
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2024 Gromlab
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
18
package.json
18
package.json
@@ -1,19 +1,27 @@
|
|||||||
{
|
{
|
||||||
"name": "api-codegen",
|
"name": "@gromlab/api-codegen",
|
||||||
"version": "1.0.0",
|
"version": "1.0.3",
|
||||||
"description": "CLI tool to generate TypeScript API client from OpenAPI specification",
|
"description": "CLI tool to generate TypeScript API client from OpenAPI specification",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"bin": {
|
"bin": {
|
||||||
"api-codegen": "./dist/cli.js"
|
"api-codegen": "dist/cli.js"
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"dist",
|
||||||
|
"package.json"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">=18"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "bun build src/cli.ts --target=node --outdir=dist --format=esm",
|
"build": "bun build src/cli.ts --target=node --outdir=dist --format=esm --external=@biomejs/* && cp -r src/templates dist/",
|
||||||
"dev": "bun run src/cli.ts",
|
"dev": "bun run src/cli.ts",
|
||||||
"test": "bun test",
|
"test": "bun test",
|
||||||
"test:unit": "bun test tests/unit",
|
"test:unit": "bun test tests/unit",
|
||||||
"test:integration": "bun test tests/integration",
|
"test:integration": "bun test tests/integration",
|
||||||
"test:watch": "bun test --watch",
|
"test:watch": "bun test --watch",
|
||||||
"test:coverage": "bun test --coverage"
|
"test:coverage": "bun test --coverage",
|
||||||
|
"prepublishOnly": "bun run build"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@biomejs/wasm-bundler": "^2.3.0",
|
"@biomejs/wasm-bundler": "^2.3.0",
|
||||||
|
|||||||
11
src/cli.ts
11
src/cli.ts
@@ -2,16 +2,23 @@
|
|||||||
|
|
||||||
import { Command } from 'commander';
|
import { Command } from 'commander';
|
||||||
import chalk from 'chalk';
|
import chalk from 'chalk';
|
||||||
|
import { readFileSync } from 'fs';
|
||||||
|
import { fileURLToPath } from 'url';
|
||||||
|
import { dirname, join } from 'path';
|
||||||
import { validateConfig, type GeneratorConfig } from './config.js';
|
import { validateConfig, type GeneratorConfig } from './config.js';
|
||||||
import { generate } from './generator.js';
|
import { generate } from './generator.js';
|
||||||
import { fileExists } from './utils/file.js';
|
import { fileExists } from './utils/file.js';
|
||||||
|
|
||||||
|
const __filename = fileURLToPath(import.meta.url);
|
||||||
|
const __dirname = dirname(__filename);
|
||||||
|
const pkg = JSON.parse(readFileSync(join(__dirname, '../package.json'), 'utf-8'));
|
||||||
|
|
||||||
const program = new Command();
|
const program = new Command();
|
||||||
|
|
||||||
program
|
program
|
||||||
.name('api-codegen')
|
.name('api-codegen')
|
||||||
.description('Generate TypeScript API client from OpenAPI specification')
|
.description('Generate TypeScript API client from OpenAPI specification')
|
||||||
.version('1.0.0')
|
.version(pkg.version)
|
||||||
.requiredOption('-i, --input <path>', 'Path to OpenAPI specification file (JSON or YAML)')
|
.requiredOption('-i, --input <path>', 'Path to OpenAPI specification file (JSON or YAML)')
|
||||||
.requiredOption('-o, --output <path>', 'Output directory for generated files')
|
.requiredOption('-o, --output <path>', 'Output directory for generated files')
|
||||||
.option('-n, --name <name>', 'Name of generated file (without extension)')
|
.option('-n, --name <name>', 'Name of generated file (without extension)')
|
||||||
@@ -50,3 +57,5 @@ program
|
|||||||
|
|
||||||
program.parse();
|
program.parse();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -33,3 +33,5 @@ export function validateConfig(config: Partial<GeneratorConfig>): config is Gene
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -28,7 +28,9 @@ export async function generate(config: GeneratorConfig): Promise<void> {
|
|||||||
|
|
||||||
if (isUrl) {
|
if (isUrl) {
|
||||||
url = config.inputPath;
|
url = config.inputPath;
|
||||||
// Для URL не читаем спецификацию заранее, swagger-typescript-api сделает это сам
|
// Загружаем спецификацию для получения info.title
|
||||||
|
const response = await fetch(url);
|
||||||
|
spec = await response.json();
|
||||||
} else {
|
} else {
|
||||||
inputPath = resolve(config.inputPath);
|
inputPath = resolve(config.inputPath);
|
||||||
spec = await readJsonFile<any>(inputPath);
|
spec = await readJsonFile<any>(inputPath);
|
||||||
@@ -56,12 +58,12 @@ export async function generate(config: GeneratorConfig): Promise<void> {
|
|||||||
extractRequestParams: true,
|
extractRequestParams: true,
|
||||||
extractRequestBody: true,
|
extractRequestBody: true,
|
||||||
extractEnums: true,
|
extractEnums: true,
|
||||||
cleanOutput: true,
|
cleanOutput: false,
|
||||||
singleHttpClient: true,
|
singleHttpClient: true,
|
||||||
unwrapResponseData: true,
|
unwrapResponseData: true,
|
||||||
defaultResponseAsSuccess: true,
|
defaultResponseAsSuccess: true,
|
||||||
enumNamesAsValues: false,
|
enumNamesAsValues: false,
|
||||||
moduleNameFirstTag: false,
|
moduleNameFirstTag: true,
|
||||||
generateUnionEnums: false,
|
generateUnionEnums: false,
|
||||||
extraTemplates: [],
|
extraTemplates: [],
|
||||||
addReadonly: false,
|
addReadonly: false,
|
||||||
|
|||||||
@@ -64,3 +64,5 @@ export function resolvePath(path: string): string {
|
|||||||
return join(process.cwd(), path);
|
return join(process.cwd(), path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user