@metaobjectsdev/metadata 0.9.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/attr-schema-validate.d.ts +1 -1
- package/dist/attr-schema-validate.d.ts.map +1 -1
- package/dist/attr-schema-validate.js +84 -7
- package/dist/attr-schema-validate.js.map +1 -1
- package/dist/constants.d.ts +208 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +419 -0
- package/dist/constants.js.map +1 -0
- package/dist/constraint-merge.d.ts +18 -0
- package/dist/constraint-merge.d.ts.map +1 -0
- package/dist/constraint-merge.js +0 -0
- package/dist/constraint-merge.js.map +1 -0
- package/dist/constraint-validate.d.ts +6 -0
- package/dist/constraint-validate.d.ts.map +1 -0
- package/dist/constraint-validate.js +274 -0
- package/dist/constraint-validate.js.map +1 -0
- package/dist/core/attr/attr-constants.d.ts +13 -3
- package/dist/core/attr/attr-constants.d.ts.map +1 -1
- package/dist/core/attr/attr-constants.js +11 -2
- package/dist/core/attr/attr-constants.js.map +1 -1
- package/dist/core/attr/attr-definition.embedded.d.ts +3 -0
- package/dist/core/attr/attr-definition.embedded.d.ts.map +1 -0
- package/dist/core/attr/attr-definition.embedded.js +60 -0
- package/dist/core/attr/attr-definition.embedded.js.map +1 -0
- package/dist/core/documentation/doc-constants.d.ts +3 -2
- package/dist/core/documentation/doc-constants.d.ts.map +1 -1
- package/dist/core/documentation/doc-constants.js +3 -1
- package/dist/core/documentation/doc-constants.js.map +1 -1
- package/dist/core/documentation/doc-provider.d.ts.map +1 -1
- package/dist/core/documentation/doc-provider.js +6 -2
- package/dist/core/documentation/doc-provider.js.map +1 -1
- package/dist/core/documentation/doc-schema.d.ts +1 -1
- package/dist/core/documentation/doc-schema.d.ts.map +1 -1
- package/dist/core/documentation/doc-schema.js +13 -5
- package/dist/core/documentation/doc-schema.js.map +1 -1
- package/dist/core/documentation/documentation-definition.embedded.d.ts +3 -0
- package/dist/core/documentation/documentation-definition.embedded.d.ts.map +1 -0
- package/dist/core/documentation/documentation-definition.embedded.js +79 -0
- package/dist/core/documentation/documentation-definition.embedded.js.map +1 -0
- package/dist/core/field/field-constants.d.ts +7 -4
- package/dist/core/field/field-constants.d.ts.map +1 -1
- package/dist/core/field/field-constants.js +7 -7
- package/dist/core/field/field-constants.js.map +1 -1
- package/dist/core/field/field-definition.embedded.d.ts +3 -0
- package/dist/core/field/field-definition.embedded.d.ts.map +1 -0
- package/dist/core/field/field-definition.embedded.js +236 -0
- package/dist/core/field/field-definition.embedded.js.map +1 -0
- package/dist/core/field/field-schema.d.ts +0 -16
- package/dist/core/field/field-schema.d.ts.map +1 -1
- package/dist/core/field/field-schema.js +10 -158
- package/dist/core/field/field-schema.js.map +1 -1
- package/dist/core/field/meta-field.d.ts.map +1 -1
- package/dist/core/field/meta-field.js +7 -5
- package/dist/core/field/meta-field.js.map +1 -1
- package/dist/core/file-meta-data-loader.d.ts +18 -0
- package/dist/core/file-meta-data-loader.d.ts.map +1 -0
- package/dist/core/file-meta-data-loader.js +81 -0
- package/dist/core/file-meta-data-loader.js.map +1 -0
- package/dist/core/file-source.d.ts +12 -0
- package/dist/core/file-source.d.ts.map +1 -0
- package/dist/core/file-source.js +46 -0
- package/dist/core/file-source.js.map +1 -0
- package/dist/core/identity/identity-definition.embedded.d.ts +3 -0
- package/dist/core/identity/identity-definition.embedded.d.ts.map +1 -0
- package/dist/core/identity/identity-definition.embedded.js +91 -0
- package/dist/core/identity/identity-definition.embedded.js.map +1 -0
- package/dist/core/identity/identity-schema.d.ts.map +1 -1
- package/dist/core/identity/identity-schema.js +3 -2
- package/dist/core/identity/identity-schema.js.map +1 -1
- package/dist/core/identity/validate-identity-passthrough.d.ts +42 -0
- package/dist/core/identity/validate-identity-passthrough.d.ts.map +1 -0
- package/dist/core/identity/validate-identity-passthrough.js +158 -0
- package/dist/core/identity/validate-identity-passthrough.js.map +1 -0
- package/dist/core/object/object-constants.d.ts +2 -1
- package/dist/core/object/object-constants.d.ts.map +1 -1
- package/dist/core/object/object-constants.js +3 -0
- package/dist/core/object/object-constants.js.map +1 -1
- package/dist/core/object/object-definition.embedded.d.ts +3 -0
- package/dist/core/object/object-definition.embedded.d.ts.map +1 -0
- package/dist/core/object/object-definition.embedded.js +110 -0
- package/dist/core/object/object-definition.embedded.js.map +1 -0
- package/dist/core/object/validate-discriminator.d.ts.map +1 -1
- package/dist/core/object/validate-discriminator.js +1 -3
- package/dist/core/object/validate-discriminator.js.map +1 -1
- package/dist/core/query/query-constants.d.ts.map +1 -1
- package/dist/core/query/query-constants.js +5 -3
- package/dist/core/query/query-constants.js.map +1 -1
- package/dist/core/relationship/derive-m2m-fields.d.ts +26 -0
- package/dist/core/relationship/derive-m2m-fields.d.ts.map +1 -0
- package/dist/core/relationship/derive-m2m-fields.js +102 -0
- package/dist/core/relationship/derive-m2m-fields.js.map +1 -0
- package/dist/core/relationship/meta-relationship.d.ts +6 -4
- package/dist/core/relationship/meta-relationship.d.ts.map +1 -1
- package/dist/core/relationship/meta-relationship.js +12 -8
- package/dist/core/relationship/meta-relationship.js.map +1 -1
- package/dist/core/relationship/relationship-constants.d.ts +6 -2
- package/dist/core/relationship/relationship-constants.d.ts.map +1 -1
- package/dist/core/relationship/relationship-constants.js +6 -2
- package/dist/core/relationship/relationship-constants.js.map +1 -1
- package/dist/core/relationship/relationship-definition.embedded.d.ts +3 -0
- package/dist/core/relationship/relationship-definition.embedded.d.ts.map +1 -0
- package/dist/core/relationship/relationship-definition.embedded.js +310 -0
- package/dist/core/relationship/relationship-definition.embedded.js.map +1 -0
- package/dist/core/relationship/relationship-schema.d.ts.map +1 -1
- package/dist/core/relationship/relationship-schema.js +13 -7
- package/dist/core/relationship/relationship-schema.js.map +1 -1
- package/dist/core/validator/validator-definition.embedded.d.ts +3 -0
- package/dist/core/validator/validator-definition.embedded.d.ts.map +1 -0
- package/dist/core/validator/validator-definition.embedded.js +134 -0
- package/dist/core/validator/validator-definition.embedded.js.map +1 -0
- package/dist/core/yaml-desugar.d.ts.map +1 -1
- package/dist/core/yaml-desugar.js +88 -10
- package/dist/core/yaml-desugar.js.map +1 -1
- package/dist/core-attr-schemas.d.ts +22 -0
- package/dist/core-attr-schemas.d.ts.map +1 -0
- package/dist/core-attr-schemas.js +324 -0
- package/dist/core-attr-schemas.js.map +1 -0
- package/dist/core-types.d.ts +5 -2
- package/dist/core-types.d.ts.map +1 -1
- package/dist/core-types.js +261 -115
- package/dist/core-types.js.map +1 -1
- package/dist/db/db-attr-schemas.d.ts +8 -0
- package/dist/db/db-attr-schemas.d.ts.map +1 -0
- package/dist/db/db-attr-schemas.js +26 -0
- package/dist/db/db-attr-schemas.js.map +1 -0
- package/dist/db/db-provider.d.ts +3 -0
- package/dist/db/db-provider.d.ts.map +1 -0
- package/dist/db/db-provider.js +28 -0
- package/dist/db/db-provider.js.map +1 -0
- package/dist/errors.d.ts +1 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +78 -0
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +17 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +26 -1
- package/dist/index.js.map +1 -1
- package/dist/library/embedded-library.generated.d.ts +2 -0
- package/dist/library/embedded-library.generated.d.ts.map +1 -0
- package/dist/library/embedded-library.generated.js +11 -0
- package/dist/library/embedded-library.generated.js.map +1 -0
- package/dist/library/library-sources.d.ts +12 -0
- package/dist/library/library-sources.d.ts.map +1 -0
- package/dist/library/library-sources.js +88 -0
- package/dist/library/library-sources.js.map +1 -0
- package/dist/loader/meta-data-loader.d.ts +10 -2
- package/dist/loader/meta-data-loader.d.ts.map +1 -1
- package/dist/loader/meta-data-loader.js +47 -6
- package/dist/loader/meta-data-loader.js.map +1 -1
- package/dist/loader/shortcuts.d.ts +2 -5
- package/dist/loader/shortcuts.d.ts.map +1 -1
- package/dist/loader/shortcuts.js.map +1 -1
- package/dist/loader/validation-passes.d.ts +3 -0
- package/dist/loader/validation-passes.d.ts.map +1 -1
- package/dist/loader/validation-passes.js +513 -33
- package/dist/loader/validation-passes.js.map +1 -1
- package/dist/meta/find-reference.d.ts +22 -0
- package/dist/meta/find-reference.d.ts.map +1 -0
- package/dist/meta/find-reference.js +29 -0
- package/dist/meta/find-reference.js.map +1 -0
- package/dist/meta/meta-attr.d.ts +8 -0
- package/dist/meta/meta-attr.d.ts.map +1 -0
- package/dist/meta/meta-attr.js +17 -0
- package/dist/meta/meta-attr.js.map +1 -0
- package/dist/meta/meta-data.d.ts +107 -0
- package/dist/meta/meta-data.d.ts.map +1 -0
- package/dist/meta/meta-data.js +302 -0
- package/dist/meta/meta-data.js.map +1 -0
- package/dist/meta/meta-field.d.ts +48 -0
- package/dist/meta/meta-field.d.ts.map +1 -0
- package/dist/meta/meta-field.js +94 -0
- package/dist/meta/meta-field.js.map +1 -0
- package/dist/meta/meta-identity.d.ts +71 -0
- package/dist/meta/meta-identity.d.ts.map +1 -0
- package/dist/meta/meta-identity.js +129 -0
- package/dist/meta/meta-identity.js.map +1 -0
- package/dist/meta/meta-layout.d.ts +23 -0
- package/dist/meta/meta-layout.d.ts.map +1 -0
- package/dist/meta/meta-layout.js +45 -0
- package/dist/meta/meta-layout.js.map +1 -0
- package/dist/meta/meta-object.d.ts +40 -0
- package/dist/meta/meta-object.d.ts.map +1 -0
- package/dist/meta/meta-object.js +81 -0
- package/dist/meta/meta-object.js.map +1 -0
- package/dist/meta/meta-origin.d.ts +32 -0
- package/dist/meta/meta-origin.d.ts.map +1 -0
- package/dist/meta/meta-origin.js +55 -0
- package/dist/meta/meta-origin.js.map +1 -0
- package/dist/meta/meta-relationship.d.ts +11 -0
- package/dist/meta/meta-relationship.d.ts.map +1 -0
- package/dist/meta/meta-relationship.js +27 -0
- package/dist/meta/meta-relationship.js.map +1 -0
- package/dist/meta/meta-root.d.ts +12 -0
- package/dist/meta/meta-root.d.ts.map +1 -0
- package/dist/meta/meta-root.js +24 -0
- package/dist/meta/meta-root.js.map +1 -0
- package/dist/meta/meta-source.d.ts +18 -0
- package/dist/meta/meta-source.d.ts.map +1 -0
- package/dist/meta/meta-source.js +31 -0
- package/dist/meta/meta-source.js.map +1 -0
- package/dist/meta/meta-validator.d.ts +29 -0
- package/dist/meta/meta-validator.d.ts.map +1 -0
- package/dist/meta/meta-validator.js +49 -0
- package/dist/meta/meta-validator.js.map +1 -0
- package/dist/meta/meta-view.d.ts +4 -0
- package/dist/meta/meta-view.d.ts.map +1 -0
- package/dist/meta/meta-view.js +8 -0
- package/dist/meta/meta-view.js.map +1 -0
- package/dist/metamodel-docs/index.d.ts +19 -0
- package/dist/metamodel-docs/index.d.ts.map +1 -0
- package/dist/metamodel-docs/index.js +37 -0
- package/dist/metamodel-docs/index.js.map +1 -0
- package/dist/metamodel-docs/provenance.d.ts +42 -0
- package/dist/metamodel-docs/provenance.d.ts.map +1 -0
- package/dist/metamodel-docs/provenance.js +148 -0
- package/dist/metamodel-docs/provenance.js.map +1 -0
- package/dist/metamodel-docs/provider-definitions.d.ts +8 -0
- package/dist/metamodel-docs/provider-definitions.d.ts.map +1 -0
- package/dist/metamodel-docs/provider-definitions.js +48 -0
- package/dist/metamodel-docs/provider-definitions.js.map +1 -0
- package/dist/metamodel-docs/render.d.ts +12 -0
- package/dist/metamodel-docs/render.d.ts.map +1 -0
- package/dist/metamodel-docs/render.js +252 -0
- package/dist/metamodel-docs/render.js.map +1 -0
- package/dist/naming-refs.d.ts +41 -0
- package/dist/naming-refs.d.ts.map +1 -0
- package/dist/naming-refs.js +144 -0
- package/dist/naming-refs.js.map +1 -0
- package/dist/naming.d.ts.map +1 -1
- package/dist/naming.js +10 -2
- package/dist/naming.js.map +1 -1
- package/dist/parser-core.d.ts.map +1 -1
- package/dist/parser-core.js +74 -8
- package/dist/parser-core.js.map +1 -1
- package/dist/persistence/db/db-attr-schemas.d.ts +8 -0
- package/dist/persistence/db/db-attr-schemas.d.ts.map +1 -0
- package/dist/persistence/db/db-attr-schemas.js +28 -0
- package/dist/persistence/db/db-attr-schemas.js.map +1 -0
- package/dist/persistence/db/db-definition.embedded.d.ts +3 -0
- package/dist/persistence/db/db-definition.embedded.d.ts.map +1 -0
- package/dist/persistence/db/db-definition.embedded.js +170 -0
- package/dist/persistence/db/db-definition.embedded.js.map +1 -0
- package/dist/persistence/db/db-provider.d.ts.map +1 -1
- package/dist/persistence/db/db-provider.js +13 -18
- package/dist/persistence/db/db-provider.js.map +1 -1
- package/dist/persistence/db/db-schema.d.ts +14 -0
- package/dist/persistence/db/db-schema.d.ts.map +1 -1
- package/dist/persistence/db/db-schema.js +27 -0
- package/dist/persistence/db/db-schema.js.map +1 -1
- package/dist/persistence/origin/origin-definition.embedded.d.ts +3 -0
- package/dist/persistence/origin/origin-definition.embedded.d.ts.map +1 -0
- package/dist/persistence/origin/origin-definition.embedded.js +88 -0
- package/dist/persistence/origin/origin-definition.embedded.js.map +1 -0
- package/dist/persistence/origin/origin-schema.d.ts.map +1 -1
- package/dist/persistence/origin/origin-schema.js +7 -3
- package/dist/persistence/origin/origin-schema.js.map +1 -1
- package/dist/persistence/source/source-definition.embedded.d.ts +3 -0
- package/dist/persistence/source/source-definition.embedded.d.ts.map +1 -0
- package/dist/persistence/source/source-definition.embedded.js +17 -0
- package/dist/persistence/source/source-definition.embedded.js.map +1 -0
- package/dist/persistence/source/validate-source-parameter-ref.d.ts.map +1 -1
- package/dist/persistence/source/validate-source-parameter-ref.js +7 -1
- package/dist/persistence/source/validate-source-parameter-ref.js.map +1 -1
- package/dist/persistence/source/validate-source-roles.d.ts.map +1 -1
- package/dist/persistence/source/validate-source-roles.js +16 -1
- package/dist/persistence/source/validate-source-roles.js.map +1 -1
- package/dist/presentation/layout/layout-definition.embedded.d.ts +3 -0
- package/dist/presentation/layout/layout-definition.embedded.d.ts.map +1 -0
- package/dist/presentation/layout/layout-definition.embedded.js +16 -0
- package/dist/presentation/layout/layout-definition.embedded.js.map +1 -0
- package/dist/presentation/layout/layout-schema.d.ts.map +1 -1
- package/dist/presentation/layout/layout-schema.js +3 -2
- package/dist/presentation/layout/layout-schema.js.map +1 -1
- package/dist/presentation/ui/ui-definition.embedded.d.ts +3 -0
- package/dist/presentation/ui/ui-definition.embedded.d.ts.map +1 -0
- package/dist/presentation/ui/ui-definition.embedded.js +114 -0
- package/dist/presentation/ui/ui-definition.embedded.js.map +1 -0
- package/dist/presentation/ui/ui-provider.d.ts +3 -0
- package/dist/presentation/ui/ui-provider.d.ts.map +1 -0
- package/dist/presentation/ui/ui-provider.js +21 -0
- package/dist/presentation/ui/ui-provider.js.map +1 -0
- package/dist/presentation/ui/ui-schema.d.ts +10 -0
- package/dist/presentation/ui/ui-schema.d.ts.map +1 -0
- package/dist/presentation/ui/ui-schema.js +41 -0
- package/dist/presentation/ui/ui-schema.js.map +1 -0
- package/dist/presentation/view/view-definition.embedded.d.ts +3 -0
- package/dist/presentation/view/view-definition.embedded.d.ts.map +1 -0
- package/dist/presentation/view/view-definition.embedded.js +76 -0
- package/dist/presentation/view/view-definition.embedded.js.map +1 -0
- package/dist/provider-data.d.ts +169 -0
- package/dist/provider-data.d.ts.map +1 -0
- package/dist/provider-data.js +269 -0
- package/dist/provider-data.js.map +1 -0
- package/dist/provider.d.ts +3 -1
- package/dist/provider.d.ts.map +1 -1
- package/dist/provider.js +15 -1
- package/dist/provider.js.map +1 -1
- package/dist/registry-coverage.d.ts +99 -0
- package/dist/registry-coverage.d.ts.map +1 -0
- package/dist/registry-coverage.js +294 -0
- package/dist/registry-coverage.js.map +1 -0
- package/dist/registry-manifest-exclusions.d.ts +62 -0
- package/dist/registry-manifest-exclusions.d.ts.map +1 -0
- package/dist/registry-manifest-exclusions.js +163 -0
- package/dist/registry-manifest-exclusions.js.map +1 -0
- package/dist/registry-manifest.d.ts +117 -0
- package/dist/registry-manifest.d.ts.map +1 -0
- package/dist/registry-manifest.js +242 -0
- package/dist/registry-manifest.js.map +1 -0
- package/dist/registry.d.ts +60 -2
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +37 -1
- package/dist/registry.js.map +1 -1
- package/dist/shared/structural.d.ts +7 -0
- package/dist/shared/structural.d.ts.map +1 -1
- package/dist/shared/structural.js +7 -0
- package/dist/shared/structural.js.map +1 -1
- package/dist/subtype-rules.d.ts.map +1 -1
- package/dist/subtype-rules.js +97 -13
- package/dist/subtype-rules.js.map +1 -1
- package/dist/super-resolve.d.ts +49 -2
- package/dist/super-resolve.d.ts.map +1 -1
- package/dist/super-resolve.js +128 -43
- package/dist/super-resolve.js.map +1 -1
- package/dist/template/meta-template.d.ts +3 -2
- package/dist/template/meta-template.d.ts.map +1 -1
- package/dist/template/meta-template.js +3 -2
- package/dist/template/meta-template.js.map +1 -1
- package/dist/template/prompt-definition.embedded.d.ts +3 -0
- package/dist/template/prompt-definition.embedded.d.ts.map +1 -0
- package/dist/template/prompt-definition.embedded.js +368 -0
- package/dist/template/prompt-definition.embedded.js.map +1 -0
- package/dist/template/prompt-provider.d.ts +3 -0
- package/dist/template/prompt-provider.d.ts.map +1 -0
- package/dist/template/prompt-provider.js +25 -0
- package/dist/template/prompt-provider.js.map +1 -0
- package/dist/template/prompt-schema.d.ts +20 -0
- package/dist/template/prompt-schema.d.ts.map +1 -0
- package/dist/template/prompt-schema.js +70 -0
- package/dist/template/prompt-schema.js.map +1 -0
- package/dist/template/template-constants.d.ts +2 -0
- package/dist/template/template-constants.d.ts.map +1 -1
- package/dist/template/template-constants.js +7 -0
- package/dist/template/template-constants.js.map +1 -1
- package/dist/template/template-definition.embedded.d.ts +3 -0
- package/dist/template/template-definition.embedded.d.ts.map +1 -0
- package/dist/template/template-definition.embedded.js +30 -0
- package/dist/template/template-definition.embedded.js.map +1 -0
- package/dist/template/template-schema.d.ts.map +1 -1
- package/dist/template/template-schema.js +12 -4
- package/dist/template/template-schema.js.map +1 -1
- package/package.json +33 -22
- package/src/attr-schema-validate.ts +96 -4
- package/src/constraint-merge.ts +0 -0
- package/src/constraint-validate.ts +363 -0
- package/src/core/attr/attr-constants.ts +15 -3
- package/src/core/attr/attr-definition.embedded.ts +67 -0
- package/src/core/documentation/doc-constants.ts +3 -1
- package/src/core/documentation/doc-provider.ts +6 -2
- package/src/core/documentation/documentation-definition.embedded.ts +86 -0
- package/src/core/field/field-constants.ts +8 -7
- package/src/core/field/field-definition.embedded.ts +243 -0
- package/src/core/field/meta-field.ts +6 -7
- package/src/core/identity/identity-definition.embedded.ts +98 -0
- package/src/core/identity/validate-identity-passthrough.ts +194 -0
- package/src/core/object/object-constants.ts +3 -0
- package/src/core/object/object-definition.embedded.ts +117 -0
- package/src/core/object/validate-discriminator.ts +0 -4
- package/src/core/query/query-constants.ts +5 -3
- package/src/core/relationship/derive-m2m-fields.ts +145 -0
- package/src/core/relationship/meta-relationship.ts +15 -9
- package/src/core/relationship/relationship-constants.ts +6 -2
- package/src/core/relationship/relationship-definition.embedded.ts +317 -0
- package/src/core/validator/validator-definition.embedded.ts +141 -0
- package/src/core/yaml-desugar.ts +96 -7
- package/src/core-types.ts +289 -150
- package/src/errors.ts +78 -0
- package/src/index.ts +47 -2
- package/src/library/embedded-library.generated.ts +10 -0
- package/src/library/library-sources.ts +97 -0
- package/src/loader/meta-data-loader.ts +66 -7
- package/src/loader/shortcuts.ts +2 -2
- package/src/loader/validation-passes.ts +679 -33
- package/src/metamodel-docs/index.ts +41 -0
- package/src/metamodel-docs/provenance.ts +187 -0
- package/src/metamodel-docs/provider-definitions.ts +50 -0
- package/src/metamodel-docs/render.ts +309 -0
- package/src/naming-refs.ts +162 -0
- package/src/naming.ts +10 -2
- package/src/parser-core.ts +86 -8
- package/src/persistence/db/db-definition.embedded.ts +177 -0
- package/src/persistence/db/db-provider.ts +13 -18
- package/src/persistence/origin/origin-definition.embedded.ts +95 -0
- package/src/persistence/source/source-definition.embedded.ts +24 -0
- package/src/persistence/source/validate-source-parameter-ref.ts +7 -1
- package/src/persistence/source/validate-source-roles.ts +22 -1
- package/src/presentation/layout/layout-definition.embedded.ts +23 -0
- package/src/presentation/ui/ui-definition.embedded.ts +121 -0
- package/src/presentation/ui/ui-provider.ts +25 -0
- package/src/presentation/view/view-definition.embedded.ts +83 -0
- package/src/provider-data.ts +446 -0
- package/src/provider.ts +18 -0
- package/src/registry-coverage.ts +430 -0
- package/src/registry-manifest-exclusions.ts +176 -0
- package/src/registry-manifest.ts +334 -0
- package/src/registry.ts +90 -3
- package/src/shared/structural.ts +8 -0
- package/src/subtype-rules.ts +135 -18
- package/src/super-resolve.ts +153 -43
- package/src/template/meta-template.ts +3 -2
- package/src/template/prompt-definition.embedded.ts +375 -0
- package/src/template/prompt-provider.ts +29 -0
- package/src/template/template-constants.ts +8 -0
- package/src/template/template-definition.embedded.ts +37 -0
- package/src/core/documentation/doc-schema.ts +0 -64
- package/src/core/field/field-schema.ts +0 -228
- package/src/core/identity/identity-schema.ts +0 -80
- package/src/core/object/object-schema.ts +0 -35
- package/src/core/relationship/relationship-schema.ts +0 -67
- package/src/core/validator/validator-schema.ts +0 -50
- package/src/persistence/db/db-schema.ts +0 -50
- package/src/persistence/origin/origin-schema.ts +0 -80
- package/src/persistence/source/source-schema.ts +0 -129
- package/src/presentation/layout/layout-schema.ts +0 -62
- package/src/presentation/view/view-schema.ts +0 -21
- package/src/template/template-schema.ts +0 -211
|
@@ -5,9 +5,9 @@
|
|
|
5
5
|
// carries the LLM-overlay attrs. References (@payloadRef, @textRef) are plain
|
|
6
6
|
// strings here — resolution against a real payload / text source is render-time
|
|
7
7
|
// `verify` scope (Plan #3), not load-time validation.
|
|
8
|
-
import { ATTR_SUBTYPE_STRING, ATTR_SUBTYPE_INT,
|
|
8
|
+
import { ATTR_SUBTYPE_STRING, ATTR_SUBTYPE_INT, } from "../core/attr/attr-constants.js";
|
|
9
9
|
import { SUBTYPE_BASE } from "../shared/base-types.js";
|
|
10
|
-
import { TEMPLATE_SUBTYPE_PROMPT, TEMPLATE_SUBTYPE_OUTPUT, TEMPLATE_SUBTYPE_TOOLCALL, TEMPLATE_ATTR_PAYLOAD_REF, TEMPLATE_ATTR_TEXT_REF, TEMPLATE_ATTR_FORMAT, TEMPLATE_ATTR_MAX_CHARS, TEMPLATE_ATTR_OWNER, TEMPLATE_ATTR_SINCE, TEMPLATE_ATTR_REQUIRED_TAGS, TEMPLATE_ATTR_MAX_TOKENS, TEMPLATE_ATTR_REQUIRED_SLOTS, TEMPLATE_ATTR_MODEL, TEMPLATE_ATTR_TOOL_NAME, TEMPLATE_FORMATS, TEMPLATE_ATTR_PROMPT_STYLE, PROMPT_STYLE_DEFAULT, PROMPT_STYLES, TEMPLATE_ATTR_KIND, TEMPLATE_KINDS, TEMPLATE_KIND_DEFAULT, TEMPLATE_ATTR_SUBJECT_REF, TEMPLATE_ATTR_HTML_BODY_REF, TEMPLATE_ATTR_TEXT_BODY_REF, } from "./template-constants.js";
|
|
10
|
+
import { TEMPLATE_SUBTYPE_PROMPT, TEMPLATE_SUBTYPE_OUTPUT, TEMPLATE_SUBTYPE_TOOLCALL, TEMPLATE_ATTR_PAYLOAD_REF, TEMPLATE_ATTR_TEXT_REF, TEMPLATE_ATTR_FORMAT, TEMPLATE_ATTR_MAX_CHARS, TEMPLATE_ATTR_OWNER, TEMPLATE_ATTR_SINCE, TEMPLATE_ATTR_REQUIRED_TAGS, TEMPLATE_ATTR_RESPONSE_REF, TEMPLATE_ATTR_MAX_TOKENS, TEMPLATE_ATTR_REQUIRED_SLOTS, TEMPLATE_ATTR_MODEL, TEMPLATE_ATTR_TOOL_NAME, TEMPLATE_FORMATS, TEMPLATE_ATTR_PROMPT_STYLE, PROMPT_STYLE_DEFAULT, PROMPT_STYLES, TEMPLATE_ATTR_KIND, TEMPLATE_KINDS, TEMPLATE_KIND_DEFAULT, TEMPLATE_ATTR_SUBJECT_REF, TEMPLATE_ATTR_HTML_BODY_REF, TEMPLATE_ATTR_TEXT_BODY_REF, } from "./template-constants.js";
|
|
11
11
|
// Generic attrs shared by template.prompt and template.output.
|
|
12
12
|
const genericAttrs = [
|
|
13
13
|
{
|
|
@@ -55,7 +55,8 @@ const genericAttrs = [
|
|
|
55
55
|
},
|
|
56
56
|
{
|
|
57
57
|
name: TEMPLATE_ATTR_REQUIRED_TAGS,
|
|
58
|
-
valueType:
|
|
58
|
+
valueType: ATTR_SUBTYPE_STRING,
|
|
59
|
+
isArray: true,
|
|
59
60
|
required: false,
|
|
60
61
|
description: "Output tags the rendered text must contain (drives the verify output-tag check).",
|
|
61
62
|
},
|
|
@@ -114,7 +115,8 @@ const promptOverlayAttrs = [
|
|
|
114
115
|
},
|
|
115
116
|
{
|
|
116
117
|
name: TEMPLATE_ATTR_REQUIRED_SLOTS,
|
|
117
|
-
valueType:
|
|
118
|
+
valueType: ATTR_SUBTYPE_STRING,
|
|
119
|
+
isArray: true,
|
|
118
120
|
required: false,
|
|
119
121
|
description: "Slots that must resolve at render time (drives the verify check).",
|
|
120
122
|
},
|
|
@@ -124,6 +126,12 @@ const promptOverlayAttrs = [
|
|
|
124
126
|
required: false,
|
|
125
127
|
description: "Target model id (LLM-specific).",
|
|
126
128
|
},
|
|
129
|
+
{
|
|
130
|
+
name: TEMPLATE_ATTR_RESPONSE_REF,
|
|
131
|
+
valueType: ATTR_SUBTYPE_STRING,
|
|
132
|
+
required: false,
|
|
133
|
+
description: "Optional ref to the response value-object this prompt expects (peer of @payloadRef; drives typed LLM-call trace derivation).",
|
|
134
|
+
},
|
|
127
135
|
];
|
|
128
136
|
// Toolcall attrs (template.toolcall only — does NOT inherit genericAttrs).
|
|
129
137
|
// Per ADR-0011: vendor-agnostic in core; vendor wire details (retry semantics,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template-schema.js","sourceRoot":"","sources":["../../src/template/template-schema.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,EAAE;AACF,kFAAkF;AAClF,4EAA4E;AAC5E,8EAA8E;AAC9E,gFAAgF;AAChF,sDAAsD;AAGtD,OAAO,EACL,mBAAmB,EACnB,gBAAgB,
|
|
1
|
+
{"version":3,"file":"template-schema.js","sourceRoot":"","sources":["../../src/template/template-schema.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@metaobjectsdev/metadata",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.10.0",
|
|
4
4
|
"description": "Metamodel loader, types, and constants for the MetaObjects standard.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -17,7 +17,12 @@
|
|
|
17
17
|
"default": "./dist/core/index.js"
|
|
18
18
|
}
|
|
19
19
|
},
|
|
20
|
-
"files": [
|
|
20
|
+
"files": [
|
|
21
|
+
"dist",
|
|
22
|
+
"src",
|
|
23
|
+
"README.md",
|
|
24
|
+
"LICENSE"
|
|
25
|
+
],
|
|
21
26
|
"scripts": {
|
|
22
27
|
"build": "tsc -p .",
|
|
23
28
|
"typecheck": "tsc -p tsconfig.typecheck.json",
|
|
@@ -27,24 +32,30 @@
|
|
|
27
32
|
"author": "Doug Mealing <doug@dougmealing.com>",
|
|
28
33
|
"homepage": "https://metaobjects.dev",
|
|
29
34
|
"bugs": {
|
|
30
|
-
|
|
31
|
-
},
|
|
32
|
-
"repository": {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
},
|
|
37
|
-
"keywords": [
|
|
38
|
-
"
|
|
39
|
-
"
|
|
40
|
-
|
|
41
|
-
"
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
"
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
"
|
|
48
|
-
|
|
49
|
-
}
|
|
35
|
+
"url": "https://github.com/metaobjectsdev/metaobjects/issues"
|
|
36
|
+
},
|
|
37
|
+
"repository": {
|
|
38
|
+
"type": "git",
|
|
39
|
+
"url": "https://github.com/metaobjectsdev/metaobjects.git",
|
|
40
|
+
"directory": "server/typescript/packages/metadata"
|
|
41
|
+
},
|
|
42
|
+
"keywords": [
|
|
43
|
+
"metaobjects",
|
|
44
|
+
"metadata",
|
|
45
|
+
"schema",
|
|
46
|
+
"loader",
|
|
47
|
+
"typescript"
|
|
48
|
+
],
|
|
49
|
+
"publishConfig": {
|
|
50
|
+
"access": "public"
|
|
51
|
+
},
|
|
52
|
+
"dependencies": {
|
|
53
|
+
"yaml": "^2.9.0"
|
|
54
|
+
},
|
|
55
|
+
"devDependencies": {
|
|
56
|
+
"@metaobjectsdev/conformance": "0.1.0",
|
|
57
|
+
"@stryker-mutator/core": "^9.6.1",
|
|
58
|
+
"bun-types": "latest",
|
|
59
|
+
"typescript": "^5.6.0"
|
|
60
|
+
}
|
|
50
61
|
}
|
|
@@ -12,7 +12,21 @@
|
|
|
12
12
|
// MetaAttr instance's own validateValue.
|
|
13
13
|
// 3. allowedValues honored — declared attrs with a non-empty
|
|
14
14
|
// allowedValues set must hold a member value.
|
|
15
|
-
// 4. Undeclared attrs —
|
|
15
|
+
// 4. Undeclared attrs — under strict load (ADR-0023) an own
|
|
16
|
+
// @-attr that matches NO per-type attr
|
|
17
|
+
// schema AND NO commonAttr is an
|
|
18
|
+
// ERR_UNKNOWN_ATTR. In lax mode (strict
|
|
19
|
+
// false) it stays the legacy open policy:
|
|
20
|
+
// NOT an error, NOT a warning. Own-only,
|
|
21
|
+
// so an inherited/overlaid declared attr
|
|
22
|
+
// (validated on its declaring node) is fine.
|
|
23
|
+
// 5. Structural-child placement — FR-033: under strict load a STRUCTURAL
|
|
24
|
+
// (Check 0b) child (field/identity/source/… — not an
|
|
25
|
+
// attr) not admitted by the parent's
|
|
26
|
+
// registered childRules is ERR_CHILD_NOT_
|
|
27
|
+
// ALLOWED (the structural analogue of #4). A
|
|
28
|
+
// no-op under today's wildcard childRules —
|
|
29
|
+
// the rail strict per-subtype rules use in S1.
|
|
16
30
|
//
|
|
17
31
|
// `default` values are NOT auto-applied — A3 is pure validation, not mutation.
|
|
18
32
|
//
|
|
@@ -30,7 +44,9 @@
|
|
|
30
44
|
import type { MetaData } from "./shared/meta-data.js";
|
|
31
45
|
import { ParseError } from "./errors.js";
|
|
32
46
|
import type { AttrSchema, TypeRegistry } from "./registry.js";
|
|
47
|
+
import { childRuleMatches } from "./registry.js";
|
|
33
48
|
import { TYPE_FIELD } from "./shared/base-types.js";
|
|
49
|
+
import { ATTR_SUBTYPE_PROPERTIES } from "./core/attr/attr-constants.js";
|
|
34
50
|
import {
|
|
35
51
|
FIELD_SUBTYPE_ENUM,
|
|
36
52
|
FIELD_ATTR_VALUES,
|
|
@@ -57,13 +73,18 @@ export interface AttrSchemaValidationResult {
|
|
|
57
73
|
export function validateAttrSchema(
|
|
58
74
|
root: MetaData,
|
|
59
75
|
registry: TypeRegistry,
|
|
76
|
+
// ADR-0023 — strict load closes the open-attr policy: an own @-attr matching
|
|
77
|
+
// no per-type schema and no commonAttr → ERR_UNKNOWN_ATTR. Defaults false so
|
|
78
|
+
// existing lax callers keep the legacy open policy; the library's own loader
|
|
79
|
+
// (and the conformance runner) load strict.
|
|
80
|
+
strict = false,
|
|
60
81
|
): AttrSchemaValidationResult {
|
|
61
82
|
const errors: ParseError[] = [];
|
|
62
83
|
// Tracks (type.subType) pairs for which ERR_PROVIDER_ATTR_CONFLICT has already
|
|
63
84
|
// been emitted. The conflict is a registry-state condition, not a per-node
|
|
64
85
|
// condition — emit it once per (type, subType), not once per node instance.
|
|
65
86
|
const reportedConflicts = new Set<string>();
|
|
66
|
-
walk(root, registry, errors, reportedConflicts);
|
|
87
|
+
walk(root, registry, errors, reportedConflicts, strict);
|
|
67
88
|
return { errors, warnings: [] };
|
|
68
89
|
}
|
|
69
90
|
|
|
@@ -72,10 +93,11 @@ function walk(
|
|
|
72
93
|
registry: TypeRegistry,
|
|
73
94
|
errors: ParseError[],
|
|
74
95
|
reportedConflicts: Set<string>,
|
|
96
|
+
strict: boolean,
|
|
75
97
|
): void {
|
|
76
|
-
validateNode(node, registry, errors, reportedConflicts);
|
|
98
|
+
validateNode(node, registry, errors, reportedConflicts, strict);
|
|
77
99
|
for (const child of node.ownChildren()) {
|
|
78
|
-
walk(child, registry, errors, reportedConflicts);
|
|
100
|
+
walk(child, registry, errors, reportedConflicts, strict);
|
|
79
101
|
}
|
|
80
102
|
}
|
|
81
103
|
|
|
@@ -90,6 +112,7 @@ function validateNode(
|
|
|
90
112
|
registry: TypeRegistry,
|
|
91
113
|
errors: ParseError[],
|
|
92
114
|
reportedConflicts: Set<string>,
|
|
115
|
+
strict: boolean,
|
|
93
116
|
): void {
|
|
94
117
|
// Build the effective schema in a single pass: per-type attrs win on name
|
|
95
118
|
// collision; common attrs fill in for unclaimed names. Surface common-vs-per-type
|
|
@@ -118,6 +141,75 @@ function validateNode(
|
|
|
118
141
|
byName.set(ca.name, ca);
|
|
119
142
|
}
|
|
120
143
|
|
|
144
|
+
// --- Check 0 (ADR-0023): strict-load undeclared-attr rejection ---
|
|
145
|
+
//
|
|
146
|
+
// Runs BEFORE the byName.size early-return: a node type with no per-type
|
|
147
|
+
// schema and no common attrs (byName empty) must still reject an authored
|
|
148
|
+
// @-attr under strict. Own-attrs only — an inherited/overlaid declared attr
|
|
149
|
+
// was validated on its declaring node and never appears in ownMetaAttrs().
|
|
150
|
+
// An own attr matching neither a per-type schema entry nor a commonAttr is
|
|
151
|
+
// a made-up attribute → ERR_UNKNOWN_ATTR (closing the open policy). In lax
|
|
152
|
+
// mode this stays a no-op (legacy open-attr behavior).
|
|
153
|
+
if (strict) {
|
|
154
|
+
for (const inst of node.ownMetaAttrs()) {
|
|
155
|
+
// attr.properties is a first-class, registered, canonical attr subtype
|
|
156
|
+
// whose designed purpose is an arbitrary-named structural property bag
|
|
157
|
+
// (its NAME is intentionally not declared by any per-type schema). It is
|
|
158
|
+
// sanctioned vocabulary, not a made-up attribute, so strict-attr exempts
|
|
159
|
+
// a materialized properties-attr from ERR_UNKNOWN_ATTR. (A typo'd plain
|
|
160
|
+
// @-attr still fails — only the `properties` subtype is exempt.)
|
|
161
|
+
if (inst.subType === ATTR_SUBTYPE_PROPERTIES) continue;
|
|
162
|
+
if (!byName.has(inst.name)) {
|
|
163
|
+
errors.push(
|
|
164
|
+
new ParseError(
|
|
165
|
+
`Unknown attribute '@${inst.name}' on ${nodeLabel(node)} — ` +
|
|
166
|
+
`not declared by any registered provider for ${typeKey}`,
|
|
167
|
+
{ code: "ERR_UNKNOWN_ATTR", source: node.source },
|
|
168
|
+
),
|
|
169
|
+
);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// --- Check 0b (FR-033): strict-load structural-child placement ---
|
|
175
|
+
//
|
|
176
|
+
// The structural analogue of Check 0. A STRUCTURAL child (field/identity/
|
|
177
|
+
// source/validator/… — attrs never appear in ownChildren()) must be admitted
|
|
178
|
+
// by the parent's registered childRules under the same wildcard match
|
|
179
|
+
// semantics used everywhere (childType/childSubType/childName may be "*", and
|
|
180
|
+
// childSubType may be a list). A child the rules do not admit → ERR_CHILD_NOT_
|
|
181
|
+
// ALLOWED. A NO-OP today: every parent carries wildcard structural childRules
|
|
182
|
+
// (e.g. field.* / validator.*) that admit everything — the rail strict
|
|
183
|
+
// per-subtype rules will use in S1. Lax mode keeps the legacy open policy.
|
|
184
|
+
//
|
|
185
|
+
// An UNREGISTERED parent (no def) cannot be judged here (ERR_UNKNOWN_TYPE /
|
|
186
|
+
// ERR_UNKNOWN_SUBTYPE is reported elsewhere); skip so we never double-report.
|
|
187
|
+
if (strict) {
|
|
188
|
+
const parentDef = registry.find(node.type, node.subType);
|
|
189
|
+
if (parentDef !== undefined) {
|
|
190
|
+
const rules = parentDef.childRules;
|
|
191
|
+
for (const child of node.ownChildren()) {
|
|
192
|
+
const admitted = rules.some((r) =>
|
|
193
|
+
childRuleMatches(r, {
|
|
194
|
+
type: child.type,
|
|
195
|
+
subType: child.subType,
|
|
196
|
+
name: child.name,
|
|
197
|
+
}),
|
|
198
|
+
);
|
|
199
|
+
if (!admitted) {
|
|
200
|
+
errors.push(
|
|
201
|
+
new ParseError(
|
|
202
|
+
`Child ${nodeLabel(child)} is not allowed under ${nodeLabel(node)} — ` +
|
|
203
|
+
`no registered child rule for ${typeKey} admits ` +
|
|
204
|
+
`(type='${child.type}', subType='${child.subType}', name='${child.name}')`,
|
|
205
|
+
{ code: "ERR_CHILD_NOT_ALLOWED", source: node.source },
|
|
206
|
+
),
|
|
207
|
+
);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
121
213
|
if (byName.size === 0) return;
|
|
122
214
|
|
|
123
215
|
// --- Check 1: required attrs present ---
|
|
Binary file
|
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
// FR-033 — the metamodel contradiction validator (spec §3.1, the six checks).
|
|
2
|
+
//
|
|
3
|
+
// `validateConstraints(effective, registry)` runs the six contradiction checks over
|
|
4
|
+
// the merged constraint graph and returns one MetaModelError per contradiction
|
|
5
|
+
// (code ERR_INVALID_METAMODEL_CONSTRAINT). It is the cross-validation pass: the merge
|
|
6
|
+
// (constraint-merge.ts) is purely additive, so this pass is the ONLY place a bad
|
|
7
|
+
// provider set is rejected. Wired into composeRegistry's seal-time bootstrap so a
|
|
8
|
+
// contradictory library provider set fails fast (mirrors ADR-0023 strictness).
|
|
9
|
+
//
|
|
10
|
+
// The six checks (spec §3.1):
|
|
11
|
+
// 1. Dangling ref — a parents/children rule references an unregistered type.subType.
|
|
12
|
+
// 2. Unsatisfiable req. — a required child (min>=1) whose concrete type.subType is
|
|
13
|
+
// not admitted under that parent (after merge).
|
|
14
|
+
// 3. Bad cardinality — min>max (max non-null), max:0 with min>=1, or min<0.
|
|
15
|
+
// 4. Closed-set clash — child C claims parent P via `parents`, but P's OWN children
|
|
16
|
+
// is a CLOSED set (no `*` wildcard) that does not admit C.
|
|
17
|
+
// 5. Required-child cycle— following required (min>=1) child edges forms a cycle.
|
|
18
|
+
// 6. Conflicting attr — same attr name contributed twice (across providers or the
|
|
19
|
+
// extends chain) with a conflicting valueType/required/default.
|
|
20
|
+
|
|
21
|
+
import type {
|
|
22
|
+
AttrSchema,
|
|
23
|
+
ChildRule,
|
|
24
|
+
TypeRegistry,
|
|
25
|
+
TypeDefinition,
|
|
26
|
+
} from "./registry.js";
|
|
27
|
+
import { childRuleMatches } from "./registry.js";
|
|
28
|
+
import { CHILD_RULE_WILDCARD } from "./shared/structural.js";
|
|
29
|
+
import { SUBTYPE_BASE } from "./shared/base-types.js";
|
|
30
|
+
import { MetaModelError } from "./errors.js";
|
|
31
|
+
import type { EffectiveConstraints } from "./constraint-merge.js";
|
|
32
|
+
|
|
33
|
+
const CODE = "ERR_INVALID_METAMODEL_CONSTRAINT" as const;
|
|
34
|
+
|
|
35
|
+
/** Run the six contradiction checks; one MetaModelError per contradiction. */
|
|
36
|
+
export function validateConstraints(
|
|
37
|
+
effective: Map<string, EffectiveConstraints>,
|
|
38
|
+
registry: TypeRegistry,
|
|
39
|
+
): MetaModelError[] {
|
|
40
|
+
const errors: MetaModelError[] = [];
|
|
41
|
+
const registered = new Set(
|
|
42
|
+
registry.allTypes().map((id) => `${id.type}.${id.subType}`),
|
|
43
|
+
);
|
|
44
|
+
|
|
45
|
+
const sortedKeys = [...effective.keys()].sort();
|
|
46
|
+
|
|
47
|
+
for (const k of sortedKeys) {
|
|
48
|
+
const eff = effective.get(k)!;
|
|
49
|
+
|
|
50
|
+
// --- #1 dangling ref (children) + #3 bad cardinality.
|
|
51
|
+
for (const rule of eff.children) {
|
|
52
|
+
checkDangling(k, rule, registered, errors);
|
|
53
|
+
checkCardinality(k, rule, errors);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// --- #1 dangling ref (parents).
|
|
57
|
+
for (const parent of eff.parents) {
|
|
58
|
+
if (!registered.has(parent)) {
|
|
59
|
+
errors.push(
|
|
60
|
+
err(`dangling: type "${k}" claims parent "${parent}", which is not registered.`),
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// --- #2 unsatisfiable required child.
|
|
66
|
+
for (const rule of eff.children) {
|
|
67
|
+
checkUnsatisfiable(k, rule, registered, errors);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// --- #4 closed-set clash: a child's `parents` claim vs the parent's OWN children.
|
|
72
|
+
for (const id of registry.allTypes()) {
|
|
73
|
+
const childKey = `${id.type}.${id.subType}`;
|
|
74
|
+
const def = registry.find(id.type, id.subType);
|
|
75
|
+
for (const parent of def?.parents ?? []) {
|
|
76
|
+
checkClosedSetClash(childKey, id.type, id.subType, parent, registry, errors);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// --- #5 required-child cycle.
|
|
81
|
+
checkRequiredCycles(effective, sortedKeys, errors);
|
|
82
|
+
|
|
83
|
+
// --- #6 conflicting attr redefinition (across the extends chain + providers).
|
|
84
|
+
for (const id of registry.allTypes()) {
|
|
85
|
+
checkAttrConflicts(id.type, id.subType, registry, registered, errors);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
return errors;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function err(detail: string): MetaModelError {
|
|
92
|
+
return new MetaModelError(`Invalid metamodel constraint — ${detail}`, { code: CODE });
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/** #1 — a concrete (non-wildcard) child rule whose type.subType is unregistered. */
|
|
96
|
+
function checkDangling(
|
|
97
|
+
parentKey: string,
|
|
98
|
+
rule: ChildRule,
|
|
99
|
+
registered: ReadonlySet<string>,
|
|
100
|
+
errors: MetaModelError[],
|
|
101
|
+
): void {
|
|
102
|
+
if (rule.childType === CHILD_RULE_WILDCARD) return; // a wildcard names nothing
|
|
103
|
+
const subTypes = subTypesOf(rule);
|
|
104
|
+
for (const sub of subTypes) {
|
|
105
|
+
if (sub === CHILD_RULE_WILDCARD) continue; // wildcard subtype names nothing
|
|
106
|
+
const refKey = `${rule.childType}.${sub}`;
|
|
107
|
+
if (!registered.has(refKey)) {
|
|
108
|
+
errors.push(
|
|
109
|
+
err(
|
|
110
|
+
`dangling: child rule on "${parentKey}" references "${refKey}", which is not registered.`,
|
|
111
|
+
),
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/** #3 — min<0, min>max (max non-null), or max:0 with min>=1. */
|
|
118
|
+
function checkCardinality(
|
|
119
|
+
parentKey: string,
|
|
120
|
+
rule: ChildRule,
|
|
121
|
+
errors: MetaModelError[],
|
|
122
|
+
): void {
|
|
123
|
+
const min = rule.min ?? 0;
|
|
124
|
+
const max = rule.max ?? null;
|
|
125
|
+
const label = describeRule(rule);
|
|
126
|
+
if (min < 0) {
|
|
127
|
+
errors.push(err(`bad cardinality on "${parentKey}" (${label}): min ${min} < 0.`));
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
if (max !== null && max < min) {
|
|
131
|
+
errors.push(
|
|
132
|
+
err(`bad cardinality on "${parentKey}" (${label}): min ${min} > max ${max}.`),
|
|
133
|
+
);
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
if (max === 0 && min >= 1) {
|
|
137
|
+
errors.push(
|
|
138
|
+
err(`bad cardinality on "${parentKey}" (${label}): max 0 with min ${min} >= 1.`),
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* #2 — a required child rule (min>=1) naming concrete subtype(s) where NONE of the
|
|
145
|
+
* named type.subTypes is admitted under this parent (after merge). A required rule
|
|
146
|
+
* with a wildcard type is always satisfiable; a required rule naming a concrete
|
|
147
|
+
* subtype that is registered AND covered by an admitting rule (the rule itself, or
|
|
148
|
+
* another rule) is satisfiable. Unsatisfiable iff the required child cannot be placed.
|
|
149
|
+
*/
|
|
150
|
+
function checkUnsatisfiable(
|
|
151
|
+
parentKey: string,
|
|
152
|
+
rule: ChildRule,
|
|
153
|
+
registered: ReadonlySet<string>,
|
|
154
|
+
errors: MetaModelError[],
|
|
155
|
+
): void {
|
|
156
|
+
const min = rule.min ?? 0;
|
|
157
|
+
if (min < 1) return; // optional → nothing to satisfy
|
|
158
|
+
if (rule.childType === CHILD_RULE_WILDCARD) return; // any child satisfies it
|
|
159
|
+
|
|
160
|
+
// A required rule must name at least one concrete, REGISTERED subtype that some
|
|
161
|
+
// rule (incl. itself) admits. If none of its named subtypes is registered, the
|
|
162
|
+
// required child can never be instantiated → unsatisfiable.
|
|
163
|
+
const subTypes = subTypesOf(rule);
|
|
164
|
+
const concrete = subTypes.filter((s) => s !== CHILD_RULE_WILDCARD);
|
|
165
|
+
if (concrete.length === 0) return; // required of `type.*` — any registered subtype satisfies
|
|
166
|
+
|
|
167
|
+
const anyRegistered = concrete.some((s) => registered.has(`${rule.childType}.${s}`));
|
|
168
|
+
if (!anyRegistered) {
|
|
169
|
+
errors.push(
|
|
170
|
+
err(
|
|
171
|
+
`unsatisfiable required child on "${parentKey}" (${describeRule(rule)}): ` +
|
|
172
|
+
`min ${min} but no named subtype of "${rule.childType}" is registered.`,
|
|
173
|
+
),
|
|
174
|
+
);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* #4 — child C declares parent P via `parents`, but P's OWN children is a CLOSED set
|
|
180
|
+
* (no `*` wildcard rule) that does not admit C. An OPEN parent (any `*` rule) admits
|
|
181
|
+
* anything → no clash.
|
|
182
|
+
*/
|
|
183
|
+
function checkClosedSetClash(
|
|
184
|
+
childKey: string,
|
|
185
|
+
childType: string,
|
|
186
|
+
childSubType: string,
|
|
187
|
+
parentKey: string,
|
|
188
|
+
registry: TypeRegistry,
|
|
189
|
+
errors: MetaModelError[],
|
|
190
|
+
): void {
|
|
191
|
+
const parentDef = lookup(parentKey, registry);
|
|
192
|
+
if (parentDef === undefined) return; // dangling parent — reported by #1
|
|
193
|
+
|
|
194
|
+
const ownRules = parentDef.childRules;
|
|
195
|
+
const isOpen = ownRules.some((r) => isWildcardRule(r));
|
|
196
|
+
if (isOpen) return; // open parent admits anything
|
|
197
|
+
|
|
198
|
+
const admits = ownRules.some((r) =>
|
|
199
|
+
childRuleMatches(r, { type: childType, subType: childSubType, name: CHILD_RULE_WILDCARD }),
|
|
200
|
+
);
|
|
201
|
+
if (!admits) {
|
|
202
|
+
errors.push(
|
|
203
|
+
err(
|
|
204
|
+
`closed-set clash: child "${childKey}" claims parent "${parentKey}", but ` +
|
|
205
|
+
`"${parentKey}"'s children is a closed set (no wildcard) that does not admit it.`,
|
|
206
|
+
),
|
|
207
|
+
);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* #5 — required-child cycle: following required (min>=1) child edges forms a cycle.
|
|
213
|
+
* An edge A→B exists when A has a required rule naming a concrete subtype B. A cycle
|
|
214
|
+
* with no non-required escape can never bottom out (A requires B requires A).
|
|
215
|
+
*/
|
|
216
|
+
function checkRequiredCycles(
|
|
217
|
+
effective: Map<string, EffectiveConstraints>,
|
|
218
|
+
sortedKeys: string[],
|
|
219
|
+
errors: MetaModelError[],
|
|
220
|
+
): void {
|
|
221
|
+
// Build the required-edge adjacency: A → each concrete required child subtype.
|
|
222
|
+
const edges = new Map<string, string[]>();
|
|
223
|
+
for (const k of sortedKeys) {
|
|
224
|
+
const targets: string[] = [];
|
|
225
|
+
for (const rule of effective.get(k)!.children) {
|
|
226
|
+
if ((rule.min ?? 0) < 1) continue;
|
|
227
|
+
if (rule.childType === CHILD_RULE_WILDCARD) continue;
|
|
228
|
+
for (const sub of subTypesOf(rule)) {
|
|
229
|
+
if (sub === CHILD_RULE_WILDCARD) continue;
|
|
230
|
+
targets.push(`${rule.childType}.${sub}`);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
edges.set(k, targets);
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
// DFS for back-edges; report each distinct cycle once (keyed by its sorted node set).
|
|
237
|
+
const WHITE = 0,
|
|
238
|
+
GRAY = 1,
|
|
239
|
+
BLACK = 2;
|
|
240
|
+
const color = new Map<string, number>();
|
|
241
|
+
const reported = new Set<string>();
|
|
242
|
+
const stack: string[] = [];
|
|
243
|
+
|
|
244
|
+
const visit = (node: string): void => {
|
|
245
|
+
color.set(node, GRAY);
|
|
246
|
+
stack.push(node);
|
|
247
|
+
for (const next of edges.get(node) ?? []) {
|
|
248
|
+
if (!edges.has(next)) continue; // unregistered target — #1/#2 handles it
|
|
249
|
+
const c = color.get(next) ?? WHITE;
|
|
250
|
+
if (c === GRAY) {
|
|
251
|
+
// Back-edge → cycle. Extract the cycle slice from the stack.
|
|
252
|
+
const idx = stack.indexOf(next);
|
|
253
|
+
const cycle = stack.slice(idx);
|
|
254
|
+
const sig = [...cycle].sort().join(",");
|
|
255
|
+
if (!reported.has(sig)) {
|
|
256
|
+
reported.add(sig);
|
|
257
|
+
errors.push(
|
|
258
|
+
err(
|
|
259
|
+
`required-child cycle that cannot bottom out: ${cycle.concat(next).join(" -> ")}.`,
|
|
260
|
+
),
|
|
261
|
+
);
|
|
262
|
+
}
|
|
263
|
+
} else if (c === WHITE) {
|
|
264
|
+
visit(next);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
stack.pop();
|
|
268
|
+
color.set(node, BLACK);
|
|
269
|
+
};
|
|
270
|
+
|
|
271
|
+
for (const k of sortedKeys) {
|
|
272
|
+
if ((color.get(k) ?? WHITE) === WHITE) visit(k);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* #6 — the same attr name contributed twice (across providers, or down the extends
|
|
278
|
+
* chain) with a CONFLICTING valueType / required / default. Walks each type's own
|
|
279
|
+
* attrs + its derived super (`<type>.base`) chain and compares same-name pairs.
|
|
280
|
+
*/
|
|
281
|
+
function checkAttrConflicts(
|
|
282
|
+
type: string,
|
|
283
|
+
subType: string,
|
|
284
|
+
registry: TypeRegistry,
|
|
285
|
+
registered: ReadonlySet<string>,
|
|
286
|
+
errors: MetaModelError[],
|
|
287
|
+
): void {
|
|
288
|
+
// Collect (attr, source-key) along the own → super chain.
|
|
289
|
+
const seen = new Map<string, { attr: AttrSchema; from: string }>();
|
|
290
|
+
const reported = new Set<string>();
|
|
291
|
+
|
|
292
|
+
let curType: string | undefined = type;
|
|
293
|
+
let curSub: string | undefined = subType;
|
|
294
|
+
const guard = new Set<string>();
|
|
295
|
+
while (curType !== undefined && curSub !== undefined) {
|
|
296
|
+
const k = `${curType}.${curSub}`;
|
|
297
|
+
if (guard.has(k)) break;
|
|
298
|
+
guard.add(k);
|
|
299
|
+
const def = registry.find(curType, curSub);
|
|
300
|
+
if (def !== undefined) {
|
|
301
|
+
for (const attr of def.attributes) {
|
|
302
|
+
const prior = seen.get(attr.name);
|
|
303
|
+
if (prior === undefined) {
|
|
304
|
+
seen.set(attr.name, { attr, from: k });
|
|
305
|
+
} else if (attrsConflict(prior.attr, attr)) {
|
|
306
|
+
const sig = `${attr.name}|${prior.from}|${k}`;
|
|
307
|
+
if (!reported.has(sig)) {
|
|
308
|
+
reported.add(sig);
|
|
309
|
+
errors.push(
|
|
310
|
+
err(
|
|
311
|
+
`conflicting attr redefinition: attr "${attr.name}" is declared on ` +
|
|
312
|
+
`"${prior.from}" and "${k}" with a conflicting valueType/required/default.`,
|
|
313
|
+
),
|
|
314
|
+
);
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
// Advance up the derived super chain (`<type>.base`).
|
|
320
|
+
if (curSub === SUBTYPE_BASE) break;
|
|
321
|
+
const baseKey = `${curType}.${SUBTYPE_BASE}`;
|
|
322
|
+
if (!registered.has(baseKey)) break;
|
|
323
|
+
curSub = SUBTYPE_BASE;
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
/** Two same-name attrs conflict iff valueType, required, or default differ. */
|
|
328
|
+
function attrsConflict(a: AttrSchema, b: AttrSchema): boolean {
|
|
329
|
+
return (
|
|
330
|
+
a.valueType !== b.valueType ||
|
|
331
|
+
a.required !== b.required ||
|
|
332
|
+
!Object.is(a.default, b.default)
|
|
333
|
+
);
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
// --- helpers ---------------------------------------------------------------
|
|
337
|
+
|
|
338
|
+
function subTypesOf(rule: ChildRule): string[] {
|
|
339
|
+
const s = rule.childSubType;
|
|
340
|
+
return typeof s === "string" ? [s] : [...s];
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
function isWildcardRule(rule: ChildRule): boolean {
|
|
344
|
+
// An OPEN hook is a TYPE-wildcard rule (`*.*` / `*` of any subType) — it admits a
|
|
345
|
+
// child of any type, so a new type can land under this parent. A `field.*` rule is
|
|
346
|
+
// NOT open in this sense: it admits any field SUBTYPE but no other type, so a
|
|
347
|
+
// `policy` child still clashes. Per spec §3.1 #4, the open escape is a `*` (type)
|
|
348
|
+
// wildcard rule.
|
|
349
|
+
return rule.childType === CHILD_RULE_WILDCARD;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
function describeRule(rule: ChildRule): string {
|
|
353
|
+
const sub = Array.isArray(rule.childSubType)
|
|
354
|
+
? `[${rule.childSubType.join(",")}]`
|
|
355
|
+
: rule.childSubType;
|
|
356
|
+
return `${rule.childType}.${sub} ${rule.childName}`;
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
function lookup(key: string, registry: TypeRegistry): TypeDefinition | undefined {
|
|
360
|
+
const dot = key.indexOf(".");
|
|
361
|
+
if (dot < 0) return undefined;
|
|
362
|
+
return registry.find(key.slice(0, dot), key.slice(dot + 1));
|
|
363
|
+
}
|