@ifc-lite/ids-authoring 0.0.0-stage → 0.2.2
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/LICENSE +373 -0
- package/README.md +469 -2
- package/dist/bsdd/cache.d.ts +37 -0
- package/dist/bsdd/cache.d.ts.map +1 -0
- package/dist/bsdd/cache.js +116 -0
- package/dist/bsdd/cache.js.map +1 -0
- package/dist/bsdd/contract.d.ts +31 -0
- package/dist/bsdd/contract.d.ts.map +1 -0
- package/dist/bsdd/contract.js +185 -0
- package/dist/bsdd/contract.js.map +1 -0
- package/dist/bsdd/dictionary.d.ts +42 -0
- package/dist/bsdd/dictionary.d.ts.map +1 -0
- package/dist/bsdd/dictionary.js +115 -0
- package/dist/bsdd/dictionary.js.map +1 -0
- package/dist/bsdd/generator.d.ts +82 -0
- package/dist/bsdd/generator.d.ts.map +1 -0
- package/dist/bsdd/generator.js +155 -0
- package/dist/bsdd/generator.js.map +1 -0
- package/dist/bsdd/http-source.d.ts +15 -0
- package/dist/bsdd/http-source.d.ts.map +1 -0
- package/dist/bsdd/http-source.js +196 -0
- package/dist/bsdd/http-source.js.map +1 -0
- package/dist/bsdd/idb-store.d.ts +16 -0
- package/dist/bsdd/idb-store.d.ts.map +1 -0
- package/dist/bsdd/idb-store.js +58 -0
- package/dist/bsdd/idb-store.js.map +1 -0
- package/dist/bsdd/insert.d.ts +55 -0
- package/dist/bsdd/insert.d.ts.map +1 -0
- package/dist/bsdd/insert.js +105 -0
- package/dist/bsdd/insert.js.map +1 -0
- package/dist/bsdd/mapping.d.ts +62 -0
- package/dist/bsdd/mapping.d.ts.map +1 -0
- package/dist/bsdd/mapping.js +163 -0
- package/dist/bsdd/mapping.js.map +1 -0
- package/dist/bsdd/picker.d.ts +91 -0
- package/dist/bsdd/picker.d.ts.map +1 -0
- package/dist/bsdd/picker.js +151 -0
- package/dist/bsdd/picker.js.map +1 -0
- package/dist/bsdd/types.d.ts +162 -0
- package/dist/bsdd/types.d.ts.map +1 -0
- package/dist/bsdd/types.js +26 -0
- package/dist/bsdd/types.js.map +1 -0
- package/dist/bsdd/uri-health.d.ts +65 -0
- package/dist/bsdd/uri-health.d.ts.map +1 -0
- package/dist/bsdd/uri-health.js +110 -0
- package/dist/bsdd/uri-health.js.map +1 -0
- package/dist/canonical-json.d.ts +7 -0
- package/dist/canonical-json.d.ts.map +1 -0
- package/dist/canonical-json.js +20 -0
- package/dist/canonical-json.js.map +1 -0
- package/dist/comments/view.d.ts +37 -0
- package/dist/comments/view.d.ts.map +1 -0
- package/dist/comments/view.js +61 -0
- package/dist/comments/view.js.map +1 -0
- package/dist/compound/expand.d.ts +5 -0
- package/dist/compound/expand.d.ts.map +1 -0
- package/dist/compound/expand.js +135 -0
- package/dist/compound/expand.js.map +1 -0
- package/dist/compound/from-bsdd.d.ts +9 -0
- package/dist/compound/from-bsdd.d.ts.map +1 -0
- package/dist/compound/from-bsdd.js +166 -0
- package/dist/compound/from-bsdd.js.map +1 -0
- package/dist/diff/align.d.ts +42 -0
- package/dist/diff/align.d.ts.map +1 -0
- package/dist/diff/align.js +78 -0
- package/dist/diff/align.js.map +1 -0
- package/dist/diff/changelog-text.d.ts +39 -0
- package/dist/diff/changelog-text.d.ts.map +1 -0
- package/dist/diff/changelog-text.js +120 -0
- package/dist/diff/changelog-text.js.map +1 -0
- package/dist/diff/changelog.d.ts +28 -0
- package/dist/diff/changelog.d.ts.map +1 -0
- package/dist/diff/changelog.js +173 -0
- package/dist/diff/changelog.js.map +1 -0
- package/dist/diff/compare.d.ts +25 -0
- package/dist/diff/compare.d.ts.map +1 -0
- package/dist/diff/compare.js +150 -0
- package/dist/diff/compare.js.map +1 -0
- package/dist/diff/diff.d.ts +13 -0
- package/dist/diff/diff.d.ts.map +1 -0
- package/dist/diff/diff.js +140 -0
- package/dist/diff/diff.js.map +1 -0
- package/dist/diff/index.d.ts +5 -0
- package/dist/diff/index.d.ts.map +1 -0
- package/dist/diff/index.js +7 -0
- package/dist/diff/index.js.map +1 -0
- package/dist/diff/patch.d.ts +10 -0
- package/dist/diff/patch.d.ts.map +1 -0
- package/dist/diff/patch.js +177 -0
- package/dist/diff/patch.js.map +1 -0
- package/dist/diff/types.d.ts +201 -0
- package/dist/diff/types.d.ts.map +1 -0
- package/dist/diff/types.js +5 -0
- package/dist/diff/types.js.map +1 -0
- package/dist/document/fields.d.ts +33 -0
- package/dist/document/fields.d.ts.map +1 -0
- package/dist/document/fields.js +117 -0
- package/dist/document/fields.js.map +1 -0
- package/dist/document/from-ids.d.ts +32 -0
- package/dist/document/from-ids.d.ts.map +1 -0
- package/dist/document/from-ids.js +47 -0
- package/dist/document/from-ids.js.map +1 -0
- package/dist/document/node-index.d.ts +32 -0
- package/dist/document/node-index.d.ts.map +1 -0
- package/dist/document/node-index.js +127 -0
- package/dist/document/node-index.js.map +1 -0
- package/dist/document/types.d.ts +170 -0
- package/dist/document/types.d.ts.map +1 -0
- package/dist/document/types.js +19 -0
- package/dist/document/types.js.map +1 -0
- package/dist/gate/bsdd.d.ts +12 -0
- package/dist/gate/bsdd.d.ts.map +1 -0
- package/dist/gate/bsdd.js +17 -0
- package/dist/gate/bsdd.js.map +1 -0
- package/dist/gate/check.d.ts +6 -0
- package/dist/gate/check.d.ts.map +1 -0
- package/dist/gate/check.js +125 -0
- package/dist/gate/check.js.map +1 -0
- package/dist/gate/context.d.ts +51 -0
- package/dist/gate/context.d.ts.map +1 -0
- package/dist/gate/context.js +74 -0
- package/dist/gate/context.js.map +1 -0
- package/dist/gate/grounding-pset.d.ts +5 -0
- package/dist/gate/grounding-pset.d.ts.map +1 -0
- package/dist/gate/grounding-pset.js +179 -0
- package/dist/gate/grounding-pset.js.map +1 -0
- package/dist/gate/grounding.d.ts +48 -0
- package/dist/gate/grounding.d.ts.map +1 -0
- package/dist/gate/grounding.js +146 -0
- package/dist/gate/grounding.js.map +1 -0
- package/dist/gate/rank.d.ts +28 -0
- package/dist/gate/rank.d.ts.map +1 -0
- package/dist/gate/rank.js +68 -0
- package/dist/gate/rank.js.map +1 -0
- package/dist/gate/structural.d.ts +43 -0
- package/dist/gate/structural.d.ts.map +1 -0
- package/dist/gate/structural.js +175 -0
- package/dist/gate/structural.js.map +1 -0
- package/dist/gate/types.d.ts +45 -0
- package/dist/gate/types.d.ts.map +1 -0
- package/dist/gate/types.js +5 -0
- package/dist/gate/types.js.map +1 -0
- package/dist/gate/values.d.ts +19 -0
- package/dist/gate/values.d.ts.map +1 -0
- package/dist/gate/values.js +124 -0
- package/dist/gate/values.js.map +1 -0
- package/dist/headless/apply-gated.d.ts +32 -0
- package/dist/headless/apply-gated.d.ts.map +1 -0
- package/dist/headless/apply-gated.js +26 -0
- package/dist/headless/apply-gated.js.map +1 -0
- package/dist/headless/diff.d.ts +41 -0
- package/dist/headless/diff.d.ts.map +1 -0
- package/dist/headless/diff.js +116 -0
- package/dist/headless/diff.js.map +1 -0
- package/dist/headless/node-path.d.ts +10 -0
- package/dist/headless/node-path.d.ts.map +1 -0
- package/dist/headless/node-path.js +24 -0
- package/dist/headless/node-path.js.map +1 -0
- package/dist/headless/read.d.ts +26 -0
- package/dist/headless/read.d.ts.map +1 -0
- package/dist/headless/read.js +78 -0
- package/dist/headless/read.js.map +1 -0
- package/dist/headless/schema-lookup.d.ts +52 -0
- package/dist/headless/schema-lookup.d.ts.map +1 -0
- package/dist/headless/schema-lookup.js +77 -0
- package/dist/headless/schema-lookup.js.map +1 -0
- package/dist/headless/write.d.ts +46 -0
- package/dist/headless/write.d.ts.map +1 -0
- package/dist/headless/write.js +103 -0
- package/dist/headless/write.js.map +1 -0
- package/dist/history/history.d.ts +90 -0
- package/dist/history/history.d.ts.map +1 -0
- package/dist/history/history.js +86 -0
- package/dist/history/history.js.map +1 -0
- package/dist/history/persistence.d.ts +33 -0
- package/dist/history/persistence.d.ts.map +1 -0
- package/dist/history/persistence.js +71 -0
- package/dist/history/persistence.js.map +1 -0
- package/dist/index.d.ts +55 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +75 -0
- package/dist/index.js.map +1 -0
- package/dist/lint/context.d.ts +15 -0
- package/dist/lint/context.d.ts.map +1 -0
- package/dist/lint/context.js +24 -0
- package/dist/lint/context.js.map +1 -0
- package/dist/lint/docs.d.ts +18 -0
- package/dist/lint/docs.d.ts.map +1 -0
- package/dist/lint/docs.js +117 -0
- package/dist/lint/docs.js.map +1 -0
- package/dist/lint/engine.d.ts +21 -0
- package/dist/lint/engine.d.ts.map +1 -0
- package/dist/lint/engine.js +123 -0
- package/dist/lint/engine.js.map +1 -0
- package/dist/lint/fix.d.ts +27 -0
- package/dist/lint/fix.d.ts.map +1 -0
- package/dist/lint/fix.js +22 -0
- package/dist/lint/fix.js.map +1 -0
- package/dist/lint/precision.d.ts +51 -0
- package/dist/lint/precision.d.ts.map +1 -0
- package/dist/lint/precision.js +64 -0
- package/dist/lint/precision.js.map +1 -0
- package/dist/lint/rules/bsdd.d.ts +5 -0
- package/dist/lint/rules/bsdd.d.ts.map +1 -0
- package/dist/lint/rules/bsdd.js +123 -0
- package/dist/lint/rules/bsdd.js.map +1 -0
- package/dist/lint/rules/card.d.ts +10 -0
- package/dist/lint/rules/card.d.ts.map +1 -0
- package/dist/lint/rules/card.js +140 -0
- package/dist/lint/rules/card.js.map +1 -0
- package/dist/lint/rules/doc-ver-part.d.ts +7 -0
- package/dist/lint/rules/doc-ver-part.d.ts.map +1 -0
- package/dist/lint/rules/doc-ver-part.js +155 -0
- package/dist/lint/rules/doc-ver-part.js.map +1 -0
- package/dist/lint/rules/entity.d.ts +12 -0
- package/dist/lint/rules/entity.d.ts.map +1 -0
- package/dist/lint/rules/entity.js +215 -0
- package/dist/lint/rules/entity.js.map +1 -0
- package/dist/lint/rules/index.d.ts +4 -0
- package/dist/lint/rules/index.d.ts.map +1 -0
- package/dist/lint/rules/index.js +63 -0
- package/dist/lint/rules/index.js.map +1 -0
- package/dist/lint/rules/pdt-att.d.ts +7 -0
- package/dist/lint/rules/pdt-att.d.ts.map +1 -0
- package/dist/lint/rules/pdt-att.js +209 -0
- package/dist/lint/rules/pdt-att.js.map +1 -0
- package/dist/lint/rules/pset.d.ts +12 -0
- package/dist/lint/rules/pset.d.ts.map +1 -0
- package/dist/lint/rules/pset.js +263 -0
- package/dist/lint/rules/pset.js.map +1 -0
- package/dist/lint/rules/regex.d.ts +6 -0
- package/dist/lint/rules/regex.d.ts.map +1 -0
- package/dist/lint/rules/regex.js +184 -0
- package/dist/lint/rules/regex.js.map +1 -0
- package/dist/lint/rules/spec-doc.d.ts +5 -0
- package/dist/lint/rules/spec-doc.d.ts.map +1 -0
- package/dist/lint/rules/spec-doc.js +132 -0
- package/dist/lint/rules/spec-doc.js.map +1 -0
- package/dist/lint/rules/spec.d.ts +24 -0
- package/dist/lint/rules/spec.d.ts.map +1 -0
- package/dist/lint/rules/spec.js +162 -0
- package/dist/lint/rules/spec.js.map +1 -0
- package/dist/lint/rules/units.d.ts +4 -0
- package/dist/lint/rules/units.d.ts.map +1 -0
- package/dist/lint/rules/units.js +101 -0
- package/dist/lint/rules/units.js.map +1 -0
- package/dist/lint/rules/util.d.ts +37 -0
- package/dist/lint/rules/util.d.ts.map +1 -0
- package/dist/lint/rules/util.js +117 -0
- package/dist/lint/rules/util.js.map +1 -0
- package/dist/lint/rules/value-sites.d.ts +28 -0
- package/dist/lint/rules/value-sites.d.ts.map +1 -0
- package/dist/lint/rules/value-sites.js +81 -0
- package/dist/lint/rules/value-sites.js.map +1 -0
- package/dist/lint/rules/values.d.ts +22 -0
- package/dist/lint/rules/values.d.ts.map +1 -0
- package/dist/lint/rules/values.js +237 -0
- package/dist/lint/rules/values.js.map +1 -0
- package/dist/lint/rules/xsd-regex.d.ts +34 -0
- package/dist/lint/rules/xsd-regex.d.ts.map +1 -0
- package/dist/lint/rules/xsd-regex.js +149 -0
- package/dist/lint/rules/xsd-regex.js.map +1 -0
- package/dist/lint/solver/sample.d.ts +3 -0
- package/dist/lint/solver/sample.d.ts.map +1 -0
- package/dist/lint/solver/sample.js +134 -0
- package/dist/lint/solver/sample.js.map +1 -0
- package/dist/lint/solver/solver.d.ts +39 -0
- package/dist/lint/solver/solver.d.ts.map +1 -0
- package/dist/lint/solver/solver.js +126 -0
- package/dist/lint/solver/solver.js.map +1 -0
- package/dist/lint/suppress.d.ts +12 -0
- package/dist/lint/suppress.d.ts.map +1 -0
- package/dist/lint/suppress.js +56 -0
- package/dist/lint/suppress.js.map +1 -0
- package/dist/lint/types.d.ts +162 -0
- package/dist/lint/types.d.ts.map +1 -0
- package/dist/lint/types.js +5 -0
- package/dist/lint/types.js.map +1 -0
- package/dist/lint/walk.d.ts +20 -0
- package/dist/lint/walk.d.ts.map +1 -0
- package/dist/lint/walk.js +47 -0
- package/dist/lint/walk.js.map +1 -0
- package/dist/match/cascade.d.ts +53 -0
- package/dist/match/cascade.d.ts.map +1 -0
- package/dist/match/cascade.js +135 -0
- package/dist/match/cascade.js.map +1 -0
- package/dist/match/reidentify.d.ts +46 -0
- package/dist/match/reidentify.d.ts.map +1 -0
- package/dist/match/reidentify.js +67 -0
- package/dist/match/reidentify.js.map +1 -0
- package/dist/merge/comments.d.ts +13 -0
- package/dist/merge/comments.d.ts.map +1 -0
- package/dist/merge/comments.js +61 -0
- package/dist/merge/comments.js.map +1 -0
- package/dist/merge/index.d.ts +4 -0
- package/dist/merge/index.d.ts.map +1 -0
- package/dist/merge/index.js +6 -0
- package/dist/merge/index.js.map +1 -0
- package/dist/merge/keys.d.ts +22 -0
- package/dist/merge/keys.d.ts.map +1 -0
- package/dist/merge/keys.js +54 -0
- package/dist/merge/keys.js.map +1 -0
- package/dist/merge/merge.d.ts +8 -0
- package/dist/merge/merge.d.ts.map +1 -0
- package/dist/merge/merge.js +206 -0
- package/dist/merge/merge.js.map +1 -0
- package/dist/merge/order.d.ts +11 -0
- package/dist/merge/order.d.ts.map +1 -0
- package/dist/merge/order.js +117 -0
- package/dist/merge/order.js.map +1 -0
- package/dist/merge/sidecar.d.ts +12 -0
- package/dist/merge/sidecar.d.ts.map +1 -0
- package/dist/merge/sidecar.js +64 -0
- package/dist/merge/sidecar.js.map +1 -0
- package/dist/merge/types.d.ts +50 -0
- package/dist/merge/types.d.ts.map +1 -0
- package/dist/merge/types.js +5 -0
- package/dist/merge/types.js.map +1 -0
- package/dist/merge/view.d.ts +28 -0
- package/dist/merge/view.d.ts.map +1 -0
- package/dist/merge/view.js +35 -0
- package/dist/merge/view.js.map +1 -0
- package/dist/ops/draft.d.ts +33 -0
- package/dist/ops/draft.d.ts.map +1 -0
- package/dist/ops/draft.js +253 -0
- package/dist/ops/draft.js.map +1 -0
- package/dist/ops/json-schema-lite.d.ts +41 -0
- package/dist/ops/json-schema-lite.d.ts.map +1 -0
- package/dist/ops/json-schema-lite.js +119 -0
- package/dist/ops/json-schema-lite.js.map +1 -0
- package/dist/ops/schema-values.d.ts +5 -0
- package/dist/ops/schema-values.d.ts.map +1 -0
- package/dist/ops/schema-values.js +233 -0
- package/dist/ops/schema-values.js.map +1 -0
- package/dist/ops/schema.d.ts +27 -0
- package/dist/ops/schema.d.ts.map +1 -0
- package/dist/ops/schema.js +258 -0
- package/dist/ops/schema.js.map +1 -0
- package/dist/ops/sidecar-ops.d.ts +85 -0
- package/dist/ops/sidecar-ops.d.ts.map +1 -0
- package/dist/ops/sidecar-ops.js +5 -0
- package/dist/ops/sidecar-ops.js.map +1 -0
- package/dist/ops/types.d.ts +400 -0
- package/dist/ops/types.d.ts.map +1 -0
- package/dist/ops/types.js +5 -0
- package/dist/ops/types.js.map +1 -0
- package/dist/ops/units.d.ts +4 -0
- package/dist/ops/units.d.ts.map +1 -0
- package/dist/ops/units.js +75 -0
- package/dist/ops/units.js.map +1 -0
- package/dist/reducer/apply.d.ts +33 -0
- package/dist/reducer/apply.d.ts.map +1 -0
- package/dist/reducer/apply.js +123 -0
- package/dist/reducer/apply.js.map +1 -0
- package/dist/reducer/comment-ops.d.ts +18 -0
- package/dist/reducer/comment-ops.d.ts.map +1 -0
- package/dist/reducer/comment-ops.js +104 -0
- package/dist/reducer/comment-ops.js.map +1 -0
- package/dist/reducer/edit.d.ts +38 -0
- package/dist/reducer/edit.d.ts.map +1 -0
- package/dist/reducer/edit.js +126 -0
- package/dist/reducer/edit.js.map +1 -0
- package/dist/reducer/facet-ops.d.ts +20 -0
- package/dist/reducer/facet-ops.d.ts.map +1 -0
- package/dist/reducer/facet-ops.js +184 -0
- package/dist/reducer/facet-ops.js.map +1 -0
- package/dist/reducer/meta-ops.d.ts +20 -0
- package/dist/reducer/meta-ops.d.ts.map +1 -0
- package/dist/reducer/meta-ops.js +52 -0
- package/dist/reducer/meta-ops.js.map +1 -0
- package/dist/reducer/spec-ops.d.ts +29 -0
- package/dist/reducer/spec-ops.d.ts.map +1 -0
- package/dist/reducer/spec-ops.js +181 -0
- package/dist/reducer/spec-ops.js.map +1 -0
- package/dist/reducer/test-ops.d.ts +15 -0
- package/dist/reducer/test-ops.d.ts.map +1 -0
- package/dist/reducer/test-ops.js +90 -0
- package/dist/reducer/test-ops.js.map +1 -0
- package/dist/reducer/value-ops.d.ts +26 -0
- package/dist/reducer/value-ops.d.ts.map +1 -0
- package/dist/reducer/value-ops.js +173 -0
- package/dist/reducer/value-ops.js.map +1 -0
- package/dist/render/describe.d.ts +20 -0
- package/dist/render/describe.d.ts.map +1 -0
- package/dist/render/describe.js +47 -0
- package/dist/render/describe.js.map +1 -0
- package/dist/revision/index.d.ts +4 -0
- package/dist/revision/index.d.ts.map +1 -0
- package/dist/revision/index.js +7 -0
- package/dist/revision/index.js.map +1 -0
- package/dist/revision/revision.d.ts +79 -0
- package/dist/revision/revision.d.ts.map +1 -0
- package/dist/revision/revision.js +120 -0
- package/dist/revision/revision.js.map +1 -0
- package/dist/revision/sha256.d.ts +3 -0
- package/dist/revision/sha256.d.ts.map +1 -0
- package/dist/revision/sha256.js +69 -0
- package/dist/revision/sha256.js.map +1 -0
- package/dist/revision/verify.d.ts +21 -0
- package/dist/revision/verify.d.ts.map +1 -0
- package/dist/revision/verify.js +51 -0
- package/dist/revision/verify.js.map +1 -0
- package/dist/revision/view.d.ts +36 -0
- package/dist/revision/view.d.ts.map +1 -0
- package/dist/revision/view.js +32 -0
- package/dist/revision/view.js.map +1 -0
- package/dist/sidecar/idsz.d.ts +14 -0
- package/dist/sidecar/idsz.d.ts.map +1 -0
- package/dist/sidecar/idsz.js +58 -0
- package/dist/sidecar/idsz.js.map +1 -0
- package/dist/sidecar/sidecar-schema.d.ts +4 -0
- package/dist/sidecar/sidecar-schema.d.ts.map +1 -0
- package/dist/sidecar/sidecar-schema.js +69 -0
- package/dist/sidecar/sidecar-schema.js.map +1 -0
- package/dist/sidecar/sidecar.d.ts +102 -0
- package/dist/sidecar/sidecar.d.ts.map +1 -0
- package/dist/sidecar/sidecar.js +160 -0
- package/dist/sidecar/sidecar.js.map +1 -0
- package/dist/testing/index.d.ts +6 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +8 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/junit.d.ts +10 -0
- package/dist/testing/junit.d.ts.map +1 -0
- package/dist/testing/junit.js +51 -0
- package/dist/testing/junit.js.map +1 -0
- package/dist/testing/outcome.d.ts +10 -0
- package/dist/testing/outcome.d.ts.map +1 -0
- package/dist/testing/outcome.js +22 -0
- package/dist/testing/outcome.js.map +1 -0
- package/dist/testing/runner.d.ts +72 -0
- package/dist/testing/runner.d.ts.map +1 -0
- package/dist/testing/runner.js +60 -0
- package/dist/testing/runner.js.map +1 -0
- package/dist/testing/types.d.ts +60 -0
- package/dist/testing/types.d.ts.map +1 -0
- package/dist/testing/types.js +5 -0
- package/dist/testing/types.js.map +1 -0
- package/dist/testing/view.d.ts +31 -0
- package/dist/testing/view.d.ts.map +1 -0
- package/dist/testing/view.js +30 -0
- package/dist/testing/view.js.map +1 -0
- package/dist/uuid.d.ts +39 -0
- package/dist/uuid.d.ts.map +1 -0
- package/dist/uuid.js +84 -0
- package/dist/uuid.js.map +1 -0
- package/package.json +56 -3
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
import { assertGuardedRegexPattern, UnsafeRegexPatternError } from '@ifc-lite/regex-guard';
|
|
5
|
+
import { ALL_FACET_FIELDS, getField } from '../../document/fields.js';
|
|
6
|
+
import { quickFix } from '../fix.js';
|
|
7
|
+
import { allFacets, at } from '../walk.js';
|
|
8
|
+
import { gated } from './util.js';
|
|
9
|
+
import { rawSet } from './values.js';
|
|
10
|
+
import { literalOf, tokenizeXsdPattern } from './xsd-regex.js';
|
|
11
|
+
function patternSites(spec) {
|
|
12
|
+
const out = [];
|
|
13
|
+
for (const view of allFacets(spec)) {
|
|
14
|
+
for (const field of ALL_FACET_FIELDS) {
|
|
15
|
+
const c = getField(view.facet, field);
|
|
16
|
+
if (!c)
|
|
17
|
+
continue;
|
|
18
|
+
if (c.type === 'pattern')
|
|
19
|
+
out.push({ view, field, constraint: c, pattern: c.pattern, primary: true });
|
|
20
|
+
if (c.type !== 'simpleValue') {
|
|
21
|
+
for (const s of c.and ?? [])
|
|
22
|
+
if (s.type === 'pattern')
|
|
23
|
+
out.push({ view, field, constraint: c, pattern: s.pattern, primary: false });
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return out;
|
|
28
|
+
}
|
|
29
|
+
function withPattern(c, pattern) {
|
|
30
|
+
return c.type === 'pattern' ? { ...c, pattern } : undefined;
|
|
31
|
+
}
|
|
32
|
+
function fixPattern(rule, site, label, pattern) {
|
|
33
|
+
const next = site.primary ? withPattern(site.constraint, pattern) : undefined;
|
|
34
|
+
return next && pattern !== '' ? quickFix(label, rule.code, site.view.facetId, `${site.field}|${pattern}`, [rawSet(site.view.facetId, site.field, next)]) : undefined;
|
|
35
|
+
}
|
|
36
|
+
export const REGEX_001 = {
|
|
37
|
+
code: 'IDSL-REGEX-001',
|
|
38
|
+
area: 'REGEX',
|
|
39
|
+
scope: 'spec',
|
|
40
|
+
kind: 'static',
|
|
41
|
+
defaultSeverity: 'warning',
|
|
42
|
+
title: '^ or $ in an XSD pattern',
|
|
43
|
+
rationale: 'XSD patterns are implicitly anchored: the whole value must match. "^" and "$" are not anchors there but ordinary characters, so "^EI.*$" only matches values that literally start with "^" and end with "$".',
|
|
44
|
+
fix: 'Remove the leading ^ and trailing $.',
|
|
45
|
+
references: ['https://www.w3.org/TR/xmlschema-2/#regexs'],
|
|
46
|
+
example: '<xs:pattern value="^EI[0-9]+$"/>',
|
|
47
|
+
check(spec, { ctx, doc }) {
|
|
48
|
+
const out = [];
|
|
49
|
+
for (const site of patternSites(spec)) {
|
|
50
|
+
const tokens = tokenizeXsdPattern(site.pattern);
|
|
51
|
+
const anchors = tokens.filter((t) => t.kind === 'caret' || t.kind === 'dollar');
|
|
52
|
+
if (!anchors.length)
|
|
53
|
+
continue;
|
|
54
|
+
const edgeOnly = anchors.every((t) => (t.kind === 'caret' && t.start === 0) || (t.kind === 'dollar' && t.start === site.pattern.length - 1));
|
|
55
|
+
const fix = edgeOnly ? fixPattern(this, site, 'Remove the anchors', site.pattern.replace(/^\^/, '').replace(/\$$/, '')) : undefined;
|
|
56
|
+
out.push({ ...at(site.view, site.field), message: `pattern "${site.pattern}" contains ${anchors.map((t) => t.text).join(' and ')}, which XSD treats as literal characters`, fixes: gated(doc, ctx, [fix]) });
|
|
57
|
+
}
|
|
58
|
+
return out;
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
const VALUE_FIELDS = new Set(['attribute.value', 'property.value', 'classification.value', 'material.value']);
|
|
62
|
+
const MATCH_ALL = /^(\.\*)+$/;
|
|
63
|
+
export const REGEX_002 = {
|
|
64
|
+
code: 'IDSL-REGEX-002',
|
|
65
|
+
area: 'REGEX',
|
|
66
|
+
scope: 'spec',
|
|
67
|
+
kind: 'static',
|
|
68
|
+
defaultSeverity: 'warning',
|
|
69
|
+
title: 'Pattern that is a plain value or matches everything',
|
|
70
|
+
rationale: 'A pattern without any regex construct ("FireRating") is the same as a simple value, which is easier to read, translate and check. A value pattern of ".*" accepts every value, so it adds nothing to an existence check. (A ".*" around other text is meaningful in XSD, "contains", and is not flagged.)',
|
|
71
|
+
fix: 'Replace by a simple value, or drop the value so only existence is checked.',
|
|
72
|
+
example: '<value><xs:restriction base="xs:string"><xs:pattern value="EI60"/></xs:restriction></value>',
|
|
73
|
+
check(spec, { ctx, doc }) {
|
|
74
|
+
const out = [];
|
|
75
|
+
for (const site of patternSites(spec)) {
|
|
76
|
+
if (!site.primary || site.constraint.type !== 'pattern' || site.constraint.and?.length)
|
|
77
|
+
continue;
|
|
78
|
+
const literal = literalOf(site.pattern);
|
|
79
|
+
if (literal !== undefined && /\p{L}/u.test(literal)) {
|
|
80
|
+
const fix = quickFix(`Use the simple value "${literal}"`, this.code, site.view.facetId, site.field, [rawSet(site.view.facetId, site.field, { type: 'simpleValue', value: literal })]);
|
|
81
|
+
out.push({ ...at(site.view, site.field), message: `pattern "${site.pattern}" has no regex constructs; it is the simple value "${literal}"`, fixes: gated(doc, ctx, [fix]) });
|
|
82
|
+
}
|
|
83
|
+
else if (MATCH_ALL.test(site.pattern) && VALUE_FIELDS.has(site.field)) {
|
|
84
|
+
const fix = quickFix('Check existence only', this.code, site.view.facetId, site.field, [{ kind: 'facet.setField', payload: { facetId: site.view.facetId, field: site.field, value: null } }]);
|
|
85
|
+
out.push({ ...at(site.view, site.field), message: `pattern "${site.pattern}" accepts any value`, fixes: gated(doc, ctx, [fix]) });
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return out;
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
function unsupported(t) {
|
|
92
|
+
return t.kind === 'openSpecial' || t.kind === 'lazy' || t.kind === 'invalidEscape';
|
|
93
|
+
}
|
|
94
|
+
/** An escaped punctuation character that is not an XSD metacharacter, e.g. `\/`. */
|
|
95
|
+
function redundantEscape(t) {
|
|
96
|
+
return t.kind === 'invalidEscape' && t.text.length === 2 && /[^\p{L}\p{N}\s]/u.test(t.text[1]);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Constructs outside XSD 1.0 that the .NET- and JS-based reference tools
|
|
100
|
+
* read the same way, and that the buildingSMART corpus uses in pass- cases
|
|
101
|
+
* (restriction/pass-regex_patterns_work_in_OR_*: `(?:…)`; property/…: `\/`).
|
|
102
|
+
*/
|
|
103
|
+
function portable(t) {
|
|
104
|
+
return (t.kind === 'openSpecial' && t.text === '(?:') || redundantEscape(t);
|
|
105
|
+
}
|
|
106
|
+
/** Rewrite `(?:` → `(` and drop lazy markers; undefined when other unsupported constructs remain. */
|
|
107
|
+
function rewrite(pattern, tokens) {
|
|
108
|
+
let out = '';
|
|
109
|
+
for (const t of tokens) {
|
|
110
|
+
if (t.kind === 'openSpecial') {
|
|
111
|
+
if (t.text !== '(?:')
|
|
112
|
+
return undefined;
|
|
113
|
+
out += '(';
|
|
114
|
+
}
|
|
115
|
+
else if (t.kind === 'lazy') {
|
|
116
|
+
if (t.text !== '?')
|
|
117
|
+
return undefined;
|
|
118
|
+
}
|
|
119
|
+
else if (t.kind === 'invalidEscape') {
|
|
120
|
+
if (!redundantEscape(t))
|
|
121
|
+
return undefined;
|
|
122
|
+
out += t.text[1];
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
out += t.text;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return out === pattern ? undefined : out;
|
|
129
|
+
}
|
|
130
|
+
export const REGEX_003 = {
|
|
131
|
+
code: 'IDSL-REGEX-003',
|
|
132
|
+
area: 'REGEX',
|
|
133
|
+
scope: 'spec',
|
|
134
|
+
kind: 'static',
|
|
135
|
+
defaultSeverity: 'warning',
|
|
136
|
+
title: 'Construct not supported by XSD regex',
|
|
137
|
+
rationale: 'XSD regex has no lookarounds, non-capturing or named groups, backreferences, word boundaries (\\b), lazy quantifiers or escapes of ordinary characters. A checker that implements XSD regex strictly rejects such a pattern or reads it differently. Non-capturing groups and escaped punctuation (\\/) are read the same way by the common reference tools and appear in buildingSMART pass- test cases, so those findings are info only. Note that \\d and \\w are Unicode classes in XSD and \\w excludes the underscore.',
|
|
138
|
+
fix: 'Rewrite (?:…) as (…) and drop lazy markers (an anchored full match is the same either way); other constructs need a manual rewrite.',
|
|
139
|
+
references: ['https://www.w3.org/TR/xmlschema-2/#regexs'],
|
|
140
|
+
example: '<xs:pattern value="(?:EI|REI)[0-9]+"/>',
|
|
141
|
+
check(spec, { ctx, doc }) {
|
|
142
|
+
const out = [];
|
|
143
|
+
for (const site of patternSites(spec)) {
|
|
144
|
+
const tokens = tokenizeXsdPattern(site.pattern);
|
|
145
|
+
const bad = tokens.filter(unsupported);
|
|
146
|
+
if (!bad.length)
|
|
147
|
+
continue;
|
|
148
|
+
const rewritten = rewrite(site.pattern, tokens);
|
|
149
|
+
const fix = rewritten ? fixPattern(this, site, `Rewrite as "${rewritten}"`, rewritten) : undefined;
|
|
150
|
+
out.push({
|
|
151
|
+
...at(site.view, site.field),
|
|
152
|
+
...(bad.every(portable) ? { severity: 'info' } : {}),
|
|
153
|
+
message: `pattern "${site.pattern}" uses ${[...new Set(bad.map((t) => t.text))].join(', ')}, not part of XSD regex`,
|
|
154
|
+
fixes: gated(doc, ctx, [fix]),
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
return out;
|
|
158
|
+
},
|
|
159
|
+
};
|
|
160
|
+
export const REGEX_004 = {
|
|
161
|
+
code: 'IDSL-REGEX-004',
|
|
162
|
+
area: 'REGEX',
|
|
163
|
+
scope: 'spec',
|
|
164
|
+
kind: 'static',
|
|
165
|
+
defaultSeverity: 'error',
|
|
166
|
+
title: 'Catastrophic backtracking risk',
|
|
167
|
+
rationale: 'The pattern has a shape (nested or overlapping quantifiers, excessive length) that the shared ReDoS guard rejects: a backtracking engine can take exponential time on it. ifc-lite refuses to run it, and other checkers may hang.',
|
|
168
|
+
example: '<xs:pattern value="(a+)+b"/>',
|
|
169
|
+
check(spec) {
|
|
170
|
+
const out = [];
|
|
171
|
+
for (const site of patternSites(spec)) {
|
|
172
|
+
try {
|
|
173
|
+
assertGuardedRegexPattern(site.pattern);
|
|
174
|
+
}
|
|
175
|
+
catch (err) {
|
|
176
|
+
if (!(err instanceof UnsafeRegexPatternError))
|
|
177
|
+
throw err;
|
|
178
|
+
out.push({ ...at(site.view, site.field), message: `pattern "${site.pattern}" is rejected by the ReDoS guard: ${err.reason}` });
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return out;
|
|
182
|
+
},
|
|
183
|
+
};
|
|
184
|
+
//# sourceMappingURL=regex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"regex.js","sourceRoot":"","sources":["../../../src/lint/rules/regex.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec-doc.d.ts","sourceRoot":"","sources":["../../../src/lint/rules/spec-doc.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,YAAY,EAAqB,MAAM,aAAa,CAAC;AA8BnE,eAAO,MAAM,QAAQ,EAAE,YA0BtB,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,YAwBtB,CAAC;AAgBF,eAAO,MAAM,QAAQ,EAAE,YA+BtB,CAAC"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
import { overlaps } from '../solver/solver.js';
|
|
5
|
+
import { quickFix } from '../fix.js';
|
|
6
|
+
import { where } from '../walk.js';
|
|
7
|
+
import { subjectOf } from './spec.js';
|
|
8
|
+
import { gated } from './util.js';
|
|
9
|
+
/** Key-sorted JSON, so equal content gives equal text regardless of key order. */
|
|
10
|
+
function canonical(value) {
|
|
11
|
+
if (Array.isArray(value))
|
|
12
|
+
return `[${value.map(canonical).join(',')}]`;
|
|
13
|
+
if (value && typeof value === 'object') {
|
|
14
|
+
const entries = Object.entries(value).filter(([, v]) => v !== undefined).sort(([a], [b]) => a.localeCompare(b));
|
|
15
|
+
return `{${entries.map(([k, v]) => `${JSON.stringify(k)}:${canonical(v)}`).join(',')}}`;
|
|
16
|
+
}
|
|
17
|
+
return JSON.stringify(value);
|
|
18
|
+
}
|
|
19
|
+
const SIGNATURES = new WeakMap();
|
|
20
|
+
/** Order-insensitive content signatures of a spec, cached per spec object. */
|
|
21
|
+
function signatures(spec) {
|
|
22
|
+
let s = SIGNATURES.get(spec);
|
|
23
|
+
if (!s) {
|
|
24
|
+
const facets = (list) => list.map(canonical).sort();
|
|
25
|
+
const applicability = canonical({ versions: [...spec.ifcVersions].sort(), facets: facets(spec.applicability.facets) });
|
|
26
|
+
const requirements = spec.requirements.map((r) => canonical({ facet: r.facet, optionality: r.optionality })).sort();
|
|
27
|
+
s = { applicability, full: canonical({ applicability, requirements, min: spec.minOccurs ?? 0, max: spec.maxOccurs ?? 'unbounded' }) };
|
|
28
|
+
SIGNATURES.set(spec, s);
|
|
29
|
+
}
|
|
30
|
+
return s;
|
|
31
|
+
}
|
|
32
|
+
export const SPEC_005 = {
|
|
33
|
+
code: 'IDSL-SPEC-005',
|
|
34
|
+
area: 'SPEC',
|
|
35
|
+
scope: 'document',
|
|
36
|
+
kind: 'static',
|
|
37
|
+
defaultSeverity: 'warning',
|
|
38
|
+
title: 'Duplicate specification',
|
|
39
|
+
rationale: 'Two specifications have the same IFC versions, applicability, requirements and cardinality (names and descriptions aside). Every element is checked twice and reported twice, and an edit to one copy silently diverges from the other.',
|
|
40
|
+
fix: 'Remove the later copy.',
|
|
41
|
+
example: 'Two <specification> elements with identical content and different names.',
|
|
42
|
+
check(specs, { ctx, doc }) {
|
|
43
|
+
const seen = new Map();
|
|
44
|
+
const out = [];
|
|
45
|
+
for (const s of specs) {
|
|
46
|
+
const key = signatures(s.spec).full;
|
|
47
|
+
const first = seen.get(key);
|
|
48
|
+
if (!first) {
|
|
49
|
+
seen.set(key, s);
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
const fix = quickFix(`Remove "${s.spec.name}"`, this.code, s.specId, 'remove', [{ kind: 'spec.remove', payload: { specId: s.specId } }]);
|
|
53
|
+
out.push({ nodeId: s.specId, message: `"${s.spec.name}" duplicates "${first.spec.name}" (specification ${first.index + 1})`, fixes: gated(doc, ctx, [fix]) });
|
|
54
|
+
}
|
|
55
|
+
return out;
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
export const SPEC_006 = {
|
|
59
|
+
code: 'IDSL-SPEC-006',
|
|
60
|
+
area: 'SPEC',
|
|
61
|
+
scope: 'document',
|
|
62
|
+
kind: 'static',
|
|
63
|
+
defaultSeverity: 'warning',
|
|
64
|
+
title: 'Overlapping specifications with conflicting requirements',
|
|
65
|
+
rationale: 'Two specifications select exactly the same elements (identical applicability and IFC versions) but require values with nothing in common for the same attribute or property. No element can pass both. This rule only compares identical applicabilities; partially overlapping ones need a model to decide (SPEC-004, model-aware).',
|
|
66
|
+
example: 'Spec A: IfcDoor, FireRating = EI30. Spec B: IfcDoor, FireRating = EI60.',
|
|
67
|
+
check(specs) {
|
|
68
|
+
const out = [];
|
|
69
|
+
specs.forEach((b, j) => {
|
|
70
|
+
for (const a of specs.slice(0, j)) {
|
|
71
|
+
if (signatures(a.spec).applicability !== signatures(b.spec).applicability)
|
|
72
|
+
continue;
|
|
73
|
+
const clash = conflict(a, b);
|
|
74
|
+
if (clash) {
|
|
75
|
+
out.push({ nodeId: clash.facetId, message: `${where(clash)} of "${b.spec.name}" conflicts with "${a.spec.name}", which selects the same elements` });
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
return out;
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
function conflict(a, b) {
|
|
84
|
+
const required = (s) => s.requirements.filter((r) => r.requirement?.optionality === 'required');
|
|
85
|
+
for (const rb of required(b)) {
|
|
86
|
+
const sb = subjectOf(rb.facet);
|
|
87
|
+
if (!sb?.constraint)
|
|
88
|
+
continue;
|
|
89
|
+
for (const ra of required(a)) {
|
|
90
|
+
const sa = subjectOf(ra.facet);
|
|
91
|
+
if (!sa?.constraint || sa.key !== sb.key || (sa.dataType && sb.dataType && sa.dataType !== sb.dataType))
|
|
92
|
+
continue;
|
|
93
|
+
if (overlaps(sa.constraint, sb.constraint, sb.opts) === 'no')
|
|
94
|
+
return rb;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return undefined;
|
|
98
|
+
}
|
|
99
|
+
export const SPEC_009 = {
|
|
100
|
+
code: 'IDSL-SPEC-009',
|
|
101
|
+
area: 'SPEC',
|
|
102
|
+
scope: 'document',
|
|
103
|
+
kind: 'static',
|
|
104
|
+
defaultSeverity: 'warning',
|
|
105
|
+
title: 'Duplicate identifier',
|
|
106
|
+
rationale: 'Specification identifiers are how reports, BCF issues and contracts refer to a requirement. Two specifications sharing one identifier make those references ambiguous.',
|
|
107
|
+
fix: 'Give the later specification a unique identifier.',
|
|
108
|
+
example: '<specification identifier="FS-01" …/> twice',
|
|
109
|
+
check(specs, { ctx, doc }) {
|
|
110
|
+
const used = new Set(specs.map((s) => s.spec.identifier?.trim()).filter((x) => !!x));
|
|
111
|
+
const seen = new Map();
|
|
112
|
+
const out = [];
|
|
113
|
+
for (const s of specs) {
|
|
114
|
+
const id = s.spec.identifier?.trim();
|
|
115
|
+
if (!id)
|
|
116
|
+
continue;
|
|
117
|
+
const first = seen.get(id);
|
|
118
|
+
if (!first) {
|
|
119
|
+
seen.set(id, s);
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
let n = 2;
|
|
123
|
+
while (used.has(`${id}-${n}`))
|
|
124
|
+
n++;
|
|
125
|
+
used.add(`${id}-${n}`);
|
|
126
|
+
const fix = quickFix(`Renumber to ${id}-${n}`, this.code, s.specId, `${id}-${n}`, [{ kind: 'spec.set', payload: { specId: s.specId, field: 'identifier', value: `${id}-${n}` } }]);
|
|
127
|
+
out.push({ nodeId: s.specId, message: `identifier "${id}" is also used by "${first.spec.name}"`, fixes: gated(doc, ctx, [fix]) });
|
|
128
|
+
}
|
|
129
|
+
return out;
|
|
130
|
+
},
|
|
131
|
+
};
|
|
132
|
+
//# sourceMappingURL=spec-doc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec-doc.js","sourceRoot":"","sources":["../../../src/lint/rules/spec-doc.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/** Specification semantics: IDSL-SPEC-001, 002, 003, 007, 008. */
|
|
2
|
+
import type { IDSConstraint, IDSFacet } from '@ifc-lite/ids';
|
|
3
|
+
import { type SolveOptions } from '../solver/solver.js';
|
|
4
|
+
import type { SpecRule } from '../types.js';
|
|
5
|
+
/**
|
|
6
|
+
* What a facet is ABOUT (its identity) and the constraint on it. Only
|
|
7
|
+
* single-valued subjects get a key: an element has one class, one value per
|
|
8
|
+
* attribute and one value per property. Classifications and materials can
|
|
9
|
+
* be multiple, so two different values are not a contradiction there.
|
|
10
|
+
*/
|
|
11
|
+
export interface Subject {
|
|
12
|
+
key: string;
|
|
13
|
+
constraint?: IDSConstraint;
|
|
14
|
+
/** Property data type (values are compared under it). */
|
|
15
|
+
dataType?: string;
|
|
16
|
+
opts: SolveOptions;
|
|
17
|
+
}
|
|
18
|
+
export declare function subjectOf(facet: IDSFacet): Subject | undefined;
|
|
19
|
+
export declare const SPEC_001: SpecRule;
|
|
20
|
+
export declare const SPEC_002: SpecRule;
|
|
21
|
+
export declare const SPEC_003: SpecRule;
|
|
22
|
+
export declare const SPEC_007: SpecRule;
|
|
23
|
+
export declare const SPEC_008: SpecRule;
|
|
24
|
+
//# sourceMappingURL=spec.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec.d.ts","sourceRoot":"","sources":["../../../src/lint/rules/spec.ts"],"names":[],"mappings":"AAIA,kEAAkE;AAElE,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAqB,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAE3E,OAAO,KAAK,EAAsB,QAAQ,EAAE,MAAM,aAAa,CAAC;AAKhE;;;;;GAKG;AACH,MAAM,WAAW,OAAO;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,yDAAyD;IACzD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,YAAY,CAAC;CACpB;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,GAAG,SAAS,CAgB9D;AAUD,eAAO,MAAM,QAAQ,EAAE,QA6BtB,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,QAkCtB,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,QAwBtB,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,QAiBtB,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,QAgBtB,CAAC"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
import { implies, overlaps } from '../solver/solver.js';
|
|
5
|
+
import { quickFix } from '../fix.js';
|
|
6
|
+
import { where } from '../walk.js';
|
|
7
|
+
import { isProhibitedSpec, isRequiredSpec } from './card.js';
|
|
8
|
+
import { gated, single } from './util.js';
|
|
9
|
+
export function subjectOf(facet) {
|
|
10
|
+
switch (facet.type) {
|
|
11
|
+
case 'entity':
|
|
12
|
+
return facet.predefinedType ? undefined : { key: 'entity', constraint: facet.name, opts: { caseInsensitive: true } };
|
|
13
|
+
case 'attribute': {
|
|
14
|
+
const name = single(facet.name);
|
|
15
|
+
return name ? { key: `attribute|${name.toLowerCase()}`, constraint: facet.value, opts: {} } : undefined;
|
|
16
|
+
}
|
|
17
|
+
case 'property': {
|
|
18
|
+
const pset = single(facet.propertySet);
|
|
19
|
+
const name = single(facet.baseName);
|
|
20
|
+
return pset && name ? { key: `property|${pset}|${name}`, constraint: facet.value, dataType: single(facet.dataType)?.toUpperCase(), opts: {} } : undefined;
|
|
21
|
+
}
|
|
22
|
+
default:
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function comparable(a, b) {
|
|
27
|
+
return a.key === b.key && (a.dataType === undefined || b.dataType === undefined || a.dataType === b.dataType);
|
|
28
|
+
}
|
|
29
|
+
function binding(r) {
|
|
30
|
+
return r.requirement?.optionality === 'required' || r.requirement?.optionality === 'optional';
|
|
31
|
+
}
|
|
32
|
+
export const SPEC_001 = {
|
|
33
|
+
code: 'IDSL-SPEC-001',
|
|
34
|
+
area: 'SPEC',
|
|
35
|
+
scope: 'spec',
|
|
36
|
+
kind: 'static',
|
|
37
|
+
defaultSeverity: 'warning',
|
|
38
|
+
title: 'Requirement that can never fail',
|
|
39
|
+
rationale: 'The requirement asks for something the applicability already guarantees: the same entity, attribute or property with the same or a weaker constraint. Every applicable element satisfies it by construction, so it checks nothing. Usually the facet belongs in only one of the two sections.',
|
|
40
|
+
fix: 'Remove the requirement.',
|
|
41
|
+
example: '<applicability>…<property>…<value><simpleValue>EI60</simpleValue></value></property></applicability><requirements><property>… (same property, no value)</property></requirements>',
|
|
42
|
+
check(spec, { ctx, doc }) {
|
|
43
|
+
const out = [];
|
|
44
|
+
for (const r of spec.requirements) {
|
|
45
|
+
if (r.requirement?.optionality !== 'required')
|
|
46
|
+
continue;
|
|
47
|
+
const rs = subjectOf(r.facet);
|
|
48
|
+
if (!rs)
|
|
49
|
+
continue;
|
|
50
|
+
const implied = spec.applicability.find((a) => {
|
|
51
|
+
const as = subjectOf(a.facet);
|
|
52
|
+
if (!as || as.key !== rs.key || (rs.dataType && rs.dataType !== as.dataType))
|
|
53
|
+
return false;
|
|
54
|
+
if (!rs.constraint)
|
|
55
|
+
return true;
|
|
56
|
+
return !!as.constraint && implies(as.constraint, rs.constraint, rs.opts) === 'yes';
|
|
57
|
+
});
|
|
58
|
+
if (!implied)
|
|
59
|
+
continue;
|
|
60
|
+
const fix = quickFix('Remove the requirement', this.code, r.facetId, 'remove', [{ kind: 'facet.remove', payload: { facetId: r.facetId } }]);
|
|
61
|
+
out.push({ nodeId: r.facetId, message: `${where(r)} is already guaranteed by ${where(implied)}, so it can never fail`, fixes: gated(doc, ctx, [fix]) });
|
|
62
|
+
}
|
|
63
|
+
return out;
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
export const SPEC_002 = {
|
|
67
|
+
code: 'IDSL-SPEC-002',
|
|
68
|
+
area: 'SPEC',
|
|
69
|
+
scope: 'spec',
|
|
70
|
+
kind: 'static',
|
|
71
|
+
defaultSeverity: 'error',
|
|
72
|
+
title: 'Contradictory requirements',
|
|
73
|
+
rationale: 'Two constraints on the same single-valued subject (the entity class, one attribute, one property) have no value in common: two requirements with disjoint enumerations or bounds, or a requirement that excludes every value the applicability selects. No element can pass. The solver only reports a contradiction it can prove (finite sets and numeric ranges exactly; patterns are never declared disjoint).',
|
|
74
|
+
example: '<requirements><property>…<value><simpleValue>EI60</simpleValue></value></property><property>… (same property) <value><simpleValue>EI90</simpleValue></value></property></requirements>',
|
|
75
|
+
check(spec) {
|
|
76
|
+
const out = [];
|
|
77
|
+
const reqs = spec.requirements.filter(binding);
|
|
78
|
+
reqs.forEach((r, i) => {
|
|
79
|
+
const rs = subjectOf(r.facet);
|
|
80
|
+
if (!rs?.constraint)
|
|
81
|
+
return;
|
|
82
|
+
for (const a of spec.applicability) {
|
|
83
|
+
const as = subjectOf(a.facet);
|
|
84
|
+
if (as?.constraint && comparable(as, rs) && overlaps(as.constraint, rs.constraint, rs.opts) === 'no') {
|
|
85
|
+
out.push({ nodeId: r.facetId, message: `${where(r)} excludes every element that ${where(a)} selects; no applicable element can pass` });
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
for (const other of reqs.slice(0, i)) {
|
|
90
|
+
const os = subjectOf(other.facet);
|
|
91
|
+
const eitherRequired = r.requirement?.optionality === 'required' || other.requirement?.optionality === 'required';
|
|
92
|
+
if (os?.constraint && eitherRequired && comparable(os, rs) && overlaps(os.constraint, rs.constraint, rs.opts) === 'no') {
|
|
93
|
+
out.push({ nodeId: r.facetId, message: `${where(r)} and ${where(other)} constrain the same ${rs.key.split('|')[0]} to values with nothing in common` });
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
return out;
|
|
99
|
+
},
|
|
100
|
+
};
|
|
101
|
+
export const SPEC_003 = {
|
|
102
|
+
code: 'IDSL-SPEC-003',
|
|
103
|
+
area: 'SPEC',
|
|
104
|
+
scope: 'spec',
|
|
105
|
+
kind: 'static',
|
|
106
|
+
defaultSeverity: 'warning',
|
|
107
|
+
title: 'Applicability that can never match',
|
|
108
|
+
rationale: 'All applicability facets must hold at once. Two of them constrain the same single-valued subject (two different entity classes, two disjoint values of one property) so no element can match, and the specification never applies.',
|
|
109
|
+
example: '<applicability><entity>IFCWALL</entity><entity>IFCSLAB</entity></applicability>',
|
|
110
|
+
check(spec) {
|
|
111
|
+
const out = [];
|
|
112
|
+
spec.applicability.forEach((a, i) => {
|
|
113
|
+
const as = subjectOf(a.facet);
|
|
114
|
+
const ac = as?.constraint;
|
|
115
|
+
if (!as || !ac)
|
|
116
|
+
return;
|
|
117
|
+
const clash = spec.applicability.slice(0, i).find((b) => {
|
|
118
|
+
const bs = subjectOf(b.facet);
|
|
119
|
+
return !!bs?.constraint && comparable(as, bs) && overlaps(bs.constraint, ac, as.opts) === 'no';
|
|
120
|
+
});
|
|
121
|
+
if (clash)
|
|
122
|
+
out.push({ nodeId: a.facetId, message: `${where(a)} and ${where(clash)} cannot both hold; the specification never applies` });
|
|
123
|
+
});
|
|
124
|
+
return out;
|
|
125
|
+
},
|
|
126
|
+
};
|
|
127
|
+
export const SPEC_007 = {
|
|
128
|
+
code: 'IDSL-SPEC-007',
|
|
129
|
+
area: 'SPEC',
|
|
130
|
+
scope: 'spec',
|
|
131
|
+
kind: 'static',
|
|
132
|
+
defaultSeverity: 'info',
|
|
133
|
+
title: 'Specification without requirements',
|
|
134
|
+
rationale: 'A specification with no requirements only checks whether applicable elements exist (when it is required), or checks nothing at all (when it is optional). That is sometimes intended, but often a requirement was forgotten. Prohibited specifications are exempt: "no element may match" needs no requirements.',
|
|
135
|
+
example: '<specification …><applicability>…</applicability></specification>',
|
|
136
|
+
check(spec) {
|
|
137
|
+
if (spec.requirements.length || isProhibitedSpec(spec.spec))
|
|
138
|
+
return [];
|
|
139
|
+
const message = isRequiredSpec(spec.spec)
|
|
140
|
+
? 'the specification has no requirements; it only checks that applicable elements exist'
|
|
141
|
+
: 'the specification has no requirements and is optional, so it checks nothing';
|
|
142
|
+
return [{ nodeId: spec.specId, message }];
|
|
143
|
+
},
|
|
144
|
+
};
|
|
145
|
+
export const SPEC_008 = {
|
|
146
|
+
code: 'IDSL-SPEC-008',
|
|
147
|
+
area: 'SPEC',
|
|
148
|
+
scope: 'spec',
|
|
149
|
+
kind: 'static',
|
|
150
|
+
defaultSeverity: 'info',
|
|
151
|
+
// Owner decision (#7144): fires on nearly every specification in practice.
|
|
152
|
+
optIn: true,
|
|
153
|
+
title: 'Specification without description or instructions',
|
|
154
|
+
rationale: 'Modellers see the description and instructions when a check fails. Without them the failure report shows only facet text, which rarely tells a modeller what to change or why the requirement exists.',
|
|
155
|
+
example: '<specification name="Doors" ifcVersion="IFC4"> (no description, no instructions)',
|
|
156
|
+
check(spec) {
|
|
157
|
+
if (spec.spec.description?.trim() || spec.spec.instructions?.trim())
|
|
158
|
+
return [];
|
|
159
|
+
return [{ nodeId: spec.specId, message: `"${spec.spec.name}" has neither a description nor instructions for modellers` }];
|
|
160
|
+
},
|
|
161
|
+
};
|
|
162
|
+
//# sourceMappingURL=spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec.js","sourceRoot":"","sources":["../../../src/lint/rules/spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"units.d.ts","sourceRoot":"","sources":["../../../src/lint/rules/units.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAW,QAAQ,EAAE,MAAM,aAAa,CAAC;AAQrD,eAAO,MAAM,OAAO,EAAE,QAqBrB,CAAC;AAkDF,eAAO,MAAM,QAAQ,EAAE,QA4BtB,CAAC"}
|