@ifc-lite/ids-authoring 0.0.0-stage → 0.2.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/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,68 @@
|
|
|
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
|
+
/** Optimal-string-alignment distance (Damerau-Levenshtein with adjacent transpositions). */
|
|
5
|
+
export function osaDistance(a, b) {
|
|
6
|
+
if (a === b)
|
|
7
|
+
return 0;
|
|
8
|
+
if (!a.length)
|
|
9
|
+
return b.length;
|
|
10
|
+
if (!b.length)
|
|
11
|
+
return a.length;
|
|
12
|
+
let prev2 = [];
|
|
13
|
+
let prev = Array.from({ length: b.length + 1 }, (_, j) => j);
|
|
14
|
+
for (let i = 1; i <= a.length; i++) {
|
|
15
|
+
const cur = [i];
|
|
16
|
+
for (let j = 1; j <= b.length; j++) {
|
|
17
|
+
const cost = a[i - 1] === b[j - 1] ? 0 : 1;
|
|
18
|
+
let d = Math.min(prev[j] + 1, cur[j - 1] + 1, prev[j - 1] + cost);
|
|
19
|
+
if (i > 1 && j > 1 && a[i - 1] === b[j - 2] && a[i - 2] === b[j - 1])
|
|
20
|
+
d = Math.min(d, prev2[j - 2] + 1);
|
|
21
|
+
cur.push(d);
|
|
22
|
+
}
|
|
23
|
+
prev2 = prev;
|
|
24
|
+
prev = cur;
|
|
25
|
+
}
|
|
26
|
+
return prev[b.length];
|
|
27
|
+
}
|
|
28
|
+
export function tokens(s) {
|
|
29
|
+
const parts = s
|
|
30
|
+
.replace(/([a-z0-9])([A-Z])/g, '$1 $2')
|
|
31
|
+
.replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2')
|
|
32
|
+
.split(/[^A-Za-z0-9]+/)
|
|
33
|
+
.map((t) => t.toLowerCase())
|
|
34
|
+
.filter(Boolean);
|
|
35
|
+
return new Set(parts);
|
|
36
|
+
}
|
|
37
|
+
function jaccard(a, b) {
|
|
38
|
+
if (!a.size && !b.size)
|
|
39
|
+
return 1;
|
|
40
|
+
let inter = 0;
|
|
41
|
+
for (const t of a)
|
|
42
|
+
if (b.has(t))
|
|
43
|
+
inter++;
|
|
44
|
+
return inter / (a.size + b.size - inter);
|
|
45
|
+
}
|
|
46
|
+
export function similarity(query, candidate) {
|
|
47
|
+
const q = query.toLowerCase();
|
|
48
|
+
const c = candidate.toLowerCase();
|
|
49
|
+
const maxLen = Math.max(q.length, c.length) || 1;
|
|
50
|
+
const edit = 1 - osaDistance(q, c) / maxLen;
|
|
51
|
+
return 0.6 * edit + 0.4 * jaccard(tokens(query), tokens(candidate));
|
|
52
|
+
}
|
|
53
|
+
/** The best-matching `pool` entries for `query`, best first. */
|
|
54
|
+
export function rankCandidates(query, pool, options = {}) {
|
|
55
|
+
const { limit = 5, minScore = 0.3, boost } = options;
|
|
56
|
+
const scored = [];
|
|
57
|
+
for (const value of pool) {
|
|
58
|
+
const base = similarity(query, value);
|
|
59
|
+
if (base < minScore)
|
|
60
|
+
continue;
|
|
61
|
+
const extra = boost?.(value);
|
|
62
|
+
const score = Math.min(1, base + (extra?.boost ?? 0));
|
|
63
|
+
scored.push(extra?.reason ? { value, score, reason: extra.reason } : { value, score });
|
|
64
|
+
}
|
|
65
|
+
scored.sort((a, b) => b.score - a.score || a.value.localeCompare(b.value));
|
|
66
|
+
return scored.slice(0, limit).map((c) => ({ ...c, score: Math.round(c.score * 1000) / 1000 }));
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=rank.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rank.js","sourceRoot":"","sources":["../../src/gate/rank.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structural rules (GATE-STR-00x) and op-level value rules that the
|
|
3
|
+
* reducer itself does not enforce, plus the map from an applied op to the
|
|
4
|
+
* facet fields whose grounding it may have changed.
|
|
5
|
+
*/
|
|
6
|
+
import type { IDSFacet, IDSRequirement } from '@ifc-lite/ids';
|
|
7
|
+
import { type FacetFieldName } from '../document/fields.js';
|
|
8
|
+
import type { StudioDocument } from '../document/types.js';
|
|
9
|
+
import type { PrimitiveOp } from '../ops/types.js';
|
|
10
|
+
import type { Uuid } from '../uuid.js';
|
|
11
|
+
import type { GateCode } from './types.js';
|
|
12
|
+
export interface StructuralProblem {
|
|
13
|
+
code: GateCode;
|
|
14
|
+
message: string;
|
|
15
|
+
/** Path below `ops[i]`, e.g. `.payload.value`. */
|
|
16
|
+
at: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* What a `meta.suppressions` entry can name: a lint rule code
|
|
20
|
+
* (`IDSL-SPEC-008`), an area wildcard (`IDSL-SPEC-*`) or every rule
|
|
21
|
+
* (`IDSL-*`), matching `suppressionMatches` in the linter.
|
|
22
|
+
*/
|
|
23
|
+
export declare const SUPPRESSION_RULE: RegExp;
|
|
24
|
+
/**
|
|
25
|
+
* `meta.suppress` checks that need the document. They live in the gate, not
|
|
26
|
+
* the reducer, so undo can restore any suppression exactly as it was.
|
|
27
|
+
*/
|
|
28
|
+
export declare function checkSuppressionOp(op: PrimitiveOp, doc: StudioDocument): StructuralProblem[];
|
|
29
|
+
/** Checks on the op payload itself, before it is applied. */
|
|
30
|
+
export declare function checkOpPayload(op: PrimitiveOp): StructuralProblem[];
|
|
31
|
+
/** Facet-level structural rules on the facet as it is AFTER the op. */
|
|
32
|
+
export declare function checkFacetStructure(facet: IDSFacet, requirement: IDSRequirement | undefined): StructuralProblem[];
|
|
33
|
+
/** Which facet fields an applied op may have changed the grounding of. */
|
|
34
|
+
export interface GroundingTarget {
|
|
35
|
+
facetId: Uuid;
|
|
36
|
+
fields: FacetFieldName[];
|
|
37
|
+
/** Path below `ops[i]` to point issues at. */
|
|
38
|
+
at: (field: FacetFieldName) => string;
|
|
39
|
+
}
|
|
40
|
+
export declare function groundingTargets(op: PrimitiveOp, after: StudioDocument, beforeSpecOf: (facetId: Uuid) => Uuid | undefined): GroundingTarget[];
|
|
41
|
+
/** Facets whose structure (not grounding) an op may have changed. */
|
|
42
|
+
export declare function structureTargets(op: PrimitiveOp): Uuid[];
|
|
43
|
+
//# sourceMappingURL=structural.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structural.d.ts","sourceRoot":"","sources":["../../src/gate/structural.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC9D,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE3E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,QAAQ,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,kDAAkD;IAClD,EAAE,EAAE,MAAM,CAAC;CACZ;AAYD;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,QAAsC,CAAC;AAEpE;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,cAAc,GAAG,iBAAiB,EAAE,CAgB5F;AAED,6DAA6D;AAC7D,wBAAgB,cAAc,CAAC,EAAE,EAAE,WAAW,GAAG,iBAAiB,EAAE,CA+BnE;AAKD,uEAAuE;AACvE,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,cAAc,GAAG,SAAS,GAAG,iBAAiB,EAAE,CAmBjH;AAED,0EAA0E;AAC1E,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,IAAI,CAAC;IACd,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,8CAA8C;IAC9C,EAAE,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,MAAM,CAAC;CACvC;AAyBD,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC,OAAO,EAAE,IAAI,KAAK,IAAI,GAAG,SAAS,GAAG,eAAe,EAAE,CA6B7I;AAED,qEAAqE;AACrE,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI,EAAE,CAgBxD"}
|
|
@@ -0,0 +1,175 @@
|
|
|
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 { presentFields } from '../document/fields.js';
|
|
5
|
+
import { facetAt, locateFacet, locateNode, locateSpec } from '../document/node-index.js';
|
|
6
|
+
import { isReservedPsetName } from './grounding-pset.js';
|
|
7
|
+
// IDS 1.0 XSD: author is `[^@]+@[^\.]+\..+`, date is xs:date.
|
|
8
|
+
const AUTHOR = /^[^@]+@[^.]+\..+$/;
|
|
9
|
+
const XS_DATE = /^-?\d{4,}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])(Z|[+-]\d{2}:\d{2})?$/;
|
|
10
|
+
function versionsProblem(versions) {
|
|
11
|
+
return new Set(versions).size === versions.length
|
|
12
|
+
? []
|
|
13
|
+
: [{ code: 'GATE-STR-007', message: 'ifcVersions lists a version twice', at: '.payload' }];
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* What a `meta.suppressions` entry can name: a lint rule code
|
|
17
|
+
* (`IDSL-SPEC-008`), an area wildcard (`IDSL-SPEC-*`) or every rule
|
|
18
|
+
* (`IDSL-*`), matching `suppressionMatches` in the linter.
|
|
19
|
+
*/
|
|
20
|
+
export const SUPPRESSION_RULE = /^IDSL-(?:\*|[A-Z]+-(?:\d{3}|\*))$/;
|
|
21
|
+
/**
|
|
22
|
+
* `meta.suppress` checks that need the document. They live in the gate, not
|
|
23
|
+
* the reducer, so undo can restore any suppression exactly as it was.
|
|
24
|
+
*/
|
|
25
|
+
export function checkSuppressionOp(op, doc) {
|
|
26
|
+
if (op.kind !== 'meta.suppress')
|
|
27
|
+
return [];
|
|
28
|
+
const { nodeId, suppression } = op.payload;
|
|
29
|
+
const out = [];
|
|
30
|
+
if (!locateNode(doc, nodeId))
|
|
31
|
+
out.push({ code: 'GATE-STR-001', message: `unknown node ${nodeId}`, at: '.payload.nodeId' });
|
|
32
|
+
if (!SUPPRESSION_RULE.test(suppression.rule)) {
|
|
33
|
+
out.push({
|
|
34
|
+
code: 'GATE-SUP-001',
|
|
35
|
+
message: `"${suppression.rule}" is not a lint rule code; use IDSL-<AREA>-<nnn>, IDSL-<AREA>-* or IDSL-*`,
|
|
36
|
+
at: '.payload.suppression.rule',
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
if (suppression.reason.trim() === '') {
|
|
40
|
+
out.push({ code: 'GATE-SUP-002', message: `a suppression of ${suppression.rule} needs a reason`, at: '.payload.suppression.reason' });
|
|
41
|
+
}
|
|
42
|
+
return out;
|
|
43
|
+
}
|
|
44
|
+
/** Checks on the op payload itself, before it is applied. */
|
|
45
|
+
export function checkOpPayload(op) {
|
|
46
|
+
switch (op.kind) {
|
|
47
|
+
case 'doc.setInfo': {
|
|
48
|
+
const { field, value } = op.payload;
|
|
49
|
+
if (value === null)
|
|
50
|
+
return [];
|
|
51
|
+
if (field === 'title' && value.trim() === '')
|
|
52
|
+
return [{ code: 'GATE-STR-007', message: 'title cannot be empty', at: '.payload.value' }];
|
|
53
|
+
if (field === 'author' && !AUTHOR.test(value))
|
|
54
|
+
return [{ code: 'GATE-VAL-007', message: `author "${value}" is not an e-mail address`, at: '.payload.value' }];
|
|
55
|
+
if (field === 'date' && !XS_DATE.test(value))
|
|
56
|
+
return [{ code: 'GATE-VAL-007', message: `date "${value}" is not an xs:date (YYYY-MM-DD)`, at: '.payload.value' }];
|
|
57
|
+
return [];
|
|
58
|
+
}
|
|
59
|
+
case 'spec.add':
|
|
60
|
+
return [
|
|
61
|
+
...(op.payload.name.trim() === '' ? [{ code: 'GATE-STR-007', message: 'specification name cannot be empty', at: '.payload.name' }] : []),
|
|
62
|
+
...versionsProblem(op.payload.ifcVersions),
|
|
63
|
+
];
|
|
64
|
+
case 'spec.set':
|
|
65
|
+
return op.payload.field === 'name' && (op.payload.value ?? '').trim() === ''
|
|
66
|
+
? [{ code: 'GATE-STR-007', message: 'specification name cannot be empty', at: '.payload.value' }]
|
|
67
|
+
: [];
|
|
68
|
+
case 'spec.setIfcVersions':
|
|
69
|
+
return versionsProblem(op.payload.versions);
|
|
70
|
+
case 'spec.patch':
|
|
71
|
+
if (op.payload.set.ifcVersions?.length === 0)
|
|
72
|
+
return [{ code: 'GATE-STR-007', message: 'ifcVersions cannot be empty', at: '.payload.set.ifcVersions' }];
|
|
73
|
+
return op.payload.set.ifcVersions ? versionsProblem(op.payload.set.ifcVersions) : [];
|
|
74
|
+
case 'meta.custom.declarePset':
|
|
75
|
+
return isReservedPsetName(op.payload.decl.name)
|
|
76
|
+
? [{ code: 'GATE-CUST-002', message: `custom property sets cannot use a reserved prefix (${op.payload.decl.name}); use a project prefix such as "Project_"`, at: '.payload.decl.name' }]
|
|
77
|
+
: [];
|
|
78
|
+
default:
|
|
79
|
+
return [];
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// An absolute URI without whitespace (xs:anyURI as IDS tools use it: a scheme, then the rest).
|
|
83
|
+
const ABSOLUTE_URI = /^[A-Za-z][A-Za-z0-9+.-]*:\S+$/;
|
|
84
|
+
/** Facet-level structural rules on the facet as it is AFTER the op. */
|
|
85
|
+
export function checkFacetStructure(facet, requirement) {
|
|
86
|
+
const out = [];
|
|
87
|
+
if (facet.type === 'partOf' && !facet.entity) {
|
|
88
|
+
out.push({ code: 'GATE-STR-004', message: 'a partOf facet needs its related entity (IDS 1.0)', at: '.payload' });
|
|
89
|
+
}
|
|
90
|
+
if (facet.type === 'property' && facet.dataType && facet.dataType.type !== 'simpleValue') {
|
|
91
|
+
out.push({ code: 'GATE-STR-005', message: 'a property dataType must be a single value', at: '.payload' });
|
|
92
|
+
}
|
|
93
|
+
if (facet.type === 'entity' && requirement && requirement.optionality !== 'required') {
|
|
94
|
+
out.push({ code: 'GATE-STR-008', message: 'an entity requirement has no cardinality in IDS 1.0; it can only be required', at: '.payload' });
|
|
95
|
+
}
|
|
96
|
+
const uri = 'uri' in facet ? facet.uri : undefined;
|
|
97
|
+
if (uri !== undefined && !requirement) {
|
|
98
|
+
out.push({ code: 'GATE-STR-009', message: 'IDS 1.0 allows a uri only on requirement facets, not in the applicability', at: '.payload' });
|
|
99
|
+
}
|
|
100
|
+
if (uri !== undefined && !ABSOLUTE_URI.test(uri)) {
|
|
101
|
+
out.push({ code: 'GATE-VAL-009', message: `uri "${uri}" is not an absolute URI`, at: '.payload' });
|
|
102
|
+
}
|
|
103
|
+
return out;
|
|
104
|
+
}
|
|
105
|
+
const DEPENDENTS = {
|
|
106
|
+
'entity.name': ['entity.predefinedType'],
|
|
107
|
+
'partOf.entity.name': ['partOf.entity.predefinedType'],
|
|
108
|
+
'property.propertySet': ['property.baseName', 'property.dataType', 'property.value'],
|
|
109
|
+
'property.baseName': ['property.dataType', 'property.value'],
|
|
110
|
+
};
|
|
111
|
+
function draftPath(field) {
|
|
112
|
+
return `.payload.facet.${field.slice(field.indexOf('.') + 1)}`;
|
|
113
|
+
}
|
|
114
|
+
function allFacetsOf(doc, specId) {
|
|
115
|
+
const i = locateSpec(doc, specId);
|
|
116
|
+
if (i === undefined)
|
|
117
|
+
return [];
|
|
118
|
+
const spec = doc.ids.specifications[i];
|
|
119
|
+
const nodes = doc.nodes.specs[i];
|
|
120
|
+
const facets = [
|
|
121
|
+
...spec.applicability.facets.map((f, j) => [nodes.applicability[j].id, f]),
|
|
122
|
+
...spec.requirements.map((r) => [r.id, r.facet]),
|
|
123
|
+
];
|
|
124
|
+
return facets.map(([facetId, facet]) => ({ facetId, fields: presentFields(facet), at: () => '' }));
|
|
125
|
+
}
|
|
126
|
+
export function groundingTargets(op, after, beforeSpecOf) {
|
|
127
|
+
switch (op.kind) {
|
|
128
|
+
case 'facet.add':
|
|
129
|
+
case 'facet.replace': {
|
|
130
|
+
const loc = locateFacet(after, op.payload.facetId);
|
|
131
|
+
return loc ? [{ facetId: op.payload.facetId, fields: presentFields(facetAt(after, loc)), at: draftPath }] : [];
|
|
132
|
+
}
|
|
133
|
+
case 'facet.restore':
|
|
134
|
+
return [{ facetId: op.payload.nodes.id, fields: presentFields(op.payload.facet), at: () => '.payload.facet' }];
|
|
135
|
+
case 'facet.move': {
|
|
136
|
+
const loc = locateFacet(after, op.payload.facetId);
|
|
137
|
+
if (!loc || beforeSpecOf(op.payload.facetId) === loc.specId)
|
|
138
|
+
return [];
|
|
139
|
+
return [{ facetId: op.payload.facetId, fields: presentFields(facetAt(after, loc)), at: () => '' }];
|
|
140
|
+
}
|
|
141
|
+
case 'facet.setField':
|
|
142
|
+
case 'value.set':
|
|
143
|
+
case 'value.addEnumValue':
|
|
144
|
+
case 'value.removeEnumValue': {
|
|
145
|
+
const { facetId, field } = op.payload;
|
|
146
|
+
return [{ facetId, fields: [field, ...(DEPENDENTS[field] ?? [])], at: (f) => (f === field ? '.payload.value' : '') }];
|
|
147
|
+
}
|
|
148
|
+
case 'spec.setIfcVersions':
|
|
149
|
+
case 'spec.restore':
|
|
150
|
+
return allFacetsOf(after, op.kind === 'spec.restore' ? op.payload.spec.id : op.payload.specId);
|
|
151
|
+
case 'spec.patch':
|
|
152
|
+
return op.payload.set.ifcVersions ? allFacetsOf(after, op.payload.specId) : [];
|
|
153
|
+
default:
|
|
154
|
+
return [];
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
/** Facets whose structure (not grounding) an op may have changed. */
|
|
158
|
+
export function structureTargets(op) {
|
|
159
|
+
switch (op.kind) {
|
|
160
|
+
case 'facet.add':
|
|
161
|
+
case 'facet.replace':
|
|
162
|
+
case 'facet.move':
|
|
163
|
+
case 'facet.setField':
|
|
164
|
+
case 'value.set':
|
|
165
|
+
case 'facet.patch':
|
|
166
|
+
case 'facet.setUri':
|
|
167
|
+
case 'requirement.setOptionality':
|
|
168
|
+
return [op.payload.facetId];
|
|
169
|
+
case 'facet.restore':
|
|
170
|
+
return [op.payload.nodes.id];
|
|
171
|
+
default:
|
|
172
|
+
return [];
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=structural.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structural.js","sourceRoot":"","sources":["../../src/gate/structural.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Grounding gate result shapes (§5, ADR-003). Gate output is DATA: it is
|
|
3
|
+
* returned verbatim to an agent and rendered by the UI, never thrown.
|
|
4
|
+
*/
|
|
5
|
+
import type { IFCVersion } from '@ifc-lite/ids';
|
|
6
|
+
import type { FacetFieldName } from '../document/fields.js';
|
|
7
|
+
import type { Uuid } from '../uuid.js';
|
|
8
|
+
export type GateCode = 'GATE-OP-001' | 'GATE-OP-002' | 'GATE-ENT-001' | 'GATE-PDT-001' | 'GATE-ATT-001' | 'GATE-PSET-001' | 'GATE-PROP-001' | 'GATE-ENUM-001' | 'GATE-DT-001' | 'GATE-CUST-001' | 'GATE-CUST-002' | 'GATE-CUST-003' | 'GATE-CUST-004' | 'GATE-SUP-001' | 'GATE-SUP-002' | 'GATE-SUP-003' | 'GATE-STR-001' | 'GATE-STR-002' | 'GATE-STR-003' | 'GATE-STR-004' | 'GATE-STR-005' | 'GATE-STR-006' | 'GATE-STR-007' | 'GATE-STR-008' | 'GATE-STR-009' | 'GATE-VAL-001' | 'GATE-VAL-002' | 'GATE-VAL-003' | 'GATE-VAL-004' | 'GATE-VAL-005' | 'GATE-VAL-006' | 'GATE-VAL-007' | 'GATE-VAL-008' | 'GATE-VAL-009' | 'GATE-BSDD-001';
|
|
9
|
+
/** A ranked "did you mean" suggestion. */
|
|
10
|
+
export interface GateCandidate {
|
|
11
|
+
value: string;
|
|
12
|
+
/** 0..1, higher is better. */
|
|
13
|
+
score: number;
|
|
14
|
+
/** Why it is suggested, e.g. "applicable to IfcWall" or "in Pset_DoorCommon". */
|
|
15
|
+
reason?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface GateIssue {
|
|
18
|
+
ok: false;
|
|
19
|
+
code: GateCode;
|
|
20
|
+
/** Where in the submitted batch: `ops[2].payload.facet.baseName`. */
|
|
21
|
+
path: string;
|
|
22
|
+
message: string;
|
|
23
|
+
candidates: GateCandidate[];
|
|
24
|
+
/** Index of the offending op in the submitted batch. */
|
|
25
|
+
opIndex: number;
|
|
26
|
+
opId?: Uuid;
|
|
27
|
+
/** The facet and field the issue is about, when there is one. */
|
|
28
|
+
facetId?: Uuid;
|
|
29
|
+
field?: FacetFieldName;
|
|
30
|
+
/** The offending literal, when there is one. */
|
|
31
|
+
value?: string;
|
|
32
|
+
/** IFC versions of the spec in which the literal does not resolve. */
|
|
33
|
+
versions?: IFCVersion[];
|
|
34
|
+
/**
|
|
35
|
+
* `warning`: reported but not blocking (e.g. a deprecated bSDD URI).
|
|
36
|
+
* Absent: the issue blocks the batch.
|
|
37
|
+
*/
|
|
38
|
+
severity?: 'warning';
|
|
39
|
+
}
|
|
40
|
+
export interface GateResult {
|
|
41
|
+
/** True when no blocking issue was found and the batch may be applied (warnings may remain). */
|
|
42
|
+
ok: boolean;
|
|
43
|
+
issues: GateIssue[];
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/gate/types.ts"],"names":[],"mappings":"AAIA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,MAAM,MAAM,QAAQ,GAEhB,aAAa,GACb,aAAa,GAEb,cAAc,GACd,cAAc,GACd,cAAc,GACd,eAAe,GACf,eAAe,GACf,eAAe,GACf,aAAa,GAEb,eAAe,GACf,eAAe,GACf,eAAe,GACf,eAAe,GAEf,cAAc,GACd,cAAc,GACd,cAAc,GAEd,cAAc,GACd,cAAc,GACd,cAAc,GACd,cAAc,GACd,cAAc,GACd,cAAc,GACd,cAAc,GACd,cAAc,GACd,cAAc,GAEd,cAAc,GACd,cAAc,GACd,cAAc,GACd,cAAc,GACd,cAAc,GACd,cAAc,GACd,cAAc,GACd,cAAc,GACd,cAAc,GAEd,eAAe,CAAC;AAEpB,0CAA0C;AAC1C,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,8BAA8B;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,iFAAiF;IACjF,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,KAAK,CAAC;IACV,IAAI,EAAE,QAAQ,CAAC;IACf,qEAAqE;IACrE,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,wDAAwD;IACxD,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,iEAAiE;IACjE,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,gDAAgD;IAChD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sEAAsE;IACtE,QAAQ,CAAC,EAAE,UAAU,EAAE,CAAC;IACxB;;;OAGG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,gGAAgG;IAChG,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,SAAS,EAAE,CAAC;CACrB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/gate/types.ts"],"names":[],"mappings":"AAAA;;+DAE+D"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Value well-formedness (GATE-VAL-00x). Runs on the normalised
|
|
3
|
+
* `IDSConstraint`, so drafts and raw constraints get the same checks, and
|
|
4
|
+
* recurses into the conjunctive `and` siblings (which the IDS audit does
|
|
5
|
+
* not lint).
|
|
6
|
+
*
|
|
7
|
+
* Patterns go through the same XSD → JS translator and ReDoS guard the
|
|
8
|
+
* validator uses, so a pattern the gate accepts is one the checker can run.
|
|
9
|
+
*/
|
|
10
|
+
import type { IDSConstraint } from '@ifc-lite/ids';
|
|
11
|
+
import type { GateCode } from './types.js';
|
|
12
|
+
export interface ValueProblem {
|
|
13
|
+
code: GateCode;
|
|
14
|
+
message: string;
|
|
15
|
+
}
|
|
16
|
+
export declare function checkPattern(pattern: string): ValueProblem[];
|
|
17
|
+
/** Every well-formedness problem of `c` (including its `and` siblings). */
|
|
18
|
+
export declare function checkConstraint(c: IDSConstraint, base?: string): ValueProblem[];
|
|
19
|
+
//# sourceMappingURL=values.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"values.d.ts","sourceRoot":"","sources":["../../src/gate/values.ts"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAuB,aAAa,EAAE,MAAM,eAAe,CAAC;AAGxE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,QAAQ,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAsBD,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,EAAE,CAe5D;AAmDD,2EAA2E;AAC3E,wBAAgB,eAAe,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,YAAY,EAAE,CAkB/E"}
|
|
@@ -0,0 +1,124 @@
|
|
|
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 { translateXsdRegex } from '@ifc-lite/ids';
|
|
5
|
+
import { assertGuardedRegexPattern, UnsafeRegexPatternError } from '@ifc-lite/regex-guard';
|
|
6
|
+
const NUMERIC_BASES = new Set(['xs:double', 'xs:decimal', 'xs:float', 'xs:integer']);
|
|
7
|
+
const XSD_DECIMAL = /^[+-]?(\d+(\.\d*)?|\.\d+)$/;
|
|
8
|
+
const XSD_DOUBLE = /^([+-]?(\d+(\.\d*)?|\.\d+)([eE][+-]?\d+)?|[+-]?INF|NaN)$/;
|
|
9
|
+
const XSD_INTEGER = /^[+-]?\d+$/;
|
|
10
|
+
function numericLiteralOk(base, value) {
|
|
11
|
+
const v = value.trim();
|
|
12
|
+
if (base === 'xs:integer')
|
|
13
|
+
return XSD_INTEGER.test(v);
|
|
14
|
+
if (base === 'xs:decimal')
|
|
15
|
+
return XSD_DECIMAL.test(v);
|
|
16
|
+
return XSD_DOUBLE.test(v);
|
|
17
|
+
}
|
|
18
|
+
/** Lexical check of one literal against a restriction base. */
|
|
19
|
+
function literalOk(base, value) {
|
|
20
|
+
if (!base)
|
|
21
|
+
return true;
|
|
22
|
+
if (NUMERIC_BASES.has(base))
|
|
23
|
+
return numericLiteralOk(base, value);
|
|
24
|
+
if (base === 'xs:boolean')
|
|
25
|
+
return ['true', 'false', '1', '0'].includes(value.trim());
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
export function checkPattern(pattern) {
|
|
29
|
+
if (pattern === '')
|
|
30
|
+
return [{ code: 'GATE-VAL-003', message: 'pattern is empty' }];
|
|
31
|
+
try {
|
|
32
|
+
assertGuardedRegexPattern(pattern);
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
const reason = err instanceof UnsafeRegexPatternError ? err.reason : String(err);
|
|
36
|
+
return [{ code: 'GATE-VAL-004', message: `pattern "${pattern}" is rejected by the ReDoS guard: ${reason}` }];
|
|
37
|
+
}
|
|
38
|
+
const translated = translateXsdRegex(pattern);
|
|
39
|
+
try {
|
|
40
|
+
new RegExp(`^(?:${translated.pattern})$`, 'u');
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
return [{ code: 'GATE-VAL-003', message: `pattern "${pattern}" does not compile: ${err instanceof Error ? err.message : String(err)}` }];
|
|
44
|
+
}
|
|
45
|
+
return [];
|
|
46
|
+
}
|
|
47
|
+
function lower(b) {
|
|
48
|
+
if (b.minExclusive !== undefined)
|
|
49
|
+
return { v: b.minExclusive, exclusive: true };
|
|
50
|
+
if (b.minInclusive !== undefined)
|
|
51
|
+
return { v: b.minInclusive, exclusive: false };
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
function upper(b) {
|
|
55
|
+
if (b.maxExclusive !== undefined)
|
|
56
|
+
return { v: b.maxExclusive, exclusive: true };
|
|
57
|
+
if (b.maxInclusive !== undefined)
|
|
58
|
+
return { v: b.maxInclusive, exclusive: false };
|
|
59
|
+
return undefined;
|
|
60
|
+
}
|
|
61
|
+
function checkBounds(b) {
|
|
62
|
+
const out = [];
|
|
63
|
+
const keys = ['minInclusive', 'maxInclusive', 'minExclusive', 'maxExclusive', 'length', 'minLength', 'maxLength', 'totalDigits', 'fractionDigits'];
|
|
64
|
+
for (const k of keys) {
|
|
65
|
+
const v = b[k];
|
|
66
|
+
if (v !== undefined && !Number.isFinite(v))
|
|
67
|
+
out.push({ code: 'GATE-VAL-001', message: `${k} must be a finite number` });
|
|
68
|
+
}
|
|
69
|
+
if (b.minInclusive !== undefined && b.minExclusive !== undefined) {
|
|
70
|
+
out.push({ code: 'GATE-VAL-002', message: 'minInclusive and minExclusive cannot both be set' });
|
|
71
|
+
}
|
|
72
|
+
if (b.maxInclusive !== undefined && b.maxExclusive !== undefined) {
|
|
73
|
+
out.push({ code: 'GATE-VAL-002', message: 'maxInclusive and maxExclusive cannot both be set' });
|
|
74
|
+
}
|
|
75
|
+
const lo = lower(b);
|
|
76
|
+
const hi = upper(b);
|
|
77
|
+
if (lo && hi && (lo.v > hi.v || (lo.v === hi.v && (lo.exclusive || hi.exclusive)))) {
|
|
78
|
+
out.push({ code: 'GATE-VAL-002', message: `lower bound ${lo.v} is not below upper bound ${hi.v}; no value can match` });
|
|
79
|
+
}
|
|
80
|
+
for (const k of ['length', 'minLength', 'maxLength', 'fractionDigits']) {
|
|
81
|
+
const v = b[k];
|
|
82
|
+
if (v !== undefined && (!Number.isInteger(v) || v < 0))
|
|
83
|
+
out.push({ code: 'GATE-VAL-005', message: `${k} must be a non-negative integer` });
|
|
84
|
+
}
|
|
85
|
+
if (b.totalDigits !== undefined && (!Number.isInteger(b.totalDigits) || b.totalDigits < 1)) {
|
|
86
|
+
out.push({ code: 'GATE-VAL-005', message: 'totalDigits must be a positive integer' });
|
|
87
|
+
}
|
|
88
|
+
if (b.minLength !== undefined && b.maxLength !== undefined && b.minLength > b.maxLength) {
|
|
89
|
+
out.push({ code: 'GATE-VAL-005', message: `minLength ${b.minLength} exceeds maxLength ${b.maxLength}` });
|
|
90
|
+
}
|
|
91
|
+
if (b.totalDigits !== undefined && b.fractionDigits !== undefined && b.fractionDigits > b.totalDigits) {
|
|
92
|
+
out.push({ code: 'GATE-VAL-005', message: `fractionDigits ${b.fractionDigits} exceeds totalDigits ${b.totalDigits}` });
|
|
93
|
+
}
|
|
94
|
+
if (b.unparseableFacets?.length) {
|
|
95
|
+
out.push({ code: 'GATE-VAL-006', message: `unparseable facets: ${b.unparseableFacets.map((f) => `${f.facet}="${f.rawValue}"`).join(', ')}` });
|
|
96
|
+
}
|
|
97
|
+
return out;
|
|
98
|
+
}
|
|
99
|
+
/** Every well-formedness problem of `c` (including its `and` siblings). */
|
|
100
|
+
export function checkConstraint(c, base) {
|
|
101
|
+
switch (c.type) {
|
|
102
|
+
case 'simpleValue':
|
|
103
|
+
return [];
|
|
104
|
+
case 'pattern':
|
|
105
|
+
return [...checkPattern(c.pattern), ...siblings(c.and, c.base ?? base)];
|
|
106
|
+
case 'enumeration': {
|
|
107
|
+
const out = [];
|
|
108
|
+
if (c.values.length === 0)
|
|
109
|
+
out.push({ code: 'GATE-VAL-001', message: 'enumeration has no values' });
|
|
110
|
+
const b = c.base ?? base;
|
|
111
|
+
for (const v of c.values) {
|
|
112
|
+
if (!literalOk(b, v))
|
|
113
|
+
out.push({ code: 'GATE-VAL-006', message: `"${v}" is not a valid ${b} literal` });
|
|
114
|
+
}
|
|
115
|
+
return [...out, ...siblings(c.and, b)];
|
|
116
|
+
}
|
|
117
|
+
case 'bounds':
|
|
118
|
+
return [...checkBounds(c), ...siblings(c.and, c.base ?? base)];
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
function siblings(and, base) {
|
|
122
|
+
return (and ?? []).flatMap((s) => checkConstraint(s, base));
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=values.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"values.js","sourceRoot":"","sources":["../../src/gate/values.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The one entry point through which a headless caller (an MCP client, an
|
|
3
|
+
* SDK script, a Flow node) changes an IDS document: untrusted ops are
|
|
4
|
+
* validated against the op JSON Schema (`validateOp`) and checked by the
|
|
5
|
+
* grounding gate (`checkOps`) as a batch; only a batch that passes is
|
|
6
|
+
* applied. A refused batch returns the gate's issues as data, each with
|
|
7
|
+
* its path, message and ranked candidates, so the caller can correct the
|
|
8
|
+
* names and retry. ADR-002/003: nothing else writes a document.
|
|
9
|
+
*/
|
|
10
|
+
import type { StudioDocument } from '../document/types.js';
|
|
11
|
+
import type { GateContext } from '../gate/context.js';
|
|
12
|
+
import type { GateIssue } from '../gate/types.js';
|
|
13
|
+
import type { PrimitiveOp } from '../ops/types.js';
|
|
14
|
+
import type { Uuid } from '../uuid.js';
|
|
15
|
+
export type GatedApplyResult = {
|
|
16
|
+
ok: true;
|
|
17
|
+
doc: StudioDocument;
|
|
18
|
+
/** The primitive ops applied (compound ops expanded). */
|
|
19
|
+
applied: PrimitiveOp[];
|
|
20
|
+
/** Ops that undo the batch, in order. */
|
|
21
|
+
inverses: PrimitiveOp[];
|
|
22
|
+
/** Node ids created, changed, moved or removed. */
|
|
23
|
+
touched: Uuid[];
|
|
24
|
+
} | {
|
|
25
|
+
ok: false;
|
|
26
|
+
/** The input document, unchanged. */
|
|
27
|
+
doc: StudioDocument;
|
|
28
|
+
issues: GateIssue[];
|
|
29
|
+
};
|
|
30
|
+
/** Validate, gate and apply `ops` (untrusted) to `doc`. Never applies part of a batch. */
|
|
31
|
+
export declare function applyOpsGated(doc: StudioDocument, ops: unknown, ctx: GateContext): GatedApplyResult;
|
|
32
|
+
//# sourceMappingURL=apply-gated.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply-gated.d.ts","sourceRoot":"","sources":["../../src/headless/apply-gated.ts"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,KAAK,EAAE,WAAW,EAAY,MAAM,iBAAiB,CAAC;AAE7D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,MAAM,MAAM,gBAAgB,GACxB;IACE,EAAE,EAAE,IAAI,CAAC;IACT,GAAG,EAAE,cAAc,CAAC;IACpB,yDAAyD;IACzD,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,yCAAyC;IACzC,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,mDAAmD;IACnD,OAAO,EAAE,IAAI,EAAE,CAAC;CACjB,GACD;IACE,EAAE,EAAE,KAAK,CAAC;IACV,qCAAqC;IACrC,GAAG,EAAE,cAAc,CAAC;IACpB,MAAM,EAAE,SAAS,EAAE,CAAC;CACrB,CAAC;AAEN,0FAA0F;AAC1F,wBAAgB,aAAa,CAAC,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,WAAW,GAAG,gBAAgB,CAenG"}
|
|
@@ -0,0 +1,26 @@
|
|
|
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 { checkOps } from '../gate/check.js';
|
|
5
|
+
import { validateOp } from '../ops/schema.js';
|
|
6
|
+
import { apply } from '../reducer/apply.js';
|
|
7
|
+
/** Validate, gate and apply `ops` (untrusted) to `doc`. Never applies part of a batch. */
|
|
8
|
+
export function applyOpsGated(doc, ops, ctx) {
|
|
9
|
+
if (!Array.isArray(ops)) {
|
|
10
|
+
const issue = { ok: false, code: 'GATE-OP-001', path: 'ops', message: 'ops must be an array of operations', candidates: [], opIndex: -1 };
|
|
11
|
+
return { ok: false, doc, issues: [issue] };
|
|
12
|
+
}
|
|
13
|
+
const gate = checkOps(ops, doc, ctx);
|
|
14
|
+
if (!gate.ok)
|
|
15
|
+
return { ok: false, doc, issues: gate.issues };
|
|
16
|
+
// The gate validated every op; re-validating here yields the typed value.
|
|
17
|
+
const typed = ops.map((raw) => {
|
|
18
|
+
const v = validateOp(raw);
|
|
19
|
+
if (!v.ok)
|
|
20
|
+
throw new Error('an op that passed the gate failed validation');
|
|
21
|
+
return v.op;
|
|
22
|
+
});
|
|
23
|
+
const result = apply(doc, typed);
|
|
24
|
+
return { ok: true, doc: result.doc, applied: result.expanded, inverses: result.inverses, touched: [...result.touched] };
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=apply-gated.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply-gated.js","sourceRoot":"","sources":["../../src/headless/apply-gated.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAa/D,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAG5C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAqB5C,0FAA0F;AAC1F,MAAM,UAAU,aAAa,CAAC,GAAmB,EAAE,GAAY,EAAE,GAAgB;IAC/E,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,KAAK,GAAc,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,oCAAoC,EAAE,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC;QACrJ,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;IAC7C,CAAC;IACD,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IACrC,IAAI,CAAC,IAAI,CAAC,EAAE;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;IAC7D,0EAA0E;IAC1E,MAAM,KAAK,GAAe,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACxC,MAAM,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;QAC1B,IAAI,CAAC,CAAC,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAC3E,OAAO,CAAC,CAAC,EAAE,CAAC;IACd,CAAC,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACjC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;AAC1H,CAAC"}
|