Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 23 additions & 2 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -1,10 +1,31 @@
root = true

[*]
ij_html_space_inside_empty_tag = true
end_of_line = lf
insert_final_newline = true

[*.{js,json,yml}]
charset = utf-8
indent_style = space
indent_size = 2
trim_trailing_whitespace = true
max_line_length = 120

# quote style
ij_javascript_force_quote_style = true
ij_typescript_force_quote_style = true
ij_javascript_use_double_quotes = false
ij_typescript_use_double_quotes = false

# bracket spacing
ij_javascript_spaces_within_object_literal_braces = true
ij_typescript_spaces_within_object_literal_braces = true
ij_javascript_spaces_within_object_type_braces = true
ij_typescript_spaces_within_object_type_braces = true

# imports
ij_javascript_spaces_within_imports = true
ij_typescript_spaces_within_imports = true
ij_javascript_import_merge_members = true
ij_typescript_import_merge_members = true
ij_javascript_import_sort_members = true
ij_typescript_import_sort_members = true
10 changes: 2 additions & 8 deletions .eslintrc.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"parser": "@typescript-eslint/parser",
"plugins": ["@typescript-eslint", "prettier", "no-relative-import-paths"],
"extends": ["eslint:recommended", "plugin:@typescript-eslint/recommended", "prettier"],
"plugins": ["@typescript-eslint", "no-relative-import-paths"],
"extends": ["eslint:recommended", "plugin:@typescript-eslint/recommended"],
"parserOptions": {
"project": "./tsconfig.eslint.json"
},
Expand All @@ -11,12 +11,6 @@
},
"rules": {
"no-console": ["error"],
"prettier/prettier": [
"error",
{
"endOfLine": "auto"
}
],
"@typescript-eslint/no-explicit-any": ["error"],
"@typescript-eslint/no-unused-vars": ["error", { "ignoreRestSiblings": true }],
"no-relative-import-paths/no-relative-import-paths": ["error", { "allowSameFolder": true }],
Expand Down
20 changes: 20 additions & 0 deletions .oxfmtrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{
"$schema": "./node_modules/oxfmt/configuration_schema.json",
"printWidth": 120,
"experimentalSortImports": {
"customGroups": [
{
"groupName": "at-alias",
"elementNamePattern": ["@"]
},
{
"groupName": "hash-alias",
"elementNamePattern": ["#"]
}
],
"groups": ["builtin", "external", "internal", "at-alias", "hash-alias", ["parent", "sibling", "index"], "unknown"],
"newlinesBetween": true,
"internalPattern": ["^src/"]
},
"ignorePatterns": ["**/*.hbs"]
}
1 change: 0 additions & 1 deletion .prettierignore

This file was deleted.

3 changes: 0 additions & 3 deletions .prettierrc.json

This file was deleted.

4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ yarn openapi-codegen generate --config my-config.ts
--config Path to TS config file (default: 'openapi-codegen.config.ts')
--input Path/URL to OpenAPI JSON/YAML document
--output Output directory path (default: 'output')
--prettier Format the generated code using Prettier (default: true)
--format Format the generated code using Oxfmt (default: true)
--verbose Display detailed log messages during execution (default: false)

--splitByTags Organize output into separate folders based on OpenAPI operation tags (default: true)
Expand Down Expand Up @@ -276,7 +276,7 @@ export class JSONDto {

```ts
export class JSONDto {
@ApiProperty({ additionalProperties: { type: 'any' } })
@ApiProperty({ additionalProperties: { type: "any" } })
@Expose()
@IsObject()
nested: NestedDto;
Expand Down
8 changes: 3 additions & 5 deletions esbuild.mjs
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
import { build } from "esbuild";
import fs from "fs";

import { build } from "esbuild";

const packageJson = JSON.parse(fs.readFileSync("package.json", "utf-8"));

const external = [
...Object.keys(packageJson.dependencies || {}),
...Object.keys(packageJson.peerDependencies || {}),
];
const external = [...Object.keys(packageJson.dependencies || {}), ...Object.keys(packageJson.peerDependencies || {})];

// CLI and Node.js builds - run in Node.js
const nodeBuildOptions = {
Expand Down
87 changes: 42 additions & 45 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,29 @@
{
"name": "@povio/openapi-codegen-cli",
"version": "2.0.1",
"keywords": [
"codegen",
"openapi",
"povio",
"react-query",
"zod"
],
"homepage": "https://github.com/povio/openapi-codegen-cli",
"bugs": "https://github.com/povio/openapi-codegen-cli/issues",
"license": "BSD-3-Clause",
"repository": {
"type": "git",
"url": "git+https://github.com/povio/openapi-codegen-cli.git"
},
"bin": {
"openapi-codegen": "./dist/sh.js"
},
"files": [
"README.md",
"dist/*",
"src/assets/**",
"src/generators/templates/**"
],
"main": "./dist/index.js",
"types": "./dist/index.d.ts",
"exports": {
Expand All @@ -20,9 +43,6 @@
"require": "./dist/acl.js"
}
},
"bin": {
"openapi-codegen": "./dist/sh.js"
},
"scripts": {
"start": "node --import tsx ./src/sh.ts",
"test": "vitest run",
Expand All @@ -38,52 +58,15 @@
"dev:generate": "rm -rf ./output && yarn start generate --config ./test/config.ts",
"dev:check": "yarn start check --config ./test/config.ts"
},
"files": [
"dist/*",
"src/assets/**",
"src/generators/templates/**",
"README.md"
],
"keywords": [
"povio",
"openapi",
"codegen",
"zod",
"react-query"
],
"homepage": "https://github.com/povio/openapi-codegen-cli",
"bugs": "https://github.com/povio/openapi-codegen-cli/issues",
"repository": {
"url": "git+https://github.com/povio/openapi-codegen-cli.git",
"type": "git"
},
"license": "BSD-3-Clause",
"dependencies": {
"import-fresh": "^3.3.1"
},
"peerDependencies": {
"@casl/ability": "^6.7.3",
"@casl/react": "^5.0.0",
"@tanstack/react-query": "^5.85.9",
"axios": "^1.13.1",
"react": "^19.1.0",
"zod": "^4.1.12"
},
"peerDependenciesMeta": {
"@casl/ability": {
"optional": true
},
"@casl/react": {
"optional": true
}
},
"devDependencies": {
"@apidevtools/swagger-parser": "^10.1.0",
"@casl/ability": "^6.7.3",
"@casl/react": "^5.0.0",
"@tanstack/react-query": "~5.85.9",
"@types/node": "^20.12.12",
"@types/prettier": "^3.0.0",
"@types/prompt-sync": "^4.2.3",
"@types/react": "^19.1.0",
"@types/yargs": "^17.0.32",
Expand All @@ -93,12 +76,10 @@
"chalk": "^5.3.0",
"esbuild": "^0.21.3",
"eslint": "^8.57.0",
"eslint-config-prettier": "^9.1.0",
"eslint-plugin-no-relative-import-paths": "^1.6.1",
"eslint-plugin-prettier": "^5.1.3",
"handlebars": "^4.7.8",
"openapi-types": "^12.1.3",
"prettier": "^3.2.5",
"oxfmt": "^0.26.0",
"prompt-sync": "^4.2.0",
"react": "^19.1.0",
"reflect-metadata": "^0.2.2",
Expand All @@ -111,10 +92,26 @@
"yargs": "^17.7.2",
"zod": "^4.1.12"
},
"peerDependencies": {
"@casl/ability": "^6.7.3",
"@casl/react": "^5.0.0",
"@tanstack/react-query": "^5.85.9",
"axios": "^1.13.1",
"react": "^19.1.0",
"zod": "^4.1.12"
},
"peerDependenciesMeta": {
"@casl/ability": {
"optional": true
},
"@casl/react": {
"optional": true
}
},
"engines": {
"node": ">= 14",
"yarn": ">= 3.2",
"npm": ">= 8"
"npm": ">= 8",
"yarn": ">= 3.2"
},
"packageManager": "yarn@4.2.2"
}
3 changes: 2 additions & 1 deletion src/assets/useMutationEffects.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import { QueryKey, useQueryClient } from "@tanstack/react-query";
import { useCallback } from "react";

import { OpenApiQueryConfig } from "@povio/openapi-codegen-cli";
import { QueryKey, useQueryClient } from "@tanstack/react-query";

import { QueryModule } from "./queryModules";

export interface MutationEffectsOptions {
Expand Down
3 changes: 2 additions & 1 deletion src/commands/check.command.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import yargs from "yargs";
import { logBanner } from "src/helpers/cli.helper";
import { getVersion } from "src/helpers/version.helper";
import { getBuilder, YargOption } from "src/helpers/yargs.helper";
import yargs from "yargs";

import { check, CheckParams } from "./check";

class CheckOptions implements CheckParams {
Expand Down
3 changes: 2 additions & 1 deletion src/commands/check.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
import SwaggerParser from "@apidevtools/swagger-parser";
import { OpenAPIV3 } from "openapi-types";
import { checkOpenAPIDoc } from "src/generators/checkOpenAPIDoc";
import { resolveConfig } from "src/generators/core/resolveConfig";
import { GenerateOptions } from "src/generators/types/options";
import { logInfo, logSuccess } from "src/helpers/cli.helper";
import { loadConfig } from "src/helpers/config.helper";

import SwaggerParser from "@apidevtools/swagger-parser";

export type CheckParams = {
config?: string;
excludeTags?: string;
Expand Down
5 changes: 3 additions & 2 deletions src/commands/generate.command.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { logBanner } from "src/helpers/cli.helper";
import { getVersion } from "src/helpers/version.helper";
import { getBuilder, YargOption } from "src/helpers/yargs.helper";
import yargs from "yargs";

import { generate, GenerateParams } from "./generate";

class GenerateOptions implements GenerateParams {
Expand Down Expand Up @@ -71,8 +72,8 @@ class GenerateOptions implements GenerateParams {
@YargOption({ envAlias: "builderConfigs", type: "boolean" })
builderConfigs?: boolean;

@YargOption({ envAlias: "prettier", default: true, type: "boolean" })
prettier?: boolean;
@YargOption({ envAlias: "format", default: true, type: "boolean" })
format?: boolean;

@YargOption({ envAlias: "verbose", default: false, type: "boolean" })
verbose?: boolean;
Expand Down
24 changes: 13 additions & 11 deletions src/commands/generate.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import SwaggerParser from "@apidevtools/swagger-parser";
import { exec } from "child_process";

import { OpenAPIV3 } from "openapi-types";
import { resolveConfig } from "src/generators/core/resolveConfig";
import { generateCodeFromOpenAPIDoc } from "src/generators/generateCodeFromOpenAPIDoc";
Expand All @@ -8,10 +8,12 @@ import { writeGenerateFileData } from "src/generators/utils/file.utils";
import { logError, logInfo, logSuccess } from "src/helpers/cli.helper";
import { loadConfig } from "src/helpers/config.helper";

import SwaggerParser from "@apidevtools/swagger-parser";

export type GenerateParams = {
config?: string;
excludeTags?: string;
prettier?: boolean;
format?: boolean;
verbose?: boolean;
} & Partial<
Pick<
Expand All @@ -37,7 +39,7 @@ export type GenerateParams = {
>
>;

export async function generate({ prettier, verbose, config: configParam, ...params }: GenerateParams) {
export async function generate({ format, verbose, config: configParam, ...params }: GenerateParams) {
const start = Date.now();

if (verbose) {
Expand All @@ -64,22 +66,22 @@ export async function generate({ prettier, verbose, config: configParam, ...para
logSuccess(`Time: ${Date.now() - start}ms`);
}

if (prettier) {
execPrettier({ output: config.output, verbose });
if (format) {
execOxfmt({ output: config.output, verbose });
}
}

function execPrettier({ output, verbose }: Pick<GenerateParams, "output" | "verbose">) {
function execOxfmt({ output, verbose }: Pick<GenerateParams, "output" | "verbose">) {
if (verbose) {
logInfo("Running Prettier...");
logInfo("Running Oxfmt...");
}
const ignorePathArg = process.env.NODE_ENV === "production" ? "" : "--ignore-path .prettierignore";
exec(`prettier --write ${output} ${ignorePathArg}`, (error) => {

exec(`oxfmt ${output}`, (error) => {
if (verbose) {
if (error) {
logError(error, "Prettier error");
logError(error, "Oxfmt error");
} else {
logSuccess("Prettier finished.");
logSuccess("Oxfmt finished.");
}
}
});
Expand Down
4 changes: 3 additions & 1 deletion src/generator.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import SwaggerParser from "@apidevtools/swagger-parser";
import { OpenAPIV3 } from "openapi-types";

import SwaggerParser from "@apidevtools/swagger-parser";

import { DEFAULT_GENERATE_OPTIONS } from "./generators/const/options.const";
import { getMetadataFromOpenAPIDoc } from "./generators/core/getMetadataFromOpenAPIDoc";
import { generateCodeFromOpenAPIDoc } from "./generators/generateCodeFromOpenAPIDoc";
Expand Down
3 changes: 2 additions & 1 deletion src/generators/checkOpenAPIDoc.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import { OpenAPIV3 } from "openapi-types";
import { chk } from "src/helpers/chalk.helper";
import { log } from "src/helpers/cli.helper";

import { VALIDATION_ERROR_TYPE_TITLE } from "./const/validation.const";
import { getDataFromOpenAPIDoc } from "./core/getDataFromOpenAPIDoc";
import { GenerateType } from "./types/generate";
Expand All @@ -8,7 +10,6 @@ import { ValidationErrorType } from "./types/validation";
import { getOutputFileName } from "./utils/file.utils";
import { getTagFileName } from "./utils/generate/generate.utils";
import { groupByType } from "./utils/validation.utils";
import { log } from "src/helpers/cli.helper";

export function checkOpenAPIDoc(openApiDoc: OpenAPIV3.Document, options: GenerateOptions) {
const { resolver, data } = getDataFromOpenAPIDoc(openApiDoc, options);
Expand Down
1 change: 1 addition & 0 deletions src/generators/const/deps.const.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { GenerateFile, Import } from "src/generators/types/generate";

import { ACL_PACKAGE_IMPORT_PATH, PACKAGE_IMPORT_PATH } from "./package.const";

export const APP_REST_CLIENT_NAME = "AppRestClient";
Expand Down
Loading