ts-openapi-codegen 2.1.0-beta.7 → 2.1.0-beta.8
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 +3 -0
- package/README.rus.md +3 -0
- 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/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.map +1 -1
- package/dist/cli/analyzeUsage/rules/ClientRule.d.ts +2 -2
- package/dist/cli/analyzeUsage/rules/ClientRule.d.ts.map +1 -1
- package/dist/cli/analyzeUsage/rules/ClientRule.js +19 -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 +2 -2
- package/dist/cli/analyzeUsage/rules/ServiceRule.d.ts.map +1 -1
- package/dist/cli/analyzeUsage/rules/ServiceRule.js +17 -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 +10 -3
- package/dist/common/LoggerMessages.d.ts.map +1 -1
- package/dist/common/LoggerMessages.js +14 -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 +7 -0
- package/dist/core/OpenApiClient.d.ts.map +1 -1
- package/dist/core/OpenApiClient.js +52 -8
- package/dist/core/WriteClient.d.ts +21 -2
- package/dist/core/WriteClient.d.ts.map +1 -1
- package/dist/core/WriteClient.js +36 -14
- 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 +7 -21
- package/dist/core/semanticDiff/analyzeOpenApiDiff.d.ts.map +1 -1
- package/dist/core/semanticDiff/semanticDiffReportSchema.d.ts +0 -2
- package/dist/core/semanticDiff/semanticDiffReportSchema.d.ts.map +1 -1
- package/dist/core/semanticDiff/semanticDiffReportSchema.js +3 -9
- package/dist/core/strict/validateOpenApiStrict.d.ts.map +1 -1
- package/dist/core/types/Consts.js +1 -1
- 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/utils/__tests__/postProcessModelImports.test.js +1 -4
- package/dist/core/utils/__tests__/postProcessServiceImports.test.js +1 -4
- package/dist/core/utils/__tests__/registerHandlebarHelpers.test.js +27 -0
- package/dist/core/utils/__tests__/sortByRequiredExtended.test.js +10 -27
- package/dist/core/utils/appendUniqueLinesToFile.js +1 -1
- package/dist/core/utils/applyDiffReportToClient.d.ts.map +1 -1
- package/dist/core/utils/applyDiffReportToClient.js +2 -2
- package/dist/core/utils/areEqual.d.ts +1 -1
- 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/modelHelpers.d.ts.map +1 -1
- 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.map +1 -1
- package/dist/core/utils/prepareDtoModels.js +1 -1
- 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/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 +1 -2
- package/dist/core/utils/writeClientServices.d.ts.map +1 -1
- package/dist/core/utils/writeClientServices.js +3 -6
- 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 +132 -136
package/README.md
CHANGED
|
@@ -31,6 +31,9 @@
|
|
|
31
31
|
- Supports generator plugins (`plugins`) including built-in `x-typescript-type`
|
|
32
32
|
- Supports binary request/response generation (`format: binary` -> `Blob`)
|
|
33
33
|
- Supports opt-in generation cache and incremental writes (`--cache`, `--cachePath`, `--cacheStrategy`, `--cacheDebug`)
|
|
34
|
+
- Generated services accept a `RequestExecutor` in the constructor (`request` / `requestRaw`, interceptors, `customExecutorPath` / `createExecutorAdapter`)
|
|
35
|
+
- Optional output formatting via `prettierConfigPath` (explicit Prettier config file)
|
|
36
|
+
- Optional batch ESLint `--fix` after generation when both `tsconfigPath` and `eslintConfigPath` are set
|
|
34
37
|
|
|
35
38
|
## Install
|
|
36
39
|
|
package/README.rus.md
CHANGED
|
@@ -31,6 +31,9 @@
|
|
|
31
31
|
- Поддерживает плагины генератора (`plugins`), включая встроенный `x-typescript-type`
|
|
32
32
|
- Поддерживает генерацию бинарных request/response (`format: binary` -> `Blob`)
|
|
33
33
|
- Поддерживает opt-in кэш генерации и инкрементальную запись (`--cache`, `--cachePath`, `--cacheStrategy`, `--cacheDebug`)
|
|
34
|
+
- Сгенерированные сервисы принимают `RequestExecutor` в конструкторе (`request` / `requestRaw`, interceptors, `customExecutorPath` / `createExecutorAdapter`)
|
|
35
|
+
- Опциональное форматирование вывода через `prettierConfigPath` (явный путь к конфигу Prettier)
|
|
36
|
+
- Опциональный пакетный ESLint `--fix` после генерации при указании `tsconfigPath` и `eslintConfigPath`
|
|
34
37
|
|
|
35
38
|
## Установка
|
|
36
39
|
|
|
@@ -1,10 +1,4 @@
|
|
|
1
1
|
import type { DiffEntry, IgnoreRule } from './types';
|
|
2
|
-
/**
|
|
3
|
-
* Проверяет, активно ли правило игнорирования по полю `until`.
|
|
4
|
-
* @param rule правило игнорирования
|
|
5
|
-
* @returns true если правило активно или не содержит валидной даты
|
|
6
|
-
*/
|
|
7
|
-
export declare const isRuleActive: (rule: IgnoreRule) => boolean;
|
|
8
2
|
/**
|
|
9
3
|
* Проверяет, соответствует ли запись diff правилу игнорирования.
|
|
10
4
|
* Совмещает полное совпадение пути, префикс и регулярные выражения.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ignoreRules.d.ts","sourceRoot":"","sources":["../../../src/cli/analyzeDiff/ignoreRules.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"ignoreRules.d.ts","sourceRoot":"","sources":["../../../src/cli/analyzeDiff/ignoreRules.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAcrD;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,GAAI,OAAO,SAAS,EAAE,MAAM,UAAU,KAAG,OAkBtE,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,GAAI,SAAS,SAAS,EAAE,EAAE,OAAO,UAAU,EAAE,KAAG;IAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAapH,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,GAAI,YAAY,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,IAAI,KAAG,UAAU,EAOnH,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,oBAAoB,MAAM,KAAG,UAAU,EAGtE,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.loadIgnoreRules = exports.getIgnoreRulesFromConfig = exports.applyIgnoreRules = exports.matchesIgnoreRule =
|
|
3
|
+
exports.loadIgnoreRules = exports.getIgnoreRulesFromConfig = exports.applyIgnoreRules = exports.matchesIgnoreRule = void 0;
|
|
4
4
|
const Consts_1 = require("../../common/Consts");
|
|
5
5
|
const LoggerMessages_1 = require("../../common/LoggerMessages");
|
|
6
6
|
const loadConfigIfExists_1 = require("../../common/utils/loadConfigIfExists");
|
|
@@ -17,7 +17,6 @@ const isRuleActive = (rule) => {
|
|
|
17
17
|
return true;
|
|
18
18
|
return Date.now() <= timestamp;
|
|
19
19
|
};
|
|
20
|
-
exports.isRuleActive = isRuleActive;
|
|
21
20
|
/**
|
|
22
21
|
* Проверяет, соответствует ли запись diff правилу игнорирования.
|
|
23
22
|
* Совмещает полное совпадение пути, префикс и регулярные выражения.
|
|
@@ -26,7 +25,7 @@ exports.isRuleActive = isRuleActive;
|
|
|
26
25
|
* @returns true если правило применимо к записи
|
|
27
26
|
*/
|
|
28
27
|
const matchesIgnoreRule = (entry, rule) => {
|
|
29
|
-
if (!
|
|
28
|
+
if (!isRuleActive(rule))
|
|
30
29
|
return false;
|
|
31
30
|
if (rule.path) {
|
|
32
31
|
if (entry.path === rule.path)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { OptionValues } from
|
|
2
|
-
import { CLICommandResult } from
|
|
1
|
+
import { OptionValues } from 'commander';
|
|
2
|
+
import { CLICommandResult } from '../types';
|
|
3
3
|
export declare const analyzeUsage: (options: OptionValues) => Promise<CLICommandResult>;
|
|
4
4
|
//# sourceMappingURL=analyzeUsage.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyzeUsage.d.ts","sourceRoot":"","sources":["../../../src/cli/analyzeUsage/analyzeUsage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"analyzeUsage.d.ts","sourceRoot":"","sources":["../../../src/cli/analyzeUsage/analyzeUsage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAGzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAO5C,eAAO,MAAM,YAAY,GAAU,SAAS,YAAY,KAAG,OAAO,CAAC,gBAAgB,CAwDlF,CAAC"}
|
|
@@ -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 +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,qBAAa,OAAO;IACJ,OAAO,CAAC,aAAa;gBAAb,aAAa,EAAE,UAAU;IAEtC,IAAI,IAAI,QAAQ;IA4CvB,OAAO,CAAC,6BAA6B;IA0CrC;;;OAGG;IACH,OAAO,CAAC,WAAW;IAsBnB,OAAO,CAAC,cAAc;CAGzB"}
|
|
@@ -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 ClientRule implements Rule {
|
|
4
4
|
check(context: ProjectContext, contract: Contract, stats: Stats): Promise<Finding[]>;
|
|
5
5
|
}
|
|
@@ -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,qBAAa,UAAW,YAAW,IAAI;IAC7B,KAAK,CAAC,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;CA0E7F"}
|
|
@@ -6,16 +6,14 @@ class ClientRule {
|
|
|
6
6
|
async check(context, contract, stats) {
|
|
7
7
|
const findings = [];
|
|
8
8
|
const checker = context.getTypeChecker();
|
|
9
|
-
const clientOptionsDecl = contract.sourceFile
|
|
10
|
-
.getExportedDeclarations()
|
|
11
|
-
.get("ClientOptions")?.[0];
|
|
9
|
+
const clientOptionsDecl = contract.sourceFile.getExportedDeclarations().get('ClientOptions')?.[0];
|
|
12
10
|
const expectedType = clientOptionsDecl?.getType();
|
|
13
11
|
if (!expectedType) {
|
|
14
12
|
findings.push({
|
|
15
|
-
id:
|
|
16
|
-
category:
|
|
17
|
-
severity:
|
|
18
|
-
message:
|
|
13
|
+
id: 'CLIENT_OPTIONS_TYPE_NOT_FOUND',
|
|
14
|
+
category: 'CONFIG',
|
|
15
|
+
severity: 'WARNING',
|
|
16
|
+
message: 'ClientOptions type was not found in the contract. createClient argument validation is limited.',
|
|
19
17
|
file: contract.sourceFile.getFilePath(),
|
|
20
18
|
line: 0,
|
|
21
19
|
});
|
|
@@ -25,12 +23,12 @@ class ClientRule {
|
|
|
25
23
|
const createClientNames = new Set();
|
|
26
24
|
for (const imp of imports) {
|
|
27
25
|
const moduleName = imp.getModuleSpecifierValue();
|
|
28
|
-
if (moduleName !==
|
|
26
|
+
if (moduleName !== '@lom-api' && !moduleName.startsWith('@lom-api/')) {
|
|
29
27
|
continue;
|
|
30
28
|
}
|
|
31
29
|
for (const namedImport of imp.getNamedImports()) {
|
|
32
|
-
if (namedImport.getName() ===
|
|
33
|
-
createClientNames.add(namedImport.getAliasNode()?.getText() ||
|
|
30
|
+
if (namedImport.getName() === 'createClient') {
|
|
31
|
+
createClientNames.add(namedImport.getAliasNode()?.getText() || 'createClient');
|
|
34
32
|
}
|
|
35
33
|
}
|
|
36
34
|
}
|
|
@@ -43,7 +41,7 @@ class ClientRule {
|
|
|
43
41
|
continue;
|
|
44
42
|
if (!createClientNames.has(expression.getText()))
|
|
45
43
|
continue;
|
|
46
|
-
stats.usedMethods.add(
|
|
44
|
+
stats.usedMethods.add('createClient');
|
|
47
45
|
const args = call.getArguments();
|
|
48
46
|
if (args.length === 0)
|
|
49
47
|
continue;
|
|
@@ -51,10 +49,10 @@ class ClientRule {
|
|
|
51
49
|
const providedType = checker.getTypeAtLocation(args[0]);
|
|
52
50
|
if (!providedType.isAssignableTo(expectedType)) {
|
|
53
51
|
findings.push({
|
|
54
|
-
id:
|
|
55
|
-
category:
|
|
56
|
-
severity:
|
|
57
|
-
message:
|
|
52
|
+
id: 'CLIENT_OPTIONS_MISMATCH',
|
|
53
|
+
category: 'TYPE_MISMATCH',
|
|
54
|
+
severity: 'ERROR',
|
|
55
|
+
message: 'createClient configuration object does not match ClientOptions from the generated API.',
|
|
58
56
|
file: file.getFilePath(),
|
|
59
57
|
line: args[0].getStartLineNumber(),
|
|
60
58
|
});
|
|
@@ -62,13 +60,13 @@ class ClientRule {
|
|
|
62
60
|
}
|
|
63
61
|
}
|
|
64
62
|
}
|
|
65
|
-
if (!stats.usedMethods.has(
|
|
63
|
+
if (!stats.usedMethods.has('createClient')) {
|
|
66
64
|
findings.push({
|
|
67
|
-
id:
|
|
68
|
-
category:
|
|
69
|
-
severity:
|
|
70
|
-
message:
|
|
71
|
-
file:
|
|
65
|
+
id: 'CLIENT_NOT_FOUND',
|
|
66
|
+
category: 'USAGE',
|
|
67
|
+
severity: 'WARNING',
|
|
68
|
+
message: 'No createClient call from @lom-api was found in src.',
|
|
69
|
+
file: 'Global',
|
|
72
70
|
line: 0,
|
|
73
71
|
});
|
|
74
72
|
}
|
|
@@ -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,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 ServiceRule implements Rule {
|
|
4
4
|
check(context: ProjectContext, contract: Contract, stats: Stats): Promise<Finding[]>;
|
|
5
5
|
private getExpectedParameterType;
|
|
@@ -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,qBAAa,WAAY,YAAW,IAAI;IAC9B,KAAK,CAAC,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IA8E1F,OAAO,CAAC,wBAAwB;CASnC"}
|