@metaobjectsdev/metadata 0.9.0 → 0.11.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/dist/attr-schema-validate.d.ts +1 -1
- package/dist/attr-schema-validate.d.ts.map +1 -1
- package/dist/attr-schema-validate.js +96 -11
- package/dist/attr-schema-validate.js.map +1 -1
- 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/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/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/identity/identity-constants.d.ts.map +1 -1
- package/dist/core/identity/identity-constants.js +3 -0
- package/dist/core/identity/identity-constants.js.map +1 -1
- 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 +93 -0
- package/dist/core/identity/identity-definition.embedded.js.map +1 -0
- package/dist/core/identity/meta-identity.d.ts.map +1 -1
- package/dist/core/identity/meta-identity.js +8 -1
- package/dist/core/identity/meta-identity.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/validator/validator-constants.d.ts +14 -1
- package/dist/core/validator/validator-constants.d.ts.map +1 -1
- package/dist/core/validator/validator-constants.js +20 -1
- package/dist/core/validator/validator-constants.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 +255 -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-types.d.ts +5 -2
- package/dist/core-types.d.ts.map +1 -1
- package/dist/core-types.js +285 -116
- package/dist/core-types.js.map +1 -1
- package/dist/errors.d.ts +3 -3
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +87 -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 +57 -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 +519 -34
- package/dist/loader/validation-passes.js.map +1 -1
- package/dist/loader/validation-registry.d.ts +10 -0
- package/dist/loader/validation-registry.d.ts.map +1 -0
- package/dist/loader/validation-registry.js +84 -0
- package/dist/loader/validation-registry.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 +84 -9
- package/dist/parser-core.js.map +1 -1
- package/dist/persistence/db/db-constants.d.ts +10 -0
- package/dist/persistence/db/db-constants.d.ts.map +1 -1
- package/dist/persistence/db/db-constants.js +14 -0
- package/dist/persistence/db/db-constants.js.map +1 -1
- 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 +227 -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/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/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/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/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 +184 -0
- package/dist/provider-data.d.ts.map +1 -0
- package/dist/provider-data.js +271 -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 +76 -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/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/validate-max-occurs.d.ts +5 -0
- package/dist/validate-max-occurs.d.ts.map +1 -0
- package/dist/validate-max-occurs.js +28 -0
- package/dist/validate-max-occurs.js.map +1 -0
- package/dist/validation-types.d.ts +36 -0
- package/dist/validation-types.d.ts.map +1 -0
- package/dist/validation-types.js +7 -0
- package/dist/validation-types.js.map +1 -0
- package/package.json +33 -22
- package/src/attr-schema-validate.ts +108 -8
- 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-constants.ts +4 -0
- package/src/core/identity/identity-definition.embedded.ts +100 -0
- package/src/core/identity/meta-identity.ts +8 -1
- 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-constants.ts +22 -1
- package/src/core/validator/validator-definition.embedded.ts +262 -0
- package/src/core/yaml-desugar.ts +96 -7
- package/src/core-types.ts +314 -150
- package/src/errors.ts +89 -2
- 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 +78 -7
- package/src/loader/shortcuts.ts +2 -2
- package/src/loader/validation-passes.ts +690 -34
- package/src/loader/validation-registry.ts +93 -0
- 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 +96 -9
- package/src/persistence/db/db-constants.ts +16 -0
- package/src/persistence/db/db-definition.embedded.ts +234 -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 +463 -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 +106 -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/validate-max-occurs.ts +39 -0
- package/src/validation-types.ts +57 -0
- package/dist/core/documentation/doc-schema.d.ts +0 -8
- package/dist/core/documentation/doc-schema.d.ts.map +0 -1
- package/dist/core/documentation/doc-schema.js +0 -53
- package/dist/core/documentation/doc-schema.js.map +0 -1
- package/dist/core/field/field-schema.d.ts +0 -22
- package/dist/core/field/field-schema.d.ts.map +0 -1
- package/dist/core/field/field-schema.js +0 -171
- package/dist/core/field/field-schema.js.map +0 -1
- package/dist/core/identity/identity-schema.d.ts +0 -6
- package/dist/core/identity/identity-schema.d.ts.map +0 -1
- package/dist/core/identity/identity-schema.js +0 -55
- package/dist/core/identity/identity-schema.js.map +0 -1
- package/dist/core/object/object-schema.d.ts +0 -4
- package/dist/core/object/object-schema.d.ts.map +0 -1
- package/dist/core/object/object-schema.js +0 -28
- package/dist/core/object/object-schema.js.map +0 -1
- package/dist/core/relationship/relationship-schema.d.ts +0 -4
- package/dist/core/relationship/relationship-schema.d.ts.map +0 -1
- package/dist/core/relationship/relationship-schema.js +0 -51
- package/dist/core/relationship/relationship-schema.js.map +0 -1
- package/dist/core/validator/validator-schema.d.ts +0 -4
- package/dist/core/validator/validator-schema.d.ts.map +0 -1
- package/dist/core/validator/validator-schema.js +0 -38
- package/dist/core/validator/validator-schema.js.map +0 -1
- package/dist/persistence/db/db-schema.d.ts +0 -14
- package/dist/persistence/db/db-schema.d.ts.map +0 -1
- package/dist/persistence/db/db-schema.js +0 -35
- package/dist/persistence/db/db-schema.js.map +0 -1
- package/dist/persistence/origin/origin-schema.d.ts +0 -4
- package/dist/persistence/origin/origin-schema.d.ts.map +0 -1
- package/dist/persistence/origin/origin-schema.js +0 -59
- package/dist/persistence/origin/origin-schema.js.map +0 -1
- package/dist/persistence/source/source-schema.d.ts +0 -4
- package/dist/persistence/source/source-schema.d.ts.map +0 -1
- package/dist/persistence/source/source-schema.js +0 -98
- package/dist/persistence/source/source-schema.js.map +0 -1
- package/dist/presentation/layout/layout-schema.d.ts +0 -4
- package/dist/presentation/layout/layout-schema.d.ts.map +0 -1
- package/dist/presentation/layout/layout-schema.js +0 -46
- package/dist/presentation/layout/layout-schema.js.map +0 -1
- package/dist/presentation/view/view-schema.d.ts +0 -4
- package/dist/presentation/view/view-schema.d.ts.map +0 -1
- package/dist/presentation/view/view-schema.js +0 -15
- package/dist/presentation/view/view-schema.js.map +0 -1
- package/dist/template/template-schema.d.ts +0 -3
- package/dist/template/template-schema.d.ts.map +0 -1
- package/dist/template/template-schema.js +0 -173
- package/dist/template/template-schema.js.map +0 -1
- 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,95 @@
|
|
|
1
|
+
// AUTO-GENERATED by scripts/generate-embedded-metamodel.ts — DO NOT EDIT.
|
|
2
|
+
// Canonical source: repo-root spec/metamodel/origin.json
|
|
3
|
+
// Regenerate: bun run scripts/generate-embedded-metamodel.ts
|
|
4
|
+
//
|
|
5
|
+
// Embeds the canonical FR-033 ProviderDefinition so the provider can register
|
|
6
|
+
// itself wherever the on-disk spec/ tree is unavailable (bundled builds).
|
|
7
|
+
import type { ProviderDefinition } from "../../provider-data.js";
|
|
8
|
+
|
|
9
|
+
export const ORIGIN_DEFINITION: ProviderDefinition = {
|
|
10
|
+
"provider": "metaobjects-core-types",
|
|
11
|
+
"types": [
|
|
12
|
+
{
|
|
13
|
+
"type": "origin",
|
|
14
|
+
"subType": "base",
|
|
15
|
+
"description": "Abstract base origin — the shared root subtype for field-level provenance. A field carrying any origin.* is derived ⇒ read-only wherever it lives. The base carries no attrs of its own; concrete subtypes add their provenance attrs."
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"type": "origin",
|
|
19
|
+
"subType": "passthrough",
|
|
20
|
+
"description": "A cross-entity field reference: this projection field passes a source entity's value straight through (@from), optionally reached via a relationship path (@via).",
|
|
21
|
+
"children": [
|
|
22
|
+
{
|
|
23
|
+
"type": "attr",
|
|
24
|
+
"subType": "string",
|
|
25
|
+
"name": "from",
|
|
26
|
+
"min": 1,
|
|
27
|
+
"max": 1,
|
|
28
|
+
"description": "Dotted Entity.field reference identifying the source value this projection field passes through (e.g. 'Program.title')."
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"type": "attr",
|
|
32
|
+
"subType": "string",
|
|
33
|
+
"name": "via",
|
|
34
|
+
"min": 0,
|
|
35
|
+
"max": 1,
|
|
36
|
+
"description": "Optional dotted relationship path used to reach the source entity (e.g. 'Program.weeks')."
|
|
37
|
+
}
|
|
38
|
+
]
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"type": "origin",
|
|
42
|
+
"subType": "aggregate",
|
|
43
|
+
"description": "A count/sum/avg/min/max (@agg) computed over a column (@of) reached along a relationship path (@via) from the base entity.",
|
|
44
|
+
"rules": "@via may be omitted only when exactly one single-hop relationship leads from the base entity to the @of entity (single-hop-unique inference; FR-024, ADR-0029). Multi-hop paths must always be stated explicitly.",
|
|
45
|
+
"children": [
|
|
46
|
+
{
|
|
47
|
+
"type": "attr",
|
|
48
|
+
"subType": "string",
|
|
49
|
+
"name": "agg",
|
|
50
|
+
"min": 1,
|
|
51
|
+
"max": 1,
|
|
52
|
+
"allowedValues": [
|
|
53
|
+
"count",
|
|
54
|
+
"sum",
|
|
55
|
+
"avg",
|
|
56
|
+
"min",
|
|
57
|
+
"max"
|
|
58
|
+
],
|
|
59
|
+
"description": "Aggregate function applied over the relationship path: count, sum, avg, min, or max."
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
"type": "attr",
|
|
63
|
+
"subType": "string",
|
|
64
|
+
"name": "of",
|
|
65
|
+
"min": 1,
|
|
66
|
+
"max": 1,
|
|
67
|
+
"description": "Dotted Entity.field reference identifying the column being aggregated (e.g. 'Week.durationMinutes')."
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
"type": "attr",
|
|
71
|
+
"subType": "string",
|
|
72
|
+
"name": "via",
|
|
73
|
+
"min": 0,
|
|
74
|
+
"max": 1,
|
|
75
|
+
"description": "Dotted relationship path from the base entity to the aggregated rows (e.g. 'Program.weeks' or 'Program.weeks.workouts'). May be omitted only when exactly one single-hop relationship leads from the base entity to the @of entity (FR-024, ADR-0029)."
|
|
76
|
+
}
|
|
77
|
+
]
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"type": "origin",
|
|
81
|
+
"subType": "collection",
|
|
82
|
+
"description": "A relationship-derived array of nested view-objects: walks @via to produce the collection (e.g. 'Author.posts'), or a wildcard selector for a package-spanning collection.",
|
|
83
|
+
"children": [
|
|
84
|
+
{
|
|
85
|
+
"type": "attr",
|
|
86
|
+
"subType": "string",
|
|
87
|
+
"name": "via",
|
|
88
|
+
"min": 1,
|
|
89
|
+
"max": 1,
|
|
90
|
+
"description": "Dotted relationship path the collection walks to produce an array of nested view-objects (e.g. 'Author.posts'), or a wildcard selector for a package-spanning collection (e.g. '*.User')."
|
|
91
|
+
}
|
|
92
|
+
]
|
|
93
|
+
}
|
|
94
|
+
]
|
|
95
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// AUTO-GENERATED by scripts/generate-embedded-metamodel.ts — DO NOT EDIT.
|
|
2
|
+
// Canonical source: repo-root spec/metamodel/source.json
|
|
3
|
+
// Regenerate: bun run scripts/generate-embedded-metamodel.ts
|
|
4
|
+
//
|
|
5
|
+
// Embeds the canonical FR-033 ProviderDefinition so the provider can register
|
|
6
|
+
// itself wherever the on-disk spec/ tree is unavailable (bundled builds).
|
|
7
|
+
import type { ProviderDefinition } from "../../provider-data.js";
|
|
8
|
+
|
|
9
|
+
export const SOURCE_DEFINITION: ProviderDefinition = {
|
|
10
|
+
"provider": "metaobjects-core-types",
|
|
11
|
+
"types": [
|
|
12
|
+
{
|
|
13
|
+
"type": "source",
|
|
14
|
+
"subType": "base",
|
|
15
|
+
"description": "Abstract base source — the shared root subtype for declaring where an object's data lives (Project E). The base carries no attrs of its own; the concrete paradigm subtype (rdb) carries the physical-storage attrs, which are contributed by the db domain provider."
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"type": "source",
|
|
19
|
+
"subType": "rdb",
|
|
20
|
+
"description": "The relational-database paradigm source (ADR-0007): binds an object to a physical relational object. Its physical name is the @table attr (not the structural `name`), and read-only-ness is DERIVED from @kind — table is writable; view, materializedView, storedProc, and tableFunction are read-only. The @table/@kind/@role/@schema/@parameterRef attrs are contributed by the db domain provider, not by core-types.",
|
|
21
|
+
"rules": "ADR-0007: source declares where an object's data lives; rdb is the relational paradigm subtype. An object may declare multiple sources, distinguished by @role, with exactly ONE @role: \"primary\" per object (write-through CQRS: a writable table for writes plus a read-only view for reads). The physical name is the @table attr (or the @kind-matching alias), never the structural `name`. Read-only-ness is derived from @kind (table → writable; view / materializedView / storedProc / tableFunction → read-only). The pre-v2 dbTable / dbView subtypes are retired."
|
|
22
|
+
}
|
|
23
|
+
]
|
|
24
|
+
};
|
|
@@ -48,7 +48,12 @@ const CALLABLE_KINDS = new Set<string>([
|
|
|
48
48
|
export function validateSourceParameterRef(root: MetaData): ParseError[] {
|
|
49
49
|
const errors: ParseError[] = [];
|
|
50
50
|
|
|
51
|
-
// Pre-index every object by name AND
|
|
51
|
+
// Pre-index every object by name, fqn AND effective FQN resolution key so
|
|
52
|
+
// resolution costs O(1) per source. FR-032 — @parameterRef is FQN-qualified
|
|
53
|
+
// after the desugar/sweep, but objects keep a BARE fqn() per the FR5d
|
|
54
|
+
// contract, so the FQN form `<package | fileDefaultPackage>::<name>` only
|
|
55
|
+
// matches via resolutionKey() (these fixtures declare package at metadata.root
|
|
56
|
+
// only, so obj.package is undefined and the file-default must be folded in).
|
|
52
57
|
const objectIndex = new Map<string, MetaData>();
|
|
53
58
|
for (const obj of root.ownChildren().filter((c) => c.type === TYPE_OBJECT)) {
|
|
54
59
|
objectIndex.set(obj.name, obj);
|
|
@@ -56,6 +61,7 @@ export function validateSourceParameterRef(root: MetaData): ParseError[] {
|
|
|
56
61
|
? `${obj.package}${PACKAGE_SEPARATOR}${obj.name}`
|
|
57
62
|
: obj.name;
|
|
58
63
|
objectIndex.set(fqn, obj);
|
|
64
|
+
objectIndex.set(obj.resolutionKey(), obj);
|
|
59
65
|
}
|
|
60
66
|
|
|
61
67
|
for (const obj of root.ownChildren().filter((c) => c.type === TYPE_OBJECT)) {
|
|
@@ -9,7 +9,8 @@ import type { MetaData } from "../../shared/meta-data.js";
|
|
|
9
9
|
import { ParseError } from "../../errors.js";
|
|
10
10
|
import { TYPE_OBJECT, TYPE_SOURCE } from "../../shared/base-types.js";
|
|
11
11
|
import { MetaSource } from "./meta-source.js";
|
|
12
|
-
import { SOURCE_ROLE_PRIMARY } from "./source-constants.js";
|
|
12
|
+
import { SOURCE_ROLE_PRIMARY, SOURCE_READ_ONLY_KINDS } from "./source-constants.js";
|
|
13
|
+
import { OBJECT_SUBTYPE_ENTITY } from "../../core/object/object-constants.js";
|
|
13
14
|
|
|
14
15
|
/**
|
|
15
16
|
* Walks every object in the root and enforces the one-primary rule for
|
|
@@ -47,6 +48,26 @@ export function validateSourceRoles(root: MetaData): ParseError[] {
|
|
|
47
48
|
),
|
|
48
49
|
);
|
|
49
50
|
}
|
|
51
|
+
|
|
52
|
+
// FR-024 (ADR-0028) — THE HARD CUTOVER: an entity's PRIMARY source must be
|
|
53
|
+
// writable; read-only kinds (view/materializedView/storedProc/tableFunction)
|
|
54
|
+
// are legal only in non-primary (read) roles. The pre-FR-024 spellings
|
|
55
|
+
// (view-primary "projection" entities, proc-result-as-entity) are removed
|
|
56
|
+
// outright — a derived read model is an `object.projection`.
|
|
57
|
+
if (obj.subType === OBJECT_SUBTYPE_ENTITY) {
|
|
58
|
+
for (const s of sources) {
|
|
59
|
+
if (s.role === SOURCE_ROLE_PRIMARY && SOURCE_READ_ONLY_KINDS.has(s.effectiveKind)) {
|
|
60
|
+
errors.push(
|
|
61
|
+
new ParseError(
|
|
62
|
+
`entity "${obj.name}" has a primary source of read-only kind "${s.effectiveKind}" — ` +
|
|
63
|
+
`read-only kinds are legal only in non-primary roles; a derived read model ` +
|
|
64
|
+
`is an object.projection (FR-024, ADR-0028)`,
|
|
65
|
+
{ code: "ERR_ENTITY_PRIMARY_SOURCE_READONLY", source: s.source },
|
|
66
|
+
),
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
50
71
|
}
|
|
51
72
|
|
|
52
73
|
return errors;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// AUTO-GENERATED by scripts/generate-embedded-metamodel.ts — DO NOT EDIT.
|
|
2
|
+
// Canonical source: repo-root spec/metamodel/layout.json
|
|
3
|
+
// Regenerate: bun run scripts/generate-embedded-metamodel.ts
|
|
4
|
+
//
|
|
5
|
+
// Embeds the canonical FR-033 ProviderDefinition so the provider can register
|
|
6
|
+
// itself wherever the on-disk spec/ tree is unavailable (bundled builds).
|
|
7
|
+
import type { ProviderDefinition } from "../../provider-data.js";
|
|
8
|
+
|
|
9
|
+
export const LAYOUT_DEFINITION: ProviderDefinition = {
|
|
10
|
+
"provider": "metaobjects-core-types",
|
|
11
|
+
"types": [
|
|
12
|
+
{
|
|
13
|
+
"type": "layout",
|
|
14
|
+
"subType": "base",
|
|
15
|
+
"description": "Abstract base layout — the shared root subtype for object-level UI surfaces. A layout attaches a presentation concern (grids, forms, tabs, cards) to an object. The base carries no attrs of its own; concrete subtypes add their presentation attrs."
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"type": "layout",
|
|
19
|
+
"subType": "dataGrid",
|
|
20
|
+
"description": "A metadata-driven data grid attached to an object: declares the displayed columns, page size, default sort, and an optional preset filter the generated grid renders."
|
|
21
|
+
}
|
|
22
|
+
]
|
|
23
|
+
};
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
// AUTO-GENERATED by scripts/generate-embedded-metamodel.ts — DO NOT EDIT.
|
|
2
|
+
// Canonical source: repo-root spec/metamodel/ui.json
|
|
3
|
+
// Regenerate: bun run scripts/generate-embedded-metamodel.ts
|
|
4
|
+
//
|
|
5
|
+
// Embeds the canonical FR-033 ProviderDefinition so the provider can register
|
|
6
|
+
// itself wherever the on-disk spec/ tree is unavailable (bundled builds).
|
|
7
|
+
import type { ProviderDefinition } from "../../provider-data.js";
|
|
8
|
+
|
|
9
|
+
export const UI_DEFINITION: ProviderDefinition = {
|
|
10
|
+
"provider": "metaobjects-ui",
|
|
11
|
+
"extends": [
|
|
12
|
+
{
|
|
13
|
+
"type": "field",
|
|
14
|
+
"subType": "*",
|
|
15
|
+
"children": [
|
|
16
|
+
{
|
|
17
|
+
"type": "attr",
|
|
18
|
+
"subType": "boolean",
|
|
19
|
+
"name": "filterable",
|
|
20
|
+
"min": 0,
|
|
21
|
+
"max": 1,
|
|
22
|
+
"description": "When true, the field is exposed in generated CRUD filter allowlists (Project D filter layer)."
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"type": "attr",
|
|
26
|
+
"subType": "boolean",
|
|
27
|
+
"name": "sortable",
|
|
28
|
+
"min": 0,
|
|
29
|
+
"max": 1,
|
|
30
|
+
"description": "When true, the field is exposed in generated CRUD sort allowlists. Inherits from @filterable by default; set false to opt out."
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"type": "attr",
|
|
34
|
+
"subType": "string",
|
|
35
|
+
"name": "sortableDefaultOrder",
|
|
36
|
+
"min": 0,
|
|
37
|
+
"max": 1,
|
|
38
|
+
"allowedValues": [
|
|
39
|
+
"asc",
|
|
40
|
+
"desc"
|
|
41
|
+
],
|
|
42
|
+
"description": "Default sort direction applied when this field is the default sort field."
|
|
43
|
+
}
|
|
44
|
+
]
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"type": "view",
|
|
48
|
+
"subType": "currency",
|
|
49
|
+
"children": [
|
|
50
|
+
{
|
|
51
|
+
"type": "attr",
|
|
52
|
+
"subType": "string",
|
|
53
|
+
"name": "locale",
|
|
54
|
+
"min": 0,
|
|
55
|
+
"max": 1,
|
|
56
|
+
"default": "en-US",
|
|
57
|
+
"description": "BCP 47 locale code controlling currency display formatting. Defaults to 'en-US' when omitted."
|
|
58
|
+
}
|
|
59
|
+
]
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
"type": "layout",
|
|
63
|
+
"subType": "dataGrid",
|
|
64
|
+
"children": [
|
|
65
|
+
{
|
|
66
|
+
"type": "attr",
|
|
67
|
+
"subType": "int",
|
|
68
|
+
"name": "pageSize",
|
|
69
|
+
"min": 0,
|
|
70
|
+
"max": 1,
|
|
71
|
+
"description": "Number of rows per page in the generated data grid."
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
"type": "attr",
|
|
75
|
+
"subType": "string",
|
|
76
|
+
"name": "defaultSortField",
|
|
77
|
+
"min": 0,
|
|
78
|
+
"max": 1,
|
|
79
|
+
"description": "Field name the grid is sorted by on initial render. Must reference an actual field on the entity."
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
"type": "attr",
|
|
83
|
+
"subType": "string",
|
|
84
|
+
"name": "defaultSortOrder",
|
|
85
|
+
"min": 0,
|
|
86
|
+
"max": 1,
|
|
87
|
+
"allowedValues": [
|
|
88
|
+
"asc",
|
|
89
|
+
"desc"
|
|
90
|
+
],
|
|
91
|
+
"description": "Initial sort direction for the default sort field: 'asc' or 'desc'."
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
"type": "attr",
|
|
95
|
+
"subType": "boolean",
|
|
96
|
+
"name": "filterable",
|
|
97
|
+
"min": 0,
|
|
98
|
+
"max": 1,
|
|
99
|
+
"description": "When true, the generated grid exposes column filtering UI."
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
"type": "attr",
|
|
103
|
+
"subType": "filter",
|
|
104
|
+
"name": "filter",
|
|
105
|
+
"min": 0,
|
|
106
|
+
"max": 1,
|
|
107
|
+
"description": "Structured preset filter object applied to the grid at the metadata level. Desugared to canonical { field: { op: value } } form at parse time."
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
"type": "attr",
|
|
111
|
+
"subType": "string",
|
|
112
|
+
"name": "columns",
|
|
113
|
+
"isArray": true,
|
|
114
|
+
"min": 0,
|
|
115
|
+
"max": 1,
|
|
116
|
+
"description": "Flat ordered list of field names to display as grid columns."
|
|
117
|
+
}
|
|
118
|
+
]
|
|
119
|
+
}
|
|
120
|
+
]
|
|
121
|
+
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
// uiProvider — the presentation + query-surface MetaDataTypeProvider. Extends
|
|
2
|
+
// every field subtype with the UI/query-surface markers @filterable / @sortable /
|
|
3
|
+
// @sortableDefaultOrder by extending the core-registered field types. These are
|
|
4
|
+
// presentation/query concerns, NOT core field properties, so they live here —
|
|
5
|
+
// mirroring the dbProvider (db-provider.ts) and promptProvider patterns.
|
|
6
|
+
//
|
|
7
|
+
// FR-033 S1.5-B: the attrs + their descriptions are now DATA — read from
|
|
8
|
+
// spec/metamodel/ui.json (embedded as UI_DEFINITION) via the unified
|
|
9
|
+
// applyProviderDefinition apply path's `extends` handling. The provider declares
|
|
10
|
+
// no new types, so the factory map is empty.
|
|
11
|
+
|
|
12
|
+
import type { MetaDataTypeProvider } from "../../provider.js";
|
|
13
|
+
import type { TypeRegistry } from "../../registry.js";
|
|
14
|
+
import { applyProviderDefinition } from "../../provider-data.js";
|
|
15
|
+
import { UI_DEFINITION } from "./ui-definition.embedded.js";
|
|
16
|
+
|
|
17
|
+
export const uiProvider: MetaDataTypeProvider = {
|
|
18
|
+
id: "metaobjects-ui",
|
|
19
|
+
dependencies: ["metaobjects-core-types"],
|
|
20
|
+
description:
|
|
21
|
+
"UI/query-surface domain — @filterable / @sortable / @sortableDefaultOrder field markers driving generated CRUD filter + sort allowlists (Project D).",
|
|
22
|
+
registerTypes(registry: TypeRegistry): void {
|
|
23
|
+
applyProviderDefinition(registry, UI_DEFINITION, {});
|
|
24
|
+
},
|
|
25
|
+
};
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
// AUTO-GENERATED by scripts/generate-embedded-metamodel.ts — DO NOT EDIT.
|
|
2
|
+
// Canonical source: repo-root spec/metamodel/view.json
|
|
3
|
+
// Regenerate: bun run scripts/generate-embedded-metamodel.ts
|
|
4
|
+
//
|
|
5
|
+
// Embeds the canonical FR-033 ProviderDefinition so the provider can register
|
|
6
|
+
// itself wherever the on-disk spec/ tree is unavailable (bundled builds).
|
|
7
|
+
import type { ProviderDefinition } from "../../provider-data.js";
|
|
8
|
+
|
|
9
|
+
export const VIEW_DEFINITION: ProviderDefinition = {
|
|
10
|
+
"provider": "metaobjects-core-types",
|
|
11
|
+
"types": [
|
|
12
|
+
{
|
|
13
|
+
"type": "view",
|
|
14
|
+
"subType": "base",
|
|
15
|
+
"description": "Abstract view base — the shared root subtype for field-level UI/render hints. A view declares how a field's value is rendered or edited; the base carries no attrs of its own."
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"type": "view",
|
|
19
|
+
"subType": "text",
|
|
20
|
+
"description": "Single-line text input/display."
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"type": "view",
|
|
24
|
+
"subType": "textarea",
|
|
25
|
+
"description": "Multi-line text area."
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"type": "view",
|
|
29
|
+
"subType": "date",
|
|
30
|
+
"description": "Date picker / date display."
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"type": "view",
|
|
34
|
+
"subType": "month",
|
|
35
|
+
"description": "Month picker / month display."
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
"type": "view",
|
|
39
|
+
"subType": "hotlink",
|
|
40
|
+
"description": "Renders the value as a clickable link."
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"type": "view",
|
|
44
|
+
"subType": "dropdown",
|
|
45
|
+
"description": "Single-select dropdown control."
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"type": "view",
|
|
49
|
+
"subType": "radio",
|
|
50
|
+
"description": "Radio-button selection control."
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"type": "view",
|
|
54
|
+
"subType": "checkbox",
|
|
55
|
+
"description": "Checkbox selection control."
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"type": "view",
|
|
59
|
+
"subType": "number",
|
|
60
|
+
"description": "Numeric input control."
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"type": "view",
|
|
64
|
+
"subType": "password",
|
|
65
|
+
"description": "Masked input for sensitive values."
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
"type": "view",
|
|
69
|
+
"subType": "hidden",
|
|
70
|
+
"description": "Not rendered; carried but not shown."
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
"type": "view",
|
|
74
|
+
"subType": "web",
|
|
75
|
+
"description": "Abstract base for web-rendered views."
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
"type": "view",
|
|
79
|
+
"subType": "currency",
|
|
80
|
+
"description": "Currency display formatting (locale-aware via @locale)."
|
|
81
|
+
}
|
|
82
|
+
]
|
|
83
|
+
};
|