@fougere/schema 0.12.0-alpha.0 → 0.12.2-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/dist/FougereFieldAxes.d.ts +3 -0
- package/dist/FougereFieldAxes.d.ts.map +1 -0
- package/dist/FougereFieldAxes.js +2 -0
- package/dist/FougereFieldAxes.js.map +1 -0
- package/dist/Schema.d.ts +4 -3
- package/dist/Schema.d.ts.map +1 -1
- package/dist/Schema.js +3 -0
- package/dist/Schema.js.map +1 -1
- package/dist/SchemaConstraints.d.ts +13 -10
- package/dist/SchemaConstraints.d.ts.map +1 -1
- package/dist/SchemaConstraints.js +32 -20
- package/dist/SchemaConstraints.js.map +1 -1
- package/dist/SchemaDefinition.d.ts.map +1 -1
- package/dist/SchemaDefinition.js +6 -5
- package/dist/SchemaDefinition.js.map +1 -1
- package/dist/SchemaError.d.ts +4 -1
- package/dist/SchemaError.d.ts.map +1 -1
- package/dist/SchemaError.js +6 -3
- package/dist/SchemaError.js.map +1 -1
- package/dist/SchemaView.d.ts +3 -2
- package/dist/SchemaView.d.ts.map +1 -1
- package/dist/axis/Axes.d.ts +16 -0
- package/dist/axis/Axes.d.ts.map +1 -0
- package/dist/axis/Axes.js +27 -0
- package/dist/axis/Axes.js.map +1 -0
- package/dist/axis/Axis.d.ts +15 -9
- package/dist/axis/Axis.d.ts.map +1 -1
- package/dist/axis/Axis.js +1 -10
- package/dist/axis/Axis.js.map +1 -1
- package/dist/axis/boundary/Boundary.d.ts +38 -5
- package/dist/axis/boundary/Boundary.d.ts.map +1 -1
- package/dist/axis/boundary/Boundary.js +18 -11
- package/dist/axis/boundary/Boundary.js.map +1 -1
- package/dist/axis/boundary/Decoder.d.ts +8 -2
- package/dist/axis/boundary/Decoder.d.ts.map +1 -1
- package/dist/axis/boundary/Decoder.js.map +1 -1
- package/dist/axis/lifecycle/Lifecycle.d.ts +29 -8
- package/dist/axis/lifecycle/Lifecycle.d.ts.map +1 -1
- package/dist/axis/lifecycle/Lifecycle.js +26 -11
- package/dist/axis/lifecycle/Lifecycle.js.map +1 -1
- package/dist/axis/lifecycle/apply.d.ts.map +1 -1
- package/dist/axis/lifecycle/apply.js +3 -4
- package/dist/axis/lifecycle/apply.js.map +1 -1
- package/dist/axis/role/Role.d.ts +31 -12
- package/dist/axis/role/Role.d.ts.map +1 -1
- package/dist/axis/role/Role.js +56 -22
- package/dist/axis/role/Role.js.map +1 -1
- package/dist/axis/shape/Shape.d.ts +32 -9
- package/dist/axis/shape/Shape.d.ts.map +1 -1
- package/dist/axis/shape/Shape.js +43 -12
- package/dist/axis/shape/Shape.js.map +1 -1
- package/dist/axis/shape/ShapeFormat.d.ts +10 -0
- package/dist/axis/shape/ShapeFormat.d.ts.map +1 -0
- package/dist/axis/shape/ShapeFormat.js +32 -0
- package/dist/axis/shape/ShapeFormat.js.map +1 -0
- package/dist/axis/shape/{Formats.d.ts → StringFormats.d.ts} +3 -3
- package/dist/axis/shape/StringFormats.d.ts.map +1 -0
- package/dist/axis/shape/{Formats.js → StringFormats.js} +3 -3
- package/dist/axis/shape/StringFormats.js.map +1 -0
- package/dist/entity/EntityDeclarations.d.ts +3 -2
- package/dist/entity/EntityDeclarations.d.ts.map +1 -1
- package/dist/entity/FieldGroups.d.ts +9 -0
- package/dist/entity/FieldGroups.d.ts.map +1 -0
- package/dist/entity/FieldGroups.js +2 -0
- package/dist/entity/FieldGroups.js.map +1 -0
- package/dist/field/Field.d.ts +37 -12
- package/dist/field/Field.d.ts.map +1 -1
- package/dist/field/Field.js +55 -8
- package/dist/field/Field.js.map +1 -1
- package/dist/field/FieldFormat.d.ts +9 -0
- package/dist/field/FieldFormat.d.ts.map +1 -0
- package/dist/field/FieldFormat.js +12 -0
- package/dist/field/FieldFormat.js.map +1 -0
- package/dist/field/FieldSet.d.ts +12 -3
- package/dist/field/FieldSet.d.ts.map +1 -1
- package/dist/field/FieldSet.js +22 -15
- package/dist/field/FieldSet.js.map +1 -1
- package/dist/index.d.ts +7 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -3
- package/dist/index.js.map +1 -1
- package/dist/lib/Format.d.ts +75 -0
- package/dist/lib/Format.d.ts.map +1 -0
- package/dist/lib/Format.js +123 -0
- package/dist/lib/Format.js.map +1 -0
- package/dist/lib/JsonSchema.d.ts +2 -0
- package/dist/lib/JsonSchema.d.ts.map +1 -0
- package/dist/lib/JsonSchema.js +2 -0
- package/dist/lib/JsonSchema.js.map +1 -0
- package/dist/lib/Registry.d.ts +4 -2
- package/dist/lib/Registry.d.ts.map +1 -1
- package/dist/lib/Registry.js +11 -5
- package/dist/lib/Registry.js.map +1 -1
- package/dist/lib/UnionToIntersection.d.ts +7 -0
- package/dist/lib/UnionToIntersection.d.ts.map +1 -0
- package/dist/lib/UnionToIntersection.js +2 -0
- package/dist/lib/UnionToIntersection.js.map +1 -0
- package/dist/lib/ValidationResult.d.ts +2 -0
- package/dist/lib/ValidationResult.d.ts.map +1 -1
- package/dist/lib/ValidationResult.js +6 -0
- package/dist/lib/ValidationResult.js.map +1 -1
- package/dist/lib/utils.d.ts +1 -1
- package/dist/lib/utils.d.ts.map +1 -1
- package/dist/lib/utils.js +1 -1
- package/dist/lib/utils.js.map +1 -1
- package/dist/projection/Cases.d.ts +1 -1
- package/dist/projection/Cases.d.ts.map +1 -1
- package/dist/projection/Cases.js +20 -8
- package/dist/projection/Cases.js.map +1 -1
- package/dist/projection/Visibility.d.ts +11 -0
- package/dist/projection/Visibility.d.ts.map +1 -1
- package/dist/projection/Visibility.js +28 -6
- package/dist/projection/Visibility.js.map +1 -1
- package/dist/projection/card/Bundle.d.ts.map +1 -1
- package/dist/projection/card/Bundle.js.map +1 -1
- package/dist/projection/card/Card.d.ts.map +1 -1
- package/dist/projection/card/Card.js +24 -30
- package/dist/projection/card/Card.js.map +1 -1
- package/dist/projection/card/CardForm.d.ts +7 -0
- package/dist/projection/card/CardForm.d.ts.map +1 -0
- package/dist/projection/card/CardForm.js +2 -0
- package/dist/projection/card/CardForm.js.map +1 -0
- package/dist/projection/card/CardForms.d.ts +10 -0
- package/dist/projection/card/CardForms.d.ts.map +1 -0
- package/dist/projection/card/CardForms.js +12 -0
- package/dist/projection/card/CardForms.js.map +1 -0
- package/dist/projection/card/Change.d.ts +2 -2
- package/dist/projection/card/Change.d.ts.map +1 -1
- package/dist/projection/card/Diff.js +2 -2
- package/dist/projection/card/Diff.js.map +1 -1
- package/dist/projection/card/FieldExtension.d.ts +4 -2
- package/dist/projection/card/FieldExtension.d.ts.map +1 -1
- package/dist/projection/card/RoleDescriptor.d.ts +15 -3
- package/dist/projection/card/RoleDescriptor.d.ts.map +1 -1
- package/dist/projection/card/RoleDescriptor.js +40 -1
- package/dist/projection/card/RoleDescriptor.js.map +1 -1
- package/dist/projection/card/ShapeKeywords.d.ts +1 -1
- package/dist/projection/card/ShapeKeywords.d.ts.map +1 -1
- package/dist/projection/card/admission.d.ts +0 -14
- package/dist/projection/card/admission.d.ts.map +1 -1
- package/dist/projection/card/admission.js +0 -20
- package/dist/projection/card/admission.js.map +1 -1
- package/dist/validator/FieldDeclarationValidator.d.ts.map +1 -1
- package/dist/validator/FieldDeclarationValidator.js +10 -25
- package/dist/validator/FieldDeclarationValidator.js.map +1 -1
- package/dist/validator/FieldValueValidator.d.ts.map +1 -1
- package/dist/validator/FieldValueValidator.js +9 -29
- package/dist/validator/FieldValueValidator.js.map +1 -1
- package/dist/validator/InputValidator.d.ts +7 -1
- package/dist/validator/InputValidator.d.ts.map +1 -1
- package/dist/validator/InputValidator.js +15 -14
- package/dist/validator/InputValidator.js.map +1 -1
- package/dist/validator/JsonSchemaValidator.d.ts +23 -0
- package/dist/validator/JsonSchemaValidator.d.ts.map +1 -0
- package/dist/validator/JsonSchemaValidator.js +113 -0
- package/dist/validator/JsonSchemaValidator.js.map +1 -0
- package/dist/vocabulary/preset/created.d.ts +2 -2
- package/dist/vocabulary/preset/created.d.ts.map +1 -1
- package/dist/vocabulary/preset/created.js +2 -2
- package/dist/vocabulary/preset/created.js.map +1 -1
- package/dist/vocabulary/preset/updated.d.ts +2 -2
- package/dist/vocabulary/preset/updated.d.ts.map +1 -1
- package/dist/vocabulary/preset/updated.js +2 -2
- package/dist/vocabulary/preset/updated.js.map +1 -1
- package/dist/vocabulary/primitive/bool.d.ts +2 -5
- package/dist/vocabulary/primitive/bool.d.ts.map +1 -1
- package/dist/vocabulary/primitive/bool.js +1 -5
- package/dist/vocabulary/primitive/bool.js.map +1 -1
- package/dist/vocabulary/primitive/date.d.ts +2 -3
- package/dist/vocabulary/primitive/date.d.ts.map +1 -1
- package/dist/vocabulary/primitive/date.js +2 -3
- package/dist/vocabulary/primitive/date.js.map +1 -1
- package/dist/vocabulary/primitive/json.d.ts +3 -3
- package/dist/vocabulary/primitive/json.d.ts.map +1 -1
- package/dist/vocabulary/primitive/json.js +11 -11
- package/dist/vocabulary/primitive/json.js.map +1 -1
- package/dist/vocabulary/primitive/list.d.ts +6 -5
- package/dist/vocabulary/primitive/list.d.ts.map +1 -1
- package/dist/vocabulary/primitive/list.js +13 -7
- package/dist/vocabulary/primitive/list.js.map +1 -1
- package/dist/vocabulary/primitive/many.d.ts +2 -4
- package/dist/vocabulary/primitive/many.d.ts.map +1 -1
- package/dist/vocabulary/primitive/many.js +2 -4
- package/dist/vocabulary/primitive/many.js.map +1 -1
- package/dist/vocabulary/primitive/number.d.ts +2 -4
- package/dist/vocabulary/primitive/number.d.ts.map +1 -1
- package/dist/vocabulary/primitive/number.js +1 -3
- package/dist/vocabulary/primitive/number.js.map +1 -1
- package/dist/vocabulary/primitive/oneOf.d.ts +4 -7
- package/dist/vocabulary/primitive/oneOf.d.ts.map +1 -1
- package/dist/vocabulary/primitive/oneOf.js +19 -11
- package/dist/vocabulary/primitive/oneOf.js.map +1 -1
- package/dist/vocabulary/primitive/primary.d.ts +2 -2
- package/dist/vocabulary/primitive/primary.d.ts.map +1 -1
- package/dist/vocabulary/primitive/primary.js +2 -3
- package/dist/vocabulary/primitive/primary.js.map +1 -1
- package/dist/vocabulary/primitive/ref.d.ts +2 -6
- package/dist/vocabulary/primitive/ref.d.ts.map +1 -1
- package/dist/vocabulary/primitive/ref.js +1 -1
- package/dist/vocabulary/primitive/ref.js.map +1 -1
- package/dist/vocabulary/primitive/text.d.ts +2 -4
- package/dist/vocabulary/primitive/text.d.ts.map +1 -1
- package/dist/vocabulary/primitive/text.js +1 -3
- package/dist/vocabulary/primitive/text.js.map +1 -1
- package/dist/vocabulary/rule/nullable.d.ts +0 -1
- package/dist/vocabulary/rule/nullable.d.ts.map +1 -1
- package/dist/vocabulary/rule/nullable.js +0 -1
- package/dist/vocabulary/rule/nullable.js.map +1 -1
- package/dist/vocabulary/rule/optional.d.ts +0 -1
- package/dist/vocabulary/rule/optional.d.ts.map +1 -1
- package/dist/vocabulary/rule/optional.js +0 -1
- package/dist/vocabulary/rule/optional.js.map +1 -1
- package/dist/vocabulary/rule/readOnly.d.ts +0 -2
- package/dist/vocabulary/rule/readOnly.d.ts.map +1 -1
- package/dist/vocabulary/rule/readOnly.js +0 -2
- package/dist/vocabulary/rule/readOnly.js.map +1 -1
- package/dist/vocabulary/rule/writeOnly.d.ts +0 -2
- package/dist/vocabulary/rule/writeOnly.d.ts.map +1 -1
- package/dist/vocabulary/rule/writeOnly.js +0 -2
- package/dist/vocabulary/rule/writeOnly.js.map +1 -1
- package/dist/vocabulary/vocabulary.d.ts +2 -3
- package/dist/vocabulary/vocabulary.d.ts.map +1 -1
- package/dist/vocabulary/vocabulary.js +18 -20
- package/dist/vocabulary/vocabulary.js.map +1 -1
- package/package.json +1 -1
- package/src/FougereFieldAxes.ts +2 -0
- package/src/Schema.ts +11 -8
- package/src/SchemaConstraints.ts +40 -22
- package/src/SchemaDefinition.ts +7 -5
- package/src/SchemaError.ts +9 -3
- package/src/SchemaView.ts +3 -2
- package/src/axis/Axes.ts +34 -0
- package/src/axis/Axis.ts +15 -19
- package/src/axis/boundary/Boundary.ts +39 -13
- package/src/axis/boundary/Decoder.ts +3 -1
- package/src/axis/lifecycle/Lifecycle.ts +42 -14
- package/src/axis/lifecycle/apply.ts +12 -6
- package/src/axis/role/Role.ts +73 -25
- package/src/axis/shape/Shape.ts +89 -23
- package/src/axis/shape/ShapeFormat.ts +37 -0
- package/src/axis/shape/{Formats.ts → StringFormats.ts} +2 -2
- package/src/entity/EntityDeclarations.ts +3 -2
- package/src/entity/FieldGroups.ts +9 -0
- package/src/field/Field.ts +89 -16
- package/src/field/FieldFormat.ts +18 -0
- package/src/field/FieldSet.ts +27 -19
- package/src/index.ts +7 -3
- package/src/lib/Format.ts +172 -0
- package/src/lib/JsonSchema.ts +1 -0
- package/src/lib/Registry.ts +14 -6
- package/src/lib/UnionToIntersection.ts +10 -0
- package/src/lib/ValidationResult.ts +8 -0
- package/src/lib/utils.ts +5 -1
- package/src/projection/Cases.ts +25 -8
- package/src/projection/Visibility.ts +31 -6
- package/src/projection/card/Bundle.ts +2 -0
- package/src/projection/card/Card.ts +29 -27
- package/src/projection/card/CardForm.ts +8 -0
- package/src/projection/card/CardForms.ts +13 -0
- package/src/projection/card/Change.ts +2 -2
- package/src/projection/card/Diff.ts +6 -2
- package/src/projection/card/FieldExtension.ts +5 -2
- package/src/projection/card/RoleDescriptor.ts +54 -3
- package/src/projection/card/ShapeKeywords.ts +1 -1
- package/src/projection/card/admission.ts +0 -33
- package/src/validator/FieldDeclarationValidator.ts +10 -25
- package/src/validator/FieldValueValidator.ts +13 -36
- package/src/validator/InputValidator.ts +17 -12
- package/src/validator/JsonSchemaValidator.ts +142 -0
- package/src/vocabulary/preset/created.ts +3 -3
- package/src/vocabulary/preset/updated.ts +4 -3
- package/src/vocabulary/primitive/bool.ts +3 -8
- package/src/vocabulary/primitive/date.ts +5 -4
- package/src/vocabulary/primitive/json.ts +27 -12
- package/src/vocabulary/primitive/list.ts +16 -9
- package/src/vocabulary/primitive/many.ts +3 -4
- package/src/vocabulary/primitive/number.ts +3 -8
- package/src/vocabulary/primitive/oneOf.ts +40 -24
- package/src/vocabulary/primitive/primary.ts +9 -5
- package/src/vocabulary/primitive/ref.ts +3 -7
- package/src/vocabulary/primitive/text.ts +3 -8
- package/src/vocabulary/rule/nullable.ts +0 -1
- package/src/vocabulary/rule/optional.ts +0 -1
- package/src/vocabulary/rule/readOnly.ts +0 -2
- package/src/vocabulary/rule/writeOnly.ts +0 -2
- package/src/vocabulary/vocabulary.ts +19 -21
- package/dist/axis/boundary/BoundaryAxis.d.ts +0 -4
- package/dist/axis/boundary/BoundaryAxis.d.ts.map +0 -1
- package/dist/axis/boundary/BoundaryAxis.js +0 -30
- package/dist/axis/boundary/BoundaryAxis.js.map +0 -1
- package/dist/axis/boundary/BoundaryRef.d.ts +0 -3
- package/dist/axis/boundary/BoundaryRef.d.ts.map +0 -1
- package/dist/axis/boundary/BoundaryRef.js +0 -2
- package/dist/axis/boundary/BoundaryRef.js.map +0 -1
- package/dist/axis/boundary/BoundaryRules.d.ts +0 -9
- package/dist/axis/boundary/BoundaryRules.d.ts.map +0 -1
- package/dist/axis/boundary/BoundaryRules.js +0 -2
- package/dist/axis/boundary/BoundaryRules.js.map +0 -1
- package/dist/axis/lifecycle/Clock.d.ts +0 -10
- package/dist/axis/lifecycle/Clock.d.ts.map +0 -1
- package/dist/axis/lifecycle/Clock.js +0 -19
- package/dist/axis/lifecycle/Clock.js.map +0 -1
- package/dist/axis/lifecycle/LifecycleAxis.d.ts +0 -4
- package/dist/axis/lifecycle/LifecycleAxis.d.ts.map +0 -1
- package/dist/axis/lifecycle/LifecycleAxis.js +0 -52
- package/dist/axis/lifecycle/LifecycleAxis.js.map +0 -1
- package/dist/axis/lifecycle/LifecycleRules.d.ts +0 -12
- package/dist/axis/lifecycle/LifecycleRules.d.ts.map +0 -1
- package/dist/axis/lifecycle/LifecycleRules.js +0 -3
- package/dist/axis/lifecycle/LifecycleRules.js.map +0 -1
- package/dist/axis/role/RoleAxis.d.ts +0 -5
- package/dist/axis/role/RoleAxis.d.ts.map +0 -1
- package/dist/axis/role/RoleAxis.js +0 -93
- package/dist/axis/role/RoleAxis.js.map +0 -1
- package/dist/axis/role/RoleRules.d.ts +0 -8
- package/dist/axis/role/RoleRules.d.ts.map +0 -1
- package/dist/axis/role/RoleRules.js +0 -2
- package/dist/axis/role/RoleRules.js.map +0 -1
- package/dist/axis/shape/Formats.d.ts.map +0 -1
- package/dist/axis/shape/Formats.js.map +0 -1
- package/dist/entity/CompositeUnique.d.ts +0 -4
- package/dist/entity/CompositeUnique.d.ts.map +0 -1
- package/dist/entity/CompositeUnique.js +0 -2
- package/dist/entity/CompositeUnique.js.map +0 -1
- package/dist/field/Meta.d.ts +0 -4
- package/dist/field/Meta.d.ts.map +0 -1
- package/dist/field/Meta.js +0 -2
- package/dist/field/Meta.js.map +0 -1
- package/dist/projection/card/RelationDescriptor.d.ts +0 -5
- package/dist/projection/card/RelationDescriptor.d.ts.map +0 -1
- package/dist/projection/card/RelationDescriptor.js +0 -2
- package/dist/projection/card/RelationDescriptor.js.map +0 -1
- package/dist/validator/AdapterFieldValidator.d.ts +0 -14
- package/dist/validator/AdapterFieldValidator.d.ts.map +0 -1
- package/dist/validator/AdapterFieldValidator.js +0 -37
- package/dist/validator/AdapterFieldValidator.js.map +0 -1
- package/src/axis/boundary/BoundaryAxis.ts +0 -32
- package/src/axis/boundary/BoundaryRef.ts +0 -3
- package/src/axis/boundary/BoundaryRules.ts +0 -4
- package/src/axis/lifecycle/Clock.ts +0 -22
- package/src/axis/lifecycle/LifecycleAxis.ts +0 -55
- package/src/axis/lifecycle/LifecycleRules.ts +0 -9
- package/src/axis/role/RoleAxis.ts +0 -104
- package/src/axis/role/RoleRules.ts +0 -8
- package/src/entity/CompositeUnique.ts +0 -6
- package/src/field/Meta.ts +0 -3
- package/src/projection/card/RelationDescriptor.ts +0 -3
- package/src/validator/AdapterFieldValidator.ts +0 -41
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"number.js","sourceRoot":"","sources":["../../../src/vocabulary/primitive/number.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"number.js","sourceRoot":"","sources":["../../../src/vocabulary/primitive/number.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAe,MAAM,sBAAsB,CAAC;AAQ1D,MAAM,UAAU,MAAM,CAAC,IAAoB;IACzC,OAAO,IAAI,KAAK,CAAS;QACvB,KAAK,EAAE;YACL,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ;YAC1C,OAAO,EAAE,IAAI,EAAE,GAAG;YAClB,OAAO,EAAE,IAAI,EAAE,GAAG;SACnB;KACF,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AACrB,CAAC"}
|
|
@@ -1,9 +1,6 @@
|
|
|
1
|
-
import { Field } from '../../field/Field.js';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
}
|
|
6
|
-
export declare function oneOf<const T extends readonly string[]>(...values: [...T]): Field<T[number]>;
|
|
7
|
-
export declare function oneOf<const T extends readonly string[]>(...args: [...T, OneOfOptions<T[number]>]): Field<T[number]>;
|
|
1
|
+
import { Field, type Shared } from '../../field/Field.js';
|
|
2
|
+
type Values = readonly [string, ...string[]] | readonly [number, ...number[]];
|
|
3
|
+
export declare function oneOf<const T extends Values>(...values: [...T]): Field<T[number]>;
|
|
4
|
+
export declare function oneOf<const T extends Values>(...args: [...T, Shared<T[number]>]): Field<T[number]>;
|
|
8
5
|
export {};
|
|
9
6
|
//# sourceMappingURL=oneOf.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oneOf.d.ts","sourceRoot":"","sources":["../../../src/vocabulary/primitive/oneOf.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"oneOf.d.ts","sourceRoot":"","sources":["../../../src/vocabulary/primitive/oneOf.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAK1D,KAAK,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;AAE9E,wBAAgB,KAAK,CAAC,KAAK,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AAEnF,wBAAgB,KAAK,CAAC,KAAK,CAAC,CAAC,SAAS,MAAM,EAC1C,GAAG,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GACjC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC"}
|
|
@@ -1,18 +1,26 @@
|
|
|
1
1
|
import { Field } from '../../field/Field.js';
|
|
2
|
+
import { isArrayOf, isObject } from '../../lib/utils.js';
|
|
3
|
+
import { SchemaError } from '../../SchemaError.js';
|
|
2
4
|
/**
|
|
3
|
-
* The set travels: GraphQL enum, form `select` and DDL `CHECK`, from this one declaration.
|
|
4
|
-
* FR : l'ensemble voyage : enum GraphQL, `select` du formulaire, `CHECK` du DDL.
|
|
5
5
|
* `oneOf('draft', 'published', { default: 'draft' })` → `{ type: 'string', enum: [...] }`
|
|
6
6
|
*/
|
|
7
7
|
export function oneOf(...args) {
|
|
8
|
-
const
|
|
9
|
-
const
|
|
10
|
-
const
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
8
|
+
const given = args;
|
|
9
|
+
const last = given.at(-1);
|
|
10
|
+
const opts = isObject(last) ? last : undefined;
|
|
11
|
+
const values = opts ? given.slice(0, -1) : given;
|
|
12
|
+
let shape = undefined;
|
|
13
|
+
if (values.length === 0)
|
|
14
|
+
throw new SchemaError('oneOf() takes strings or numbers, then an optional object of options', { received: given });
|
|
15
|
+
if (isArrayOf(values, (value) => typeof value === 'string'))
|
|
16
|
+
shape = { type: 'string', enum: values };
|
|
17
|
+
if (isArrayOf(values, (value) => typeof value === 'number'))
|
|
18
|
+
shape = {
|
|
19
|
+
type: values.every(Number.isInteger) ? 'integer' : 'number',
|
|
20
|
+
enum: values,
|
|
21
|
+
};
|
|
22
|
+
if (shape === undefined)
|
|
23
|
+
throw new SchemaError('oneOf() takes strings or numbers, then an optional object of options', { received: given });
|
|
24
|
+
return new Field({ shape }).setShared(opts);
|
|
17
25
|
}
|
|
18
26
|
//# sourceMappingURL=oneOf.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oneOf.js","sourceRoot":"","sources":["../../../src/vocabulary/primitive/oneOf.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"oneOf.js","sourceRoot":"","sources":["../../../src/vocabulary/primitive/oneOf.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAe,MAAM,sBAAsB,CAAC;AAE1D,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAUnD;;GAEG;AACH,MAAM,UAAU,KAAK,CACnB,GAAG,IAAwC;IAE3C,MAAM,KAAK,GAAuB,IAAI,CAAC;IACvC,MAAM,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAE1B,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAEjD,IAAI,KAAK,GAAsB,SAAS,CAAC;IAEzC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QACrB,MAAM,IAAI,WAAW,CACnB,sEAAsE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAC5F,CAAC;IAEJ,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC;QACzD,KAAK,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAE3C,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC;QACzD,KAAK,GAAG;YACN,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ;YAC3D,IAAI,EAAE,MAAM;SACb,CAAC;IAEJ,IAAI,KAAK,KAAK,SAAS;QACrB,MAAM,IAAI,WAAW,CACnB,sEAAsE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAC5F,CAAC;IAEJ,OAAO,IAAI,KAAK,CAAY,EAAE,KAAK,EAAE,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AACzD,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { Field } from '../../field/Field.js';
|
|
1
|
+
import { Field, type Described } from '../../field/Field.js';
|
|
2
2
|
import { type GeneratorRef } from '../../axis/lifecycle/Generators.js';
|
|
3
|
-
interface PrimaryOptions {
|
|
3
|
+
interface PrimaryOptions extends Described {
|
|
4
4
|
generate?: GeneratorRef | [name: string, fn: () => string];
|
|
5
5
|
}
|
|
6
6
|
export declare function primary(opts?: PrimaryOptions): Field<string>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"primary.d.ts","sourceRoot":"","sources":["../../../src/vocabulary/primitive/primary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"primary.d.ts","sourceRoot":"","sources":["../../../src/vocabulary/primitive/primary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAc,KAAK,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAEnF,UAAU,cAAe,SAAQ,SAAS;IACxC,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"}
|
|
@@ -2,7 +2,6 @@ import { Field } from '../../field/Field.js';
|
|
|
2
2
|
import { Generators } from '../../axis/lifecycle/Generators.js';
|
|
3
3
|
/**
|
|
4
4
|
* `primary()` for a generated id; `primary(number())` to make a declared field the key.
|
|
5
|
-
* FR : `primary()` pour un identifiant généré ; `primary(number())` pour promouvoir un champ.
|
|
6
5
|
* `primary()` → `create: { generate: 'cuid2' }`, `update: 'forbidden'`
|
|
7
6
|
*/
|
|
8
7
|
export function primary(fieldOrOptions) {
|
|
@@ -13,7 +12,7 @@ export function primary(fieldOrOptions) {
|
|
|
13
12
|
lifecycle: { ...field.lifecycle, update: 'forbidden' },
|
|
14
13
|
});
|
|
15
14
|
}
|
|
16
|
-
const opts =
|
|
15
|
+
const opts = fieldOrOptions ?? {};
|
|
17
16
|
let generate;
|
|
18
17
|
if (Array.isArray(opts.generate)) {
|
|
19
18
|
const [name, fn] = opts.generate;
|
|
@@ -27,6 +26,6 @@ export function primary(fieldOrOptions) {
|
|
|
27
26
|
shape: { type: 'string' },
|
|
28
27
|
role: { primary: true },
|
|
29
28
|
lifecycle: { create: { generate }, update: 'forbidden' },
|
|
30
|
-
});
|
|
29
|
+
}).setShared(opts);
|
|
31
30
|
}
|
|
32
31
|
//# sourceMappingURL=primary.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"primary.js","sourceRoot":"","sources":["../../../src/vocabulary/primitive/primary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"primary.js","sourceRoot":"","sources":["../../../src/vocabulary/primitive/primary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAkB,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAqB,MAAM,oCAAoC,CAAC;AAQnF;;;GAGG;AACH,MAAM,UAAU,OAAO,CAAC,cAAuC;IAC7D,IAAI,KAAK,CAAC,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,cAAc,CAAC;QAE7B,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,GAAmB,cAAc,IAAI,EAAE,CAAC;IAElD,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;QAEjC,UAAU,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAE9B,QAAQ,GAAG,IAAI,CAAC;IAClB,CAAC;SAAM,CAAC;QACN,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC;IACtC,CAAC;IAED,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,SAAS,CAAC,IAAI,CAAC,CAAC;AACrB,CAAC"}
|
|
@@ -1,11 +1,7 @@
|
|
|
1
1
|
import { type EntityConstructor } from '../../axis/role/EntityConstructor.js';
|
|
2
2
|
import { type OnDelete } from '../../axis/role/Relation.js';
|
|
3
|
-
import { Field } from '../../field/Field.js';
|
|
4
|
-
export interface RefOptions {
|
|
5
|
-
/**
|
|
6
|
-
* What becomes of this row when the target's is deleted. `restrict` is the default because
|
|
7
|
-
* it is what a foreign key already does when nothing is stated.
|
|
8
|
-
*/
|
|
3
|
+
import { Field, type Shared } from '../../field/Field.js';
|
|
4
|
+
export interface RefOptions extends Shared<string> {
|
|
9
5
|
onDelete?: OnDelete;
|
|
10
6
|
}
|
|
11
7
|
export declare function ref<E extends EntityConstructor>(target: E | (() => E), opts?: RefOptions): Field<string>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ref.d.ts","sourceRoot":"","sources":["../../../src/vocabulary/primitive/ref.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AAC9E,OAAO,EAAY,KAAK,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"ref.d.ts","sourceRoot":"","sources":["../../../src/vocabulary/primitive/ref.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AAC9E,OAAO,EAAY,KAAK,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,KAAK,EAAE,KAAK,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAE1D,MAAM,WAAW,UAAW,SAAQ,MAAM,CAAC,MAAM,CAAC;IAChD,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAED,wBAAgB,GAAG,CAAC,CAAC,SAAS,iBAAiB,EAC7C,MAAM,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EACrB,IAAI,CAAC,EAAE,UAAU,GAChB,KAAK,CAAC,MAAM,CAAC,CAKf"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ref.js","sourceRoot":"","sources":["../../../src/vocabulary/primitive/ref.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAiB,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"ref.js","sourceRoot":"","sources":["../../../src/vocabulary/primitive/ref.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAiB,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,KAAK,EAAe,MAAM,sBAAsB,CAAC;AAM1D,MAAM,UAAU,GAAG,CACjB,MAAqB,EACrB,IAAiB;IAEjB,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,QAAQ,CAAC,EAAE;KACzD,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AACrB,CAAC"}
|
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
import { Field } from '../../field/Field.js';
|
|
1
|
+
import { Field, type Shared } from '../../field/Field.js';
|
|
2
2
|
import { type StringFormat } from '../../axis/shape/StringFormat.js';
|
|
3
|
-
export interface TextOptions {
|
|
3
|
+
export interface TextOptions extends Shared<string> {
|
|
4
4
|
min?: number;
|
|
5
5
|
max?: number;
|
|
6
6
|
pattern?: string;
|
|
7
7
|
format?: StringFormat;
|
|
8
|
-
default?: string;
|
|
9
|
-
description?: string;
|
|
10
8
|
}
|
|
11
9
|
export declare function text(opts?: TextOptions): Field<string>;
|
|
12
10
|
//# sourceMappingURL=text.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../../src/vocabulary/primitive/text.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../../src/vocabulary/primitive/text.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAErE,MAAM,WAAW,WAAY,SAAQ,MAAM,CAAC,MAAM,CAAC;IACjD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED,wBAAgB,IAAI,CAAC,IAAI,CAAC,EAAE,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAUtD"}
|
|
@@ -8,8 +8,6 @@ export function text(opts) {
|
|
|
8
8
|
pattern: opts?.pattern,
|
|
9
9
|
format: opts?.format,
|
|
10
10
|
},
|
|
11
|
-
|
|
12
|
-
meta: opts?.description !== undefined ? { description: opts.description } : undefined,
|
|
13
|
-
});
|
|
11
|
+
}).setShared(opts);
|
|
14
12
|
}
|
|
15
13
|
//# sourceMappingURL=text.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text.js","sourceRoot":"","sources":["../../../src/vocabulary/primitive/text.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"text.js","sourceRoot":"","sources":["../../../src/vocabulary/primitive/text.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAe,MAAM,sBAAsB,CAAC;AAU1D,MAAM,UAAU,IAAI,CAAC,IAAkB;IACrC,OAAO,IAAI,KAAK,CAAS;QACvB,KAAK,EAAE;YACL,IAAI,EAAE,QAAQ;YACd,SAAS,EAAE,IAAI,EAAE,GAAG;YACpB,SAAS,EAAE,IAAI,EAAE,GAAG;YACpB,OAAO,EAAE,IAAI,EAAE,OAAO;YACtB,MAAM,EAAE,IAAI,EAAE,MAAM;SACrB;KACF,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AACrB,CAAC"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { type Field } from '../../field/Field.js';
|
|
2
2
|
/**
|
|
3
3
|
* Adds `null` and leaves the field REQUIRED — `optional()` is the one permitting absence.
|
|
4
|
-
* FR : ajoute `null` en laissant le champ OBLIGATOIRE — `optional()` permet l'absence.
|
|
5
4
|
* `nullable(text())` → `{ type: ['string', 'null'] }`, and `validate({})` still refuses
|
|
6
5
|
*/
|
|
7
6
|
export declare const nullable: <T>(field: Field<T>) => Field<T | null>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nullable.d.ts","sourceRoot":"","sources":["../../../src/vocabulary/rule/nullable.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAElD
|
|
1
|
+
{"version":3,"file":"nullable.d.ts","sourceRoot":"","sources":["../../../src/vocabulary/rule/nullable.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAElD;;;GAGG;AACH,eAAO,MAAM,QAAQ,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,GAAG,IAAI,CAK5D,CAAC"}
|
|
@@ -2,7 +2,6 @@ import { vocabulary } from '../vocabulary.js';
|
|
|
2
2
|
import { Shapes } from '../../axis/shape/Shape.js';
|
|
3
3
|
/**
|
|
4
4
|
* Adds `null` and leaves the field REQUIRED — `optional()` is the one permitting absence.
|
|
5
|
-
* FR : ajoute `null` en laissant le champ OBLIGATOIRE — `optional()` permet l'absence.
|
|
6
5
|
* `nullable(text())` → `{ type: ['string', 'null'] }`, and `validate({})` still refuses
|
|
7
6
|
*/
|
|
8
7
|
export const nullable = vocabulary('nullable', (field) => ({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nullable.js","sourceRoot":"","sources":["../../../src/vocabulary/rule/nullable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AAGnD
|
|
1
|
+
{"version":3,"file":"nullable.js","sourceRoot":"","sources":["../../../src/vocabulary/rule/nullable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AAGnD;;;GAGG;AACH,MAAM,CAAC,MAAM,QAAQ,GAA4C,UAAU,CACzE,UAAU,EACV,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACV,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC;CACpC,CAAC,CACH,CAAC"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { type Field } from '../../field/Field.js';
|
|
2
2
|
/**
|
|
3
3
|
* Adds `null` AND permits absence. A field that already states a `create` rule keeps it.
|
|
4
|
-
* FR : ajoute `null` ET permet l'absence. Un champ qui énonce déjà un `create` le garde.
|
|
5
4
|
* `optional(text())` → `{ type: ['string', 'null'] }` and `create: 'optional'`
|
|
6
5
|
*/
|
|
7
6
|
export declare const optional: <T>(field: Field<T>) => Field<T | null>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"optional.d.ts","sourceRoot":"","sources":["../../../src/vocabulary/rule/optional.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAElD
|
|
1
|
+
{"version":3,"file":"optional.d.ts","sourceRoot":"","sources":["../../../src/vocabulary/rule/optional.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAElD;;;GAGG;AACH,eAAO,MAAM,QAAQ,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,GAAG,IAAI,CAQ5D,CAAC"}
|
|
@@ -2,7 +2,6 @@ import { vocabulary } from '../vocabulary.js';
|
|
|
2
2
|
import { Shapes } from '../../axis/shape/Shape.js';
|
|
3
3
|
/**
|
|
4
4
|
* Adds `null` AND permits absence. A field that already states a `create` rule keeps it.
|
|
5
|
-
* FR : ajoute `null` ET permet l'absence. Un champ qui énonce déjà un `create` le garde.
|
|
6
5
|
* `optional(text())` → `{ type: ['string', 'null'] }` and `create: 'optional'`
|
|
7
6
|
*/
|
|
8
7
|
export const optional = vocabulary('optional', (field) => ({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"optional.js","sourceRoot":"","sources":["../../../src/vocabulary/rule/optional.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AAGnD
|
|
1
|
+
{"version":3,"file":"optional.js","sourceRoot":"","sources":["../../../src/vocabulary/rule/optional.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AAGnD;;;GAGG;AACH,MAAM,CAAC,MAAM,QAAQ,GAA4C,UAAU,CACzE,UAAU,EACV,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACV,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC;IACnC,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,KAAK,SAAS;QACvC,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,UAAmB,EAAE,EAAE;QAChD,CAAC,CAAC,EAAE,CAAC;CACR,CAAC,CACH,CAAC"}
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import { Field } from '../../field/Field.js';
|
|
2
2
|
/**
|
|
3
|
-
* Closes the way in, so the field leaves `Visibility.input` and every form derived from it.
|
|
4
|
-
* FR : ferme l'entrée : le champ quitte `Visibility.input` et tout formulaire qui en dérive.
|
|
5
3
|
* `readOnly(text())` → `boundary.in` is `'closed'`
|
|
6
4
|
*/
|
|
7
5
|
export declare const readOnly: <T>(field: Field<T>) => Field<T>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"readOnly.d.ts","sourceRoot":"","sources":["../../../src/vocabulary/rule/readOnly.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAE7C
|
|
1
|
+
{"version":3,"file":"readOnly.d.ts","sourceRoot":"","sources":["../../../src/vocabulary/rule/readOnly.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAE7C;;GAEG;AACH,eAAO,MAAM,QAAQ,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAKrD,CAAC"}
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import { vocabulary } from '../vocabulary.js';
|
|
2
2
|
import { Boundary } from '../../axis/boundary/Boundary.js';
|
|
3
3
|
/**
|
|
4
|
-
* Closes the way in, so the field leaves `Visibility.input` and every form derived from it.
|
|
5
|
-
* FR : ferme l'entrée : le champ quitte `Visibility.input` et tout formulaire qui en dérive.
|
|
6
4
|
* `readOnly(text())` → `boundary.in` is `'closed'`
|
|
7
5
|
*/
|
|
8
6
|
export const readOnly = vocabulary('readOnly', (field) => ({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"readOnly.js","sourceRoot":"","sources":["../../../src/vocabulary/rule/readOnly.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAG3D
|
|
1
|
+
{"version":3,"file":"readOnly.js","sourceRoot":"","sources":["../../../src/vocabulary/rule/readOnly.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAG3D;;GAEG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAqC,UAAU,CAClE,UAAU,EACV,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACV,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC;CAC/D,CAAC,CACH,CAAC"}
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import { Field } from '../../field/Field.js';
|
|
2
2
|
/**
|
|
3
|
-
* Closes the way out, the dual of `readOnly`: the value is written and never sent back.
|
|
4
|
-
* FR : ferme la sortie, dual de `readOnly` : la valeur s'écrit et ne repart jamais.
|
|
5
3
|
* `writeOnly(text())` → `boundary.out` is `'closed'`
|
|
6
4
|
*/
|
|
7
5
|
export declare const writeOnly: <T>(field: Field<T>) => Field<T>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"writeOnly.d.ts","sourceRoot":"","sources":["../../../src/vocabulary/rule/writeOnly.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAE7C
|
|
1
|
+
{"version":3,"file":"writeOnly.d.ts","sourceRoot":"","sources":["../../../src/vocabulary/rule/writeOnly.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAE7C;;GAEG;AACH,eAAO,MAAM,SAAS,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAKtD,CAAC"}
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import { vocabulary } from '../vocabulary.js';
|
|
2
2
|
import { Boundary } from '../../axis/boundary/Boundary.js';
|
|
3
3
|
/**
|
|
4
|
-
* Closes the way out, the dual of `readOnly`: the value is written and never sent back.
|
|
5
|
-
* FR : ferme la sortie, dual de `readOnly` : la valeur s'écrit et ne repart jamais.
|
|
6
4
|
* `writeOnly(text())` → `boundary.out` is `'closed'`
|
|
7
5
|
*/
|
|
8
6
|
export const writeOnly = vocabulary('writeOnly', (field) => ({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"writeOnly.js","sourceRoot":"","sources":["../../../src/vocabulary/rule/writeOnly.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAG3D
|
|
1
|
+
{"version":3,"file":"writeOnly.js","sourceRoot":"","sources":["../../../src/vocabulary/rule/writeOnly.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAG3D;;GAEG;AACH,MAAM,CAAC,MAAM,SAAS,GAAqC,UAAU,CACnE,WAAW,EACX,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACV,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;CAChE,CAAC,CACH,CAAC"}
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import { Field } from '../field/Field.js';
|
|
2
2
|
/**
|
|
3
|
-
* Builds a `rule/` word
|
|
4
|
-
* FR : fabrique un mot de `rule/`, qui énonce des membres sur le champ reçu.
|
|
3
|
+
* Builds a `rule/` word
|
|
5
4
|
* `vocabulary('indexed', () => ({ role: { index: true } }))`
|
|
6
5
|
*/
|
|
7
|
-
export declare function vocabulary(
|
|
6
|
+
export declare function vocabulary(word: string, states: (field: Field) => Partial<Field>): FieldWord;
|
|
8
7
|
export type FieldWord = (field: Field<any>) => Field<any>;
|
|
9
8
|
//# sourceMappingURL=vocabulary.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vocabulary.d.ts","sourceRoot":"","sources":["../../src/vocabulary/vocabulary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"vocabulary.d.ts","sourceRoot":"","sources":["../../src/vocabulary/vocabulary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAyB,MAAM,mBAAmB,CAAC;AAKjE;;;GAGG;AACH,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"}
|
|
@@ -1,41 +1,39 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Axes } from '../axis/Axes.js';
|
|
2
2
|
import { dequal } from 'dequal';
|
|
3
3
|
import { SchemaError } from '../SchemaError.js';
|
|
4
|
-
const MEMBER_SLOTS = [...EXTENSION_SLOTS, 'meta'];
|
|
5
4
|
/**
|
|
6
|
-
* Builds a `rule/` word
|
|
7
|
-
* FR : fabrique un mot de `rule/`, qui énonce des membres sur le champ reçu.
|
|
5
|
+
* Builds a `rule/` word
|
|
8
6
|
* `vocabulary('indexed', () => ({ role: { index: true } }))`
|
|
9
7
|
*/
|
|
10
|
-
export function vocabulary(
|
|
11
|
-
return (field) => field.with(merge(
|
|
8
|
+
export function vocabulary(word, states) {
|
|
9
|
+
return (field) => field.with(merge(word, field, states(field)));
|
|
12
10
|
}
|
|
13
11
|
/**
|
|
14
|
-
* Refuses two words stating one member
|
|
15
|
-
*
|
|
16
|
-
*
|
|
12
|
+
* Refuses two words stating one member DIFFERENTLY, rather than letting the outer win.
|
|
13
|
+
* `readOnly(writeOnly(text()))` → both apply, they write two members; `immutable(created())`
|
|
14
|
+
* too, since both say `update: 'forbidden'`; `immutable(updated())` → throws.
|
|
17
15
|
*/
|
|
18
|
-
function merge(
|
|
16
|
+
function merge(word, field, changes) {
|
|
19
17
|
const merged = {};
|
|
20
|
-
if ('shape' in
|
|
21
|
-
merged.shape =
|
|
22
|
-
for (const
|
|
23
|
-
const members =
|
|
18
|
+
if ('shape' in changes)
|
|
19
|
+
merged.shape = changes.shape;
|
|
20
|
+
for (const name of Axes.names) {
|
|
21
|
+
const members = changes[name];
|
|
24
22
|
if (members === undefined)
|
|
25
23
|
continue;
|
|
26
|
-
const already = field
|
|
27
|
-
if (typeof members !== 'object' || members === null || typeof already !== 'object') {
|
|
28
|
-
merged[
|
|
24
|
+
const already = field.axis(name);
|
|
25
|
+
if (typeof members !== 'object' || members === null || typeof already !== 'object' || already === null) {
|
|
26
|
+
merged[name] = members;
|
|
29
27
|
continue;
|
|
30
28
|
}
|
|
31
29
|
for (const [member, value] of Object.entries(members)) {
|
|
32
|
-
const previous = already
|
|
30
|
+
const previous = already[member];
|
|
33
31
|
if (previous === undefined || dequal(previous, value))
|
|
34
32
|
continue;
|
|
35
|
-
throw new SchemaError(`vocabulary: \`${
|
|
33
|
+
throw new SchemaError(`vocabulary: \`${word}\` states ${name}.${member} = ${JSON.stringify(value)}, but the ` +
|
|
36
34
|
`field already states ${JSON.stringify(previous)}. Apply one or the other, not both.`);
|
|
37
35
|
}
|
|
38
|
-
merged[
|
|
36
|
+
merged[name] = { ...already, ...members };
|
|
39
37
|
}
|
|
40
38
|
return merged;
|
|
41
39
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vocabulary.js","sourceRoot":"","sources":["../../src/vocabulary/vocabulary.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"vocabulary.js","sourceRoot":"","sources":["../../src/vocabulary/vocabulary.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD;;;GAGG;AACH,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;;;;GAIG;AACH,SAAS,KAAK,CAAC,IAAY,EAAE,KAAY,EAAE,OAAkC;IAC3E,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,IAAI,OAAO,IAAI,OAAO;QAAE,MAAM,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAErD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAmC,EAAE,CAAC;QAC5D,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAC9B,IAAI,OAAO,KAAK,SAAS;YAAE,SAAS;QACpC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACvG,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC;YACvB,SAAS;QACX,CAAC;QACD,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACtD,MAAM,QAAQ,GAAI,OAAmC,CAAC,MAAM,CAAC,CAAC;YAC9D,IAAI,QAAQ,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC;gBAAE,SAAS;YAChE,MAAM,IAAI,WAAW,CACnB,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,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,EAAE,GAAG,OAAO,EAAE,CAAC;IAC5C,CAAC;IAED,OAAO,MAAwB,CAAC;AAClC,CAAC"}
|
package/package.json
CHANGED
package/src/Schema.ts
CHANGED
|
@@ -2,7 +2,7 @@ import type { StandardSchemaV1 } from '@standard-schema/spec';
|
|
|
2
2
|
|
|
3
3
|
import { Boundary } from './axis/boundary/Boundary.js';
|
|
4
4
|
import { type Fields } from './field/Fields.js';
|
|
5
|
-
import { type
|
|
5
|
+
import { type FieldGroups } from './entity/FieldGroups.js';
|
|
6
6
|
import { type EntityDeclarations } from './entity/EntityDeclarations.js';
|
|
7
7
|
import { type PreviousNames } from './entity/PreviousNames.js';
|
|
8
8
|
import { type EntityAdapters } from './entity/EntityAdapters.js';
|
|
@@ -16,6 +16,7 @@ import type { SchemaView } from './SchemaView.js';
|
|
|
16
16
|
|
|
17
17
|
import type { SchemaConstructor } from './SchemaConstructor.js';
|
|
18
18
|
import { SchemaError } from './SchemaError.js';
|
|
19
|
+
import type { UnionToIntersection } from './lib/UnionToIntersection.js';
|
|
19
20
|
|
|
20
21
|
export const ANONYMOUS_SCHEMA_NAME = 'Schema';
|
|
21
22
|
|
|
@@ -53,9 +54,13 @@ export class Schema {
|
|
|
53
54
|
static getAdapters(): EntityAdapters<Fields> {
|
|
54
55
|
return this.definition.adapterSet.adapters;
|
|
55
56
|
}
|
|
56
|
-
static getUnique():
|
|
57
|
+
static getUnique(): FieldGroups<Fields> | undefined {
|
|
57
58
|
return this.definition.constraints.unique;
|
|
58
59
|
}
|
|
60
|
+
|
|
61
|
+
static getIndex(): FieldGroups<Fields> | undefined {
|
|
62
|
+
return this.definition.constraints.index;
|
|
63
|
+
}
|
|
59
64
|
static getOpts(): ValidateOptions {
|
|
60
65
|
return this.definition.opts;
|
|
61
66
|
}
|
|
@@ -78,6 +83,7 @@ export class Schema {
|
|
|
78
83
|
const decoded = Boundary.of(field).decode(value);
|
|
79
84
|
row[key] = 'message' in decoded ? value : decoded.value;
|
|
80
85
|
}
|
|
86
|
+
|
|
81
87
|
return row;
|
|
82
88
|
}
|
|
83
89
|
|
|
@@ -90,6 +96,7 @@ export class Schema {
|
|
|
90
96
|
validate(value: unknown) {
|
|
91
97
|
const verdict = InputValidator.of(fields, opts).validate(value);
|
|
92
98
|
if (verdict.success) return { value: verdict.data };
|
|
99
|
+
|
|
93
100
|
return {
|
|
94
101
|
issues: verdict.errors.map((e) => ({
|
|
95
102
|
message: e.message,
|
|
@@ -138,6 +145,7 @@ export class Schema {
|
|
|
138
145
|
);
|
|
139
146
|
}
|
|
140
147
|
Object.defineProperty(this, 'name', { value: name, configurable: true });
|
|
148
|
+
|
|
141
149
|
return this;
|
|
142
150
|
}
|
|
143
151
|
|
|
@@ -168,16 +176,11 @@ export class Schema {
|
|
|
168
176
|
value: ANONYMOUS_SCHEMA_NAME,
|
|
169
177
|
configurable: true,
|
|
170
178
|
});
|
|
179
|
+
|
|
171
180
|
return Derived as unknown as SchemaConstructor<Fields>;
|
|
172
181
|
}
|
|
173
182
|
}
|
|
174
183
|
|
|
175
|
-
type UnionToIntersection<U> = (U extends unknown ? (k: U) => void : never) extends (
|
|
176
|
-
k: infer I,
|
|
177
|
-
) => void
|
|
178
|
-
? I
|
|
179
|
-
: never;
|
|
180
|
-
|
|
181
184
|
type Merged<T extends SchemaView[]> = UnionToIntersection<
|
|
182
185
|
T[number] extends { getFields(): infer F } ? F : Fields
|
|
183
186
|
> &
|
package/src/SchemaConstraints.ts
CHANGED
|
@@ -1,19 +1,21 @@
|
|
|
1
1
|
import { type FieldName } from './field/FieldName.js';
|
|
2
2
|
import { type Fields } from './field/Fields.js';
|
|
3
|
-
import { type
|
|
3
|
+
import { type FieldGroups } from './entity/FieldGroups.js';
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
|
-
* What a schema
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
6
|
+
* What a schema states beyond any single field: groups of names. `unique` constrains the
|
|
7
|
+
* rows, `index` says how they are reached — two decisions, and neither implies the other.
|
|
8
|
+
* They sit under an owner rather than beside `fields` and `opts` because the next rule
|
|
9
|
+
* spanning two fields — a check, an exclusion — is a member here, not an eighth positional
|
|
10
|
+
* argument in a list that has already lost one.
|
|
11
11
|
*/
|
|
12
12
|
export class SchemaConstraints<TFields extends Fields = Fields> {
|
|
13
|
-
readonly unique?:
|
|
13
|
+
readonly unique?: FieldGroups<TFields>;
|
|
14
|
+
readonly index?: FieldGroups<TFields>;
|
|
14
15
|
|
|
15
|
-
private constructor(unique?:
|
|
16
|
+
private constructor(unique?: FieldGroups<TFields>, index?: FieldGroups<TFields>) {
|
|
16
17
|
if (unique) this.unique = unique;
|
|
18
|
+
if (index) this.index = index;
|
|
17
19
|
}
|
|
18
20
|
|
|
19
21
|
static readonly none = new SchemaConstraints();
|
|
@@ -24,23 +26,39 @@ export class SchemaConstraints<TFields extends Fields = Fields> {
|
|
|
24
26
|
* `SchemaConstraints.of([['a','b'], ['a','b']])` → `unique` holds one group
|
|
25
27
|
*/
|
|
26
28
|
static of<TFields extends Fields>(
|
|
27
|
-
groups:
|
|
29
|
+
groups: { unique?: FieldGroups<TFields>; index?: FieldGroups<TFields> },
|
|
28
30
|
): SchemaConstraints<TFields> {
|
|
29
|
-
|
|
30
|
-
for (const group of groups) seen.set(JSON.stringify(group), group);
|
|
31
|
-
|
|
32
|
-
return new SchemaConstraints(seen.size ? [...seen.values()] : undefined);
|
|
31
|
+
return new SchemaConstraints(deduped(groups.unique), deduped(groups.index));
|
|
33
32
|
}
|
|
34
33
|
|
|
35
|
-
/** One member gone and the group is gone: it
|
|
34
|
+
/** One member gone and the group is gone: it named a pair that no longer exists. */
|
|
36
35
|
renamed(transform: (key: string) => string | undefined): SchemaConstraints {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
if (renamed.every((key): key is string => key !== undefined)) kept.push(renamed);
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
return SchemaConstraints.of(kept);
|
|
36
|
+
return SchemaConstraints.of({
|
|
37
|
+
unique: survivors(this.unique, transform),
|
|
38
|
+
index: survivors(this.index, transform),
|
|
39
|
+
});
|
|
45
40
|
}
|
|
46
41
|
}
|
|
42
|
+
|
|
43
|
+
const deduped = <TFields extends Fields>(
|
|
44
|
+
groups?: FieldGroups<TFields>,
|
|
45
|
+
): FieldGroups<TFields> | undefined => {
|
|
46
|
+
if (!groups) return undefined;
|
|
47
|
+
const seen = new Map<string, readonly FieldName<TFields>[]>();
|
|
48
|
+
for (const group of groups) seen.set(JSON.stringify(group), group);
|
|
49
|
+
|
|
50
|
+
return seen.size ? [...seen.values()] : undefined;
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
const survivors = (
|
|
54
|
+
groups: FieldGroups<Fields> | undefined,
|
|
55
|
+
transform: (key: string) => string | undefined,
|
|
56
|
+
): string[][] => {
|
|
57
|
+
const kept: string[][] = [];
|
|
58
|
+
for (const group of groups ?? []) {
|
|
59
|
+
const renamed = group.map(transform);
|
|
60
|
+
if (renamed.every((key): key is string => key !== undefined)) kept.push(renamed);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return kept;
|
|
64
|
+
};
|