@fougere/schema 0.2.0-alpha.2 → 0.3.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/dist/EntityDeclarations.d.ts +22 -0
- package/dist/EntityDeclarations.d.ts.map +1 -0
- package/dist/{hints.js → EntityDeclarations.js} +1 -5
- package/dist/EntityDeclarations.js.map +1 -0
- package/dist/Field.d.ts +21 -0
- package/dist/Field.d.ts.map +1 -0
- package/dist/Field.js +50 -0
- package/dist/Field.js.map +1 -0
- package/dist/{schema/schema.d.ts → Schema.d.ts} +27 -34
- package/dist/Schema.d.ts.map +1 -0
- package/dist/{schema/schema.js → Schema.js} +49 -59
- package/dist/Schema.js.map +1 -0
- package/dist/SchemaView.d.ts +18 -0
- package/dist/SchemaView.d.ts.map +1 -0
- package/dist/SchemaView.js +2 -0
- package/dist/SchemaView.js.map +1 -0
- package/dist/axis/Axis.d.ts +10 -0
- package/dist/axis/Axis.d.ts.map +1 -0
- package/dist/axis/Axis.js +9 -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/axis.d.ts +4 -0
- package/dist/axis/boundary/axis.d.ts.map +1 -0
- package/dist/axis/boundary/axis.js +29 -0
- package/dist/axis/boundary/axis.js.map +1 -0
- package/dist/axis/lifecycle/Generators.d.ts +4 -0
- package/dist/axis/lifecycle/Generators.d.ts.map +1 -0
- package/dist/axis/lifecycle/Generators.js +8 -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/apply.d.ts +8 -0
- package/dist/axis/lifecycle/apply.d.ts.map +1 -0
- package/dist/axis/lifecycle/apply.js +72 -0
- package/dist/axis/lifecycle/apply.js.map +1 -0
- package/dist/axis/lifecycle/axis.d.ts +4 -0
- package/dist/axis/lifecycle/axis.d.ts.map +1 -0
- package/dist/axis/lifecycle/axis.js +46 -0
- package/dist/axis/lifecycle/axis.js.map +1 -0
- package/dist/axis/role/Relation.d.ts +10 -0
- package/dist/axis/role/Relation.d.ts.map +1 -0
- package/dist/axis/role/Relation.js +6 -0
- package/dist/axis/role/Relation.js.map +1 -0
- package/dist/axis/role/Role.d.ts +38 -0
- package/dist/axis/role/Role.d.ts.map +1 -0
- package/dist/axis/role/Role.js +50 -0
- package/dist/axis/role/Role.js.map +1 -0
- package/dist/axis/role/axis.d.ts +5 -0
- package/dist/axis/role/axis.d.ts.map +1 -0
- package/dist/axis/role/axis.js +101 -0
- package/dist/axis/role/axis.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/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/describe.d.ts +12 -0
- package/dist/card/describe.d.ts.map +1 -0
- package/dist/card/describe.js +83 -0
- package/dist/card/describe.js.map +1 -0
- package/dist/card/diff.d.ts +140 -0
- package/dist/card/diff.d.ts.map +1 -0
- package/dist/card/diff.js +123 -0
- package/dist/card/diff.js.map +1 -0
- package/dist/card/reconstruct.d.ts +11 -0
- package/dist/card/reconstruct.d.ts.map +1 -0
- package/dist/card/reconstruct.js +83 -0
- package/dist/card/reconstruct.js.map +1 -0
- package/dist/card/typescript.d.ts +17 -0
- package/dist/card/typescript.d.ts.map +1 -0
- package/dist/card/typescript.js +93 -0
- package/dist/card/typescript.js.map +1 -0
- package/dist/clean.d.ts +2 -0
- package/dist/clean.d.ts.map +1 -0
- package/dist/{projections/card.js → clean.js} +1 -2
- package/dist/clean.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 +13 -39
- package/dist/entity.js.map +1 -1
- package/dist/index.d.ts +54 -37
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +46 -48
- package/dist/index.js.map +1 -1
- package/dist/judge/Judge.d.ts +14 -0
- package/dist/judge/Judge.d.ts.map +1 -0
- package/dist/judge/Judge.js +161 -0
- package/dist/judge/Judge.js.map +1 -0
- package/dist/judge/cases.d.ts +50 -0
- package/dist/judge/cases.d.ts.map +1 -0
- package/dist/judge/cases.js +100 -0
- package/dist/judge/cases.js.map +1 -0
- package/dist/judge/form.d.ts +11 -0
- package/dist/judge/form.d.ts.map +1 -0
- package/dist/judge/form.js +18 -0
- package/dist/judge/form.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/name.d.ts +1 -6
- package/dist/name.d.ts.map +1 -1
- package/dist/name.js +3 -6
- package/dist/name.js.map +1 -1
- package/dist/projection/encode.d.ts +3 -0
- package/dist/projection/encode.d.ts.map +1 -0
- package/dist/projection/encode.js +19 -0
- package/dist/projection/encode.js.map +1 -0
- package/dist/projection/io.d.ts +4 -0
- package/dist/projection/io.d.ts.map +1 -0
- package/dist/projection/io.js +29 -0
- package/dist/projection/io.js.map +1 -0
- package/dist/projection/source.d.ts +7 -0
- package/dist/projection/source.d.ts.map +1 -0
- package/dist/projection/source.js +11 -0
- package/dist/projection/source.js.map +1 -0
- package/dist/{projections → projection}/standard.d.ts +0 -8
- 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/same.d.ts +6 -0
- package/dist/same.d.ts.map +1 -0
- package/dist/same.js +35 -0
- package/dist/same.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 +10 -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 +2 -5
- 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 +3 -9
- 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 +2 -7
- 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 +5 -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 +1 -1
- 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.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.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.map +0 -1
- 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
package/dist/index.js
CHANGED
|
@@ -1,49 +1,47 @@
|
|
|
1
|
-
|
|
2
|
-
export {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
export {
|
|
10
|
-
|
|
11
|
-
export {
|
|
12
|
-
export {
|
|
13
|
-
export {
|
|
14
|
-
export {
|
|
15
|
-
export {
|
|
16
|
-
export {
|
|
17
|
-
export {
|
|
18
|
-
export {
|
|
19
|
-
export {
|
|
20
|
-
export {
|
|
21
|
-
export {
|
|
22
|
-
export {
|
|
23
|
-
export {
|
|
24
|
-
export {
|
|
25
|
-
export {
|
|
26
|
-
export {
|
|
27
|
-
export {
|
|
28
|
-
export {
|
|
29
|
-
export {
|
|
30
|
-
export {
|
|
31
|
-
export {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
export {
|
|
37
|
-
export {
|
|
38
|
-
|
|
39
|
-
export {
|
|
40
|
-
export {
|
|
41
|
-
//
|
|
42
|
-
export {
|
|
43
|
-
export {
|
|
44
|
-
export {
|
|
45
|
-
|
|
46
|
-
export {
|
|
47
|
-
export { entity } from "./entity.js";
|
|
48
|
-
export { Judge } from "./validation/index.js";
|
|
1
|
+
export { Field } from './Field.js';
|
|
2
|
+
export { Anatomy } from './axis/shape/Shape.js';
|
|
3
|
+
export { Formats } from './axis/shape/Formats.js';
|
|
4
|
+
export { Role, primaryFieldOf } from './axis/role/Role.js';
|
|
5
|
+
export { Lifecycle } from './axis/lifecycle/Lifecycle.js';
|
|
6
|
+
export { registerGenerator } from './axis/lifecycle/Generators.js';
|
|
7
|
+
export { Boundary } from './axis/boundary/Boundary.js';
|
|
8
|
+
export { Boundaries } from './axis/boundary/Boundaries.js';
|
|
9
|
+
export { FieldGroup } from './constraint/FieldGroup.js';
|
|
10
|
+
export { Unique } from './constraint/Unique.js';
|
|
11
|
+
export { Schema, ANONYMOUS_SCHEMA_NAME } from './Schema.js';
|
|
12
|
+
export { casesFor, holds, refusalBranches } from './judge/cases.js';
|
|
13
|
+
export { same } from './same.js';
|
|
14
|
+
export { primary } from './vocabulary/primary.js';
|
|
15
|
+
export { text } from './vocabulary/text.js';
|
|
16
|
+
export { email } from './vocabulary/email.js';
|
|
17
|
+
export { url } from './vocabulary/url.js';
|
|
18
|
+
export { list } from './vocabulary/list.js';
|
|
19
|
+
export { number } from './vocabulary/number.js';
|
|
20
|
+
export { bool } from './vocabulary/bool.js';
|
|
21
|
+
export { date } from './vocabulary/date.js';
|
|
22
|
+
export { created } from './vocabulary/created.js';
|
|
23
|
+
export { updated } from './vocabulary/updated.js';
|
|
24
|
+
export { oneOf } from './vocabulary/oneOf.js';
|
|
25
|
+
export { ref } from './vocabulary/ref.js';
|
|
26
|
+
export { many } from './vocabulary/many.js';
|
|
27
|
+
export { optional } from './vocabulary/optional.js';
|
|
28
|
+
export { nullable } from './vocabulary/nullable.js';
|
|
29
|
+
export { immutable } from './vocabulary/immutable.js';
|
|
30
|
+
export { unique } from './vocabulary/unique.js';
|
|
31
|
+
export { indexed } from './vocabulary/indexed.js';
|
|
32
|
+
export { readOnly } from './vocabulary/readOnly.js';
|
|
33
|
+
export { writeOnly } from './vocabulary/writeOnly.js';
|
|
34
|
+
export { json } from './vocabulary/json.js';
|
|
35
|
+
export { applyCreate, applyUpdate, freezeClock } from './axis/lifecycle/apply.js';
|
|
36
|
+
export { encodeFields } from './projection/encode.js';
|
|
37
|
+
export { inputFields, outputFields } from './projection/io.js';
|
|
38
|
+
export { registrationKeyOf, classNameOf } from './name.js';
|
|
39
|
+
export { describe, describeSet, sourceNameOf } from './card/describe.js';
|
|
40
|
+
export { reconstruct, reconstructSet } from './card/reconstruct.js';
|
|
41
|
+
// What separates two descriptors — one calculation, read by a DDL, a codec and a boot.
|
|
42
|
+
export { diff, diffSet } from './card/diff.js';
|
|
43
|
+
export { entitySourceOf, facadeTypeSourceOf } from './card/typescript.js';
|
|
44
|
+
export { schemaOf, fieldsOf } from './projection/source.js';
|
|
45
|
+
export { entity } from './entity.js';
|
|
46
|
+
export { Judge } from './judge/Judge.js';
|
|
49
47
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Field, Fields } from '../Field.js';
|
|
2
|
+
import type { Checked, ValidationResult } from './result.js';
|
|
3
|
+
import type { ValidateOptions } from './options.js';
|
|
4
|
+
export declare class Judge {
|
|
5
|
+
private static readonly plans;
|
|
6
|
+
private static planFor;
|
|
7
|
+
private static customFormatOf;
|
|
8
|
+
static value(field: Field, value: unknown): Checked;
|
|
9
|
+
static field(value: unknown): ValidationResult<Field>;
|
|
10
|
+
static onAbsent(field: Field): 'skip' | 'empty-list' | null;
|
|
11
|
+
static row(fields: Fields, input: unknown, opts?: ValidateOptions): ValidationResult<Record<string, unknown>>;
|
|
12
|
+
static isField(value: unknown): value is Field;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=Judge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Judge.d.ts","sourceRoot":"","sources":["../../src/judge/Judge.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAOjD,OAAO,KAAK,EAAE,OAAO,EAAmB,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAUpD,qBAAa,KAAK;IAChB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAoC;IAEjE,OAAO,CAAC,MAAM,CAAC,OAAO;IAetB,OAAO,CAAC,MAAM,CAAC,cAAc;IAW7B,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAmBlD;IAED,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAuCpD;IAED,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,YAAY,GAAG,IAAI,CAK1D;IAED,MAAM,CAAC,GAAG,CACR,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,OAAO,EACd,IAAI,GAAE,eAAoB,GACvB,gBAAgB,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAqD7C;IAED,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,KAAK,CAE7C;CACF"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { Role } from '../axis/role/Role.js';
|
|
2
|
+
import { Lifecycle } from '../axis/lifecycle/Lifecycle.js';
|
|
3
|
+
import { Boundary } from '../axis/boundary/Boundary.js';
|
|
4
|
+
import { Anatomy } from '../axis/shape/Shape.js';
|
|
5
|
+
import { Formats } from '../axis/shape/Formats.js';
|
|
6
|
+
import { Validator, format as engineFormats } from '@cfworker/json-schema';
|
|
7
|
+
import { EXTENSION_AXES } from '../axis/Axis.js';
|
|
8
|
+
import { isObject } from './form.js';
|
|
9
|
+
export class Judge {
|
|
10
|
+
static plans = new WeakMap();
|
|
11
|
+
static planFor(shape) {
|
|
12
|
+
let p = this.plans.get(shape);
|
|
13
|
+
if (!p) {
|
|
14
|
+
const base = Anatomy.of(shape).base;
|
|
15
|
+
const formatName = base?.type === 'string' ? base.format : undefined;
|
|
16
|
+
p = {
|
|
17
|
+
validator: new Validator(shape, '2020-12', true),
|
|
18
|
+
custom: formatName === undefined ? undefined : this.customFormatOf(formatName),
|
|
19
|
+
formatName,
|
|
20
|
+
};
|
|
21
|
+
this.plans.set(shape, p);
|
|
22
|
+
}
|
|
23
|
+
return p;
|
|
24
|
+
}
|
|
25
|
+
static customFormatOf(name) {
|
|
26
|
+
const custom = Formats.resolve(name);
|
|
27
|
+
if (!custom && !(name in engineFormats)) {
|
|
28
|
+
throw new Error(`Unknown format: '${name}'. Register it with Formats.register('${name}', …) — ` +
|
|
29
|
+
`the engine judges ${Object.keys(engineFormats).length} formats natively and this is not one of them.`);
|
|
30
|
+
}
|
|
31
|
+
return custom;
|
|
32
|
+
}
|
|
33
|
+
static value(field, value) {
|
|
34
|
+
const shape = field.shape;
|
|
35
|
+
const base = Anatomy.of(shape).base;
|
|
36
|
+
if (value !== null) {
|
|
37
|
+
if (base?.type === 'object' && !base.properties)
|
|
38
|
+
return { value };
|
|
39
|
+
if (base?.type === 'string' && base.format === 'date-time' && value instanceof Date) {
|
|
40
|
+
return Number.isNaN(value.getTime()) ? { error: 'Invalid date' } : { value };
|
|
41
|
+
}
|
|
42
|
+
if ((base?.type === 'number' || base?.type === 'integer') && typeof value === 'number' && Number.isNaN(value)) {
|
|
43
|
+
return { error: 'Expected a number' };
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
const plan = this.planFor(shape);
|
|
47
|
+
const result = plan.validator.validate(value);
|
|
48
|
+
if (!result.valid)
|
|
49
|
+
return { error: result.errors[0]?.error ?? 'Invalid value' };
|
|
50
|
+
if (plan.custom && typeof value === 'string' && !plan.custom(value)) {
|
|
51
|
+
return { error: `String does not match format "${plan.formatName}".` };
|
|
52
|
+
}
|
|
53
|
+
return { value };
|
|
54
|
+
}
|
|
55
|
+
static field(value) {
|
|
56
|
+
if (!isObject(value)) {
|
|
57
|
+
return {
|
|
58
|
+
success: false,
|
|
59
|
+
errors: [
|
|
60
|
+
{
|
|
61
|
+
path: ".",
|
|
62
|
+
message: `Expected an object — got ${JSON.stringify(value)}`,
|
|
63
|
+
},
|
|
64
|
+
],
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
const errors = [];
|
|
68
|
+
if (!Anatomy.is(value.shape)) {
|
|
69
|
+
errors.push({
|
|
70
|
+
path: "shape",
|
|
71
|
+
message: `Every field states a shape — got ${JSON.stringify(value.shape)}`,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
for (const axis of EXTENSION_AXES) {
|
|
75
|
+
const declared = value[axis.slot];
|
|
76
|
+
if (declared !== undefined)
|
|
77
|
+
axis.judge(declared, errors);
|
|
78
|
+
}
|
|
79
|
+
if (value.meta !== undefined) {
|
|
80
|
+
if (!isObject(value.meta)) {
|
|
81
|
+
errors.push({
|
|
82
|
+
path: "meta",
|
|
83
|
+
message: `Expected an object — got ${JSON.stringify(value.meta)}`,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
else if (value.meta.description !== undefined &&
|
|
87
|
+
typeof value.meta.description !== "string") {
|
|
88
|
+
errors.push({ path: "meta.description", message: "Expected a string" });
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return errors.length ? { success: false, errors } : { success: true, data: value };
|
|
92
|
+
}
|
|
93
|
+
static onAbsent(field) {
|
|
94
|
+
if (Boundary.of(field).readOnly)
|
|
95
|
+
return 'skip';
|
|
96
|
+
if (!Lifecycle.of(field).requiredAtCreate)
|
|
97
|
+
return 'skip';
|
|
98
|
+
if (Role.of(field).isCollection)
|
|
99
|
+
return 'empty-list';
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
static row(fields, input, opts = {}) {
|
|
103
|
+
if (typeof input !== 'object' || input === null) {
|
|
104
|
+
return { success: false, errors: [{ path: '.', message: 'Expected an object' }] };
|
|
105
|
+
}
|
|
106
|
+
const data = input;
|
|
107
|
+
const errors = [];
|
|
108
|
+
const out = {};
|
|
109
|
+
for (const key of Object.keys(data)) {
|
|
110
|
+
if (!(key in fields)) {
|
|
111
|
+
errors.push({ path: key, message: 'Unknown field' });
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
for (const [key, field] of Object.entries(fields)) {
|
|
115
|
+
const path = key;
|
|
116
|
+
const value = data[key];
|
|
117
|
+
if (value === undefined) {
|
|
118
|
+
if (opts.patch)
|
|
119
|
+
continue;
|
|
120
|
+
const absence = Judge.onAbsent(field);
|
|
121
|
+
if (absence === null) {
|
|
122
|
+
errors.push({ path, message: 'Required' });
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
if (absence === 'empty-list')
|
|
126
|
+
out[key] = [];
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
const boundary = Boundary.of(field);
|
|
130
|
+
if (boundary.readOnly) {
|
|
131
|
+
errors.push({ path, message: 'Read-only' });
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
if (opts.patch && Lifecycle.of(field).immutable) {
|
|
135
|
+
errors.push({ path, message: 'Immutable' });
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
const checked = this.value(field, value);
|
|
139
|
+
if ('error' in checked) {
|
|
140
|
+
errors.push({ path, message: checked.error });
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
if (checked.value === null) {
|
|
144
|
+
out[key] = null;
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
const decoded = boundary.decode(checked.value);
|
|
148
|
+
if ('error' in decoded)
|
|
149
|
+
errors.push({ path, message: decoded.error });
|
|
150
|
+
else
|
|
151
|
+
out[key] = decoded.value;
|
|
152
|
+
}
|
|
153
|
+
if (errors.length > 0)
|
|
154
|
+
return { success: false, errors };
|
|
155
|
+
return { success: true, data: out };
|
|
156
|
+
}
|
|
157
|
+
static isField(value) {
|
|
158
|
+
return this.field(value).success;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=Judge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Judge.js","sourceRoot":"","sources":["../../src/judge/Judge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAI3D,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAG3E,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAQrC,MAAM,OAAO,KAAK;IACR,MAAM,CAAU,KAAK,GAAG,IAAI,OAAO,EAAqB,CAAC;IAEzD,MAAM,CAAC,OAAO,CAAC,KAAY;QACjC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC9B,IAAI,CAAC,CAAC,EAAE,CAAC;YACP,MAAM,IAAI,GAAG,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC;YACpC,MAAM,UAAU,GAAG,IAAI,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;YACrE,CAAC,GAAG;gBACF,SAAS,EAAE,IAAI,SAAS,CAAC,KAAe,EAAE,SAAS,EAAE,IAAI,CAAC;gBAC1D,MAAM,EAAE,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC;gBAC9E,UAAU;aACX,CAAC;YACF,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC3B,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;IAEO,MAAM,CAAC,cAAc,CAAC,IAAY;QACxC,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,IAAI,IAAI,aAAa,CAAC,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CACb,oBAAoB,IAAI,yCAAyC,IAAI,UAAU;gBAC7E,qBAAqB,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,gDAAgD,CACzG,CAAC;QACJ,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,KAAY,EAAE,KAAc;QACvC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;QAC1B,MAAM,IAAI,GAAG,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC;QACpC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,IAAI,IAAI,EAAE,IAAI,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,UAAU;gBAAE,OAAO,EAAE,KAAK,EAAE,CAAC;YAClE,IAAI,IAAI,EAAE,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;gBACpF,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;YAC/E,CAAC;YACD,IAAI,CAAC,IAAI,EAAE,IAAI,KAAK,QAAQ,IAAI,IAAI,EAAE,IAAI,KAAK,SAAS,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC9G,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC;YACxC,CAAC;QACH,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM,CAAC,KAAK;YAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,eAAe,EAAE,CAAC;QAChF,IAAI,IAAI,CAAC,MAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YACpE,OAAO,EAAE,KAAK,EAAE,iCAAiC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC;QACzE,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,CAAC;IACnB,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,KAAc;QACzB,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACrB,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE;oBACN;wBACE,IAAI,EAAE,GAAG;wBACT,OAAO,EAAE,4BAA4B,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE;qBAC7D;iBACF;aACF,CAAC;QACJ,CAAC;QACD,MAAM,MAAM,GAAsB,EAAE,CAAC;QAErC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,oCAAoC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;aAC3E,CAAC,CAAC;QACL,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;YAClC,MAAM,QAAQ,GAAI,KAAiC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/D,IAAI,QAAQ,KAAK,SAAS;gBAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC3D,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC7B,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC1B,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,4BAA4B,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;iBAClE,CAAC,CAAC;YACL,CAAC;iBAAM,IACL,KAAK,CAAC,IAAI,CAAC,WAAW,KAAK,SAAS;gBACpC,OAAO,KAAK,CAAC,IAAI,CAAC,WAAW,KAAK,QAAQ,EAC1C,CAAC;gBACD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAyB,EAAE,CAAC;IACzG,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,KAAY;QAC1B,IAAI,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,QAAQ;YAAE,OAAO,MAAM,CAAC;QAC/C,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,gBAAgB;YAAE,OAAO,MAAM,CAAC;QACzD,IAAI,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,YAAY;YAAE,OAAO,YAAY,CAAC;QACrD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,GAAG,CACR,MAAc,EACd,KAAc,EACd,IAAI,GAAoB,EAAE;QAE1B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YAClD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,oBAAoB,EAAE,CAAC,EAAE,CAAC;QAClF,CAAC;QAED,MAAM,IAAI,GAAG,KAAgC,CAAC;QAC9C,MAAM,MAAM,GAAsB,EAAE,CAAC;QACrC,MAAM,GAAG,GAA4B,EAAE,CAAC;QAExC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACtC,IAAI,CAAC,CAAC,GAAG,IAAI,MAAM,CAAC,EAAE,CAAC;gBACrB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;YACvD,CAAC;QACD,CAAC;QAED,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACpD,MAAM,IAAI,GAAG,GAAG,CAAC;YACjB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;YAExB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,IAAI,IAAI,CAAC,KAAK;oBAAE,SAAS;gBACzB,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;gBACtC,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;oBAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;oBAAC,SAAS;gBAAC,CAAC;gBAC/E,IAAI,OAAO,KAAK,YAAY;oBAAE,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;gBAC5C,SAAS;YACX,CAAC;YAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;YACpC,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;gBACtB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;gBAC5C,SAAS;YACX,CAAC;YACD,IAAI,IAAI,CAAC,KAAK,IAAI,SAAS,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,SAAS,EAAE,CAAC;gBAChD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;gBAC5C,SAAS;YACX,CAAC;YAED,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YACzC,IAAI,OAAO,IAAI,OAAO,EAAE,CAAC;gBACvB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;gBAC9C,SAAS;YACX,CAAC;YACD,IAAI,OAAO,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;gBAC3B,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;gBAChB,SAAS;YACX,CAAC;YACD,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC/C,IAAI,OAAO,IAAI,OAAO;gBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;;gBACjE,GAAG,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC;QAC9B,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QACzD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;IACtC,CAAC;IAED,MAAM,CAAC,OAAO,CAAC,KAAc;QAC3B,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC;IACnC,CAAC;CACF"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { SchemaView } from '../SchemaView.js';
|
|
2
|
+
/**
|
|
3
|
+
* One input, and what the judge must answer.
|
|
4
|
+
*
|
|
5
|
+
* `expect` carries the PATH of the field at fault and never the message. We know which
|
|
6
|
+
* field must be refused because we are the ones who broke it; naming the message would
|
|
7
|
+
* make this list a second judge, and the two would then have to be kept in step by hand —
|
|
8
|
+
* which is the duplication the whole thing exists to remove.
|
|
9
|
+
*/
|
|
10
|
+
export interface Case {
|
|
11
|
+
/** What this input does, in one clause — carried into the assertion so a failure reads. */
|
|
12
|
+
why: string;
|
|
13
|
+
body: unknown;
|
|
14
|
+
/**
|
|
15
|
+
* Judged as an update rather than a creation. The two modes refuse different things:
|
|
16
|
+
* an absence is `Required` on create and legal on patch, an immutable field is legal
|
|
17
|
+
* on create and refused on patch.
|
|
18
|
+
*/
|
|
19
|
+
patch: boolean;
|
|
20
|
+
expect: 'accept' | {
|
|
21
|
+
reject: string;
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* The decision table, enumerated on the entity's own fields.
|
|
26
|
+
*
|
|
27
|
+
* Use the complete entity so a derived view cannot hide a divergent field. The caller
|
|
28
|
+
* supplies a valid row; generating data belongs to the testing package.
|
|
29
|
+
*/
|
|
30
|
+
export declare function casesFor(entity: SchemaView, valid: Record<string, unknown>): Case[];
|
|
31
|
+
/**
|
|
32
|
+
* The verdict a case expects, obtained from any judge.
|
|
33
|
+
*
|
|
34
|
+
* Takes the RESULT rather than the input so the same reader serves the local judge, the
|
|
35
|
+
* façade and a door — the three that have to agree.
|
|
36
|
+
*/
|
|
37
|
+
export declare function holds(expected: Case['expect'], result: {
|
|
38
|
+
success: boolean;
|
|
39
|
+
errors?: {
|
|
40
|
+
path: string;
|
|
41
|
+
}[];
|
|
42
|
+
}): boolean;
|
|
43
|
+
/**
|
|
44
|
+
* Every way `Judge.row` can refuse, read from its own source.
|
|
45
|
+
*
|
|
46
|
+
* Returning names instead of a count makes an uncovered branch identifiable. Custom
|
|
47
|
+
* decoder failures remain outside the derived table because user code defines them.
|
|
48
|
+
*/
|
|
49
|
+
export declare function refusalBranches(): string[];
|
|
50
|
+
//# sourceMappingURL=cases.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cases.d.ts","sourceRoot":"","sources":["../../src/judge/cases.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAGnD;;;;;;;GAOG;AACH,MAAM,WAAW,IAAI;IACnB,2FAA2F;IAC3F,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,OAAO,CAAC;IACd;;;;OAIG;IACH,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,QAAQ,GAAG;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CACvC;AAoCD;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,EAAE,CAoCnF;AAED;;;;;GAKG;AACH,wBAAgB,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAAE,GAAG,OAAO,CAIlH;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,IAAI,MAAM,EAAE,CAG1C"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { Anatomy } from '../axis/shape/Shape.js';
|
|
2
|
+
import { Boundary } from '../axis/boundary/Boundary.js';
|
|
3
|
+
import { Lifecycle } from '../axis/lifecycle/Lifecycle.js';
|
|
4
|
+
import { Role } from '../axis/role/Role.js';
|
|
5
|
+
import { Judge } from './Judge.js';
|
|
6
|
+
/** A value of the wrong type for the declared shape — the one violation every field has. */
|
|
7
|
+
function wrongTypeFor(field) {
|
|
8
|
+
const declared = field.shape.type;
|
|
9
|
+
const names = Array.isArray(declared) ? declared : [declared];
|
|
10
|
+
return names.includes('string') ? 42 : 'not-a-value-of-this-shape';
|
|
11
|
+
}
|
|
12
|
+
/** Values that break a stated bound. Empty when the field states none. */
|
|
13
|
+
function outOfBoundsFor(field) {
|
|
14
|
+
// Through `Anatomy`, not a cast: the cast admitted any keyword, and it declared
|
|
15
|
+
// `maxItems` — which no branch below ever produced. In the one function whose job is
|
|
16
|
+
// to be exhaustive, a bound the type does not carry is a case nobody notices missing.
|
|
17
|
+
const shape = Anatomy.of(field.shape).base;
|
|
18
|
+
const out = [];
|
|
19
|
+
if (shape?.type === 'string') {
|
|
20
|
+
if (typeof shape.minLength === 'number' && shape.minLength > 0)
|
|
21
|
+
out.push({ why: 'shorter than min', value: 'x'.repeat(shape.minLength - 1) });
|
|
22
|
+
if (typeof shape.maxLength === 'number')
|
|
23
|
+
out.push({ why: 'longer than max', value: 'x'.repeat(shape.maxLength + 1) });
|
|
24
|
+
if (shape.enum)
|
|
25
|
+
out.push({ why: 'outside the stated set', value: '__not-in-enum__' });
|
|
26
|
+
}
|
|
27
|
+
if (shape?.type === 'number' || shape?.type === 'integer') {
|
|
28
|
+
if (typeof shape.minimum === 'number')
|
|
29
|
+
out.push({ why: 'below minimum', value: shape.minimum - 1 });
|
|
30
|
+
if (typeof shape.maximum === 'number')
|
|
31
|
+
out.push({ why: 'above maximum', value: shape.maximum + 1 });
|
|
32
|
+
}
|
|
33
|
+
if (shape?.type === 'array') {
|
|
34
|
+
if (typeof shape.minItems === 'number' && shape.minItems > 0)
|
|
35
|
+
out.push({ why: 'fewer items than min', value: [] });
|
|
36
|
+
if (typeof shape.maxItems === 'number')
|
|
37
|
+
out.push({ why: 'more items than max', value: Array.from({ length: shape.maxItems + 1 }, () => null) });
|
|
38
|
+
}
|
|
39
|
+
return out;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* The decision table, enumerated on the entity's own fields.
|
|
43
|
+
*
|
|
44
|
+
* Use the complete entity so a derived view cannot hide a divergent field. The caller
|
|
45
|
+
* supplies a valid row; generating data belongs to the testing package.
|
|
46
|
+
*/
|
|
47
|
+
export function casesFor(entity, valid) {
|
|
48
|
+
const fields = entity.getFields();
|
|
49
|
+
const cases = [];
|
|
50
|
+
const withField = (name, value) => ({ ...valid, [name]: value });
|
|
51
|
+
cases.push({ why: 'a valid body', body: valid, patch: false, expect: 'accept' });
|
|
52
|
+
cases.push({ why: 'a key outside the contract', body: { ...valid, __unknown__: 'x' }, patch: false, expect: { reject: '__unknown__' } });
|
|
53
|
+
cases.push({ why: 'not an object at all', body: 'a string', patch: false, expect: { reject: '.' } });
|
|
54
|
+
for (const [name, field] of Object.entries(fields)) {
|
|
55
|
+
// A reference names a row that must exist; the caller supplied its id and we do not
|
|
56
|
+
// get to invent a second one, so the only case we can state about it is the bound one.
|
|
57
|
+
const isRef = Role.of(field).isReference;
|
|
58
|
+
if (Judge.onAbsent(field) === null && name in valid) {
|
|
59
|
+
const body = { ...valid };
|
|
60
|
+
delete body[name];
|
|
61
|
+
cases.push({ why: `${name} absent`, body, patch: false, expect: { reject: name } });
|
|
62
|
+
}
|
|
63
|
+
if (Boundary.of(field).readOnly) {
|
|
64
|
+
cases.push({ why: `${name} supplied although read-only`, body: withField(name, wrongTypeFor(field)), patch: false, expect: { reject: name } });
|
|
65
|
+
}
|
|
66
|
+
if (Lifecycle.of(field).immutable && !Role.of(field).isPrimary) {
|
|
67
|
+
cases.push({ why: `${name} supplied on an update`, body: { [name]: valid[name] ?? wrongTypeFor(field) }, patch: true, expect: { reject: name } });
|
|
68
|
+
}
|
|
69
|
+
if (name in valid && !isRef) {
|
|
70
|
+
cases.push({ why: `${name} of the wrong type`, body: withField(name, wrongTypeFor(field)), patch: false, expect: { reject: name } });
|
|
71
|
+
for (const { why, value } of outOfBoundsFor(field))
|
|
72
|
+
cases.push({ why: `${name} ${why}`, body: withField(name, value), patch: false, expect: { reject: name } });
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return cases;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* The verdict a case expects, obtained from any judge.
|
|
79
|
+
*
|
|
80
|
+
* Takes the RESULT rather than the input so the same reader serves the local judge, the
|
|
81
|
+
* façade and a door — the three that have to agree.
|
|
82
|
+
*/
|
|
83
|
+
export function holds(expected, result) {
|
|
84
|
+
if (expected === 'accept')
|
|
85
|
+
return result.success;
|
|
86
|
+
if (result.success)
|
|
87
|
+
return false;
|
|
88
|
+
return (result.errors ?? []).some((error) => error.path === expected.reject);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Every way `Judge.row` can refuse, read from its own source.
|
|
92
|
+
*
|
|
93
|
+
* Returning names instead of a count makes an uncovered branch identifiable. Custom
|
|
94
|
+
* decoder failures remain outside the derived table because user code defines them.
|
|
95
|
+
*/
|
|
96
|
+
export function refusalBranches() {
|
|
97
|
+
const source = Judge.row.toString();
|
|
98
|
+
return [...source.matchAll(/message:\s*([^,}]+)/g)].map((match) => match[1].trim().replace(/^['"]|['"]$/g, ''));
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=cases.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cases.js","sourceRoot":"","sources":["../../src/judge/cases.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ValidationError } from './result.js';
|
|
2
|
+
export declare const isObject: (value: unknown) => value is Record<string, unknown>;
|
|
3
|
+
/** A card is refused by naming what is wrong AND the remedy — never by a bare throw. */
|
|
4
|
+
export declare function refuse(what: string, fix: string): never;
|
|
5
|
+
/**
|
|
6
|
+
* A wire value admitted by the axis's OWN judge — legal only where its declared and wire
|
|
7
|
+
* forms are the same value, which `describe: v => v` states.
|
|
8
|
+
*/
|
|
9
|
+
export declare function admitWire(judge: (value: unknown, errors: ValidationError[]) => void, value: unknown, slot: string): void;
|
|
10
|
+
export declare const oneOfTokens: <T extends readonly string[]>(value: unknown, tokens: T) => value is T[number];
|
|
11
|
+
//# sourceMappingURL=form.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form.d.ts","sourceRoot":"","sources":["../../src/judge/form.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,eAAO,MAAM,QAAQ,UAAW,OAAO,KAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CACH,CAAC;AAEvE,wFAAwF;AACxF,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,KAAK,CAEvD;AAED;;;GAGG;AACH,wBAAgB,SAAS,CACvB,KAAK,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,KAAK,IAAI,EAC1D,KAAK,EAAE,OAAO,EACd,IAAI,EAAE,MAAM,GACX,IAAI,CASN;AAED,eAAO,MAAM,WAAW,GAAI,CAAC,SAAS,SAAS,MAAM,EAAE,SAC9C,OAAO,UACN,CAAC,KACR,KAAK,IAAI,CAAC,CAAC,MAAM,CAA+E,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export const isObject = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
2
|
+
/** A card is refused by naming what is wrong AND the remedy — never by a bare throw. */
|
|
3
|
+
export function refuse(what, fix) {
|
|
4
|
+
throw new Error(`This card cannot be read: ${what}.\n ${fix}`);
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* A wire value admitted by the axis's OWN judge — legal only where its declared and wire
|
|
8
|
+
* forms are the same value, which `describe: v => v` states.
|
|
9
|
+
*/
|
|
10
|
+
export function admitWire(judge, value, slot) {
|
|
11
|
+
const errors = [];
|
|
12
|
+
judge(value, errors);
|
|
13
|
+
if (errors.length) {
|
|
14
|
+
refuse(`${slot} is malformed — ${errors.map((e) => `${e.path}: ${e.message}`).join('; ')}`, 'A card states an axis the way a declaration does.');
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export const oneOfTokens = (value, tokens) => typeof value === 'string' && tokens.includes(value);
|
|
18
|
+
//# sourceMappingURL=form.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form.js","sourceRoot":"","sources":["../../src/judge/form.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAoC,EAAE,CAC3E,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAEvE,wFAAwF;AACxF,MAAM,UAAU,MAAM,CAAC,IAAY,EAAE,GAAW;IAC9C,MAAM,IAAI,KAAK,CAAC,6BAA6B,IAAI,QAAQ,GAAG,EAAE,CAAC,CAAC;AAClE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CACvB,KAA0D,EAC1D,KAAc,EACd,IAAY;IAEZ,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACrB,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,MAAM,CACJ,GAAG,IAAI,mBAAmB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EACnF,mDAAmD,CACpD,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,KAAc,EACd,MAAS,EACW,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAK,MAA4B,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/judge/options.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"options.js","sourceRoot":"","sources":["../../src/judge/options.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface ValidationError {
|
|
2
|
+
path: string;
|
|
3
|
+
message: string;
|
|
4
|
+
}
|
|
5
|
+
export type ValidationResult<T> = {
|
|
6
|
+
success: true;
|
|
7
|
+
data: T;
|
|
8
|
+
} | {
|
|
9
|
+
success: false;
|
|
10
|
+
errors: ValidationError[];
|
|
11
|
+
};
|
|
12
|
+
export type Checked = {
|
|
13
|
+
value: unknown;
|
|
14
|
+
} | {
|
|
15
|
+
error: string;
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=result.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"result.d.ts","sourceRoot":"","sources":["../../src/judge/result.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAC1B;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,CAAC,CAAA;CAAE,GAC1B;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,eAAe,EAAE,CAAA;CAAE,CAAC;AAElD,MAAM,MAAM,OAAO,GAAG;IAAE,KAAK,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"result.js","sourceRoot":"","sources":["../../src/judge/result.ts"],"names":[],"mappings":""}
|
package/dist/name.d.ts
CHANGED
|
@@ -1,8 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The key a class name is filed under — `AuthorUser` → `authorUser`. THE canonical
|
|
3
|
-
* spelling, stated once because three places disagreed and only ever met on one-word
|
|
4
|
-
* names: on `AuthorUser` the card wrote `authoruser` and the derived FK pointed at a
|
|
5
|
-
* table no pass creates. Idempotent, so a card re-describes identically.
|
|
6
|
-
*/
|
|
7
1
|
export declare function registrationKeyOf(className: string): string;
|
|
2
|
+
export declare function classNameOf(registrationKey: string): string;
|
|
8
3
|
//# sourceMappingURL=name.d.ts.map
|
package/dist/name.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"name.d.ts","sourceRoot":"","sources":["../src/name.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"name.d.ts","sourceRoot":"","sources":["../src/name.ts"],"names":[],"mappings":"AAAA,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED,wBAAgB,WAAW,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM,CAE3D"}
|
package/dist/name.js
CHANGED
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The key a class name is filed under — `AuthorUser` → `authorUser`. THE canonical
|
|
3
|
-
* spelling, stated once because three places disagreed and only ever met on one-word
|
|
4
|
-
* names: on `AuthorUser` the card wrote `authoruser` and the derived FK pointed at a
|
|
5
|
-
* table no pass creates. Idempotent, so a card re-describes identically.
|
|
6
|
-
*/
|
|
7
1
|
export function registrationKeyOf(className) {
|
|
8
2
|
return className ? className[0].toLowerCase() + className.slice(1) : className;
|
|
9
3
|
}
|
|
4
|
+
export function classNameOf(registrationKey) {
|
|
5
|
+
return registrationKey ? registrationKey[0].toUpperCase() + registrationKey.slice(1) : registrationKey;
|
|
6
|
+
}
|
|
10
7
|
//# sourceMappingURL=name.js.map
|
package/dist/name.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"name.js","sourceRoot":"","sources":["../src/name.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"name.js","sourceRoot":"","sources":["../src/name.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,iBAAiB,CAAC,SAAiB;IACjD,OAAO,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACjF,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,eAAuB;IACjD,OAAO,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC;AACzG,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encode.d.ts","sourceRoot":"","sources":["../../src/projection/encode.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAWrG"}
|