ts-openapi-codegen 2.1.0-beta.7 → 2.1.0-beta.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -0
- package/README.rus.md +7 -0
- package/dist/cli/analyzeDiff/__tests__/analyzeDiff.cli.test.js +31 -24
- package/dist/cli/analyzeDiff/__tests__/analyzeDiffLomMiracles.test.d.ts +2 -0
- package/dist/cli/analyzeDiff/__tests__/analyzeDiffLomMiracles.test.d.ts.map +1 -0
- package/dist/cli/analyzeDiff/__tests__/analyzeDiffLomMiracles.test.js +47 -0
- package/dist/cli/analyzeDiff/__tests__/analyzeDiffRenameAndInvalidRegex.test.js +8 -7
- package/dist/cli/analyzeDiff/__tests__/analyzeDiffTypeCoercion.test.js +8 -7
- package/dist/cli/analyzeDiff/analyzeDiff.d.ts +14 -2
- package/dist/cli/analyzeDiff/analyzeDiff.d.ts.map +1 -1
- package/dist/cli/analyzeDiff/analyzeDiff.js +56 -13
- package/dist/cli/analyzeDiff/ciSummary.d.ts +6 -3
- package/dist/cli/analyzeDiff/ciSummary.d.ts.map +1 -1
- package/dist/cli/analyzeDiff/ciSummary.js +10 -6
- package/dist/cli/analyzeDiff/ignoreRules.d.ts +0 -6
- package/dist/cli/analyzeDiff/ignoreRules.d.ts.map +1 -1
- package/dist/cli/analyzeDiff/ignoreRules.js +2 -3
- package/dist/cli/analyzeDiff/report.d.ts +0 -1
- package/dist/cli/analyzeDiff/report.d.ts.map +1 -1
- package/dist/cli/analyzeDiff/report.js +1 -3
- package/dist/cli/analyzeDiff/writeLegacyReport.d.ts +2 -0
- package/dist/cli/analyzeDiff/writeLegacyReport.d.ts.map +1 -1
- package/dist/cli/analyzeDiff/writeLegacyReport.js +2 -0
- package/dist/cli/analyzeUsage/analyzeUsage.d.ts +2 -2
- package/dist/cli/analyzeUsage/analyzeUsage.d.ts.map +1 -1
- package/dist/cli/analyzeUsage/analyzeUsage.js +10 -12
- package/dist/cli/analyzeUsage/core/ProjectContext.d.ts +1 -1
- package/dist/cli/analyzeUsage/core/ProjectContext.d.ts.map +1 -1
- package/dist/cli/analyzeUsage/core/ProjectContext.js +5 -10
- package/dist/cli/analyzeUsage/core/Scanner.d.ts +8 -0
- package/dist/cli/analyzeUsage/core/Scanner.d.ts.map +1 -1
- package/dist/cli/analyzeUsage/core/Scanner.js +10 -0
- package/dist/cli/analyzeUsage/rules/ClientRule.d.ts +10 -2
- package/dist/cli/analyzeUsage/rules/ClientRule.d.ts.map +1 -1
- package/dist/cli/analyzeUsage/rules/ClientRule.js +29 -21
- package/dist/cli/analyzeUsage/rules/CoverageRule.d.ts +2 -2
- package/dist/cli/analyzeUsage/rules/CoverageRule.d.ts.map +1 -1
- package/dist/cli/analyzeUsage/rules/CoverageRule.js +16 -24
- package/dist/cli/analyzeUsage/rules/DiagnosticsRule.d.ts.map +1 -1
- package/dist/cli/analyzeUsage/rules/DiagnosticsRule.js +4 -1
- package/dist/cli/analyzeUsage/rules/ImportRule.d.ts +2 -2
- package/dist/cli/analyzeUsage/rules/ImportRule.d.ts.map +1 -1
- package/dist/cli/analyzeUsage/rules/ImportRule.js +9 -11
- package/dist/cli/analyzeUsage/rules/ModelRule.d.ts +2 -2
- package/dist/cli/analyzeUsage/rules/ModelRule.d.ts.map +1 -1
- package/dist/cli/analyzeUsage/rules/ModelRule.js +4 -8
- package/dist/cli/analyzeUsage/rules/SchemaRule.d.ts +2 -2
- package/dist/cli/analyzeUsage/rules/SchemaRule.d.ts.map +1 -1
- package/dist/cli/analyzeUsage/rules/SchemaRule.js +8 -10
- package/dist/cli/analyzeUsage/rules/ServiceRule.d.ts +10 -2
- package/dist/cli/analyzeUsage/rules/ServiceRule.d.ts.map +1 -1
- package/dist/cli/analyzeUsage/rules/ServiceRule.js +27 -23
- package/dist/cli/analyzeUsage/types.d.ts +4 -4
- package/dist/cli/analyzeUsage/types.d.ts.map +1 -1
- package/dist/cli/analyzeUsage/utils/fuzzy.d.ts.map +1 -1
- package/dist/cli/analyzeUsage/utils/report.d.ts +1 -1
- package/dist/cli/analyzeUsage/utils/report.d.ts.map +1 -1
- package/dist/cli/analyzeUsage/utils/report.js +8 -8
- package/dist/cli/checkAndUpdateConfig/utils/removeDefaultConfigValues.d.ts.map +1 -1
- package/dist/cli/checkAndUpdateConfig/utils/validateAndMigrateConfigData.d.ts.map +1 -1
- package/dist/cli/checkAndUpdateConfig/utils/validateAndMigrateConfigData.js +1 -1
- package/dist/cli/checkAndUpdateConfig/utils/writeConfigFile.d.ts +1 -1
- package/dist/cli/checkAndUpdateConfig/utils/writeConfigFile.d.ts.map +1 -1
- package/dist/cli/checkAndUpdateConfig/utils/writeConfigFile.js +1 -1
- package/dist/cli/generateOpenApiClient/generateOpenApiClient.d.ts.map +1 -1
- package/dist/cli/generateOpenApiClient/generateOpenApiClient.js +9 -1
- package/dist/cli/index.js +3 -2
- package/dist/cli/initOpenApiConfig/utils/__tests__/buildConfig.test.js +2 -8
- package/dist/cli/initOpenApiConfig/utils/registerHandlebarTemplates.d.ts.map +1 -1
- package/dist/cli/interactive/constants.d.ts +0 -4
- package/dist/cli/interactive/constants.d.ts.map +1 -1
- package/dist/cli/interactive/constants.js +1 -5
- package/dist/cli/previewChanges/previewChanges.d.ts.map +1 -1
- package/dist/cli/previewChanges/utils/formatDiff.d.ts.map +1 -1
- package/dist/cli/previewChanges/utils/updateOutputPaths.d.ts.map +1 -1
- package/dist/cli/previewChanges/utils/updateOutputPaths.js +5 -12
- package/dist/cli/schemas/analyzeUsage.d.ts.map +1 -1
- package/dist/cli/schemas/analyzeUsage.js +4 -1
- package/dist/cli/schemas/generate.d.ts +3 -2
- package/dist/cli/schemas/generate.d.ts.map +1 -1
- package/dist/cli/schemas/generate.js +3 -2
- package/dist/common/Consts.d.ts.map +1 -1
- package/dist/common/Consts.js +1 -2
- package/dist/common/Logger.d.ts.map +1 -1
- package/dist/common/Logger.js +1 -1
- package/dist/common/LoggerMessages.d.ts +15 -3
- package/dist/common/LoggerMessages.d.ts.map +1 -1
- package/dist/common/LoggerMessages.js +18 -7
- package/dist/common/TEslintFixOptions.d.ts +20 -0
- package/dist/common/TEslintFixOptions.d.ts.map +1 -0
- package/dist/common/TEslintFixOptions.js +15 -0
- package/dist/common/TRawOptions.d.ts.map +1 -1
- package/dist/common/VersionedSchema/AllVersionedSchemas/AllMigrationPlans.d.ts.map +1 -1
- package/dist/common/VersionedSchema/AllVersionedSchemas/AllMigrationPlans.js +2 -4
- package/dist/common/VersionedSchema/AllVersionedSchemas/AllVersionedSchemas.d.ts.map +1 -1
- package/dist/common/VersionedSchema/AllVersionedSchemas/AllVersionedSchemas.js +1 -1
- package/dist/common/VersionedSchema/AllVersionedSchemas/UnifiedBase.d.ts.map +1 -1
- package/dist/common/VersionedSchema/AllVersionedSchemas/UnifiedBase.js +1 -2
- package/dist/common/VersionedSchema/AllVersionedSchemas/UnifiedOptionsSchemaV1.d.ts.map +1 -1
- package/dist/common/VersionedSchema/AllVersionedSchemas/UnifiedOptionsSchemaV1.js +1 -1
- package/dist/common/VersionedSchema/AllVersionedSchemas/UnifiedOptionsSchemaV2.d.ts.map +1 -1
- package/dist/common/VersionedSchema/AllVersionedSchemas/UnifiedOptionsSchemaV2.js +1 -1
- package/dist/common/VersionedSchema/AllVersionedSchemas/UnifiedOptionsSchemaV4.d.ts.map +1 -1
- package/dist/common/VersionedSchema/AllVersionedSchemas/UnifiedOptionsSchemaV5.d.ts +3 -2
- package/dist/common/VersionedSchema/AllVersionedSchemas/UnifiedOptionsSchemaV5.d.ts.map +1 -1
- package/dist/common/VersionedSchema/AllVersionedSchemas/UnifiedOptionsSchemaV5.js +10 -4
- package/dist/common/VersionedSchema/AllVersionedSchemas/UnifiedVersionedSchemas.d.ts +4 -4
- package/dist/common/VersionedSchema/AllVersionedSchemas/UnifiedVersionedSchemas.d.ts.map +1 -1
- package/dist/common/VersionedSchema/AllVersionedSchemas/UnifiedVersionedSchemas.js +7 -1
- package/dist/common/VersionedSchema/CommonSchemas.d.ts.map +1 -1
- package/dist/common/VersionedSchema/CommonSchemas.js +4 -2
- package/dist/common/VersionedSchema/MultiOptionsVersioned/MultiOptionsSchemaV2.js +1 -1
- package/dist/common/VersionedSchema/MultiOptionsVersioned/MultiOptionsSchemaV3.d.ts.map +1 -1
- package/dist/common/VersionedSchema/MultiOptionsVersioned/MultiOptionsSchemaV3.js +1 -1
- package/dist/common/VersionedSchema/MultiOptionsVersioned/MultiOptionsSchemaV4.js +1 -1
- package/dist/common/VersionedSchema/MultiOptionsVersioned/MultiOptionsSchemaV5.d.ts.map +1 -1
- package/dist/common/VersionedSchema/OptionsVersioned/OptionsMigrationPlans.d.ts.map +1 -1
- package/dist/common/VersionedSchema/OptionsVersioned/OptionsSchemaV1.d.ts +2 -2
- package/dist/common/VersionedSchema/OptionsVersioned/OptionsSchemaV1.d.ts.map +1 -1
- package/dist/common/VersionedSchema/OptionsVersioned/OptionsSchemaV2.d.ts +2 -2
- package/dist/common/VersionedSchema/OptionsVersioned/OptionsSchemaV3.js +1 -1
- package/dist/common/VersionedSchema/OptionsVersioned/OptionsSchemaV4.d.ts +1 -1
- package/dist/common/VersionedSchema/Utils/__mocks__/compatibilityCases.d.ts.map +1 -1
- package/dist/common/VersionedSchema/Utils/__mocks__/compatibilityCases.js +3 -2
- package/dist/common/VersionedSchema/Utils/__tests__/allUtils.test.js +4 -16
- package/dist/common/VersionedSchema/Utils/buildVersionedSchema.d.ts.map +1 -1
- package/dist/common/VersionedSchema/Utils/createDefaultFieldsMigration.d.ts +1 -1
- package/dist/common/VersionedSchema/Utils/createDefaultFieldsMigration.d.ts.map +1 -1
- package/dist/common/VersionedSchema/Utils/createDefaultFieldsMigration.js +1 -1
- package/dist/common/VersionedSchema/Utils/createTrivialMigration.d.ts.map +1 -1
- package/dist/common/VersionedSchema/Utils/createTrivialMigration.js +1 -1
- package/dist/common/VersionedSchema/Utils/determineBestMatchingSchemaVersion.d.ts.map +1 -1
- package/dist/common/VersionedSchema/Utils/determineBestMatchingSchemaVersion.js +1 -3
- package/dist/common/VersionedSchema/Utils/getLatestVersionFromMigrationPlans.d.ts.map +1 -1
- package/dist/common/VersionedSchema/Utils/migrateDataToLatestSchemaVersion.d.ts.map +1 -1
- package/dist/common/VersionedSchema/Utils/migrateDataToLatestSchemaVersion.js +1 -3
- package/dist/common/VersionedSchema/Utils/replaceInvalidKeysWithMappedNames.d.ts.map +1 -1
- package/dist/common/VersionedSchema/Utils/replaceInvalidKeysWithMappedNames.js +1 -1
- package/dist/common/VersionedSchema/Utils/validateAndSuggestKeyCorrections.d.ts.map +1 -1
- package/dist/common/VersionedSchema/refinements/dependentOptionsRefinement.d.ts +1 -1
- package/dist/common/VersionedSchema/refinements/dependentOptionsRefinement.d.ts.map +1 -1
- package/dist/common/utils/__tests__/eslintFix.test.js +25 -67
- package/dist/common/utils/__tests__/extractEslintFixOptions.test.d.ts +2 -0
- package/dist/common/utils/__tests__/extractEslintFixOptions.test.d.ts.map +1 -0
- package/dist/common/utils/__tests__/extractEslintFixOptions.test.js +28 -0
- package/dist/common/utils/__tests__/format.test.js +26 -17
- package/dist/common/utils/__tests__/prepareTempTsConfig.test.d.ts +2 -0
- package/dist/common/utils/__tests__/prepareTempTsConfig.test.d.ts.map +1 -0
- package/dist/common/utils/__tests__/prepareTempTsConfig.test.js +78 -0
- package/dist/common/utils/codegenTempDir.d.ts +20 -0
- package/dist/common/utils/codegenTempDir.d.ts.map +1 -0
- package/dist/common/utils/codegenTempDir.js +42 -0
- package/dist/common/utils/convertArrayToObject.d.ts.map +1 -1
- package/dist/common/utils/convertArrayToObject.js +3 -8
- package/dist/common/utils/eslintFix.d.ts +48 -4
- package/dist/common/utils/eslintFix.d.ts.map +1 -1
- package/dist/common/utils/eslintFix.js +121 -15
- package/dist/common/utils/format.d.ts +1 -1
- package/dist/common/utils/format.d.ts.map +1 -1
- package/dist/common/utils/format.js +23 -11
- package/dist/common/utils/jsonPath.d.ts.map +1 -1
- package/dist/common/utils/prepareTempEslintConfig.d.ts +18 -0
- package/dist/common/utils/prepareTempEslintConfig.d.ts.map +1 -0
- package/dist/common/utils/prepareTempEslintConfig.js +55 -0
- package/dist/common/utils/prepareTempTsConfig.d.ts +23 -0
- package/dist/common/utils/prepareTempTsConfig.d.ts.map +1 -0
- package/dist/common/utils/prepareTempTsConfig.js +105 -0
- package/dist/core/Context.d.ts.map +1 -1
- package/dist/core/Context.js +2 -6
- package/dist/core/OpenApiClient.d.ts +15 -0
- package/dist/core/OpenApiClient.d.ts.map +1 -1
- package/dist/core/OpenApiClient.js +68 -10
- package/dist/core/WriteClient.d.ts +73 -17
- package/dist/core/WriteClient.d.ts.map +1 -1
- package/dist/core/WriteClient.js +72 -18
- package/dist/core/__tests__/WriteClient.test.js +1 -1
- package/dist/core/api/v2/parser/getOperationResponses.d.ts.map +1 -1
- package/dist/core/api/v2/parser/getOperationResponses.js +1 -3
- package/dist/core/api/v2/parser/getServiceName.d.ts +1 -1
- package/dist/core/api/v3/parser/getOperation.d.ts.map +1 -1
- package/dist/core/api/v3/parser/getOperationParameters.d.ts.map +1 -1
- package/dist/core/api/v3/parser/getOperationResponses.d.ts.map +1 -1
- package/dist/core/api/v3/parser/getOperationResponses.js +1 -3
- package/dist/core/api/v3/parser/getServiceName.d.ts +1 -1
- package/dist/core/governance/evaluateGovernanceRules.d.ts.map +1 -1
- package/dist/core/governance/evaluateGovernanceRules.js +1 -3
- package/dist/core/governance/loadGovernanceConfig.d.ts.map +1 -1
- package/dist/core/governance/loadGovernanceConfig.js +2 -4
- package/dist/core/plugins/GeneratorPlugin.model.d.ts.map +1 -1
- package/dist/core/plugins/applySemanticDiffPluginHooks.d.ts.map +1 -1
- package/dist/core/semanticDiff/__tests__/analyzeOpenApiDiff.test.js +79 -21
- package/dist/core/semanticDiff/__tests__/semanticDiffReportSchema.test.js +20 -1
- package/dist/core/semanticDiff/analyzeOpenApiDiff.d.ts +58 -6
- package/dist/core/semanticDiff/analyzeOpenApiDiff.d.ts.map +1 -1
- package/dist/core/semanticDiff/analyzeOpenApiDiff.js +47 -19
- package/dist/core/semanticDiff/semanticDiffReportSchema.d.ts +9 -1
- package/dist/core/semanticDiff/semanticDiffReportSchema.d.ts.map +1 -1
- package/dist/core/semanticDiff/semanticDiffReportSchema.js +137 -53
- package/dist/core/strict/validateOpenApiStrict.d.ts.map +1 -1
- package/dist/core/types/Consts.js +1 -1
- package/dist/core/types/DiffReport.model.d.ts +101 -0
- package/dist/core/types/DiffReport.model.d.ts.map +1 -0
- package/dist/core/types/DiffReport.model.js +5 -0
- package/dist/core/types/base/ClientArtifacts.model.d.ts +3 -3
- package/dist/core/types/base/ClientArtifacts.model.d.ts.map +1 -1
- package/dist/core/types/base/ExportedModel.model.d.ts +1 -1
- package/dist/core/types/base/ExportedModel.model.d.ts.map +1 -1
- package/dist/core/types/base/ExportedService.model.d.ts.map +1 -1
- package/dist/core/types/base/OutputPaths.model.d.ts.map +1 -1
- package/dist/core/types/base/PrefixArtifacts.model.d.ts.map +1 -1
- package/dist/core/types/base/PropertyGroup.model.d.ts +1 -1
- package/dist/core/types/base/SimpleClientArtifacts.model.d.ts +1 -1
- package/dist/core/types/base/SimpleClientArtifacts.model.d.ts.map +1 -1
- package/dist/core/types/shared/Model.model.d.ts +36 -0
- package/dist/core/types/shared/Model.model.d.ts.map +1 -1
- package/dist/core/utils/__tests__/applyDiffReportToClient.test.js +182 -0
- package/dist/core/utils/__tests__/buildMiraclesFromSemanticChanges.test.d.ts +2 -0
- package/dist/core/utils/__tests__/buildMiraclesFromSemanticChanges.test.d.ts.map +1 -0
- package/dist/core/utils/__tests__/buildMiraclesFromSemanticChanges.test.js +77 -0
- package/dist/core/utils/__tests__/expandOpenApiRefsForSemanticDiff.test.d.ts +2 -0
- package/dist/core/utils/__tests__/expandOpenApiRefsForSemanticDiff.test.d.ts.map +1 -0
- package/dist/core/utils/__tests__/expandOpenApiRefsForSemanticDiff.test.js +159 -0
- package/dist/core/utils/__tests__/loadDiffReport.test.js +131 -0
- package/dist/core/utils/__tests__/modelHelpers.test.js +27 -9
- package/dist/core/utils/__tests__/postProcessModelImports.test.js +1 -4
- package/dist/core/utils/__tests__/postProcessServiceImports.test.js +1 -4
- package/dist/core/utils/__tests__/prepareDtoModels.test.js +74 -2
- package/dist/core/utils/__tests__/registerHandlebarHelpers.test.js +27 -0
- package/dist/core/utils/__tests__/resolveClassesModeTypes.test.d.ts +2 -0
- package/dist/core/utils/__tests__/resolveClassesModeTypes.test.d.ts.map +1 -0
- package/dist/core/utils/__tests__/resolveClassesModeTypes.test.js +111 -0
- package/dist/core/utils/__tests__/semanticChangesToDiffEntries.test.d.ts +2 -0
- package/dist/core/utils/__tests__/semanticChangesToDiffEntries.test.d.ts.map +1 -0
- package/dist/core/utils/__tests__/semanticChangesToDiffEntries.test.js +68 -0
- package/dist/core/utils/__tests__/serviceHelpers.test.js +10 -11
- package/dist/core/utils/__tests__/sortByRequiredExtended.test.js +10 -27
- package/dist/core/utils/__tests__/templateRendering.test.js +71 -0
- package/dist/core/utils/adapters/__tests__/semanticToStructural.test.d.ts +2 -0
- package/dist/core/utils/adapters/__tests__/semanticToStructural.test.d.ts.map +1 -0
- package/dist/core/utils/adapters/__tests__/semanticToStructural.test.js +63 -0
- package/dist/core/utils/adapters/extractMiraclesFromSemantic.d.ts +10 -0
- package/dist/core/utils/adapters/extractMiraclesFromSemantic.d.ts.map +1 -0
- package/dist/core/utils/adapters/extractMiraclesFromSemantic.js +13 -0
- package/dist/core/utils/adapters/index.d.ts +4 -0
- package/dist/core/utils/adapters/index.d.ts.map +1 -0
- package/dist/core/utils/adapters/index.js +8 -0
- package/dist/core/utils/adapters/semanticToStructural.d.ts +12 -0
- package/dist/core/utils/adapters/semanticToStructural.d.ts.map +1 -0
- package/dist/core/utils/adapters/semanticToStructural.js +36 -0
- package/dist/core/utils/appendUniqueLinesToFile.js +1 -1
- package/dist/core/utils/applyDiffReportToClient.d.ts +13 -1
- package/dist/core/utils/applyDiffReportToClient.d.ts.map +1 -1
- package/dist/core/utils/applyDiffReportToClient.js +189 -109
- package/dist/core/utils/areEqual.d.ts +1 -1
- package/dist/core/utils/buildMiraclesFromSemanticChanges.d.ts +25 -0
- package/dist/core/utils/buildMiraclesFromSemanticChanges.d.ts.map +1 -0
- package/dist/core/utils/buildMiraclesFromSemanticChanges.js +146 -0
- package/dist/core/utils/expandOpenApiRefsForSemanticDiff.d.ts +23 -0
- package/dist/core/utils/expandOpenApiRefsForSemanticDiff.d.ts.map +1 -0
- package/dist/core/utils/expandOpenApiRefsForSemanticDiff.js +163 -0
- package/dist/core/utils/getOpenApiSpec.d.ts +18 -0
- package/dist/core/utils/getOpenApiSpec.d.ts.map +1 -1
- package/dist/core/utils/getOpenApiSpec.js +35 -0
- package/dist/core/utils/getOperationErrors.d.ts +2 -2
- package/dist/core/utils/getOperationErrors.d.ts.map +1 -1
- package/dist/core/utils/getOperationResults.d.ts +1 -1
- package/dist/core/utils/getPropertyGroupSimple.d.ts.map +1 -1
- package/dist/core/utils/getPropertyGroupSimple.js +1 -3
- package/dist/core/utils/isSubdirectory.d.ts.map +1 -1
- package/dist/core/utils/loadDiffReport.d.ts +11 -30
- package/dist/core/utils/loadDiffReport.d.ts.map +1 -1
- package/dist/core/utils/loadDiffReport.js +69 -3
- package/dist/core/utils/loadSemanticOpenApiSpec.d.ts +15 -0
- package/dist/core/utils/loadSemanticOpenApiSpec.d.ts.map +1 -0
- package/dist/core/utils/loadSemanticOpenApiSpec.js +61 -0
- package/dist/core/utils/modelHelpers.d.ts +13 -5
- package/dist/core/utils/modelHelpers.d.ts.map +1 -1
- package/dist/core/utils/modelHelpers.js +28 -23
- package/dist/core/utils/normalizeString.d.ts.map +1 -1
- package/dist/core/utils/normalizeString.js +1 -5
- package/dist/core/utils/postProcessServiceImports.d.ts.map +1 -1
- package/dist/core/utils/postProcessServiceImports.js +1 -3
- package/dist/core/utils/precompileTemplates.js +1 -0
- package/dist/core/utils/prepareAlias.d.ts +1 -1
- package/dist/core/utils/prepareDtoModels.d.ts +5 -0
- package/dist/core/utils/prepareDtoModels.d.ts.map +1 -1
- package/dist/core/utils/prepareDtoModels.js +56 -13
- package/dist/core/utils/registerHandlebarHelpers.d.ts +1 -0
- package/dist/core/utils/registerHandlebarHelpers.d.ts.map +1 -1
- package/dist/core/utils/registerHandlebarHelpers.js +3 -0
- package/dist/core/utils/registerHandlebarTemplates.d.ts +1 -0
- package/dist/core/utils/registerHandlebarTemplates.d.ts.map +1 -1
- package/dist/core/utils/resolveClassesModeTypes.d.ts +8 -0
- package/dist/core/utils/resolveClassesModeTypes.d.ts.map +1 -0
- package/dist/core/utils/resolveClassesModeTypes.js +77 -0
- package/dist/core/utils/semanticChangesToDiffEntries.d.ts +37 -0
- package/dist/core/utils/semanticChangesToDiffEntries.d.ts.map +1 -0
- package/dist/core/utils/semanticChangesToDiffEntries.js +99 -0
- package/dist/core/utils/semanticPointerToJsonPath.d.ts +7 -0
- package/dist/core/utils/semanticPointerToJsonPath.d.ts.map +1 -0
- package/dist/core/utils/semanticPointerToJsonPath.js +67 -0
- package/dist/core/utils/serviceHelpers.d.ts +6 -7
- package/dist/core/utils/serviceHelpers.d.ts.map +1 -1
- package/dist/core/utils/serviceHelpers.js +8 -25
- package/dist/core/utils/sortModelByName.d.ts +1 -1
- package/dist/core/utils/writeClientExecutor.d.ts +1 -2
- package/dist/core/utils/writeClientExecutor.d.ts.map +1 -1
- package/dist/core/utils/writeClientExecutor.js +2 -6
- package/dist/core/utils/writeClientModels.d.ts +1 -2
- package/dist/core/utils/writeClientModels.d.ts.map +1 -1
- package/dist/core/utils/writeClientModels.js +4 -6
- package/dist/core/utils/writeClientSchemas.d.ts +1 -3
- package/dist/core/utils/writeClientSchemas.d.ts.map +1 -1
- package/dist/core/utils/writeClientSchemas.js +2 -7
- package/dist/core/utils/writeClientServices.d.ts +15 -16
- package/dist/core/utils/writeClientServices.d.ts.map +1 -1
- package/dist/core/utils/writeClientServices.js +6 -13
- package/dist/templatesCompiled/client/exportModels.d.ts +17 -11
- package/dist/templatesCompiled/client/exportModels.d.ts.map +1 -1
- package/dist/templatesCompiled/client/exportModels.js +96 -49
- package/dist/templatesCompiled/client/exportService.d.ts +13 -10
- package/dist/templatesCompiled/client/exportService.d.ts.map +1 -1
- package/dist/templatesCompiled/client/exportService.js +95 -67
- package/dist/templatesCompiled/client/partials/header.d.ts +1 -0
- package/dist/templatesCompiled/client/partials/header.d.ts.map +1 -1
- package/dist/templatesCompiled/client/partials/header.js +11 -2
- package/package.json +130 -136
- package/dist/cli/analyzeDiff/buildLegacyReport.d.ts +0 -17
- package/dist/cli/analyzeDiff/buildLegacyReport.d.ts.map +0 -1
- package/dist/cli/analyzeDiff/buildLegacyReport.js +0 -54
- package/dist/cli/analyzeDiff/diffEngine.d.ts +0 -54
- package/dist/cli/analyzeDiff/diffEngine.d.ts.map +0 -1
- package/dist/cli/analyzeDiff/diffEngine.js +0 -209
|
@@ -13,19 +13,17 @@ const analyzeUsage = async (options) => {
|
|
|
13
13
|
try {
|
|
14
14
|
// Валидация входных данных
|
|
15
15
|
if (!options.sourcePath || !options.projectPath) {
|
|
16
|
-
console.error(
|
|
17
|
-
return { success: false, error:
|
|
16
|
+
console.error('❌ Error: --sourcePath (-s) and --projectPath (-p) are required.');
|
|
17
|
+
return { success: false, error: '--sourcePath (-s) and --projectPath (-p) are required.' };
|
|
18
18
|
}
|
|
19
19
|
const projectPath = path_1.default.resolve(options.projectPath);
|
|
20
20
|
const sourcePath = path_1.default.resolve(options.sourcePath);
|
|
21
|
-
const tsconfigPath = options.tsconfigPath
|
|
22
|
-
|
|
23
|
-
: undefined;
|
|
24
|
-
console.log("🏗️ Initializing project context...");
|
|
21
|
+
const tsconfigPath = options.tsconfigPath ? path_1.default.resolve(options.tsconfigPath) : undefined;
|
|
22
|
+
console.log('🏗️ Initializing project context...');
|
|
25
23
|
const context = new ProjectContext_1.ProjectContext(projectPath, tsconfigPath);
|
|
26
24
|
// Добавляем файл генерации в проект для работы TypeChecker
|
|
27
25
|
const generatedFile = context.project.addSourceFileAtPath(sourcePath);
|
|
28
|
-
console.log(
|
|
26
|
+
console.log('🔍 Scanning API contract...');
|
|
29
27
|
const scanner = new Scanner_1.Scanner(generatedFile);
|
|
30
28
|
const contract = scanner.scan();
|
|
31
29
|
// Инициализация объекта статистики для подсчета Coverage
|
|
@@ -34,7 +32,7 @@ const analyzeUsage = async (options) => {
|
|
|
34
32
|
usedSchemas: new Set(),
|
|
35
33
|
usedModels: new Set(),
|
|
36
34
|
};
|
|
37
|
-
console.log(
|
|
35
|
+
console.log('🧪 Running semantic analysis...');
|
|
38
36
|
const analyzer = new Analyzer_1.Analyzer(context, contract);
|
|
39
37
|
const findings = await analyzer.run(stats);
|
|
40
38
|
// 1. Расчет покрытия API (через Reporter)
|
|
@@ -45,13 +43,13 @@ const analyzeUsage = async (options) => {
|
|
|
45
43
|
report_1.Reporter.saveJsonReport(options.output, findings, coverage);
|
|
46
44
|
// 4. Логика выхода для CI пайплайнов
|
|
47
45
|
if (options.check) {
|
|
48
|
-
const hasErrors = findings.some(
|
|
46
|
+
const hasErrors = findings.some(f => f.severity === 'ERROR');
|
|
49
47
|
if (hasErrors) {
|
|
50
|
-
console.error(
|
|
51
|
-
return { success: false, error:
|
|
48
|
+
console.error('\n🛑 CI check failed: critical API contract mismatches were found.');
|
|
49
|
+
return { success: false, error: 'CI check failed: critical API contract mismatches were found.' };
|
|
52
50
|
}
|
|
53
51
|
}
|
|
54
|
-
console.log(
|
|
52
|
+
console.log('\n✅ Done!');
|
|
55
53
|
return { success: true };
|
|
56
54
|
}
|
|
57
55
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProjectContext.d.ts","sourceRoot":"","sources":["../../../../src/cli/analyzeUsage/core/ProjectContext.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAEnC,qBAAa,cAAc;IACvB,SAAgB,OAAO,EAAE,OAAO,CAAC;IACjC,SAAgB,WAAW,EAAE,MAAM,CAAC;gBAExB,WAAW,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM;
|
|
1
|
+
{"version":3,"file":"ProjectContext.d.ts","sourceRoot":"","sources":["../../../../src/cli/analyzeUsage/core/ProjectContext.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAEnC,qBAAa,cAAc;IACvB,SAAgB,OAAO,EAAE,OAAO,CAAC;IACjC,SAAgB,WAAW,EAAE,MAAM,CAAC;gBAExB,WAAW,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM;IAwC/C,cAAc;IAId,cAAc;IAId,sBAAsB;CAIhC"}
|
|
@@ -27,18 +27,15 @@ class ProjectContext {
|
|
|
27
27
|
esModuleInterop: true,
|
|
28
28
|
// БЕЗ ЭТОГО НЕ БУДЕТ ВИДЕТЬ ТИПЫ БИБЛИОТЕК:
|
|
29
29
|
skipLibCheck: true,
|
|
30
|
-
typeRoots: [path_1.default.resolve(projectPath,
|
|
31
|
-
lib: [
|
|
30
|
+
typeRoots: [path_1.default.resolve(projectPath, 'node_modules/@types')],
|
|
31
|
+
lib: ['lib.esnext.d.ts', 'lib.dom.d.ts'],
|
|
32
32
|
};
|
|
33
33
|
}
|
|
34
34
|
this.project = new ts_morph_1.Project(options);
|
|
35
35
|
// Если мы не используем tsconfig, нужно принудительно добавить файлы
|
|
36
36
|
if (!tsConfigPath) {
|
|
37
37
|
console.log('📂 Adding project files manually...');
|
|
38
|
-
this.project.addSourceFilesAtPaths([
|
|
39
|
-
path_1.default.join(projectPath, "src/**/*.{ts,tsx}"),
|
|
40
|
-
"!**/node_modules/**",
|
|
41
|
-
]);
|
|
38
|
+
this.project.addSourceFilesAtPaths([path_1.default.join(projectPath, 'src/**/*.{ts,tsx}'), '!**/node_modules/**']);
|
|
42
39
|
}
|
|
43
40
|
// ПРОВЕРКА: Проверяем, видит ли проект файлы
|
|
44
41
|
const fileCount = this.project.getSourceFiles().length;
|
|
@@ -54,10 +51,8 @@ class ProjectContext {
|
|
|
54
51
|
return this.project.getSourceFiles();
|
|
55
52
|
}
|
|
56
53
|
getConsumerSourceFiles() {
|
|
57
|
-
const srcRoot = path_1.default.resolve(this.projectPath,
|
|
58
|
-
return this.project
|
|
59
|
-
.getSourceFiles()
|
|
60
|
-
.filter((file) => file.getFilePath().startsWith(srcRoot));
|
|
54
|
+
const srcRoot = path_1.default.resolve(this.projectPath, 'src') + path_1.default.sep;
|
|
55
|
+
return this.project.getSourceFiles().filter(file => file.getFilePath().startsWith(srcRoot));
|
|
61
56
|
}
|
|
62
57
|
}
|
|
63
58
|
exports.ProjectContext = ProjectContext;
|
|
@@ -1,8 +1,16 @@
|
|
|
1
1
|
import { SourceFile } from 'ts-morph';
|
|
2
2
|
import type { Contract } from '../types';
|
|
3
|
+
/** Сканер экспортов сгенерированного API-файла для построения контракта. */
|
|
3
4
|
export declare class Scanner {
|
|
4
5
|
private generatedFile;
|
|
6
|
+
/**
|
|
7
|
+
* @param generatedFile сгенерированный исходный файл API
|
|
8
|
+
*/
|
|
5
9
|
constructor(generatedFile: SourceFile);
|
|
10
|
+
/**
|
|
11
|
+
* Сканирует экспорты файла и собирает контракт сервисов, моделей и схем.
|
|
12
|
+
* @returns контракт сгенерированного API
|
|
13
|
+
*/
|
|
6
14
|
scan(): Contract;
|
|
7
15
|
private extractMethodsFromDeclaration;
|
|
8
16
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Scanner.d.ts","sourceRoot":"","sources":["../../../../src/cli/analyzeUsage/core/Scanner.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"Scanner.d.ts","sourceRoot":"","sources":["../../../../src/cli/analyzeUsage/core/Scanner.ts"],"names":[],"mappings":"AACA,OAAO,EAAQ,UAAU,EAAc,MAAM,UAAU,CAAC;AAExD,OAAO,KAAK,EAAE,QAAQ,EAAkB,MAAM,UAAU,CAAC;AAEzD,4EAA4E;AAC5E,qBAAa,OAAO;IAIJ,OAAO,CAAC,aAAa;IAHjC;;OAEG;gBACiB,aAAa,EAAE,UAAU;IAE7C;;;OAGG;IACI,IAAI,IAAI,QAAQ;IA4CvB,OAAO,CAAC,6BAA6B;IA0CrC;;;OAGG;IACH,OAAO,CAAC,WAAW;IAwBnB,OAAO,CAAC,cAAc;CAGzB"}
|
|
@@ -2,11 +2,19 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.Scanner = void 0;
|
|
4
4
|
const ts_morph_1 = require("ts-morph");
|
|
5
|
+
/** Сканер экспортов сгенерированного API-файла для построения контракта. */
|
|
5
6
|
class Scanner {
|
|
6
7
|
generatedFile;
|
|
8
|
+
/**
|
|
9
|
+
* @param generatedFile сгенерированный исходный файл API
|
|
10
|
+
*/
|
|
7
11
|
constructor(generatedFile) {
|
|
8
12
|
this.generatedFile = generatedFile;
|
|
9
13
|
}
|
|
14
|
+
/**
|
|
15
|
+
* Сканирует экспорты файла и собирает контракт сервисов, моделей и схем.
|
|
16
|
+
* @returns контракт сгенерированного API
|
|
17
|
+
*/
|
|
10
18
|
scan() {
|
|
11
19
|
const exports = this.generatedFile.getExportedDeclarations();
|
|
12
20
|
console.log(`DEBUG SCANNER: File exports:`, Array.from(exports.keys()));
|
|
@@ -102,6 +110,8 @@ class Scanner {
|
|
|
102
110
|
name,
|
|
103
111
|
params: sig?.getParameters().map(p => ({
|
|
104
112
|
name: p.getName(),
|
|
113
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
114
|
+
// @ts-ignore
|
|
105
115
|
isOptional: p.isOptional(),
|
|
106
116
|
type: p.getTypeAtLocation(node).getText(),
|
|
107
117
|
})) || [],
|
|
@@ -1,6 +1,14 @@
|
|
|
1
|
-
import type { ProjectContext } from
|
|
2
|
-
import type { Contract, Finding, Rule, Stats } from
|
|
1
|
+
import type { ProjectContext } from '../core/ProjectContext';
|
|
2
|
+
import type { Contract, Finding, Rule, Stats } from '../types';
|
|
3
|
+
/** Правило проверки использования createClient и ClientOptions в потребителях API. */
|
|
3
4
|
export declare class ClientRule implements Rule {
|
|
5
|
+
/**
|
|
6
|
+
* Проверяет вызовы createClient и соответствие ClientOptions.
|
|
7
|
+
* @param context контекст проекта
|
|
8
|
+
* @param contract контракт сгенерированного API
|
|
9
|
+
* @param stats накопительная статистика использования
|
|
10
|
+
* @returns список найденных проблем
|
|
11
|
+
*/
|
|
4
12
|
check(context: ProjectContext, contract: Contract, stats: Stats): Promise<Finding[]>;
|
|
5
13
|
}
|
|
6
14
|
//# sourceMappingURL=ClientRule.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ClientRule.d.ts","sourceRoot":"","sources":["../../../../src/cli/analyzeUsage/rules/ClientRule.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAE/D,qBAAa,UAAW,YAAW,IAAI;
|
|
1
|
+
{"version":3,"file":"ClientRule.d.ts","sourceRoot":"","sources":["../../../../src/cli/analyzeUsage/rules/ClientRule.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAE/D,sFAAsF;AACtF,qBAAa,UAAW,YAAW,IAAI;IACnC;;;;;;OAMG;IACG,KAAK,CAAC,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;CA4E7F"}
|
|
@@ -2,20 +2,26 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ClientRule = void 0;
|
|
4
4
|
const ts_morph_1 = require("ts-morph");
|
|
5
|
+
/** Правило проверки использования createClient и ClientOptions в потребителях API. */
|
|
5
6
|
class ClientRule {
|
|
7
|
+
/**
|
|
8
|
+
* Проверяет вызовы createClient и соответствие ClientOptions.
|
|
9
|
+
* @param context контекст проекта
|
|
10
|
+
* @param contract контракт сгенерированного API
|
|
11
|
+
* @param stats накопительная статистика использования
|
|
12
|
+
* @returns список найденных проблем
|
|
13
|
+
*/
|
|
6
14
|
async check(context, contract, stats) {
|
|
7
15
|
const findings = [];
|
|
8
16
|
const checker = context.getTypeChecker();
|
|
9
|
-
const clientOptionsDecl = contract.sourceFile
|
|
10
|
-
.getExportedDeclarations()
|
|
11
|
-
.get("ClientOptions")?.[0];
|
|
17
|
+
const clientOptionsDecl = contract.sourceFile.getExportedDeclarations().get('ClientOptions')?.[0];
|
|
12
18
|
const expectedType = clientOptionsDecl?.getType();
|
|
13
19
|
if (!expectedType) {
|
|
14
20
|
findings.push({
|
|
15
|
-
id:
|
|
16
|
-
category:
|
|
17
|
-
severity:
|
|
18
|
-
message:
|
|
21
|
+
id: 'CLIENT_OPTIONS_TYPE_NOT_FOUND',
|
|
22
|
+
category: 'CONFIG',
|
|
23
|
+
severity: 'WARNING',
|
|
24
|
+
message: 'ClientOptions type was not found in the contract. createClient argument validation is limited.',
|
|
19
25
|
file: contract.sourceFile.getFilePath(),
|
|
20
26
|
line: 0,
|
|
21
27
|
});
|
|
@@ -25,12 +31,12 @@ class ClientRule {
|
|
|
25
31
|
const createClientNames = new Set();
|
|
26
32
|
for (const imp of imports) {
|
|
27
33
|
const moduleName = imp.getModuleSpecifierValue();
|
|
28
|
-
if (moduleName !==
|
|
34
|
+
if (moduleName !== '@lom-api' && !moduleName.startsWith('@lom-api/')) {
|
|
29
35
|
continue;
|
|
30
36
|
}
|
|
31
37
|
for (const namedImport of imp.getNamedImports()) {
|
|
32
|
-
if (namedImport.getName() ===
|
|
33
|
-
createClientNames.add(namedImport.getAliasNode()?.getText() ||
|
|
38
|
+
if (namedImport.getName() === 'createClient') {
|
|
39
|
+
createClientNames.add(namedImport.getAliasNode()?.getText() || 'createClient');
|
|
34
40
|
}
|
|
35
41
|
}
|
|
36
42
|
}
|
|
@@ -43,18 +49,20 @@ class ClientRule {
|
|
|
43
49
|
continue;
|
|
44
50
|
if (!createClientNames.has(expression.getText()))
|
|
45
51
|
continue;
|
|
46
|
-
stats.usedMethods.add(
|
|
52
|
+
stats.usedMethods.add('createClient');
|
|
47
53
|
const args = call.getArguments();
|
|
48
54
|
if (args.length === 0)
|
|
49
55
|
continue;
|
|
50
56
|
if (expectedType) {
|
|
51
57
|
const providedType = checker.getTypeAtLocation(args[0]);
|
|
58
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
59
|
+
// @ts-ignore
|
|
52
60
|
if (!providedType.isAssignableTo(expectedType)) {
|
|
53
61
|
findings.push({
|
|
54
|
-
id:
|
|
55
|
-
category:
|
|
56
|
-
severity:
|
|
57
|
-
message:
|
|
62
|
+
id: 'CLIENT_OPTIONS_MISMATCH',
|
|
63
|
+
category: 'TYPE_MISMATCH',
|
|
64
|
+
severity: 'ERROR',
|
|
65
|
+
message: 'createClient configuration object does not match ClientOptions from the generated API.',
|
|
58
66
|
file: file.getFilePath(),
|
|
59
67
|
line: args[0].getStartLineNumber(),
|
|
60
68
|
});
|
|
@@ -62,13 +70,13 @@ class ClientRule {
|
|
|
62
70
|
}
|
|
63
71
|
}
|
|
64
72
|
}
|
|
65
|
-
if (!stats.usedMethods.has(
|
|
73
|
+
if (!stats.usedMethods.has('createClient')) {
|
|
66
74
|
findings.push({
|
|
67
|
-
id:
|
|
68
|
-
category:
|
|
69
|
-
severity:
|
|
70
|
-
message:
|
|
71
|
-
file:
|
|
75
|
+
id: 'CLIENT_NOT_FOUND',
|
|
76
|
+
category: 'USAGE',
|
|
77
|
+
severity: 'WARNING',
|
|
78
|
+
message: 'No createClient call from @lom-api was found in src.',
|
|
79
|
+
file: 'Global',
|
|
72
80
|
line: 0,
|
|
73
81
|
});
|
|
74
82
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { ProjectContext } from
|
|
2
|
-
import type { Contract, Finding, Rule, Stats } from
|
|
1
|
+
import { ProjectContext } from '../core/ProjectContext';
|
|
2
|
+
import type { Contract, Finding, Rule, Stats } from '../types';
|
|
3
3
|
export declare class CoverageRule implements Rule {
|
|
4
4
|
private readonly ignoredUnusedModels;
|
|
5
5
|
check(_context: ProjectContext, contract: Contract, stats: Stats): Promise<Finding[]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CoverageRule.d.ts","sourceRoot":"","sources":["../../../../src/cli/analyzeUsage/rules/CoverageRule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAE/D,qBAAa,YAAa,YAAW,IAAI;
|
|
1
|
+
{"version":3,"file":"CoverageRule.d.ts","sourceRoot":"","sources":["../../../../src/cli/analyzeUsage/rules/CoverageRule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAE/D,qBAAa,YAAa,YAAW,IAAI;IACrC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAoI;IAElK,KAAK,CAAC,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;CAmD9F"}
|
|
@@ -2,56 +2,48 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.CoverageRule = void 0;
|
|
4
4
|
class CoverageRule {
|
|
5
|
-
ignoredUnusedModels = new Set([
|
|
6
|
-
"ApiError",
|
|
7
|
-
"RequestConfig",
|
|
8
|
-
"RequestExecutor",
|
|
9
|
-
"TOpenAPIConfig",
|
|
10
|
-
"OpenAPI",
|
|
11
|
-
"createExecutorAdapter",
|
|
12
|
-
"ClientOptions",
|
|
13
|
-
]);
|
|
5
|
+
ignoredUnusedModels = new Set(['ApiError', 'RequestConfig', 'RequestExecutor', 'TOpenAPIConfig', 'OpenAPI', 'createExecutorAdapter', 'ClientOptions']);
|
|
14
6
|
async check(_context, contract, stats) {
|
|
15
7
|
const findings = [];
|
|
16
8
|
// Проверка неиспользуемых схем
|
|
17
|
-
contract.schemas.forEach(
|
|
9
|
+
contract.schemas.forEach(schema => {
|
|
18
10
|
if (!stats.usedSchemas.has(schema)) {
|
|
19
11
|
findings.push({
|
|
20
|
-
id:
|
|
21
|
-
category:
|
|
22
|
-
severity:
|
|
12
|
+
id: 'UNUSED_SCHEMA',
|
|
13
|
+
category: 'UNUSED',
|
|
14
|
+
severity: 'WARNING',
|
|
23
15
|
message: `Schema "${schema}" is exported by the API but not used in the project.`,
|
|
24
|
-
file:
|
|
16
|
+
file: 'API Contract',
|
|
25
17
|
line: 0,
|
|
26
18
|
});
|
|
27
19
|
}
|
|
28
20
|
});
|
|
29
21
|
// Проверка неиспользуемых моделей
|
|
30
|
-
contract.models.forEach(
|
|
22
|
+
contract.models.forEach(model => {
|
|
31
23
|
if (this.ignoredUnusedModels.has(model))
|
|
32
24
|
return;
|
|
33
25
|
if (!stats.usedModels.has(model)) {
|
|
34
26
|
findings.push({
|
|
35
|
-
id:
|
|
36
|
-
category:
|
|
37
|
-
severity:
|
|
27
|
+
id: 'UNUSED_MODEL',
|
|
28
|
+
category: 'UNUSED',
|
|
29
|
+
severity: 'WARNING',
|
|
38
30
|
message: `Model "${model}" is exported by the API but not used in the project.`,
|
|
39
|
-
file:
|
|
31
|
+
file: 'API Contract',
|
|
40
32
|
line: 0,
|
|
41
33
|
});
|
|
42
34
|
}
|
|
43
35
|
});
|
|
44
36
|
// Проверка неиспользуемых методов
|
|
45
37
|
Object.entries(contract.services).forEach(([serviceName, methods]) => {
|
|
46
|
-
methods.forEach(
|
|
38
|
+
methods.forEach(method => {
|
|
47
39
|
const methodKey = `${serviceName}.${method.name}`;
|
|
48
40
|
if (!stats.usedMethods.has(methodKey)) {
|
|
49
41
|
findings.push({
|
|
50
|
-
id:
|
|
51
|
-
category:
|
|
52
|
-
severity:
|
|
42
|
+
id: 'UNUSED_METHOD',
|
|
43
|
+
category: 'UNUSED',
|
|
44
|
+
severity: 'WARNING',
|
|
53
45
|
message: `Method "${methodKey}" is exported by the API but not used in the project.`,
|
|
54
|
-
file:
|
|
46
|
+
file: 'API Contract',
|
|
55
47
|
line: 0,
|
|
56
48
|
});
|
|
57
49
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DiagnosticsRule.d.ts","sourceRoot":"","sources":["../../../../src/cli/analyzeUsage/rules/DiagnosticsRule.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAE/D,qBAAa,eAAgB,YAAW,IAAI;IAClC,KAAK,CAAC,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"DiagnosticsRule.d.ts","sourceRoot":"","sources":["../../../../src/cli/analyzeUsage/rules/DiagnosticsRule.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAE/D,qBAAa,eAAgB,YAAW,IAAI;IAClC,KAAK,CAAC,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;CA0D/F"}
|
|
@@ -41,7 +41,10 @@ class DiagnosticsRule {
|
|
|
41
41
|
else if (typeof messageText === 'object') {
|
|
42
42
|
// For multiline messages, concatenate the text parts.
|
|
43
43
|
const mainMessage = messageText.getMessageText();
|
|
44
|
-
const details = messageText
|
|
44
|
+
const details = messageText
|
|
45
|
+
.getNext()
|
|
46
|
+
?.map(part => part.getMessageText())
|
|
47
|
+
.join(' ') ?? '';
|
|
45
48
|
findings.push({
|
|
46
49
|
id: `TS_DIAGNOSTIC_${diagnostic.getCode()}`,
|
|
47
50
|
category: 'TYPE_MISMATCH',
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { ProjectContext } from
|
|
2
|
-
import type { Contract, Finding, Rule, Stats } from
|
|
1
|
+
import type { ProjectContext } from '../core/ProjectContext';
|
|
2
|
+
import type { Contract, Finding, Rule, Stats } from '../types';
|
|
3
3
|
export declare class ImportRule implements Rule {
|
|
4
4
|
check(context: ProjectContext, contract: Contract, _stats: Stats): Promise<Finding[]>;
|
|
5
5
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ImportRule.d.ts","sourceRoot":"","sources":["../../../../src/cli/analyzeUsage/rules/ImportRule.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAG/D,qBAAa,UAAW,YAAW,IAAI;
|
|
1
|
+
{"version":3,"file":"ImportRule.d.ts","sourceRoot":"","sources":["../../../../src/cli/analyzeUsage/rules/ImportRule.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAG/D,qBAAa,UAAW,YAAW,IAAI;IAC7B,KAAK,CACP,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,QAAQ,EAElB,MAAM,EAAE,KAAK,GACd,OAAO,CAAC,OAAO,EAAE,CAAC;CA8CxB"}
|
|
@@ -11,34 +11,32 @@ class ImportRule {
|
|
|
11
11
|
for (const file of context.getConsumerSourceFiles()) {
|
|
12
12
|
for (const imp of file.getImportDeclarations()) {
|
|
13
13
|
const moduleName = imp.getModuleSpecifierValue();
|
|
14
|
-
if (moduleName !==
|
|
14
|
+
if (moduleName !== '@lom-api' && !moduleName.startsWith('@lom-api/')) {
|
|
15
15
|
continue;
|
|
16
16
|
}
|
|
17
17
|
const importedSource = imp.getModuleSpecifierSourceFile();
|
|
18
18
|
if (!importedSource) {
|
|
19
19
|
findings.push({
|
|
20
|
-
id:
|
|
21
|
-
category:
|
|
22
|
-
severity:
|
|
20
|
+
id: 'INVALID_IMPORT_PATH',
|
|
21
|
+
category: 'INVALID_IMPORT',
|
|
22
|
+
severity: 'ERROR',
|
|
23
23
|
message: `Import "${moduleName}" could not be resolved.`,
|
|
24
24
|
file: file.getFilePath(),
|
|
25
25
|
line: imp.getStartLineNumber(),
|
|
26
26
|
});
|
|
27
27
|
continue;
|
|
28
28
|
}
|
|
29
|
-
const allowedExports = moduleName ===
|
|
30
|
-
? rootExports
|
|
31
|
-
: new Set(importedSource.getExportedDeclarations().keys());
|
|
29
|
+
const allowedExports = moduleName === '@lom-api' ? rootExports : new Set(importedSource.getExportedDeclarations().keys());
|
|
32
30
|
for (const namedImport of imp.getNamedImports()) {
|
|
33
31
|
const importedName = namedImport.getName();
|
|
34
32
|
if (allowedExports.has(importedName))
|
|
35
33
|
continue;
|
|
36
34
|
const suggestion = (0, fuzzy_1.findBestMatch)(importedName, [...allowedExports]);
|
|
37
35
|
findings.push({
|
|
38
|
-
id:
|
|
39
|
-
category: suggestion ?
|
|
40
|
-
severity:
|
|
41
|
-
message: `Import "${importedName}" is not exported by "${moduleName}".${suggestion ? ` Did you mean "${suggestion}"?` :
|
|
36
|
+
id: 'INVALID_IMPORT_NAME',
|
|
37
|
+
category: suggestion ? 'RENAMED_SYMBOL' : 'MISSING_EXPORT',
|
|
38
|
+
severity: 'ERROR',
|
|
39
|
+
message: `Import "${importedName}" is not exported by "${moduleName}".${suggestion ? ` Did you mean "${suggestion}"?` : ''}`,
|
|
42
40
|
file: file.getFilePath(),
|
|
43
41
|
line: namedImport.getStartLineNumber(),
|
|
44
42
|
context: { suggestion },
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { ProjectContext } from
|
|
2
|
-
import type { Contract, Finding, Rule, Stats } from
|
|
1
|
+
import type { ProjectContext } from '../core/ProjectContext';
|
|
2
|
+
import type { Contract, Finding, Rule, Stats } from '../types';
|
|
3
3
|
export declare class ModelRule implements Rule {
|
|
4
4
|
check(context: ProjectContext, contract: Contract, stats: Stats): Promise<Finding[]>;
|
|
5
5
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ModelRule.d.ts","sourceRoot":"","sources":["../../../../src/cli/analyzeUsage/rules/ModelRule.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAE/D,qBAAa,SAAU,YAAW,IAAI;
|
|
1
|
+
{"version":3,"file":"ModelRule.d.ts","sourceRoot":"","sources":["../../../../src/cli/analyzeUsage/rules/ModelRule.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAE/D,qBAAa,SAAU,YAAW,IAAI;IAC5B,KAAK,CAAC,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;CA+B7F"}
|
|
@@ -9,23 +9,19 @@ class ModelRule {
|
|
|
9
9
|
for (const file of context.getConsumerSourceFiles()) {
|
|
10
10
|
for (const imp of file.getImportDeclarations()) {
|
|
11
11
|
const moduleName = imp.getModuleSpecifierValue();
|
|
12
|
-
if (moduleName !==
|
|
12
|
+
if (moduleName !== '@lom-api' && !moduleName.startsWith('@lom-api/')) {
|
|
13
13
|
continue;
|
|
14
14
|
}
|
|
15
15
|
for (const namedImport of imp.getNamedImports()) {
|
|
16
16
|
const importedName = namedImport.getName();
|
|
17
|
-
if (importedName.endsWith(
|
|
18
|
-
importedName.endsWith("Service") ||
|
|
19
|
-
importedName === "createClient") {
|
|
17
|
+
if (importedName.endsWith('Schema') || importedName.endsWith('Service') || importedName === 'createClient') {
|
|
20
18
|
continue;
|
|
21
19
|
}
|
|
22
20
|
const localName = namedImport.getAliasNode()?.getText() || importedName;
|
|
23
21
|
if (!knownModels.has(importedName))
|
|
24
22
|
continue;
|
|
25
|
-
const identifiers = file
|
|
26
|
-
|
|
27
|
-
.filter((id) => id.getText() === localName);
|
|
28
|
-
const usedOutsideImport = identifiers.some((id) => id.getFirstAncestorByKind(ts_morph_1.SyntaxKind.ImportDeclaration) == null);
|
|
23
|
+
const identifiers = file.getDescendantsOfKind(ts_morph_1.SyntaxKind.Identifier).filter(id => id.getText() === localName);
|
|
24
|
+
const usedOutsideImport = identifiers.some(id => id.getFirstAncestorByKind(ts_morph_1.SyntaxKind.ImportDeclaration) == null);
|
|
29
25
|
if (usedOutsideImport) {
|
|
30
26
|
stats.usedModels.add(importedName);
|
|
31
27
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { ProjectContext } from
|
|
2
|
-
import type { Contract, Finding, Rule, Stats } from
|
|
1
|
+
import type { ProjectContext } from '../core/ProjectContext';
|
|
2
|
+
import type { Contract, Finding, Rule, Stats } from '../types';
|
|
3
3
|
export declare class SchemaRule implements Rule {
|
|
4
4
|
check(context: ProjectContext, contract: Contract, stats: Stats): Promise<Finding[]>;
|
|
5
5
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SchemaRule.d.ts","sourceRoot":"","sources":["../../../../src/cli/analyzeUsage/rules/SchemaRule.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAG/D,qBAAa,UAAW,YAAW,IAAI;
|
|
1
|
+
{"version":3,"file":"SchemaRule.d.ts","sourceRoot":"","sources":["../../../../src/cli/analyzeUsage/rules/SchemaRule.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAG/D,qBAAa,UAAW,YAAW,IAAI;IAC7B,KAAK,CAAC,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;CA4C7F"}
|
|
@@ -11,31 +11,29 @@ class SchemaRule {
|
|
|
11
11
|
const imports = file.getImportDeclarations();
|
|
12
12
|
for (const imp of imports) {
|
|
13
13
|
const moduleName = imp.getModuleSpecifierValue();
|
|
14
|
-
if (moduleName !==
|
|
14
|
+
if (moduleName !== '@lom-api' && !moduleName.startsWith('@lom-api/')) {
|
|
15
15
|
continue;
|
|
16
16
|
}
|
|
17
17
|
for (const namedImport of imp.getNamedImports()) {
|
|
18
18
|
const importedName = namedImport.getName();
|
|
19
|
-
if (!importedName.endsWith(
|
|
19
|
+
if (!importedName.endsWith('Schema'))
|
|
20
20
|
continue;
|
|
21
21
|
const localName = namedImport.getAliasNode()?.getText() || importedName;
|
|
22
22
|
if (!knownSchemas.has(importedName)) {
|
|
23
23
|
const suggestion = (0, fuzzy_1.findBestMatch)(importedName, contract.schemas);
|
|
24
24
|
findings.push({
|
|
25
|
-
id:
|
|
26
|
-
category: suggestion ?
|
|
27
|
-
severity:
|
|
28
|
-
message: `Schema "${importedName}" was not found in the API.${suggestion ? ` Did you mean "${suggestion}"?` :
|
|
25
|
+
id: 'SCHEMA_NOT_FOUND',
|
|
26
|
+
category: suggestion ? 'RENAMED_SYMBOL' : 'MISSING_EXPORT',
|
|
27
|
+
severity: 'ERROR',
|
|
28
|
+
message: `Schema "${importedName}" was not found in the API.${suggestion ? ` Did you mean "${suggestion}"?` : ''}`,
|
|
29
29
|
file: file.getFilePath(),
|
|
30
30
|
line: namedImport.getStartLineNumber(),
|
|
31
31
|
context: { suggestion },
|
|
32
32
|
});
|
|
33
33
|
continue;
|
|
34
34
|
}
|
|
35
|
-
const identifiers = file
|
|
36
|
-
|
|
37
|
-
.filter((id) => id.getText() === localName);
|
|
38
|
-
const usedOutsideImport = identifiers.some((id) => id.getFirstAncestorByKind(ts_morph_1.SyntaxKind.ImportDeclaration) == null);
|
|
35
|
+
const identifiers = file.getDescendantsOfKind(ts_morph_1.SyntaxKind.Identifier).filter(id => id.getText() === localName);
|
|
36
|
+
const usedOutsideImport = identifiers.some(id => id.getFirstAncestorByKind(ts_morph_1.SyntaxKind.ImportDeclaration) == null);
|
|
39
37
|
if (usedOutsideImport) {
|
|
40
38
|
stats.usedSchemas.add(importedName);
|
|
41
39
|
}
|
|
@@ -1,6 +1,14 @@
|
|
|
1
|
-
import type { ProjectContext } from
|
|
2
|
-
import type { Contract, Finding, Rule, Stats } from
|
|
1
|
+
import type { ProjectContext } from '../core/ProjectContext';
|
|
2
|
+
import type { Contract, Finding, Rule, Stats } from '../types';
|
|
3
|
+
/** Правило проверки вызовов методов сгенерированных сервисов в потребителях API. */
|
|
3
4
|
export declare class ServiceRule implements Rule {
|
|
5
|
+
/**
|
|
6
|
+
* Проверяет вызовы методов сервисов и соответствие их сигнатурам.
|
|
7
|
+
* @param context контекст проекта
|
|
8
|
+
* @param contract контракт сгенерированного API
|
|
9
|
+
* @param stats накопительная статистика использования
|
|
10
|
+
* @returns список найденных проблем
|
|
11
|
+
*/
|
|
4
12
|
check(context: ProjectContext, contract: Contract, stats: Stats): Promise<Finding[]>;
|
|
5
13
|
private getExpectedParameterType;
|
|
6
14
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ServiceRule.d.ts","sourceRoot":"","sources":["../../../../src/cli/analyzeUsage/rules/ServiceRule.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAG/D,qBAAa,WAAY,YAAW,IAAI;
|
|
1
|
+
{"version":3,"file":"ServiceRule.d.ts","sourceRoot":"","sources":["../../../../src/cli/analyzeUsage/rules/ServiceRule.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAG/D,oFAAoF;AACpF,qBAAa,WAAY,YAAW,IAAI;IACpC;;;;;;OAMG;IACG,KAAK,CAAC,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAgF1F,OAAO,CAAC,wBAAwB;CASnC"}
|