@conformetry/validation
v0.0.34
Published
Template matching, existence verification, and conformance validation orchestrator for Conformetry
Maintainers
Readme
👔 Conformetry Validation
The validation orchestrator for Conformetry: it matches instances to templates, checks the declared files exist, routes each document to the validator that claims its extension, and deduplicates what comes back.
npm install --save-dev @conformetry/validationUsage
import { ValidationService } from "@conformetry/validation";
const result = validationService.validate({
instances, // from DiscoveryService.findInstances
templates, // from DiscoveryService.collectTemplate
languageNames: ["typescript"], // optional filter
threshold: 0.9, // optional run-level conformance floor
});
// → { ok, fileResults, checkedPaths, scores, unmatched }Instances arrive from the caller. This package used to scan the workspace for
project.json files and infer scope from generator name suffixes, which made a
generic package depend on one repository's layout.
Order of checks
- Files exist. Every file the matched template declares is checked first,
whatever its extension. A missing file cannot be compared, and reporting it
once is clearer than every language reporting it in turn. See
@conformetry/languages, whoseFilesServiceowns that pass. - Documents compare. Each validator sees only the documents whose extensions it claims.
Instances that matched no template are reported alongside the content differences rather than skipped, so one report covers both "this file is wrong" and "conformetry cannot tell what this path was generated from".
Scoring
Each matched instance is scored by how much of its template it honours, and
passes when that reaches the threshold resolved for it — the instance group's,
else the generator's, else the run's, else a perfect 1.
Scores are taken before deduplication. Deduplication decides which template gets to print a shared file's finding, which is a reporting concern; a score answers how well one instance honours its own template, so collapsing the report must not change it.
ok is false when any instance falls below its threshold, or when any
instance matched no template at all — an unmatched path has no template to be
held to, so no threshold could excuse it.
Language resolution
Which languages a run needs is
@conformetry/languages's question, not
this package's. LanguagesService is injected, asked which engines claim the
extensions the run's templates declare, and its answer is what validate
dispatches over. An extension no language claims is compared line by line by
the text fallback, so no template file goes unchecked.
Nothing is imported on demand any more. That mechanism bought install-time
optionality nobody was spending — the fallback makes every run need the
package regardless — so the specifier registry, the module loader, and the
loadLanguageModule option went with it. The trade-off, and the three
alternatives weighed against it, are recorded in
ADR 0006.
Exports
ValidationService, ValidationDeduplicationService,
ValidationFindingsService, ValidationScoringService, ValidationModule,
and the RunValidationArguments, RunValidationResult, and
InstanceFileResults types.
Test
nx run conformetry-validation:vitestLicense
MIT — see LICENSE.
👔 Conformetry
This project was generated from the nestjs-service-project conformetry template.
🔭 Callidescope
Call stacks traced through projects/ic-suite/conformetry/conformetry-validation, deepest first. Each frame shows what it takes, what it returns, and what its documentation says.
| Measure | Value | | --- | --- | | Callables | 58 | | Files | 18 | | Calls traced | 61 | | Call stacks | 0 | | Deepest stack | 0 | | Stacks through recursion | 0 | | Unfollowable calls | 2 |
Limits
What this project is judged against, as declared in its own callidescope.config.ts.
| Limit | Value |
| --- | --- |
| maximumDepth | 13 |
| maximumBreadth | 10 |
Call stacks (depth)
None.
Breadth
| Callable | Breadth | Calls directly | Location |
| --- | --- | --- | --- |
| ValidationService.validate | 10 | ConfigurationService.matchInstances, ValidationService.selectValidators, LanguagesService.resolveValidators, ValidationService.readTemplateExtensions, ValidationService.map(…), ValidationScoringService.scoreInstances, ValidationDeduplicationService.deduplicate, ValidationFindingsService.buildUnmatchedResults, ValidationService.map(…), ValidationService.every(…) | projects/ic-suite/conformetry/conformetry-validation/src/modules/validation/validation.service.ts:194 |
| ValidationService.compareInstance | 6 | ConfigurationService.prepareDocuments, ValidationService.readClaimedExtensions, FilesService.checkInstanceFiles, ValidationService.map(…), ValidationService.flatMap(…), ValidationService.reduce(…) | projects/ic-suite/conformetry/conformetry-validation/src/modules/validation/validation.service.ts:57 |
| ValidationScoringService.scoreInstance | 5 | ValidationScoringService.reduce(…), ScoringService.calculateScore, ValidationScoringService.resolveThreshold, ValidationScoringService.resolveInstancePath, ValidationScoringService.some(…) | projects/ic-suite/conformetry/conformetry-validation/src/modules/validation/validation-scoring.service.ts:74 |
| Callable | Breadth | Calls directly | Location |
| --- | --- | --- | --- |
| ValidationService.inferPlaceholders | 5 | ConfigurationService.prepareDocuments, ValidationService.readClaimedExtensions, RunnerService.captureDocuments, ValidationService.flatMap(…), ValidationService.filter(…) | projects/ic-suite/conformetry/conformetry-validation/src/modules/validation/validation.service.ts:102 |
| RunnerService.runValidator | 4 | RunnerService.map(…), RunnerService.filter(…), RunnerService.filter(…), RunnerService.reduce(…) | projects/ic-suite/conformetry/conformetry-validation/src/modules/runner/runner.service.ts:108 |
| ValidationFindingsService.reportMissingPlaceholders | 3 | ValidationFindingsService.filter(…), ValidationFindingsService.map(…), ValidationFindingsService.map(…) | projects/ic-suite/conformetry/conformetry-validation/src/modules/validation/validation-findings.service.ts:109 |
| ValidationService.map(…) | 3 | ValidationService.inferPlaceholders, ValidationFindingsService.reportMissingPlaceholders, ValidationService.compareInstance | projects/ic-suite/conformetry/conformetry-validation/src/modules/validation/validation.service.ts:205 |
| ValidationDeduplicationService.deduplicate | 2 | ValidationDeduplicationService.selectOwners, ValidationDeduplicationService.flatMap(…) | projects/ic-suite/conformetry/conformetry-validation/src/modules/validation/validation-deduplication.service.ts:90 |
| ValidationFindingsService.buildUnmatchedResults | 2 | ValidationFindingsService.resolveTemplatesRootPath, ValidationFindingsService.map(…) | projects/ic-suite/conformetry/conformetry-validation/src/modules/validation/validation-findings.service.ts:69 |
| ValidationScoringService.scoreInstances | 2 | ValidationScoringService.scoreInstance, ValidationScoringService.resolveScoreKey | projects/ic-suite/conformetry/conformetry-validation/src/modules/validation/validation-scoring.service.ts:119 |
| RunnerService.captureDocuments | 1 | RunnerService.reduce(…) | projects/ic-suite/conformetry/conformetry-validation/src/modules/runner/runner.service.ts:75 |
| RunnerService.reduce(…) | 1 | RunnerService.find(…) | projects/ic-suite/conformetry/conformetry-validation/src/modules/runner/runner.service.ts:80 |
| RunnerService.find(…) | 1 | RunnerService.claimsDocument | projects/ic-suite/conformetry/conformetry-validation/src/modules/runner/runner.service.ts:81 |
| RunnerService.filter(…) | 1 | RunnerService.claimsDocument | projects/ic-suite/conformetry/conformetry-validation/src/modules/runner/runner.service.ts:112 |
| RunnerService.map(…) | 1 | RunnerService.validateDocument | projects/ic-suite/conformetry/conformetry-validation/src/modules/runner/runner.service.ts:115 |
| ValidationDeduplicationService.selectOwners | 1 | ValidationDeduplicationService.compareInstances | projects/ic-suite/conformetry/conformetry-validation/src/modules/validation/validation-deduplication.service.ts:57 |
| ValidationDeduplicationService.flatMap(…) | 1 | ValidationDeduplicationService.filter(…) | projects/ic-suite/conformetry/conformetry-validation/src/modules/validation/validation-deduplication.service.ts:94 |
| ValidationDeduplicationService.filter(…) | 1 | ValidationDeduplicationService.resolveFindingKey | projects/ic-suite/conformetry/conformetry-validation/src/modules/validation/validation-deduplication.service.ts:95 |
| ValidationFindingsService.resolveTemplatesRootPath | 1 | ValidationFindingsService.map(…) | projects/ic-suite/conformetry/conformetry-validation/src/modules/validation/validation-findings.service.ts:58 |
| ValidationFindingsService.map(…) | 1 | ValidationFindingsService.describeReason | projects/ic-suite/conformetry/conformetry-validation/src/modules/validation/validation-findings.service.ts:75 |
| ValidationFindingsService.map(…) | 1 | ValidationFindingsService.filter(…) | projects/ic-suite/conformetry/conformetry-validation/src/modules/validation/validation-findings.service.ts:121 |
| ValidationFindingsService.filter(…) | 1 | ValidationFindingsService.some(…) | projects/ic-suite/conformetry/conformetry-validation/src/modules/validation/validation-findings.service.ts:124 |
| ValidationScoringService.reduce(…) | 1 | ScoringService.sumWeights | projects/ic-suite/conformetry/conformetry-validation/src/modules/validation/validation-scoring.service.ts:75 |
| ValidationScoringService.some(…) | 1 | ValidationScoringService.some(…) | projects/ic-suite/conformetry/conformetry-validation/src/modules/validation/validation-scoring.service.ts:92 |
| ValidationService.map(…) | 1 | RunnerService.runValidator | projects/ic-suite/conformetry/conformetry-validation/src/modules/validation/validation.service.ts:68 |
| ValidationService.readClaimedExtensions | 1 | ValidationService.flatMap(…) | projects/ic-suite/conformetry/conformetry-validation/src/modules/validation/validation.service.ts:142 |
| ValidationService.readTemplateExtensions | 1 | ValidationService.flatMap(…) | projects/ic-suite/conformetry/conformetry-validation/src/modules/validation/validation.service.ts:151 |
| ValidationService.flatMap(…) | 1 | ValidationService.map(…) | projects/ic-suite/conformetry/conformetry-validation/src/modules/validation/validation.service.ts:154 |
| ValidationService.selectValidators | 1 | ValidationService.filter(…) | projects/ic-suite/conformetry/conformetry-validation/src/modules/validation/validation.service.ts:164 |
🕸️ Codependix
Dependency graphs exported by codependix, regenerated by nx run configuration:codependix:write.
Nx Neighborhood
graph LR
conformetry_cli["conformetry-cli"]
conformetry_configuration["conformetry-configuration"]
conformetry_core["conformetry-core"]
conformetry_examples["conformetry-examples"]
conformetry_languages["conformetry-languages"]
conformetry_nx["conformetry-nx"]
conformetry_validation["conformetry-validation"]
conformetry_cli --> conformetry_validation
conformetry_examples --> conformetry_validation
conformetry_nx --> conformetry_validation
conformetry_validation --> conformetry_configuration
conformetry_validation --> conformetry_core
conformetry_validation --> conformetry_languages
classDef subject fill:#7c3aed,color:#fff,stroke:#4c1d95,stroke-width:2px
class conformetry_validation subjectNestJS Module Graph
flowchart LR
ConfigurationModule
DifferencesModule
FilesModule
InputModule
InstanceDiscoveryModule
InstanceGroupModule
JsonModule
JupyterModule
LanguagesModule
MarkdownModule
PythonModule
RenderingModule
RunnerModule
ScoringModule
TemplateDiscoveryModule
TextModule
TypescriptModule
ValidationModule
ConfigurationModule --> InputModule
ConfigurationModule --> InstanceDiscoveryModule
ConfigurationModule --> InstanceGroupModule
ConfigurationModule --> RenderingModule
ConfigurationModule --> TemplateDiscoveryModule
FilesModule --> ConfigurationModule
FilesModule --> DifferencesModule
InstanceDiscoveryModule --> InstanceGroupModule
InstanceDiscoveryModule --> RenderingModule
InstanceDiscoveryModule --> TemplateDiscoveryModule
JsonModule --> ScoringModule
JupyterModule --> JsonModule
JupyterModule --> MarkdownModule
JupyterModule --> PythonModule
LanguagesModule --> JsonModule
LanguagesModule --> JupyterModule
LanguagesModule --> MarkdownModule
LanguagesModule --> PythonModule
LanguagesModule --> TextModule
LanguagesModule --> TypescriptModule
MarkdownModule --> ScoringModule
PythonModule --> DifferencesModule
PythonModule --> ScoringModule
TemplateDiscoveryModule --> RenderingModule
TypescriptModule --> ScoringModule
ValidationModule --> ConfigurationModule
ValidationModule --> FilesModule
ValidationModule --> LanguagesModule
ValidationModule --> RunnerModule
ValidationModule --> ScoringModuleFile Imports
graph LR
file_callidescope_config_ts["callidescope.config.ts"]
file_codependix_config_ts["codependix.config.ts"]
file_codometer_config_ts["codometer.config.ts"]
file_eslint_config_ts["eslint.config.ts"]
file_src_index_ts["src/index.ts"]
file_src_modules_runner_runner_constants_ts["src/modules/runner/runner.constants.ts"]
file_src_modules_runner_runner_module_ts["src/modules/runner/runner.module.ts"]
file_src_modules_runner_runner_module_unit_test_ts["src/modules/runner/runner.module.unit.test.ts"]
file_src_modules_runner_runner_service_ts["src/modules/runner/runner.service.ts"]
file_src_modules_runner_runner_service_unit_test_ts["src/modules/runner/runner.service.unit.test.ts"]
file_src_modules_runner_runner_types_ts["src/modules/runner/runner.types.ts"]
file_src_modules_validation_validation_deduplication_service_ts["src/modules/validation/validation-deduplication.service.ts"]
file_src_modules_validation_validation_deduplication_service_unit_test_ts["src/modules/validation/validation-deduplication.service.unit.test.ts"]
file_src_modules_validation_validation_findings_service_ts["src/modules/validation/validation-findings.service.ts"]
file_src_modules_validation_validation_findings_service_unit_test_ts["src/modules/validation/validation-findings.service.unit.test.ts"]
file_src_modules_validation_validation_scoring_service_ts["src/modules/validation/validation-scoring.service.ts"]
file_src_modules_validation_validation_scoring_service_unit_test_ts["src/modules/validation/validation-scoring.service.unit.test.ts"]
file_src_modules_validation_validation_constants_ts["src/modules/validation/validation.constants.ts"]
file_src_modules_validation_validation_module_ts["src/modules/validation/validation.module.ts"]
file_src_modules_validation_validation_service_ts["src/modules/validation/validation.service.ts"]
file_src_modules_validation_validation_service_unit_test_ts["src/modules/validation/validation.service.unit.test.ts"]
file_src_modules_validation_validation_types_ts["src/modules/validation/validation.types.ts"]
file_testing_mocks_ts["testing/mocks.ts"]
file_testing_setup_ts["testing/setup.ts"]
file_vite_config_ts["vite.config.ts"]
file_vitest_config_ts["vitest.config.ts"]
file_src_modules_runner_runner_module_ts --> file_src_modules_runner_runner_service_ts
file_src_modules_runner_runner_module_unit_test_ts --> file_src_modules_runner_runner_module_ts
file_src_modules_runner_runner_module_unit_test_ts --> file_src_modules_runner_runner_service_ts
file_src_modules_runner_runner_service_ts --> file_src_modules_runner_runner_types_ts
file_src_modules_runner_runner_service_unit_test_ts --> file_src_modules_runner_runner_service_ts
file_src_modules_validation_validation_deduplication_service_ts --> file_src_modules_validation_validation_constants_ts
file_src_modules_validation_validation_deduplication_service_ts --> file_src_modules_validation_validation_types_ts
file_src_modules_validation_validation_deduplication_service_unit_test_ts --> file_src_modules_validation_validation_deduplication_service_ts
file_src_modules_validation_validation_deduplication_service_unit_test_ts --> file_src_modules_validation_validation_types_ts
file_src_modules_validation_validation_findings_service_ts --> file_src_modules_validation_validation_types_ts
file_src_modules_validation_validation_findings_service_unit_test_ts --> file_src_modules_validation_validation_findings_service_ts
file_src_modules_validation_validation_scoring_service_ts --> file_src_modules_validation_validation_constants_ts
file_src_modules_validation_validation_scoring_service_ts --> file_src_modules_validation_validation_types_ts
file_src_modules_validation_validation_scoring_service_unit_test_ts --> file_src_modules_validation_validation_scoring_service_ts
file_src_modules_validation_validation_module_ts --> file_src_modules_runner_runner_module_ts
file_src_modules_validation_validation_module_ts --> file_src_modules_validation_validation_deduplication_service_ts
file_src_modules_validation_validation_module_ts --> file_src_modules_validation_validation_findings_service_ts
file_src_modules_validation_validation_module_ts --> file_src_modules_validation_validation_scoring_service_ts
file_src_modules_validation_validation_module_ts --> file_src_modules_validation_validation_service_ts
file_src_modules_validation_validation_service_ts --> file_src_modules_runner_runner_service_ts
file_src_modules_validation_validation_service_ts --> file_src_modules_validation_validation_deduplication_service_ts
file_src_modules_validation_validation_service_ts --> file_src_modules_validation_validation_findings_service_ts
file_src_modules_validation_validation_service_ts --> file_src_modules_validation_validation_scoring_service_ts
file_src_modules_validation_validation_service_ts --> file_src_modules_validation_validation_types_ts
file_src_modules_validation_validation_service_unit_test_ts --> file_src_modules_validation_validation_module_ts
file_src_modules_validation_validation_service_unit_test_ts --> file_src_modules_validation_validation_service_ts
file_src_modules_validation_validation_service_unit_test_ts --> file_src_modules_validation_validation_types_ts⏲️ Codometer
Project
Measured Targets
TypeScript
JavaScript
Python
JSON
YAML
TOML
Shell
SQL
HCL
CSS
Conventions
Jupyter
Markdown
