@fougere/schema 0.2.0-alpha.2 → 0.4.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/EntityAdapters.d.ts +26 -0
- package/dist/EntityAdapters.d.ts.map +1 -0
- package/dist/EntityAdapters.js +71 -0
- package/dist/EntityAdapters.js.map +1 -0
- package/dist/EntityDeclarations.d.ts +15 -0
- package/dist/EntityDeclarations.d.ts.map +1 -0
- package/dist/EntityDeclarations.js +2 -0
- package/dist/EntityDeclarations.js.map +1 -0
- package/dist/axis/Axis.d.ts +12 -0
- package/dist/axis/Axis.d.ts.map +1 -0
- package/dist/axis/Axis.js +11 -0
- package/dist/axis/Axis.js.map +1 -0
- package/dist/axis/Meta.d.ts +4 -0
- package/dist/axis/Meta.d.ts.map +1 -0
- package/dist/axis/Meta.js +2 -0
- package/dist/axis/Meta.js.map +1 -0
- package/dist/axis/boundary/Boundaries.d.ts +20 -0
- package/dist/axis/boundary/Boundaries.d.ts.map +1 -0
- package/dist/axis/boundary/Boundaries.js +31 -0
- package/dist/axis/boundary/Boundaries.js.map +1 -0
- package/dist/axis/boundary/Boundary.d.ts +26 -0
- package/dist/axis/boundary/Boundary.d.ts.map +1 -0
- package/dist/axis/boundary/Boundary.js +53 -0
- package/dist/axis/boundary/Boundary.js.map +1 -0
- package/dist/axis/boundary/BoundaryAxis.d.ts +4 -0
- package/dist/axis/boundary/BoundaryAxis.d.ts.map +1 -0
- package/dist/axis/boundary/BoundaryAxis.js +30 -0
- package/dist/axis/boundary/BoundaryAxis.js.map +1 -0
- package/dist/axis/lifecycle/Clock.d.ts +18 -0
- package/dist/axis/lifecycle/Clock.d.ts.map +1 -0
- package/dist/axis/lifecycle/Clock.js +25 -0
- package/dist/axis/lifecycle/Clock.js.map +1 -0
- package/dist/axis/lifecycle/Generators.d.ts +18 -0
- package/dist/axis/lifecycle/Generators.d.ts.map +1 -0
- package/dist/axis/lifecycle/Generators.js +38 -0
- package/dist/axis/lifecycle/Generators.js.map +1 -0
- package/dist/axis/lifecycle/Lifecycle.d.ts +28 -0
- package/dist/axis/lifecycle/Lifecycle.d.ts.map +1 -0
- package/dist/axis/lifecycle/Lifecycle.js +38 -0
- package/dist/axis/lifecycle/Lifecycle.js.map +1 -0
- package/dist/axis/lifecycle/LifecycleAxis.d.ts +4 -0
- package/dist/axis/lifecycle/LifecycleAxis.d.ts.map +1 -0
- package/dist/axis/lifecycle/LifecycleAxis.js +47 -0
- package/dist/axis/lifecycle/LifecycleAxis.js.map +1 -0
- package/dist/axis/lifecycle/apply.d.ts +6 -0
- package/dist/axis/lifecycle/apply.d.ts.map +1 -0
- package/dist/axis/lifecycle/apply.js +34 -0
- package/dist/axis/lifecycle/apply.js.map +1 -0
- package/dist/axis/role/Relation.d.ts +20 -0
- package/dist/axis/role/Relation.d.ts.map +1 -0
- package/dist/axis/role/Relation.js +21 -0
- package/dist/axis/role/Relation.js.map +1 -0
- package/dist/axis/role/Role.d.ts +26 -0
- package/dist/axis/role/Role.d.ts.map +1 -0
- package/dist/axis/role/Role.js +40 -0
- package/dist/axis/role/Role.js.map +1 -0
- package/dist/axis/role/RoleAxis.d.ts +5 -0
- package/dist/axis/role/RoleAxis.d.ts.map +1 -0
- package/dist/axis/role/RoleAxis.js +102 -0
- package/dist/axis/role/RoleAxis.js.map +1 -0
- package/dist/axis/shape/Formats.d.ts +8 -0
- package/dist/axis/shape/Formats.d.ts.map +1 -0
- package/dist/axis/shape/Formats.js +10 -0
- package/dist/axis/shape/Formats.js.map +1 -0
- package/dist/axis/shape/Shape.d.ts +58 -0
- package/dist/axis/shape/Shape.d.ts.map +1 -0
- package/dist/{field/shape.js → axis/shape/Shape.js} +10 -25
- package/dist/axis/shape/Shape.js.map +1 -0
- package/dist/card/Bundle.d.ts +15 -0
- package/dist/card/Bundle.d.ts.map +1 -0
- package/dist/card/Bundle.js +67 -0
- package/dist/card/Bundle.js.map +1 -0
- package/dist/card/Card.d.ts +27 -0
- package/dist/card/Card.d.ts.map +1 -0
- package/dist/card/Card.js +230 -0
- package/dist/card/Card.js.map +1 -0
- package/dist/card/Descriptor.d.ts +55 -0
- package/dist/card/Descriptor.d.ts.map +1 -0
- package/dist/card/Descriptor.js +2 -0
- package/dist/card/Descriptor.js.map +1 -0
- package/dist/card/EntityTypeSource.d.ts +12 -0
- package/dist/card/EntityTypeSource.d.ts.map +1 -0
- package/dist/card/EntityTypeSource.js +78 -0
- package/dist/card/EntityTypeSource.js.map +1 -0
- package/dist/card/FacadeTypeSource.d.ts +19 -0
- package/dist/card/FacadeTypeSource.d.ts.map +1 -0
- package/dist/card/FacadeTypeSource.js +40 -0
- package/dist/card/FacadeTypeSource.js.map +1 -0
- package/dist/card/admission.d.ts +9 -0
- package/dist/card/admission.d.ts.map +1 -0
- package/dist/card/admission.js +16 -0
- package/dist/card/admission.js.map +1 -0
- package/dist/card/diff.d.ts +96 -0
- package/dist/card/diff.d.ts.map +1 -0
- package/dist/card/diff.js +2 -0
- package/dist/card/diff.js.map +1 -0
- package/dist/constraint/FieldGroup.d.ts +21 -0
- package/dist/constraint/FieldGroup.d.ts.map +1 -0
- package/dist/constraint/FieldGroup.js +65 -0
- package/dist/constraint/FieldGroup.js.map +1 -0
- package/dist/constraint/Unique.d.ts +4 -0
- package/dist/constraint/Unique.d.ts.map +1 -0
- package/dist/constraint/Unique.js +4 -0
- package/dist/constraint/Unique.js.map +1 -0
- package/dist/entity.d.ts +4 -19
- package/dist/entity.d.ts.map +1 -1
- package/dist/entity.js +8 -39
- package/dist/entity.js.map +1 -1
- package/dist/fields/Field.d.ts +24 -0
- package/dist/fields/Field.d.ts.map +1 -0
- package/dist/fields/Field.js +52 -0
- package/dist/fields/Field.js.map +1 -0
- package/dist/fields/FieldSet.d.ts +28 -0
- package/dist/fields/FieldSet.d.ts.map +1 -0
- package/dist/fields/FieldSet.js +55 -0
- package/dist/fields/FieldSet.js.map +1 -0
- package/dist/index.d.ts +59 -37
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +50 -48
- package/dist/index.js.map +1 -1
- package/dist/judge/Cases.d.ts +50 -0
- package/dist/judge/Cases.d.ts.map +1 -0
- package/dist/judge/Cases.js +108 -0
- package/dist/judge/Cases.js.map +1 -0
- package/dist/judge/FieldJudge.d.ts +9 -0
- package/dist/judge/FieldJudge.d.ts.map +1 -0
- package/dist/judge/FieldJudge.js +54 -0
- package/dist/judge/FieldJudge.js.map +1 -0
- package/dist/judge/RowJudge.d.ts +12 -0
- package/dist/judge/RowJudge.d.ts.map +1 -0
- package/dist/judge/RowJudge.js +81 -0
- package/dist/judge/RowJudge.js.map +1 -0
- package/dist/judge/RowRefusal.d.ts +17 -0
- package/dist/judge/RowRefusal.d.ts.map +1 -0
- package/dist/judge/RowRefusal.js +16 -0
- package/dist/judge/RowRefusal.js.map +1 -0
- package/dist/judge/ValueForm.d.ts +3 -0
- package/dist/judge/ValueForm.d.ts.map +1 -0
- package/dist/judge/ValueForm.js +3 -0
- package/dist/judge/ValueForm.js.map +1 -0
- package/dist/judge/ValueJudge.d.ts +12 -0
- package/dist/judge/ValueJudge.d.ts.map +1 -0
- package/dist/judge/ValueJudge.js +60 -0
- package/dist/judge/ValueJudge.js.map +1 -0
- package/dist/judge/options.d.ts +4 -0
- package/dist/judge/options.d.ts.map +1 -0
- package/dist/judge/options.js +2 -0
- package/dist/judge/options.js.map +1 -0
- package/dist/judge/result.d.ts +17 -0
- package/dist/judge/result.d.ts.map +1 -0
- package/dist/judge/result.js +2 -0
- package/dist/judge/result.js.map +1 -0
- package/dist/projection/SchemaOrCard.d.ts +7 -0
- package/dist/projection/SchemaOrCard.d.ts.map +1 -0
- package/dist/projection/SchemaOrCard.js +11 -0
- package/dist/projection/SchemaOrCard.js.map +1 -0
- package/dist/projection/Visibility.d.ts +10 -0
- package/dist/projection/Visibility.d.ts.map +1 -0
- package/dist/projection/Visibility.js +55 -0
- package/dist/projection/Visibility.js.map +1 -0
- package/dist/{projections → projection}/standard.d.ts +2 -10
- package/dist/projection/standard.d.ts.map +1 -0
- package/dist/projection/standard.js +2 -0
- package/dist/projection/standard.js.map +1 -0
- package/dist/schema/Schema.d.ts +63 -0
- package/dist/schema/Schema.d.ts.map +1 -0
- package/dist/schema/Schema.js +129 -0
- package/dist/schema/Schema.js.map +1 -0
- package/dist/schema/SchemaDefinition.d.ts +46 -0
- package/dist/schema/SchemaDefinition.d.ts.map +1 -0
- package/dist/schema/SchemaDefinition.js +64 -0
- package/dist/schema/SchemaDefinition.js.map +1 -0
- package/dist/schema/SchemaDerivation.d.ts +28 -0
- package/dist/schema/SchemaDerivation.d.ts.map +1 -0
- package/dist/schema/SchemaDerivation.js +37 -0
- package/dist/schema/SchemaDerivation.js.map +1 -0
- package/dist/schema/SchemaView.d.ts +23 -0
- package/dist/schema/SchemaView.d.ts.map +1 -0
- package/dist/schema/SchemaView.js +2 -0
- package/dist/schema/SchemaView.js.map +1 -0
- package/dist/utils.d.ts +4 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +13 -0
- package/dist/utils.js.map +1 -0
- package/dist/vocabulary/bool.d.ts +1 -1
- package/dist/vocabulary/bool.d.ts.map +1 -1
- package/dist/vocabulary/bool.js +1 -1
- package/dist/vocabulary/bool.js.map +1 -1
- package/dist/vocabulary/created.d.ts +1 -5
- package/dist/vocabulary/created.d.ts.map +1 -1
- package/dist/vocabulary/created.js +1 -5
- package/dist/vocabulary/created.js.map +1 -1
- package/dist/vocabulary/date.d.ts +1 -1
- package/dist/vocabulary/date.d.ts.map +1 -1
- package/dist/vocabulary/date.js +1 -1
- package/dist/vocabulary/date.js.map +1 -1
- package/dist/vocabulary/email.d.ts +1 -2
- package/dist/vocabulary/email.d.ts.map +1 -1
- package/dist/vocabulary/email.js +0 -1
- package/dist/vocabulary/email.js.map +1 -1
- package/dist/vocabulary/immutable.d.ts +2 -6
- package/dist/vocabulary/immutable.d.ts.map +1 -1
- package/dist/vocabulary/immutable.js +4 -7
- package/dist/vocabulary/immutable.js.map +1 -1
- package/dist/vocabulary/indexed.d.ts +2 -7
- package/dist/vocabulary/indexed.d.ts.map +1 -1
- package/dist/vocabulary/indexed.js +2 -8
- package/dist/vocabulary/indexed.js.map +1 -1
- package/dist/vocabulary/json.d.ts +2 -10
- package/dist/vocabulary/json.d.ts.map +1 -1
- package/dist/vocabulary/json.js +12 -7
- package/dist/vocabulary/json.js.map +1 -1
- package/dist/vocabulary/list.d.ts +1 -12
- package/dist/vocabulary/list.d.ts.map +1 -1
- package/dist/vocabulary/list.js +1 -14
- package/dist/vocabulary/list.js.map +1 -1
- package/dist/vocabulary/many.d.ts +2 -5
- package/dist/vocabulary/many.d.ts.map +1 -1
- package/dist/vocabulary/many.js +3 -6
- package/dist/vocabulary/many.js.map +1 -1
- package/dist/vocabulary/nullable.d.ts +2 -6
- package/dist/vocabulary/nullable.d.ts.map +1 -1
- package/dist/vocabulary/nullable.js +5 -8
- package/dist/vocabulary/nullable.js.map +1 -1
- package/dist/vocabulary/number.d.ts +1 -1
- package/dist/vocabulary/number.d.ts.map +1 -1
- package/dist/vocabulary/number.js +1 -1
- package/dist/vocabulary/number.js.map +1 -1
- package/dist/vocabulary/oneOf.d.ts +1 -8
- package/dist/vocabulary/oneOf.d.ts.map +1 -1
- package/dist/vocabulary/oneOf.js +1 -1
- package/dist/vocabulary/oneOf.js.map +1 -1
- package/dist/vocabulary/optional.d.ts +2 -9
- package/dist/vocabulary/optional.d.ts.map +1 -1
- package/dist/vocabulary/optional.js +6 -14
- package/dist/vocabulary/optional.js.map +1 -1
- package/dist/vocabulary/primary.d.ts +2 -15
- package/dist/vocabulary/primary.d.ts.map +1 -1
- package/dist/vocabulary/primary.js +4 -11
- package/dist/vocabulary/primary.js.map +1 -1
- package/dist/vocabulary/readOnly.d.ts +2 -6
- package/dist/vocabulary/readOnly.d.ts.map +1 -1
- package/dist/vocabulary/readOnly.js +5 -8
- package/dist/vocabulary/readOnly.js.map +1 -1
- package/dist/vocabulary/ref.d.ts +2 -7
- package/dist/vocabulary/ref.d.ts.map +1 -1
- package/dist/vocabulary/ref.js +3 -14
- package/dist/vocabulary/ref.js.map +1 -1
- package/dist/vocabulary/text.d.ts +2 -2
- package/dist/vocabulary/text.d.ts.map +1 -1
- package/dist/vocabulary/text.js +1 -1
- package/dist/vocabulary/text.js.map +1 -1
- package/dist/vocabulary/unique.d.ts +2 -12
- package/dist/vocabulary/unique.d.ts.map +1 -1
- package/dist/vocabulary/unique.js +5 -13
- package/dist/vocabulary/unique.js.map +1 -1
- package/dist/vocabulary/updated.d.ts +1 -6
- package/dist/vocabulary/updated.d.ts.map +1 -1
- package/dist/vocabulary/updated.js +0 -5
- package/dist/vocabulary/updated.js.map +1 -1
- package/dist/vocabulary/url.d.ts +1 -2
- package/dist/vocabulary/url.d.ts.map +1 -1
- package/dist/vocabulary/url.js +0 -1
- package/dist/vocabulary/url.js.map +1 -1
- package/dist/vocabulary/vocabulary.d.ts +4 -0
- package/dist/vocabulary/vocabulary.d.ts.map +1 -0
- package/dist/vocabulary/vocabulary.js +31 -0
- package/dist/vocabulary/vocabulary.js.map +1 -0
- package/dist/vocabulary/writeOnly.d.ts +2 -6
- package/dist/vocabulary/writeOnly.d.ts.map +1 -1
- package/dist/vocabulary/writeOnly.js +5 -8
- package/dist/vocabulary/writeOnly.js.map +1 -1
- package/package.json +8 -4
- package/src/EntityAdapters.ts +95 -0
- package/src/EntityDeclarations.ts +19 -0
- package/src/axis/Axis.ts +25 -0
- package/src/axis/Meta.ts +3 -0
- package/src/axis/boundary/Boundaries.ts +44 -0
- package/src/axis/boundary/Boundary.ts +69 -0
- package/src/axis/boundary/BoundaryAxis.ts +32 -0
- package/src/axis/lifecycle/Clock.ts +26 -0
- package/src/axis/lifecycle/Generators.ts +46 -0
- package/src/axis/lifecycle/Lifecycle.ts +53 -0
- package/src/axis/lifecycle/LifecycleAxis.ts +49 -0
- package/src/axis/lifecycle/apply.ts +38 -0
- package/src/axis/role/Relation.ts +31 -0
- package/src/axis/role/Role.ts +56 -0
- package/src/axis/role/RoleAxis.ts +115 -0
- package/src/axis/shape/Formats.ts +22 -0
- package/src/axis/shape/Shape.ts +91 -0
- package/src/card/Bundle.ts +80 -0
- package/src/card/Card.ts +256 -0
- package/src/card/Descriptor.ts +68 -0
- package/src/card/EntityTypeSource.ts +90 -0
- package/src/card/FacadeTypeSource.ts +55 -0
- package/src/card/admission.ts +25 -0
- package/src/card/diff.ts +56 -0
- package/src/constraint/FieldGroup.ts +91 -0
- package/src/constraint/Unique.ts +3 -0
- package/src/entity.ts +15 -0
- package/src/fields/Field.ts +80 -0
- package/src/fields/FieldSet.ts +62 -0
- package/src/index.ts +64 -0
- package/src/judge/Cases.ts +139 -0
- package/src/judge/FieldJudge.ts +61 -0
- package/src/judge/RowJudge.ts +84 -0
- package/src/judge/RowRefusal.ts +17 -0
- package/src/judge/ValueForm.ts +7 -0
- package/src/judge/ValueJudge.ts +72 -0
- package/src/judge/options.ts +3 -0
- package/src/judge/result.ts +10 -0
- package/src/projection/SchemaOrCard.ts +18 -0
- package/src/projection/Visibility.ts +47 -0
- package/src/projection/standard.ts +47 -0
- package/src/schema/Schema.ts +167 -0
- package/src/schema/SchemaDefinition.ts +87 -0
- package/src/schema/SchemaDerivation.ts +46 -0
- package/src/schema/SchemaView.ts +25 -0
- package/src/utils.ts +13 -0
- package/src/vocabulary/bool.ts +9 -0
- package/src/vocabulary/created.ts +8 -0
- package/src/vocabulary/date.ts +5 -0
- package/src/vocabulary/email.ts +6 -0
- package/src/vocabulary/immutable.ts +6 -0
- package/src/vocabulary/indexed.ts +4 -0
- package/src/vocabulary/json.ts +22 -0
- package/src/vocabulary/list.ts +13 -0
- package/src/vocabulary/many.ts +9 -0
- package/src/vocabulary/nullable.ts +7 -0
- package/src/vocabulary/number.ts +17 -0
- package/src/vocabulary/oneOf.ts +24 -0
- package/src/vocabulary/optional.ts +8 -0
- package/src/vocabulary/primary.ts +33 -0
- package/src/vocabulary/readOnly.ts +7 -0
- package/src/vocabulary/ref.ts +13 -0
- package/src/vocabulary/text.ts +19 -0
- package/src/vocabulary/unique.ts +10 -0
- package/src/vocabulary/updated.ts +7 -0
- package/src/vocabulary/url.ts +6 -0
- package/src/vocabulary/vocabulary.ts +40 -0
- package/src/vocabulary/writeOnly.ts +7 -0
- package/dist/field/boundary.d.ts +0 -69
- package/dist/field/boundary.d.ts.map +0 -1
- package/dist/field/boundary.js +0 -82
- package/dist/field/boundary.js.map +0 -1
- package/dist/field/field.d.ts +0 -21
- package/dist/field/field.d.ts.map +0 -1
- package/dist/field/field.js +0 -24
- package/dist/field/field.js.map +0 -1
- package/dist/field/format.d.ts +0 -29
- package/dist/field/format.d.ts.map +0 -1
- package/dist/field/format.js +0 -24
- package/dist/field/format.js.map +0 -1
- package/dist/field/index.d.ts +0 -8
- package/dist/field/index.d.ts.map +0 -1
- package/dist/field/index.js +0 -10
- package/dist/field/index.js.map +0 -1
- package/dist/field/lifecycle.d.ts +0 -31
- package/dist/field/lifecycle.d.ts.map +0 -1
- package/dist/field/lifecycle.js +0 -20
- package/dist/field/lifecycle.js.map +0 -1
- package/dist/field/meta.d.ts +0 -5
- package/dist/field/meta.d.ts.map +0 -1
- package/dist/field/meta.js +0 -5
- package/dist/field/meta.js.map +0 -1
- package/dist/field/role.d.ts +0 -47
- package/dist/field/role.d.ts.map +0 -1
- package/dist/field/role.js +0 -35
- package/dist/field/role.js.map +0 -1
- package/dist/field/shape.d.ts +0 -89
- package/dist/field/shape.d.ts.map +0 -1
- package/dist/field/shape.js.map +0 -1
- package/dist/hints.d.ts +0 -28
- package/dist/hints.d.ts.map +0 -1
- package/dist/hints.js +0 -23
- package/dist/hints.js.map +0 -1
- package/dist/name.d.ts +0 -8
- package/dist/name.d.ts.map +0 -1
- package/dist/name.js +0 -10
- package/dist/name.js.map +0 -1
- package/dist/projections/card.d.ts +0 -98
- package/dist/projections/card.d.ts.map +0 -1
- package/dist/projections/card.js +0 -8
- package/dist/projections/card.js.map +0 -1
- package/dist/projections/describe.d.ts +0 -25
- package/dist/projections/describe.d.ts.map +0 -1
- package/dist/projections/describe.js +0 -131
- package/dist/projections/describe.js.map +0 -1
- package/dist/projections/encode.d.ts +0 -11
- package/dist/projections/encode.d.ts.map +0 -1
- package/dist/projections/encode.js +0 -26
- package/dist/projections/encode.js.map +0 -1
- package/dist/projections/io.d.ts +0 -24
- package/dist/projections/io.d.ts.map +0 -1
- package/dist/projections/io.js +0 -46
- package/dist/projections/io.js.map +0 -1
- package/dist/projections/lifecycle.d.ts +0 -29
- package/dist/projections/lifecycle.d.ts.map +0 -1
- package/dist/projections/lifecycle.js +0 -93
- package/dist/projections/lifecycle.js.map +0 -1
- package/dist/projections/reconstruct.d.ts +0 -31
- package/dist/projections/reconstruct.d.ts.map +0 -1
- package/dist/projections/reconstruct.js +0 -146
- package/dist/projections/reconstruct.js.map +0 -1
- package/dist/projections/source.d.ts +0 -18
- package/dist/projections/source.d.ts.map +0 -1
- package/dist/projections/source.js +0 -18
- package/dist/projections/source.js.map +0 -1
- package/dist/projections/standard.d.ts.map +0 -1
- package/dist/projections/standard.js +0 -10
- package/dist/projections/standard.js.map +0 -1
- package/dist/projections/typescript.d.ts +0 -37
- package/dist/projections/typescript.d.ts.map +0 -1
- package/dist/projections/typescript.js +0 -157
- package/dist/projections/typescript.js.map +0 -1
- package/dist/schema/index.d.ts +0 -3
- package/dist/schema/index.d.ts.map +0 -1
- package/dist/schema/index.js +0 -2
- package/dist/schema/index.js.map +0 -1
- package/dist/schema/schema.d.ts +0 -74
- package/dist/schema/schema.d.ts.map +0 -1
- package/dist/schema/schema.js +0 -162
- package/dist/schema/schema.js.map +0 -1
- package/dist/schema/view.d.ts +0 -26
- package/dist/schema/view.d.ts.map +0 -1
- package/dist/schema/view.js +0 -2
- package/dist/schema/view.js.map +0 -1
- package/dist/unique.d.ts +0 -40
- package/dist/unique.d.ts.map +0 -1
- package/dist/unique.js +0 -57
- package/dist/unique.js.map +0 -1
- package/dist/validation/index.d.ts +0 -4
- package/dist/validation/index.d.ts.map +0 -1
- package/dist/validation/index.js +0 -2
- package/dist/validation/index.js.map +0 -1
- package/dist/validation/judge.d.ts +0 -55
- package/dist/validation/judge.d.ts.map +0 -1
- package/dist/validation/judge.js +0 -351
- package/dist/validation/judge.js.map +0 -1
- package/dist/validation/options.d.ts +0 -6
- package/dist/validation/options.d.ts.map +0 -1
- package/dist/validation/options.js +0 -3
- package/dist/validation/options.js.map +0 -1
- package/dist/validation/result.d.ts +0 -20
- package/dist/validation/result.d.ts.map +0 -1
- package/dist/validation/result.js +0 -3
- package/dist/validation/result.js.map +0 -1
|
@@ -1,15 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
* answers absence, and with a value rather than an omission.
|
|
8
|
-
*/
|
|
9
|
-
export function optional(field) {
|
|
10
|
-
return field.with({
|
|
11
|
-
shape: nullableShape(field.shape),
|
|
12
|
-
lifecycle: { ...field.lifecycle, create: field.lifecycle?.create ?? 'optional' },
|
|
13
|
-
});
|
|
14
|
-
}
|
|
1
|
+
import { vocabulary } from './vocabulary.js';
|
|
2
|
+
import { Anatomy } from '../axis/shape/Shape.js';
|
|
3
|
+
export const optional = vocabulary('optional', (field) => ({
|
|
4
|
+
shape: Anatomy.nullable(field.shape),
|
|
5
|
+
...(field.lifecycle?.create === undefined ? { lifecycle: { create: 'optional' } } : {}),
|
|
6
|
+
}));
|
|
15
7
|
//# sourceMappingURL=optional.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"optional.js","sourceRoot":"","sources":["../../src/vocabulary/optional.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"optional.js","sourceRoot":"","sources":["../../src/vocabulary/optional.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAGjD,MAAM,CAAC,MAAM,QAAQ,GAA4C,UAAU,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAClG,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC;IACpC,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,UAAmB,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;CACjG,CAAC,CAAC,CAAC"}
|
|
@@ -1,21 +1,8 @@
|
|
|
1
|
-
import { Field
|
|
1
|
+
import { Field } from '../fields/Field.js';
|
|
2
|
+
import { type GeneratorRef } from '../axis/lifecycle/Generators.js';
|
|
2
3
|
interface PrimaryOptions {
|
|
3
|
-
/**
|
|
4
|
-
* Generator token: a built-in preset, a name registered via
|
|
5
|
-
* `registerGenerator`, or the colocated `[name, fn]` tuple — which registers
|
|
6
|
-
* and names in one gesture (the Field only ever carries the name).
|
|
7
|
-
*/
|
|
8
4
|
generate?: GeneratorRef | [name: string, fn: () => string];
|
|
9
5
|
}
|
|
10
|
-
/**
|
|
11
|
-
* Create a primary key field.
|
|
12
|
-
*
|
|
13
|
-
* - `primary()` — auto-generated CUID2 string ID (default)
|
|
14
|
-
* - `primary({ generate: 'uuid' })` — auto-generated UUID v4
|
|
15
|
-
* - `primary({ generate: ['monId', fn] })` — custom generator, registered + named
|
|
16
|
-
* - `primary(field)` — promote any field to primary key (no auto-generation:
|
|
17
|
-
* the value must be supplied, so no `create` rule is stated)
|
|
18
|
-
*/
|
|
19
6
|
export declare function primary(opts?: PrimaryOptions): Field<string>;
|
|
20
7
|
export declare function primary<T>(field: Field<T>): Field<T>;
|
|
21
8
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"primary.d.ts","sourceRoot":"","sources":["../../src/vocabulary/primary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"primary.d.ts","sourceRoot":"","sources":["../../src/vocabulary/primary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAc,KAAK,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAEhF,UAAU,cAAc;IACtB,QAAQ,CAAC,EAAE,YAAY,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,MAAM,CAAC,CAAC;CAC5D;AAED,wBAAgB,OAAO,CAAC,IAAI,CAAC,EAAE,cAAc,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;AAC9D,wBAAgB,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC"}
|
|
@@ -1,24 +1,18 @@
|
|
|
1
|
-
import { Field
|
|
2
|
-
import {
|
|
1
|
+
import { Field } from '../fields/Field.js';
|
|
2
|
+
import { Generators } from '../axis/lifecycle/Generators.js';
|
|
3
3
|
export function primary(fieldOrOptions) {
|
|
4
|
-
|
|
5
|
-
// (boundary, meta…); the role gains `primary`, and identity in the graph implies
|
|
6
|
-
// immutability in time: `update: 'forbidden'` (decided 2026-07-15).
|
|
7
|
-
// `isField` and not a brand: the two overloads are told apart by SHAPE, which a field
|
|
8
|
-
// always states and `PrimaryOptions` (a lone `generate?`) never does.
|
|
9
|
-
if (Judge.isField(fieldOrOptions)) {
|
|
4
|
+
if (Field.is(fieldOrOptions)) {
|
|
10
5
|
const field = fieldOrOptions;
|
|
11
6
|
return field.with({
|
|
12
7
|
role: { ...field.role, primary: true },
|
|
13
8
|
lifecycle: { ...field.lifecycle, update: "forbidden" },
|
|
14
9
|
});
|
|
15
10
|
}
|
|
16
|
-
// primary() or primary({ generate }) — auto-generated string ID
|
|
17
11
|
const opts = (fieldOrOptions ?? {});
|
|
18
12
|
let generate;
|
|
19
13
|
if (Array.isArray(opts.generate)) {
|
|
20
14
|
const [name, fn] = opts.generate;
|
|
21
|
-
|
|
15
|
+
Generators.register(name, fn);
|
|
22
16
|
generate = name;
|
|
23
17
|
}
|
|
24
18
|
else {
|
|
@@ -27,7 +21,6 @@ export function primary(fieldOrOptions) {
|
|
|
27
21
|
return new Field({
|
|
28
22
|
shape: { type: "string" },
|
|
29
23
|
role: { primary: true },
|
|
30
|
-
// An id is immutable by default: re-supplying it in a patch is an error.
|
|
31
24
|
lifecycle: { create: { generate }, update: "forbidden" },
|
|
32
25
|
});
|
|
33
26
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"primary.js","sourceRoot":"","sources":["../../src/vocabulary/primary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"primary.js","sourceRoot":"","sources":["../../src/vocabulary/primary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAqB,MAAM,iCAAiC,CAAC;AAQhF,MAAM,UAAU,OAAO,CAAC,cAAuC;IAC7D,IAAI,KAAK,CAAC,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,cAAc,CAAC;QAC7B,OAAO,KAAK,CAAC,IAAI,CAAC;YAChB,IAAI,EAAE,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE;YACtC,SAAS,EAAE,EAAE,GAAG,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE;SACvD,CAAC,CAAC;IACL,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,cAAc,IAAI,EAAE,CAAmB,CAAC;IACtD,IAAI,QAAsB,CAAC;IAC3B,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC;QACjC,UAAU,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC9B,QAAQ,GAAG,IAAI,CAAC;IAClB,CAAC;SAAM,CAAC;QACN,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC;IACtC,CAAC;IACD,OAAO,IAAI,KAAK,CAAS;QACvB,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACzB,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;QACvB,SAAS,EAAE,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE;KACzD,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1,7 +1,3 @@
|
|
|
1
|
-
import { Field } from '../
|
|
2
|
-
|
|
3
|
-
* Close the INBOUND direction — emitted normally, never accepted from a client. Supplying
|
|
4
|
-
* it is a "Read-only" error; its absence is never "Required". Outbound is untouched.
|
|
5
|
-
*/
|
|
6
|
-
export declare function readOnly<T>(field: Field<T>): Field<T>;
|
|
1
|
+
import { Field } from '../fields/Field.js';
|
|
2
|
+
export declare const readOnly: <T>(field: Field<T>) => Field<T>;
|
|
7
3
|
//# sourceMappingURL=readOnly.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"readOnly.d.ts","sourceRoot":"","sources":["../../src/vocabulary/readOnly.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"readOnly.d.ts","sourceRoot":"","sources":["../../src/vocabulary/readOnly.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,eAAO,MAAM,QAAQ,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAEnD,CAAC"}
|
|
@@ -1,9 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
export function readOnly(field) {
|
|
7
|
-
return field.with({ boundary: { ...declaredBoundary(field), in: 'closed' } });
|
|
8
|
-
}
|
|
1
|
+
import { vocabulary } from './vocabulary.js';
|
|
2
|
+
import { Boundary } from '../axis/boundary/Boundary.js';
|
|
3
|
+
export const readOnly = vocabulary('readOnly', (field) => ({
|
|
4
|
+
boundary: Boundary.declared(field).with({ in: 'closed' }),
|
|
5
|
+
}));
|
|
9
6
|
//# sourceMappingURL=readOnly.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"readOnly.js","sourceRoot":"","sources":["../../src/vocabulary/readOnly.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"readOnly.js","sourceRoot":"","sources":["../../src/vocabulary/readOnly.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAGxD,MAAM,CAAC,MAAM,QAAQ,GAAqC,UAAU,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC3F,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC;CAC1D,CAAC,CAAC,CAAC"}
|
package/dist/vocabulary/ref.d.ts
CHANGED
|
@@ -1,12 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { type EntityConstructor } from '../axis/role/Relation.js';
|
|
2
|
+
import { Field } from '../fields/Field.js';
|
|
2
3
|
export interface RefOptions {
|
|
3
4
|
cascade?: boolean;
|
|
4
5
|
}
|
|
5
|
-
/**
|
|
6
|
-
* A reference to another entity — a foreign-key string plus a one-relation role.
|
|
7
|
-
* Pass the target class (`ref(Author)`) or, for circular/forward references, a
|
|
8
|
-
* thunk (`ref(() => Author)`). For a nullable FK, wrap it: `optional(ref(Author))`
|
|
9
|
-
* — that path also flips the type to `string | null` (which `ref` alone never did).
|
|
10
|
-
*/
|
|
11
6
|
export declare function ref<E extends EntityConstructor>(target: E | (() => E), opts?: RefOptions): Field<string>;
|
|
12
7
|
//# sourceMappingURL=ref.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ref.d.ts","sourceRoot":"","sources":["../../src/vocabulary/ref.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"ref.d.ts","sourceRoot":"","sources":["../../src/vocabulary/ref.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC5E,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,GAAG,CAAC,CAAC,SAAS,iBAAiB,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,CAKxG"}
|
package/dist/vocabulary/ref.js
CHANGED
|
@@ -1,20 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
* A reference to another entity — a foreign-key string plus a one-relation role.
|
|
4
|
-
* Pass the target class (`ref(Author)`) or, for circular/forward references, a
|
|
5
|
-
* thunk (`ref(() => Author)`). For a nullable FK, wrap it: `optional(ref(Author))`
|
|
6
|
-
* — that path also flips the type to `string | null` (which `ref` alone never did).
|
|
7
|
-
*/
|
|
1
|
+
import { Relation } from '../axis/role/Relation.js';
|
|
2
|
+
import { Field } from '../fields/Field.js';
|
|
8
3
|
export function ref(target, opts) {
|
|
9
4
|
return new Field({
|
|
10
5
|
shape: { type: 'string' },
|
|
11
|
-
role: {
|
|
12
|
-
relation: {
|
|
13
|
-
to: toTargetThunk(target),
|
|
14
|
-
kind: 'one',
|
|
15
|
-
onDelete: opts?.cascade ? 'cascade' : undefined,
|
|
16
|
-
},
|
|
17
|
-
},
|
|
6
|
+
role: { relation: Relation.one(target, opts?.cascade) },
|
|
18
7
|
});
|
|
19
8
|
}
|
|
20
9
|
//# sourceMappingURL=ref.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ref.js","sourceRoot":"","sources":["../../src/vocabulary/ref.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"ref.js","sourceRoot":"","sources":["../../src/vocabulary/ref.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAA0B,MAAM,0BAA0B,CAAC;AAC5E,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAM3C,MAAM,UAAU,GAAG,CAA8B,MAAqB,EAAE,IAAiB;IACvF,OAAO,IAAI,KAAK,CAAS;QACvB,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACzB,IAAI,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE;KACxD,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { Field
|
|
1
|
+
import { Field } from '../fields/Field.js';
|
|
2
|
+
import { type StringFormat } from '../axis/shape/Formats.js';
|
|
2
3
|
export interface TextOptions {
|
|
3
4
|
min?: number;
|
|
4
5
|
max?: number;
|
|
5
6
|
pattern?: string;
|
|
6
|
-
/** JSON Schema format predicate (email, uuid, uri, date, time…), asserted by the engine. */
|
|
7
7
|
format?: StringFormat;
|
|
8
8
|
default?: string;
|
|
9
9
|
description?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../src/vocabulary/text.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,YAAY,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../src/vocabulary/text.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAE7D,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,IAAI,CAAC,IAAI,CAAC,EAAE,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAMtD"}
|
package/dist/vocabulary/text.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/vocabulary/text.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/vocabulary/text.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAY3C,MAAM,UAAU,IAAI,CAAC,IAAkB;IACrC,OAAO,IAAI,KAAK,CAAS;QACvB,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE;QACnH,SAAS,EAAE,IAAI,EAAE,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS;QACxF,IAAI,EAAE,IAAI,EAAE,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS;KACtF,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1,13 +1,3 @@
|
|
|
1
|
-
import { Field } from
|
|
2
|
-
|
|
3
|
-
* No two rows carry the same value — a unique constraint of one, on the role axis.
|
|
4
|
-
*
|
|
5
|
-
* A shape cannot express it: judging one value never sees the other rows. So only the
|
|
6
|
-
* storage realizes it, and a collision surfaces as the driver's error. It travels on the
|
|
7
|
-
* card, so a consumer in another language reads the same promise.
|
|
8
|
-
*
|
|
9
|
-
* The group is `[]` — the empty list denoting THIS field, which does not know its own key.
|
|
10
|
-
* See the ⚠️ on the role axis.
|
|
11
|
-
*/
|
|
12
|
-
export declare function unique<T>(field: Field<T>): Field<T>;
|
|
1
|
+
import { Field } from "../fields/Field.js";
|
|
2
|
+
export declare const unique: <T>(field: Field<T>) => Field<T>;
|
|
13
3
|
//# sourceMappingURL=unique.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unique.d.ts","sourceRoot":"","sources":["../../src/vocabulary/unique.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"unique.d.ts","sourceRoot":"","sources":["../../src/vocabulary/unique.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAG3C,eAAO,MAAM,MAAM,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAKnD,CAAC"}
|
|
@@ -1,14 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
* card, so a consumer in another language reads the same promise.
|
|
7
|
-
*
|
|
8
|
-
* The group is `[]` — the empty list denoting THIS field, which does not know its own key.
|
|
9
|
-
* See the ⚠️ on the role axis.
|
|
10
|
-
*/
|
|
11
|
-
export function unique(field) {
|
|
12
|
-
return field.with({ role: { ...field.role, unique: [[]] } });
|
|
13
|
-
}
|
|
1
|
+
import { vocabulary } from "./vocabulary.js";
|
|
2
|
+
import { Unique } from "../constraint/Unique.js";
|
|
3
|
+
export const unique = vocabulary("unique", (field) => ({
|
|
4
|
+
role: { rules: [...(field.role?.rules ?? []), new Unique([])] },
|
|
5
|
+
}));
|
|
14
6
|
//# sourceMappingURL=unique.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unique.js","sourceRoot":"","sources":["../../src/vocabulary/unique.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"unique.js","sourceRoot":"","sources":["../../src/vocabulary/unique.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAEjD,MAAM,CAAC,MAAM,MAAM,GAAqC,UAAU,CAChE,QAAQ,EACR,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACV,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,EAAE,IAAI,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE;CAChE,CAAC,CACH,CAAC"}
|
|
@@ -1,8 +1,3 @@
|
|
|
1
|
-
import { Field } from '../
|
|
2
|
-
/**
|
|
3
|
-
* `auto()`, plus the update stamp — the canonical `updatedAt` (Prisma
|
|
4
|
-
* `@updatedAt`, Kysely-side `$onUpdate` equivalents). The only new fact is `update: 'now'`;
|
|
5
|
-
* shape and creation rule are auto()'s, stated once there.
|
|
6
|
-
*/
|
|
1
|
+
import { Field } from '../fields/Field.js';
|
|
7
2
|
export declare function updated(): Field<Date>;
|
|
8
3
|
//# sourceMappingURL=updated.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"updated.d.ts","sourceRoot":"","sources":["../../src/vocabulary/updated.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"updated.d.ts","sourceRoot":"","sources":["../../src/vocabulary/updated.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,wBAAgB,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,CAGrC"}
|
|
@@ -1,9 +1,4 @@
|
|
|
1
1
|
import { created } from './created.js';
|
|
2
|
-
/**
|
|
3
|
-
* `auto()`, plus the update stamp — the canonical `updatedAt` (Prisma
|
|
4
|
-
* `@updatedAt`, Kysely-side `$onUpdate` equivalents). The only new fact is `update: 'now'`;
|
|
5
|
-
* shape and creation rule are auto()'s, stated once there.
|
|
6
|
-
*/
|
|
7
2
|
export function updated() {
|
|
8
3
|
const base = created();
|
|
9
4
|
return base.with({ lifecycle: { ...base.lifecycle, update: 'now' } });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"updated.js","sourceRoot":"","sources":["../../src/vocabulary/updated.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAGvC
|
|
1
|
+
{"version":3,"file":"updated.js","sourceRoot":"","sources":["../../src/vocabulary/updated.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAGvC,MAAM,UAAU,OAAO;IACrB,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;AACxE,CAAC"}
|
package/dist/vocabulary/url.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { type TextOptions } from './text.js';
|
|
2
|
-
import type { Field } from '../
|
|
3
|
-
/** A string holding a URL — `text({ format: 'uri' })` (JSON Schema's name), named. */
|
|
2
|
+
import type { Field } from '../fields/Field.js';
|
|
4
3
|
export declare function url(opts?: Omit<TextOptions, 'format'>): Field<string>;
|
|
5
4
|
//# sourceMappingURL=url.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"url.d.ts","sourceRoot":"","sources":["../../src/vocabulary/url.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"url.d.ts","sourceRoot":"","sources":["../../src/vocabulary/url.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAEhD,wBAAgB,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAErE"}
|
package/dist/vocabulary/url.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"url.js","sourceRoot":"","sources":["../../src/vocabulary/url.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAoB,MAAM,WAAW,CAAC;AAGnD,
|
|
1
|
+
{"version":3,"file":"url.js","sourceRoot":"","sources":["../../src/vocabulary/url.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAoB,MAAM,WAAW,CAAC;AAGnD,MAAM,UAAU,GAAG,CAAC,IAAkC;IACpD,OAAO,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vocabulary.d.ts","sourceRoot":"","sources":["../../src/vocabulary/vocabulary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAM3C,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC,KAAK,CAAC,GACvC,SAAS,CAEX;AAED,MAAM,MAAM,SAAS,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { EXTENSION_SLOTS } from '../axis/Axis.js';
|
|
2
|
+
import { dequal } from 'dequal';
|
|
3
|
+
const MEMBER_SLOTS = [...EXTENSION_SLOTS, 'meta'];
|
|
4
|
+
export function vocabulary(name, states) {
|
|
5
|
+
return (field) => field.with(merge(name, field, states(field)));
|
|
6
|
+
}
|
|
7
|
+
function merge(name, field, stated) {
|
|
8
|
+
const out = {};
|
|
9
|
+
if ('shape' in stated)
|
|
10
|
+
out.shape = stated.shape;
|
|
11
|
+
for (const slot of MEMBER_SLOTS) {
|
|
12
|
+
const members = stated[slot];
|
|
13
|
+
if (members === undefined)
|
|
14
|
+
continue;
|
|
15
|
+
const held = field[slot];
|
|
16
|
+
if (typeof members !== 'object' || members === null || typeof held !== 'object') {
|
|
17
|
+
out[slot] = members;
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
for (const [member, value] of Object.entries(members)) {
|
|
21
|
+
const previous = held?.[member];
|
|
22
|
+
if (previous === undefined || dequal(previous, value))
|
|
23
|
+
continue;
|
|
24
|
+
throw new Error(`vocabulary: \`${name}\` states ${slot}.${member} = ${JSON.stringify(value)}, but the ` +
|
|
25
|
+
`field already states ${JSON.stringify(previous)}. Apply one or the other, not both.`);
|
|
26
|
+
}
|
|
27
|
+
out[slot] = { ...held, ...members };
|
|
28
|
+
}
|
|
29
|
+
return out;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=vocabulary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vocabulary.js","sourceRoot":"","sources":["../../src/vocabulary/vocabulary.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,MAAM,YAAY,GAAG,CAAC,GAAG,eAAe,EAAE,MAAM,CAAU,CAAC;AAE3D,MAAM,UAAU,UAAU,CACxB,IAAY,EACZ,MAAwC;IAExC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAClE,CAAC;AAID,SAAS,KAAK,CAAC,IAAY,EAAE,KAAY,EAAE,MAAsB;IAC/D,MAAM,GAAG,GAA4B,EAAE,CAAC;IACxC,IAAI,OAAO,IAAI,MAAM;QAAE,GAAG,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IAEhD,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,OAAO,KAAK,SAAS;YAAE,SAAS;QACpC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAwC,CAAC;QAChE,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAChF,GAAG,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC;YACpB,SAAS;QACX,CAAC;QACD,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACtD,MAAM,QAAQ,GAAG,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC;YAChC,IAAI,QAAQ,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC;gBAAE,SAAS;YAChE,MAAM,IAAI,KAAK,CACb,iBAAiB,IAAI,aAAa,IAAI,IAAI,MAAM,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,YAAY;gBACrF,wBAAwB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,qCAAqC,CACxF,CAAC;QACJ,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC;IACtC,CAAC;IACD,OAAO,GAAqB,CAAC;AAC/B,CAAC"}
|
|
@@ -1,7 +1,3 @@
|
|
|
1
|
-
import { Field } from '../
|
|
2
|
-
|
|
3
|
-
* Close the OUTBOUND direction — accepted at create/patch, never emitted (the canonical
|
|
4
|
-
* password). `encodeFields` omits it. Inbound is untouched.
|
|
5
|
-
*/
|
|
6
|
-
export declare function writeOnly<T>(field: Field<T>): Field<T>;
|
|
1
|
+
import { Field } from '../fields/Field.js';
|
|
2
|
+
export declare const writeOnly: <T>(field: Field<T>) => Field<T>;
|
|
7
3
|
//# sourceMappingURL=writeOnly.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"writeOnly.d.ts","sourceRoot":"","sources":["../../src/vocabulary/writeOnly.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"writeOnly.d.ts","sourceRoot":"","sources":["../../src/vocabulary/writeOnly.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,eAAO,MAAM,SAAS,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAEpD,CAAC"}
|
|
@@ -1,9 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
export function writeOnly(field) {
|
|
7
|
-
return field.with({ boundary: { ...declaredBoundary(field), out: 'closed' } });
|
|
8
|
-
}
|
|
1
|
+
import { vocabulary } from './vocabulary.js';
|
|
2
|
+
import { Boundary } from '../axis/boundary/Boundary.js';
|
|
3
|
+
export const writeOnly = vocabulary('writeOnly', (field) => ({
|
|
4
|
+
boundary: Boundary.declared(field).with({ out: 'closed' }),
|
|
5
|
+
}));
|
|
9
6
|
//# sourceMappingURL=writeOnly.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"writeOnly.js","sourceRoot":"","sources":["../../src/vocabulary/writeOnly.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"writeOnly.js","sourceRoot":"","sources":["../../src/vocabulary/writeOnly.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAGxD,MAAM,CAAC,MAAM,SAAS,GAAqC,UAAU,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC7F,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;CAC3D,CAAC,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fougere/schema",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "The entity and its 4 axes — shape, role, lifecycle, boundary.
|
|
3
|
+
"version": "0.4.0-alpha.0",
|
|
4
|
+
"description": "The entity and its 4 axes — shape, role, lifecycle, boundary. Subject-owned judgments, edge-safe.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"fougere",
|
|
7
7
|
"typescript",
|
|
@@ -29,13 +29,17 @@
|
|
|
29
29
|
}
|
|
30
30
|
},
|
|
31
31
|
"files": [
|
|
32
|
-
"dist"
|
|
32
|
+
"dist",
|
|
33
|
+
"src"
|
|
33
34
|
],
|
|
34
35
|
"dependencies": {
|
|
35
36
|
"@cfworker/json-schema": "^4.1.1",
|
|
36
|
-
"@paralleldrive/cuid2": "^3.3.0"
|
|
37
|
+
"@paralleldrive/cuid2": "^3.3.0",
|
|
38
|
+
"dequal": "^2.0.3"
|
|
37
39
|
},
|
|
38
40
|
"devDependencies": {
|
|
41
|
+
"@tanstack/form-core": "^1.33.5",
|
|
42
|
+
"@trpc/server": "^11.18.0",
|
|
39
43
|
"@types/json-schema": "^7.0.15"
|
|
40
44
|
},
|
|
41
45
|
"publishConfig": {
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import type { FieldName, Fields } from './fields/Field.js';
|
|
2
|
+
import { isObject } from './judge/ValueForm.js';
|
|
3
|
+
|
|
4
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-empty-object-type
|
|
5
|
+
export interface FougereEntityAdapters<K extends string> {}
|
|
6
|
+
|
|
7
|
+
export type EntityAdapters<TFields extends Fields> = Partial<FougereEntityAdapters<FieldName<TFields>>>;
|
|
8
|
+
|
|
9
|
+
/** What `cut` REQUIRES of an augmentation, and the open registry cannot state: addressed by field. */
|
|
10
|
+
type FieldEntries = Record<FieldName<Fields>, unknown>;
|
|
11
|
+
|
|
12
|
+
type AdapterEntries = Record<string, FieldEntries>;
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* What one schema states per adapter: an adapter name, a field name, then that adapter's own value.
|
|
16
|
+
*/
|
|
17
|
+
export class EntityAdapterSet {
|
|
18
|
+
private constructor(private readonly byAdapter: AdapterEntries) {}
|
|
19
|
+
|
|
20
|
+
static of(declared: EntityAdapters<Fields> | undefined): EntityAdapterSet | undefined {
|
|
21
|
+
if (declared === undefined) return undefined;
|
|
22
|
+
|
|
23
|
+
if (!isObject(declared)) {
|
|
24
|
+
throw new Error(
|
|
25
|
+
`adapters: expected an object keyed by adapter name, got ${typeof declared}.`,
|
|
26
|
+
);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const byAdapter: AdapterEntries = {};
|
|
30
|
+
|
|
31
|
+
for (const [adapter, perField] of Object.entries(declared as AdapterEntries)) {
|
|
32
|
+
if (perField === undefined) continue;
|
|
33
|
+
|
|
34
|
+
if (!isObject(perField)) {
|
|
35
|
+
throw new Error(
|
|
36
|
+
`adapters.${adapter}: expected an object keyed by field name, got ${typeof perField}. ` +
|
|
37
|
+
`What an adapter is handed is addressed by the field it applies to.`,
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
if (Object.keys(perField).length) byAdapter[adapter] = perField;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return EntityAdapterSet.made(byAdapter);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/** Several schemas folded into one set; a later source wins, per adapter and per field. */
|
|
48
|
+
static merged(sources: readonly (EntityAdapters<Fields> | undefined)[]): EntityAdapterSet | undefined {
|
|
49
|
+
const out: AdapterEntries = {};
|
|
50
|
+
|
|
51
|
+
for (const source of sources) {
|
|
52
|
+
const set = EntityAdapterSet.of(source);
|
|
53
|
+
if (!set) continue;
|
|
54
|
+
|
|
55
|
+
for (const [adapter, perField] of Object.entries(set.byAdapter)) {
|
|
56
|
+
out[adapter] = { ...out[adapter], ...perField };
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
return EntityAdapterSet.made(out);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** The plain object, which is what a reader outside this package receives. */
|
|
64
|
+
get stated(): EntityAdapters<Fields> {
|
|
65
|
+
return this.byAdapter as EntityAdapters<Fields>;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* The entries whose field survives a cut, re-addressed by that field's new name.
|
|
70
|
+
*
|
|
71
|
+
* The adapter name is not a field and does not move; only the level below it does. An
|
|
72
|
+
* entry left on the old name is not an error anywhere downstream — `adapter/sql` looks
|
|
73
|
+
* it up by the field it is iterating and simply finds nothing.
|
|
74
|
+
*/
|
|
75
|
+
cut(survives: (key: string) => string | undefined): EntityAdapterSet | undefined {
|
|
76
|
+
const out: AdapterEntries = {};
|
|
77
|
+
|
|
78
|
+
for (const [adapter, perField] of Object.entries(this.byAdapter)) {
|
|
79
|
+
const mapped: FieldEntries = {};
|
|
80
|
+
|
|
81
|
+
for (const [key, entry] of Object.entries(perField)) {
|
|
82
|
+
const next = survives(key);
|
|
83
|
+
if (next !== undefined) mapped[next] = entry;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
if (Object.keys(mapped).length) out[adapter] = mapped;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
return EntityAdapterSet.made(out);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
private static made(byAdapter: AdapterEntries): EntityAdapterSet | undefined {
|
|
93
|
+
return Object.keys(byAdapter).length ? new EntityAdapterSet(byAdapter) : undefined;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { FieldName, Fields } from './fields/Field.js';
|
|
2
|
+
import type { EntityAdapters } from './EntityAdapters.js';
|
|
3
|
+
|
|
4
|
+
export type CompositeUnique<TFields extends Fields> = readonly (readonly FieldName<TFields>[])[];
|
|
5
|
+
|
|
6
|
+
/** New name to old name: the field states what it WAS, which is how a human writes it. */
|
|
7
|
+
export type PreviousNames<TFields extends Fields> = Partial<
|
|
8
|
+
Record<FieldName<TFields>, string>
|
|
9
|
+
>;
|
|
10
|
+
|
|
11
|
+
export interface EntityDeclarations<TFields extends Fields> {
|
|
12
|
+
unique?: CompositeUnique<TFields>;
|
|
13
|
+
adapters?: EntityAdapters<TFields>;
|
|
14
|
+
/**
|
|
15
|
+
* What a field used to be called — read by `fougere freeze` and by nothing else.
|
|
16
|
+
* It answers the one question two shapes cannot, and is meant to be deleted after.
|
|
17
|
+
*/
|
|
18
|
+
previous?: PreviousNames<TFields>;
|
|
19
|
+
}
|
package/src/axis/Axis.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { roleAxis } from './role/RoleAxis.js';
|
|
2
|
+
import { lifecycleAxis } from './lifecycle/LifecycleAxis.js';
|
|
3
|
+
import { boundaryAxis } from './boundary/BoundaryAxis.js';
|
|
4
|
+
import type { ValidationError } from '../judge/result.js';
|
|
5
|
+
|
|
6
|
+
export interface Axis<Declared = unknown, Wire = unknown> {
|
|
7
|
+
readonly slot: 'role' | 'lifecycle' | 'boundary';
|
|
8
|
+
|
|
9
|
+
judge(value: unknown, errors: ValidationError[]): void;
|
|
10
|
+
|
|
11
|
+
describe(value: Declared, key: string): Wire | undefined;
|
|
12
|
+
|
|
13
|
+
reconstruct(wire: Wire, resolve?: Resolver): Declared;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export type Resolver = (name: string) => (abstract new (...args: never[]) => unknown) | undefined;
|
|
17
|
+
|
|
18
|
+
export const EXTENSION_AXES: readonly Axis[] = [
|
|
19
|
+
roleAxis,
|
|
20
|
+
lifecycleAxis,
|
|
21
|
+
boundaryAxis,
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
/** The slots they occupy: the keys of `x-fougere` on a field descriptor. */
|
|
25
|
+
export const EXTENSION_SLOTS = EXTENSION_AXES.map((axis) => axis.slot);
|
package/src/axis/Meta.ts
ADDED