@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
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
// registerCoreTypes() — Java's 7 base types (plus metadata wrapper) and their subtypes
|
|
2
|
+
import { TypeId, type AttrSchema, type ChildRule, type TypeDefinition, TypeRegistry } from "./registry.js";
|
|
3
|
+
import type { MetaDataTypeProvider } from "./provider.js";
|
|
4
|
+
import { dbProvider } from "./persistence/db/db-provider.js";
|
|
5
|
+
import { type DataType } from "./data-type.js";
|
|
6
|
+
import type { MetaData } from "./shared/meta-data.js";
|
|
7
|
+
import { MetaRoot } from "./shared/meta-root.js";
|
|
8
|
+
import { MetaObject } from "./core/object/meta-object.js";
|
|
9
|
+
import { MetaField } from "./core/field/meta-field.js";
|
|
10
|
+
import { attrClassFor, type NodeConstructor } from "./attr-class-map.js";
|
|
11
|
+
// Import the attr subclasses for their self-registration side effect (each
|
|
12
|
+
// registers its subtype → class into attr-class-map at module load), so
|
|
13
|
+
// attrClassFor resolves the right class below. The base MetaAttr (the fallback)
|
|
14
|
+
// registers itself; importing a subclass transitively loads meta-attr.ts.
|
|
15
|
+
import "./core/attr/meta-attr-stringarray.js";
|
|
16
|
+
import "./core/attr/meta-attr-filter.js";
|
|
17
|
+
import "./core/attr/meta-attr-properties.js";
|
|
18
|
+
import {
|
|
19
|
+
MetaValidator,
|
|
20
|
+
MetaRequiredValidator,
|
|
21
|
+
MetaLengthValidator,
|
|
22
|
+
MetaRegexValidator,
|
|
23
|
+
MetaNumericValidator,
|
|
24
|
+
MetaArrayValidator,
|
|
25
|
+
} from "./core/validator/meta-validator.js";
|
|
26
|
+
import { MetaView } from "./presentation/view/meta-view.js";
|
|
27
|
+
import {
|
|
28
|
+
MetaIdentity,
|
|
29
|
+
MetaPrimaryIdentity,
|
|
30
|
+
MetaSecondaryIdentity,
|
|
31
|
+
MetaReferenceIdentity,
|
|
32
|
+
} from "./core/identity/meta-identity.js";
|
|
33
|
+
import { MetaRelationship } from "./core/relationship/meta-relationship.js";
|
|
34
|
+
import { MetaLayout } from "./presentation/layout/meta-layout.js";
|
|
35
|
+
import { MetaSource } from "./persistence/source/meta-source.js";
|
|
36
|
+
import { MetaOrigin, MetaPassthroughOrigin, MetaAggregateOrigin } from "./persistence/origin/meta-origin.js";
|
|
37
|
+
import { commonFieldAttrs, currencyFieldAttr } from "./core/field/field-schema.js";
|
|
38
|
+
import { objectAttrs } from "./core/object/object-schema.js";
|
|
39
|
+
import { relationshipAttrs } from "./core/relationship/relationship-schema.js";
|
|
40
|
+
import { identityFieldsAttr, IDENTITY_ATTRS_MAP } from "./core/identity/identity-schema.js";
|
|
41
|
+
import { VALIDATOR_ATTRS_MAP } from "./core/validator/validator-schema.js";
|
|
42
|
+
import { currencyViewAttrs } from "./presentation/view/view-schema.js";
|
|
43
|
+
import { dataGridLayoutAttrs } from "./presentation/layout/layout-schema.js";
|
|
44
|
+
import { ORIGIN_ATTRS_MAP } from "./persistence/origin/origin-schema.js";
|
|
45
|
+
import {
|
|
46
|
+
TYPE_METADATA,
|
|
47
|
+
TYPE_OBJECT,
|
|
48
|
+
TYPE_FIELD,
|
|
49
|
+
TYPE_ATTR,
|
|
50
|
+
TYPE_VALIDATOR,
|
|
51
|
+
TYPE_VIEW,
|
|
52
|
+
TYPE_IDENTITY,
|
|
53
|
+
TYPE_RELATIONSHIP,
|
|
54
|
+
TYPE_LAYOUT,
|
|
55
|
+
TYPE_SOURCE,
|
|
56
|
+
TYPE_ORIGIN,
|
|
57
|
+
SUBTYPE_ROOT,
|
|
58
|
+
} from "./shared/base-types.js";
|
|
59
|
+
import { CHILD_RULE_WILDCARD } from "./shared/structural.js";
|
|
60
|
+
import { OBJECT_SUBTYPES, OBJECT_SUBTYPE_ENTITY } from "./core/object/object-constants.js";
|
|
61
|
+
import { FIELD_SUBTYPES, FIELD_SUBTYPE_CURRENCY } from "./core/field/field-constants.js";
|
|
62
|
+
import { ATTR_SUBTYPES } from "./core/attr/attr-constants.js";
|
|
63
|
+
import {
|
|
64
|
+
VALIDATOR_SUBTYPES,
|
|
65
|
+
VALIDATOR_SUBTYPE_REQUIRED,
|
|
66
|
+
VALIDATOR_SUBTYPE_LENGTH,
|
|
67
|
+
VALIDATOR_SUBTYPE_REGEX,
|
|
68
|
+
VALIDATOR_SUBTYPE_NUMERIC,
|
|
69
|
+
VALIDATOR_SUBTYPE_ARRAY,
|
|
70
|
+
} from "./core/validator/validator-constants.js";
|
|
71
|
+
import {
|
|
72
|
+
VIEW_SUBTYPES,
|
|
73
|
+
VIEW_SUBTYPE_CURRENCY,
|
|
74
|
+
} from "./presentation/view/view-constants.js";
|
|
75
|
+
import {
|
|
76
|
+
IDENTITY_SUBTYPES,
|
|
77
|
+
IDENTITY_SUBTYPE_PRIMARY,
|
|
78
|
+
IDENTITY_SUBTYPE_SECONDARY,
|
|
79
|
+
IDENTITY_SUBTYPE_REFERENCE,
|
|
80
|
+
} from "./core/identity/identity-constants.js";
|
|
81
|
+
import { RELATIONSHIP_SUBTYPES } from "./core/relationship/relationship-constants.js";
|
|
82
|
+
import { LAYOUT_SUBTYPES, LAYOUT_SUBTYPE_DATA_GRID } from "./presentation/layout/layout-constants.js";
|
|
83
|
+
import { SOURCE_SUBTYPES } from "./persistence/source/source-constants.js";
|
|
84
|
+
import {
|
|
85
|
+
ORIGIN_SUBTYPES,
|
|
86
|
+
ORIGIN_SUBTYPE_PASSTHROUGH,
|
|
87
|
+
ORIGIN_SUBTYPE_AGGREGATE,
|
|
88
|
+
} from "./persistence/origin/origin-constants.js";
|
|
89
|
+
|
|
90
|
+
// ---------------------------------------------------------------------------
|
|
91
|
+
// The per-(type, subType) attribute schemas live in per-concern *-schema.ts
|
|
92
|
+
// modules (e.g. core/field/field-schema.ts, persistence/origin/origin-schema.ts).
|
|
93
|
+
// This file keeps only the registration logic: the def() helper, the
|
|
94
|
+
// subtype→class dispatch maps, and registerCoreTypes() itself.
|
|
95
|
+
// ---------------------------------------------------------------------------
|
|
96
|
+
|
|
97
|
+
function wildcard(childType: string): ChildRule {
|
|
98
|
+
return {
|
|
99
|
+
childType,
|
|
100
|
+
childSubType: CHILD_RULE_WILDCARD,
|
|
101
|
+
childName: CHILD_RULE_WILDCARD,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function def(
|
|
106
|
+
type: string,
|
|
107
|
+
subType: string,
|
|
108
|
+
description: string,
|
|
109
|
+
childRules: ChildRule[],
|
|
110
|
+
NodeClass: NodeConstructor,
|
|
111
|
+
attributes: AttrSchema[] = [],
|
|
112
|
+
dataType?: DataType,
|
|
113
|
+
): TypeDefinition {
|
|
114
|
+
const definition: TypeDefinition = {
|
|
115
|
+
typeId: new TypeId(type, subType),
|
|
116
|
+
description,
|
|
117
|
+
factory: (typeId, name) => {
|
|
118
|
+
const node = new NodeClass(typeId, name);
|
|
119
|
+
if (dataType !== undefined) node.setDataType(dataType);
|
|
120
|
+
return node;
|
|
121
|
+
},
|
|
122
|
+
childRules,
|
|
123
|
+
attributes,
|
|
124
|
+
};
|
|
125
|
+
if (dataType !== undefined) definition.dataType = dataType;
|
|
126
|
+
return definition;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/** Map from validator subtype string → concrete node constructor. */
|
|
130
|
+
const VALIDATOR_CLASS_MAP = new Map<string, NodeConstructor>([
|
|
131
|
+
[VALIDATOR_SUBTYPE_REQUIRED, MetaRequiredValidator],
|
|
132
|
+
[VALIDATOR_SUBTYPE_LENGTH, MetaLengthValidator],
|
|
133
|
+
[VALIDATOR_SUBTYPE_REGEX, MetaRegexValidator],
|
|
134
|
+
[VALIDATOR_SUBTYPE_NUMERIC, MetaNumericValidator],
|
|
135
|
+
[VALIDATOR_SUBTYPE_ARRAY, MetaArrayValidator],
|
|
136
|
+
]);
|
|
137
|
+
|
|
138
|
+
/** Map from identity subtype string → concrete node constructor. */
|
|
139
|
+
const IDENTITY_CLASS_MAP = new Map<string, NodeConstructor>([
|
|
140
|
+
[IDENTITY_SUBTYPE_PRIMARY, MetaPrimaryIdentity],
|
|
141
|
+
[IDENTITY_SUBTYPE_SECONDARY, MetaSecondaryIdentity],
|
|
142
|
+
[IDENTITY_SUBTYPE_REFERENCE, MetaReferenceIdentity],
|
|
143
|
+
]);
|
|
144
|
+
|
|
145
|
+
/** Map from origin subtype string → concrete node constructor. */
|
|
146
|
+
const ORIGIN_CLASS_MAP = new Map<string, NodeConstructor>([
|
|
147
|
+
[ORIGIN_SUBTYPE_PASSTHROUGH, MetaPassthroughOrigin],
|
|
148
|
+
[ORIGIN_SUBTYPE_AGGREGATE, MetaAggregateOrigin],
|
|
149
|
+
]);
|
|
150
|
+
|
|
151
|
+
// ATTR_CLASS_MAP + attrClassFor live in the leaf module ./attr-class-map.ts
|
|
152
|
+
// (imported above) so MetaData.setAttr can resolve an attr subclass without
|
|
153
|
+
// importing this module — that import created a module-eval cycle. They are
|
|
154
|
+
// re-exported from the package index for the same public surface.
|
|
155
|
+
|
|
156
|
+
function registerCoreTypeDefs(registry: TypeRegistry): void {
|
|
157
|
+
// metadata — 1 subtype (the document root: metadata.root)
|
|
158
|
+
registry.register(
|
|
159
|
+
def(TYPE_METADATA, SUBTYPE_ROOT, "Root metadata document", [
|
|
160
|
+
wildcard(TYPE_OBJECT),
|
|
161
|
+
wildcard(TYPE_FIELD),
|
|
162
|
+
wildcard(TYPE_ATTR),
|
|
163
|
+
wildcard(TYPE_VALIDATOR),
|
|
164
|
+
], MetaRoot),
|
|
165
|
+
);
|
|
166
|
+
|
|
167
|
+
// object — 4 subtypes
|
|
168
|
+
const objectRules = [
|
|
169
|
+
wildcard(TYPE_FIELD),
|
|
170
|
+
wildcard(TYPE_IDENTITY),
|
|
171
|
+
wildcard(TYPE_RELATIONSHIP),
|
|
172
|
+
wildcard(TYPE_VALIDATOR),
|
|
173
|
+
wildcard(TYPE_LAYOUT),
|
|
174
|
+
wildcard(TYPE_SOURCE),
|
|
175
|
+
wildcard(TYPE_ATTR),
|
|
176
|
+
];
|
|
177
|
+
for (const subType of OBJECT_SUBTYPES) {
|
|
178
|
+
registry.register(
|
|
179
|
+
def(TYPE_OBJECT, subType, `Object/entity (${subType})`, objectRules, MetaObject, [...objectAttrs]),
|
|
180
|
+
);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// field — 13 subtypes
|
|
184
|
+
const fieldRules = [
|
|
185
|
+
wildcard(TYPE_VALIDATOR),
|
|
186
|
+
wildcard(TYPE_VIEW),
|
|
187
|
+
wildcard(TYPE_ATTR),
|
|
188
|
+
wildcard(TYPE_ORIGIN),
|
|
189
|
+
];
|
|
190
|
+
for (const subType of FIELD_SUBTYPES) {
|
|
191
|
+
// field.currency additionally carries @currency; all other field subtypes
|
|
192
|
+
// share the common codegen/filter attrs only.
|
|
193
|
+
const fieldAttrs =
|
|
194
|
+
subType === FIELD_SUBTYPE_CURRENCY
|
|
195
|
+
? [...commonFieldAttrs, { ...currencyFieldAttr }]
|
|
196
|
+
: [...commonFieldAttrs];
|
|
197
|
+
registry.register(
|
|
198
|
+
def(TYPE_FIELD, subType, `Field of type ${subType}`, fieldRules, MetaField, fieldAttrs,
|
|
199
|
+
new MetaField(new TypeId(TYPE_FIELD, subType), "").dataType),
|
|
200
|
+
);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// attr — 9 subtypes, no children allowed. Each subtype's class owns its
|
|
204
|
+
// dataType (resolved by this.subType); we read it off a probe instance so the
|
|
205
|
+
// TypeDefinition.dataType contract (registry.find(...).dataType) still holds.
|
|
206
|
+
for (const subType of ATTR_SUBTYPES) {
|
|
207
|
+
const AttrClass = attrClassFor(subType);
|
|
208
|
+
const probeDataType = new AttrClass(new TypeId(TYPE_ATTR, subType), "").dataType;
|
|
209
|
+
registry.register(
|
|
210
|
+
def(TYPE_ATTR, subType, `Attribute of type ${subType}`, [], AttrClass, [], probeDataType),
|
|
211
|
+
);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
// validator — 6 subtypes (base + 5 named); dispatch to subtype-specific class.
|
|
215
|
+
// Subtype→class dispatch for TYPE_VALIDATOR (formerly handled by metaOf()):
|
|
216
|
+
// required → MetaRequiredValidator, length → MetaLengthValidator,
|
|
217
|
+
// regex → MetaRegexValidator, numeric → MetaNumericValidator,
|
|
218
|
+
// array → MetaArrayValidator, default (base) → MetaValidator.
|
|
219
|
+
// Attr schemas: MetaValidator (base) + length/numeric/array read @min/@max via
|
|
220
|
+
// this.ownAttr(VALIDATOR_ATTR_MIN/MAX); regex also reads @pattern via this.ownAttr().
|
|
221
|
+
// required has no extra attrs.
|
|
222
|
+
const validatorRules = [wildcard(TYPE_ATTR)];
|
|
223
|
+
for (const subType of VALIDATOR_SUBTYPES) {
|
|
224
|
+
const NodeClass = VALIDATOR_CLASS_MAP.get(subType) ?? MetaValidator;
|
|
225
|
+
const validatorAttrs = VALIDATOR_ATTRS_MAP.get(subType) ?? [];
|
|
226
|
+
registry.register(
|
|
227
|
+
def(TYPE_VALIDATOR, subType, `Validator (${subType})`, validatorRules, NodeClass, validatorAttrs),
|
|
228
|
+
);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
// view — N subtypes. Each view permits only attr children (Java parity:
|
|
232
|
+
// MetaView only attaches to fields, never aggregates child views).
|
|
233
|
+
// Only view.currency carries a documented attr (@locale); others have none.
|
|
234
|
+
for (const subType of VIEW_SUBTYPES) {
|
|
235
|
+
const viewAttrs = subType === VIEW_SUBTYPE_CURRENCY ? [...currencyViewAttrs] : [];
|
|
236
|
+
registry.register(
|
|
237
|
+
def(TYPE_VIEW, subType, `View (${subType})`, [wildcard(TYPE_ATTR)], MetaView, viewAttrs),
|
|
238
|
+
);
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
// layout — object-level UI surfaces (data grids, forms, tabs, cards).
|
|
242
|
+
// Each subtype permits only attr children — like views, layouts are config carriers.
|
|
243
|
+
for (const subType of LAYOUT_SUBTYPES) {
|
|
244
|
+
const layoutAttrs = subType === LAYOUT_SUBTYPE_DATA_GRID ? [...dataGridLayoutAttrs] : [];
|
|
245
|
+
registry.register(
|
|
246
|
+
def(TYPE_LAYOUT, subType, `Layout (${subType})`, [wildcard(TYPE_ATTR)], MetaLayout, layoutAttrs),
|
|
247
|
+
);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
// source — declares where an object's data lives (dbTable, dbView, ...).
|
|
251
|
+
// Only attr children; sources carry only configuration, never nested structure.
|
|
252
|
+
// DB-domain attrs (@name) are added by dbProvider via TypeRegistry.extend.
|
|
253
|
+
for (const subType of SOURCE_SUBTYPES) {
|
|
254
|
+
registry.register(
|
|
255
|
+
def(TYPE_SOURCE, subType, `Source (${subType})`, [wildcard(TYPE_ATTR)], MetaSource, []),
|
|
256
|
+
);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
// origin — field-level provenance. Only attr children.
|
|
260
|
+
// Subtype→class dispatch (mirrors validator / identity patterns):
|
|
261
|
+
// passthrough → MetaPassthroughOrigin, aggregate → MetaAggregateOrigin,
|
|
262
|
+
// base (and any unmapped subtype) → MetaOrigin.
|
|
263
|
+
for (const subType of ORIGIN_SUBTYPES) {
|
|
264
|
+
const NodeClass = ORIGIN_CLASS_MAP.get(subType) ?? MetaOrigin;
|
|
265
|
+
const originAttrs = ORIGIN_ATTRS_MAP.get(subType) ?? [];
|
|
266
|
+
registry.register(
|
|
267
|
+
def(TYPE_ORIGIN, subType, `Origin (${subType})`, [wildcard(TYPE_ATTR)], NodeClass, originAttrs),
|
|
268
|
+
);
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
// identity — 2 subtypes (no base; Java doesn't register one).
|
|
272
|
+
// Subtype→class dispatch for TYPE_IDENTITY (formerly handled by metaOf()):
|
|
273
|
+
// primary → MetaPrimaryIdentity, secondary → MetaSecondaryIdentity,
|
|
274
|
+
// default → MetaIdentity (fallback, not currently registered).
|
|
275
|
+
for (const subType of IDENTITY_SUBTYPES) {
|
|
276
|
+
const NodeClass = IDENTITY_CLASS_MAP.get(subType) ?? MetaIdentity;
|
|
277
|
+
const idAttrs = IDENTITY_ATTRS_MAP.get(subType) ?? [{ ...identityFieldsAttr }];
|
|
278
|
+
registry.register(
|
|
279
|
+
def(TYPE_IDENTITY, subType, `Identity (${subType})`, [wildcard(TYPE_ATTR)], NodeClass, idAttrs),
|
|
280
|
+
);
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
// relationship — 4 subtypes
|
|
284
|
+
for (const subType of RELATIONSHIP_SUBTYPES) {
|
|
285
|
+
registry.register(
|
|
286
|
+
def(
|
|
287
|
+
TYPE_RELATIONSHIP,
|
|
288
|
+
subType,
|
|
289
|
+
`Relationship (${subType})`,
|
|
290
|
+
[wildcard(TYPE_ATTR)],
|
|
291
|
+
MetaRelationship,
|
|
292
|
+
[...relationshipAttrs],
|
|
293
|
+
),
|
|
294
|
+
);
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
// Default subTypes for YAML authoring sugar: a bare `metadata:` / `object:`
|
|
298
|
+
// key resolves to these. `metadata` has exactly one subtype (root) so the
|
|
299
|
+
// default is unambiguous; `object` defaults to `entity`, the common case.
|
|
300
|
+
// Other types (field, validator, ...) have no default — authoring always
|
|
301
|
+
// writes the full `type.subType`.
|
|
302
|
+
registry.setDefaultSubType(TYPE_METADATA, SUBTYPE_ROOT);
|
|
303
|
+
registry.setDefaultSubType(TYPE_OBJECT, OBJECT_SUBTYPE_ENTITY);
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
/**
|
|
307
|
+
* The core metaobjects metamodel — the seven base types (object, field, attr,
|
|
308
|
+
* validator, view, identity, relationship) plus layout / source / origin and
|
|
309
|
+
* the metadata root. One provider per package: this is `@metaobjectsdev/metadata`'s.
|
|
310
|
+
*/
|
|
311
|
+
export const coreTypesProvider: MetaDataTypeProvider = {
|
|
312
|
+
id: "metaobjects-core-types",
|
|
313
|
+
description: "Core metaobjects metamodel types and subtypes.",
|
|
314
|
+
registerTypes(registry: TypeRegistry): void {
|
|
315
|
+
registerCoreTypeDefs(registry);
|
|
316
|
+
},
|
|
317
|
+
};
|
|
318
|
+
|
|
319
|
+
/** The default provider bundle — core metamodel types plus DB-domain attrs.
|
|
320
|
+
* Spread it to add more: `[...coreProviders, mine]`. */
|
|
321
|
+
export const coreProviders: readonly MetaDataTypeProvider[] = [coreTypesProvider, dbProvider];
|
|
322
|
+
|
|
323
|
+
/**
|
|
324
|
+
* Register the core metamodel into an existing registry. Thin convenience
|
|
325
|
+
* wrapper over `coreTypesProvider`; prefer `composeRegistry(coreProviders)`.
|
|
326
|
+
*/
|
|
327
|
+
export function registerCoreTypes(registry: TypeRegistry): void {
|
|
328
|
+
coreTypesProvider.registerTypes(registry);
|
|
329
|
+
}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
// Data converter — convert a raw parsed value to a *known* DataType.
|
|
2
|
+
//
|
|
3
|
+
// The TypeScript counterpart of Java's DataConverter.toTypeSafe: directional
|
|
4
|
+
// (toward a type already known from the registered schema), never inferential.
|
|
5
|
+
// Replaces the deleted value-coerce.ts. See
|
|
6
|
+
// docs/superpowers/specs/2026-05-17-data-converter-design.md.
|
|
7
|
+
|
|
8
|
+
import type { AttrValue } from "./shared/meta-data.js";
|
|
9
|
+
import {
|
|
10
|
+
type DataType,
|
|
11
|
+
DATA_TYPE_BOOLEAN,
|
|
12
|
+
DATA_TYPE_INT,
|
|
13
|
+
DATA_TYPE_LONG,
|
|
14
|
+
DATA_TYPE_DOUBLE,
|
|
15
|
+
DATA_TYPE_OBJECT,
|
|
16
|
+
} from "./data-type.js";
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Convert a raw parsed value to a valid AttrValue for a *known* DataType.
|
|
20
|
+
* Throws for input that cannot be a valid attr value (null / undefined /
|
|
21
|
+
* nested array). A plain object reaching a scalar branch is stringified by
|
|
22
|
+
* `String()` — callers that must reject objects use `toAttrValue`.
|
|
23
|
+
*/
|
|
24
|
+
export function convertToDataType(dataType: DataType, raw: unknown): AttrValue {
|
|
25
|
+
rejectNullish(raw, "convertToDataType");
|
|
26
|
+
|
|
27
|
+
// An array value → string[] regardless of the scalar DataType — the only
|
|
28
|
+
// array shape AttrValue admits (e.g. a stringArray attr).
|
|
29
|
+
if (Array.isArray(raw)) return toStringArray(raw);
|
|
30
|
+
|
|
31
|
+
switch (dataType) {
|
|
32
|
+
case DATA_TYPE_BOOLEAN:
|
|
33
|
+
return toBoolean(raw);
|
|
34
|
+
case DATA_TYPE_INT:
|
|
35
|
+
case DATA_TYPE_LONG:
|
|
36
|
+
return toInteger(raw);
|
|
37
|
+
case DATA_TYPE_DOUBLE:
|
|
38
|
+
return toDouble(raw);
|
|
39
|
+
case DATA_TYPE_OBJECT:
|
|
40
|
+
// Object-typed attrs (filter / properties) store the object verbatim.
|
|
41
|
+
// A non-object (e.g. a legacy JSON string) is returned as-is so the
|
|
42
|
+
// attr-schema pass can reject it with ERR_BAD_ATTR_VALUE.
|
|
43
|
+
return (typeof raw === "object" && raw !== null)
|
|
44
|
+
? (raw as AttrValue)
|
|
45
|
+
: String(raw);
|
|
46
|
+
// string, date (unreachable for attrs) — string form
|
|
47
|
+
default:
|
|
48
|
+
return String(raw);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Make a raw value a valid AttrValue with NO known type — for an undeclared
|
|
54
|
+
* `@`-attr. No type-directed conversion and no inference: scalars are stored
|
|
55
|
+
* as-is (a numeric-looking string stays a string), arrays become string[],
|
|
56
|
+
* objects/null/undefined are rejected.
|
|
57
|
+
*/
|
|
58
|
+
export function toAttrValue(raw: unknown): AttrValue {
|
|
59
|
+
rejectNullish(raw, "toAttrValue");
|
|
60
|
+
if (Array.isArray(raw)) return toStringArray(raw);
|
|
61
|
+
if (typeof raw === "string" || typeof raw === "number" || typeof raw === "boolean") {
|
|
62
|
+
return raw;
|
|
63
|
+
}
|
|
64
|
+
throw new Error(`toAttrValue: ${typeof raw} is not a valid attr value`);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// --- helpers ---------------------------------------------------------------
|
|
68
|
+
|
|
69
|
+
function rejectNullish(raw: unknown, fn: string): void {
|
|
70
|
+
if (raw === null) throw new Error(`${fn}: null is not a valid attr value`);
|
|
71
|
+
if (raw === undefined) throw new Error(`${fn}: undefined is not a valid attr value`);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function toBoolean(raw: unknown): AttrValue {
|
|
75
|
+
if (typeof raw === "boolean") return raw;
|
|
76
|
+
if (raw === "true") return true;
|
|
77
|
+
if (raw === "false") return false;
|
|
78
|
+
// Not boolean-shaped — best-effort: leave it for attr-schema validation.
|
|
79
|
+
return raw as AttrValue;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function toInteger(raw: unknown): AttrValue {
|
|
83
|
+
if (typeof raw === "number") {
|
|
84
|
+
if (Number.isInteger(raw) && !Number.isSafeInteger(raw)) return String(raw);
|
|
85
|
+
return raw;
|
|
86
|
+
}
|
|
87
|
+
if (typeof raw === "string") {
|
|
88
|
+
// Strict integer string (e.g. "42", "-7").
|
|
89
|
+
if (/^-?\d+$/.test(raw)) {
|
|
90
|
+
const parsed = Number(raw);
|
|
91
|
+
// Beyond MAX_SAFE_INTEGER → keep verbatim to preserve precision.
|
|
92
|
+
return Number.isSafeInteger(parsed) ? parsed : raw;
|
|
93
|
+
}
|
|
94
|
+
// Float-format strings that represent a whole number (e.g. "3.0", "12.0").
|
|
95
|
+
// Metadata files sometimes store int attr values in float notation; convert
|
|
96
|
+
// to the integer value to preserve byte-identical behavior with the old
|
|
97
|
+
// coerceAttrValue, which parsed these via the double pattern.
|
|
98
|
+
const parsed = Number(raw);
|
|
99
|
+
if (Number.isFinite(parsed) && Number.isInteger(parsed) && Number.isSafeInteger(parsed)) {
|
|
100
|
+
return parsed;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return raw as AttrValue;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function toDouble(raw: unknown): AttrValue {
|
|
107
|
+
if (typeof raw === "number") return raw;
|
|
108
|
+
if (typeof raw === "string") {
|
|
109
|
+
const parsed = Number(raw);
|
|
110
|
+
if (raw.trim() !== "" && Number.isFinite(parsed)) return parsed;
|
|
111
|
+
}
|
|
112
|
+
return raw as AttrValue;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function toStringArray(arr: unknown[]): string[] {
|
|
116
|
+
return arr.map((el, i) => {
|
|
117
|
+
if (Array.isArray(el)) {
|
|
118
|
+
throw new Error(`array element at index ${i} is a nested array — not supported`);
|
|
119
|
+
}
|
|
120
|
+
if (el === null || el === undefined) {
|
|
121
|
+
throw new Error(`array element at index ${i} is null/undefined`);
|
|
122
|
+
}
|
|
123
|
+
return String(el);
|
|
124
|
+
});
|
|
125
|
+
}
|
package/src/data-type.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// DataType — a coarse, cross-cutting value-type classification.
|
|
2
|
+
//
|
|
3
|
+
// Java-`DataTypes` parity: a small closed set that both fields and attributes
|
|
4
|
+
// classify into (a `MetaField`/`MetaAttr` subtype maps to exactly one DataType).
|
|
5
|
+
// Registry-driven — a (type, subType)'s DataType is declared on its
|
|
6
|
+
// TypeDefinition, never in a central switch here. This module stays small and
|
|
7
|
+
// stable: just the union, its constants, and the DataTypeAware interface.
|
|
8
|
+
|
|
9
|
+
export const DATA_TYPE_BOOLEAN = "boolean";
|
|
10
|
+
export const DATA_TYPE_INT = "int";
|
|
11
|
+
export const DATA_TYPE_LONG = "long";
|
|
12
|
+
export const DATA_TYPE_DOUBLE = "double";
|
|
13
|
+
export const DATA_TYPE_STRING = "string";
|
|
14
|
+
export const DATA_TYPE_DATE = "date";
|
|
15
|
+
export const DATA_TYPE_OBJECT = "object";
|
|
16
|
+
|
|
17
|
+
/** The closed set of coarse value types. */
|
|
18
|
+
export const DATA_TYPES = [
|
|
19
|
+
DATA_TYPE_BOOLEAN,
|
|
20
|
+
DATA_TYPE_INT,
|
|
21
|
+
DATA_TYPE_LONG,
|
|
22
|
+
DATA_TYPE_DOUBLE,
|
|
23
|
+
DATA_TYPE_STRING,
|
|
24
|
+
DATA_TYPE_DATE,
|
|
25
|
+
DATA_TYPE_OBJECT,
|
|
26
|
+
] as const;
|
|
27
|
+
|
|
28
|
+
export type DataType = (typeof DATA_TYPES)[number];
|
|
29
|
+
|
|
30
|
+
/** Implemented by nodes that carry a typed value — MetaField and MetaAttr. */
|
|
31
|
+
export interface DataTypeAware {
|
|
32
|
+
readonly dataType: DataType;
|
|
33
|
+
}
|
package/src/errors.ts
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
// Typed error classes for the metadata parser.
|
|
2
|
+
|
|
3
|
+
/** Stable, language-neutral error codes — mirrors fixtures/conformance/ERROR-CODES.json. */
|
|
4
|
+
// NOTE: The following codes are forward-declared (no emitting site in the current
|
|
5
|
+
// TS parser/loader — the condition is not yet detected):
|
|
6
|
+
// - ERR_DUPLICATE_NAME: parser silently reuses existing same-name nodes (find-or-create).
|
|
7
|
+
// - ERR_MISSING_SUBTYPE: missing subType is resolved to the registry default, never an error.
|
|
8
|
+
// - ERR_INVALID_SUBTYPE_CHILD: no child-rule validation pass exists yet.
|
|
9
|
+
// Cross-language conformance consumers should not expect these codes from the TS adapter.
|
|
10
|
+
export const ERROR_CODES = [
|
|
11
|
+
"ERR_TOP_LEVEL_NOT_OBJECT",
|
|
12
|
+
"ERR_UNKNOWN_TYPE",
|
|
13
|
+
"ERR_UNKNOWN_SUBTYPE",
|
|
14
|
+
"ERR_MISSING_SUBTYPE",
|
|
15
|
+
"ERR_DUPLICATE_NAME",
|
|
16
|
+
"ERR_UNRESOLVED_SUPER",
|
|
17
|
+
"ERR_INVALID_SUBTYPE_CHILD",
|
|
18
|
+
"ERR_UNKNOWN_ATTR",
|
|
19
|
+
"ERR_BAD_ATTR_VALUE",
|
|
20
|
+
"ERR_BAD_DEFAULT_SORT_FIELD",
|
|
21
|
+
"ERR_PROVIDER_DEPENDENCY_CYCLE",
|
|
22
|
+
"ERR_PROVIDER_DUPLICATE_ID",
|
|
23
|
+
"ERR_PROVIDER_MISSING_DEPENDENCY",
|
|
24
|
+
"ERR_PROVIDER_ATTR_CONFLICT",
|
|
25
|
+
"ERR_MALFORMED_JSON",
|
|
26
|
+
"ERR_MISSING_REQUIRED_ATTR",
|
|
27
|
+
"ERR_SUBTYPE_RULE_VIOLATION",
|
|
28
|
+
"ERR_OVERLAY_NO_TARGET",
|
|
29
|
+
"ERR_MALFORMED_YAML",
|
|
30
|
+
"ERR_INVALID_ORIGIN",
|
|
31
|
+
"ERR_BAD_ATTR_FILTER",
|
|
32
|
+
"ERR_UNKNOWN",
|
|
33
|
+
] as const;
|
|
34
|
+
|
|
35
|
+
export type ErrorCode = (typeof ERROR_CODES)[number];
|
|
36
|
+
|
|
37
|
+
export class ParseError extends Error {
|
|
38
|
+
readonly source: string | undefined;
|
|
39
|
+
readonly path: string | undefined; // logical path within the JSON, e.g. "metadata.children[2].field"
|
|
40
|
+
readonly code: ErrorCode | undefined;
|
|
41
|
+
|
|
42
|
+
constructor(
|
|
43
|
+
message: string,
|
|
44
|
+
opts?: { source?: string; path?: string; code?: ErrorCode },
|
|
45
|
+
) {
|
|
46
|
+
super(message);
|
|
47
|
+
this.name = "ParseError";
|
|
48
|
+
this.source = opts?.source;
|
|
49
|
+
this.path = opts?.path;
|
|
50
|
+
this.code = opts?.code;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Error class for metamodel-level errors that are not parse errors — e.g.
|
|
56
|
+
* provider composition failures (dependency cycles, missing dependencies,
|
|
57
|
+
* attribute conflicts). Carries the same stable `.code` field as ParseError
|
|
58
|
+
* for cross-language conformance.
|
|
59
|
+
*/
|
|
60
|
+
export class MetaModelError extends Error {
|
|
61
|
+
readonly code: ErrorCode | undefined;
|
|
62
|
+
|
|
63
|
+
constructor(message: string, opts?: { code?: ErrorCode }) {
|
|
64
|
+
super(message);
|
|
65
|
+
this.name = "MetaModelError";
|
|
66
|
+
this.code = opts?.code;
|
|
67
|
+
}
|
|
68
|
+
}
|