@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
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { clean } from '../clean.js';
|
|
2
|
+
import { isObject, refuse } from '../judge/form.js';
|
|
3
|
+
import { EXTENSION_AXES } from '../axis/Axis.js';
|
|
4
|
+
import { Field } from '../Field.js';
|
|
5
|
+
import { Schema } from '../Schema.js';
|
|
6
|
+
function reconstructShape(prop) {
|
|
7
|
+
const types = Array.isArray(prop.type) ? prop.type : prop.type ? [prop.type] : [];
|
|
8
|
+
const base = types.find((t) => t !== 'null');
|
|
9
|
+
if (base === undefined)
|
|
10
|
+
return undefined;
|
|
11
|
+
const type = prop.type;
|
|
12
|
+
if (base === 'array') {
|
|
13
|
+
const items = prop.items ? reconstructShape(prop.items) : undefined;
|
|
14
|
+
return clean({ type, items, minItems: prop.minItems, maxItems: prop.maxItems });
|
|
15
|
+
}
|
|
16
|
+
switch (base) {
|
|
17
|
+
case 'string':
|
|
18
|
+
return clean({ type, minLength: prop.minLength, maxLength: prop.maxLength, pattern: prop.pattern, enum: prop.enum, format: prop.format });
|
|
19
|
+
case 'number':
|
|
20
|
+
case 'integer':
|
|
21
|
+
return clean({ type, minimum: prop.minimum, maximum: prop.maximum });
|
|
22
|
+
case 'boolean':
|
|
23
|
+
return { type };
|
|
24
|
+
default:
|
|
25
|
+
return clean({ type, properties: prop.properties, required: prop.required });
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function reconstructField(prop, key, resolve) {
|
|
29
|
+
const ext = prop['x-fougere'];
|
|
30
|
+
const shape = reconstructShape(prop);
|
|
31
|
+
if (!shape) {
|
|
32
|
+
throw new Error(`Field '${key}': the card carries no \`type\` for it, so there is no shape to rebuild. `
|
|
33
|
+
+ `A field always states one.`);
|
|
34
|
+
}
|
|
35
|
+
const axes = {};
|
|
36
|
+
for (const axis of EXTENSION_AXES) {
|
|
37
|
+
const wire = ext?.[axis.slot];
|
|
38
|
+
if (wire !== undefined) {
|
|
39
|
+
axes[axis.slot] = axis.reconstruct(wire, resolve);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return new Field({
|
|
43
|
+
shape,
|
|
44
|
+
...axes,
|
|
45
|
+
meta: prop.description !== undefined ? { description: prop.description } : undefined,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
function buildSchema(descriptor, resolve, name) {
|
|
49
|
+
const where = name ? `schema '${name}'` : 'this schema';
|
|
50
|
+
if (!isObject(descriptor))
|
|
51
|
+
refuse(`${where} is not an object`, 'A card carries one JSON Schema per door.');
|
|
52
|
+
const version = descriptor['x-fougere-version'];
|
|
53
|
+
if (version !== 1) {
|
|
54
|
+
refuse(`${where} states \`x-fougere-version: ${JSON.stringify(version)}\` and this reader speaks 1`, 'A producer and its readers move together: re-sync the consumer, or serve the version it speaks.');
|
|
55
|
+
}
|
|
56
|
+
if (!isObject(descriptor.properties)) {
|
|
57
|
+
refuse(`${where} carries no \`properties\` object`, 'A schema is its fields; there is nothing to rebuild.');
|
|
58
|
+
}
|
|
59
|
+
const fields = {};
|
|
60
|
+
for (const [key, prop] of Object.entries(descriptor.properties)) {
|
|
61
|
+
fields[key] = reconstructField(prop, key, resolve);
|
|
62
|
+
}
|
|
63
|
+
const schema = Schema.of(fields, undefined, undefined, {});
|
|
64
|
+
const title = name ?? descriptor.title;
|
|
65
|
+
if (title)
|
|
66
|
+
Object.defineProperty(schema, 'name', { value: title, configurable: true });
|
|
67
|
+
return schema;
|
|
68
|
+
}
|
|
69
|
+
export function reconstruct(descriptor) {
|
|
70
|
+
return buildSchema(descriptor);
|
|
71
|
+
}
|
|
72
|
+
export function reconstructSet(bundle) {
|
|
73
|
+
const map = {};
|
|
74
|
+
const resolve = (name) => map[name.toLowerCase()];
|
|
75
|
+
const out = {};
|
|
76
|
+
for (const [name, descriptor] of Object.entries(bundle.$defs)) {
|
|
77
|
+
const schema = buildSchema(descriptor, resolve, name);
|
|
78
|
+
map[name.toLowerCase()] = schema;
|
|
79
|
+
out[name] = schema;
|
|
80
|
+
}
|
|
81
|
+
return out;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=reconstruct.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reconstruct.js","sourceRoot":"","sources":["../../src/card/reconstruct.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { SchemaDescriptor } from './Descriptor.js';
|
|
2
|
+
export interface TypeSourceOptions {
|
|
3
|
+
name?: string;
|
|
4
|
+
exported?: boolean;
|
|
5
|
+
}
|
|
6
|
+
export declare function shapeTypeOf(descriptor: SchemaDescriptor, indent?: string): string;
|
|
7
|
+
export declare function entitySourceOf(descriptor: SchemaDescriptor, options?: TypeSourceOptions): string;
|
|
8
|
+
export interface OpDescriptor {
|
|
9
|
+
name: string;
|
|
10
|
+
description?: string;
|
|
11
|
+
output?: SchemaDescriptor;
|
|
12
|
+
cardinality?: 'one' | 'maybe' | 'many' | 'page' | 'none';
|
|
13
|
+
}
|
|
14
|
+
export declare function facadeTypeSourceOf(ops: readonly OpDescriptor[], options?: TypeSourceOptions & {
|
|
15
|
+
rowType?: string;
|
|
16
|
+
}): string;
|
|
17
|
+
//# sourceMappingURL=typescript.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typescript.d.ts","sourceRoot":"","sources":["../../src/card/typescript.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAmB,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAgDzE,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,WAAW,CAAC,UAAU,EAAE,gBAAgB,EAAE,MAAM,SAAK,GAAG,MAAM,CAS7E;AAED,wBAAgB,cAAc,CAAC,UAAU,EAAE,gBAAgB,EAAE,OAAO,GAAE,iBAAsB,GAAG,MAAM,CASpG;AAaD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,WAAW,CAAC,EAAE,KAAK,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;CAC1D;AAaD,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,SAAS,YAAY,EAAE,EAC5B,OAAO,GAAE,iBAAiB,GAAG;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GACrD,MAAM,CAYR"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
function typeOf(field) {
|
|
2
|
+
const types = Array.isArray(field.type) ? field.type : field.type ? [field.type] : [];
|
|
3
|
+
const nullable = types.includes('null');
|
|
4
|
+
const base = types.find((t) => t !== 'null');
|
|
5
|
+
const inner = baseTypeOf(base, field);
|
|
6
|
+
return nullable ? `${inner} | null` : inner;
|
|
7
|
+
}
|
|
8
|
+
function baseTypeOf(base, field) {
|
|
9
|
+
if (field.enum?.length) {
|
|
10
|
+
return field.enum.map((v) => (v === null ? 'null' : JSON.stringify(v))).join(' | ');
|
|
11
|
+
}
|
|
12
|
+
switch (base) {
|
|
13
|
+
case 'string':
|
|
14
|
+
return field.format === 'date-time' ? 'Date' : 'string';
|
|
15
|
+
case 'number':
|
|
16
|
+
case 'integer':
|
|
17
|
+
return 'number';
|
|
18
|
+
case 'boolean':
|
|
19
|
+
return 'boolean';
|
|
20
|
+
case 'array':
|
|
21
|
+
return field.items ? `${typeOf(field.items)}[]` : 'string[]';
|
|
22
|
+
case 'object':
|
|
23
|
+
return field.properties ? objectTypeOf(field.properties, field.required ?? []) : 'Record<string, unknown>';
|
|
24
|
+
default:
|
|
25
|
+
return 'unknown';
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function objectTypeOf(properties, required) {
|
|
29
|
+
const members = Object.entries(properties).map(([name, field]) => {
|
|
30
|
+
const optional = required.includes(name) ? '' : '?';
|
|
31
|
+
return `${propertyKey(name)}${optional}: ${typeOf(field)}`;
|
|
32
|
+
});
|
|
33
|
+
return `{ ${members.join('; ')} }`;
|
|
34
|
+
}
|
|
35
|
+
function propertyKey(name) {
|
|
36
|
+
return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(name) ? name : JSON.stringify(name);
|
|
37
|
+
}
|
|
38
|
+
function docCommentOf(text, indent) {
|
|
39
|
+
if (!text)
|
|
40
|
+
return '';
|
|
41
|
+
return `${indent}/** ${text.replace(/\*\//g, '*\\/')} */\n`;
|
|
42
|
+
}
|
|
43
|
+
export function shapeTypeOf(descriptor, indent = '') {
|
|
44
|
+
const entries = Object.entries(descriptor.properties ?? {});
|
|
45
|
+
if (entries.length === 0)
|
|
46
|
+
return '{}';
|
|
47
|
+
const lines = entries.map(([key, field]) => {
|
|
48
|
+
const doc = docCommentOf(field.description, `${indent} `);
|
|
49
|
+
return `${doc}${indent} ${propertyKey(key)}: ${typeOf(field)};`;
|
|
50
|
+
});
|
|
51
|
+
return `{\n${lines.join('\n')}\n${indent}}`;
|
|
52
|
+
}
|
|
53
|
+
export function entitySourceOf(descriptor, options = {}) {
|
|
54
|
+
const name = identifierOf(options.name ?? capitalize(descriptor.title ?? 'Schema'));
|
|
55
|
+
const exported = options.exported === false ? '' : 'export ';
|
|
56
|
+
const card = JSON.stringify(descriptor, null, 2)
|
|
57
|
+
.split('\n')
|
|
58
|
+
.map((line, i) => (i === 0 ? line : ` ${line}`))
|
|
59
|
+
.join('\n');
|
|
60
|
+
return `${exported}class ${name} extends reconstruct<${shapeTypeOf(descriptor)}>(${card}) {}`;
|
|
61
|
+
}
|
|
62
|
+
function identifierOf(name) {
|
|
63
|
+
if (!/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(name)) {
|
|
64
|
+
throw new Error(`'${name}' is not a TypeScript identifier — it cannot name a generated declaration`);
|
|
65
|
+
}
|
|
66
|
+
return name;
|
|
67
|
+
}
|
|
68
|
+
function capitalize(s) {
|
|
69
|
+
return s ? s[0].toUpperCase() + s.slice(1) : s;
|
|
70
|
+
}
|
|
71
|
+
function returnTypeOf(op, rowType) {
|
|
72
|
+
switch (op.cardinality) {
|
|
73
|
+
case 'many': return `${rowType}[]`;
|
|
74
|
+
case 'page': return `${rowType}[] & { total?: number; endCursor?: string; hasMore?: boolean }`;
|
|
75
|
+
case 'maybe': return `${rowType} | undefined`;
|
|
76
|
+
case 'one': return rowType;
|
|
77
|
+
case 'none': return 'unknown';
|
|
78
|
+
default: return 'unknown';
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
export function facadeTypeSourceOf(ops, options = {}) {
|
|
82
|
+
const name = options.name ?? 'Facade';
|
|
83
|
+
const exported = options.exported === false ? '' : 'export ';
|
|
84
|
+
const rowType = options.rowType ?? 'unknown';
|
|
85
|
+
const members = ops.map((op) => {
|
|
86
|
+
const doc = docCommentOf(op.description, ' ');
|
|
87
|
+
return `${doc} ${propertyKey(op.name)}(invocation?: Invocation): Promise<${returnTypeOf(op, rowType)}>;`;
|
|
88
|
+
});
|
|
89
|
+
if (members.length === 0)
|
|
90
|
+
return `${exported}interface ${name} {}`;
|
|
91
|
+
return `${exported}interface ${name} {\n${members.join('\n')}\n}`;
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=typescript.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typescript.js","sourceRoot":"","sources":["../../src/card/typescript.ts"],"names":[],"mappings":"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"}
|
package/dist/clean.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clean.d.ts","sourceRoot":"","sources":["../src/clean.ts"],"names":[],"mappings":"AAAA,wBAAgB,KAAK,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAKlE"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
/** Drop keys whose value is `undefined`, so the descriptor stays clean JSON. */
|
|
2
1
|
export function clean(obj) {
|
|
3
2
|
for (const key of Object.keys(obj))
|
|
4
3
|
if (obj[key] === undefined)
|
|
5
4
|
delete obj[key];
|
|
6
5
|
return obj;
|
|
7
6
|
}
|
|
8
|
-
//# sourceMappingURL=
|
|
7
|
+
//# sourceMappingURL=clean.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clean.js","sourceRoot":"","sources":["../src/clean.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,KAAK,CAAoC,GAAM;IAC7D,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;QAChC,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,SAAS;YAAE,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;IAE9C,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Field, Fields } from "../Field.js";
|
|
2
|
+
export declare abstract class FieldGroup {
|
|
3
|
+
readonly members: readonly string[];
|
|
4
|
+
constructor(members: readonly string[]);
|
|
5
|
+
protected withMembers(members: readonly string[]): this;
|
|
6
|
+
get isSelf(): boolean;
|
|
7
|
+
resolvedOn(ownKey: string): this;
|
|
8
|
+
covers(key: string): boolean;
|
|
9
|
+
equals(other: FieldGroup): boolean;
|
|
10
|
+
onto(fields: Fields): Fields;
|
|
11
|
+
rename(map: (key: string) => string | undefined): this | null;
|
|
12
|
+
toJSON(): string[];
|
|
13
|
+
static normalize<R extends FieldGroup>(groups: ReadonlyArray<R | ReadonlyArray<string>> | undefined, make: (members: readonly string[]) => R): ReadonlyArray<R> | undefined;
|
|
14
|
+
static on<R extends FieldGroup>(field: Field, kind: Function & {
|
|
15
|
+
prototype: R;
|
|
16
|
+
}): R[];
|
|
17
|
+
static groupsOf<R extends FieldGroup>(fields: Fields, kind: Function & {
|
|
18
|
+
prototype: R;
|
|
19
|
+
}): R[];
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=FieldGroup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FieldGroup.d.ts","sourceRoot":"","sources":["../../src/constraint/FieldGroup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAEjD,8BAAsB,UAAU;IAClB,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE;IAA/C,YAAqB,OAAO,EAAE,SAAS,MAAM,EAAE,EAAI;IAEnD,SAAS,CAAC,WAAW,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAItD;IAED,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAE/B;IAED,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE3B;IAED,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAMjC;IAED,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAgB3B;IAED,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,IAAI,CAM5D;IAED,MAAM,IAAI,MAAM,EAAE,CAEjB;IAED,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,UAAU,EACnC,MAAM,EAAE,aAAa,CAAC,CAAC,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,GAAG,SAAS,EAC5D,IAAI,EAAE,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,KAAK,CAAC,GACtC,aAAa,CAAC,CAAC,CAAC,GAAG,SAAS,CAK9B;IAED,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,UAAU,EAC5B,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,QAAQ,GAAG;QAAE,SAAS,EAAE,CAAC,CAAA;KAAE,GAChC,CAAC,EAAE,CAIL;IAED,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,UAAU,EAClC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,QAAQ,GAAG;QAAE,SAAS,EAAE,CAAC,CAAA;KAAE,GAChC,CAAC,EAAE,CAML;CACF"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
export class FieldGroup {
|
|
2
|
+
members;
|
|
3
|
+
constructor(members) {
|
|
4
|
+
this.members = members;
|
|
5
|
+
}
|
|
6
|
+
withMembers(members) {
|
|
7
|
+
return new this.constructor(members);
|
|
8
|
+
}
|
|
9
|
+
get isSelf() {
|
|
10
|
+
return this.members.length === 0;
|
|
11
|
+
}
|
|
12
|
+
resolvedOn(ownKey) {
|
|
13
|
+
return this.isSelf ? this.withMembers([ownKey]) : this;
|
|
14
|
+
}
|
|
15
|
+
covers(key) {
|
|
16
|
+
return this.members.includes(key);
|
|
17
|
+
}
|
|
18
|
+
equals(other) {
|
|
19
|
+
return (this.constructor === other.constructor &&
|
|
20
|
+
this.members.length === other.members.length &&
|
|
21
|
+
this.members.every((member, i) => member === other.members[i]));
|
|
22
|
+
}
|
|
23
|
+
onto(fields) {
|
|
24
|
+
const missing = this.members.filter((key) => !(key in fields));
|
|
25
|
+
if (missing.length)
|
|
26
|
+
throw new Error(`${this.constructor.name.toLowerCase()}: [${this.members.join(", ")}] names ` +
|
|
27
|
+
`${missing.map((m) => `'${m}'`).join(", ")}, which the entity does not declare.`);
|
|
28
|
+
const out = { ...fields };
|
|
29
|
+
for (const key of this.members) {
|
|
30
|
+
const field = out[key];
|
|
31
|
+
out[key] = field.with({
|
|
32
|
+
role: { ...field.role, rules: [...(field.role?.rules ?? []), this] },
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
return out;
|
|
36
|
+
}
|
|
37
|
+
rename(map) {
|
|
38
|
+
if (this.isSelf)
|
|
39
|
+
return this;
|
|
40
|
+
const carried = this.members.map(map);
|
|
41
|
+
return carried.every((key) => key !== undefined)
|
|
42
|
+
? this.withMembers(carried)
|
|
43
|
+
: null;
|
|
44
|
+
}
|
|
45
|
+
toJSON() {
|
|
46
|
+
return [...this.members];
|
|
47
|
+
}
|
|
48
|
+
static normalize(groups, make) {
|
|
49
|
+
if (!groups)
|
|
50
|
+
return undefined;
|
|
51
|
+
return groups.map((group) => group instanceof FieldGroup ? group : make(group));
|
|
52
|
+
}
|
|
53
|
+
static on(field, kind) {
|
|
54
|
+
return (field.role?.rules ?? []).filter((rule) => rule instanceof kind);
|
|
55
|
+
}
|
|
56
|
+
static groupsOf(fields, kind) {
|
|
57
|
+
const seen = new Map();
|
|
58
|
+
for (const field of Object.values(fields))
|
|
59
|
+
for (const rule of FieldGroup.on(field, kind))
|
|
60
|
+
if (rule.members.length > 1)
|
|
61
|
+
seen.set(rule.members.join(" "), rule);
|
|
62
|
+
return [...seen.values()];
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=FieldGroup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FieldGroup.js","sourceRoot":"","sources":["../../src/constraint/FieldGroup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Unique.d.ts","sourceRoot":"","sources":["../../src/constraint/Unique.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,qBAAa,MAAO,SAAQ,UAAU;CAAG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Unique.js","sourceRoot":"","sources":["../../src/constraint/Unique.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,MAAM,OAAO,MAAO,SAAQ,UAAU;CAAG"}
|
package/dist/entity.d.ts
CHANGED
|
@@ -1,20 +1,5 @@
|
|
|
1
|
-
import { type Fields } from
|
|
2
|
-
import { type EntityDeclarations } from
|
|
3
|
-
import { type SchemaConstructor } from
|
|
4
|
-
|
|
5
|
-
* Define an entity — the factory that produces a schema-carrying class.
|
|
6
|
-
*
|
|
7
|
-
* ```ts
|
|
8
|
-
* class Post extends entity({ id: primary(), title: text({ min: 1 }) }) {}
|
|
9
|
-
*
|
|
10
|
-
* new Post({ id, title }) // a real instance, data-typed
|
|
11
|
-
* Post.pick('title') // a derived view, same static API
|
|
12
|
-
* function publish(p: Post) // `Post` IS the data type
|
|
13
|
-
* ```
|
|
14
|
-
*
|
|
15
|
-
* Data and schema metadata only — no business behaviour lives on an entity. The 2nd
|
|
16
|
-
* argument carries what the entity states about itself: `unique` groups, and per-adapter
|
|
17
|
-
* hints for what a neutral field cannot express.
|
|
18
|
-
*/
|
|
19
|
-
export declare function entity<TFields extends Fields>(fields: TFields, declarations?: EntityDeclarations<TFields>): SchemaConstructor<TFields>;
|
|
1
|
+
import { type Fields } from './Field.js';
|
|
2
|
+
import { type EntityDeclarations } from './EntityDeclarations.js';
|
|
3
|
+
import { type SchemaConstructor } from './Schema.js';
|
|
4
|
+
export declare function entity<TFields extends Fields>(originalFields: TFields, declarations?: EntityDeclarations<TFields>): SchemaConstructor<TFields>;
|
|
20
5
|
//# sourceMappingURL=entity.d.ts.map
|
package/dist/entity.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entity.d.ts","sourceRoot":"","sources":["../src/entity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,MAAM,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"entity.d.ts","sourceRoot":"","sources":["../src/entity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,MAAM,EAAE,MAAM,YAAY,CAAC;AAEhD,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAU,KAAK,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAE7D,wBAAgB,MAAM,CAAC,OAAO,SAAS,MAAM,EAC3C,cAAc,EAAE,OAAO,EACvB,YAAY,CAAC,EAAE,kBAAkB,CAAC,OAAO,CAAC,GACzC,iBAAiB,CAAC,OAAO,CAAC,CAY5B"}
|
package/dist/entity.js
CHANGED
|
@@ -1,41 +1,15 @@
|
|
|
1
|
-
import { Field } from
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
* ```
|
|
15
|
-
*
|
|
16
|
-
* Data and schema metadata only — no business behaviour lives on an entity. The 2nd
|
|
17
|
-
* argument carries what the entity states about itself: `unique` groups, and per-adapter
|
|
18
|
-
* hints for what a neutral field cannot express.
|
|
19
|
-
*/
|
|
20
|
-
export function entity(fields, declarations) {
|
|
21
|
-
const own = {};
|
|
22
|
-
for (const [key, field] of Object.entries(fields))
|
|
23
|
-
own[key] = new Field(field, key);
|
|
24
|
-
const projected = projectUniqueOntoFields(own, declarations?.unique);
|
|
25
|
-
assertDefaultsAreValid(projected);
|
|
26
|
-
return Schema.of(projected, undefined, declarations?.hints, {}, declarations?.unique);
|
|
27
|
-
}
|
|
28
|
-
function assertDefaultsAreValid(fields) {
|
|
29
|
-
for (const [name, field] of Object.entries(fields)) {
|
|
30
|
-
const create = field.lifecycle?.create;
|
|
31
|
-
if (typeof create !== 'object' || create === null || !('value' in create))
|
|
32
|
-
continue;
|
|
33
|
-
const checked = Judge.value(field, create.value);
|
|
34
|
-
if ('error' in checked) {
|
|
35
|
-
throw new Error(`Field '${name}': the declared default ${JSON.stringify(create.value)} `
|
|
36
|
-
+ `is not a legal value for it — ${checked.error}. It would be written into every row `
|
|
37
|
-
+ `without passing the judge.`);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
1
|
+
import { Field } from './Field.js';
|
|
2
|
+
import { Unique } from './constraint/Unique.js';
|
|
3
|
+
import { Schema } from './Schema.js';
|
|
4
|
+
export function entity(originalFields, declarations) {
|
|
5
|
+
let fields = {};
|
|
6
|
+
for (const [key, field] of Object.entries(originalFields))
|
|
7
|
+
fields[key] = new Field(field, key);
|
|
8
|
+
for (const group of declarations?.unique ?? [])
|
|
9
|
+
fields = new Unique(group).onto(fields);
|
|
10
|
+
const schema = Schema.of(fields, undefined, declarations?.hints, {});
|
|
11
|
+
if (declarations?.previous)
|
|
12
|
+
Object.assign(schema, { previous: declarations.previous });
|
|
13
|
+
return schema;
|
|
40
14
|
}
|
|
41
15
|
//# sourceMappingURL=entity.js.map
|
package/dist/entity.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entity.js","sourceRoot":"","sources":["../src/entity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAe,MAAM,
|
|
1
|
+
{"version":3,"file":"entity.js","sourceRoot":"","sources":["../src/entity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAe,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAEhD,OAAO,EAAE,MAAM,EAA0B,MAAM,aAAa,CAAC;AAE7D,MAAM,UAAU,MAAM,CACpB,cAAuB,EACvB,YAA0C;IAE1C,IAAI,MAAM,GAAW,EAAE,CAAC;IAExB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC;QACvD,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAEtC,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,MAAM,IAAI,EAAE;QAC5C,MAAM,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAE1C,MAAM,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC,MAAiB,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;IAChF,IAAI,YAAY,EAAE,QAAQ;QAAE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAC;IACvF,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,38 +1,55 @@
|
|
|
1
|
-
export { Field, type Fields
|
|
2
|
-
export {
|
|
3
|
-
export { type
|
|
4
|
-
export {
|
|
5
|
-
export {
|
|
6
|
-
export {
|
|
7
|
-
export {
|
|
8
|
-
export {
|
|
9
|
-
export {
|
|
10
|
-
export {
|
|
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
|
-
export {
|
|
33
|
-
export {
|
|
34
|
-
export {
|
|
35
|
-
export
|
|
36
|
-
export {
|
|
37
|
-
export {
|
|
1
|
+
export { Field, type Fields } from './Field.js';
|
|
2
|
+
export { type Shape, Anatomy } from './axis/shape/Shape.js';
|
|
3
|
+
export { type StringFormat, type FormatPredicate, Formats } from './axis/shape/Formats.js';
|
|
4
|
+
export { Role, primaryFieldOf, type RoleRules } from './axis/role/Role.js';
|
|
5
|
+
export { type Relation, type EntityConstructor } from './axis/role/Relation.js';
|
|
6
|
+
export { Lifecycle, type LifecycleRules } from './axis/lifecycle/Lifecycle.js';
|
|
7
|
+
export { type GeneratorRef, registerGenerator } from './axis/lifecycle/Generators.js';
|
|
8
|
+
export { Boundary, type BoundaryRules, type BoundaryRef } from './axis/boundary/Boundary.js';
|
|
9
|
+
export { type Decoder, type Encoder, Boundaries } from './axis/boundary/Boundaries.js';
|
|
10
|
+
export { type Meta } from './axis/Meta.js';
|
|
11
|
+
export { FieldGroup } from './constraint/FieldGroup.js';
|
|
12
|
+
export { Unique } from './constraint/Unique.js';
|
|
13
|
+
export { Schema, ANONYMOUS_SCHEMA_NAME, type SchemaConstructor } from './Schema.js';
|
|
14
|
+
export { casesFor, holds, refusalBranches, type Case } from './judge/cases.js';
|
|
15
|
+
export { type SchemaView, type Row, type PartialRow } from './SchemaView.js';
|
|
16
|
+
export { type FougereHints, type Hints } from './EntityDeclarations.js';
|
|
17
|
+
export { same } from './same.js';
|
|
18
|
+
export { primary } from './vocabulary/primary.js';
|
|
19
|
+
export { text } from './vocabulary/text.js';
|
|
20
|
+
export { email } from './vocabulary/email.js';
|
|
21
|
+
export { url } from './vocabulary/url.js';
|
|
22
|
+
export { list } from './vocabulary/list.js';
|
|
23
|
+
export { number } from './vocabulary/number.js';
|
|
24
|
+
export { bool } from './vocabulary/bool.js';
|
|
25
|
+
export { date } from './vocabulary/date.js';
|
|
26
|
+
export { created } from './vocabulary/created.js';
|
|
27
|
+
export { updated } from './vocabulary/updated.js';
|
|
28
|
+
export { oneOf } from './vocabulary/oneOf.js';
|
|
29
|
+
export { ref } from './vocabulary/ref.js';
|
|
30
|
+
export { many } from './vocabulary/many.js';
|
|
31
|
+
export { optional } from './vocabulary/optional.js';
|
|
32
|
+
export { nullable } from './vocabulary/nullable.js';
|
|
33
|
+
export { immutable } from './vocabulary/immutable.js';
|
|
34
|
+
export { unique } from './vocabulary/unique.js';
|
|
35
|
+
export { indexed } from './vocabulary/indexed.js';
|
|
36
|
+
export { readOnly } from './vocabulary/readOnly.js';
|
|
37
|
+
export { writeOnly } from './vocabulary/writeOnly.js';
|
|
38
|
+
export { json } from './vocabulary/json.js';
|
|
39
|
+
export { applyCreate, applyUpdate, freezeClock } from './axis/lifecycle/apply.js';
|
|
40
|
+
export { encodeFields } from './projection/encode.js';
|
|
41
|
+
export { inputFields, outputFields } from './projection/io.js';
|
|
42
|
+
export { registrationKeyOf, classNameOf } from './name.js';
|
|
43
|
+
export { describe, describeSet, sourceNameOf } from './card/describe.js';
|
|
44
|
+
export { reconstruct, reconstructSet } from './card/reconstruct.js';
|
|
45
|
+
export { diff, diffSet } from './card/diff.js';
|
|
46
|
+
export type { Change, Diff, DiffOptions, SetDiff, SetDiffOptions, RenameCandidate, TypeSet } from './card/diff.js';
|
|
47
|
+
export { entitySourceOf, facadeTypeSourceOf, type TypeSourceOptions, type OpDescriptor } from './card/typescript.js';
|
|
48
|
+
export { type SchemaBundle, type SchemaDescriptor, type FieldDescriptor, type FieldExtension, type RoleDescriptor, type RelationDescriptor } from './card/Descriptor.js';
|
|
49
|
+
export { type SchemaSource, schemaOf, fieldsOf } from './projection/source.js';
|
|
50
|
+
export type { StandardSchemaV1 } from './projection/standard.js';
|
|
51
|
+
export { entity } from './entity.js';
|
|
52
|
+
export { Judge } from './judge/Judge.js';
|
|
53
|
+
export { type ValidateOptions } from './judge/options.js';
|
|
54
|
+
export { type ValidationError, type ValidationResult, type Checked } from './judge/result.js';
|
|
38
55
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|