@metaobjectsdev/metadata 0.5.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +189 -0
- package/README.md +29 -0
- package/dist/attr-class-map.d.ts +26 -0
- package/dist/attr-class-map.d.ts.map +1 -0
- package/dist/attr-class-map.js +44 -0
- package/dist/attr-class-map.js.map +1 -0
- package/dist/attr-schema-validate.d.ts +9 -0
- package/dist/attr-schema-validate.d.ts.map +1 -0
- package/dist/attr-schema-validate.js +100 -0
- package/dist/attr-schema-validate.js.map +1 -0
- 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/core/attr/attr-constants.d.ts +12 -0
- package/dist/core/attr/attr-constants.d.ts.map +1 -0
- package/dist/core/attr/attr-constants.js +27 -0
- package/dist/core/attr/attr-constants.js.map +1 -0
- package/dist/core/attr/meta-attr-filter.d.ts +10 -0
- package/dist/core/attr/meta-attr-filter.d.ts.map +1 -0
- package/dist/core/attr/meta-attr-filter.js +56 -0
- package/dist/core/attr/meta-attr-filter.js.map +1 -0
- package/dist/core/attr/meta-attr-properties.d.ts +9 -0
- package/dist/core/attr/meta-attr-properties.d.ts.map +1 -0
- package/dist/core/attr/meta-attr-properties.js +22 -0
- package/dist/core/attr/meta-attr-properties.js.map +1 -0
- package/dist/core/attr/meta-attr-stringarray.d.ts +9 -0
- package/dist/core/attr/meta-attr-stringarray.d.ts.map +1 -0
- package/dist/core/attr/meta-attr-stringarray.js +29 -0
- package/dist/core/attr/meta-attr-stringarray.js.map +1 -0
- package/dist/core/attr/meta-attr.d.ts +37 -0
- package/dist/core/attr/meta-attr.d.ts.map +1 -0
- package/dist/core/attr/meta-attr.js +97 -0
- package/dist/core/attr/meta-attr.js.map +1 -0
- package/dist/core/export-json.d.ts +29 -0
- package/dist/core/export-json.d.ts.map +1 -0
- package/dist/core/export-json.js +45 -0
- package/dist/core/export-json.js.map +1 -0
- package/dist/core/field/field-constants.d.ts +40 -0
- package/dist/core/field/field-constants.d.ts.map +1 -0
- package/dist/core/field/field-constants.js +66 -0
- package/dist/core/field/field-constants.js.map +1 -0
- package/dist/core/field/field-schema.d.ts +6 -0
- package/dist/core/field/field-schema.d.ts.map +1 -0
- package/dist/core/field/field-schema.js +92 -0
- package/dist/core/field/field-schema.js.map +1 -0
- package/dist/core/field/meta-field.d.ts +50 -0
- package/dist/core/field/meta-field.d.ts.map +1 -0
- package/dist/core/field/meta-field.js +121 -0
- package/dist/core/field/meta-field.js.map +1 -0
- 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-constants.d.ts +19 -0
- package/dist/core/identity/identity-constants.d.ts.map +1 -0
- package/dist/core/identity/identity-constants.js +35 -0
- package/dist/core/identity/identity-constants.js.map +1 -0
- package/dist/core/identity/identity-schema.d.ts +6 -0
- package/dist/core/identity/identity-schema.d.ts.map +1 -0
- package/dist/core/identity/identity-schema.js +55 -0
- package/dist/core/identity/identity-schema.js.map +1 -0
- package/dist/core/identity/meta-identity.d.ts +71 -0
- package/dist/core/identity/meta-identity.d.ts.map +1 -0
- package/dist/core/identity/meta-identity.js +129 -0
- package/dist/core/identity/meta-identity.js.map +1 -0
- package/dist/core/index.d.ts +6 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +11 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/object/meta-object.d.ts +39 -0
- package/dist/core/object/meta-object.d.ts.map +1 -0
- package/dist/core/object/meta-object.js +80 -0
- package/dist/core/object/meta-object.js.map +1 -0
- package/dist/core/object/object-constants.d.ts +5 -0
- package/dist/core/object/object-constants.d.ts.map +1 -0
- package/dist/core/object/object-constants.js +18 -0
- package/dist/core/object/object-constants.js.map +1 -0
- package/dist/core/object/object-schema.d.ts +4 -0
- package/dist/core/object/object-schema.d.ts.map +1 -0
- package/dist/core/object/object-schema.js +5 -0
- package/dist/core/object/object-schema.js.map +1 -0
- package/dist/core/parser-yaml.d.ts +3 -0
- package/dist/core/parser-yaml.d.ts.map +1 -0
- package/dist/core/parser-yaml.js +39 -0
- package/dist/core/parser-yaml.js.map +1 -0
- package/dist/core/query/query-constants.d.ts +20 -0
- package/dist/core/query/query-constants.d.ts.map +1 -0
- package/dist/core/query/query-constants.js +56 -0
- package/dist/core/query/query-constants.js.map +1 -0
- package/dist/core/relationship/find-reference.d.ts +22 -0
- package/dist/core/relationship/find-reference.d.ts.map +1 -0
- package/dist/core/relationship/find-reference.js +29 -0
- package/dist/core/relationship/find-reference.js.map +1 -0
- package/dist/core/relationship/meta-relationship.d.ts +11 -0
- package/dist/core/relationship/meta-relationship.d.ts.map +1 -0
- package/dist/core/relationship/meta-relationship.js +27 -0
- package/dist/core/relationship/meta-relationship.js.map +1 -0
- package/dist/core/relationship/relationship-constants.d.ts +14 -0
- package/dist/core/relationship/relationship-constants.d.ts.map +1 -0
- package/dist/core/relationship/relationship-constants.js +28 -0
- package/dist/core/relationship/relationship-constants.js.map +1 -0
- package/dist/core/relationship/relationship-schema.d.ts +4 -0
- package/dist/core/relationship/relationship-schema.d.ts.map +1 -0
- package/dist/core/relationship/relationship-schema.js +37 -0
- package/dist/core/relationship/relationship-schema.js.map +1 -0
- package/dist/core/validator/meta-validator.d.ts +29 -0
- package/dist/core/validator/meta-validator.d.ts.map +1 -0
- package/dist/core/validator/meta-validator.js +49 -0
- package/dist/core/validator/meta-validator.js.map +1 -0
- package/dist/core/validator/validator-constants.d.ts +11 -0
- package/dist/core/validator/validator-constants.d.ts.map +1 -0
- package/dist/core/validator/validator-constants.js +25 -0
- package/dist/core/validator/validator-constants.js.map +1 -0
- package/dist/core/validator/validator-schema.d.ts +4 -0
- package/dist/core/validator/validator-schema.d.ts.map +1 -0
- package/dist/core/validator/validator-schema.js +38 -0
- package/dist/core/validator/validator-schema.js.map +1 -0
- package/dist/core/yaml-desugar.d.ts +10 -0
- package/dist/core/yaml-desugar.d.ts.map +1 -0
- package/dist/core/yaml-desugar.js +99 -0
- package/dist/core/yaml-desugar.js.map +1 -0
- 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 +20 -0
- package/dist/core-types.d.ts.map +1 -0
- package/dist/core-types.js +225 -0
- package/dist/core-types.js.map +1 -0
- package/dist/data-converter.d.ts +17 -0
- package/dist/data-converter.d.ts.map +1 -0
- package/dist/data-converter.js +117 -0
- package/dist/data-converter.js.map +1 -0
- package/dist/data-type.d.ts +15 -0
- package/dist/data-type.d.ts.map +1 -0
- package/dist/data-type.js +25 -0
- package/dist/data-type.js.map +1 -0
- 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 +26 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +59 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +70 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +76 -0
- package/dist/index.js.map +1 -0
- package/dist/loader/meta-data-loader.d.ts +87 -0
- package/dist/loader/meta-data-loader.d.ts.map +1 -0
- package/dist/loader/meta-data-loader.js +232 -0
- package/dist/loader/meta-data-loader.js.map +1 -0
- package/dist/loader/meta-data-source.d.ts +23 -0
- package/dist/loader/meta-data-source.d.ts.map +1 -0
- package/dist/loader/meta-data-source.js +20 -0
- package/dist/loader/meta-data-source.js.map +1 -0
- package/dist/loader/validation-passes.d.ts +7 -0
- package/dist/loader/validation-passes.d.ts.map +1 -0
- package/dist/loader/validation-passes.js +244 -0
- package/dist/loader/validation-passes.js.map +1 -0
- 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/naming.d.ts +27 -0
- package/dist/naming.d.ts.map +1 -0
- package/dist/naming.js +72 -0
- package/dist/naming.js.map +1 -0
- package/dist/object-serializer.d.ts +10 -0
- package/dist/object-serializer.d.ts.map +1 -0
- package/dist/object-serializer.js +128 -0
- package/dist/object-serializer.js.map +1 -0
- package/dist/overlay.d.ts +2 -0
- package/dist/overlay.d.ts.map +1 -0
- package/dist/overlay.js +6 -0
- package/dist/overlay.js.map +1 -0
- package/dist/parser-core.d.ts +47 -0
- package/dist/parser-core.d.ts.map +1 -0
- package/dist/parser-core.js +516 -0
- package/dist/parser-core.js.map +1 -0
- package/dist/parser-json.d.ts +4 -0
- package/dist/parser-json.d.ts.map +1 -0
- package/dist/parser-json.js +19 -0
- package/dist/parser-json.js.map +1 -0
- 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-constants.d.ts +5 -0
- package/dist/persistence/db/db-constants.d.ts.map +1 -0
- package/dist/persistence/db/db-constants.js +6 -0
- package/dist/persistence/db/db-constants.js.map +1 -0
- package/dist/persistence/db/db-provider.d.ts +3 -0
- package/dist/persistence/db/db-provider.d.ts.map +1 -0
- package/dist/persistence/db/db-provider.js +29 -0
- package/dist/persistence/db/db-provider.js.map +1 -0
- package/dist/persistence/db/db-schema.d.ts +8 -0
- package/dist/persistence/db/db-schema.d.ts.map +1 -0
- package/dist/persistence/db/db-schema.js +27 -0
- package/dist/persistence/db/db-schema.js.map +1 -0
- package/dist/persistence/origin/meta-origin.d.ts +32 -0
- package/dist/persistence/origin/meta-origin.d.ts.map +1 -0
- package/dist/persistence/origin/meta-origin.js +55 -0
- package/dist/persistence/origin/meta-origin.js.map +1 -0
- package/dist/persistence/origin/origin-constants.d.ts +12 -0
- package/dist/persistence/origin/origin-constants.d.ts.map +1 -0
- package/dist/persistence/origin/origin-constants.js +27 -0
- package/dist/persistence/origin/origin-constants.js.map +1 -0
- package/dist/persistence/origin/origin-schema.d.ts +4 -0
- package/dist/persistence/origin/origin-schema.d.ts.map +1 -0
- package/dist/persistence/origin/origin-schema.js +49 -0
- package/dist/persistence/origin/origin-schema.js.map +1 -0
- package/dist/persistence/source/meta-source.d.ts +18 -0
- package/dist/persistence/source/meta-source.d.ts.map +1 -0
- package/dist/persistence/source/meta-source.js +31 -0
- package/dist/persistence/source/meta-source.js.map +1 -0
- package/dist/persistence/source/source-constants.d.ts +16 -0
- package/dist/persistence/source/source-constants.d.ts.map +1 -0
- package/dist/persistence/source/source-constants.js +28 -0
- package/dist/persistence/source/source-constants.js.map +1 -0
- package/dist/presentation/layout/layout-constants.d.ts +10 -0
- package/dist/presentation/layout/layout-constants.d.ts.map +1 -0
- package/dist/presentation/layout/layout-constants.js +21 -0
- package/dist/presentation/layout/layout-constants.js.map +1 -0
- package/dist/presentation/layout/layout-schema.d.ts +4 -0
- package/dist/presentation/layout/layout-schema.d.ts.map +1 -0
- package/dist/presentation/layout/layout-schema.js +46 -0
- package/dist/presentation/layout/layout-schema.js.map +1 -0
- package/dist/presentation/layout/meta-layout.d.ts +23 -0
- package/dist/presentation/layout/meta-layout.d.ts.map +1 -0
- package/dist/presentation/layout/meta-layout.js +47 -0
- package/dist/presentation/layout/meta-layout.js.map +1 -0
- package/dist/presentation/view/meta-view.d.ts +4 -0
- package/dist/presentation/view/meta-view.d.ts.map +1 -0
- package/dist/presentation/view/meta-view.js +8 -0
- package/dist/presentation/view/meta-view.js.map +1 -0
- package/dist/presentation/view/view-constants.d.ts +20 -0
- package/dist/presentation/view/view-constants.d.ts.map +1 -0
- package/dist/presentation/view/view-constants.js +47 -0
- package/dist/presentation/view/view-constants.js.map +1 -0
- package/dist/presentation/view/view-schema.d.ts +4 -0
- package/dist/presentation/view/view-schema.d.ts.map +1 -0
- package/dist/presentation/view/view-schema.js +15 -0
- package/dist/presentation/view/view-schema.js.map +1 -0
- package/dist/provider.d.ts +20 -0
- package/dist/provider.d.ts.map +1 -0
- package/dist/provider.js +58 -0
- package/dist/provider.js.map +1 -0
- package/dist/registry.d.ts +89 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +107 -0
- package/dist/registry.js.map +1 -0
- package/dist/serializer-json.d.ts +16 -0
- package/dist/serializer-json.d.ts.map +1 -0
- package/dist/serializer-json.js +154 -0
- package/dist/serializer-json.js.map +1 -0
- package/dist/shared/base-types.d.ts +23 -0
- package/dist/shared/base-types.d.ts.map +1 -0
- package/dist/shared/base-types.js +43 -0
- package/dist/shared/base-types.js.map +1 -0
- package/dist/shared/meta-data.d.ts +123 -0
- package/dist/shared/meta-data.d.ts.map +1 -0
- package/dist/shared/meta-data.js +365 -0
- package/dist/shared/meta-data.js.map +1 -0
- package/dist/shared/meta-root.d.ts +12 -0
- package/dist/shared/meta-root.d.ts.map +1 -0
- package/dist/shared/meta-root.js +24 -0
- package/dist/shared/meta-root.js.map +1 -0
- package/dist/shared/structural.d.ts +20 -0
- package/dist/shared/structural.d.ts.map +1 -0
- package/dist/shared/structural.js +49 -0
- package/dist/shared/structural.js.map +1 -0
- package/dist/subtype-rules.d.ts +8 -0
- package/dist/subtype-rules.d.ts.map +1 -0
- package/dist/subtype-rules.js +34 -0
- package/dist/subtype-rules.js.map +1 -0
- package/dist/super-resolve.d.ts +34 -0
- package/dist/super-resolve.d.ts.map +1 -0
- package/dist/super-resolve.js +124 -0
- package/dist/super-resolve.js.map +1 -0
- package/package.json +50 -0
- package/src/attr-class-map.ts +64 -0
- package/src/attr-schema-validate.ts +134 -0
- package/src/core/attr/attr-constants.ts +31 -0
- package/src/core/attr/meta-attr-filter.ts +67 -0
- package/src/core/attr/meta-attr-properties.ts +26 -0
- package/src/core/attr/meta-attr-stringarray.ts +31 -0
- package/src/core/attr/meta-attr.ts +125 -0
- package/src/core/export-json.ts +66 -0
- package/src/core/field/field-constants.ts +79 -0
- package/src/core/field/field-schema.ts +121 -0
- package/src/core/field/meta-field.ts +179 -0
- package/src/core/file-meta-data-loader.ts +89 -0
- package/src/core/file-source.ts +52 -0
- package/src/core/identity/identity-constants.ts +44 -0
- package/src/core/identity/identity-schema.ts +80 -0
- package/src/core/identity/meta-identity.ts +148 -0
- package/src/core/index.ts +12 -0
- package/src/core/object/meta-object.ts +151 -0
- package/src/core/object/object-constants.ts +21 -0
- package/src/core/object/object-schema.ts +7 -0
- package/src/core/parser-yaml.ts +54 -0
- package/src/core/query/query-constants.ts +66 -0
- package/src/core/relationship/find-reference.ts +44 -0
- package/src/core/relationship/meta-relationship.ts +36 -0
- package/src/core/relationship/relationship-constants.ts +38 -0
- package/src/core/relationship/relationship-schema.ts +49 -0
- package/src/core/validator/meta-validator.ts +62 -0
- package/src/core/validator/validator-constants.ts +31 -0
- package/src/core/validator/validator-schema.ts +50 -0
- package/src/core/yaml-desugar.ts +145 -0
- package/src/core-types.ts +329 -0
- package/src/data-converter.ts +125 -0
- package/src/data-type.ts +33 -0
- package/src/errors.ts +68 -0
- package/src/index.ts +165 -0
- package/src/loader/meta-data-loader.ts +307 -0
- package/src/loader/meta-data-source.ts +35 -0
- package/src/loader/validation-passes.ts +370 -0
- package/src/naming.ts +86 -0
- package/src/object-serializer.ts +153 -0
- package/src/overlay.ts +5 -0
- package/src/parser-core.ts +815 -0
- package/src/parser-json.ts +28 -0
- package/src/persistence/db/db-constants.ts +6 -0
- package/src/persistence/db/db-provider.ts +36 -0
- package/src/persistence/db/db-schema.ts +40 -0
- package/src/persistence/origin/meta-origin.ts +67 -0
- package/src/persistence/origin/origin-constants.ts +35 -0
- package/src/persistence/origin/origin-schema.ts +66 -0
- package/src/persistence/source/meta-source.ts +38 -0
- package/src/persistence/source/source-constants.ts +35 -0
- package/src/presentation/layout/layout-constants.ts +27 -0
- package/src/presentation/layout/layout-schema.ts +62 -0
- package/src/presentation/layout/meta-layout.ts +61 -0
- package/src/presentation/view/meta-view.ts +8 -0
- package/src/presentation/view/view-constants.ts +53 -0
- package/src/presentation/view/view-schema.ts +21 -0
- package/src/provider.ts +85 -0
- package/src/registry.ts +190 -0
- package/src/serializer-json.ts +210 -0
- package/src/shared/base-types.ts +52 -0
- package/src/shared/meta-data.ts +443 -0
- package/src/shared/meta-root.ts +33 -0
- package/src/shared/structural.ts +62 -0
- package/src/subtype-rules.ts +56 -0
- package/src/super-resolve.ts +147 -0
package/src/index.ts
ADDED
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
// Public API surface for @metaobjectsdev/metadata v0.2.0
|
|
2
|
+
//
|
|
3
|
+
// Architecture: one typed tree of concrete node classes organized under
|
|
4
|
+
// src/{core,persistence,presentation}/<concern>/, plus open type registry
|
|
5
|
+
// + JSON parser/serializer + Loader orchestration. Java-pattern aligned.
|
|
6
|
+
//
|
|
7
|
+
// See docs/strategy/2026-05-09-northstar-v4.md and
|
|
8
|
+
// docs/specs/2026-05-09-v0.2-ts-pillar.md for context.
|
|
9
|
+
|
|
10
|
+
// AnyMeta imports — kept here (not in src/shared/ or concern folders) to avoid circular imports.
|
|
11
|
+
// See the AnyMeta comment below for full explanation.
|
|
12
|
+
import type { MetaRoot } from "./shared/meta-root.js";
|
|
13
|
+
import type { MetaObject } from "./core/object/meta-object.js";
|
|
14
|
+
import type { MetaField } from "./core/field/meta-field.js";
|
|
15
|
+
import type { MetaIdentity } from "./core/identity/meta-identity.js";
|
|
16
|
+
import type { MetaRelationship } from "./core/relationship/meta-relationship.js";
|
|
17
|
+
import type { MetaValidator } from "./core/validator/meta-validator.js";
|
|
18
|
+
import type { MetaView } from "./presentation/view/meta-view.js";
|
|
19
|
+
import type { MetaAttr } from "./core/attr/meta-attr.js";
|
|
20
|
+
import type { MetaLayout } from "./presentation/layout/meta-layout.js";
|
|
21
|
+
import type { MetaSource } from "./persistence/source/meta-source.js";
|
|
22
|
+
import type { MetaOrigin } from "./persistence/origin/meta-origin.js";
|
|
23
|
+
|
|
24
|
+
// Constants — type names, subtype names, reserved keys, separators
|
|
25
|
+
export * from "./shared/base-types.js";
|
|
26
|
+
export * from "./shared/structural.js";
|
|
27
|
+
export * from "./core/object/object-constants.js";
|
|
28
|
+
export * from "./core/field/field-constants.js";
|
|
29
|
+
export * from "./core/attr/attr-constants.js";
|
|
30
|
+
export * from "./core/validator/validator-constants.js";
|
|
31
|
+
export * from "./core/identity/identity-constants.js";
|
|
32
|
+
export * from "./core/relationship/relationship-constants.js";
|
|
33
|
+
export * from "./core/query/query-constants.js";
|
|
34
|
+
export * from "./persistence/source/source-constants.js";
|
|
35
|
+
export * from "./persistence/origin/origin-constants.js";
|
|
36
|
+
export * from "./persistence/db/db-constants.js";
|
|
37
|
+
export * from "./presentation/view/view-constants.js";
|
|
38
|
+
export * from "./presentation/layout/layout-constants.js";
|
|
39
|
+
|
|
40
|
+
// MetaData node base — abstract class; also exports AttrValue
|
|
41
|
+
export { MetaData } from "./shared/meta-data.js";
|
|
42
|
+
export type { AttrValue } from "./shared/meta-data.js";
|
|
43
|
+
|
|
44
|
+
// Shared node classes
|
|
45
|
+
export { MetaRoot } from "./shared/meta-root.js";
|
|
46
|
+
|
|
47
|
+
// Core node classes
|
|
48
|
+
export { MetaObject } from "./core/object/meta-object.js";
|
|
49
|
+
export { MetaField } from "./core/field/meta-field.js";
|
|
50
|
+
export { MetaAttr } from "./core/attr/meta-attr.js";
|
|
51
|
+
// Identity: base + subtype-specific
|
|
52
|
+
export {
|
|
53
|
+
MetaIdentity,
|
|
54
|
+
MetaPrimaryIdentity,
|
|
55
|
+
MetaSecondaryIdentity,
|
|
56
|
+
MetaReferenceIdentity,
|
|
57
|
+
} from "./core/identity/meta-identity.js";
|
|
58
|
+
export type { IdentityGeneration } from "./core/identity/meta-identity.js";
|
|
59
|
+
// Relationship
|
|
60
|
+
export { MetaRelationship } from "./core/relationship/meta-relationship.js";
|
|
61
|
+
// Cross-entity reference lookup
|
|
62
|
+
export { findReferenceBetween } from "./core/relationship/find-reference.js";
|
|
63
|
+
export type { ReferenceLookup } from "./core/relationship/find-reference.js";
|
|
64
|
+
// Validator: base + subtype-specific
|
|
65
|
+
export {
|
|
66
|
+
MetaValidator,
|
|
67
|
+
MetaRequiredValidator,
|
|
68
|
+
MetaLengthValidator,
|
|
69
|
+
MetaRegexValidator,
|
|
70
|
+
MetaNumericValidator,
|
|
71
|
+
MetaArrayValidator,
|
|
72
|
+
} from "./core/validator/meta-validator.js";
|
|
73
|
+
|
|
74
|
+
// Persistence node classes
|
|
75
|
+
export { MetaSource } from "./persistence/source/meta-source.js";
|
|
76
|
+
// Origin: base + subtype-specific
|
|
77
|
+
export {
|
|
78
|
+
MetaOrigin,
|
|
79
|
+
MetaPassthroughOrigin,
|
|
80
|
+
MetaAggregateOrigin,
|
|
81
|
+
} from "./persistence/origin/meta-origin.js";
|
|
82
|
+
|
|
83
|
+
// Presentation node classes
|
|
84
|
+
export { MetaView } from "./presentation/view/meta-view.js";
|
|
85
|
+
export { MetaLayout } from "./presentation/layout/meta-layout.js";
|
|
86
|
+
|
|
87
|
+
// AnyMeta — union of all concrete node types.
|
|
88
|
+
// Defined here (not in a shared concern folder) to avoid a circular import:
|
|
89
|
+
// each concrete class file imports MetaData from meta-data.ts; a shared
|
|
90
|
+
// any-meta.ts would need to import all of them, and they'd need to import it
|
|
91
|
+
// — creating a cycle. index.ts is the natural resolution point: it already
|
|
92
|
+
// re-exports every class.
|
|
93
|
+
export type AnyMeta =
|
|
94
|
+
| MetaRoot
|
|
95
|
+
| MetaObject
|
|
96
|
+
| MetaField
|
|
97
|
+
| MetaIdentity
|
|
98
|
+
| MetaRelationship
|
|
99
|
+
| MetaValidator
|
|
100
|
+
| MetaView
|
|
101
|
+
| MetaAttr
|
|
102
|
+
| MetaLayout
|
|
103
|
+
| MetaSource
|
|
104
|
+
| MetaOrigin;
|
|
105
|
+
|
|
106
|
+
// Registry
|
|
107
|
+
export { TypeId, TypeRegistry, childRuleMatches } from "./registry.js";
|
|
108
|
+
export type { AttrSchema, ChildRule, TypeDefinition } from "./registry.js";
|
|
109
|
+
export { registerCoreTypes, coreTypesProvider, coreProviders } from "./core-types.js";
|
|
110
|
+
export { dbProvider } from "./persistence/db/db-provider.js";
|
|
111
|
+
|
|
112
|
+
// Type provider model
|
|
113
|
+
export { composeRegistry } from "./provider.js";
|
|
114
|
+
export type { MetaDataTypeProvider } from "./provider.js";
|
|
115
|
+
|
|
116
|
+
// DataType classification
|
|
117
|
+
export {
|
|
118
|
+
DATA_TYPES,
|
|
119
|
+
DATA_TYPE_BOOLEAN, DATA_TYPE_INT, DATA_TYPE_LONG, DATA_TYPE_DOUBLE,
|
|
120
|
+
DATA_TYPE_STRING, DATA_TYPE_DATE, DATA_TYPE_OBJECT,
|
|
121
|
+
} from "./data-type.js";
|
|
122
|
+
export type { DataType, DataTypeAware } from "./data-type.js";
|
|
123
|
+
|
|
124
|
+
// Metadata-driven object serializer
|
|
125
|
+
export { objectToJson, jsonToObject } from "./object-serializer.js";
|
|
126
|
+
export type { ObjectSerializeOptions } from "./object-serializer.js";
|
|
127
|
+
|
|
128
|
+
// Data converter — convert a value to a known DataType (no inference)
|
|
129
|
+
export { convertToDataType, toAttrValue } from "./data-converter.js";
|
|
130
|
+
|
|
131
|
+
// Parser — shared core builder + per-format front-ends
|
|
132
|
+
export { buildTree } from "./parser-core.js";
|
|
133
|
+
export type { ParseOptions, ParseResult } from "./parser-core.js";
|
|
134
|
+
export { parseJson } from "./parser-json.js";
|
|
135
|
+
|
|
136
|
+
// Serializer
|
|
137
|
+
export { serializeJson, canonicalSerialize, inferAttrSubType } from "./serializer-json.js";
|
|
138
|
+
export type { SerializeOptions } from "./serializer-json.js";
|
|
139
|
+
|
|
140
|
+
// Super resolution helper (most resolution moved into parser; this is the lookup utility)
|
|
141
|
+
export { resolveSuperRef } from "./super-resolve.js";
|
|
142
|
+
|
|
143
|
+
// Loader hierarchy
|
|
144
|
+
export { MetaDataLoader } from "./loader/meta-data-loader.js";
|
|
145
|
+
export type { LoadOptions, LoadResult, LoadingState } from "./loader/meta-data-loader.js";
|
|
146
|
+
export { InMemorySource } from "./loader/meta-data-source.js";
|
|
147
|
+
export type { MetaDataSource, MetaDataFormat } from "./loader/meta-data-source.js";
|
|
148
|
+
|
|
149
|
+
// Errors
|
|
150
|
+
export { ParseError, MetaModelError, ERROR_CODES } from "./errors.js";
|
|
151
|
+
export type { ErrorCode } from "./errors.js";
|
|
152
|
+
|
|
153
|
+
// Attribute-schema validation pass (Phase A3)
|
|
154
|
+
export { validateAttrSchema } from "./attr-schema-validate.js";
|
|
155
|
+
export type { AttrSchemaValidationResult } from "./attr-schema-validate.js";
|
|
156
|
+
|
|
157
|
+
// Naming — hoisted from runtime-ts in v0.2.3 so multiple consumers (runtime-ts, migrate-ts, codegen-ts)
|
|
158
|
+
// share identical name resolution. See spec §4.1.
|
|
159
|
+
export {
|
|
160
|
+
toSnakeCase, pluralize,
|
|
161
|
+
resolveTableName, resolveColumnName, resolveTableSchema,
|
|
162
|
+
buildNameMap,
|
|
163
|
+
stripPackage,
|
|
164
|
+
} from "./naming.js";
|
|
165
|
+
export type { EntityNameMap } from "./naming.js";
|
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
// MetaDataLoader — loader with full load pipeline.
|
|
2
|
+
//
|
|
3
|
+
// Owns the load pipeline contract, lifecycle state, and accessor members.
|
|
4
|
+
// The load() method sequences MetaDataSource reads into one accumulating tree,
|
|
5
|
+
// using the parser's `intoRoot` param for merge-during-parse.
|
|
6
|
+
//
|
|
7
|
+
// Java MetaDataLoader lifecycle phases: UNINITIALIZED → LOADING → LOADED → ERROR.
|
|
8
|
+
// Reads call _checkStateForRead() to enforce "loaded before read."
|
|
9
|
+
|
|
10
|
+
import type { MetaData } from "../shared/meta-data.js";
|
|
11
|
+
import { MetaRoot } from "../shared/meta-root.js";
|
|
12
|
+
import { TypeId, TypeRegistry } from "../registry.js";
|
|
13
|
+
import { coreProviders } from "../core-types.js";
|
|
14
|
+
import { composeRegistry } from "../provider.js";
|
|
15
|
+
import { TYPE_METADATA, SUBTYPE_ROOT } from "../shared/base-types.js";
|
|
16
|
+
import { ParseError } from "../errors.js";
|
|
17
|
+
import { parseJson } from "../parser-json.js";
|
|
18
|
+
import { validateDataGridSortFields, validateFilterableHasIndex, validateOriginPaths, validateDataGridFilterValues } from "./validation-passes.js";
|
|
19
|
+
import { resolveDeferredSupers } from "../super-resolve.js";
|
|
20
|
+
import { validateSubtypeRules } from "../subtype-rules.js";
|
|
21
|
+
import { validateAttrSchema } from "../attr-schema-validate.js";
|
|
22
|
+
import type { MetaDataSource } from "./meta-data-source.js";
|
|
23
|
+
import type { ParseOptions, ParseResult } from "../parser-core.js";
|
|
24
|
+
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
// Public API types
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
|
|
29
|
+
/** Loader lifecycle state. Mirrors Java's MetaDataLoader phase enum. */
|
|
30
|
+
export type LoadingState = "uninitialized" | "loading" | "loaded" | "error";
|
|
31
|
+
|
|
32
|
+
export interface LoadOptions {
|
|
33
|
+
/** TypeRegistry to use; defaults to a fresh registry pre-populated via composeRegistry(coreProviders). */
|
|
34
|
+
registry?: TypeRegistry;
|
|
35
|
+
/** Freeze the loaded tree after parsing. Default true. */
|
|
36
|
+
freeze?: boolean;
|
|
37
|
+
/** Strict parsing mode — passed through to parser. Default false. */
|
|
38
|
+
strict?: boolean;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export interface LoadResult {
|
|
42
|
+
root: MetaRoot;
|
|
43
|
+
warnings: string[];
|
|
44
|
+
errors: Error[];
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// ---------------------------------------------------------------------------
|
|
48
|
+
// Synthetic empty root (used when all sources fail to parse)
|
|
49
|
+
// ---------------------------------------------------------------------------
|
|
50
|
+
|
|
51
|
+
function makeSyntheticRoot(): MetaRoot {
|
|
52
|
+
return new MetaRoot(new TypeId(TYPE_METADATA, SUBTYPE_ROOT), "");
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// ---------------------------------------------------------------------------
|
|
56
|
+
// MetaDataLoader class
|
|
57
|
+
// ---------------------------------------------------------------------------
|
|
58
|
+
|
|
59
|
+
export class MetaDataLoader {
|
|
60
|
+
private readonly _registry: TypeRegistry;
|
|
61
|
+
private readonly _freeze: boolean;
|
|
62
|
+
private readonly _strict: boolean;
|
|
63
|
+
|
|
64
|
+
private _state: LoadingState = "uninitialized";
|
|
65
|
+
private _root: MetaRoot | undefined;
|
|
66
|
+
|
|
67
|
+
constructor(opts?: LoadOptions) {
|
|
68
|
+
this._registry = opts?.registry ?? MetaDataLoader._defaultRegistry();
|
|
69
|
+
this._freeze = opts?.freeze !== false; // default true
|
|
70
|
+
this._strict = opts?.strict === true; // default false
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
private static _defaultRegistry(): TypeRegistry {
|
|
74
|
+
return composeRegistry(coreProviders);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// ---------------------------------------------------------------------------
|
|
78
|
+
// Lifecycle
|
|
79
|
+
// ---------------------------------------------------------------------------
|
|
80
|
+
|
|
81
|
+
/** Current loading state. */
|
|
82
|
+
get state(): LoadingState {
|
|
83
|
+
return this._state;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* The TypeRegistry this MetaDataLoader uses to look up type definitions.
|
|
88
|
+
* Either the one passed in via constructor, or the default registry
|
|
89
|
+
* pre-populated with core types via composeRegistry(coreProviders).
|
|
90
|
+
*
|
|
91
|
+
* Exposed for downstream consumers (codegen, runtime libraries) that
|
|
92
|
+
* need to introspect registered types.
|
|
93
|
+
*/
|
|
94
|
+
get registry(): TypeRegistry {
|
|
95
|
+
return this._registry;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Returns the loaded root MetaRoot.
|
|
100
|
+
* Accessible once load() has completed, in either "loaded" or "error" state.
|
|
101
|
+
* Throws only before or during loading (state "uninitialized" or "loading").
|
|
102
|
+
*/
|
|
103
|
+
get root(): MetaRoot {
|
|
104
|
+
this._checkStateForRead();
|
|
105
|
+
return this._root!;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Guards read accessors — throws only when loading has not yet completed
|
|
110
|
+
* (state "uninitialized" or "loading"). Both "loaded" and "error" states
|
|
111
|
+
* are valid for reads: load() always sets _root before returning.
|
|
112
|
+
*/
|
|
113
|
+
private _checkStateForRead(): void {
|
|
114
|
+
if (this._state === "uninitialized" || this._state === "loading") {
|
|
115
|
+
throw new Error(
|
|
116
|
+
`MetaDataLoader.root accessed before loading has completed (state: "${this._state}"). ` +
|
|
117
|
+
`Call load() first.`,
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// ---------------------------------------------------------------------------
|
|
123
|
+
// Convenience accessors (mirror Java's MetaDataLoader getChildOfType etc.)
|
|
124
|
+
// ---------------------------------------------------------------------------
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Returns the first child of the root with the given name, or undefined.
|
|
128
|
+
* Throws if not yet loaded.
|
|
129
|
+
*/
|
|
130
|
+
findByName(name: string): MetaData | undefined {
|
|
131
|
+
this._checkStateForRead();
|
|
132
|
+
return this._root!.ownChildByName(name);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Returns the first child of the root with the given (type, name), or undefined.
|
|
137
|
+
* Throws if not yet loaded.
|
|
138
|
+
*/
|
|
139
|
+
findByTypeAndName(type: string, name: string): MetaData | undefined {
|
|
140
|
+
this._checkStateForRead();
|
|
141
|
+
return this._root!.ownChildByTypeAndName(type, name);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Returns all direct children of the root with the given type.
|
|
146
|
+
* Throws if not yet loaded.
|
|
147
|
+
*/
|
|
148
|
+
childrenOfType(type: string): MetaData[] {
|
|
149
|
+
this._checkStateForRead();
|
|
150
|
+
return this._root!.ownChildrenOfType(type);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// ---------------------------------------------------------------------------
|
|
154
|
+
// parseSource — overridable format dispatch seam
|
|
155
|
+
// ---------------------------------------------------------------------------
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Parse one source's raw content into a ParseResult. The base loader handles
|
|
159
|
+
* JSON only; a non-JSON format throws. Subclasses override this seam to add
|
|
160
|
+
* formats — e.g. FileMetaDataLoader (in @metaobjectsdev/metadata/core) adds YAML.
|
|
161
|
+
* This keeps the browser-safe base loader free of the YAML parser.
|
|
162
|
+
*/
|
|
163
|
+
protected parseSource(
|
|
164
|
+
content: string,
|
|
165
|
+
source: MetaDataSource,
|
|
166
|
+
parseOpts: ParseOptions,
|
|
167
|
+
): ParseResult {
|
|
168
|
+
if (source.format === "json") {
|
|
169
|
+
return parseJson(content, parseOpts);
|
|
170
|
+
}
|
|
171
|
+
throw new Error(
|
|
172
|
+
`MetaDataLoader parses JSON only; format "${source.format}" for source ` +
|
|
173
|
+
`"${source.id}" requires FileMetaDataLoader (from @metaobjectsdev/metadata/core)`,
|
|
174
|
+
);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// ---------------------------------------------------------------------------
|
|
178
|
+
// load — async pipeline over MetaDataSource[]
|
|
179
|
+
// ---------------------------------------------------------------------------
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Load metadata from one or more MetaDataSource instances. Sources are read
|
|
183
|
+
* in order; each source's content is parsed and merged into the accumulating
|
|
184
|
+
* root using the parser's `intoRoot` mechanism.
|
|
185
|
+
*
|
|
186
|
+
* Source read failures are collected in errors[] — no throw. If all sources
|
|
187
|
+
* fail (read or parse), a synthetic empty root is returned.
|
|
188
|
+
*
|
|
189
|
+
* This is a one-shot pipeline — calling load() again on the same loader
|
|
190
|
+
* after it has completed (state "loaded" or "error") throws.
|
|
191
|
+
*/
|
|
192
|
+
async load(sources: MetaDataSource[]): Promise<LoadResult> {
|
|
193
|
+
// Disallow re-use after a completed load (matches Java MetaDataLoader's
|
|
194
|
+
// INITIALIZED-once contract). Loader is a one-shot pipeline.
|
|
195
|
+
if (this._state === "loaded" || this._state === "error") {
|
|
196
|
+
throw new Error(
|
|
197
|
+
"MetaDataLoader cannot be reused after load completes. Construct a new MetaDataLoader for additional loads.",
|
|
198
|
+
);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
this._state = "loading";
|
|
202
|
+
const warnings: string[] = [];
|
|
203
|
+
const errors: Error[] = [];
|
|
204
|
+
|
|
205
|
+
let root: MetaRoot | undefined;
|
|
206
|
+
|
|
207
|
+
// Parse all sources with super resolution DEFERRED so cross-file super
|
|
208
|
+
// refs work — one source may declare a super target that's defined in a
|
|
209
|
+
// source parsed later. A second pass (resolveDeferredSupers) resolves
|
|
210
|
+
// everything against the fully-merged root.
|
|
211
|
+
for (const source of sources) {
|
|
212
|
+
let content: string;
|
|
213
|
+
try {
|
|
214
|
+
content = await source.read();
|
|
215
|
+
} catch (err) {
|
|
216
|
+
errors.push(
|
|
217
|
+
err instanceof Error
|
|
218
|
+
? err
|
|
219
|
+
: new Error(`Failed to read source "${source.id}": ${String(err)}`),
|
|
220
|
+
);
|
|
221
|
+
continue;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// Build parser options, honoring exactOptionalPropertyTypes — only include
|
|
225
|
+
// sourceName / intoRoot keys when defined.
|
|
226
|
+
const parseOpts: Parameters<typeof parseJson>[1] = {
|
|
227
|
+
registry: this._registry,
|
|
228
|
+
strict: this._strict,
|
|
229
|
+
deferSuperResolution: true,
|
|
230
|
+
sourceName: source.id,
|
|
231
|
+
};
|
|
232
|
+
if (root !== undefined) parseOpts.intoRoot = root;
|
|
233
|
+
|
|
234
|
+
try {
|
|
235
|
+
const parseResult = this.parseSource(content, source, parseOpts);
|
|
236
|
+
warnings.push(...parseResult.warnings);
|
|
237
|
+
errors.push(...parseResult.errors);
|
|
238
|
+
root = parseResult.root;
|
|
239
|
+
} catch (err) {
|
|
240
|
+
errors.push(
|
|
241
|
+
err instanceof Error
|
|
242
|
+
? err
|
|
243
|
+
: new Error(`Parse error in "${source.id}": ${String(err)}`),
|
|
244
|
+
);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
// Second pass: resolve every deferred super ref against the full tree.
|
|
249
|
+
// Unresolved refs are always errors (matches the original eager-throw
|
|
250
|
+
// behavior — broken metadata is broken regardless of strict mode).
|
|
251
|
+
if (root !== undefined) {
|
|
252
|
+
const failures = resolveDeferredSupers(root);
|
|
253
|
+
for (const failure of failures) {
|
|
254
|
+
errors.push(
|
|
255
|
+
new ParseError(
|
|
256
|
+
`the SuperClass '${failure.ref}' does not exist (referenced by ${failure.nodeFqn})`,
|
|
257
|
+
{ code: "ERR_UNRESOLVED_SUPER" },
|
|
258
|
+
),
|
|
259
|
+
);
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
// Third pass: subtype rule validation (entity should have primary identity,
|
|
263
|
+
// value must not have one).
|
|
264
|
+
const ruleResult = validateSubtypeRules(root);
|
|
265
|
+
errors.push(...ruleResult.errors);
|
|
266
|
+
warnings.push(...ruleResult.warnings);
|
|
267
|
+
|
|
268
|
+
// Fourth pass: data-grid @defaultSortField cross-reference validation.
|
|
269
|
+
errors.push(...validateDataGridSortFields(root));
|
|
270
|
+
|
|
271
|
+
// Fifth pass: @filterable without index drift warning.
|
|
272
|
+
warnings.push(...validateFilterableHasIndex(root));
|
|
273
|
+
|
|
274
|
+
// Sixth pass: origin path validation — validates passthrough.@from,
|
|
275
|
+
// aggregate.@of, and .@via relationship chains.
|
|
276
|
+
errors.push(...validateOriginPaths(root));
|
|
277
|
+
|
|
278
|
+
// Seventh pass: @filter value validation — fields filterable + ops allowed per subtype.
|
|
279
|
+
errors.push(...validateDataGridFilterValues(root));
|
|
280
|
+
|
|
281
|
+
// Eighth pass: attribute-schema validation (Phase A3) — checks each
|
|
282
|
+
// node's @-attributes against its (type, subType) AttrSchema: required
|
|
283
|
+
// attrs present, declared attrs well-typed, allowedValues honored.
|
|
284
|
+
const attrSchemaResult = validateAttrSchema(root, this._registry);
|
|
285
|
+
errors.push(...attrSchemaResult.errors);
|
|
286
|
+
warnings.push(...attrSchemaResult.warnings);
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
// If nothing parsed successfully, synthesize an empty root so callers
|
|
290
|
+
// always get a valid MetaData. The state captures whether errors occurred.
|
|
291
|
+
if (root === undefined) {
|
|
292
|
+
root = makeSyntheticRoot();
|
|
293
|
+
this._state = errors.length > 0 ? "error" : "loaded";
|
|
294
|
+
} else {
|
|
295
|
+
this._state = "loaded";
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
// Freeze applies to BOTH paths — synthetic-root callers shouldn't get a
|
|
299
|
+
// mutable model just because their inputs failed.
|
|
300
|
+
if (this._freeze) {
|
|
301
|
+
root.freeze();
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
this._root = root;
|
|
305
|
+
return { root, warnings, errors };
|
|
306
|
+
}
|
|
307
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// MetaDataSource — the raw-document unit consumed by the loader pipeline.
|
|
2
|
+
//
|
|
3
|
+
// A loader (FileMetaDataLoader, later UrlMetaDataLoader) discovers/acquires
|
|
4
|
+
// sources; the MetaDataLoader pipeline calls read() on each. read() is async
|
|
5
|
+
// so file/URL sources can do I/O; InMemorySource resolves immediately.
|
|
6
|
+
|
|
7
|
+
/** Format of a source's content. Selects the parser. */
|
|
8
|
+
export type MetaDataFormat = "json" | "yaml";
|
|
9
|
+
|
|
10
|
+
/** One unit of raw metadata input. */
|
|
11
|
+
export interface MetaDataSource {
|
|
12
|
+
/** Human-readable identifier — used in parse-error messages (e.g. a filename). */
|
|
13
|
+
readonly id: string;
|
|
14
|
+
/** Content format hint — selects the parser. */
|
|
15
|
+
readonly format: MetaDataFormat;
|
|
16
|
+
/** Resolve the raw content. May perform I/O. */
|
|
17
|
+
read(): Promise<string>;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/** A metadata source backed by an in-memory string. */
|
|
21
|
+
export class InMemorySource implements MetaDataSource {
|
|
22
|
+
readonly id: string;
|
|
23
|
+
readonly format: MetaDataFormat;
|
|
24
|
+
private readonly _content: string;
|
|
25
|
+
|
|
26
|
+
constructor(content: string, opts?: { id?: string; format?: MetaDataFormat }) {
|
|
27
|
+
this._content = content;
|
|
28
|
+
this.id = opts?.id ?? "<in-memory>";
|
|
29
|
+
this.format = opts?.format ?? "json";
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
read(): Promise<string> {
|
|
33
|
+
return Promise.resolve(this._content);
|
|
34
|
+
}
|
|
35
|
+
}
|