From 0d2054982f3cee4a8327786fb84b00e28d64c5f1 Mon Sep 17 00:00:00 2001 From: Sora Morimoto Date: Sun, 21 Dec 2025 23:49:03 +0900 Subject: [PATCH] Replace lodash with es-toolkit Signed-off-by: Sora Morimoto --- package.json | 21 +- src/code-gen-process.ts | 74 +-- .../generate-templates/configuration.ts | 3 +- src/configuration.ts | 35 +- .../base-schema-parsers/complex.ts | 16 +- .../base-schema-parsers/discriminator.ts | 59 +- src/schema-parser/base-schema-parsers/enum.ts | 6 +- .../base-schema-parsers/object.ts | 49 +- src/schema-parser/schema-formatters.ts | 26 +- src/schema-parser/schema-parser.ts | 18 +- src/schema-parser/schema-utils.ts | 45 +- src/schema-routes/schema-routes.ts | 327 +++++------ src/schema-walker.ts | 4 +- src/swagger-schema-resolver.ts | 54 +- src/templates-worker.ts | 13 +- src/type-name-formatter.ts | 13 +- src/util/id.ts | 6 +- src/util/internal-case.ts | 5 - src/util/lodash-compat.ts | 11 + src/util/name-resolver.ts | 6 +- src/util/object-assign.ts | 15 - src/util/pascal-case.ts | 4 +- src/util/random.ts | 6 +- src/util/request.ts | 4 +- tests/__snapshots__/extended.test.ts.snap | 310 +++++----- tests/__snapshots__/simple.test.ts.snap | 176 +++--- tests/utils.ts | 3 +- vitest.config.ts | 2 +- yarn.lock | 546 +++++++++--------- 29 files changed, 899 insertions(+), 958 deletions(-) delete mode 100644 src/util/internal-case.ts create mode 100644 src/util/lodash-compat.ts delete mode 100644 src/util/object-assign.ts diff --git a/package.json b/package.json index d39053d98..b6a8f8055 100644 --- a/package.json +++ b/package.json @@ -13,21 +13,21 @@ "type": "module", "exports": { ".": { - "import": "./dist/index.js", - "require": "./dist/index.cjs" + "require": "./dist/index.cjs", + "import": "./dist/index.mjs" }, "./cli": { - "import": "./dist/cli.js", - "require": "./dist/cli.cjs" + "require": "./dist/cli.cjs", + "import": "./dist/cli.mjs" }, "./package.json": "./package.json" }, "main": "./dist/index.cjs", - "module": "./dist/index.js", + "module": "./dist/index.mjs", "types": "./dist/index.d.cts", "bin": { - "sta": "./dist/cli.js", - "swagger-typescript-api": "./dist/cli.js" + "sta": "./dist/cli.mjs", + "swagger-typescript-api": "./dist/cli.mjs" }, "files": [ "dist", @@ -35,9 +35,6 @@ ], "scripts": { "build": "tsdown", - "cli:help": "node index.js -h", - "cli:json": "node index.js -r -d -p ./swagger-test-cli.json -n swagger-test-cli.ts", - "cli:yaml": "node index.js -r -d -p ./swagger-test-cli.yaml -n swagger-test-cli.ts", "format": "biome format --write .", "format:check": "biome format .", "lint": "biome check", @@ -48,14 +45,12 @@ "dependencies": { "@biomejs/js-api": "4.0.0", "@biomejs/wasm-nodejs": "2.3.10", - "@types/lodash": "^4.17.20", "@types/swagger-schema-official": "^2.0.25", "c12": "^3.3.0", "citty": "^0.1.6", "consola": "^3.4.2", + "es-toolkit": "^1.43.0", "eta": "^3.5.0", - "lodash": "^4.17.21", - "nanoid": "^5.1.6", "openapi-types": "^12.1.3", "swagger-schema-official": "2.0.0-bab6bed", "swagger2openapi": "^7.0.8", diff --git a/src/code-gen-process.ts b/src/code-gen-process.ts index 8c1003110..d82296753 100644 --- a/src/code-gen-process.ts +++ b/src/code-gen-process.ts @@ -1,5 +1,6 @@ import { consola } from "consola"; -import lodash from "lodash"; +import { compact, merge } from "es-toolkit"; +import { camelCase } from "es-toolkit/compat"; import * as typescript from "typescript"; import type { GenerateApiConfiguration, @@ -17,7 +18,7 @@ import { JavascriptTranslator } from "./translators/javascript.js"; import type { TranslatorIO } from "./translators/translator.js"; import { TypeNameFormatter } from "./type-name-formatter.js"; import { FileSystem } from "./util/file-system.js"; -import { internalCase } from "./util/internal-case.js"; +import { createLodashCompat } from "./util/lodash-compat.js"; import { NameResolver } from "./util/name-resolver.js"; import { pascalCase } from "./util/pascal-case.js"; import { sortByProperty } from "./util/sort-by-property.js"; @@ -121,8 +122,12 @@ export class CodeGenProcess { this.schemaComponentsMap.clear(); - lodash.each(swagger.usageSchema.components, (component, componentName) => - lodash.each(component, (rawTypeData, typeName) => { + for (const [componentName, component] of Object.entries( + swagger.usageSchema.components || {}, + )) { + for (const [typeName, rawTypeData] of Object.entries( + component as Record, + )) { this.schemaComponentsMap.createComponent( this.schemaComponentsMap.createRef([ "components", @@ -131,8 +136,8 @@ export class CodeGenProcess { ]), rawTypeData, ); - }), - ); + } + } // Set all discriminators at the top this.schemaComponentsMap.discriminatorsFirst(); @@ -141,10 +146,7 @@ export class CodeGenProcess { const componentsToParse: SchemaComponent[] = this.schemaComponentsMap.filter( - lodash.compact([ - "schemas", - this.config.extractResponses && "responses", - ]), + compact(["schemas", this.config.extractResponses && "responses"]), ); const parsedSchemas = componentsToParse.map((schemaComponent) => { @@ -233,7 +235,7 @@ export class CodeGenProcess { Ts: this.config.Ts, formatDescription: this.schemaParserFabric.schemaFormatters.formatDescription, - internalCase: internalCase, + internalCase: camelCase, classNameCase: pascalCase, pascalCase: pascalCase, getInlineParseContent: this.schemaParserFabric.getInlineParseContent, @@ -252,7 +254,7 @@ export class CodeGenProcess { return ` * ${line}${eol ? "\n" : ""}`; }, NameResolver: NameResolver, - _: lodash, + _: createLodashCompat(), require: this.templatesWorker.requireFnFromTemplate, }, config: this.config, @@ -263,7 +265,7 @@ export class CodeGenProcess { const components = this.schemaComponentsMap.getComponents(); let modelTypes = []; - const modelTypeComponents = lodash.compact([ + const modelTypeComponents = compact([ "schemas", this.config.extractResponses && "responses", ]); @@ -346,7 +348,7 @@ export class CodeGenProcess { ? await this.createMultipleFileInfos(templatesToRender, configuration) : await this.createSingleFileInfo(templatesToRender, configuration); - if (!lodash.isEmpty(configuration.extraTemplates)) { + if (configuration.extraTemplates?.length) { for (const extraTemplate of configuration.extraTemplates) { const content = this.templatesWorker.renderTemplate( this.fileSystem.getFileContent(extraTemplate.path), @@ -483,29 +485,27 @@ export class CodeGenProcess { return await this.createOutputFileInfo( configuration, configuration.fileName, - lodash - .compact([ + compact([ + this.templatesWorker.renderTemplate( + templatesToRender.dataContracts, + configuration, + ), + generateRouteTypes && this.templatesWorker.renderTemplate( - templatesToRender.dataContracts, + templatesToRender.routeTypes, configuration, ), - generateRouteTypes && - this.templatesWorker.renderTemplate( - templatesToRender.routeTypes, - configuration, - ), - generateClient && - this.templatesWorker.renderTemplate( - templatesToRender.httpClient, - configuration, - ), - generateClient && - this.templatesWorker.renderTemplate( - templatesToRender.api, - configuration, - ), - ]) - .join("\n"), + generateClient && + this.templatesWorker.renderTemplate( + templatesToRender.httpClient, + configuration, + ), + generateClient && + this.templatesWorker.renderTemplate( + templatesToRender.api, + configuration, + ), + ]).join("\n"), ); }; @@ -557,14 +557,14 @@ export class CodeGenProcess { servers: servers || [], basePath, host, - externalDocs: lodash.merge( + externalDocs: merge( { url: "", description: "", }, - externalDocs, + externalDocs || {}, ), - tags: lodash.compact(tags), + tags: compact(tags || []), baseUrl: serverUrl, title, version, diff --git a/src/commands/generate-templates/configuration.ts b/src/commands/generate-templates/configuration.ts index 0f9c2ef5c..25320a78c 100644 --- a/src/commands/generate-templates/configuration.ts +++ b/src/commands/generate-templates/configuration.ts @@ -3,7 +3,6 @@ import type { HttpClientType, } from "../../../types/index.js"; import { HTTP_CLIENT, PROJECT_VERSION } from "../../constants.js"; -import { objectAssign } from "../../util/object-assign.js"; export class TemplatesGenConfig { cleanOutput = false; @@ -20,6 +19,6 @@ export class TemplatesGenConfig { } update = (update: Partial) => { - objectAssign(this, update); + Object.assign(this, update); }; } diff --git a/src/configuration.ts b/src/configuration.ts index ea3f48b38..95635c18b 100644 --- a/src/configuration.ts +++ b/src/configuration.ts @@ -1,4 +1,4 @@ -import lodash from "lodash"; +import { compact, merge, uniq } from "es-toolkit"; import type { OpenAPI } from "openapi-types"; import * as typescript from "typescript"; import type { @@ -12,7 +12,6 @@ import * as CONSTANTS from "./constants.js"; import type { MonoSchemaParser } from "./schema-parser/mono-schema-parser.js"; import type { SchemaParser } from "./schema-parser/schema-parser.js"; import type { Translator } from "./translators/translator.js"; -import { objectAssign } from "./util/object-assign.js"; const TsKeyword = { Number: "number", @@ -252,7 +251,7 @@ export class CodeGenConfig { * $A1 | $A2 */ UnionType: (contents: unknown[]) => - lodash.join(lodash.uniq(contents), ` ${this.Ts.Keyword.Union} `), + uniq(contents).join(` ${this.Ts.Keyword.Union} `), /** * ($A1) */ @@ -261,7 +260,7 @@ export class CodeGenConfig { * $A1 & $A2 */ IntersectionType: (contents: unknown[]) => - lodash.join(lodash.uniq(contents), ` ${this.Ts.Keyword.Intersection} `), + uniq(contents).join(` ${this.Ts.Keyword.Intersection} `), /** * Record<$A1, $A2> */ @@ -271,9 +270,13 @@ export class CodeGenConfig { * readonly $key?:$value */ TypeField: ({ readonly, key, optional, value }: Record) => - lodash - .compact([readonly && "readonly ", key, optional && "?", ": ", value]) - .join(""), + compact([ + readonly && "readonly ", + key, + optional && "?", + ": ", + value, + ]).join(""), /** * [key: $A1]: $A2 */ @@ -307,14 +310,12 @@ export class CodeGenConfig { * $AN.key = $AN.value, */ EnumFieldsWrapper: (contents: Record[]) => - lodash - .map(contents, ({ key, value, description }) => { - return [ + contents + .map(({ key, value, description }) => { + return compact([ this.Ts.EnumFieldDescription(description), ` ${this.Ts.EnumField(key, value)}`, - ] - .filter(Boolean) - .join("\n"); + ]).join("\n"); }) .join(",\n"), /** @@ -415,14 +416,14 @@ export class CodeGenConfig { hooks, ...otherConfig }: Partial) { - objectAssign(this.Ts, codeGenConstructs); - objectAssign(this.primitiveTypes, primitiveTypeConstructs); + Object.assign(this.Ts, codeGenConstructs); + Object.assign(this.primitiveTypes, primitiveTypeConstructs); this.defaultResponseType = this.Ts.Keyword.Void; this.update({ ...otherConfig, - hooks: lodash.merge(this.hooks, hooks || {}), + hooks: merge(this.hooks, hooks || {}), constants: { ...CONSTANTS, ...constants, @@ -440,7 +441,7 @@ export class CodeGenConfig { } update = (update: Partial) => { - objectAssign(this, update); + Object.assign(this, update); if (this.enumNamesAsValues) { this.extractEnums = true; } diff --git a/src/schema-parser/base-schema-parsers/complex.ts b/src/schema-parser/base-schema-parsers/complex.ts index 67bce3639..fb0facc20 100644 --- a/src/schema-parser/base-schema-parsers/complex.ts +++ b/src/schema-parser/base-schema-parsers/complex.ts @@ -1,13 +1,13 @@ -import lodash from "lodash"; +import { compact, omit } from "es-toolkit"; import { SCHEMA_TYPES } from "../../constants.js"; import { MonoSchemaParser } from "../mono-schema-parser.js"; export class ComplexSchemaParser extends MonoSchemaParser { override parse() { const complexType = this.schemaUtils.getComplexType(this.schema); - const simpleSchema = lodash.omit( - lodash.clone(this.schema), - lodash.keys(this.schemaParser._complexSchemaParsers), + const simpleSchema = omit( + this.schema, + Object.keys(this.schemaParser._complexSchemaParsers), ); const complexSchemaContent = this.schemaParser._complexSchemaParsers[ complexType @@ -23,14 +23,16 @@ export class ComplexSchemaParser extends MonoSchemaParser { name: this.typeName, description: this.schemaFormatters.formatDescription( this.schema.description || - lodash.compact( - lodash.map(this.schema[complexType], "description"), + compact( + (this.schema[complexType] || []).map( + (item: any) => item?.description, + ), )[0] || "", ), content: this.config.Ts.IntersectionType( - lodash.compact([ + compact([ this.config.Ts.ExpressionGroup(complexSchemaContent), this.schemaUtils.getInternalSchemaType(simpleSchema) === SCHEMA_TYPES.OBJECT && diff --git a/src/schema-parser/base-schema-parsers/discriminator.ts b/src/schema-parser/base-schema-parsers/discriminator.ts index c79e5b498..8b011b18f 100644 --- a/src/schema-parser/base-schema-parsers/discriminator.ts +++ b/src/schema-parser/base-schema-parsers/discriminator.ts @@ -1,4 +1,5 @@ -import lodash from "lodash"; +import { compact, omit } from "es-toolkit"; +import { get } from "es-toolkit/compat"; import { SCHEMA_TYPES } from "../../constants.js"; import { MonoSchemaParser } from "../mono-schema-parser.js"; @@ -29,10 +30,10 @@ export class DiscriminatorSchemaParser extends MonoSchemaParser { }); const schemaContent = ts.IntersectionType( - [ + compact([ abstractSchemaStruct?.content, discriminatorSchemaStruct?.content, - ].filter(Boolean), + ]), ); return { @@ -59,11 +60,11 @@ export class DiscriminatorSchemaParser extends MonoSchemaParser { this.typeName, ]); const { discriminator } = this.schema; - const mappingEntries = lodash.entries(discriminator.mapping); + const mappingEntries = Object.entries(discriminator.mapping || {}); const ableToCreateMappingType = !skipMappingType && !!(abstractSchemaStruct?.typeName && mappingEntries.length); - const mappingContents = []; + const mappingContents: string[] = []; let mappingTypeName; /** { mapping_key: SchemaEnum.MappingKey, ... } */ @@ -166,8 +167,8 @@ export class DiscriminatorSchemaParser extends MonoSchemaParser { }) => { const ts = this.config.Ts; - let mappingPropertySchemaEnumKeysMap = {}; - let mappingPropertySchema = lodash.get( + const mappingPropertySchemaEnumKeysMap = {}; + let mappingPropertySchema = get( abstractSchemaStruct?.component?.rawTypeData, ["properties", discPropertyName], ); @@ -179,24 +180,26 @@ export class DiscriminatorSchemaParser extends MonoSchemaParser { const parsedEnum = mappingPropertySchema?.rawTypeData?.$parsed; if (parsedEnum?.type === SCHEMA_TYPES.ENUM) { - mappingPropertySchemaEnumKeysMap = lodash.reduce( - parsedEnum.enum, - (acc, key, index) => { - const enumContent = parsedEnum.content?.[index]; - if (this.config.generateUnionEnums) { - const literalValue = - enumContent?.value ?? - (key !== undefined ? ts.StringValue(key) : undefined); - if (literalValue !== undefined) { - acc[key] = literalValue; - } - } else if (parsedEnum.typeName && enumContent?.key) { - acc[key] = ts.EnumUsageKey(parsedEnum.typeName, enumContent.key); + const enumEntries = (parsedEnum.enum || []).map((key, index) => [ + key, + index, + ]); + for (const [key, index] of enumEntries) { + const enumContent = parsedEnum.content?.[index]; + if (this.config.generateUnionEnums) { + const literalValue = + enumContent?.value ?? + (key !== undefined ? ts.StringValue(key) : undefined); + if (literalValue !== undefined) { + mappingPropertySchemaEnumKeysMap[key] = literalValue; } - return acc; - }, - {}, - ); + } else if (parsedEnum.typeName && enumContent?.key) { + mappingPropertySchemaEnumKeysMap[key] = ts.EnumUsageKey( + parsedEnum.typeName, + enumContent.key, + ); + } + } } return mappingPropertySchemaEnumKeysMap; @@ -209,7 +212,7 @@ export class DiscriminatorSchemaParser extends MonoSchemaParser { refPath, mappingPropertySchemaEnumKeysMap, }) => { - const complexSchemaKeys = lodash.keys( + const complexSchemaKeys = Object.keys( this.schemaParser._complexSchemaParsers, ); // override parent dependencies @@ -262,17 +265,17 @@ export class DiscriminatorSchemaParser extends MonoSchemaParser { createAbstractSchemaStruct = () => { const { discriminator, ...noDiscriminatorSchema } = this.schema; - const complexSchemaKeys = lodash.keys( + const complexSchemaKeys = Object.keys( this.schemaParser._complexSchemaParsers, ); - const schema = lodash.omit( + const schema = omit( structuredClone(noDiscriminatorSchema), complexSchemaKeys, ); const schemaIsAny = this.schemaParserFabric.getInlineParseContent(structuredClone(schema)) === this.config.Ts.Keyword.Any; - const schemaIsEmpty = !lodash.keys(schema).length; + const schemaIsEmpty = !Object.keys(schema).length; if (schemaIsEmpty || schemaIsAny) return null; diff --git a/src/schema-parser/base-schema-parsers/enum.ts b/src/schema-parser/base-schema-parsers/enum.ts index 3bf23ff3b..c6e1021fd 100644 --- a/src/schema-parser/base-schema-parsers/enum.ts +++ b/src/schema-parser/base-schema-parsers/enum.ts @@ -1,4 +1,4 @@ -import lodash from "lodash"; +import { get } from "es-toolkit/compat"; import { SCHEMA_TYPES } from "../../constants.js"; import { MonoSchemaParser } from "../mono-schema-parser.js"; import { EnumKeyResolver } from "../util/enum-key-resolver.js"; @@ -102,9 +102,9 @@ export class EnumSchemaParser extends MonoSchemaParser { } }; - if (Array.isArray(enumNames) && lodash.size(enumNames)) { + if (Array.isArray(enumNames) && enumNames.length > 0) { content = enumNames.map((enumName, index) => { - const enumValue = lodash.get(this.schema.enum, index); + const enumValue = get(this.schema.enum, index); const formattedKey = this.formatEnumKey({ key: enumName, value: enumValue, diff --git a/src/schema-parser/base-schema-parsers/object.ts b/src/schema-parser/base-schema-parsers/object.ts index 6731c1e4f..7ddf432f1 100644 --- a/src/schema-parser/base-schema-parsers/object.ts +++ b/src/schema-parser/base-schema-parsers/object.ts @@ -1,4 +1,5 @@ -import lodash from "lodash"; +import { compact } from "es-toolkit"; +import { get } from "es-toolkit/compat"; import { SCHEMA_TYPES } from "../../constants.js"; import { MonoSchemaParser } from "../mono-schema-parser.js"; @@ -25,18 +26,22 @@ export class ObjectSchemaParser extends MonoSchemaParser { getObjectSchemaContent = (schema) => { const { properties, additionalProperties } = schema || {}; - const propertiesContent = lodash.map(properties, (property, name) => { + const propertiesContent: any[] = []; + + for (const [name, property] of Object.entries(properties || {})) { const required = this.schemaUtils.isPropertyRequired( name, - property, + property as Record, schema, ); - const rawTypeData = lodash.get( + const rawTypeData = get( this.schemaUtils.getSchemaRefType(property), "rawTypeData", {}, ); - const nullable = !!(rawTypeData.nullable || property.nullable); + const nullable = !!( + rawTypeData.nullable || (property as Record).nullable + ); const fieldName = this.typeNameFormatter.isValidName(name) ? name : this.config.Ts.StringValue(name); @@ -46,25 +51,27 @@ export class ObjectSchemaParser extends MonoSchemaParser { schemaPath: [...this.schemaPath, name], }) .getInlineParseContent(); - const readOnly = property.readOnly; + const readOnly = (property as Record).readOnly; - return { - ...property, + const complexType = this.schemaUtils.getComplexType(property); + const rawDataComplexType = this.schemaUtils.getComplexType(rawTypeData); + + propertiesContent.push({ + ...(property as object), $$raw: property, - title: property.title, + title: (property as Record).title, description: - property.description || - lodash.compact( - lodash.map( - property[this.schemaUtils.getComplexType(property)], - "description", - ), + (property as Record).description || + compact( + ( + ((property as Record)[complexType] as any[]) || + [] + ).map((item: any) => item?.description), )[0] || rawTypeData.description || - lodash.compact( - lodash.map( - rawTypeData[this.schemaUtils.getComplexType(rawTypeData)], - "description", + compact( + ((rawTypeData[rawDataComplexType] as any[]) || []).map( + (item: any) => item?.description, ), )[0] || "", @@ -78,8 +85,8 @@ export class ObjectSchemaParser extends MonoSchemaParser { key: fieldName, value: fieldValue, }), - }; - }); + }); + } if (additionalProperties) { const propertyNamesSchema = diff --git a/src/schema-parser/schema-formatters.ts b/src/schema-parser/schema-formatters.ts index ccd57d7de..e655e1468 100644 --- a/src/schema-parser/schema-formatters.ts +++ b/src/schema-parser/schema-formatters.ts @@ -1,4 +1,5 @@ -import lodash from "lodash"; +import { compact } from "es-toolkit"; +import { get } from "es-toolkit/compat"; import type { CodeGenConfig } from "../configuration.js"; import { SCHEMA_TYPES } from "../constants.js"; import type { TemplatesWorker } from "../templates-worker.js"; @@ -58,7 +59,7 @@ export class SchemaFormatters { content: parsedSchema.$ref ? parsedSchema.typeName : this.config.Ts.UnionType( - lodash.compact([ + compact([ ...parsedSchema.content.map(({ value }) => `${value}`), parsedSchema.nullable && this.config.Ts.Keyword.Null, ]), @@ -96,13 +97,13 @@ export class SchemaFormatters { formatType: "base" | "inline" = "base", ) => { const schemaType = - lodash.get(parsedSchema, ["schemaType"]) || - lodash.get(parsedSchema, ["$parsed", "schemaType"]); - const formatterFn = lodash.get(this, [formatType, schemaType]); + get(parsedSchema, ["schemaType"]) || + get(parsedSchema, ["$parsed", "schemaType"]); + const formatterFn = get(this, [formatType, schemaType]); return formatterFn?.(parsedSchema) || parsedSchema; }; - formatDescription = (description, inline) => { + formatDescription = (description: string | undefined, inline?: boolean) => { if (!description) return ""; const hasMultipleLines = description.includes("\n"); @@ -110,15 +111,8 @@ export class SchemaFormatters { if (!hasMultipleLines) return description; if (inline) { - return ( - lodash - // @ts-expect-error TS(2339) FIXME: Property '_' does not exist on type 'LoDashStatic'... Remove this comment to see the full error message - ._(description) - .split(/\n/g) - .map((part) => part.trim()) - .compact() - .join(" ") - .valueOf() + return compact(description.split(/\n/g).map((part) => part.trim())).join( + " ", ); } @@ -126,7 +120,7 @@ export class SchemaFormatters { }; formatObjectContent = (content) => { - const fields = []; + const fields: string[] = []; for (const part of content) { const extraSpace = " "; diff --git a/src/schema-parser/schema-parser.ts b/src/schema-parser/schema-parser.ts index fc8e45878..0b902551c 100644 --- a/src/schema-parser/schema-parser.ts +++ b/src/schema-parser/schema-parser.ts @@ -1,5 +1,6 @@ import { consola } from "consola"; -import lodash from "lodash"; +import { merge } from "es-toolkit"; +import { get } from "es-toolkit/compat"; import type { CodeGenConfig } from "../configuration.js"; import { SCHEMA_TYPES } from "../constants.js"; import type { SchemaComponentsMap } from "../schema-components-map.js"; @@ -221,13 +222,13 @@ export class SchemaParser { this.schemaPath.push(this.typeName); - lodash.merge( + merge( this.schema, this.config.hooks.onPreParseSchema( this.schema, this.typeName, schemaType, - ), + ) || {}, ); parsedSchema = this._baseSchemaParsers[schemaType]( this.schema, @@ -273,14 +274,19 @@ export class SchemaParser { extractSchemaFromResponseStruct = (responseStruct) => { const { content, ...extras } = responseStruct; - const firstResponse = lodash.first(lodash.values(content)); - const firstSchema = lodash.get(firstResponse, "schema"); + const contentValues = Object.values(content || {}); + const firstResponse = contentValues[0] as + | Record + | undefined; + const firstSchema = get(firstResponse, "schema"); if (!firstSchema) return; + const { schema: _, ...restResponse } = firstResponse || {}; + return { ...extras, - ...lodash.omit(firstResponse, "schema"), + ...restResponse, ...firstSchema, }; }; diff --git a/src/schema-parser/schema-utils.ts b/src/schema-parser/schema-utils.ts index bf7614e33..d9fa199cf 100644 --- a/src/schema-parser/schema-utils.ts +++ b/src/schema-parser/schema-utils.ts @@ -1,10 +1,10 @@ -import lodash from "lodash"; +import { compact, uniq } from "es-toolkit"; +import { camelCase, get } from "es-toolkit/compat"; import type { CodeGenConfig } from "../configuration.js"; import { SCHEMA_TYPES } from "../constants.js"; import type { SchemaComponentsMap } from "../schema-components-map.js"; import type { SchemaWalker } from "../schema-walker.js"; import type { TypeNameFormatter } from "../type-name-formatter.js"; -import { internalCase } from "../util/internal-case.js"; import { pascalCase } from "../util/pascal-case.js"; export class SchemaUtils { @@ -26,7 +26,7 @@ export class SchemaUtils { } getRequiredProperties = (schema) => { - return lodash.uniq( + return uniq( (schema && Array.isArray(schema.required) && schema.required) || [], ); }; @@ -87,7 +87,7 @@ export class SchemaUtils { const { nullable, type: schemaType } = schema || {}; return ( (nullable || - !!lodash.get(schema, "x-nullable") || + !!get(schema, "x-nullable") || schemaType === this.config.Ts.Keyword.Null) && typeof type === "string" && !type.includes(` ${this.config.Ts.Keyword.Null}`) && @@ -106,15 +106,15 @@ export class SchemaUtils { const schema = rawSchema || {}; if (schema.type) { - return internalCase(schema.type); + return camelCase(schema.type); } if (schema.enum) { const enumFieldType = typeof schema.enum[0]; if (enumFieldType === this.config.Ts.Keyword.Undefined) return; - return internalCase(enumFieldType); + return camelCase(enumFieldType); } - if (lodash.keys(schema.properties).length) { + if (Object.keys(schema.properties || {}).length) { return SCHEMA_TYPES.OBJECT; } if (schema.items) { @@ -148,7 +148,7 @@ export class SchemaUtils { makeAddRequiredToChildSchema = (parentSchema, childSchema) => { if (!childSchema) return childSchema; - const required = lodash.uniq([ + const required = uniq([ ...this.getRequiredProperties(parentSchema), ...this.getRequiredProperties(childSchema), ]); @@ -156,7 +156,7 @@ export class SchemaUtils { const refData = this.getSchemaRefType(childSchema); if (refData) { - const refObjectProperties = lodash.keys( + const refObjectProperties = Object.keys( refData.rawTypeData?.properties || {}, ); const existedRequiredKeys = refObjectProperties.filter((key) => @@ -172,7 +172,7 @@ export class SchemaUtils { } if (childSchema.properties) { - const childSchemaProperties = lodash.keys(childSchema.properties); + const childSchemaProperties = Object.keys(childSchema.properties); const existedRequiredKeys = childSchemaProperties.filter((key) => required.includes(key), ); @@ -180,7 +180,7 @@ export class SchemaUtils { if (!existedRequiredKeys.length) return childSchema; return { - required: lodash.uniq([ + required: uniq([ ...this.getRequiredProperties(childSchema), ...existedRequiredKeys, ]), @@ -192,7 +192,7 @@ export class SchemaUtils { }; filterSchemaContents = (contents, filterFn) => { - return lodash.uniq(contents.filter((type) => filterFn(type))); + return uniq(contents.filter((type) => filterFn(type))); }; resolveTypeName = ( @@ -230,8 +230,8 @@ export class SchemaUtils { getInternalSchemaType = (schema) => { if ( - !lodash.isEmpty(schema.enum) || - !lodash.isEmpty(this.getEnumNames(schema)) + (schema.enum && schema.enum.length > 0) || + (this.getEnumNames(schema) && this.getEnumNames(schema).length > 0) ) { return SCHEMA_TYPES.ENUM; } @@ -241,7 +241,7 @@ export class SchemaUtils { if (schema.allOf || schema.oneOf || schema.anyOf || schema.not) { return SCHEMA_TYPES.COMPLEX; } - if (!lodash.isEmpty(schema.properties)) { + if (schema.properties && Object.keys(schema.properties).length > 0) { return SCHEMA_TYPES.OBJECT; } if (schema.type === SCHEMA_TYPES.ARRAY) { @@ -278,11 +278,8 @@ export class SchemaUtils { } const typeAlias = - lodash.get(this.config.primitiveTypes, [ - primitiveType, - schema.format, - ]) || - lodash.get(this.config.primitiveTypes, [primitiveType, "$default"]) || + get(this.config.primitiveTypes, [primitiveType, schema.format]) || + get(this.config.primitiveTypes, [primitiveType, "$default"]) || this.config.primitiveTypes[primitiveType]; if (typeof typeAlias === "function") { @@ -303,16 +300,12 @@ export class SchemaUtils { }; buildTypeNameFromPath = (schemaPath) => { - schemaPath = lodash.uniq(lodash.compact(schemaPath)); + schemaPath = uniq(compact(schemaPath || [])); if (!schemaPath || !schemaPath[0]) return null; return pascalCase( - lodash.camelCase( - lodash - .uniq([schemaPath[0], schemaPath[schemaPath.length - 1]]) - .join("_"), - ), + uniq([schemaPath[0], schemaPath[schemaPath.length - 1]]).join("_"), ); }; diff --git a/src/schema-routes/schema-routes.ts b/src/schema-routes/schema-routes.ts index 0d64813f7..e0bd205dc 100644 --- a/src/schema-routes/schema-routes.ts +++ b/src/schema-routes/schema-routes.ts @@ -1,5 +1,6 @@ import { consola } from "consola"; -import lodash from "lodash"; +import { compact, flattenDeep, isEqual, uniq } from "es-toolkit"; +import { camelCase, get } from "es-toolkit/compat"; import type { GenerateApiConfiguration, ParsedRoute, @@ -59,36 +60,31 @@ export class SchemaRoutes { this.schemaComponentsMap = schemaComponentsMap; this.templatesWorker = templatesWorker; - this.FORM_DATA_TYPES = lodash.uniq([ + this.FORM_DATA_TYPES = uniq([ this.schemaUtils.getSchemaType({ type: "string", format: "file" }), this.schemaUtils.getSchemaType({ type: "string", format: "binary" }), ]); } createRequestsMap = (routesByMethod) => { - const parameters = lodash.get(routesByMethod, "parameters"); - - return lodash.reduce( - routesByMethod, - (acc, requestInfo, method) => { - if ( - method.startsWith("x-") || - ["parameters", "$ref"].includes(method) - ) { - return acc; - } + const parameters = get(routesByMethod, "parameters"); - acc[method] = { - ...requestInfo, - parameters: lodash.compact( - lodash.concat(parameters, requestInfo.parameters), - ), - }; + const result = {}; + for (const [method, requestInfo] of Object.entries(routesByMethod)) { + if (method.startsWith("x-") || ["parameters", "$ref"].includes(method)) { + continue; + } - return acc; - }, - {}, - ); + result[method] = { + ...(requestInfo as object), + parameters: compact([ + ...(parameters || []), + ...((requestInfo as any).parameters || []), + ]), + }; + } + + return result; }; parseRouteName = (rawRoute) => { @@ -101,33 +97,28 @@ export class SchemaRoutes { ); // used in case when path parameters is not declared in requestInfo.parameters ("in": "path") - const pathParams = lodash.reduce( - pathParamMatches, - (pathParams, match) => { - const paramName = match.replace(/\{|\}|:/g, ""); + const pathParams: any[] = []; + for (const match of pathParamMatches || []) { + const paramName = match.replace(/\{|\}|:/g, ""); - if (!paramName) return pathParams; + if (!paramName) continue; - if (paramName.includes("-")) { - consola.warn("wrong path param name", paramName); - } + if (paramName.includes("-")) { + consola.warn("wrong path param name", paramName); + } - pathParams.push({ - $match: match, - name: lodash.camelCase(paramName), - required: true, + pathParams.push({ + $match: match, + name: camelCase(paramName), + required: true, + type: "string", + description: "", + schema: { type: "string", - description: "", - schema: { - type: "string", - }, - in: "path", - }); - - return pathParams; - }, - [], - ); + }, + in: "path", + }); + } let fixedRoute = pathParams.reduce((fixedRoute, pathParam, i, arr) => { const insertion = @@ -141,14 +132,14 @@ export class SchemaRoutes { }, routeName || ""); const queryParamMatches = fixedRoute.match(/(\{\?.*\})/g); - const queryParams = []; + const queryParams: any[] = []; if (queryParamMatches?.length) { for (const match of queryParamMatches) { fixedRoute = fixedRoute.replace(match, ""); } - const paramNames = lodash.uniq( + const paramNames = uniq( queryParamMatches .join(",") .replace(/(\{\?)|(\})|\s/g, "") @@ -164,8 +155,8 @@ export class SchemaRoutes { $match: paramName, name: typeof paramName === "string" - ? lodash.camelCase(paramName) - : lodash.camelCase(String(paramName)), + ? camelCase(paramName) + : camelCase(String(paramName)), required: true, type: "string", description: "", @@ -203,7 +194,7 @@ export class SchemaRoutes { cookie: [], }; - lodash.each(parameters, (parameter) => { + for (const parameter of parameters || []) { const refTypeInfo = this.schemaParserFabric.schemaUtils.getSchemaRefType(parameter); @@ -223,7 +214,7 @@ export class SchemaRoutes { routeParam.required = parameter.required; } } else { - if (!parameter.in) return; + if (!parameter.in) continue; if (!routeParams[parameter.in]) { routeParams[parameter.in] = []; @@ -236,13 +227,13 @@ export class SchemaRoutes { } if (routeParam.in === "path") { - if (!routeParam.name) return; + if (!routeParam.name) continue; - routeParam.name = lodash.camelCase(routeParam.name); + routeParam.name = camelCase(routeParam.name); } routeParams[routeParam.in].push(routeParam); - }); + } // used in case when path parameters is not declared in requestInfo.parameters ("in": "path") for (const pathParam of pathParamsFromRouteName) { @@ -269,19 +260,22 @@ export class SchemaRoutes { return routeParams; }; - getContentTypes = (requestInfo, extraContentTypes) => - lodash.uniq( - lodash.compact([ + getContentTypes = (requestInfo, extraContentTypes) => { + const requestInfoArray = Array.isArray(requestInfo) + ? requestInfo + : Object.values(requestInfo || {}); + return uniq( + compact([ ...(extraContentTypes || []), - ...lodash.flatten( - lodash.map( - requestInfo, + ...flattenDeep( + requestInfoArray.map( (requestInfoData) => - requestInfoData && lodash.keys(requestInfoData.content), + requestInfoData && Object.keys(requestInfoData?.content || {}), ), ), ]), ); + }; getContentKind = (contentTypes) => { if (contentTypes.includes("application/vnd.api+json")) { @@ -323,7 +317,7 @@ export class SchemaRoutes { status === "2xx"; getSchemaFromRequestType = (requestInfo) => { - const content = lodash.get(requestInfo, "content"); + const content = get(requestInfo, "content"); if (!content) return null; @@ -365,7 +359,7 @@ export class SchemaRoutes { this.typeNameFormatter.format(parsedSchema.name) === content, ); const foundSchemaByContent = parsedSchemas.find((parsedSchema) => - lodash.isEqual(parsedSchema.content, content), + isEqual(parsedSchema.content, content), ); const foundSchema = foundedSchemaByName || foundSchemaByContent; @@ -412,40 +406,35 @@ export class SchemaRoutes { parsedSchemas, operationId, defaultType, - }) => - lodash.reduce( - requestInfos, - (acc, requestInfo, status) => { - const contentTypes = this.getContentTypes([requestInfo], operationId); - - return [ - ...acc, - { - ...(requestInfo || {}), - contentTypes: contentTypes, - contentKind: this.getContentKind(contentTypes), - type: this.schemaParserFabric.schemaUtils.safeAddNullToType( - requestInfo, - // @ts-expect-error TS(2345) FIXME: Argument of type '{ requestInfo: any; parsedSchema... Remove this comment to see the full error message - this.getTypeFromRequestInfo({ - requestInfo, - parsedSchemas, - operationId, - defaultType, - }), - ), - description: - this.schemaParserFabric.schemaFormatters.formatDescription( - requestInfo.description || "", - true, - ), - status: Number.isNaN(+status) ? status : +status, - isSuccess: this.isSuccessStatus(status), - }, - ]; - }, - [], - ); + }) => { + const result: any[] = []; + for (const [status, requestInfo] of Object.entries(requestInfos || {})) { + const contentTypes = this.getContentTypes([requestInfo], operationId); + + result.push({ + ...((requestInfo as object) || {}), + contentTypes: contentTypes, + contentKind: this.getContentKind(contentTypes), + type: this.schemaParserFabric.schemaUtils.safeAddNullToType( + requestInfo, + // @ts-expect-error TS(2345) FIXME: Argument of type '{ requestInfo: any; parsedSchema... Remove this comment to see the full error message + this.getTypeFromRequestInfo({ + requestInfo, + parsedSchemas, + operationId, + defaultType, + }), + ), + description: this.schemaParserFabric.schemaFormatters.formatDescription( + (requestInfo as any).description || "", + true, + ), + status: Number.isNaN(+status) ? status : +status, + isSuccess: this.isSuccessStatus(status), + }); + } + return result; + }; getResponseBodyInfo = (routeInfo, parsedSchemas) => { const { produces, operationId, responses } = routeInfo; @@ -659,20 +648,16 @@ export class SchemaRoutes { return acc; }, {}); - const fixedQueryParams = lodash.reduce( - lodash.get(queryObjectSchema, "properties", {}), - (acc, property, name) => { - if (name && typeof property === "object") { - acc[name] = { - ...property, - in: "query", - }; - } - - return acc; - }, - {}, - ); + const fixedQueryParams = {}; + const queryObjectProperties = get(queryObjectSchema, "properties") || {}; + for (const [name, property] of Object.entries(queryObjectProperties)) { + if (name && typeof property === "object") { + fixedQueryParams[name] = { + ...property, + in: "query", + }; + } + } const schema = { ...queryObjectSchema, @@ -744,7 +729,7 @@ export class SchemaRoutes { }); if (idx > -1) { - lodash.assign(responseBodyInfo.responses[idx], { + Object.assign(responseBodyInfo.responses[idx], { ...successResponse.schema, type: successResponse.type, }); @@ -764,30 +749,26 @@ export class SchemaRoutes { resolver: this.config.extractingOptions.responseErrorNameResolver, }); - const errorSchemas = responseBodyInfo.error.schemas - .map(this.getSchemaFromRequestType) - .filter(Boolean); + const errorSchemas = compact( + responseBodyInfo.error.schemas.map(this.getSchemaFromRequestType), + ); if (!errorSchemas.length) return; const schema = this.schemaParserFabric.parseSchema( { oneOf: errorSchemas, - title: errorSchemas - .map((schema) => schema.title) - .filter(Boolean) - .join(" "), - description: errorSchemas - .map((schema) => schema.description) - .filter(Boolean) - .join("\n"), + title: compact(errorSchemas.map((schema) => schema.title)).join(" "), + description: compact( + errorSchemas.map((schema) => schema.description), + ).join("\n"), }, null, [routeInfo.operationId], ); const component = this.schemaComponentsMap.createComponent( this.schemaComponentsMap.createRef(["components", "schemas", typeName]), - { ...schema }, + schema, ); responseBodyInfo.error.schemas = [component]; if (component.typeData) { @@ -883,9 +864,9 @@ export class SchemaRoutes { const firstTag = tags && tags.length > 0 ? tags[0] : null; const moduleName = moduleNameFirstTag && firstTag - ? lodash.camelCase(firstTag) + ? camelCase(firstTag) : // @ts-expect-error TS(2345) FIXME: Argument of type 'unknown' is not assignable to pa... Remove this comment to see the full error message - lodash.camelCase(lodash.compact(route.split("/"))[moduleNameIndex]); + camelCase(compact(route.split("/"))[moduleNameIndex] || ""); let hasSecurity = !!globalSecurity?.length; if (security) { hasSecurity = security.length > 0; @@ -1094,7 +1075,7 @@ export class SchemaRoutes { attachSchema = ({ usageSchema, parsedSchemas }) => { this.config.routeNameDuplicatesMap.clear(); - const pathsEntries = lodash.entries(usageSchema.paths); + const pathsEntries = Object.entries(usageSchema.paths || {}); for (const [rawRouteName, routeInfoByMethodsMap] of pathsEntries) { const routeInfosMap = this.createRequestsMap(routeInfoByMethodsMap); @@ -1146,57 +1127,57 @@ export class SchemaRoutes { { $outOfModule: [] as ParsedRoute[] }, ); - const routeGroups = lodash.reduce( - groupedRoutes, - (acc, routesGroup, moduleName) => { - if (moduleName === "$outOfModule") { - acc.outOfModule = routesGroup; - } else { - if (!acc.combined) { - acc.combined = []; - } - acc.combined.push({ - moduleName, - routes: routesGroup.map((route) => { - const { original: originalName, usage: usageName } = - route.routeName; - - // TODO: https://github.com/acacode/swagger-typescript-api/issues/152 - // TODO: refactor - if ( - routesGroup.length > 1 && - usageName !== originalName && - !routesGroup.some( - ({ routeName, id }) => - id !== route.id && originalName === routeName.original, - ) - ) { - return { - ...route, - routeName: { - ...route.routeName, - usage: originalName, - }, - }; - } - - return route; - }), - }); + const routeGroups: GenerateApiConfiguration["routes"] = { + outOfModule: undefined, + combined: undefined, + }; + + for (const [moduleName, routesGroup] of Object.entries(groupedRoutes)) { + if (moduleName === "$outOfModule") { + routeGroups.outOfModule = routesGroup; + } else { + if (!routeGroups.combined) { + routeGroups.combined = []; } - return acc; - }, - {} as GenerateApiConfiguration["routes"], - ); + routeGroups.combined.push({ + moduleName, + routes: routesGroup.map((route) => { + const { original: originalName, usage: usageName } = + route.routeName; + + // TODO: https://github.com/acacode/swagger-typescript-api/issues/152 + // TODO: refactor + if ( + routesGroup.length > 1 && + usageName !== originalName && + !routesGroup.some( + ({ routeName, id }) => + id !== route.id && originalName === routeName.original, + ) + ) { + return { + ...route, + routeName: { + ...route.routeName, + usage: originalName, + }, + }; + } + + return route; + }), + }); + } + } if (this.config.sortRoutes) { if (routeGroups.outOfModule) { routeGroups.outOfModule = this.sortRoutes(routeGroups.outOfModule); } if (routeGroups.combined) { - lodash.each(routeGroups.combined, (routeGroup) => { + for (const routeGroup of routeGroups.combined) { routeGroup.routes = this.sortRoutes(routeGroup.routes); - }); + } } } @@ -1204,8 +1185,8 @@ export class SchemaRoutes { }; sortRoutes = (routes: ParsedRoute[]) => { - return lodash - .slice(routes) + return routes + .slice() .sort((routeA, routeB) => routeA.routeName.usage.localeCompare(routeB.routeName.usage), ); diff --git a/src/schema-walker.ts b/src/schema-walker.ts index 9c8248415..bef3dd626 100644 --- a/src/schema-walker.ts +++ b/src/schema-walker.ts @@ -1,4 +1,4 @@ -import lodash from "lodash"; +import { get } from "es-toolkit/compat"; import type { OpenAPI } from "openapi-types"; import type { CodeGenConfig } from "./configuration.js"; import type { SwaggerSchemaResolver } from "./swagger-schema-resolver.js"; @@ -33,7 +33,7 @@ export class SchemaWalker { _getRefDataFromSchema = (schema: Record, ref: string) => { const path = ref.replace("#", "").split("/"); - const refData = lodash.get(schema, path); + const refData = get(schema, path); if (refData) { this.caches.set(ref, refData); } diff --git a/src/swagger-schema-resolver.ts b/src/swagger-schema-resolver.ts index 20a1efe17..5b26bf258 100644 --- a/src/swagger-schema-resolver.ts +++ b/src/swagger-schema-resolver.ts @@ -1,5 +1,6 @@ import { consola } from "consola"; -import lodash from "lodash"; +import { compact, merge, uniq } from "es-toolkit"; +import { get } from "es-toolkit/compat"; import type { OpenAPI, OpenAPIV2 } from "openapi-types"; import * as swagger2openapi from "swagger2openapi"; import * as YAML from "yaml"; @@ -44,16 +45,16 @@ export class SwaggerSchemaResolver { }> { return new Promise((resolve) => { const result = structuredClone(swaggerSchema); - result.info = lodash.merge( + result.info = merge( { title: "No title", version: "", }, - result.info, + result.info || {}, ); if (!Object.hasOwn(result, "openapi")) { - result.paths = lodash.merge({}, result.paths); + result.paths = merge({}, result.paths || {}); swagger2openapi.convertObj( result as OpenAPIV2.Document, @@ -65,11 +66,8 @@ export class SwaggerSchemaResolver { rbname: "requestBodyName", }, (err, options) => { - const parsedSwaggerSchema = lodash.get( - err, - "options.openapi", - lodash.get(options, "openapi"), - ); + const parsedSwaggerSchema = + get(err, "options.openapi") ?? get(options, "openapi"); if (!parsedSwaggerSchema && err) { throw err; } @@ -120,39 +118,37 @@ export class SwaggerSchemaResolver { } fixSwaggerSchema({ usageSchema, originalSchema }) { - const usagePaths = lodash.get(usageSchema, "paths"); - const originalPaths = lodash.get(originalSchema, "paths"); + const usagePaths = get(usageSchema, "paths") || {}; + const originalPaths = get(originalSchema, "paths") || {}; // walk by routes - lodash.each(usagePaths, (usagePathObject, route) => { - const originalPathObject = lodash.get(originalPaths, route); + for (const [route, usagePathObject] of Object.entries(usagePaths)) { + const originalPathObject = get(originalPaths, route) || {}; // walk by methods - lodash.each(usagePathObject, (usageRouteInfo, methodName) => { - const originalRouteInfo = lodash.get(originalPathObject, methodName); - const usageRouteParams = lodash.get(usageRouteInfo, "parameters", []); - const originalRouteParams = lodash.get( - originalRouteInfo, - "parameters", - [], - ); + for (const [methodName, usageRouteInfo] of Object.entries( + usagePathObject as Record, + )) { + const originalRouteInfo = get(originalPathObject, methodName) || {}; + const usageRouteParams = get(usageRouteInfo, "parameters") || []; + const originalRouteParams = get(originalRouteInfo, "parameters") || []; if (typeof usageRouteInfo === "object") { - usageRouteInfo.consumes = lodash.uniq( - lodash.compact([ + usageRouteInfo.consumes = uniq( + compact([ ...(usageRouteInfo.consumes || []), ...(originalRouteInfo.consumes || []), ]), ); - usageRouteInfo.produces = lodash.uniq( - lodash.compact([ + usageRouteInfo.produces = uniq( + compact([ ...(usageRouteInfo.produces || []), ...(originalRouteInfo.produces || []), ]), ); } - lodash.each(originalRouteParams, (originalRouteParam) => { + for (const originalRouteParam of originalRouteParams) { const existUsageParam = usageRouteParams.find( (param) => originalRouteParam.in === param.in && @@ -161,8 +157,8 @@ export class SwaggerSchemaResolver { if (!existUsageParam) { usageRouteParams.push(originalRouteParam); } - }); - }); - }); + } + } + } } } diff --git a/src/templates-worker.ts b/src/templates-worker.ts index 00807c6c6..816ca7159 100644 --- a/src/templates-worker.ts +++ b/src/templates-worker.ts @@ -2,8 +2,8 @@ import * as module from "node:module"; import * as path from "node:path"; import * as url from "node:url"; import { consola } from "consola"; +import { get } from "es-toolkit/compat"; import { Eta } from "eta"; -import lodash from "lodash"; import type { CodeGenProcess } from "./code-gen-process.js"; import type { CodeGenConfig } from "./configuration.js"; import type { FileSystem } from "./util/file-system.js"; @@ -158,8 +158,7 @@ export class TemplatesWorker { ); } - return lodash.reduce( - this.config.templateInfos, + return this.config.templateInfos.reduce( (acc, { name, fileName }) => ({ ...acc, [name]: this.getTemplate(name, fileName), @@ -177,15 +176,15 @@ export class TemplatesWorker { }; getTemplateContent = (path_: string) => { - const foundTemplatePathKey = lodash - .keys(this.config.templatePaths) - .find((key) => path_.startsWith(`@${key}`)); + const foundTemplatePathKey = Object.keys(this.config.templatePaths).find( + (key) => path_.startsWith(`@${key}`), + ); if (foundTemplatePathKey) { const rawPath = path.resolve( path_.replace( `@${foundTemplatePathKey}`, - lodash.get(this.config.templatePaths, foundTemplatePathKey), + get(this.config.templatePaths, foundTemplatePathKey), ), ); const fixedPath = this.findTemplateWithExt(rawPath); diff --git a/src/type-name-formatter.ts b/src/type-name-formatter.ts index 58743a863..3a2526205 100644 --- a/src/type-name-formatter.ts +++ b/src/type-name-formatter.ts @@ -1,5 +1,6 @@ import { consola } from "consola"; -import lodash from "lodash"; +import { compact } from "es-toolkit"; +import { startCase } from "es-toolkit/compat"; import type { CodeGenConfig } from "./configuration.js"; type FormattingSchemaType = "enum-key" | "type-name"; @@ -33,7 +34,7 @@ export class TypeNameFormatter { // constant names like LEFT_ARROW, RIGHT_FORWARD, ETC_KEY, _KEY_NUM_ if (/^(?!\d)([A-Z0-9_]{1,})$/g.test(name)) { - return lodash.compact([typePrefix, name, typeSuffix]).join("_"); + return compact([typePrefix, name, typeSuffix]).join("_"); } if (this.formattedModelNamesMap.has(hashKey)) { @@ -42,9 +43,9 @@ export class TypeNameFormatter { const fixedModelName = this.fixModelName(name, { type: schemaType }); - const formattedName = lodash - .startCase(`${typePrefix}_${fixedModelName}_${typeSuffix}`) - .replace(/\s/g, ""); + const formattedName = startCase( + `${typePrefix}_${fixedModelName}_${typeSuffix}`, + ).replace(/\s/g, ""); const formattedResultName = this.config.hooks.onFormatTypeName(formattedName, name, schemaType) || formattedName; @@ -80,7 +81,7 @@ export class TypeNameFormatter { } if (name.includes("-")) { - return lodash.startCase(name).replace(/ /g, ""); + return startCase(name).replace(/ /g, ""); } } diff --git a/src/util/id.ts b/src/util/id.ts index d63ee17f5..7b27ae7e7 100644 --- a/src/util/id.ts +++ b/src/util/id.ts @@ -1,5 +1,3 @@ -import * as nanoid from "nanoid"; +import * as crypto from "node:crypto"; -const ALPHABET = "abcdefghijklmnopqrstuvwxyz0123456789"; - -export const generateId = nanoid.customAlphabet(ALPHABET, 12); +export const generateId = () => crypto.randomUUID(); diff --git a/src/util/internal-case.ts b/src/util/internal-case.ts deleted file mode 100644 index bb9857096..000000000 --- a/src/util/internal-case.ts +++ /dev/null @@ -1,5 +0,0 @@ -import lodash from "lodash"; - -export function internalCase(value: string) { - return lodash.camelCase(lodash.lowerCase(value)); -} diff --git a/src/util/lodash-compat.ts b/src/util/lodash-compat.ts new file mode 100644 index 000000000..dfac99640 --- /dev/null +++ b/src/util/lodash-compat.ts @@ -0,0 +1,11 @@ +import * as esToolkit from "es-toolkit"; +import * as esToolkitCompat from "es-toolkit/compat"; + +// Create a lodash-compatible object for templates +// This is exported as `_` to templates for backwards compatibility +export function createLodashCompat(): Record { + return { + ...esToolkit, + ...esToolkitCompat, + }; +} diff --git a/src/util/name-resolver.ts b/src/util/name-resolver.ts index c3ba4abab..6fac917ff 100644 --- a/src/util/name-resolver.ts +++ b/src/util/name-resolver.ts @@ -1,5 +1,5 @@ import { consola } from "consola"; -import lodash from "lodash"; +import { compact, uniq } from "es-toolkit"; import type { CodeGenConfig } from "../configuration.js"; type Resolver = (reserved: string[], extras?: string[]) => string; @@ -21,7 +21,7 @@ export class NameResolver { } reserve(names: string[]) { - const fixedNames = lodash.uniq(lodash.compact(names)); + const fixedNames = uniq(compact(names)); for (const name of fixedNames) { if (this.reservedNames.indexOf(name) === -1) { this.reservedNames.push(name); @@ -68,7 +68,7 @@ export class NameResolver { if (Array.isArray(variants)) { let usageName: string | null = null; - const uniqVariants = lodash.uniq(lodash.compact(variants)); + const uniqVariants = uniq(compact(variants)); for (const variant of uniqVariants) { if (!usageName && (!shouldReserve || !this.isReserved(variant))) { diff --git a/src/util/object-assign.ts b/src/util/object-assign.ts deleted file mode 100644 index 320e9be26..000000000 --- a/src/util/object-assign.ts +++ /dev/null @@ -1,15 +0,0 @@ -import lodash from "lodash"; - -type Updater = (target: unknown) => unknown; - -export const objectAssign = (target: object, updater: Updater | unknown) => { - if (!updater) return; - const update = typeof updater === "function" ? updater(target) : updater; - const undefinedKeys = lodash - .map(update, (value, key) => value === undefined && key) - .filter((key) => typeof key === "string"); - Object.assign(target, lodash.merge(target, update)); - for (const key of undefinedKeys) { - target[key] = undefined; - } -}; diff --git a/src/util/pascal-case.ts b/src/util/pascal-case.ts index 8e1b7fc10..5d4c404d3 100644 --- a/src/util/pascal-case.ts +++ b/src/util/pascal-case.ts @@ -1,5 +1,5 @@ -import lodash from "lodash"; +import { camelCase, upperFirst } from "es-toolkit/compat"; export function pascalCase(value: string) { - return lodash.upperFirst(lodash.camelCase(value)); + return upperFirst(camelCase(value)); } diff --git a/src/util/random.ts b/src/util/random.ts index 9f536a838..f76d22802 100644 --- a/src/util/random.ts +++ b/src/util/random.ts @@ -1,9 +1,5 @@ -export const getRandomFloat = (min = 0, max = 1) => { - return Math.random() * (max - min) + min; -}; - export const getRandomInt = (min = 0, max = 1) => { if (min === max) return min; - return Math.round(getRandomFloat(min, max)); + return Math.round(Math.random() * (max - min) + min); }; diff --git a/src/util/request.ts b/src/util/request.ts index 7efcf1e0e..f0de374c0 100644 --- a/src/util/request.ts +++ b/src/util/request.ts @@ -1,5 +1,5 @@ import { consola } from "consola"; -import lodash from "lodash"; +import { merge } from "es-toolkit"; import type { CodeGenConfig } from "../configuration.js"; export class Request { @@ -26,7 +26,7 @@ export class Request { }; } - lodash.merge(requestOptions, options, this.config.requestOptions); + merge(merge(requestOptions, options), this.config.requestOptions || {}); try { const response = await fetch(url, requestOptions); diff --git a/tests/__snapshots__/extended.test.ts.snap b/tests/__snapshots__/extended.test.ts.snap index e95bc232a..b8b52f5f7 100644 --- a/tests/__snapshots__/extended.test.ts.snap +++ b/tests/__snapshots__/extended.test.ts.snap @@ -7818,10 +7818,14 @@ exports[`extended > 'api-with-examples' 1`] = ` * --------------------------------------------------------------- */ +export type ConsumesPlainTextPayload = string; + export type GetVersionDetailsv2Data = any; export type ListVersionsv2Data = any; +export type WithCharsetPayload = string; + export namespace V2 { /** * No description @@ -7838,6 +7842,38 @@ export namespace V2 { } } +export namespace WithCharset { + /** + * @description consumes contains charset + * @name WithCharset + * @summary consumes contains charset + * @request POST:/with-charset/ + */ + export namespace WithCharset { + export type RequestParams = {}; + export type RequestQuery = {}; + export type RequestBody = WithCharsetPayload; + export type RequestHeaders = {}; + export type ResponseBody = any; + } +} + +export namespace ConsumesPlainText { + /** + * @description consumes plain text + * @name ConsumesPlainText + * @summary consumes plain text + * @request POST:/consumes-plain-text/ + */ + export namespace ConsumesPlainText { + export type RequestParams = {}; + export type RequestQuery = {}; + export type RequestBody = ConsumesPlainTextPayload; + export type RequestHeaders = {}; + export type ResponseBody = any; + } +} + export type QueryParamsType = Record; export type ResponseFormat = keyof Omit; @@ -8095,13 +8131,13 @@ export class HttpClient { /** * @title Simple API overview - * @version 2.0.0 + * @version v2 */ export class Api< SecurityDataType extends unknown, > extends HttpClient { /** - * No description + * @description multiple line 1 multiple line 2 multiple line 3 * * @name ListVersionsv2 * @summary List API versions @@ -8131,6 +8167,43 @@ export class Api< ...params, }), }; + withCharset = { + /** + * @description consumes contains charset + * + * @name WithCharset + * @summary consumes contains charset + * @request POST:/with-charset/ + */ + withCharset: (someParm: WithCharsetPayload, params: RequestParams = {}) => + this.request({ + path: \`/with-charset/\`, + method: "POST", + body: someParm, + type: ContentType.Json, + ...params, + }), + }; + consumesPlainText = { + /** + * @description consumes plain text + * + * @name ConsumesPlainText + * @summary consumes plain text + * @request POST:/consumes-plain-text/ + */ + consumesPlainText: ( + someParm: ConsumesPlainTextPayload, + params: RequestParams = {}, + ) => + this.request({ + path: \`/consumes-plain-text/\`, + method: "POST", + body: someParm, + type: ContentType.Text, + ...params, + }), + }; } " `; @@ -8148,14 +8221,10 @@ exports[`extended > 'api-with-examples' 2`] = ` * --------------------------------------------------------------- */ -export type ConsumesPlainTextPayload = string; - export type GetVersionDetailsv2Data = any; export type ListVersionsv2Data = any; -export type WithCharsetPayload = string; - export namespace V2 { /** * No description @@ -8172,38 +8241,6 @@ export namespace V2 { } } -export namespace WithCharset { - /** - * @description consumes contains charset - * @name WithCharset - * @summary consumes contains charset - * @request POST:/with-charset/ - */ - export namespace WithCharset { - export type RequestParams = {}; - export type RequestQuery = {}; - export type RequestBody = WithCharsetPayload; - export type RequestHeaders = {}; - export type ResponseBody = any; - } -} - -export namespace ConsumesPlainText { - /** - * @description consumes plain text - * @name ConsumesPlainText - * @summary consumes plain text - * @request POST:/consumes-plain-text/ - */ - export namespace ConsumesPlainText { - export type RequestParams = {}; - export type RequestQuery = {}; - export type RequestBody = ConsumesPlainTextPayload; - export type RequestHeaders = {}; - export type ResponseBody = any; - } -} - export type QueryParamsType = Record; export type ResponseFormat = keyof Omit; @@ -8461,13 +8498,13 @@ export class HttpClient { /** * @title Simple API overview - * @version v2 + * @version 2.0.0 */ export class Api< SecurityDataType extends unknown, > extends HttpClient { /** - * @description multiple line 1 multiple line 2 multiple line 3 + * No description * * @name ListVersionsv2 * @summary List API versions @@ -8497,43 +8534,6 @@ export class Api< ...params, }), }; - withCharset = { - /** - * @description consumes contains charset - * - * @name WithCharset - * @summary consumes contains charset - * @request POST:/with-charset/ - */ - withCharset: (someParm: WithCharsetPayload, params: RequestParams = {}) => - this.request({ - path: \`/with-charset/\`, - method: "POST", - body: someParm, - type: ContentType.Json, - ...params, - }), - }; - consumesPlainText = { - /** - * @description consumes plain text - * - * @name ConsumesPlainText - * @summary consumes plain text - * @request POST:/consumes-plain-text/ - */ - consumesPlainText: ( - someParm: ConsumesPlainTextPayload, - params: RequestParams = {}, - ) => - this.request({ - path: \`/consumes-plain-text/\`, - method: "POST", - body: someParm, - type: ContentType.Text, - ...params, - }), - }; } " `; @@ -70274,7 +70274,7 @@ export interface Pet { export type Pets = Pet[]; -export type ShowPetByIdData = Pet; +export type ShowPetByIdData = Pets; export type ShowPetByIdError = Error; @@ -70283,8 +70283,6 @@ export interface ShowPetByIdParams { petId: string; } -export type StringNullable = string | null; - export namespace Pets { /** * No description @@ -70705,7 +70703,7 @@ export interface Pet { export type Pets = Pet[]; -export type ShowPetByIdData = Pets; +export type ShowPetByIdData = Pet; export type ShowPetByIdError = Error; @@ -70714,6 +70712,8 @@ export interface ShowPetByIdParams { petId: string; } +export type StringNullable = string | null; + export namespace Pets { /** * No description @@ -71156,14 +71156,61 @@ export interface NewPet { tag?: string; } +/** Page«TemplateResponseDto» */ +export interface PageTemplateResponseDto { + content?: any[]; + empty?: boolean; + first?: boolean; + last?: boolean; + /** @format int32 */ + number?: number; + /** @format int32 */ + numberOfElements?: number; + pageable?: any; + /** @format int32 */ + size?: number; + sort?: any; + /** @format int64 */ + totalElements?: number; + /** @format int32 */ + totalPages?: number; +} + +export interface PathParamFooBarBazListParams { + /** foo bar baz */ + fooBarBaz: string; + /** path-param */ + pathParam: string; +} + export type Pet = NewPet & { /** @format int64 */ id: number; }; +export namespace PathParams { + /** + * No description + * @name PathParamFooBarBazList + * @request GET:/path-params/{path-param}/{foo-bar-baz} + */ + export namespace PathParamFooBarBazList { + export type RequestParams = { + /** foo bar baz */ + fooBarBaz: string; + /** path-param */ + pathParam: string; + }; + export type RequestQuery = {}; + export type RequestBody = never; + export type RequestHeaders = {}; + export type ResponseBody = any; + } +} + export namespace Pets { /** - * @description Creates a new pet in the store. Duplicates are allowed + * @description Creates a new pet in the store. Duplicates are allowed * @name AddPet * @request POST:/pets */ @@ -71498,23 +71545,40 @@ export class HttpClient { * @baseUrl http://petstore.swagger.io/api * @contact Swagger API Team (http://swagger.io) * - * A sample API that uses a petstore as an example to demonstrate features in the OpenAPI 3.0 specification + * A sample API that uses a petstore as an example to demonstrate features in the swagger-2.0 specification */ export class Api< SecurityDataType extends unknown, > extends HttpClient { + pathParams = { + /** + * No description + * + * @name PathParamFooBarBazList + * @request GET:/path-params/{path-param}/{foo-bar-baz} + */ + pathParamFooBarBazList: ( + { pathParam, fooBarBaz, ...query }: PathParamFooBarBazListParams, + params: RequestParams = {}, + ) => + this.request({ + path: \`/path-params/\${pathParam}/\${fooBarBaz}\`, + method: "GET", + ...params, + }), + }; pets = { /** - * @description Creates a new pet in the store. Duplicates are allowed + * @description Creates a new pet in the store. Duplicates are allowed * * @name AddPet * @request POST:/pets */ - addPet: (data: NewPet, params: RequestParams = {}) => + addPet: (pet: NewPet, params: RequestParams = {}) => this.request({ path: \`/pets\`, method: "POST", - body: data, + body: pet, type: ContentType.Json, format: "json", ...params, @@ -71638,61 +71702,14 @@ export interface NewPet { tag?: string; } -/** Page«TemplateResponseDto» */ -export interface PageTemplateResponseDto { - content?: any[]; - empty?: boolean; - first?: boolean; - last?: boolean; - /** @format int32 */ - number?: number; - /** @format int32 */ - numberOfElements?: number; - pageable?: any; - /** @format int32 */ - size?: number; - sort?: any; - /** @format int64 */ - totalElements?: number; - /** @format int32 */ - totalPages?: number; -} - -export interface PathParamFooBarBazListParams { - /** foo bar baz */ - fooBarBaz: string; - /** path-param */ - pathParam: string; -} - export type Pet = NewPet & { /** @format int64 */ id: number; }; -export namespace PathParams { - /** - * No description - * @name PathParamFooBarBazList - * @request GET:/path-params/{path-param}/{foo-bar-baz} - */ - export namespace PathParamFooBarBazList { - export type RequestParams = { - /** foo bar baz */ - fooBarBaz: string; - /** path-param */ - pathParam: string; - }; - export type RequestQuery = {}; - export type RequestBody = never; - export type RequestHeaders = {}; - export type ResponseBody = any; - } -} - export namespace Pets { /** - * @description Creates a new pet in the store. Duplicates are allowed + * @description Creates a new pet in the store. Duplicates are allowed * @name AddPet * @request POST:/pets */ @@ -72027,40 +72044,23 @@ export class HttpClient { * @baseUrl http://petstore.swagger.io/api * @contact Swagger API Team (http://swagger.io) * - * A sample API that uses a petstore as an example to demonstrate features in the swagger-2.0 specification + * A sample API that uses a petstore as an example to demonstrate features in the OpenAPI 3.0 specification */ export class Api< SecurityDataType extends unknown, > extends HttpClient { - pathParams = { - /** - * No description - * - * @name PathParamFooBarBazList - * @request GET:/path-params/{path-param}/{foo-bar-baz} - */ - pathParamFooBarBazList: ( - { pathParam, fooBarBaz, ...query }: PathParamFooBarBazListParams, - params: RequestParams = {}, - ) => - this.request({ - path: \`/path-params/\${pathParam}/\${fooBarBaz}\`, - method: "GET", - ...params, - }), - }; pets = { /** - * @description Creates a new pet in the store. Duplicates are allowed + * @description Creates a new pet in the store. Duplicates are allowed * * @name AddPet * @request POST:/pets */ - addPet: (pet: NewPet, params: RequestParams = {}) => + addPet: (data: NewPet, params: RequestParams = {}) => this.request({ path: \`/pets\`, method: "POST", - body: pet, + body: data, type: ContentType.Json, format: "json", ...params, diff --git a/tests/__snapshots__/simple.test.ts.snap b/tests/__snapshots__/simple.test.ts.snap index 710b23008..4039072ea 100644 --- a/tests/__snapshots__/simple.test.ts.snap +++ b/tests/__snapshots__/simple.test.ts.snap @@ -5191,13 +5191,13 @@ export class HttpClient { /** * @title Simple API overview - * @version 2.0.0 + * @version v2 */ export class Api< SecurityDataType extends unknown, > extends HttpClient { /** - * No description + * @description multiple line 1 multiple line 2 multiple line 3 * * @name ListVersionsv2 * @summary List API versions @@ -5227,6 +5227,40 @@ export class Api< ...params, }), }; + withCharset = { + /** + * @description consumes contains charset + * + * @name WithCharset + * @summary consumes contains charset + * @request POST:/with-charset/ + */ + withCharset: (someParm: string, params: RequestParams = {}) => + this.request({ + path: \`/with-charset/\`, + method: "POST", + body: someParm, + type: ContentType.Json, + ...params, + }), + }; + consumesPlainText = { + /** + * @description consumes plain text + * + * @name ConsumesPlainText + * @summary consumes plain text + * @request POST:/consumes-plain-text/ + */ + consumesPlainText: (someParm: string, params: RequestParams = {}) => + this.request({ + path: \`/consumes-plain-text/\`, + method: "POST", + body: someParm, + type: ContentType.Text, + ...params, + }), + }; } " `; @@ -5501,13 +5535,13 @@ export class HttpClient { /** * @title Simple API overview - * @version v2 + * @version 2.0.0 */ export class Api< SecurityDataType extends unknown, > extends HttpClient { /** - * @description multiple line 1 multiple line 2 multiple line 3 + * No description * * @name ListVersionsv2 * @summary List API versions @@ -5537,40 +5571,6 @@ export class Api< ...params, }), }; - withCharset = { - /** - * @description consumes contains charset - * - * @name WithCharset - * @summary consumes contains charset - * @request POST:/with-charset/ - */ - withCharset: (someParm: string, params: RequestParams = {}) => - this.request({ - path: \`/with-charset/\`, - method: "POST", - body: someParm, - type: ContentType.Json, - ...params, - }), - }; - consumesPlainText = { - /** - * @description consumes plain text - * - * @name ConsumesPlainText - * @summary consumes plain text - * @request POST:/consumes-plain-text/ - */ - consumesPlainText: (someParm: string, params: RequestParams = {}) => - this.request({ - path: \`/consumes-plain-text/\`, - method: "POST", - body: someParm, - type: ContentType.Text, - ...params, - }), - }; } " `; @@ -41856,8 +41856,6 @@ export interface Pet { export type Pets = Pet[]; -export type StringNullable = string | null; - export type QueryParamsType = Record; export type ResponseFormat = keyof Omit; @@ -42173,7 +42171,7 @@ export class Api< * @request GET:/pets/{petId} */ showPetById: (petId: string, params: RequestParams = {}) => - this.request({ + this.request({ path: \`/pets/\${petId}\`, method: "GET", format: "json", @@ -42212,6 +42210,8 @@ export interface Pet { export type Pets = Pet[]; +export type StringNullable = string | null; + export type QueryParamsType = Record; export type ResponseFormat = keyof Omit; @@ -42527,7 +42527,7 @@ export class Api< * @request GET:/pets/{petId} */ showPetById: (petId: string, params: RequestParams = {}) => - this.request({ + this.request({ path: \`/pets/\${petId}\`, method: "GET", format: "json", @@ -42562,6 +42562,26 @@ export interface NewPet { tag?: string; } +/** Page«TemplateResponseDto» */ +export interface PageTemplateResponseDto { + content?: any[]; + empty?: boolean; + first?: boolean; + last?: boolean; + /** @format int32 */ + number?: number; + /** @format int32 */ + numberOfElements?: number; + pageable?: any; + /** @format int32 */ + size?: number; + sort?: any; + /** @format int64 */ + totalElements?: number; + /** @format int32 */ + totalPages?: number; +} + export type Pet = NewPet & { /** @format int64 */ id: number; @@ -42830,11 +42850,29 @@ export class HttpClient { * @baseUrl http://petstore.swagger.io/api * @contact Swagger API Team (http://swagger.io) * - * A sample API that uses a petstore as an example to demonstrate features in the OpenAPI 3.0 specification + * A sample API that uses a petstore as an example to demonstrate features in the swagger-2.0 specification */ export class Api< SecurityDataType extends unknown, > extends HttpClient { + pathParams = { + /** + * No description + * + * @name PathParamFooBarBazList + * @request GET:/path-params/{path-param}/{foo-bar-baz} + */ + pathParamFooBarBazList: ( + pathParam: string, + fooBarBaz: string, + params: RequestParams = {}, + ) => + this.request({ + path: \`/path-params/\${pathParam}/\${fooBarBaz}\`, + method: "GET", + ...params, + }), + }; pets = { /** * @description Returns all pets from the system that the user has access to Nam sed condimentum est. Maecenas tempor sagittis sapien, nec rhoncus sem sagittis sit amet. Aenean at gravida augue, ac iaculis sem. Curabitur odio lorem, ornare eget elementum nec, cursus id lectus. Duis mi turpis, pulvinar ac eros ac, tincidunt varius justo. In hac habitasse platea dictumst. Integer at adipiscing ante, a sagittis ligula. Aenean pharetra tempor ante molestie imperdiet. Vivamus id aliquam diam. Cras quis velit non tortor eleifend sagittis. Praesent at enim pharetra urna volutpat venenatis eget eget mauris. In eleifend fermentum facilisis. Praesent enim enim, gravida ac sodales sed, placerat id erat. Suspendisse lacus dolor, consectetur non augue vel, vehicula interdum libero. Morbi euismod sagittis libero sed lacinia. Sed tempus felis lobortis leo pulvinar rutrum. Nam mattis velit nisl, eu condimentum ligula luctus nec. Phasellus semper velit eget aliquet faucibus. In a mattis elit. Phasellus vel urna viverra, condimentum lorem id, rhoncus nibh. Ut pellentesque posuere elementum. Sed a varius odio. Morbi rhoncus ligula libero, vel eleifend nunc tristique vitae. Fusce et sem dui. Aenean nec scelerisque tortor. Fusce malesuada accumsan magna vel tempus. Quisque mollis felis eu dolor tristique, sit amet auctor felis gravida. Sed libero lorem, molestie sed nisl in, accumsan tempor nisi. Fusce sollicitudin massa ut lacinia mattis. Sed vel eleifend lorem. Pellentesque vitae felis pretium, pulvinar elit eu, euismod sapien. @@ -42863,16 +42901,16 @@ export class Api< }), /** - * @description Creates a new pet in the store. Duplicates are allowed + * @description Creates a new pet in the store. Duplicates are allowed * * @name AddPet * @request POST:/pets */ - addPet: (data: NewPet, params: RequestParams = {}) => + addPet: (pet: NewPet, params: RequestParams = {}) => this.request({ path: \`/pets\`, method: "POST", - body: data, + body: pet, type: ContentType.Json, format: "json", ...params, @@ -42933,26 +42971,6 @@ export interface NewPet { tag?: string; } -/** Page«TemplateResponseDto» */ -export interface PageTemplateResponseDto { - content?: any[]; - empty?: boolean; - first?: boolean; - last?: boolean; - /** @format int32 */ - number?: number; - /** @format int32 */ - numberOfElements?: number; - pageable?: any; - /** @format int32 */ - size?: number; - sort?: any; - /** @format int64 */ - totalElements?: number; - /** @format int32 */ - totalPages?: number; -} - export type Pet = NewPet & { /** @format int64 */ id: number; @@ -43221,29 +43239,11 @@ export class HttpClient { * @baseUrl http://petstore.swagger.io/api * @contact Swagger API Team (http://swagger.io) * - * A sample API that uses a petstore as an example to demonstrate features in the swagger-2.0 specification + * A sample API that uses a petstore as an example to demonstrate features in the OpenAPI 3.0 specification */ export class Api< SecurityDataType extends unknown, > extends HttpClient { - pathParams = { - /** - * No description - * - * @name PathParamFooBarBazList - * @request GET:/path-params/{path-param}/{foo-bar-baz} - */ - pathParamFooBarBazList: ( - pathParam: string, - fooBarBaz: string, - params: RequestParams = {}, - ) => - this.request({ - path: \`/path-params/\${pathParam}/\${fooBarBaz}\`, - method: "GET", - ...params, - }), - }; pets = { /** * @description Returns all pets from the system that the user has access to Nam sed condimentum est. Maecenas tempor sagittis sapien, nec rhoncus sem sagittis sit amet. Aenean at gravida augue, ac iaculis sem. Curabitur odio lorem, ornare eget elementum nec, cursus id lectus. Duis mi turpis, pulvinar ac eros ac, tincidunt varius justo. In hac habitasse platea dictumst. Integer at adipiscing ante, a sagittis ligula. Aenean pharetra tempor ante molestie imperdiet. Vivamus id aliquam diam. Cras quis velit non tortor eleifend sagittis. Praesent at enim pharetra urna volutpat venenatis eget eget mauris. In eleifend fermentum facilisis. Praesent enim enim, gravida ac sodales sed, placerat id erat. Suspendisse lacus dolor, consectetur non augue vel, vehicula interdum libero. Morbi euismod sagittis libero sed lacinia. Sed tempus felis lobortis leo pulvinar rutrum. Nam mattis velit nisl, eu condimentum ligula luctus nec. Phasellus semper velit eget aliquet faucibus. In a mattis elit. Phasellus vel urna viverra, condimentum lorem id, rhoncus nibh. Ut pellentesque posuere elementum. Sed a varius odio. Morbi rhoncus ligula libero, vel eleifend nunc tristique vitae. Fusce et sem dui. Aenean nec scelerisque tortor. Fusce malesuada accumsan magna vel tempus. Quisque mollis felis eu dolor tristique, sit amet auctor felis gravida. Sed libero lorem, molestie sed nisl in, accumsan tempor nisi. Fusce sollicitudin massa ut lacinia mattis. Sed vel eleifend lorem. Pellentesque vitae felis pretium, pulvinar elit eu, euismod sapien. @@ -43272,16 +43272,16 @@ export class Api< }), /** - * @description Creates a new pet in the store. Duplicates are allowed + * @description Creates a new pet in the store. Duplicates are allowed * * @name AddPet * @request POST:/pets */ - addPet: (pet: NewPet, params: RequestParams = {}) => + addPet: (data: NewPet, params: RequestParams = {}) => this.request({ path: \`/pets\`, method: "POST", - body: pet, + body: data, type: ContentType.Json, format: "json", ...params, diff --git a/tests/utils.ts b/tests/utils.ts index 3211b6c48..eee626dbd 100644 --- a/tests/utils.ts +++ b/tests/utils.ts @@ -21,5 +21,6 @@ export async function collectAllSchemas() { schemas.push({ name, filePath }); } } - return schemas; + // Sort by filePath to ensure consistent order across different file systems + return schemas.sort((a, b) => a.filePath.localeCompare(b.filePath)); } diff --git a/vitest.config.ts b/vitest.config.ts index 797541199..d36662da8 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -2,7 +2,7 @@ import { defineConfig } from "vitest/config"; export default defineConfig({ test: { - testTimeout: 10000, + testTimeout: 30000, typecheck: { enabled: true, }, diff --git a/yarn.lock b/yarn.lock index 2bf954abe..9a9bdb18a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -459,184 +459,184 @@ __metadata: languageName: node linkType: hard -"@esbuild/aix-ppc64@npm:0.25.12": - version: 0.25.12 - resolution: "@esbuild/aix-ppc64@npm:0.25.12" +"@esbuild/aix-ppc64@npm:0.27.2": + version: 0.27.2 + resolution: "@esbuild/aix-ppc64@npm:0.27.2" conditions: os=aix & cpu=ppc64 languageName: node linkType: hard -"@esbuild/android-arm64@npm:0.25.12": - version: 0.25.12 - resolution: "@esbuild/android-arm64@npm:0.25.12" +"@esbuild/android-arm64@npm:0.27.2": + version: 0.27.2 + resolution: "@esbuild/android-arm64@npm:0.27.2" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@esbuild/android-arm@npm:0.25.12": - version: 0.25.12 - resolution: "@esbuild/android-arm@npm:0.25.12" +"@esbuild/android-arm@npm:0.27.2": + version: 0.27.2 + resolution: "@esbuild/android-arm@npm:0.27.2" conditions: os=android & cpu=arm languageName: node linkType: hard -"@esbuild/android-x64@npm:0.25.12": - version: 0.25.12 - resolution: "@esbuild/android-x64@npm:0.25.12" +"@esbuild/android-x64@npm:0.27.2": + version: 0.27.2 + resolution: "@esbuild/android-x64@npm:0.27.2" conditions: os=android & cpu=x64 languageName: node linkType: hard -"@esbuild/darwin-arm64@npm:0.25.12": - version: 0.25.12 - resolution: "@esbuild/darwin-arm64@npm:0.25.12" +"@esbuild/darwin-arm64@npm:0.27.2": + version: 0.27.2 + resolution: "@esbuild/darwin-arm64@npm:0.27.2" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@esbuild/darwin-x64@npm:0.25.12": - version: 0.25.12 - resolution: "@esbuild/darwin-x64@npm:0.25.12" +"@esbuild/darwin-x64@npm:0.27.2": + version: 0.27.2 + resolution: "@esbuild/darwin-x64@npm:0.27.2" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@esbuild/freebsd-arm64@npm:0.25.12": - version: 0.25.12 - resolution: "@esbuild/freebsd-arm64@npm:0.25.12" +"@esbuild/freebsd-arm64@npm:0.27.2": + version: 0.27.2 + resolution: "@esbuild/freebsd-arm64@npm:0.27.2" conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard -"@esbuild/freebsd-x64@npm:0.25.12": - version: 0.25.12 - resolution: "@esbuild/freebsd-x64@npm:0.25.12" +"@esbuild/freebsd-x64@npm:0.27.2": + version: 0.27.2 + resolution: "@esbuild/freebsd-x64@npm:0.27.2" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@esbuild/linux-arm64@npm:0.25.12": - version: 0.25.12 - resolution: "@esbuild/linux-arm64@npm:0.25.12" +"@esbuild/linux-arm64@npm:0.27.2": + version: 0.27.2 + resolution: "@esbuild/linux-arm64@npm:0.27.2" conditions: os=linux & cpu=arm64 languageName: node linkType: hard -"@esbuild/linux-arm@npm:0.25.12": - version: 0.25.12 - resolution: "@esbuild/linux-arm@npm:0.25.12" +"@esbuild/linux-arm@npm:0.27.2": + version: 0.27.2 + resolution: "@esbuild/linux-arm@npm:0.27.2" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@esbuild/linux-ia32@npm:0.25.12": - version: 0.25.12 - resolution: "@esbuild/linux-ia32@npm:0.25.12" +"@esbuild/linux-ia32@npm:0.27.2": + version: 0.27.2 + resolution: "@esbuild/linux-ia32@npm:0.27.2" conditions: os=linux & cpu=ia32 languageName: node linkType: hard -"@esbuild/linux-loong64@npm:0.25.12": - version: 0.25.12 - resolution: "@esbuild/linux-loong64@npm:0.25.12" +"@esbuild/linux-loong64@npm:0.27.2": + version: 0.27.2 + resolution: "@esbuild/linux-loong64@npm:0.27.2" conditions: os=linux & cpu=loong64 languageName: node linkType: hard -"@esbuild/linux-mips64el@npm:0.25.12": - version: 0.25.12 - resolution: "@esbuild/linux-mips64el@npm:0.25.12" +"@esbuild/linux-mips64el@npm:0.27.2": + version: 0.27.2 + resolution: "@esbuild/linux-mips64el@npm:0.27.2" conditions: os=linux & cpu=mips64el languageName: node linkType: hard -"@esbuild/linux-ppc64@npm:0.25.12": - version: 0.25.12 - resolution: "@esbuild/linux-ppc64@npm:0.25.12" +"@esbuild/linux-ppc64@npm:0.27.2": + version: 0.27.2 + resolution: "@esbuild/linux-ppc64@npm:0.27.2" conditions: os=linux & cpu=ppc64 languageName: node linkType: hard -"@esbuild/linux-riscv64@npm:0.25.12": - version: 0.25.12 - resolution: "@esbuild/linux-riscv64@npm:0.25.12" +"@esbuild/linux-riscv64@npm:0.27.2": + version: 0.27.2 + resolution: "@esbuild/linux-riscv64@npm:0.27.2" conditions: os=linux & cpu=riscv64 languageName: node linkType: hard -"@esbuild/linux-s390x@npm:0.25.12": - version: 0.25.12 - resolution: "@esbuild/linux-s390x@npm:0.25.12" +"@esbuild/linux-s390x@npm:0.27.2": + version: 0.27.2 + resolution: "@esbuild/linux-s390x@npm:0.27.2" conditions: os=linux & cpu=s390x languageName: node linkType: hard -"@esbuild/linux-x64@npm:0.25.12": - version: 0.25.12 - resolution: "@esbuild/linux-x64@npm:0.25.12" +"@esbuild/linux-x64@npm:0.27.2": + version: 0.27.2 + resolution: "@esbuild/linux-x64@npm:0.27.2" conditions: os=linux & cpu=x64 languageName: node linkType: hard -"@esbuild/netbsd-arm64@npm:0.25.12": - version: 0.25.12 - resolution: "@esbuild/netbsd-arm64@npm:0.25.12" +"@esbuild/netbsd-arm64@npm:0.27.2": + version: 0.27.2 + resolution: "@esbuild/netbsd-arm64@npm:0.27.2" conditions: os=netbsd & cpu=arm64 languageName: node linkType: hard -"@esbuild/netbsd-x64@npm:0.25.12": - version: 0.25.12 - resolution: "@esbuild/netbsd-x64@npm:0.25.12" +"@esbuild/netbsd-x64@npm:0.27.2": + version: 0.27.2 + resolution: "@esbuild/netbsd-x64@npm:0.27.2" conditions: os=netbsd & cpu=x64 languageName: node linkType: hard -"@esbuild/openbsd-arm64@npm:0.25.12": - version: 0.25.12 - resolution: "@esbuild/openbsd-arm64@npm:0.25.12" +"@esbuild/openbsd-arm64@npm:0.27.2": + version: 0.27.2 + resolution: "@esbuild/openbsd-arm64@npm:0.27.2" conditions: os=openbsd & cpu=arm64 languageName: node linkType: hard -"@esbuild/openbsd-x64@npm:0.25.12": - version: 0.25.12 - resolution: "@esbuild/openbsd-x64@npm:0.25.12" +"@esbuild/openbsd-x64@npm:0.27.2": + version: 0.27.2 + resolution: "@esbuild/openbsd-x64@npm:0.27.2" conditions: os=openbsd & cpu=x64 languageName: node linkType: hard -"@esbuild/openharmony-arm64@npm:0.25.12": - version: 0.25.12 - resolution: "@esbuild/openharmony-arm64@npm:0.25.12" +"@esbuild/openharmony-arm64@npm:0.27.2": + version: 0.27.2 + resolution: "@esbuild/openharmony-arm64@npm:0.27.2" conditions: os=openharmony & cpu=arm64 languageName: node linkType: hard -"@esbuild/sunos-x64@npm:0.25.12": - version: 0.25.12 - resolution: "@esbuild/sunos-x64@npm:0.25.12" +"@esbuild/sunos-x64@npm:0.27.2": + version: 0.27.2 + resolution: "@esbuild/sunos-x64@npm:0.27.2" conditions: os=sunos & cpu=x64 languageName: node linkType: hard -"@esbuild/win32-arm64@npm:0.25.12": - version: 0.25.12 - resolution: "@esbuild/win32-arm64@npm:0.25.12" +"@esbuild/win32-arm64@npm:0.27.2": + version: 0.27.2 + resolution: "@esbuild/win32-arm64@npm:0.27.2" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@esbuild/win32-ia32@npm:0.25.12": - version: 0.25.12 - resolution: "@esbuild/win32-ia32@npm:0.25.12" +"@esbuild/win32-ia32@npm:0.27.2": + version: 0.27.2 + resolution: "@esbuild/win32-ia32@npm:0.27.2" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@esbuild/win32-x64@npm:0.25.12": - version: 0.25.12 - resolution: "@esbuild/win32-x64@npm:0.25.12" +"@esbuild/win32-x64@npm:0.27.2": + version: 0.27.2 + resolution: "@esbuild/win32-x64@npm:0.27.2" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -649,15 +649,15 @@ __metadata: linkType: hard "@gerrit0/mini-shiki@npm:^3.17.0": - version: 3.17.0 - resolution: "@gerrit0/mini-shiki@npm:3.17.0" + version: 3.20.0 + resolution: "@gerrit0/mini-shiki@npm:3.20.0" dependencies: - "@shikijs/engine-oniguruma": "npm:^3.17.0" - "@shikijs/langs": "npm:^3.17.0" - "@shikijs/themes": "npm:^3.17.0" - "@shikijs/types": "npm:^3.17.0" + "@shikijs/engine-oniguruma": "npm:^3.20.0" + "@shikijs/langs": "npm:^3.20.0" + "@shikijs/themes": "npm:^3.20.0" + "@shikijs/types": "npm:^3.20.0" "@shikijs/vscode-textmate": "npm:^10.0.2" - checksum: 10c0/c748c21564ca71729c0a806f1204bc32e62a4e2195e1f96880ec2280bafb50cf1b5bf5ee6a14ca8c502e133c08c1188c354375ad47dff25364bc6ff91791e463 + checksum: 10c0/d362ea7c20709ddfaa651003d8013d58aa6e63ff1ec49f20461ce49708ad5963c2aec3c3b4c322bb4646b9c8c761ccbf5acfe7a29d8507930de163ba3591d4af languageName: node linkType: hard @@ -937,195 +937,195 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-android-arm-eabi@npm:4.53.3": - version: 4.53.3 - resolution: "@rollup/rollup-android-arm-eabi@npm:4.53.3" +"@rollup/rollup-android-arm-eabi@npm:4.54.0": + version: 4.54.0 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.54.0" conditions: os=android & cpu=arm languageName: node linkType: hard -"@rollup/rollup-android-arm64@npm:4.53.3": - version: 4.53.3 - resolution: "@rollup/rollup-android-arm64@npm:4.53.3" +"@rollup/rollup-android-arm64@npm:4.54.0": + version: 4.54.0 + resolution: "@rollup/rollup-android-arm64@npm:4.54.0" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-arm64@npm:4.53.3": - version: 4.53.3 - resolution: "@rollup/rollup-darwin-arm64@npm:4.53.3" +"@rollup/rollup-darwin-arm64@npm:4.54.0": + version: 4.54.0 + resolution: "@rollup/rollup-darwin-arm64@npm:4.54.0" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-x64@npm:4.53.3": - version: 4.53.3 - resolution: "@rollup/rollup-darwin-x64@npm:4.53.3" +"@rollup/rollup-darwin-x64@npm:4.54.0": + version: 4.54.0 + resolution: "@rollup/rollup-darwin-x64@npm:4.54.0" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@rollup/rollup-freebsd-arm64@npm:4.53.3": - version: 4.53.3 - resolution: "@rollup/rollup-freebsd-arm64@npm:4.53.3" +"@rollup/rollup-freebsd-arm64@npm:4.54.0": + version: 4.54.0 + resolution: "@rollup/rollup-freebsd-arm64@npm:4.54.0" conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-freebsd-x64@npm:4.53.3": - version: 4.53.3 - resolution: "@rollup/rollup-freebsd-x64@npm:4.53.3" +"@rollup/rollup-freebsd-x64@npm:4.54.0": + version: 4.54.0 + resolution: "@rollup/rollup-freebsd-x64@npm:4.54.0" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@rollup/rollup-linux-arm-gnueabihf@npm:4.53.3": - version: 4.53.3 - resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.53.3" +"@rollup/rollup-linux-arm-gnueabihf@npm:4.54.0": + version: 4.54.0 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.54.0" conditions: os=linux & cpu=arm & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-arm-musleabihf@npm:4.53.3": - version: 4.53.3 - resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.53.3" +"@rollup/rollup-linux-arm-musleabihf@npm:4.54.0": + version: 4.54.0 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.54.0" conditions: os=linux & cpu=arm & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-arm64-gnu@npm:4.53.3": - version: 4.53.3 - resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.53.3" +"@rollup/rollup-linux-arm64-gnu@npm:4.54.0": + version: 4.54.0 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.54.0" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-arm64-musl@npm:4.53.3": - version: 4.53.3 - resolution: "@rollup/rollup-linux-arm64-musl@npm:4.53.3" +"@rollup/rollup-linux-arm64-musl@npm:4.54.0": + version: 4.54.0 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.54.0" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-loong64-gnu@npm:4.53.3": - version: 4.53.3 - resolution: "@rollup/rollup-linux-loong64-gnu@npm:4.53.3" +"@rollup/rollup-linux-loong64-gnu@npm:4.54.0": + version: 4.54.0 + resolution: "@rollup/rollup-linux-loong64-gnu@npm:4.54.0" conditions: os=linux & cpu=loong64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-ppc64-gnu@npm:4.53.3": - version: 4.53.3 - resolution: "@rollup/rollup-linux-ppc64-gnu@npm:4.53.3" +"@rollup/rollup-linux-ppc64-gnu@npm:4.54.0": + version: 4.54.0 + resolution: "@rollup/rollup-linux-ppc64-gnu@npm:4.54.0" conditions: os=linux & cpu=ppc64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-riscv64-gnu@npm:4.53.3": - version: 4.53.3 - resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.53.3" +"@rollup/rollup-linux-riscv64-gnu@npm:4.54.0": + version: 4.54.0 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.54.0" conditions: os=linux & cpu=riscv64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-riscv64-musl@npm:4.53.3": - version: 4.53.3 - resolution: "@rollup/rollup-linux-riscv64-musl@npm:4.53.3" +"@rollup/rollup-linux-riscv64-musl@npm:4.54.0": + version: 4.54.0 + resolution: "@rollup/rollup-linux-riscv64-musl@npm:4.54.0" conditions: os=linux & cpu=riscv64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-s390x-gnu@npm:4.53.3": - version: 4.53.3 - resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.53.3" +"@rollup/rollup-linux-s390x-gnu@npm:4.54.0": + version: 4.54.0 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.54.0" conditions: os=linux & cpu=s390x & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-gnu@npm:4.53.3": - version: 4.53.3 - resolution: "@rollup/rollup-linux-x64-gnu@npm:4.53.3" +"@rollup/rollup-linux-x64-gnu@npm:4.54.0": + version: 4.54.0 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.54.0" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-musl@npm:4.53.3": - version: 4.53.3 - resolution: "@rollup/rollup-linux-x64-musl@npm:4.53.3" +"@rollup/rollup-linux-x64-musl@npm:4.54.0": + version: 4.54.0 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.54.0" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-openharmony-arm64@npm:4.53.3": - version: 4.53.3 - resolution: "@rollup/rollup-openharmony-arm64@npm:4.53.3" +"@rollup/rollup-openharmony-arm64@npm:4.54.0": + version: 4.54.0 + resolution: "@rollup/rollup-openharmony-arm64@npm:4.54.0" conditions: os=openharmony & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-win32-arm64-msvc@npm:4.53.3": - version: 4.53.3 - resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.53.3" +"@rollup/rollup-win32-arm64-msvc@npm:4.54.0": + version: 4.54.0 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.54.0" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-win32-ia32-msvc@npm:4.53.3": - version: 4.53.3 - resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.53.3" +"@rollup/rollup-win32-ia32-msvc@npm:4.54.0": + version: 4.54.0 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.54.0" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@rollup/rollup-win32-x64-gnu@npm:4.53.3": - version: 4.53.3 - resolution: "@rollup/rollup-win32-x64-gnu@npm:4.53.3" +"@rollup/rollup-win32-x64-gnu@npm:4.54.0": + version: 4.54.0 + resolution: "@rollup/rollup-win32-x64-gnu@npm:4.54.0" conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@rollup/rollup-win32-x64-msvc@npm:4.53.3": - version: 4.53.3 - resolution: "@rollup/rollup-win32-x64-msvc@npm:4.53.3" +"@rollup/rollup-win32-x64-msvc@npm:4.54.0": + version: 4.54.0 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.54.0" conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@shikijs/engine-oniguruma@npm:^3.17.0": - version: 3.17.0 - resolution: "@shikijs/engine-oniguruma@npm:3.17.0" +"@shikijs/engine-oniguruma@npm:^3.20.0": + version: 3.20.0 + resolution: "@shikijs/engine-oniguruma@npm:3.20.0" dependencies: - "@shikijs/types": "npm:3.17.0" + "@shikijs/types": "npm:3.20.0" "@shikijs/vscode-textmate": "npm:^10.0.2" - checksum: 10c0/f5fcb38db6f255084f4893050bc1961b7f840af5adde9f16612a191555fa6c8ecc95c422a77b385104424132ffcd089ad26a769c40bc92ac1ecf51e164b24be3 + checksum: 10c0/4a5a8f316a8482e799cd836c8e3f8ba83274b3631b2d66ec82ad839b0ee1dd3df50a08480f791d59f22e42bf6b707032f043a9f651445efc04e59b7ec9e669c9 languageName: node linkType: hard -"@shikijs/langs@npm:^3.17.0": - version: 3.17.0 - resolution: "@shikijs/langs@npm:3.17.0" +"@shikijs/langs@npm:^3.20.0": + version: 3.20.0 + resolution: "@shikijs/langs@npm:3.20.0" dependencies: - "@shikijs/types": "npm:3.17.0" - checksum: 10c0/7d44816e469802d0a80cfb76fe34a2dc759950536a4b2efbe70daa90b1afd5780b0015e43fb2af5d4dc93b9a65d60198b344c184d0c00772cd9959ec61707c4f + "@shikijs/types": "npm:3.20.0" + checksum: 10c0/6830460025d0df4c527ffeacf0a78cd4331ffde1cfcd1e8028aa9814be8a4cea84367dd938528a9b55de72b163c58ad3576915ea08c3d0a29ef1dc80e120116c languageName: node linkType: hard -"@shikijs/themes@npm:^3.17.0": - version: 3.17.0 - resolution: "@shikijs/themes@npm:3.17.0" +"@shikijs/themes@npm:^3.20.0": + version: 3.20.0 + resolution: "@shikijs/themes@npm:3.20.0" dependencies: - "@shikijs/types": "npm:3.17.0" - checksum: 10c0/a6dd8353b78963252d59aeed2536532a2834f2853e8d1eaf12e068b8d7e0cc605b3030c7d958f459a938b056e8778659bbd9e05ea23281683cb19b2e1e5990b6 + "@shikijs/types": "npm:3.20.0" + checksum: 10c0/d6fc059c51c3c0694e026cc1f80eed927d9b91adaeda0fb3fd5725eabc6d066aaf022919def435245446ae91e3da541ed6d88d875cf59a35bfbabb6920efb6da languageName: node linkType: hard -"@shikijs/types@npm:3.17.0, @shikijs/types@npm:^3.17.0": - version: 3.17.0 - resolution: "@shikijs/types@npm:3.17.0" +"@shikijs/types@npm:3.20.0, @shikijs/types@npm:^3.20.0": + version: 3.20.0 + resolution: "@shikijs/types@npm:3.20.0" dependencies: "@shikijs/vscode-textmate": "npm:^10.0.2" "@types/hast": "npm:^3.0.4" - checksum: 10c0/18ea167ce61716041a415f1c8d2249e80b748ae8ac3e188d59e30d5a0951911a63fd2bc46b908f5b2a4d4dd216af1461d7768aabb5e62236df3058214cfab64f + checksum: 10c0/7faea130362a6cdf3d66fcb47d6b609a8e0209e76ba86688f56a65411b6ae400a37414cd1a3a2fe1ee3fe39f18e274585d3972129c7e79244aaa0c15bc8f1c21 languageName: node linkType: hard @@ -1137,9 +1137,9 @@ __metadata: linkType: hard "@standard-schema/spec@npm:^1.0.0": - version: 1.0.0 - resolution: "@standard-schema/spec@npm:1.0.0" - checksum: 10c0/a1ab9a8bdc09b5b47aa8365d0e0ec40cc2df6437be02853696a0e377321653b0d3ac6f079a8c67d5ddbe9821025584b1fb71d9cc041a6666a96f1fadf2ece15f + version: 1.1.0 + resolution: "@standard-schema/spec@npm:1.1.0" + checksum: 10c0/d90f55acde4b2deb983529c87e8025fa693de1a5e8b49ecc6eb84d1fd96328add0e03d7d551442156c7432fd78165b2c26ff561b970a9a881f046abb78d6a526 languageName: node linkType: hard @@ -1199,23 +1199,7 @@ __metadata: languageName: node linkType: hard -"@types/lodash@npm:^4.17.20": - version: 4.17.21 - resolution: "@types/lodash@npm:4.17.21" - checksum: 10c0/73cb006e047d8871e9d63f3a165543bf16c44a5b6fe3f9f6299e37cb8d67a7b1d55ac730959a81f9def510fd07232ff7e30e05413e5d5a12793baad84ebe36c3 - languageName: node - linkType: hard - -"@types/node@npm:*": - version: 24.10.1 - resolution: "@types/node@npm:24.10.1" - dependencies: - undici-types: "npm:~7.16.0" - checksum: 10c0/d6bca7a78f550fbb376f236f92b405d676003a8a09a1b411f55920ef34286ee3ee51f566203920e835478784df52662b5b2af89159d9d319352e9ea21801c002 - languageName: node - linkType: hard - -"@types/node@npm:25.0.3": +"@types/node@npm:*, @types/node@npm:25.0.3": version: 25.0.3 resolution: "@types/node@npm:25.0.3" dependencies: @@ -1856,6 +1840,18 @@ __metadata: languageName: node linkType: hard +"es-toolkit@npm:^1.43.0": + version: 1.43.0 + resolution: "es-toolkit@npm:1.43.0" + dependenciesMeta: + "@trivago/prettier-plugin-sort-imports@4.3.0": + unplugged: true + prettier-plugin-sort-re-exports@0.0.1: + unplugged: true + checksum: 10c0/bbff0b591fd01be9f37a34dad7964b590e4952fc594c1230140771687f05136caa6ab21962a6e9cde7c4b529a149171ed5179d6379d4a8e656dbf7e8d126999c + languageName: node + linkType: hard + "es6-promise@npm:^3.2.1": version: 3.3.1 resolution: "es6-promise@npm:3.3.1" @@ -1863,36 +1859,36 @@ __metadata: languageName: node linkType: hard -"esbuild@npm:^0.25.0": - version: 0.25.12 - resolution: "esbuild@npm:0.25.12" - dependencies: - "@esbuild/aix-ppc64": "npm:0.25.12" - "@esbuild/android-arm": "npm:0.25.12" - "@esbuild/android-arm64": "npm:0.25.12" - "@esbuild/android-x64": "npm:0.25.12" - "@esbuild/darwin-arm64": "npm:0.25.12" - "@esbuild/darwin-x64": "npm:0.25.12" - "@esbuild/freebsd-arm64": "npm:0.25.12" - "@esbuild/freebsd-x64": "npm:0.25.12" - "@esbuild/linux-arm": "npm:0.25.12" - "@esbuild/linux-arm64": "npm:0.25.12" - "@esbuild/linux-ia32": "npm:0.25.12" - "@esbuild/linux-loong64": "npm:0.25.12" - "@esbuild/linux-mips64el": "npm:0.25.12" - "@esbuild/linux-ppc64": "npm:0.25.12" - "@esbuild/linux-riscv64": "npm:0.25.12" - "@esbuild/linux-s390x": "npm:0.25.12" - "@esbuild/linux-x64": "npm:0.25.12" - "@esbuild/netbsd-arm64": "npm:0.25.12" - "@esbuild/netbsd-x64": "npm:0.25.12" - "@esbuild/openbsd-arm64": "npm:0.25.12" - "@esbuild/openbsd-x64": "npm:0.25.12" - "@esbuild/openharmony-arm64": "npm:0.25.12" - "@esbuild/sunos-x64": "npm:0.25.12" - "@esbuild/win32-arm64": "npm:0.25.12" - "@esbuild/win32-ia32": "npm:0.25.12" - "@esbuild/win32-x64": "npm:0.25.12" +"esbuild@npm:^0.27.0": + version: 0.27.2 + resolution: "esbuild@npm:0.27.2" + dependencies: + "@esbuild/aix-ppc64": "npm:0.27.2" + "@esbuild/android-arm": "npm:0.27.2" + "@esbuild/android-arm64": "npm:0.27.2" + "@esbuild/android-x64": "npm:0.27.2" + "@esbuild/darwin-arm64": "npm:0.27.2" + "@esbuild/darwin-x64": "npm:0.27.2" + "@esbuild/freebsd-arm64": "npm:0.27.2" + "@esbuild/freebsd-x64": "npm:0.27.2" + "@esbuild/linux-arm": "npm:0.27.2" + "@esbuild/linux-arm64": "npm:0.27.2" + "@esbuild/linux-ia32": "npm:0.27.2" + "@esbuild/linux-loong64": "npm:0.27.2" + "@esbuild/linux-mips64el": "npm:0.27.2" + "@esbuild/linux-ppc64": "npm:0.27.2" + "@esbuild/linux-riscv64": "npm:0.27.2" + "@esbuild/linux-s390x": "npm:0.27.2" + "@esbuild/linux-x64": "npm:0.27.2" + "@esbuild/netbsd-arm64": "npm:0.27.2" + "@esbuild/netbsd-x64": "npm:0.27.2" + "@esbuild/openbsd-arm64": "npm:0.27.2" + "@esbuild/openbsd-x64": "npm:0.27.2" + "@esbuild/openharmony-arm64": "npm:0.27.2" + "@esbuild/sunos-x64": "npm:0.27.2" + "@esbuild/win32-arm64": "npm:0.27.2" + "@esbuild/win32-ia32": "npm:0.27.2" + "@esbuild/win32-x64": "npm:0.27.2" dependenciesMeta: "@esbuild/aix-ppc64": optional: true @@ -1948,7 +1944,7 @@ __metadata: optional: true bin: esbuild: bin/esbuild - checksum: 10c0/c205357531423220a9de8e1e6c6514242bc9b1666e762cd67ccdf8fdfdc3f1d0bd76f8d9383958b97ad4c953efdb7b6e8c1f9ca5951cd2b7c5235e8755b34a6b + checksum: 10c0/cf83f626f55500f521d5fe7f4bc5871bec240d3deb2a01fbd379edc43b3664d1167428738a5aad8794b35d1cca985c44c375b1cd38a2ca613c77ced2c83aafcd languageName: node linkType: hard @@ -1986,9 +1982,9 @@ __metadata: linkType: hard "expect-type@npm:^1.2.2": - version: 1.2.2 - resolution: "expect-type@npm:1.2.2" - checksum: 10c0/6019019566063bbc7a690d9281d920b1a91284a4a093c2d55d71ffade5ac890cf37a51e1da4602546c4b56569d2ad2fc175a2ccee77d1ae06cb3af91ef84f44b + version: 1.3.0 + resolution: "expect-type@npm:1.3.0" + checksum: 10c0/8412b3fe4f392c420ab41dae220b09700e4e47c639a29ba7ba2e83cc6cffd2b4926f7ac9e47d7e277e8f4f02acda76fd6931cb81fd2b382fa9477ef9ada953fd languageName: node linkType: hard @@ -2356,11 +2352,11 @@ __metadata: linkType: hard "iconv-lite@npm:^0.7.0": - version: 0.7.0 - resolution: "iconv-lite@npm:0.7.0" + version: 0.7.1 + resolution: "iconv-lite@npm:0.7.1" dependencies: safer-buffer: "npm:>= 2.1.2 < 3.0.0" - checksum: 10c0/2382400469071c55b6746c531eed5fa4d033e5db6690b7331fb2a5f59a30d7a9782932e92253db26df33c1cf46fa200a3fbe524a2a7c62037c762283f188ec2f + checksum: 10c0/f5c9e2bddd7101a71b07a381ace44ebdc65ca76a10be0e9e64d372b511132acc4ee41b830962f438840d492cd6f9e08c237289f760d6a7fed754e61cffcb6757 languageName: node linkType: hard @@ -2372,9 +2368,9 @@ __metadata: linkType: hard "import-without-cache@npm:^0.2.4": - version: 0.2.4 - resolution: "import-without-cache@npm:0.2.4" - checksum: 10c0/e844ca9fd44885c12a57821a01eafcef5a5e02e0764b967c60db0330104931c7db390fb504febe84072dc9b4d4d16c860c55a51202e1cb222d3fbffd1585a9c6 + version: 0.2.5 + resolution: "import-without-cache@npm:0.2.5" + checksum: 10c0/5cf7a00e317a23569f16c87391170270277c073cba498c913bf043af56c56118d023c8d041046535566135c34503c90a9320483448b070a4ab4ae29949547a71 languageName: node linkType: hard @@ -2530,17 +2526,10 @@ __metadata: languageName: node linkType: hard -"lodash@npm:^4.17.21": - version: 4.17.21 - resolution: "lodash@npm:4.17.21" - checksum: 10c0/d8cbea072bb08655bb4c989da418994b073a608dffa608b09ac04b43a791b12aeae7cd7ad919aa4c925f33b48490b5cfe6c1f71d827956071dae2e7bb3a6b74c - languageName: node - linkType: hard - "lru-cache@npm:^11.0.0, lru-cache@npm:^11.1.0, lru-cache@npm:^11.2.1": - version: 11.2.2 - resolution: "lru-cache@npm:11.2.2" - checksum: 10c0/72d7831bbebc85e2bdefe01047ee5584db69d641c48d7a509e86f66f6ee111b30af7ec3bd68a967d47b69a4b1fa8bbf3872630bd06a63b6735e6f0a5f1c8e83d + version: 11.2.4 + resolution: "lru-cache@npm:11.2.4" + checksum: 10c0/4a24f9b17537619f9144d7b8e42cd5a225efdfd7076ebe7b5e7dc02b860a818455201e67fbf000765233fe7e339d3c8229fc815e9b58ee6ede511e07608c19b2 languageName: node linkType: hard @@ -2759,15 +2748,6 @@ __metadata: languageName: node linkType: hard -"nanoid@npm:^5.1.6": - version: 5.1.6 - resolution: "nanoid@npm:5.1.6" - bin: - nanoid: bin/nanoid.js - checksum: 10c0/27b5b055ad8332cf4f0f9f6e2a494aa7e5ded89df4cab8c8490d4eabefe72c4423971d2745d22002868b1d50576a5e42b7b05214733b19f576382323282dd26e - languageName: node - linkType: hard - "negotiator@npm:^1.0.0": version: 1.0.0 resolution: "negotiator@npm:1.0.0" @@ -3314,31 +3294,31 @@ __metadata: linkType: hard "rollup@npm:^4.43.0": - version: 4.53.3 - resolution: "rollup@npm:4.53.3" - dependencies: - "@rollup/rollup-android-arm-eabi": "npm:4.53.3" - "@rollup/rollup-android-arm64": "npm:4.53.3" - "@rollup/rollup-darwin-arm64": "npm:4.53.3" - "@rollup/rollup-darwin-x64": "npm:4.53.3" - "@rollup/rollup-freebsd-arm64": "npm:4.53.3" - "@rollup/rollup-freebsd-x64": "npm:4.53.3" - "@rollup/rollup-linux-arm-gnueabihf": "npm:4.53.3" - "@rollup/rollup-linux-arm-musleabihf": "npm:4.53.3" - "@rollup/rollup-linux-arm64-gnu": "npm:4.53.3" - "@rollup/rollup-linux-arm64-musl": "npm:4.53.3" - "@rollup/rollup-linux-loong64-gnu": "npm:4.53.3" - "@rollup/rollup-linux-ppc64-gnu": "npm:4.53.3" - "@rollup/rollup-linux-riscv64-gnu": "npm:4.53.3" - "@rollup/rollup-linux-riscv64-musl": "npm:4.53.3" - "@rollup/rollup-linux-s390x-gnu": "npm:4.53.3" - "@rollup/rollup-linux-x64-gnu": "npm:4.53.3" - "@rollup/rollup-linux-x64-musl": "npm:4.53.3" - "@rollup/rollup-openharmony-arm64": "npm:4.53.3" - "@rollup/rollup-win32-arm64-msvc": "npm:4.53.3" - "@rollup/rollup-win32-ia32-msvc": "npm:4.53.3" - "@rollup/rollup-win32-x64-gnu": "npm:4.53.3" - "@rollup/rollup-win32-x64-msvc": "npm:4.53.3" + version: 4.54.0 + resolution: "rollup@npm:4.54.0" + dependencies: + "@rollup/rollup-android-arm-eabi": "npm:4.54.0" + "@rollup/rollup-android-arm64": "npm:4.54.0" + "@rollup/rollup-darwin-arm64": "npm:4.54.0" + "@rollup/rollup-darwin-x64": "npm:4.54.0" + "@rollup/rollup-freebsd-arm64": "npm:4.54.0" + "@rollup/rollup-freebsd-x64": "npm:4.54.0" + "@rollup/rollup-linux-arm-gnueabihf": "npm:4.54.0" + "@rollup/rollup-linux-arm-musleabihf": "npm:4.54.0" + "@rollup/rollup-linux-arm64-gnu": "npm:4.54.0" + "@rollup/rollup-linux-arm64-musl": "npm:4.54.0" + "@rollup/rollup-linux-loong64-gnu": "npm:4.54.0" + "@rollup/rollup-linux-ppc64-gnu": "npm:4.54.0" + "@rollup/rollup-linux-riscv64-gnu": "npm:4.54.0" + "@rollup/rollup-linux-riscv64-musl": "npm:4.54.0" + "@rollup/rollup-linux-s390x-gnu": "npm:4.54.0" + "@rollup/rollup-linux-x64-gnu": "npm:4.54.0" + "@rollup/rollup-linux-x64-musl": "npm:4.54.0" + "@rollup/rollup-openharmony-arm64": "npm:4.54.0" + "@rollup/rollup-win32-arm64-msvc": "npm:4.54.0" + "@rollup/rollup-win32-ia32-msvc": "npm:4.54.0" + "@rollup/rollup-win32-x64-gnu": "npm:4.54.0" + "@rollup/rollup-win32-x64-msvc": "npm:4.54.0" "@types/estree": "npm:1.0.8" fsevents: "npm:~2.3.2" dependenciesMeta: @@ -3390,7 +3370,7 @@ __metadata: optional: true bin: rollup: dist/bin/rollup - checksum: 10c0/a21305aac72013083bd0dec92162b0f7f24cacf57c876ca601ec76e892895952c9ea592c1c07f23b8c125f7979c2b17f7fb565e386d03ee4c1f0952ac4ab0d75 + checksum: 10c0/62e5fd5d43e72751ac631f13fd7e70bec0fc3809231d5e087c3c0811945e7b8f0956620c5bed4e0cd67085325324266989e5ea4d22985c2677119ac7809b6455 languageName: node linkType: hard @@ -3632,7 +3612,6 @@ __metadata: "@changesets/cli": "npm:2.29.8" "@tsconfig/node20": "npm:20.1.8" "@tsconfig/strictest": "npm:2.0.8" - "@types/lodash": "npm:^4.17.20" "@types/node": "npm:25.0.3" "@types/swagger-schema-official": "npm:^2.0.25" "@types/swagger2openapi": "npm:7.0.4" @@ -3640,9 +3619,8 @@ __metadata: c12: "npm:^3.3.0" citty: "npm:^0.1.6" consola: "npm:^3.4.2" + es-toolkit: "npm:^1.43.0" eta: "npm:^3.5.0" - lodash: "npm:^4.17.21" - nanoid: "npm:^5.1.6" openapi-types: "npm:^12.1.3" swagger-schema-official: "npm:2.0.0-bab6bed" swagger2openapi: "npm:^7.0.8" @@ -3652,8 +3630,8 @@ __metadata: vitest: "npm:4.0.16" yaml: "npm:^2.8.1" bin: - sta: ./dist/cli.js - swagger-typescript-api: ./dist/cli.js + sta: ./dist/cli.mjs + swagger-typescript-api: ./dist/cli.mjs languageName: unknown linkType: soft @@ -3912,10 +3890,10 @@ __metadata: linkType: hard "vite@npm:^6.0.0 || ^7.0.0": - version: 7.2.4 - resolution: "vite@npm:7.2.4" + version: 7.3.0 + resolution: "vite@npm:7.3.0" dependencies: - esbuild: "npm:^0.25.0" + esbuild: "npm:^0.27.0" fdir: "npm:^6.5.0" fsevents: "npm:~2.3.3" picomatch: "npm:^4.0.3" @@ -3962,7 +3940,7 @@ __metadata: optional: true bin: vite: bin/vite.js - checksum: 10c0/26aa0cad01d6e00f17c837b2a0587ab52f6bd0d0e64606b4220cfc58fa5fa76a4095ef3ea27c886bea542a346363912c4fad9f9462ef1e6757262fedfd5196b2 + checksum: 10c0/0457c196cdd5761ec351c0f353945430fbad330e615b9eeab729c8ae163334f18acdc1d9cd7d9d673dbf111f07f6e4f0b25d4ac32360e65b4a6df9991046f3ff languageName: node linkType: hard