@primmel/primmel 1.3.2 → 1.4.1
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/dist/index.d.ts +40 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +112 -1
- package/dist/index.js.map +1 -1
- package/dist/src/check-allowlist.d.ts +56 -0
- package/dist/src/check-allowlist.d.ts.map +1 -0
- package/dist/src/check-allowlist.js +307 -0
- package/dist/src/check-allowlist.js.map +1 -0
- package/dist/src/check-rules.d.ts +17 -0
- package/dist/src/check-rules.d.ts.map +1 -0
- package/dist/src/check-rules.js +351 -0
- package/dist/src/check-rules.js.map +1 -0
- package/dist/src/check.d.ts +115 -0
- package/dist/src/check.d.ts.map +1 -0
- package/dist/src/check.js +4164 -0
- package/dist/src/check.js.map +1 -0
- package/dist/src/export/rdf-competency-questions.d.ts +11 -0
- package/dist/src/export/rdf-competency-questions.d.ts.map +1 -0
- package/dist/src/export/rdf-competency-questions.js +99 -0
- package/dist/src/export/rdf-competency-questions.js.map +1 -0
- package/dist/src/export/rdf-shapes.d.ts +3 -0
- package/dist/src/export/rdf-shapes.d.ts.map +1 -0
- package/dist/src/export/rdf-shapes.js +225 -0
- package/dist/src/export/rdf-shapes.js.map +1 -0
- package/dist/src/export/rdf-vocabulary.d.ts +125 -0
- package/dist/src/export/rdf-vocabulary.d.ts.map +1 -0
- package/dist/src/export/rdf-vocabulary.js +230 -0
- package/dist/src/export/rdf-vocabulary.js.map +1 -0
- package/dist/src/export/rdf.d.ts +92 -0
- package/dist/src/export/rdf.d.ts.map +1 -0
- package/dist/src/export/rdf.js +707 -0
- package/dist/src/export/rdf.js.map +1 -0
- package/dist/src/export/reqif.d.ts +81 -0
- package/dist/src/export/reqif.d.ts.map +1 -0
- package/dist/src/export/reqif.js +703 -0
- package/dist/src/export/reqif.js.map +1 -0
- package/dist/src/instance-resolution.d.ts +68 -0
- package/dist/src/instance-resolution.d.ts.map +1 -0
- package/dist/src/instance-resolution.js +239 -0
- package/dist/src/instance-resolution.js.map +1 -0
- package/dist/src/mapping-coverage.d.ts +220 -0
- package/dist/src/mapping-coverage.d.ts.map +1 -0
- package/dist/src/mapping-coverage.js +528 -0
- package/dist/src/mapping-coverage.js.map +1 -0
- package/dist/src/model-diff.d.ts +198 -0
- package/dist/src/model-diff.d.ts.map +1 -0
- package/dist/src/model-diff.js +914 -0
- package/dist/src/model-diff.js.map +1 -0
- package/dist/src/operational-state.d.ts +112 -0
- package/dist/src/operational-state.d.ts.map +1 -0
- package/dist/src/operational-state.js +162 -0
- package/dist/src/operational-state.js.map +1 -0
- package/dist/src/package-diff.d.ts +36 -0
- package/dist/src/package-diff.d.ts.map +1 -0
- package/dist/src/package-diff.js +104 -0
- package/dist/src/package-diff.js.map +1 -0
- package/dist/src/ser-des/config/acceptance.d.ts +10 -0
- package/dist/src/ser-des/config/acceptance.d.ts.map +1 -0
- package/dist/src/ser-des/config/acceptance.js +163 -0
- package/dist/src/ser-des/config/acceptance.js.map +1 -0
- package/dist/src/ser-des/config/activityArchetype.d.ts +5 -0
- package/dist/src/ser-des/config/activityArchetype.d.ts.map +1 -0
- package/dist/src/ser-des/config/activityArchetype.js +78 -0
- package/dist/src/ser-des/config/activityArchetype.js.map +1 -0
- package/dist/src/ser-des/config/artifact.d.ts +16 -0
- package/dist/src/ser-des/config/artifact.d.ts.map +1 -0
- package/dist/src/ser-des/config/artifact.js +392 -0
- package/dist/src/ser-des/config/artifact.js.map +1 -0
- package/dist/src/ser-des/config/calculation.d.ts.map +1 -1
- package/dist/src/ser-des/config/calculation.js +214 -12
- package/dist/src/ser-des/config/calculation.js.map +1 -1
- package/dist/src/ser-des/config/comment.d.ts +34 -0
- package/dist/src/ser-des/config/comment.d.ts.map +1 -0
- package/dist/src/ser-des/config/comment.js +121 -0
- package/dist/src/ser-des/config/comment.js.map +1 -0
- package/dist/src/ser-des/config/competenceKind.d.ts +8 -0
- package/dist/src/ser-des/config/competenceKind.d.ts.map +1 -0
- package/dist/src/ser-des/config/competenceKind.js +266 -0
- package/dist/src/ser-des/config/competenceKind.js.map +1 -0
- package/dist/src/ser-des/config/composition.d.ts +6 -0
- package/dist/src/ser-des/config/composition.d.ts.map +1 -0
- package/dist/src/ser-des/config/composition.js +165 -0
- package/dist/src/ser-des/config/composition.js.map +1 -0
- package/dist/src/ser-des/config/conformanceClass.d.ts +9 -0
- package/dist/src/ser-des/config/conformanceClass.d.ts.map +1 -0
- package/dist/src/ser-des/config/conformanceClass.js +128 -0
- package/dist/src/ser-des/config/conformanceClass.js.map +1 -0
- package/dist/src/ser-des/config/conformanceTest.d.ts +6 -0
- package/dist/src/ser-des/config/conformanceTest.d.ts.map +1 -0
- package/dist/src/ser-des/config/conformanceTest.js +929 -0
- package/dist/src/ser-des/config/conformanceTest.js.map +1 -0
- package/dist/src/ser-des/config/constraint.d.ts +5 -0
- package/dist/src/ser-des/config/constraint.d.ts.map +1 -0
- package/dist/src/ser-des/config/constraint.js +108 -0
- package/dist/src/ser-des/config/constraint.js.map +1 -0
- package/dist/src/ser-des/config/data.d.ts.map +1 -1
- package/dist/src/ser-des/config/data.js +105 -12
- package/dist/src/ser-des/config/data.js.map +1 -1
- package/dist/src/ser-des/config/design.d.ts +9 -0
- package/dist/src/ser-des/config/design.d.ts.map +1 -0
- package/dist/src/ser-des/config/design.js +847 -0
- package/dist/src/ser-des/config/design.js.map +1 -0
- package/dist/src/ser-des/config/discrepancyRecord.d.ts +5 -0
- package/dist/src/ser-des/config/discrepancyRecord.d.ts.map +1 -0
- package/dist/src/ser-des/config/discrepancyRecord.js +109 -0
- package/dist/src/ser-des/config/discrepancyRecord.js.map +1 -0
- package/dist/src/ser-des/config/dual.d.ts +9 -0
- package/dist/src/ser-des/config/dual.d.ts.map +1 -0
- package/dist/src/ser-des/config/dual.js +84 -0
- package/dist/src/ser-des/config/dual.js.map +1 -0
- package/dist/src/ser-des/config/field-parser.d.ts +92 -7
- package/dist/src/ser-des/config/field-parser.d.ts.map +1 -1
- package/dist/src/ser-des/config/field-parser.js +844 -29
- package/dist/src/ser-des/config/field-parser.js.map +1 -1
- package/dist/src/ser-des/config/form.d.ts.map +1 -1
- package/dist/src/ser-des/config/form.js +356 -134
- package/dist/src/ser-des/config/form.js.map +1 -1
- package/dist/src/ser-des/config/formulasUsed.d.ts +9 -0
- package/dist/src/ser-des/config/formulasUsed.d.ts.map +1 -0
- package/dist/src/ser-des/config/formulasUsed.js +126 -0
- package/dist/src/ser-des/config/formulasUsed.js.map +1 -0
- package/dist/src/ser-des/config/index.d.ts.map +1 -1
- package/dist/src/ser-des/config/index.js +180 -1
- package/dist/src/ser-des/config/index.js.map +1 -1
- package/dist/src/ser-des/config/instance.d.ts +22 -0
- package/dist/src/ser-des/config/instance.d.ts.map +1 -0
- package/dist/src/ser-des/config/instance.js +266 -0
- package/dist/src/ser-des/config/instance.js.map +1 -0
- package/dist/src/ser-des/config/invariant.d.ts +9 -0
- package/dist/src/ser-des/config/invariant.d.ts.map +1 -0
- package/dist/src/ser-des/config/invariant.js +143 -0
- package/dist/src/ser-des/config/invariant.js.map +1 -0
- package/dist/src/ser-des/config/mapProfile.d.ts.map +1 -1
- package/dist/src/ser-des/config/mapProfile.js +199 -14
- package/dist/src/ser-des/config/mapProfile.js.map +1 -1
- package/dist/src/ser-des/config/metadata.js +6 -6
- package/dist/src/ser-des/config/metadata.js.map +1 -1
- package/dist/src/ser-des/config/monitor.d.ts +9 -0
- package/dist/src/ser-des/config/monitor.d.ts.map +1 -0
- package/dist/src/ser-des/config/monitor.js +322 -0
- package/dist/src/ser-des/config/monitor.js.map +1 -0
- package/dist/src/ser-des/config/note.d.ts.map +1 -1
- package/dist/src/ser-des/config/note.js +16 -1
- package/dist/src/ser-des/config/note.js.map +1 -1
- package/dist/src/ser-des/config/packageManifest.d.ts +5 -0
- package/dist/src/ser-des/config/packageManifest.d.ts.map +1 -0
- package/dist/src/ser-des/config/packageManifest.js +349 -0
- package/dist/src/ser-des/config/packageManifest.js.map +1 -0
- package/dist/src/ser-des/config/passport.d.ts +9 -0
- package/dist/src/ser-des/config/passport.d.ts.map +1 -0
- package/dist/src/ser-des/config/passport.js +191 -0
- package/dist/src/ser-des/config/passport.js.map +1 -0
- package/dist/src/ser-des/config/process.d.ts +5 -3
- package/dist/src/ser-des/config/process.d.ts.map +1 -1
- package/dist/src/ser-des/config/process.js +915 -8
- package/dist/src/ser-des/config/process.js.map +1 -1
- package/dist/src/ser-des/config/quantity.d.ts +21 -0
- package/dist/src/ser-des/config/quantity.d.ts.map +1 -0
- package/dist/src/ser-des/config/quantity.js +114 -0
- package/dist/src/ser-des/config/quantity.js.map +1 -0
- package/dist/src/ser-des/config/quantityRegister.d.ts +9 -0
- package/dist/src/ser-des/config/quantityRegister.d.ts.map +1 -0
- package/dist/src/ser-des/config/quantityRegister.js +202 -0
- package/dist/src/ser-des/config/quantityRegister.js.map +1 -0
- package/dist/src/ser-des/config/reference.d.ts.map +1 -1
- package/dist/src/ser-des/config/reference.js +6 -0
- package/dist/src/ser-des/config/reference.js.map +1 -1
- package/dist/src/ser-des/config/referenceMaterial.d.ts +5 -0
- package/dist/src/ser-des/config/referenceMaterial.d.ts.map +1 -0
- package/dist/src/ser-des/config/referenceMaterial.js +296 -0
- package/dist/src/ser-des/config/referenceMaterial.js.map +1 -0
- package/dist/src/ser-des/config/requirement.d.ts +16 -0
- package/dist/src/ser-des/config/requirement.d.ts.map +1 -0
- package/dist/src/ser-des/config/requirement.js +579 -0
- package/dist/src/ser-des/config/requirement.js.map +1 -0
- package/dist/src/ser-des/config/role.d.ts.map +1 -1
- package/dist/src/ser-des/config/role.js +12 -0
- package/dist/src/ser-des/config/role.js.map +1 -1
- package/dist/src/ser-des/config/series.d.ts +9 -0
- package/dist/src/ser-des/config/series.d.ts.map +1 -0
- package/dist/src/ser-des/config/series.js +121 -0
- package/dist/src/ser-des/config/series.js.map +1 -0
- package/dist/src/ser-des/config/sourceDiscrepancy.d.ts +11 -0
- package/dist/src/ser-des/config/sourceDiscrepancy.d.ts.map +1 -0
- package/dist/src/ser-des/config/sourceDiscrepancy.js +83 -0
- package/dist/src/ser-des/config/sourceDiscrepancy.js.map +1 -0
- package/dist/src/ser-des/config/stateMachine.d.ts.map +1 -1
- package/dist/src/ser-des/config/stateMachine.js +189 -38
- package/dist/src/ser-des/config/stateMachine.js.map +1 -1
- package/dist/src/ser-des/config/subform.d.ts.map +1 -1
- package/dist/src/ser-des/config/subform.js +25 -33
- package/dist/src/ser-des/config/subform.js.map +1 -1
- package/dist/src/ser-des/config/subject.d.ts +58 -0
- package/dist/src/ser-des/config/subject.d.ts.map +1 -0
- package/dist/src/ser-des/config/subject.js +2093 -0
- package/dist/src/ser-des/config/subject.js.map +1 -0
- package/dist/src/ser-des/config/symbol.d.ts.map +1 -1
- package/dist/src/ser-des/config/symbol.js +130 -6
- package/dist/src/ser-des/config/symbol.js.map +1 -1
- package/dist/src/ser-des/config/table.d.ts.map +1 -1
- package/dist/src/ser-des/config/table.js +373 -7
- package/dist/src/ser-des/config/table.js.map +1 -1
- package/dist/src/ser-des/config/term.d.ts.map +1 -1
- package/dist/src/ser-des/config/term.js +107 -0
- package/dist/src/ser-des/config/term.js.map +1 -1
- package/dist/src/ser-des/config/testPointSet.d.ts +5 -0
- package/dist/src/ser-des/config/testPointSet.d.ts.map +1 -0
- package/dist/src/ser-des/config/testPointSet.js +199 -0
- package/dist/src/ser-des/config/testPointSet.js.map +1 -0
- package/dist/src/ser-des/config/testSequence.d.ts +9 -0
- package/dist/src/ser-des/config/testSequence.d.ts.map +1 -0
- package/dist/src/ser-des/config/testSequence.js +206 -0
- package/dist/src/ser-des/config/testSequence.js.map +1 -0
- package/dist/src/ser-des/config/text.d.ts +5 -0
- package/dist/src/ser-des/config/text.d.ts.map +1 -0
- package/dist/src/ser-des/config/text.js +106 -0
- package/dist/src/ser-des/config/text.js.map +1 -0
- package/dist/src/ser-des/config/twin.d.ts +31 -0
- package/dist/src/ser-des/config/twin.d.ts.map +1 -0
- package/dist/src/ser-des/config/twin.js +362 -0
- package/dist/src/ser-des/config/twin.js.map +1 -0
- package/dist/src/ser-des/config/verdict.d.ts +5 -0
- package/dist/src/ser-des/config/verdict.d.ts.map +1 -0
- package/dist/src/ser-des/config/verdict.js +159 -0
- package/dist/src/ser-des/config/verdict.js.map +1 -0
- package/dist/src/ser-des/config/viewProfile.d.ts.map +1 -1
- package/dist/src/ser-des/config/viewProfile.js +7 -0
- package/dist/src/ser-des/config/viewProfile.js.map +1 -1
- package/dist/src/ser-des/includes.d.ts.map +1 -1
- package/dist/src/ser-des/includes.js +5 -2
- package/dist/src/ser-des/includes.js.map +1 -1
- package/dist/src/ser-des/index.d.ts +12 -0
- package/dist/src/ser-des/index.d.ts.map +1 -1
- package/dist/src/ser-des/index.js +42 -0
- package/dist/src/ser-des/index.js.map +1 -1
- package/dist/src/ser-des/package.d.ts +53 -0
- package/dist/src/ser-des/package.d.ts.map +1 -0
- package/dist/src/ser-des/package.js +404 -0
- package/dist/src/ser-des/package.js.map +1 -0
- package/dist/src/ser-des/parse-block.d.ts.map +1 -1
- package/dist/src/ser-des/parse-block.js +7 -1
- package/dist/src/ser-des/parse-block.js.map +1 -1
- package/dist/src/ser-des/parse.d.ts.map +1 -1
- package/dist/src/ser-des/parse.js +45 -0
- package/dist/src/ser-des/parse.js.map +1 -1
- package/dist/src/ser-des/prm.d.ts +53 -0
- package/dist/src/ser-des/prm.d.ts.map +1 -0
- package/dist/src/ser-des/prm.js +257 -0
- package/dist/src/ser-des/prm.js.map +1 -0
- package/dist/src/ser-des/resolve.d.ts.map +1 -1
- package/dist/src/ser-des/resolve.js +1 -0
- package/dist/src/ser-des/resolve.js.map +1 -1
- package/dist/src/ser-des/tokenize.d.ts +11 -0
- package/dist/src/ser-des/tokenize.d.ts.map +1 -1
- package/dist/src/ser-des/tokenize.js +28 -1
- package/dist/src/ser-des/tokenize.js.map +1 -1
- package/dist/src/ser-des/types.d.ts +56 -1
- package/dist/src/ser-des/types.d.ts.map +1 -1
- package/dist/src/spelling.d.ts +35 -0
- package/dist/src/spelling.d.ts.map +1 -0
- package/dist/src/spelling.js +140 -0
- package/dist/src/spelling.js.map +1 -0
- package/dist/src/text-coverage.d.ts +164 -0
- package/dist/src/text-coverage.d.ts.map +1 -0
- package/dist/src/text-coverage.js +679 -0
- package/dist/src/text-coverage.js.map +1 -0
- package/dist/src/time.d.ts +55 -0
- package/dist/src/time.d.ts.map +1 -0
- package/dist/src/time.js +223 -0
- package/dist/src/time.js.map +1 -0
- package/dist/src/type-expr.d.ts +31 -0
- package/dist/src/type-expr.d.ts.map +1 -0
- package/dist/src/type-expr.js +110 -0
- package/dist/src/type-expr.js.map +1 -0
- package/dist/src/types/Acceptance.d.ts +31 -0
- package/dist/src/types/Acceptance.d.ts.map +1 -0
- package/dist/src/types/Acceptance.js +12 -0
- package/dist/src/types/Acceptance.js.map +1 -0
- package/dist/src/types/ActivityArchetype.d.ts +14 -0
- package/dist/src/types/ActivityArchetype.d.ts.map +1 -0
- package/dist/src/types/ActivityArchetype.js +17 -0
- package/dist/src/types/ActivityArchetype.js.map +1 -0
- package/dist/src/types/Artifact.d.ts +117 -0
- package/dist/src/types/Artifact.d.ts.map +1 -0
- package/dist/src/types/Artifact.js +35 -0
- package/dist/src/types/Artifact.js.map +1 -0
- package/dist/src/types/Calculation.d.ts +49 -0
- package/dist/src/types/Calculation.d.ts.map +1 -1
- package/dist/src/types/Comment.d.ts +23 -0
- package/dist/src/types/Comment.d.ts.map +1 -0
- package/dist/src/types/Comment.js +3 -0
- package/dist/src/types/Comment.js.map +1 -0
- package/dist/src/types/CompetenceKind.d.ts +70 -0
- package/dist/src/types/CompetenceKind.d.ts.map +1 -0
- package/dist/src/types/CompetenceKind.js +3 -0
- package/dist/src/types/CompetenceKind.js.map +1 -0
- package/dist/src/types/Composition.d.ts +80 -0
- package/dist/src/types/Composition.d.ts.map +1 -0
- package/dist/src/types/Composition.js +44 -0
- package/dist/src/types/Composition.js.map +1 -0
- package/dist/src/types/ConformanceClass.d.ts +22 -0
- package/dist/src/types/ConformanceClass.d.ts.map +1 -0
- package/dist/src/types/ConformanceClass.js +7 -0
- package/dist/src/types/ConformanceClass.js.map +1 -0
- package/dist/src/types/ConformanceTest.d.ts +206 -0
- package/dist/src/types/ConformanceTest.d.ts.map +1 -0
- package/dist/src/types/ConformanceTest.js +3 -0
- package/dist/src/types/ConformanceTest.js.map +1 -0
- package/dist/src/types/Constraint.d.ts +34 -0
- package/dist/src/types/Constraint.d.ts.map +1 -0
- package/dist/src/types/Constraint.js +3 -0
- package/dist/src/types/Constraint.js.map +1 -0
- package/dist/src/types/Design.d.ts +147 -0
- package/dist/src/types/Design.d.ts.map +1 -0
- package/dist/src/types/Design.js +10 -0
- package/dist/src/types/Design.js.map +1 -0
- package/dist/src/types/DiscrepancyRecord.d.ts +42 -0
- package/dist/src/types/DiscrepancyRecord.d.ts.map +1 -0
- package/dist/src/types/DiscrepancyRecord.js +3 -0
- package/dist/src/types/DiscrepancyRecord.js.map +1 -0
- package/dist/src/types/Form.d.ts +132 -1
- package/dist/src/types/Form.d.ts.map +1 -1
- package/dist/src/types/FormulasUsed.d.ts +95 -0
- package/dist/src/types/FormulasUsed.d.ts.map +1 -0
- package/dist/src/types/FormulasUsed.js +64 -0
- package/dist/src/types/FormulasUsed.js.map +1 -0
- package/dist/src/types/Instance.d.ts +105 -0
- package/dist/src/types/Instance.d.ts.map +1 -0
- package/dist/src/types/Instance.js +40 -0
- package/dist/src/types/Instance.js.map +1 -0
- package/dist/src/types/Invariant.d.ts +82 -0
- package/dist/src/types/Invariant.d.ts.map +1 -0
- package/dist/src/types/Invariant.js +50 -0
- package/dist/src/types/Invariant.js.map +1 -0
- package/dist/src/types/MapProfile.d.ts +36 -1
- package/dist/src/types/MapProfile.d.ts.map +1 -1
- package/dist/src/types/Monitor.d.ts +144 -0
- package/dist/src/types/Monitor.d.ts.map +1 -0
- package/dist/src/types/Monitor.js +74 -0
- package/dist/src/types/Monitor.js.map +1 -0
- package/dist/src/types/Note.d.ts +4 -1
- package/dist/src/types/Note.d.ts.map +1 -1
- package/dist/src/types/Package.d.ts +161 -0
- package/dist/src/types/Package.d.ts.map +1 -0
- package/dist/src/types/Package.js +3 -0
- package/dist/src/types/Package.js.map +1 -0
- package/dist/src/types/Passport.d.ts +125 -0
- package/dist/src/types/Passport.d.ts.map +1 -0
- package/dist/src/types/Passport.js +84 -0
- package/dist/src/types/Passport.js.map +1 -0
- package/dist/src/types/Quantity.d.ts +99 -0
- package/dist/src/types/Quantity.d.ts.map +1 -0
- package/dist/src/types/Quantity.js +24 -0
- package/dist/src/types/Quantity.js.map +1 -0
- package/dist/src/types/Reference.d.ts +2 -0
- package/dist/src/types/Reference.d.ts.map +1 -1
- package/dist/src/types/ReferenceMaterial.d.ts +53 -0
- package/dist/src/types/ReferenceMaterial.d.ts.map +1 -0
- package/dist/src/types/ReferenceMaterial.js +14 -0
- package/dist/src/types/ReferenceMaterial.js.map +1 -0
- package/dist/src/types/Requirement.d.ts +111 -0
- package/dist/src/types/Requirement.d.ts.map +1 -0
- package/dist/src/types/Requirement.js +10 -0
- package/dist/src/types/Requirement.js.map +1 -0
- package/dist/src/types/Role.d.ts +4 -0
- package/dist/src/types/Role.d.ts.map +1 -1
- package/dist/src/types/Series.d.ts +31 -0
- package/dist/src/types/Series.d.ts.map +1 -0
- package/dist/src/types/Series.js +14 -0
- package/dist/src/types/Series.js.map +1 -0
- package/dist/src/types/SourceDiscrepancy.d.ts +21 -0
- package/dist/src/types/SourceDiscrepancy.d.ts.map +1 -0
- package/dist/src/types/SourceDiscrepancy.js +13 -0
- package/dist/src/types/SourceDiscrepancy.js.map +1 -0
- package/dist/src/types/Standard.d.ts +68 -0
- package/dist/src/types/Standard.d.ts.map +1 -1
- package/dist/src/types/StateMachine.d.ts +43 -0
- package/dist/src/types/StateMachine.d.ts.map +1 -1
- package/dist/src/types/StateMachine.js +7 -0
- package/dist/src/types/StateMachine.js.map +1 -1
- package/dist/src/types/Subject.d.ts +432 -0
- package/dist/src/types/Subject.d.ts.map +1 -0
- package/dist/src/types/Subject.js +13 -0
- package/dist/src/types/Subject.js.map +1 -0
- package/dist/src/types/Symbol.d.ts +31 -1
- package/dist/src/types/Symbol.d.ts.map +1 -1
- package/dist/src/types/Table.d.ts +43 -0
- package/dist/src/types/Table.d.ts.map +1 -1
- package/dist/src/types/Term.d.ts +29 -0
- package/dist/src/types/Term.d.ts.map +1 -1
- package/dist/src/types/TestPointSet.d.ts +33 -0
- package/dist/src/types/TestPointSet.d.ts.map +1 -0
- package/dist/src/types/TestPointSet.js +11 -0
- package/dist/src/types/TestPointSet.js.map +1 -0
- package/dist/src/types/TestSequence.d.ts +105 -0
- package/dist/src/types/TestSequence.d.ts.map +1 -0
- package/dist/src/types/TestSequence.js +65 -0
- package/dist/src/types/TestSequence.js.map +1 -0
- package/dist/src/types/Text.d.ts +21 -0
- package/dist/src/types/Text.d.ts.map +1 -0
- package/dist/src/types/Text.js +38 -0
- package/dist/src/types/Text.js.map +1 -0
- package/dist/src/types/Time.d.ts +43 -0
- package/dist/src/types/Time.d.ts.map +1 -0
- package/dist/src/types/Time.js +14 -0
- package/dist/src/types/Time.js.map +1 -0
- package/dist/src/types/Twin.d.ts +155 -0
- package/dist/src/types/Twin.d.ts.map +1 -0
- package/dist/src/types/Twin.js +102 -0
- package/dist/src/types/Twin.js.map +1 -0
- package/dist/src/types/Verdict.d.ts +40 -0
- package/dist/src/types/Verdict.d.ts.map +1 -0
- package/dist/src/types/Verdict.js +14 -0
- package/dist/src/types/Verdict.js.map +1 -0
- package/dist/src/types/ViewProfile.d.ts +6 -0
- package/dist/src/types/ViewProfile.d.ts.map +1 -1
- package/dist/src/types/data.d.ts +27 -0
- package/dist/src/types/data.d.ts.map +1 -1
- package/dist/src/types/process.d.ts +231 -0
- package/dist/src/types/process.d.ts.map +1 -1
- package/dist-browser/index.mjs +6699 -661
- package/dist-cli/primmel.mjs +21462 -0
- package/package.json +61 -5
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
// ─────────────────────────────────────────────────────────────────────
|
|
3
|
-
// Shared FormField parser.
|
|
3
|
+
// Shared FormField parser + dumper.
|
|
4
4
|
//
|
|
5
5
|
// Both form.ts (for `form` construct) and subform.ts (for `subform`
|
|
6
6
|
// construct) need to parse the same `field <name> { ... }` block shape.
|
|
@@ -9,35 +9,259 @@
|
|
|
9
9
|
//
|
|
10
10
|
// Extracted here so both can import without circular-dependency issues
|
|
11
11
|
// (this file imports only from tokenize + types, never from form/subform).
|
|
12
|
+
//
|
|
13
|
+
// The module has since become the shared home for the small field-level
|
|
14
|
+
// helpers every construct ser-des needs — dumpBareSafe, stripColon,
|
|
15
|
+
// readBalanced, and the verbatim-identical subBlockTokens /
|
|
16
|
+
// readEntryTokens / readSource copies the passport/invariant/monitor/
|
|
17
|
+
// formulasUsed and source-carrying constructs each carried (the E11
|
|
18
|
+
// review minor).
|
|
19
|
+
//
|
|
20
|
+
// v2 parser repair (W1a):
|
|
21
|
+
// - Scalar values use stripWrapping (unwrapBlock mangles bare tokens:
|
|
22
|
+
// `true` → `ru`, `computed` → `ompute`, `42` → ``).
|
|
23
|
+
// - Typed field heads (`field x : number { … }`) are parsed, not lost.
|
|
24
|
+
// - calculation_bindings / evaluation / items / nested fields /
|
|
25
|
+
// min_items / max_items are POPULATED (previously parsed-then-skipped).
|
|
26
|
+
// - Nested `subform_ref` inside a field block is captured.
|
|
27
|
+
// - dumpFormField emits the full field fidelity (lossless round-trip).
|
|
12
28
|
// ─────────────────────────────────────────────────────────────────────
|
|
13
29
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
30
|
+
exports.readValueToken = readValueToken;
|
|
31
|
+
exports.parseValueEntries = parseValueEntries;
|
|
32
|
+
exports.dumpBareSafe = dumpBareSafe;
|
|
33
|
+
exports.stripColon = stripColon;
|
|
34
|
+
exports.readBalanced = readBalanced;
|
|
35
|
+
exports.subBlockTokens = subBlockTokens;
|
|
36
|
+
exports.readEntryTokens = readEntryTokens;
|
|
37
|
+
exports.readSource = readSource;
|
|
38
|
+
exports.readFieldHead = readFieldHead;
|
|
14
39
|
exports.parseFormField = parseFormField;
|
|
40
|
+
exports.parseApplicability = parseApplicability;
|
|
41
|
+
exports.parseSubformRef = parseSubformRef;
|
|
42
|
+
exports.dumpFormField = dumpFormField;
|
|
43
|
+
exports.dumpApplicabilityEntries = dumpApplicabilityEntries;
|
|
44
|
+
exports.parseRoleReferences = parseRoleReferences;
|
|
45
|
+
exports.dumpRoleReferences = dumpRoleReferences;
|
|
15
46
|
const tokenize_1 = require("../tokenize");
|
|
47
|
+
const tokenize_2 = require("../tokenize");
|
|
48
|
+
const series_1 = require("./series");
|
|
49
|
+
const sourceDiscrepancy_1 = require("./sourceDiscrepancy");
|
|
50
|
+
/**
|
|
51
|
+
* Read a value token, accumulating inline `ocl{…}` expressions that the
|
|
52
|
+
* whitespace tokenizer splits (braces are only block delimiters at token
|
|
53
|
+
* start, so `ocl{(a - b) / c}` arrives as several tokens).
|
|
54
|
+
*/
|
|
55
|
+
function readValueToken(t, i) {
|
|
56
|
+
const tok = t[i] ?? '';
|
|
57
|
+
if (!tok.startsWith('ocl{')) {
|
|
58
|
+
return { text: tok, next: i + 1 };
|
|
59
|
+
}
|
|
60
|
+
const delta = (s) => (s.match(/\{/g) || []).length - (s.match(/\}/g) || []).length;
|
|
61
|
+
let text = tok;
|
|
62
|
+
let depth = delta(tok);
|
|
63
|
+
let j = i + 1;
|
|
64
|
+
while (depth > 0 && j < t.length) {
|
|
65
|
+
const nt = t[j++];
|
|
66
|
+
depth += delta(nt);
|
|
67
|
+
text += ' ' + nt;
|
|
68
|
+
}
|
|
69
|
+
return { text, next: j };
|
|
70
|
+
}
|
|
16
71
|
/**
|
|
17
|
-
* Parse a
|
|
72
|
+
* Parse a values / enum_values block: bare entries, optionally with a
|
|
73
|
+
* display-label block — `{ kg { label "Kg" } g }` or `[A, B]`.
|
|
74
|
+
*/
|
|
75
|
+
function parseValueEntries(raw) {
|
|
76
|
+
const inner = raw
|
|
77
|
+
.trim()
|
|
78
|
+
.replace(/^[[{]/, '')
|
|
79
|
+
.replace(/[\]}]$/, '');
|
|
80
|
+
const t = (0, tokenize_2.tokenizePackage)(inner);
|
|
81
|
+
const out = [];
|
|
82
|
+
let i = 0;
|
|
83
|
+
while (i < t.length) {
|
|
84
|
+
const entry = (0, tokenize_2.stripWrapping)(t[i++].replace(/,$/, ''));
|
|
85
|
+
if (!entry) {
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
if (i < t.length && t[i].startsWith('{')) {
|
|
89
|
+
const lb = (0, tokenize_2.tokenizePackage)((0, tokenize_2.unwrapBlock)(t[i++]));
|
|
90
|
+
let label = '';
|
|
91
|
+
for (let k = 0; k + 1 < lb.length; k += 2) {
|
|
92
|
+
if (lb[k] === 'label') {
|
|
93
|
+
label = (0, tokenize_2.stripWrapping)(lb[k + 1]);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
out.push({ value: entry, label });
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
out.push(entry);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return out;
|
|
103
|
+
}
|
|
104
|
+
/** Dump one values / enum_values entry (label block when present). */
|
|
105
|
+
function dumpValueEntry(e) {
|
|
106
|
+
if (typeof e === 'string') {
|
|
107
|
+
return e;
|
|
108
|
+
}
|
|
109
|
+
return e.value + ' { label "' + (0, tokenize_2.escapeString)(e.label) + '" }';
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Emit a bare value safely: quote it when it contains spaces/braces/quotes
|
|
113
|
+
* OR ends in a colon OR STARTS with a comment opener (`#` or `//`).
|
|
114
|
+
* A bare trailing-colon token re-parses as a KEY head (`note : ref:` reads
|
|
115
|
+
* back as two entries — see isKeyHead in the instance ser-des), so any
|
|
116
|
+
* value ending in `:` must be quoted on dump. The tokenizer only treats
|
|
117
|
+
* `#`/`//` as a comment BETWEEN tokens — a mid-token `#` or `//` is
|
|
118
|
+
* literal (`StdS#Process5` round-trips bare; the v2 map_profile form
|
|
119
|
+
* depends on it) — but a LEADING `#` or `//` starts a to-end-of-line
|
|
120
|
+
* comment on re-parse (tokenize.ts's two comment openers) and the value
|
|
121
|
+
* vanishes, so a value starting with either must never dump bare (the
|
|
122
|
+
* E10 vocabulary-value exposure; the `//` half is TODO.v2/13 item 1).
|
|
123
|
+
*/
|
|
124
|
+
function dumpBareSafe(v) {
|
|
125
|
+
return /[\s{}"]/.test(v) ||
|
|
126
|
+
v.endsWith(':') ||
|
|
127
|
+
v.startsWith('#') ||
|
|
128
|
+
v.startsWith('//')
|
|
129
|
+
? '"' + (0, tokenize_2.escapeString)(v) + '"'
|
|
130
|
+
: v;
|
|
131
|
+
}
|
|
132
|
+
/** Strip one trailing colon: `status:` → `status` (tokenizer keeps colons attached). */
|
|
133
|
+
function stripColon(x) {
|
|
134
|
+
return x.endsWith(':') ? x.slice(0, -1) : x;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Read a balanced `[...]` or `{...}` value that may span whitespace.
|
|
138
|
+
* The tokenizer is brace-aware only for `{...}`; `[A, C]` lists split
|
|
139
|
+
* across tokens. `t[i]` is the token to start from; returns the joined
|
|
140
|
+
* text and the next unconsumed index.
|
|
141
|
+
*/
|
|
142
|
+
function readBalanced(t, i) {
|
|
143
|
+
const first = t[i] ?? '';
|
|
144
|
+
if (!first.startsWith('[')) {
|
|
145
|
+
return { text: first, next: i + 1 };
|
|
146
|
+
}
|
|
147
|
+
let text = first;
|
|
148
|
+
let j = i + 1;
|
|
149
|
+
while (!text.includes(']') && j < t.length) {
|
|
150
|
+
text += ' ' + t[j++];
|
|
151
|
+
}
|
|
152
|
+
return { text, next: j };
|
|
153
|
+
}
|
|
154
|
+
/** Strip the sketch's optional `;` separators from a sub-block stream. */
|
|
155
|
+
function subBlockTokens(block) {
|
|
156
|
+
return (0, tokenize_2.tokenizePackage)(block)
|
|
157
|
+
.map(s => s.replace(/^;+|;+$/g, ''))
|
|
158
|
+
.filter(s => s.length > 0);
|
|
159
|
+
}
|
|
160
|
+
/** Read a content-entry token stream: `{ a b }` block, or a single bare
|
|
161
|
+
* entry. Commas are optional noise (the §15.8 sketch spelling). */
|
|
162
|
+
function readEntryTokens(value) {
|
|
163
|
+
if (value.startsWith('{')) {
|
|
164
|
+
return subBlockTokens((0, tokenize_2.unwrapBlock)(value))
|
|
165
|
+
.flatMap(s => s.split(','))
|
|
166
|
+
.map(s => (0, tokenize_2.stripWrapping)(s.trim()))
|
|
167
|
+
.filter(s => s.length > 0);
|
|
168
|
+
}
|
|
169
|
+
const single = (0, tokenize_2.stripWrapping)(value);
|
|
170
|
+
return single === '' ? [] : [single];
|
|
171
|
+
}
|
|
172
|
+
/** Read one `source { doc "…" clause "…" [fragment "…"] }` block — the
|
|
173
|
+
* requirement/test_point_set provenance idiom. Unknown keys are skipped
|
|
174
|
+
* (forward compatibility); last wins on a repeated key. */
|
|
175
|
+
function readSource(block) {
|
|
176
|
+
const src = { doc: '', clause: '' };
|
|
177
|
+
const t = (0, tokenize_1.default)(block);
|
|
178
|
+
let i = 0;
|
|
179
|
+
while (i < t.length) {
|
|
180
|
+
const cmd = t[i++];
|
|
181
|
+
if (i >= t.length) {
|
|
182
|
+
break;
|
|
183
|
+
}
|
|
184
|
+
if (cmd === 'doc') {
|
|
185
|
+
src.doc = (0, tokenize_2.stripWrapping)(t[i++]);
|
|
186
|
+
}
|
|
187
|
+
else if (cmd === 'clause') {
|
|
188
|
+
src.clause = (0, tokenize_2.stripWrapping)(t[i++]);
|
|
189
|
+
}
|
|
190
|
+
else if (cmd === 'fragment') {
|
|
191
|
+
src.fragment = (0, tokenize_2.stripWrapping)(t[i++]);
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
(0, tokenize_2.unwrapBlock)(t[i++]);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return src;
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Read a field head: `name [: type] { ...block... }`.
|
|
201
|
+
* `t[i]` must be the token AFTER the `field` keyword. Returns null when
|
|
202
|
+
* the shape is not a field head (caller may treat it as something else,
|
|
203
|
+
* e.g. a bare `subform_ref`).
|
|
204
|
+
*/
|
|
205
|
+
function readFieldHead(t, i) {
|
|
206
|
+
const name = t[i++];
|
|
207
|
+
if (name === undefined) {
|
|
208
|
+
return null;
|
|
209
|
+
}
|
|
210
|
+
let type = '';
|
|
211
|
+
if (t[i] === ':') {
|
|
212
|
+
i++;
|
|
213
|
+
type = t[i++] ?? '';
|
|
214
|
+
// Optional cardinality after the type, e.g. `: string [0..*]`
|
|
215
|
+
if (t[i] && t[i].startsWith('[') && t[i].endsWith(']')) {
|
|
216
|
+
i++;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
const blockToken = t[i++];
|
|
220
|
+
if (blockToken === undefined || !blockToken.startsWith('{')) {
|
|
221
|
+
return null;
|
|
222
|
+
}
|
|
223
|
+
return { name, type, block: (0, tokenize_2.unwrapBlock)(blockToken), next: i };
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Parse a `field <name> [: <type>] { ... }` block into a FormField.
|
|
18
227
|
*
|
|
19
|
-
* Caller passes the field name (the token consumed before the brace)
|
|
20
|
-
*
|
|
21
|
-
* populated FormField with all
|
|
22
|
-
* unknown ones skipped (forward-compatible).
|
|
228
|
+
* Caller passes the field name (the token consumed before the brace),
|
|
229
|
+
* the raw block content (inside the braces), and optionally the declared
|
|
230
|
+
* type from the field head. Returns a fully populated FormField with all
|
|
231
|
+
* known sub-keywords processed and unknown ones skipped (forward-compatible).
|
|
23
232
|
*/
|
|
24
|
-
function parseFormField(name, block) {
|
|
233
|
+
function parseFormField(name, block, type) {
|
|
25
234
|
const field = {
|
|
26
235
|
name,
|
|
27
|
-
type: 'string',
|
|
236
|
+
type: type || 'string',
|
|
237
|
+
typeDeclared: !!type,
|
|
28
238
|
label: '',
|
|
29
239
|
definition: '',
|
|
30
240
|
unit: '',
|
|
241
|
+
symbol: '',
|
|
242
|
+
verdict: '',
|
|
243
|
+
targets: [],
|
|
244
|
+
dimension: '',
|
|
245
|
+
enumRef: '',
|
|
246
|
+
pattern: '',
|
|
31
247
|
required: false,
|
|
248
|
+
requiredWhen: '',
|
|
32
249
|
measurementMethod: '',
|
|
33
250
|
calculationId: null,
|
|
34
251
|
calculationBindings: [],
|
|
35
252
|
derivation: '',
|
|
36
253
|
evaluation: null,
|
|
37
254
|
values: [],
|
|
255
|
+
trueLabel: '',
|
|
256
|
+
falseLabel: '',
|
|
257
|
+
enumValues: [],
|
|
38
258
|
defaultValue: '',
|
|
39
259
|
hasDefault: false,
|
|
40
260
|
referenceIds: [],
|
|
261
|
+
fieldReferences: [],
|
|
262
|
+
specificationReference: '',
|
|
263
|
+
applicability: [],
|
|
264
|
+
sourceDiscrepancy: null,
|
|
41
265
|
fields: [],
|
|
42
266
|
itemsType: '',
|
|
43
267
|
subformRef: null,
|
|
@@ -45,7 +269,9 @@ function parseFormField(name, block) {
|
|
|
45
269
|
if (!block || !block.trim()) {
|
|
46
270
|
return field;
|
|
47
271
|
}
|
|
48
|
-
|
|
272
|
+
// `block` is already-unwrapped CONTENT — use plain tokenize. (tokenizePackage
|
|
273
|
+
// would unwrap AGAIN and eat real characters: `d_max}` → `d_ma`.)
|
|
274
|
+
const t = (0, tokenize_1.default)(block);
|
|
49
275
|
let i = 0;
|
|
50
276
|
while (i < t.length) {
|
|
51
277
|
const cmd = t[i++];
|
|
@@ -53,56 +279,645 @@ function parseFormField(name, block) {
|
|
|
53
279
|
break;
|
|
54
280
|
}
|
|
55
281
|
if (cmd === 'label') {
|
|
56
|
-
field.label = (0,
|
|
282
|
+
field.label = (0, tokenize_2.stripWrapping)(t[i++]);
|
|
57
283
|
}
|
|
58
284
|
else if (cmd === 'definition') {
|
|
59
|
-
field.definition = (0,
|
|
285
|
+
field.definition = (0, tokenize_2.stripWrapping)(t[i++]);
|
|
286
|
+
}
|
|
287
|
+
else if (cmd === 'description') {
|
|
288
|
+
field.description = (0, tokenize_2.stripWrapping)(t[i++]);
|
|
289
|
+
}
|
|
290
|
+
else if (cmd === 'type') {
|
|
291
|
+
// Type may also be declared inside the block.
|
|
292
|
+
field.type = (0, tokenize_2.stripWrapping)(t[i++]);
|
|
293
|
+
field.typeDeclared = true;
|
|
60
294
|
}
|
|
61
295
|
else if (cmd === 'unit') {
|
|
62
|
-
field.unit = (0,
|
|
296
|
+
field.unit = (0, tokenize_2.stripWrapping)(t[i++]);
|
|
297
|
+
}
|
|
298
|
+
else if (cmd === 'symbol') {
|
|
299
|
+
field.symbol = (0, tokenize_2.stripWrapping)(t[i++]);
|
|
300
|
+
}
|
|
301
|
+
else if (cmd === 'verdict') {
|
|
302
|
+
field.verdict = (0, tokenize_2.stripWrapping)(t[i++]);
|
|
303
|
+
}
|
|
304
|
+
else if (cmd === 'targets') {
|
|
305
|
+
field.targets = (0, tokenize_2.tokenizePackage)(t[i++]).map(tokenize_2.stripWrapping);
|
|
306
|
+
}
|
|
307
|
+
else if (cmd === 'dimension') {
|
|
308
|
+
field.dimension = (0, tokenize_2.stripWrapping)(t[i++]);
|
|
309
|
+
}
|
|
310
|
+
else if (cmd === 'enum') {
|
|
311
|
+
field.enumRef = (0, tokenize_2.stripWrapping)(t[i++]);
|
|
312
|
+
}
|
|
313
|
+
else if (cmd === 'pattern') {
|
|
314
|
+
field.pattern = (0, tokenize_2.stripWrapping)(t[i++]);
|
|
315
|
+
}
|
|
316
|
+
else if (cmd === 'scope') {
|
|
317
|
+
field.scope = (0, tokenize_2.stripWrapping)(t[i++]);
|
|
318
|
+
}
|
|
319
|
+
else if (cmd === 'examples') {
|
|
320
|
+
field.examples = (0, tokenize_2.stripWrapping)(t[i++]);
|
|
321
|
+
}
|
|
322
|
+
else if (cmd === 'bind') {
|
|
323
|
+
// Binding path into the subject chain (G5):
|
|
324
|
+
// model.parameters.e_max · sample.test_context.d_min · model.classification.accuracy_class
|
|
325
|
+
field.bind = (0, tokenize_2.stripWrapping)(t[i++]);
|
|
63
326
|
}
|
|
64
327
|
else if (cmd === 'required') {
|
|
65
|
-
field.required = (0,
|
|
328
|
+
field.required = (0, tokenize_2.stripWrapping)(t[i++]) === 'true';
|
|
329
|
+
}
|
|
330
|
+
else if (cmd === 'required_when') {
|
|
331
|
+
// The conditional-requiredness expression — quoted or inline ocl{…}
|
|
332
|
+
// (the whitespace tokenizer SPLITS the braces — accumulate until
|
|
333
|
+
// brace-balanced, same as `calculation`).
|
|
334
|
+
const read = readValueToken(t, i);
|
|
335
|
+
field.requiredWhen = (0, tokenize_2.stripWrapping)(read.text);
|
|
336
|
+
i = read.next;
|
|
66
337
|
}
|
|
67
338
|
else if (cmd === 'measurement_method') {
|
|
68
|
-
field.measurementMethod = (0,
|
|
339
|
+
field.measurementMethod = (0, tokenize_2.stripWrapping)(t[i++]);
|
|
69
340
|
}
|
|
70
341
|
else if (cmd === 'calculation') {
|
|
71
|
-
// Bare ID
|
|
72
|
-
|
|
342
|
+
// Bare ID, quoted string, or inline `ocl{…}` expression (which the
|
|
343
|
+
// whitespace tokenizer SPLITS — accumulate until brace-balanced, or the
|
|
344
|
+
// value truncates at the first space and becomes a dump-time hazard).
|
|
345
|
+
const read = readValueToken(t, i);
|
|
346
|
+
field.calculationId = (0, tokenize_2.stripWrapping)(read.text);
|
|
347
|
+
i = read.next;
|
|
73
348
|
}
|
|
74
349
|
else if (cmd === 'calculation_bindings') {
|
|
75
|
-
|
|
76
|
-
(0, tokenize_1.unwrapBlock)(t[i++]);
|
|
350
|
+
field.calculationBindings = parseCalculationBindings((0, tokenize_2.unwrapBlock)(t[i++]));
|
|
77
351
|
}
|
|
78
352
|
else if (cmd === 'derivation') {
|
|
79
|
-
field.derivation = (0,
|
|
353
|
+
field.derivation = (0, tokenize_2.stripWrapping)(t[i++]);
|
|
80
354
|
}
|
|
81
355
|
else if (cmd === 'evaluation') {
|
|
82
|
-
|
|
83
|
-
(0, tokenize_1.unwrapBlock)(t[i++]);
|
|
356
|
+
field.evaluation = parseEvaluation((0, tokenize_2.unwrapBlock)(t[i++]));
|
|
84
357
|
}
|
|
85
358
|
else if (cmd === 'values') {
|
|
86
|
-
|
|
359
|
+
// values { A B } / values [A, B] — entries may carry a label:
|
|
360
|
+
// values { kg { label "Kg" } g }
|
|
361
|
+
const read = readBalanced(t, i);
|
|
362
|
+
field.values = parseValueEntries(read.text);
|
|
363
|
+
i = read.next;
|
|
87
364
|
}
|
|
88
365
|
else if (cmd === 'default') {
|
|
89
|
-
field.defaultValue = (0,
|
|
366
|
+
field.defaultValue = (0, tokenize_2.stripWrapping)(t[i++]);
|
|
90
367
|
field.hasDefault = true;
|
|
91
368
|
}
|
|
92
|
-
else if (cmd === '
|
|
93
|
-
(0,
|
|
369
|
+
else if (cmd === 'true_label') {
|
|
370
|
+
field.trueLabel = (0, tokenize_2.stripWrapping)(t[i++]);
|
|
371
|
+
}
|
|
372
|
+
else if (cmd === 'false_label') {
|
|
373
|
+
field.falseLabel = (0, tokenize_2.stripWrapping)(t[i++]);
|
|
374
|
+
}
|
|
375
|
+
else if (cmd === 'enum_values') {
|
|
376
|
+
field.enumValues = parseValueEntries(t[i++]);
|
|
377
|
+
}
|
|
378
|
+
else if (cmd === 'min_items') {
|
|
379
|
+
const raw = (0, tokenize_2.stripWrapping)(t[i++]);
|
|
380
|
+
const n = parseInt(raw, 10);
|
|
381
|
+
field.minItems = isNaN(n) ? raw : n;
|
|
382
|
+
}
|
|
383
|
+
else if (cmd === 'max_items') {
|
|
384
|
+
const raw = (0, tokenize_2.stripWrapping)(t[i++]);
|
|
385
|
+
const n = parseInt(raw, 10);
|
|
386
|
+
field.maxItems = isNaN(n) ? raw : n;
|
|
94
387
|
}
|
|
95
|
-
else if (cmd === 'items'
|
|
96
|
-
|
|
388
|
+
else if (cmd === 'items') {
|
|
389
|
+
// items { <type> [unit "…"] [fields { … }] } — element type, optional
|
|
390
|
+
// unit, optional nested fields.
|
|
391
|
+
const iblock = (0, tokenize_2.unwrapBlock)(t[i++]);
|
|
392
|
+
const it = (0, tokenize_1.default)(iblock);
|
|
393
|
+
const typeParts = [];
|
|
394
|
+
let k = 0;
|
|
395
|
+
while (k < it.length && it[k] !== 'fields') {
|
|
396
|
+
if (it[k] === 'unit' && k + 1 < it.length) {
|
|
397
|
+
field.itemsUnit = (0, tokenize_2.stripWrapping)(it[k + 1]);
|
|
398
|
+
k += 2;
|
|
399
|
+
}
|
|
400
|
+
else {
|
|
401
|
+
typeParts.push(it[k++]);
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
field.itemsType = typeParts.join(' ');
|
|
405
|
+
if (it[k] === 'fields') {
|
|
406
|
+
k++;
|
|
407
|
+
if (k < it.length) {
|
|
408
|
+
field.fields = parseNestedFields((0, tokenize_2.unwrapBlock)(it[k]));
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
else if (cmd === 'series') {
|
|
413
|
+
// series { axis <id> { … } … cell { symbol … unit "…" } } — typed
|
|
414
|
+
// series shape for datalist (array) evidence.
|
|
415
|
+
field.series = (0, series_1.parseSeriesDecl)((0, tokenize_2.unwrapBlock)(t[i++]));
|
|
416
|
+
}
|
|
417
|
+
else if (cmd === 'fields') {
|
|
418
|
+
field.fields = parseNestedFields((0, tokenize_2.unwrapBlock)(t[i++]));
|
|
419
|
+
}
|
|
420
|
+
else if (cmd === 'subform_ref') {
|
|
421
|
+
// Nested: field … { subform_ref SubformID { parameters { … } applicability { … } } }
|
|
422
|
+
const subformId = (0, tokenize_2.stripWrapping)(t[i++]);
|
|
423
|
+
const refBlock = i < t.length ? (0, tokenize_2.unwrapBlock)(t[i++]) : '';
|
|
424
|
+
field.subformRef = parseSubformRef(subformId, refBlock);
|
|
425
|
+
if (!field.type || field.type === 'string') {
|
|
426
|
+
field.type = 'array';
|
|
427
|
+
}
|
|
97
428
|
}
|
|
98
429
|
else if (cmd === 'reference') {
|
|
99
|
-
field.referenceIds = (0,
|
|
430
|
+
field.referenceIds = (0, tokenize_2.tokenizePackage)(t[i++]).map(tokenize_2.stripWrapping);
|
|
431
|
+
}
|
|
432
|
+
else if (cmd === 'references') {
|
|
433
|
+
field.fieldReferences = parseRoleReferences((0, tokenize_2.unwrapBlock)(t[i++]));
|
|
434
|
+
}
|
|
435
|
+
else if (cmd === 'specification_reference') {
|
|
436
|
+
field.specificationReference = (0, tokenize_2.stripWrapping)(t[i++]);
|
|
437
|
+
}
|
|
438
|
+
else if (cmd === 'applicability') {
|
|
439
|
+
field.applicability = parseApplicability((0, tokenize_2.unwrapBlock)(t[i++]));
|
|
440
|
+
}
|
|
441
|
+
else if (cmd === 'source_discrepancy') {
|
|
442
|
+
field.sourceDiscrepancy = (0, sourceDiscrepancy_1.parseSourceDiscrepancy)((0, tokenize_2.unwrapBlock)(t[i++]));
|
|
100
443
|
}
|
|
101
444
|
else {
|
|
102
445
|
// Forward-compatible: skip unknown keyword value
|
|
103
|
-
(0,
|
|
446
|
+
(0, tokenize_2.unwrapBlock)(t[i++]);
|
|
104
447
|
}
|
|
105
448
|
}
|
|
106
449
|
return field;
|
|
107
450
|
}
|
|
451
|
+
/** `calculation_bindings { inputName: pathExpr … }` */
|
|
452
|
+
function parseCalculationBindings(block) {
|
|
453
|
+
const out = [];
|
|
454
|
+
const t = (0, tokenize_1.default)(block);
|
|
455
|
+
let i = 0;
|
|
456
|
+
while (i < t.length) {
|
|
457
|
+
const key = stripColon(t[i++]);
|
|
458
|
+
if (i >= t.length) {
|
|
459
|
+
break;
|
|
460
|
+
}
|
|
461
|
+
if (t[i] === ':') {
|
|
462
|
+
i++;
|
|
463
|
+
}
|
|
464
|
+
if (i < t.length) {
|
|
465
|
+
out.push({ inputName: key, pathExpr: (0, tokenize_2.stripWrapping)(t[i++]) });
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
return out;
|
|
469
|
+
}
|
|
470
|
+
/** `evaluation { rule "…" verdict <id> op <op> limit "…" condition "…" reference { … } source_discrepancy { … } }` */
|
|
471
|
+
function parseEvaluation(block) {
|
|
472
|
+
const rule = { rule: '', condition: '', referenceId: null };
|
|
473
|
+
const t = (0, tokenize_1.default)(block);
|
|
474
|
+
let i = 0;
|
|
475
|
+
while (i < t.length) {
|
|
476
|
+
const cmd = t[i++];
|
|
477
|
+
if (i >= t.length) {
|
|
478
|
+
break;
|
|
479
|
+
}
|
|
480
|
+
if (cmd === 'rule') {
|
|
481
|
+
rule.rule = (0, tokenize_2.stripWrapping)(t[i++]);
|
|
482
|
+
}
|
|
483
|
+
else if (cmd === 'verdict') {
|
|
484
|
+
rule.verdict = (0, tokenize_2.stripWrapping)(t[i++]);
|
|
485
|
+
}
|
|
486
|
+
else if (cmd === 'op') {
|
|
487
|
+
rule.op = (0, tokenize_2.stripWrapping)(t[i++]);
|
|
488
|
+
}
|
|
489
|
+
else if (cmd === 'limit') {
|
|
490
|
+
rule.limit = (0, tokenize_2.stripWrapping)(t[i++]);
|
|
491
|
+
}
|
|
492
|
+
else if (cmd === 'condition') {
|
|
493
|
+
rule.condition = (0, tokenize_2.stripWrapping)(t[i++]);
|
|
494
|
+
}
|
|
495
|
+
else if (cmd === 'reference') {
|
|
496
|
+
const ids = (0, tokenize_2.tokenizePackage)(t[i++]).map(tokenize_2.stripWrapping);
|
|
497
|
+
rule.referenceId = ids[0] ?? null;
|
|
498
|
+
}
|
|
499
|
+
else if (cmd === 'specification_reference') {
|
|
500
|
+
rule.specificationReference = (0, tokenize_2.stripWrapping)(t[i++]);
|
|
501
|
+
}
|
|
502
|
+
else if (cmd === 'source_discrepancy') {
|
|
503
|
+
rule.sourceDiscrepancy = (0, sourceDiscrepancy_1.parseSourceDiscrepancy)((0, tokenize_2.unwrapBlock)(t[i++]));
|
|
504
|
+
}
|
|
505
|
+
else {
|
|
506
|
+
(0, tokenize_2.unwrapBlock)(t[i++]);
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
return rule;
|
|
510
|
+
}
|
|
511
|
+
/** `fields { field a { … } field b : number { … } … }` (recursive) */
|
|
512
|
+
function parseNestedFields(block) {
|
|
513
|
+
const out = [];
|
|
514
|
+
const t = (0, tokenize_1.default)(block);
|
|
515
|
+
let i = 0;
|
|
516
|
+
while (i < t.length) {
|
|
517
|
+
const cmd = t[i++];
|
|
518
|
+
if (cmd !== 'field') {
|
|
519
|
+
if (i < t.length) {
|
|
520
|
+
(0, tokenize_2.unwrapBlock)(t[i - 1]);
|
|
521
|
+
}
|
|
522
|
+
continue;
|
|
523
|
+
}
|
|
524
|
+
const head = readFieldHead(t, i);
|
|
525
|
+
if (!head) {
|
|
526
|
+
break;
|
|
527
|
+
}
|
|
528
|
+
out.push(parseFormField(head.name, head.block, head.type || undefined));
|
|
529
|
+
i = head.next;
|
|
530
|
+
}
|
|
531
|
+
return out;
|
|
532
|
+
}
|
|
533
|
+
/** Parse `applicability { dim: [A, B] dim2: { A: 5, B: 3 } }` entries. */
|
|
534
|
+
function parseApplicability(block) {
|
|
535
|
+
const entries = [];
|
|
536
|
+
const t = (0, tokenize_1.default)(block);
|
|
537
|
+
let i = 0;
|
|
538
|
+
while (i < t.length) {
|
|
539
|
+
const dimension = stripColon(t[i++]);
|
|
540
|
+
if (i >= t.length) {
|
|
541
|
+
break;
|
|
542
|
+
}
|
|
543
|
+
if (t[i] === ':') {
|
|
544
|
+
i++;
|
|
545
|
+
}
|
|
546
|
+
if (i < t.length) {
|
|
547
|
+
const read = readBalanced(t, i);
|
|
548
|
+
i = read.next;
|
|
549
|
+
// text is `[A, B]`, `{ A: 5, B: 5 }`, or a bare value
|
|
550
|
+
const trimmed = read.text.trim();
|
|
551
|
+
let entry;
|
|
552
|
+
if (trimmed.startsWith('[')) {
|
|
553
|
+
const inner = trimmed.slice(1, trimmed.lastIndexOf(']'));
|
|
554
|
+
const values = inner.split(/[,\s]+/).filter(s => s.length > 0);
|
|
555
|
+
entry = { dimension, values, mapping: null, match: null };
|
|
556
|
+
}
|
|
557
|
+
else if (trimmed.startsWith('{')) {
|
|
558
|
+
// Mapping form
|
|
559
|
+
const inner = trimmed.slice(1, -1);
|
|
560
|
+
const mapping = {};
|
|
561
|
+
for (const pair of inner
|
|
562
|
+
.split(/[,\n]+/)
|
|
563
|
+
.map(s => s.trim())
|
|
564
|
+
.filter(s => s)) {
|
|
565
|
+
const m = pair.match(/^(\w+)\s*:\s*(.+)$/);
|
|
566
|
+
if (m) {
|
|
567
|
+
mapping[m[1]] = m[2].trim();
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
entry = { dimension, values: [], mapping, match: null };
|
|
571
|
+
}
|
|
572
|
+
else {
|
|
573
|
+
// Single value
|
|
574
|
+
entry = {
|
|
575
|
+
dimension,
|
|
576
|
+
values: [(0, tokenize_2.stripWrapping)(trimmed)],
|
|
577
|
+
mapping: null,
|
|
578
|
+
match: null,
|
|
579
|
+
};
|
|
580
|
+
}
|
|
581
|
+
// Declared-condition match mode (rc.yaml $defs/applicability):
|
|
582
|
+
// `match any|all|exact` follows the values — universal/exact matching
|
|
583
|
+
// for set-cardinality dimensions (default 'any', existential).
|
|
584
|
+
if (!entry.mapping && t[i] === 'match') {
|
|
585
|
+
i++;
|
|
586
|
+
const mode = (0, tokenize_2.stripWrapping)(t[i++] ?? '');
|
|
587
|
+
if (mode !== 'any' && mode !== 'all' && mode !== 'exact') {
|
|
588
|
+
throw new Error(`Parsing error: applicability: Unknown match ${mode} (valid: any, all, exact)`);
|
|
589
|
+
}
|
|
590
|
+
entry.match = mode;
|
|
591
|
+
}
|
|
592
|
+
entries.push(entry);
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
return entries;
|
|
596
|
+
}
|
|
597
|
+
/** Parse `SubformID { parameters { … } applicability { … } }` */
|
|
598
|
+
function parseSubformRef(subformId, block) {
|
|
599
|
+
const ref = {
|
|
600
|
+
subformId: (0, tokenize_2.stripWrapping)(subformId),
|
|
601
|
+
parameters: {},
|
|
602
|
+
applicability: [],
|
|
603
|
+
};
|
|
604
|
+
if (block && block.trim()) {
|
|
605
|
+
const t = (0, tokenize_1.default)(block);
|
|
606
|
+
let i = 0;
|
|
607
|
+
while (i < t.length) {
|
|
608
|
+
const cmd = t[i++];
|
|
609
|
+
if (i < t.length) {
|
|
610
|
+
if (cmd === 'parameters') {
|
|
611
|
+
const pblock = (0, tokenize_2.unwrapBlock)(t[i++]);
|
|
612
|
+
const pt = (0, tokenize_1.default)(pblock);
|
|
613
|
+
let j = 0;
|
|
614
|
+
while (j < pt.length) {
|
|
615
|
+
const key = stripColon(pt[j++]);
|
|
616
|
+
if (j < pt.length) {
|
|
617
|
+
if (pt[j] === ':') {
|
|
618
|
+
j++;
|
|
619
|
+
}
|
|
620
|
+
if (j < pt.length) {
|
|
621
|
+
ref.parameters[key] = (0, tokenize_2.stripWrapping)(pt[j++]);
|
|
622
|
+
}
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
}
|
|
626
|
+
else if (cmd === 'applicability') {
|
|
627
|
+
ref.applicability = parseApplicability((0, tokenize_2.unwrapBlock)(t[i++]));
|
|
628
|
+
}
|
|
629
|
+
else {
|
|
630
|
+
(0, tokenize_2.unwrapBlock)(t[i++]);
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
}
|
|
634
|
+
}
|
|
635
|
+
return ref;
|
|
636
|
+
}
|
|
637
|
+
/** Dump one field with full fidelity (recursive for nested fields). */
|
|
638
|
+
function dumpFormField(field, indent) {
|
|
639
|
+
let out = '';
|
|
640
|
+
// A NAMELESS subform reference (form-level `subform_ref X { ... }`)
|
|
641
|
+
// dumps in its bare form. A named field that composes a subform keeps
|
|
642
|
+
// its other properties — the subform_ref becomes one entry of the
|
|
643
|
+
// field body (converter emits `field x { … subform_ref X { } }`).
|
|
644
|
+
if (field.subformRef && !field.name) {
|
|
645
|
+
const sr = field.subformRef;
|
|
646
|
+
out += indent + 'subform_ref ' + sr.subformId + ' { ';
|
|
647
|
+
const pkeys = Object.keys(sr.parameters);
|
|
648
|
+
if (pkeys.length > 0) {
|
|
649
|
+
out += 'parameters { ';
|
|
650
|
+
for (const k of pkeys) {
|
|
651
|
+
out += k + ': ' + sr.parameters[k] + ' ';
|
|
652
|
+
}
|
|
653
|
+
out += '} ';
|
|
654
|
+
}
|
|
655
|
+
if (sr.applicability.length > 0) {
|
|
656
|
+
out +=
|
|
657
|
+
'applicability { ' + dumpApplicabilityEntries(sr.applicability) + '} ';
|
|
658
|
+
}
|
|
659
|
+
out += '}\n';
|
|
660
|
+
return out;
|
|
661
|
+
}
|
|
662
|
+
const inner = [];
|
|
663
|
+
if (field.subformRef) {
|
|
664
|
+
const sr = field.subformRef;
|
|
665
|
+
let refLine = 'subform_ref ' + sr.subformId + ' { ';
|
|
666
|
+
const pkeys = Object.keys(sr.parameters);
|
|
667
|
+
if (pkeys.length > 0) {
|
|
668
|
+
refLine += 'parameters { ';
|
|
669
|
+
for (const k of pkeys) {
|
|
670
|
+
refLine += k + ': ' + sr.parameters[k] + ' ';
|
|
671
|
+
}
|
|
672
|
+
refLine += '} ';
|
|
673
|
+
}
|
|
674
|
+
if (sr.applicability.length > 0) {
|
|
675
|
+
refLine +=
|
|
676
|
+
'applicability { ' + dumpApplicabilityEntries(sr.applicability) + '} ';
|
|
677
|
+
}
|
|
678
|
+
inner.push(refLine + '}');
|
|
679
|
+
}
|
|
680
|
+
if (field.label) {
|
|
681
|
+
inner.push('label "' + (0, tokenize_2.escapeString)(field.label) + '"');
|
|
682
|
+
}
|
|
683
|
+
if (field.definition) {
|
|
684
|
+
inner.push('definition "' + (0, tokenize_2.escapeString)(field.definition) + '"');
|
|
685
|
+
}
|
|
686
|
+
if (field.description) {
|
|
687
|
+
inner.push('description "' + (0, tokenize_2.escapeString)(field.description) + '"');
|
|
688
|
+
}
|
|
689
|
+
if (field.unit) {
|
|
690
|
+
inner.push('unit "' + (0, tokenize_2.escapeString)(field.unit) + '"');
|
|
691
|
+
}
|
|
692
|
+
if (field.symbol) {
|
|
693
|
+
inner.push('symbol ' + field.symbol);
|
|
694
|
+
}
|
|
695
|
+
if (field.verdict) {
|
|
696
|
+
inner.push('verdict ' + field.verdict);
|
|
697
|
+
}
|
|
698
|
+
if (field.dimension) {
|
|
699
|
+
inner.push('dimension ' + field.dimension);
|
|
700
|
+
}
|
|
701
|
+
if (field.enumRef) {
|
|
702
|
+
inner.push('enum ' + field.enumRef);
|
|
703
|
+
}
|
|
704
|
+
if (field.pattern) {
|
|
705
|
+
inner.push('pattern "' + (0, tokenize_2.escapeString)(field.pattern) + '"');
|
|
706
|
+
}
|
|
707
|
+
if (field.scope) {
|
|
708
|
+
inner.push('scope ' + field.scope);
|
|
709
|
+
}
|
|
710
|
+
if (field.examples) {
|
|
711
|
+
inner.push('examples "' + (0, tokenize_2.escapeString)(field.examples) + '"');
|
|
712
|
+
}
|
|
713
|
+
if (field.required) {
|
|
714
|
+
inner.push('required true');
|
|
715
|
+
}
|
|
716
|
+
if (field.requiredWhen) {
|
|
717
|
+
inner.push('required_when ' + dumpBareSafe(field.requiredWhen));
|
|
718
|
+
}
|
|
719
|
+
if (field.measurementMethod) {
|
|
720
|
+
inner.push('measurement_method ' + field.measurementMethod);
|
|
721
|
+
}
|
|
722
|
+
if (field.calculationId) {
|
|
723
|
+
inner.push('calculation ' + dumpBareSafe(field.calculationId));
|
|
724
|
+
}
|
|
725
|
+
if (field.calculationBindings.length > 0) {
|
|
726
|
+
inner.push('calculation_bindings { ' +
|
|
727
|
+
field.calculationBindings
|
|
728
|
+
.map(b => b.inputName + ': ' + b.pathExpr)
|
|
729
|
+
.join(' ') +
|
|
730
|
+
'}');
|
|
731
|
+
}
|
|
732
|
+
if (field.derivation) {
|
|
733
|
+
inner.push('derivation "' + (0, tokenize_2.escapeString)(field.derivation) + '"');
|
|
734
|
+
}
|
|
735
|
+
if (field.evaluation) {
|
|
736
|
+
let ev = 'evaluation { rule "' + (0, tokenize_2.escapeString)(field.evaluation.rule) + '"';
|
|
737
|
+
if (field.evaluation.verdict) {
|
|
738
|
+
ev += ' verdict ' + field.evaluation.verdict;
|
|
739
|
+
}
|
|
740
|
+
if (field.evaluation.op) {
|
|
741
|
+
ev += ' op ' + field.evaluation.op;
|
|
742
|
+
}
|
|
743
|
+
if (field.evaluation.limit) {
|
|
744
|
+
ev += ' limit "' + (0, tokenize_2.escapeString)(field.evaluation.limit) + '"';
|
|
745
|
+
}
|
|
746
|
+
if (field.evaluation.condition) {
|
|
747
|
+
ev += ' condition "' + (0, tokenize_2.escapeString)(field.evaluation.condition) + '"';
|
|
748
|
+
}
|
|
749
|
+
if (field.evaluation.referenceId) {
|
|
750
|
+
ev += ' reference { ' + field.evaluation.referenceId + ' }';
|
|
751
|
+
}
|
|
752
|
+
if (field.evaluation.specificationReference) {
|
|
753
|
+
ev +=
|
|
754
|
+
' specification_reference "' +
|
|
755
|
+
(0, tokenize_2.escapeString)(field.evaluation.specificationReference) +
|
|
756
|
+
'"';
|
|
757
|
+
}
|
|
758
|
+
if (field.evaluation.sourceDiscrepancy) {
|
|
759
|
+
ev += ' ' + (0, sourceDiscrepancy_1.dumpSourceDiscrepancy)(field.evaluation.sourceDiscrepancy, '');
|
|
760
|
+
}
|
|
761
|
+
inner.push(ev + ' }');
|
|
762
|
+
}
|
|
763
|
+
if (field.values.length > 0) {
|
|
764
|
+
inner.push('values { ' + field.values.map(dumpValueEntry).join(' ') + ' }');
|
|
765
|
+
}
|
|
766
|
+
if (field.hasDefault) {
|
|
767
|
+
// Defaults may be free text ("26 MHz – 3 GHz") or JSON-encoded
|
|
768
|
+
// structures — quote whenever the value isn't a single safe token.
|
|
769
|
+
inner.push('default ' + dumpBareSafe(field.defaultValue));
|
|
770
|
+
}
|
|
771
|
+
if (field.trueLabel) {
|
|
772
|
+
inner.push('true_label "' + (0, tokenize_2.escapeString)(field.trueLabel) + '"');
|
|
773
|
+
}
|
|
774
|
+
if (field.falseLabel) {
|
|
775
|
+
inner.push('false_label "' + (0, tokenize_2.escapeString)(field.falseLabel) + '"');
|
|
776
|
+
}
|
|
777
|
+
if (field.enumValues.length > 0) {
|
|
778
|
+
inner.push('enum_values { ' + field.enumValues.map(dumpValueEntry).join(' ') + ' }');
|
|
779
|
+
}
|
|
780
|
+
if (field.itemsType) {
|
|
781
|
+
let itemsLine = 'items { ' + field.itemsType;
|
|
782
|
+
if (field.itemsUnit) {
|
|
783
|
+
itemsLine += ' unit "' + (0, tokenize_2.escapeString)(field.itemsUnit) + '"';
|
|
784
|
+
}
|
|
785
|
+
inner.push(itemsLine + ' }');
|
|
786
|
+
}
|
|
787
|
+
if (field.minItems !== undefined && field.minItems !== null) {
|
|
788
|
+
inner.push('min_items ' + dumpBareSafe(String(field.minItems)));
|
|
789
|
+
}
|
|
790
|
+
if (field.maxItems !== undefined && field.maxItems !== null) {
|
|
791
|
+
inner.push('max_items ' + dumpBareSafe(String(field.maxItems)));
|
|
792
|
+
}
|
|
793
|
+
if (field.series) {
|
|
794
|
+
inner.push((0, series_1.dumpSeriesDecl)(field.series));
|
|
795
|
+
}
|
|
796
|
+
if (field.applicability.length > 0) {
|
|
797
|
+
inner.push('applicability { ' + dumpApplicabilityEntries(field.applicability) + '}');
|
|
798
|
+
}
|
|
799
|
+
if (field.targets.length > 0) {
|
|
800
|
+
inner.push('targets { ' + field.targets.join(' ') + ' }');
|
|
801
|
+
}
|
|
802
|
+
if (field.fieldReferences.length > 0) {
|
|
803
|
+
inner.push('references { ' + dumpRoleReferences(field.fieldReferences) + ' }');
|
|
804
|
+
}
|
|
805
|
+
if (field.specificationReference) {
|
|
806
|
+
inner.push('specification_reference "' +
|
|
807
|
+
(0, tokenize_2.escapeString)(field.specificationReference) +
|
|
808
|
+
'"');
|
|
809
|
+
}
|
|
810
|
+
if (field.sourceDiscrepancy) {
|
|
811
|
+
inner.push((0, sourceDiscrepancy_1.dumpSourceDiscrepancy)(field.sourceDiscrepancy, ''));
|
|
812
|
+
}
|
|
813
|
+
if (field.fields.length > 0) {
|
|
814
|
+
inner.push('fields {\n' +
|
|
815
|
+
field.fields.map(f => dumpFormField(f, indent + ' ')).join('') +
|
|
816
|
+
indent +
|
|
817
|
+
' }');
|
|
818
|
+
}
|
|
819
|
+
if (field.referenceIds.length > 0) {
|
|
820
|
+
inner.push('reference { ' + field.referenceIds.join(' ') + ' }');
|
|
821
|
+
}
|
|
822
|
+
const typeSpec = field.type && (field.type !== 'string' || field.typeDeclared)
|
|
823
|
+
? ' : ' + field.type
|
|
824
|
+
: '';
|
|
825
|
+
if (inner.length === 0) {
|
|
826
|
+
return indent + 'field ' + field.name + typeSpec + ' { }\n';
|
|
827
|
+
}
|
|
828
|
+
if (inner.every(s => !s.includes('\n'))) {
|
|
829
|
+
return (indent +
|
|
830
|
+
'field ' +
|
|
831
|
+
field.name +
|
|
832
|
+
typeSpec +
|
|
833
|
+
' { ' +
|
|
834
|
+
inner.join(' ') +
|
|
835
|
+
' }\n');
|
|
836
|
+
}
|
|
837
|
+
return (indent +
|
|
838
|
+
'field ' +
|
|
839
|
+
field.name +
|
|
840
|
+
typeSpec +
|
|
841
|
+
' {\n' +
|
|
842
|
+
inner.map(s => indent + ' ' + s + '\n').join('') +
|
|
843
|
+
indent +
|
|
844
|
+
'}\n');
|
|
845
|
+
}
|
|
846
|
+
/** Dump applicability entries inside an `applicability { … }` block. */
|
|
847
|
+
function dumpApplicabilityEntries(entries) {
|
|
848
|
+
let out = '';
|
|
849
|
+
for (const a of entries) {
|
|
850
|
+
if (a.mapping) {
|
|
851
|
+
out += a.dimension + ': { ';
|
|
852
|
+
// Pairs are comma-separated: the mapping parser splits on [,\n], so
|
|
853
|
+
// space-separated pairs would re-parse as one merged pair.
|
|
854
|
+
const pairs = [];
|
|
855
|
+
for (const [k, v] of Object.entries(a.mapping)) {
|
|
856
|
+
pairs.push(k + ': ' + v);
|
|
857
|
+
}
|
|
858
|
+
out += pairs.join(', ') + ' ';
|
|
859
|
+
out += '} ';
|
|
860
|
+
}
|
|
861
|
+
else {
|
|
862
|
+
out += a.dimension + ': [' + a.values.join(', ') + '] ';
|
|
863
|
+
if (a.match) {
|
|
864
|
+
out += 'match ' + a.match + ' ';
|
|
865
|
+
}
|
|
866
|
+
}
|
|
867
|
+
}
|
|
868
|
+
return out;
|
|
869
|
+
}
|
|
870
|
+
/**
|
|
871
|
+
* Parse role-grouped reference URNs:
|
|
872
|
+
* `references { requirement { "urn:…" "urn:…" } test-procedure { "urn:…" } }`
|
|
873
|
+
* → flattened [{ urn, role }] in document order.
|
|
874
|
+
*/
|
|
875
|
+
function parseRoleReferences(block) {
|
|
876
|
+
const out = [];
|
|
877
|
+
const t = (0, tokenize_1.default)(block);
|
|
878
|
+
let i = 0;
|
|
879
|
+
while (i < t.length) {
|
|
880
|
+
const role = stripColon(t[i++]);
|
|
881
|
+
if (!role) {
|
|
882
|
+
break;
|
|
883
|
+
}
|
|
884
|
+
if (i < t.length && t[i] === ':') {
|
|
885
|
+
i++;
|
|
886
|
+
}
|
|
887
|
+
if (i < t.length && t[i].startsWith('{')) {
|
|
888
|
+
const urns = (0, tokenize_1.default)((0, tokenize_2.unwrapBlock)(t[i++]))
|
|
889
|
+
.map(tokenize_2.stripWrapping)
|
|
890
|
+
.filter(s => s.length > 0);
|
|
891
|
+
for (const urn of urns) {
|
|
892
|
+
out.push({ urn, role });
|
|
893
|
+
}
|
|
894
|
+
}
|
|
895
|
+
}
|
|
896
|
+
return out;
|
|
897
|
+
}
|
|
898
|
+
/**
|
|
899
|
+
* Dump flattened role references re-grouped by role (first-seen role
|
|
900
|
+
* order, urn order preserved within a role) — the inner content of a
|
|
901
|
+
* `references { … }` block.
|
|
902
|
+
*/
|
|
903
|
+
function dumpRoleReferences(refs) {
|
|
904
|
+
const roles = [];
|
|
905
|
+
const byRole = new Map();
|
|
906
|
+
for (const r of refs) {
|
|
907
|
+
if (!byRole.has(r.role)) {
|
|
908
|
+
byRole.set(r.role, []);
|
|
909
|
+
roles.push(r.role);
|
|
910
|
+
}
|
|
911
|
+
byRole.get(r.role).push(r.urn);
|
|
912
|
+
}
|
|
913
|
+
return roles
|
|
914
|
+
.map(role => role +
|
|
915
|
+
' { ' +
|
|
916
|
+
byRole
|
|
917
|
+
.get(role)
|
|
918
|
+
.map(u => '"' + (0, tokenize_2.escapeString)(u) + '"')
|
|
919
|
+
.join(' ') +
|
|
920
|
+
' }')
|
|
921
|
+
.join(' ');
|
|
922
|
+
}
|
|
108
923
|
//# sourceMappingURL=field-parser.js.map
|