@metaobjectsdev/metadata 0.9.0-rc.1 → 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
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// FR-033 S3 — metamodel doc-gen public surface.
|
|
2
|
+
//
|
|
3
|
+
// Documents the METAMODEL ITSELF (the type/subtype/attr vocabulary of the strict
|
|
4
|
+
// registry) as tiered, LLM-readable markdown — distinct from `meta docs --model`
|
|
5
|
+
// (which documents a user's entities). The renderer is a pure, deterministic
|
|
6
|
+
// function over the composed registry + a provenance lens; file I/O lives in the
|
|
7
|
+
// CLI.
|
|
8
|
+
|
|
9
|
+
import type { TypeRegistry } from "../registry.js";
|
|
10
|
+
import { coreProviders } from "../core-types.js";
|
|
11
|
+
import { buildMetamodelProvenance, type MetamodelProvenance } from "./provenance.js";
|
|
12
|
+
import { renderMetamodelDocs } from "./render.js";
|
|
13
|
+
|
|
14
|
+
export { buildMetamodelProvenance, renderMetamodelDocs };
|
|
15
|
+
export type { MetamodelProvenance } from "./provenance.js";
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Build the provider-id → description map from the core provider bundle. The
|
|
19
|
+
* descriptions live on the provider objects (not the embedded definitions), so
|
|
20
|
+
* the provenance builder takes them as input; this assembles the default map
|
|
21
|
+
* for the standard `coreProviders` composition.
|
|
22
|
+
*/
|
|
23
|
+
export function coreProviderDescriptions(): Map<string, string> {
|
|
24
|
+
const map = new Map<string, string>();
|
|
25
|
+
for (const p of coreProviders) {
|
|
26
|
+
if (p.description !== undefined) map.set(p.id, p.description);
|
|
27
|
+
}
|
|
28
|
+
return map;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* One-shot convenience: build the provenance lens (with the core provider
|
|
33
|
+
* descriptions) and render the full metamodel doc tree from a composed registry.
|
|
34
|
+
* The CLI uses this; tests can call the lower-level pieces directly.
|
|
35
|
+
*/
|
|
36
|
+
export function renderCoreMetamodelDocs(registry: TypeRegistry): Map<string, string> {
|
|
37
|
+
const provenance: MetamodelProvenance = buildMetamodelProvenance(registry, {
|
|
38
|
+
providerDescriptions: coreProviderDescriptions(),
|
|
39
|
+
});
|
|
40
|
+
return renderMetamodelDocs(registry, provenance);
|
|
41
|
+
}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
// FR-033 S3 — metamodel provenance: who owns each type and who contributes each attr.
|
|
2
|
+
//
|
|
3
|
+
// The composed registry knows WHAT vocabulary exists but not WHICH of the five
|
|
4
|
+
// concern providers declared each piece — that fact is flattened away at
|
|
5
|
+
// registration. We recover it from the embedded `ProviderDefinition`s:
|
|
6
|
+
//
|
|
7
|
+
// • a definition's `types[]` (non-universal entries) declare the `type.subType`s
|
|
8
|
+
// that provider OWNS (registers), plus the attrs that ride INLINE on them;
|
|
9
|
+
// • a definition's `extends[]` declare attrs a CONCERN provider contributes to a
|
|
10
|
+
// type another provider owns (subType selector `"*"` / list / single);
|
|
11
|
+
// • the universal `*.*` entry's attr children are COMMON attrs (documentation).
|
|
12
|
+
//
|
|
13
|
+
// The `"*"` extend selector is resolved against the LIVE registry's registered
|
|
14
|
+
// subtypes, so a concern attr added to "every field" is attributed on every
|
|
15
|
+
// concrete field subtype the doc renderer walks.
|
|
16
|
+
|
|
17
|
+
import type { TypeRegistry } from "../registry.js";
|
|
18
|
+
import type { ProviderDefinition, TypeDef, ChildDef } from "../provider-data.js";
|
|
19
|
+
import { CHILD_RULE_WILDCARD } from "../shared/structural.js";
|
|
20
|
+
import { isExcludedTypeSubType } from "../registry-manifest-exclusions.js";
|
|
21
|
+
import { ALL_PROVIDER_DEFINITIONS } from "./provider-definitions.js";
|
|
22
|
+
|
|
23
|
+
const ATTR_CHILD_TYPE = "attr";
|
|
24
|
+
|
|
25
|
+
/** A `(type, subType)` key, identical to the registry's internal key form. */
|
|
26
|
+
function typeKey(type: string, subType: string): string {
|
|
27
|
+
return `${type}.${subType}`;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** A `(type, subType, attrName)` key for the attr-provenance map. */
|
|
31
|
+
function attrKey(type: string, subType: string, attrName: string): string {
|
|
32
|
+
return `${type}.${subType}.${attrName}`;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function isUniversal(t: TypeDef): boolean {
|
|
36
|
+
return t.type === CHILD_RULE_WILDCARD && t.subType === CHILD_RULE_WILDCARD;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function isAttrChild(c: ChildDef): boolean {
|
|
40
|
+
return c.type === ATTR_CHILD_TYPE;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* The provenance lens: maps each registered type/attr back to its owning /
|
|
45
|
+
* contributing provider id, and the inverse (a provider → what it owns +
|
|
46
|
+
* contributes). Built once from the embedded definitions + the live registry.
|
|
47
|
+
*/
|
|
48
|
+
export interface MetamodelProvenance {
|
|
49
|
+
/** Provider id that REGISTERS (owns) this `type.subType`, or undefined. */
|
|
50
|
+
ownerOfType(type: string, subType: string): string | undefined;
|
|
51
|
+
/** Provider id that declared/contributed this attr on this `type.subType`. */
|
|
52
|
+
ownerOfAttr(type: string, subType: string, attrName: string): string | undefined;
|
|
53
|
+
/** Provider id that contributed this common (universal) attr. */
|
|
54
|
+
ownerOfCommonAttr(attrName: string): string | undefined;
|
|
55
|
+
/** The provider id → its description (from the embedded definition). */
|
|
56
|
+
providerDescription(providerId: string): string | undefined;
|
|
57
|
+
/** All provider ids that declared anything, sorted. */
|
|
58
|
+
providerIds(): string[];
|
|
59
|
+
/** The `type.subType`s a provider OWNS (registers), sorted. */
|
|
60
|
+
typesOwnedBy(providerId: string): string[];
|
|
61
|
+
/** The `(type.subType → [attrName])` a provider CONTRIBUTES via extends/inline, sorted. */
|
|
62
|
+
attrsContributedBy(providerId: string): { typeSubType: string; attrs: string[] }[];
|
|
63
|
+
/** Common attr names a provider contributes (universal), sorted. */
|
|
64
|
+
commonAttrsBy(providerId: string): string[];
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Build the provenance lens from the embedded provider definitions + a composed
|
|
69
|
+
* registry (the registry resolves `"*"` extend selectors to concrete subtypes).
|
|
70
|
+
*
|
|
71
|
+
* The provider descriptions are read from the embedded definitions indirectly:
|
|
72
|
+
* a `ProviderDefinition` carries only `provider` (the id), so descriptions come
|
|
73
|
+
* from a small registry-keyed lookup the caller can override; here we accept the
|
|
74
|
+
* descriptions the provider objects expose by mapping id → the first non-empty
|
|
75
|
+
* description we can derive. To keep this module pure + dependency-light, the
|
|
76
|
+
* provider descriptions are supplied via `providerDescriptions`.
|
|
77
|
+
*/
|
|
78
|
+
export function buildMetamodelProvenance(
|
|
79
|
+
registry: TypeRegistry,
|
|
80
|
+
opts?: { providerDescriptions?: ReadonlyMap<string, string> },
|
|
81
|
+
): MetamodelProvenance {
|
|
82
|
+
const ownerType = new Map<string, string>();
|
|
83
|
+
const ownerAttr = new Map<string, string>();
|
|
84
|
+
const ownerCommon = new Map<string, string>();
|
|
85
|
+
|
|
86
|
+
// Inverse indexes for the provider lens.
|
|
87
|
+
const ownedByProvider = new Map<string, Set<string>>();
|
|
88
|
+
const contributedByProvider = new Map<string, Map<string, Set<string>>>();
|
|
89
|
+
const commonByProvider = new Map<string, Set<string>>();
|
|
90
|
+
const providerSet = new Set<string>();
|
|
91
|
+
|
|
92
|
+
const note = (id: string) => {
|
|
93
|
+
providerSet.add(id);
|
|
94
|
+
if (!ownedByProvider.has(id)) ownedByProvider.set(id, new Set());
|
|
95
|
+
if (!contributedByProvider.has(id)) contributedByProvider.set(id, new Map());
|
|
96
|
+
if (!commonByProvider.has(id)) commonByProvider.set(id, new Set());
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
const recordContribution = (id: string, type: string, subType: string, attr: string) => {
|
|
100
|
+
const k = attrKey(type, subType, attr);
|
|
101
|
+
// First declarer wins (an attr is contributed by exactly one provider).
|
|
102
|
+
if (!ownerAttr.has(k)) ownerAttr.set(k, id);
|
|
103
|
+
const byType = contributedByProvider.get(id)!;
|
|
104
|
+
const tk = typeKey(type, subType);
|
|
105
|
+
if (!byType.has(tk)) byType.set(tk, new Set());
|
|
106
|
+
byType.get(tk)!.add(attr);
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
for (const def of ALL_PROVIDER_DEFINITIONS) {
|
|
110
|
+
const id = def.provider;
|
|
111
|
+
note(id);
|
|
112
|
+
|
|
113
|
+
for (const t of def.types ?? []) {
|
|
114
|
+
if (isUniversal(t)) {
|
|
115
|
+
// Universal `*.*` entry → common attrs, owned by this provider.
|
|
116
|
+
for (const c of t.children ?? []) {
|
|
117
|
+
if (isAttrChild(c)) {
|
|
118
|
+
if (!ownerCommon.has(c.name)) ownerCommon.set(c.name, id);
|
|
119
|
+
commonByProvider.get(id)!.add(c.name);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
// A real type this provider OWNS (registers).
|
|
125
|
+
const tk = typeKey(t.type, t.subType);
|
|
126
|
+
if (!ownerType.has(tk)) ownerType.set(tk, id);
|
|
127
|
+
// The provider lens ("Owns (registers)" on providers.md) advertises the
|
|
128
|
+
// SAME agreed vocabulary INDEX/type pages cover — skip the manifest-
|
|
129
|
+
// excluded rows (the TS-web-presentation `view.*` controls) so all three
|
|
130
|
+
// doc surfaces share one consistent set. (`ownerType` still records the
|
|
131
|
+
// raw owner for any internal lookup; only the published list is filtered.)
|
|
132
|
+
if (!isExcludedTypeSubType(t.type, t.subType)) ownedByProvider.get(id)!.add(tk);
|
|
133
|
+
// Inline attrs on an owned type are contributed by the same provider.
|
|
134
|
+
for (const c of t.children ?? []) {
|
|
135
|
+
if (isAttrChild(c)) recordContribution(id, t.type, t.subType, c.name);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// `extends[]` — a concern provider's attrs added to types another provider owns.
|
|
140
|
+
for (const ext of def.extends ?? []) {
|
|
141
|
+
const subTypes = resolveExtendSubTypes(registry, ext.type, ext.subType);
|
|
142
|
+
for (const subType of subTypes) {
|
|
143
|
+
for (const c of ext.children) {
|
|
144
|
+
if (isAttrChild(c)) recordContribution(id, ext.type, subType, c.name);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
const descriptions = opts?.providerDescriptions ?? new Map<string, string>();
|
|
151
|
+
|
|
152
|
+
const sorted = (s: Set<string>): string[] => [...s].sort(compare);
|
|
153
|
+
|
|
154
|
+
return {
|
|
155
|
+
ownerOfType: (type, subType) => ownerType.get(typeKey(type, subType)),
|
|
156
|
+
ownerOfAttr: (type, subType, attrName) => ownerAttr.get(attrKey(type, subType, attrName)),
|
|
157
|
+
ownerOfCommonAttr: (attrName) => ownerCommon.get(attrName),
|
|
158
|
+
providerDescription: (providerId) => descriptions.get(providerId),
|
|
159
|
+
providerIds: () => [...providerSet].sort(compare),
|
|
160
|
+
typesOwnedBy: (providerId) => sorted(ownedByProvider.get(providerId) ?? new Set()),
|
|
161
|
+
attrsContributedBy: (providerId) => {
|
|
162
|
+
const byType = contributedByProvider.get(providerId) ?? new Map();
|
|
163
|
+
return [...byType.entries()]
|
|
164
|
+
.map(([typeSubType, attrs]) => ({
|
|
165
|
+
typeSubType,
|
|
166
|
+
attrs: sorted(attrs as Set<string>),
|
|
167
|
+
}))
|
|
168
|
+
.sort((a, b) => compare(a.typeSubType, b.typeSubType));
|
|
169
|
+
},
|
|
170
|
+
commonAttrsBy: (providerId) => sorted(commonByProvider.get(providerId) ?? new Set()),
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/** Resolve an extend `subType` selector to concrete registered subtypes. */
|
|
175
|
+
function resolveExtendSubTypes(
|
|
176
|
+
registry: TypeRegistry,
|
|
177
|
+
type: string,
|
|
178
|
+
selector: string | readonly string[],
|
|
179
|
+
): readonly string[] {
|
|
180
|
+
if (selector === CHILD_RULE_WILDCARD) return registry.allSubTypesOf(type);
|
|
181
|
+
return Array.isArray(selector) ? selector : [selector as string];
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/** ASCII codepoint compare — locale-independent, byte-stable. */
|
|
185
|
+
function compare(a: string, b: string): number {
|
|
186
|
+
return a < b ? -1 : a > b ? 1 : 0;
|
|
187
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
// FR-033 S3 — the full set of embedded ProviderDefinitions, in one place.
|
|
2
|
+
//
|
|
3
|
+
// Provenance (which of the concern providers owns/contributes each type/attr)
|
|
4
|
+
// is NOT carried on the composed registry — it is flattened away when providers
|
|
5
|
+
// register. The embedded definition modules ARE the source of that fact: each
|
|
6
|
+
// `ProviderDefinition.provider` says who declared it, its `types[]` say which
|
|
7
|
+
// `type.subType`s it registers (owns), and its `extends[]` say which attrs it
|
|
8
|
+
// contributes to types another provider owns. This module re-exports every
|
|
9
|
+
// embedded definition as one list so the provenance builder can walk them
|
|
10
|
+
// without each consumer re-importing all fifteen.
|
|
11
|
+
|
|
12
|
+
import type { ProviderDefinition } from "../provider-data.js";
|
|
13
|
+
import { FIELD_DEFINITION } from "../core/field/field-definition.embedded.js";
|
|
14
|
+
import { OBJECT_DEFINITION } from "../core/object/object-definition.embedded.js";
|
|
15
|
+
import { ATTR_DEFINITION } from "../core/attr/attr-definition.embedded.js";
|
|
16
|
+
import { VALIDATOR_DEFINITION } from "../core/validator/validator-definition.embedded.js";
|
|
17
|
+
import { IDENTITY_DEFINITION } from "../core/identity/identity-definition.embedded.js";
|
|
18
|
+
import { RELATIONSHIP_DEFINITION } from "../core/relationship/relationship-definition.embedded.js";
|
|
19
|
+
import { DOCUMENTATION_DEFINITION } from "../core/documentation/documentation-definition.embedded.js";
|
|
20
|
+
import { ORIGIN_DEFINITION } from "../persistence/origin/origin-definition.embedded.js";
|
|
21
|
+
import { SOURCE_DEFINITION } from "../persistence/source/source-definition.embedded.js";
|
|
22
|
+
import { DB_DEFINITION } from "../persistence/db/db-definition.embedded.js";
|
|
23
|
+
import { VIEW_DEFINITION } from "../presentation/view/view-definition.embedded.js";
|
|
24
|
+
import { LAYOUT_DEFINITION } from "../presentation/layout/layout-definition.embedded.js";
|
|
25
|
+
import { UI_DEFINITION } from "../presentation/ui/ui-definition.embedded.js";
|
|
26
|
+
import { TEMPLATE_DEFINITION } from "../template/template-definition.embedded.js";
|
|
27
|
+
import { PROMPT_DEFINITION } from "../template/prompt-definition.embedded.js";
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Every embedded provider definition the core metamodel composes from. The
|
|
31
|
+
* order is irrelevant — the provenance builder keys by `(type.subType, attr)`,
|
|
32
|
+
* and the registry is the authority on what is actually registered.
|
|
33
|
+
*/
|
|
34
|
+
export const ALL_PROVIDER_DEFINITIONS: readonly ProviderDefinition[] = [
|
|
35
|
+
FIELD_DEFINITION,
|
|
36
|
+
OBJECT_DEFINITION,
|
|
37
|
+
ATTR_DEFINITION,
|
|
38
|
+
VALIDATOR_DEFINITION,
|
|
39
|
+
IDENTITY_DEFINITION,
|
|
40
|
+
RELATIONSHIP_DEFINITION,
|
|
41
|
+
DOCUMENTATION_DEFINITION,
|
|
42
|
+
ORIGIN_DEFINITION,
|
|
43
|
+
SOURCE_DEFINITION,
|
|
44
|
+
DB_DEFINITION,
|
|
45
|
+
VIEW_DEFINITION,
|
|
46
|
+
LAYOUT_DEFINITION,
|
|
47
|
+
UI_DEFINITION,
|
|
48
|
+
TEMPLATE_DEFINITION,
|
|
49
|
+
PROMPT_DEFINITION,
|
|
50
|
+
];
|
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
// FR-033 S3 — the metamodel doc renderer (pure, deterministic, byte-stable).
|
|
2
|
+
//
|
|
3
|
+
// Documents the METAMODEL ITSELF — the type/subtype/attr vocabulary of the
|
|
4
|
+
// strict registry — for an LLM (and humans). This is distinct from `meta docs
|
|
5
|
+
// --model`, which documents a USER's entities. The output is a tiered markdown
|
|
6
|
+
// tree:
|
|
7
|
+
//
|
|
8
|
+
// INDEX.md every type.subType + one-liner + link (always-on map)
|
|
9
|
+
// types/<type>.md per family: each subtype's full composed attrs (provider-
|
|
10
|
+
// tagged) + allowed children + cardinality + parents
|
|
11
|
+
// providers.md the 5-concern ownership index (the provider lens)
|
|
12
|
+
//
|
|
13
|
+
// Rendering is plain deterministic TS string-building: the metadata package
|
|
14
|
+
// owns no codegen-ts / Mustache dependency, and the output is small + fully
|
|
15
|
+
// structural, so a self-contained string builder is simpler and keeps the
|
|
16
|
+
// byte-stability contract trivially auditable. Everything is sorted by ASCII
|
|
17
|
+
// codepoint for cross-run / cross-port determinism.
|
|
18
|
+
|
|
19
|
+
import type { AttrSchema, ChildRule, TypeDefinition, TypeRegistry } from "../registry.js";
|
|
20
|
+
import type { MetamodelProvenance } from "./provenance.js";
|
|
21
|
+
import { isExcludedTypeSubType } from "../registry-manifest-exclusions.js";
|
|
22
|
+
import { ATTR_SUBTYPE_STRINGARRAY, ATTR_SUBTYPE_STRING } from "../core/attr/attr-constants.js";
|
|
23
|
+
import { CHILD_RULE_WILDCARD } from "../shared/structural.js";
|
|
24
|
+
import { SUBTYPE_BASE } from "../shared/base-types.js";
|
|
25
|
+
|
|
26
|
+
/** The regeneration command, named in every file's DO-NOT-EDIT header. */
|
|
27
|
+
const REGEN_COMMAND = "meta docs --metamodel";
|
|
28
|
+
|
|
29
|
+
/** ASCII codepoint compare — locale-independent, byte-stable. */
|
|
30
|
+
function compare(a: string, b: string): number {
|
|
31
|
+
return a < b ? -1 : a > b ? 1 : 0;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** The DO-NOT-EDIT header prepended to every emitted file. */
|
|
35
|
+
function header(what: string): string {
|
|
36
|
+
return (
|
|
37
|
+
`<!-- @generated — DO NOT EDIT.\n` +
|
|
38
|
+
` ${what}\n` +
|
|
39
|
+
` Regenerate with: ${REGEN_COMMAND} -->\n`
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** Escape a markdown table cell: collapse newlines, escape pipes. */
|
|
44
|
+
function cell(s: string): string {
|
|
45
|
+
return s.replace(/\r?\n/g, " ").replace(/\|/g, "\\|").trim();
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** The anchor GitHub assigns to a `### field.currency` heading: `fieldcurrency`. */
|
|
49
|
+
function anchor(type: string, subType: string): string {
|
|
50
|
+
return `${type}${subType}`.toLowerCase().replace(/[^a-z0-9]/g, "");
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** The scalar value-type + array suffix the docs show for an attr. */
|
|
54
|
+
function attrTypeLabel(attr: AttrSchema): string {
|
|
55
|
+
const isLegacyStringArray = attr.valueType === ATTR_SUBTYPE_STRINGARRAY;
|
|
56
|
+
const isArray = attr.isArray === true || isLegacyStringArray;
|
|
57
|
+
const scalar = isLegacyStringArray
|
|
58
|
+
? ATTR_SUBTYPE_STRING
|
|
59
|
+
: (attr.valueType ?? "any");
|
|
60
|
+
return isArray ? `${scalar}[]` : scalar;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** Render one attr value (default / an allowed value) as an inline-code token. */
|
|
64
|
+
function valueToken(v: unknown): string {
|
|
65
|
+
if (v === null || v === undefined) return "";
|
|
66
|
+
return `\`${String(v)}\``;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/** The childSubType cell: a single subtype, a `*`, or a comma-joined list. */
|
|
70
|
+
function childSubTypeLabel(childSubType: string | readonly string[]): string {
|
|
71
|
+
return Array.isArray(childSubType) ? childSubType.join(", ") : (childSubType as string);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/** A cardinality range `min..max` (`*` for unbounded / undefined upper). */
|
|
75
|
+
function cardinality(rule: ChildRule): string {
|
|
76
|
+
const min = rule.min ?? 0;
|
|
77
|
+
const max = rule.max === null || rule.max === undefined ? "*" : String(rule.max);
|
|
78
|
+
return `${min}..${max}`;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/** Whether a child rule is a STRUCTURAL child (not an attr — attrs live in the table). */
|
|
82
|
+
function isStructuralChild(rule: ChildRule): boolean {
|
|
83
|
+
return rule.childType !== "attr";
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Render the per-subtype Attributes table. Columns:
|
|
88
|
+
* Attribute | Type | Required | Default | Allowed values | Provider | Description
|
|
89
|
+
* Sorted by attr name; common (universal documentation) attrs are excluded
|
|
90
|
+
* (mentioned once on the providers page) to keep per-type pages lean.
|
|
91
|
+
*/
|
|
92
|
+
function attrsTable(
|
|
93
|
+
def: TypeDefinition,
|
|
94
|
+
provenance: MetamodelProvenance,
|
|
95
|
+
commonAttrNames: ReadonlySet<string>,
|
|
96
|
+
): string {
|
|
97
|
+
const rows = def.attributes
|
|
98
|
+
.filter((a) => !commonAttrNames.has(a.name))
|
|
99
|
+
.slice()
|
|
100
|
+
.sort((a, b) => compare(a.name, b.name));
|
|
101
|
+
if (rows.length === 0) return "_No subtype-specific attributes._\n";
|
|
102
|
+
|
|
103
|
+
const lines: string[] = [
|
|
104
|
+
"| Attribute | Type | Required | Default | Allowed values | Provider | Description |",
|
|
105
|
+
"| --- | --- | --- | --- | --- | --- | --- |",
|
|
106
|
+
];
|
|
107
|
+
for (const a of rows) {
|
|
108
|
+
// Resolve the contributing provider. An attr inherited from `<type>.base`
|
|
109
|
+
// (FR-033 `extendsBase`) is recorded against the BASE in the embedded data,
|
|
110
|
+
// not the concrete subtype — so fall back to the base owner when the
|
|
111
|
+
// subtype-specific lookup misses. (`base` itself has no further fallback.)
|
|
112
|
+
const provider =
|
|
113
|
+
provenance.ownerOfAttr(def.typeId.type, def.typeId.subType, a.name) ??
|
|
114
|
+
provenance.ownerOfAttr(def.typeId.type, SUBTYPE_BASE, a.name) ??
|
|
115
|
+
"—";
|
|
116
|
+
const allowed = (a.allowedValues ?? []).map(valueToken).join(", ");
|
|
117
|
+
lines.push(
|
|
118
|
+
`| \`@${a.name}\` | ${attrTypeLabel(a)} | ${a.required ? "yes" : "no"} | ` +
|
|
119
|
+
`${valueToken(a.default)} | ${allowed} | ${provider} | ${cell(a.description)} |`,
|
|
120
|
+
);
|
|
121
|
+
}
|
|
122
|
+
return `${lines.join("\n")}\n`;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/** Render the Allowed children list (structural child rules), sorted. */
|
|
126
|
+
function childrenList(def: TypeDefinition): string {
|
|
127
|
+
const structural = def.childRules
|
|
128
|
+
.filter(isStructuralChild)
|
|
129
|
+
.slice()
|
|
130
|
+
.sort(
|
|
131
|
+
(a, b) =>
|
|
132
|
+
compare(a.childType, b.childType) ||
|
|
133
|
+
compare(childSubTypeLabel(a.childSubType), childSubTypeLabel(b.childSubType)) ||
|
|
134
|
+
compare(a.childName, b.childName),
|
|
135
|
+
);
|
|
136
|
+
if (structural.length === 0) return "_No structural children._\n";
|
|
137
|
+
const lines = structural.map((r) => {
|
|
138
|
+
const nameSuffix =
|
|
139
|
+
r.childName === CHILD_RULE_WILDCARD ? "" : ` (name \`${r.childName}\`)`;
|
|
140
|
+
return `- \`${r.childType}.${childSubTypeLabel(r.childSubType)}\`${nameSuffix} — ${cardinality(r)}`;
|
|
141
|
+
});
|
|
142
|
+
return `${lines.join("\n")}\n`;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/** Render one subtype section on a type-family page. */
|
|
146
|
+
function subtypeSection(
|
|
147
|
+
def: TypeDefinition,
|
|
148
|
+
provenance: MetamodelProvenance,
|
|
149
|
+
commonAttrNames: ReadonlySet<string>,
|
|
150
|
+
): string {
|
|
151
|
+
const { type, subType } = def.typeId;
|
|
152
|
+
const owner = provenance.ownerOfType(type, subType);
|
|
153
|
+
const parts: string[] = [`### ${type}.${subType}\n`];
|
|
154
|
+
parts.push(`${def.description}\n`);
|
|
155
|
+
if (owner !== undefined) parts.push(`**Owning provider:** ${owner}\n`);
|
|
156
|
+
if (def.rules !== undefined) parts.push(`**Rules:** ${def.rules}\n`);
|
|
157
|
+
if (def.whenToUse !== undefined) parts.push(`**When to use:** ${def.whenToUse}\n`);
|
|
158
|
+
if (def.example !== undefined) parts.push(`**Example:**\n\n\`\`\`\n${def.example}\n\`\`\`\n`);
|
|
159
|
+
|
|
160
|
+
parts.push(`**Attributes**\n`);
|
|
161
|
+
parts.push(attrsTable(def, provenance, commonAttrNames));
|
|
162
|
+
|
|
163
|
+
parts.push(`**Allowed children**\n`);
|
|
164
|
+
parts.push(childrenList(def));
|
|
165
|
+
|
|
166
|
+
if (def.parents !== undefined && def.parents.length > 0) {
|
|
167
|
+
const ps = [...def.parents].sort(compare).map((p) => `\`${p}\``).join(", ");
|
|
168
|
+
parts.push(`**Parents:** ${ps}\n`);
|
|
169
|
+
}
|
|
170
|
+
return parts.join("\n");
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* The registered (type, subType) definitions the metamodel docs cover — every
|
|
175
|
+
* registered pair EXCEPT the ones the registry-conformance manifest carves out
|
|
176
|
+
* (TS-web-presentation `view.*` controls + the `metadata.base` inheritance
|
|
177
|
+
* anchor) so the docs describe exactly the agreed cross-port vocabulary.
|
|
178
|
+
*/
|
|
179
|
+
function coveredDefs(registry: TypeRegistry): TypeDefinition[] {
|
|
180
|
+
return registry
|
|
181
|
+
.allTypes()
|
|
182
|
+
.filter((id) => !isExcludedTypeSubType(id.type, id.subType))
|
|
183
|
+
.map((id) => registry.find(id.type, id.subType) as TypeDefinition)
|
|
184
|
+
.sort((a, b) =>
|
|
185
|
+
compare(
|
|
186
|
+
`${a.typeId.type}.${a.typeId.subType}`,
|
|
187
|
+
`${b.typeId.type}.${b.typeId.subType}`,
|
|
188
|
+
),
|
|
189
|
+
);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/** Render INDEX.md — the always-on map: every type.subType + one-liner + link. */
|
|
193
|
+
function renderIndex(defs: readonly TypeDefinition[]): string {
|
|
194
|
+
const lines: string[] = [
|
|
195
|
+
header("Metamodel vocabulary index — every type.subType, its one-line description, and a link to its type page."),
|
|
196
|
+
"# MetaObjects Metamodel — Index\n",
|
|
197
|
+
"This documents the **metamodel itself** — the type / subtype / attribute",
|
|
198
|
+
"vocabulary the loader accepts — generated from the strict registry. It is",
|
|
199
|
+
"NOT documentation of a user's entities (that is `meta docs --model`).\n",
|
|
200
|
+
"Follow a link into `types/<family>.md` for the full attribute table, allowed",
|
|
201
|
+
"children, and cardinality of a subtype. Universal documentation attributes",
|
|
202
|
+
"(`@description`/`@title`/…) apply to every node and are listed once in",
|
|
203
|
+
"[providers.md](providers.md) under `metaobjects-documentation`.\n",
|
|
204
|
+
"| Type.subType | Description | Page |",
|
|
205
|
+
"| --- | --- | --- |",
|
|
206
|
+
];
|
|
207
|
+
for (const def of defs) {
|
|
208
|
+
const { type, subType } = def.typeId;
|
|
209
|
+
const link = `[types/${type}.md#${anchor(type, subType)}](types/${type}.md#${anchor(type, subType)})`;
|
|
210
|
+
lines.push(`| \`${type}.${subType}\` | ${cell(def.description)} | ${link} |`);
|
|
211
|
+
}
|
|
212
|
+
return `${lines.join("\n")}\n`;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/** Render one types/<family>.md page from that family's subtype definitions. */
|
|
216
|
+
function renderTypePage(
|
|
217
|
+
family: string,
|
|
218
|
+
defs: readonly TypeDefinition[],
|
|
219
|
+
provenance: MetamodelProvenance,
|
|
220
|
+
commonAttrNames: ReadonlySet<string>,
|
|
221
|
+
): string {
|
|
222
|
+
const parts: string[] = [
|
|
223
|
+
header(`Metamodel reference for the \`${family}\` type family — each subtype's composed attributes, allowed children, and cardinality.`),
|
|
224
|
+
`# Metamodel — \`${family}\` types\n`,
|
|
225
|
+
`Each section below is one \`${family}.<subType>\`. The **Attributes** table lists`,
|
|
226
|
+
`the subtype's own + concern-contributed attributes (provider-tagged); universal`,
|
|
227
|
+
`documentation attributes are omitted here (see [providers.md](../providers.md)).`,
|
|
228
|
+
`**Allowed children** lists the structural child rules with their cardinality`,
|
|
229
|
+
`(\`min..max\`, \`*\` = unbounded).\n`,
|
|
230
|
+
];
|
|
231
|
+
for (const def of defs) {
|
|
232
|
+
parts.push(subtypeSection(def, provenance, commonAttrNames));
|
|
233
|
+
}
|
|
234
|
+
return `${parts.join("\n")}\n`;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/** Render providers.md — the 5-concern ownership index (the provider lens). */
|
|
238
|
+
function renderProviders(provenance: MetamodelProvenance): string {
|
|
239
|
+
const parts: string[] = [
|
|
240
|
+
header("Concern-provider ownership index — which provider owns each type and contributes each attribute."),
|
|
241
|
+
"# MetaObjects Metamodel — Providers\n",
|
|
242
|
+
"The metamodel is composed from concern providers. Each **owns** the",
|
|
243
|
+
"type/subtypes it registers and may **contribute** attributes to types another",
|
|
244
|
+
"provider owns. This is the ownership lens over the same vocabulary",
|
|
245
|
+
"[INDEX.md](INDEX.md) lists by type.\n",
|
|
246
|
+
];
|
|
247
|
+
for (const id of provenance.providerIds()) {
|
|
248
|
+
parts.push(`## ${id}\n`);
|
|
249
|
+
const desc = provenance.providerDescription(id);
|
|
250
|
+
if (desc !== undefined) parts.push(`${desc}\n`);
|
|
251
|
+
|
|
252
|
+
const owned = provenance.typesOwnedBy(id);
|
|
253
|
+
if (owned.length > 0) {
|
|
254
|
+
parts.push(`**Owns (registers):** ${owned.map((t) => `\`${t}\``).join(", ")}\n`);
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
const common = provenance.commonAttrsBy(id);
|
|
258
|
+
if (common.length > 0) {
|
|
259
|
+
parts.push(
|
|
260
|
+
`**Universal attributes (every node):** ${common.map((a) => `\`@${a}\``).join(", ")}\n`,
|
|
261
|
+
);
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
const contributed = provenance.attrsContributedBy(id);
|
|
265
|
+
if (contributed.length > 0) {
|
|
266
|
+
parts.push(`**Contributes attributes:**\n`);
|
|
267
|
+
const lines = contributed.map(
|
|
268
|
+
(c) => `- \`${c.typeSubType}\`: ${c.attrs.map((a) => `\`@${a}\``).join(", ")}`,
|
|
269
|
+
);
|
|
270
|
+
parts.push(`${lines.join("\n")}\n`);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
return `${parts.join("\n")}\n`;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* Render the full metamodel doc tree (pure + deterministic). Returns a
|
|
278
|
+
* `Map<relativePath, markdown>` keyed by:
|
|
279
|
+
* `INDEX.md`, `providers.md`, `types/<family>.md`.
|
|
280
|
+
*
|
|
281
|
+
* The registry must already be composed (`composeRegistry(coreProviders)`); the
|
|
282
|
+
* provenance lens is built once (`buildMetamodelProvenance`) and threaded in.
|
|
283
|
+
*/
|
|
284
|
+
export function renderMetamodelDocs(
|
|
285
|
+
registry: TypeRegistry,
|
|
286
|
+
provenance: MetamodelProvenance,
|
|
287
|
+
): Map<string, string> {
|
|
288
|
+
const defs = coveredDefs(registry);
|
|
289
|
+
const commonAttrNames = new Set(registry.getCommonAttrs().map((a) => a.name));
|
|
290
|
+
|
|
291
|
+
const out = new Map<string, string>();
|
|
292
|
+
out.set("INDEX.md", renderIndex(defs));
|
|
293
|
+
out.set("providers.md", renderProviders(provenance));
|
|
294
|
+
|
|
295
|
+
// Group by type family, sorted within + across.
|
|
296
|
+
const byFamily = new Map<string, TypeDefinition[]>();
|
|
297
|
+
for (const def of defs) {
|
|
298
|
+
const fam = def.typeId.type;
|
|
299
|
+
if (!byFamily.has(fam)) byFamily.set(fam, []);
|
|
300
|
+
byFamily.get(fam)!.push(def);
|
|
301
|
+
}
|
|
302
|
+
for (const fam of [...byFamily.keys()].sort(compare)) {
|
|
303
|
+
out.set(
|
|
304
|
+
`types/${fam}.md`,
|
|
305
|
+
renderTypePage(fam, byFamily.get(fam)!, provenance, commonAttrNames),
|
|
306
|
+
);
|
|
307
|
+
}
|
|
308
|
+
return out;
|
|
309
|
+
}
|