@formspec/build 0.1.0-alpha.15 → 0.1.0-alpha.16
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/__tests__/fixtures/edge-cases.d.ts +11 -0
- package/dist/__tests__/fixtures/edge-cases.d.ts.map +1 -1
- package/dist/__tests__/fixtures/mixed-authoring-shipping-address.d.ts +30 -0
- package/dist/__tests__/fixtures/mixed-authoring-shipping-address.d.ts.map +1 -0
- package/dist/__tests__/mixed-authoring.test.d.ts +2 -0
- package/dist/__tests__/mixed-authoring.test.d.ts.map +1 -0
- package/dist/__tests__/parity/utils.d.ts +5 -3
- package/dist/__tests__/parity/utils.d.ts.map +1 -1
- package/dist/analyzer/class-analyzer.d.ts +4 -2
- package/dist/analyzer/class-analyzer.d.ts.map +1 -1
- package/dist/analyzer/tsdoc-parser.d.ts +20 -2
- package/dist/analyzer/tsdoc-parser.d.ts.map +1 -1
- package/dist/browser.cjs +172 -17
- package/dist/browser.cjs.map +1 -1
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +172 -17
- package/dist/browser.js.map +1 -1
- package/dist/build.d.ts +39 -1
- package/dist/canonicalize/tsdoc-canonicalizer.d.ts.map +1 -1
- package/dist/cli.cjs +634 -88
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +634 -88
- package/dist/cli.js.map +1 -1
- package/dist/generators/mixed-authoring.d.ts +45 -0
- package/dist/generators/mixed-authoring.d.ts.map +1 -0
- package/dist/index.cjs +622 -87
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +621 -87
- package/dist/index.js.map +1 -1
- package/dist/internals.cjs +526 -91
- package/dist/internals.cjs.map +1 -1
- package/dist/internals.js +526 -91
- package/dist/internals.js.map +1 -1
- package/dist/json-schema/ir-generator.d.ts +3 -2
- package/dist/json-schema/ir-generator.d.ts.map +1 -1
- package/dist/ui-schema/ir-generator.d.ts.map +1 -1
- package/dist/validate/constraint-validator.d.ts.map +1 -1
- package/package.json +3 -3
- package/dist/__tests__/jsdoc-constraints.test.d.ts +0 -9
- package/dist/__tests__/jsdoc-constraints.test.d.ts.map +0 -1
|
@@ -53,12 +53,23 @@ export declare class ArrayEdgeCases {
|
|
|
53
53
|
export interface SelfRefRecord {
|
|
54
54
|
[key: string]: SelfRefRecord;
|
|
55
55
|
}
|
|
56
|
+
export interface StringMap {
|
|
57
|
+
[key: string]: string;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Various object type patterns.
|
|
61
|
+
*/
|
|
62
|
+
export declare class CircularNode {
|
|
63
|
+
id: string;
|
|
64
|
+
next?: CircularNode;
|
|
65
|
+
}
|
|
56
66
|
/**
|
|
57
67
|
* Various object type patterns.
|
|
58
68
|
*/
|
|
59
69
|
export declare class ObjectEdgeCases {
|
|
60
70
|
emptyObject: {};
|
|
61
71
|
stringRecord: Record<string, string>;
|
|
72
|
+
namedStringMap: StringMap;
|
|
62
73
|
selfRefRecord: SelfRefRecord;
|
|
63
74
|
deepNested: {
|
|
64
75
|
level1: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"edge-cases.d.ts","sourceRoot":"","sources":["../../../src/__tests__/fixtures/edge-cases.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"edge-cases.d.ts","sourceRoot":"","sources":["../../../src/__tests__/fixtures/edge-cases.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Static shipping-address model for mixed-authoring composition tests.
|
|
3
|
+
*/
|
|
4
|
+
export declare class ShippingAddressModel {
|
|
5
|
+
/** @displayName Country */
|
|
6
|
+
country: string;
|
|
7
|
+
/** @displayName City */
|
|
8
|
+
city: string;
|
|
9
|
+
/** @displayName Postal Code */
|
|
10
|
+
postalCode?: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* ChainDSL overlay for the runtime-backed city field.
|
|
14
|
+
*/
|
|
15
|
+
export declare const shippingAddressOverlays: import("@formspec/core").FormSpec<readonly [import("@formspec/core").DynamicEnumField<"city", "cities">]>;
|
|
16
|
+
export declare class NumericShippingAddressModel {
|
|
17
|
+
cityCode: number;
|
|
18
|
+
}
|
|
19
|
+
export declare const incompatibleShippingAddressOverlays: import("@formspec/core").FormSpec<readonly [import("@formspec/core").DynamicEnumField<"cityCode", "cities">]>;
|
|
20
|
+
export declare class NestedShippingAddressModel {
|
|
21
|
+
address: {
|
|
22
|
+
city: string;
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
export declare const nestedShippingAddressOverlays: import("@formspec/core").FormSpec<readonly [import("@formspec/core").ObjectField<"address", readonly [import("@formspec/core").DynamicEnumField<"city", "cities">]>]>;
|
|
26
|
+
export declare const duplicateShippingAddressOverlays: import("@formspec/core").FormSpec<readonly [import("@formspec/core").DynamicEnumField<"city", "cities">, import("@formspec/core").DynamicEnumField<"city", "backup-cities">]>;
|
|
27
|
+
export declare const unknownShippingAddressOverlays: import("@formspec/core").FormSpec<readonly [import("@formspec/core").DynamicEnumField<"region", "regions">]>;
|
|
28
|
+
export declare const constrainedShippingAddressOverlays: import("@formspec/core").FormSpec<readonly [import("@formspec/core").TextField<"city">]>;
|
|
29
|
+
export declare const requiredShippingAddressOverlays: import("@formspec/core").FormSpec<readonly [import("@formspec/core").TextField<"postalCode">]>;
|
|
30
|
+
//# sourceMappingURL=mixed-authoring-shipping-address.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mixed-authoring-shipping-address.d.ts","sourceRoot":"","sources":["../../../src/__tests__/fixtures/mixed-authoring-shipping-address.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,qBAAa,oBAAoB;IAC/B,2BAA2B;IAC3B,OAAO,EAAG,MAAM,CAAC;IAEjB,wBAAwB;IACxB,IAAI,EAAG,MAAM,CAAC;IAEd,+BAA+B;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,eAAO,MAAM,uBAAuB,2GAInC,CAAC;AAEF,qBAAa,2BAA2B;IACtC,QAAQ,EAAG,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,mCAAmC,+GAE/C,CAAC;AAEF,qBAAa,0BAA0B;IACrC,OAAO,EAAG;QACR,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AAED,eAAO,MAAM,6BAA6B,uKAEzC,CAAC;AAEF,eAAO,MAAM,gCAAgC,+KAG5C,CAAC;AAEF,eAAO,MAAM,8BAA8B,8GAAmD,CAAC;AAE/F,eAAO,MAAM,kCAAkC,0FAE9C,CAAC;AAEF,eAAO,MAAM,+BAA+B,gGAE3C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mixed-authoring.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/mixed-authoring.test.ts"],"names":[],"mappings":""}
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* guarantees intact: if an IR node gains or loses a field, the provenance-free variants
|
|
12
12
|
* here will fail to compile, catching shape regressions at type-check time.
|
|
13
13
|
*/
|
|
14
|
-
import type { FormIR, FormIRElement, PrimitiveTypeNode, EnumMember, DynamicTypeNode, CustomTypeNode, NumericConstraintNode, LengthConstraintNode, PatternConstraintNode, ArrayCardinalityConstraintNode, EnumMemberConstraintNode, CustomConstraintNode, DisplayNameAnnotationNode, DescriptionAnnotationNode, PlaceholderAnnotationNode, DefaultValueAnnotationNode, DeprecatedAnnotationNode, FormatHintAnnotationNode, CustomAnnotationNode, JsonValue } from "@formspec/core";
|
|
14
|
+
import type { FormIR, FormIRElement, PrimitiveTypeNode, EnumMember, DynamicTypeNode, CustomTypeNode, NumericConstraintNode, LengthConstraintNode, PatternConstraintNode, ArrayCardinalityConstraintNode, EnumMemberConstraintNode, ConstConstraintNode, CustomConstraintNode, DisplayNameAnnotationNode, DescriptionAnnotationNode, FormatAnnotationNode, PlaceholderAnnotationNode, DefaultValueAnnotationNode, DeprecatedAnnotationNode, FormatHintAnnotationNode, CustomAnnotationNode, JsonValue } from "@formspec/core";
|
|
15
15
|
/** Primitive type node has no `provenance` field — pass through unchanged. */
|
|
16
16
|
export type ProvenanceFreePrimitiveTypeNode = PrimitiveTypeNode;
|
|
17
17
|
/** Enum member has no `provenance` field. */
|
|
@@ -67,16 +67,18 @@ export type ProvenanceFreeLengthConstraintNode = Omit<LengthConstraintNode, "pro
|
|
|
67
67
|
export type ProvenanceFreePatternConstraintNode = Omit<PatternConstraintNode, "provenance">;
|
|
68
68
|
export type ProvenanceFreeArrayCardinalityConstraintNode = Omit<ArrayCardinalityConstraintNode, "provenance">;
|
|
69
69
|
export type ProvenanceFreeEnumMemberConstraintNode = Omit<EnumMemberConstraintNode, "provenance">;
|
|
70
|
+
export type ProvenanceFreeConstConstraintNode = Omit<ConstConstraintNode, "provenance">;
|
|
70
71
|
export type ProvenanceFreeCustomConstraintNode = Omit<CustomConstraintNode, "provenance">;
|
|
71
|
-
export type ProvenanceFreeConstraintNode = ProvenanceFreeNumericConstraintNode | ProvenanceFreeLengthConstraintNode | ProvenanceFreePatternConstraintNode | ProvenanceFreeArrayCardinalityConstraintNode | ProvenanceFreeEnumMemberConstraintNode | ProvenanceFreeCustomConstraintNode;
|
|
72
|
+
export type ProvenanceFreeConstraintNode = ProvenanceFreeNumericConstraintNode | ProvenanceFreeLengthConstraintNode | ProvenanceFreePatternConstraintNode | ProvenanceFreeArrayCardinalityConstraintNode | ProvenanceFreeEnumMemberConstraintNode | ProvenanceFreeConstConstraintNode | ProvenanceFreeCustomConstraintNode;
|
|
72
73
|
export type ProvenanceFreeDisplayNameAnnotationNode = Omit<DisplayNameAnnotationNode, "provenance">;
|
|
73
74
|
export type ProvenanceFreeDescriptionAnnotationNode = Omit<DescriptionAnnotationNode, "provenance">;
|
|
75
|
+
export type ProvenanceFreeFormatAnnotationNode = Omit<FormatAnnotationNode, "provenance">;
|
|
74
76
|
export type ProvenanceFreePlaceholderAnnotationNode = Omit<PlaceholderAnnotationNode, "provenance">;
|
|
75
77
|
export type ProvenanceFreeDefaultValueAnnotationNode = Omit<DefaultValueAnnotationNode, "provenance">;
|
|
76
78
|
export type ProvenanceFreeDeprecatedAnnotationNode = Omit<DeprecatedAnnotationNode, "provenance">;
|
|
77
79
|
export type ProvenanceFreeFormatHintAnnotationNode = Omit<FormatHintAnnotationNode, "provenance">;
|
|
78
80
|
export type ProvenanceFreeCustomAnnotationNode = Omit<CustomAnnotationNode, "provenance">;
|
|
79
|
-
export type ProvenanceFreeAnnotationNode = ProvenanceFreeDisplayNameAnnotationNode | ProvenanceFreeDescriptionAnnotationNode | ProvenanceFreePlaceholderAnnotationNode | ProvenanceFreeDefaultValueAnnotationNode | ProvenanceFreeDeprecatedAnnotationNode | ProvenanceFreeFormatHintAnnotationNode | ProvenanceFreeCustomAnnotationNode;
|
|
81
|
+
export type ProvenanceFreeAnnotationNode = ProvenanceFreeDisplayNameAnnotationNode | ProvenanceFreeDescriptionAnnotationNode | ProvenanceFreeFormatAnnotationNode | ProvenanceFreePlaceholderAnnotationNode | ProvenanceFreeDefaultValueAnnotationNode | ProvenanceFreeDeprecatedAnnotationNode | ProvenanceFreeFormatHintAnnotationNode | ProvenanceFreeCustomAnnotationNode;
|
|
80
82
|
/** Field node with `provenance` and `mergeHistory` stripped; nested structures recursively mapped. */
|
|
81
83
|
export interface ProvenanceFreeFieldNode {
|
|
82
84
|
readonly kind: "field";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/__tests__/parity/utils.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/__tests__/parity/utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* All downstream generation routes through the canonical FormIR.
|
|
7
7
|
*/
|
|
8
8
|
import * as ts from "typescript";
|
|
9
|
-
import type { FieldNode, TypeNode, TypeDefinition, JsonValue } from "@formspec/core";
|
|
9
|
+
import type { FieldNode, TypeNode, AnnotationNode, TypeDefinition, JsonValue } from "@formspec/core";
|
|
10
10
|
/**
|
|
11
11
|
* Layout metadata extracted from `@Group` and `@ShowWhen` TSDoc tags.
|
|
12
12
|
* One entry per field, in the same order as `fields`.
|
|
@@ -32,6 +32,8 @@ export interface IRClassAnalysis {
|
|
|
32
32
|
readonly fieldLayouts: readonly FieldLayoutMetadata[];
|
|
33
33
|
/** Named type definitions referenced by fields */
|
|
34
34
|
readonly typeRegistry: Record<string, TypeDefinition>;
|
|
35
|
+
/** Root-level metadata for the analyzed declaration. */
|
|
36
|
+
readonly annotations?: readonly AnnotationNode[];
|
|
35
37
|
/** Instance methods (retained for downstream method-schema generation) */
|
|
36
38
|
readonly instanceMethods: readonly MethodInfo[];
|
|
37
39
|
/** Static methods */
|
|
@@ -62,7 +64,7 @@ export declare function analyzeTypeAliasToIR(typeAlias: ts.TypeAliasDeclaration,
|
|
|
62
64
|
/**
|
|
63
65
|
* Resolves a TypeScript type to a canonical IR TypeNode.
|
|
64
66
|
*/
|
|
65
|
-
export declare function resolveTypeNode(type: ts.Type, checker: ts.TypeChecker, file: string, typeRegistry: Record<string, TypeDefinition>, visiting: Set<ts.Type
|
|
67
|
+
export declare function resolveTypeNode(type: ts.Type, checker: ts.TypeChecker, file: string, typeRegistry: Record<string, TypeDefinition>, visiting: Set<ts.Type>, sourceNode?: ts.Node): TypeNode;
|
|
66
68
|
/**
|
|
67
69
|
* Analyzed method information.
|
|
68
70
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"class-analyzer.d.ts","sourceRoot":"","sources":["../../src/analyzer/class-analyzer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,KAAK,EACV,SAAS,EACT,QAAQ,
|
|
1
|
+
{"version":3,"file":"class-analyzer.d.ts","sourceRoot":"","sources":["../../src/analyzer/class-analyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,11 +10,11 @@
|
|
|
10
10
|
* 1. **Constraint tags** (all alphanumeric, TSDoc-compliant):
|
|
11
11
|
* `@minimum`, `@maximum`, `@exclusiveMinimum`, `@exclusiveMaximum`,
|
|
12
12
|
* `@multipleOf`, `@minLength`, `@maxLength`, `@minItems`, `@maxItems`,
|
|
13
|
-
* `@pattern`, `@enumOptions`
|
|
13
|
+
* `@uniqueItems`, `@pattern`, `@enumOptions`, `@const`
|
|
14
14
|
* — Parsed via TSDocParser as custom block tags.
|
|
15
15
|
* Both camelCase and PascalCase forms are accepted (e.g., `@Minimum`).
|
|
16
16
|
*
|
|
17
|
-
* 2. **Annotation tags** (`@displayName`, `@description`):
|
|
17
|
+
* 2. **Annotation tags** (`@displayName`, `@description`, `@format`, `@placeholder`):
|
|
18
18
|
* These are parsed as structured custom block tags and mapped directly
|
|
19
19
|
* onto annotation IR nodes.
|
|
20
20
|
*
|
|
@@ -38,6 +38,17 @@ export interface TSDocParseResult {
|
|
|
38
38
|
/** Annotation IR nodes extracted from canonical TSDoc block tags. */
|
|
39
39
|
readonly annotations: readonly AnnotationNode[];
|
|
40
40
|
}
|
|
41
|
+
/**
|
|
42
|
+
* Display-name metadata extracted from a node's JSDoc tags.
|
|
43
|
+
*
|
|
44
|
+
* The root display name is returned separately from member-target labels so
|
|
45
|
+
* callers can apply the former to the enclosing type/form and the latter to
|
|
46
|
+
* enum members.
|
|
47
|
+
*/
|
|
48
|
+
export interface DisplayNameMetadata {
|
|
49
|
+
readonly displayName?: string;
|
|
50
|
+
readonly memberDisplayNames: ReadonlyMap<string, string>;
|
|
51
|
+
}
|
|
41
52
|
/**
|
|
42
53
|
* Parses the JSDoc comment attached to a TypeScript AST node using the
|
|
43
54
|
* official TSDoc parser and returns canonical IR constraint and annotation
|
|
@@ -58,6 +69,13 @@ export declare function parseTSDocTags(node: ts.Node, file?: string): TSDocParse
|
|
|
58
69
|
* Falls back to the TS compiler API for nodes without doc comments.
|
|
59
70
|
*/
|
|
60
71
|
export declare function hasDeprecatedTagTSDoc(node: ts.Node): boolean;
|
|
72
|
+
/**
|
|
73
|
+
* Extracts root and member-target display-name metadata from a node's JSDoc tags.
|
|
74
|
+
*
|
|
75
|
+
* Member-target display-name tags use the syntax `@displayName :member Label`.
|
|
76
|
+
* The first non-target `@displayName` is returned as the root display name.
|
|
77
|
+
*/
|
|
78
|
+
export declare function extractDisplayNameMetadata(node: ts.Node): DisplayNameMetadata;
|
|
61
79
|
/**
|
|
62
80
|
* Extracts a path-target prefix (`:fieldName`) from constraint tag text.
|
|
63
81
|
* Returns the parsed PathTarget and remaining text, or null if no path target.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tsdoc-parser.d.ts","sourceRoot":"","sources":["../../src/analyzer/tsdoc-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAYjC,OAAO,EAIL,KAAK,cAAc,EACnB,KAAK,cAAc,EAInB,KAAK,UAAU,
|
|
1
|
+
{"version":3,"file":"tsdoc-parser.d.ts","sourceRoot":"","sources":["../../src/analyzer/tsdoc-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAYjC,OAAO,EAIL,KAAK,cAAc,EACnB,KAAK,cAAc,EAInB,KAAK,UAAU,EAEhB,MAAM,gBAAgB,CAAC;AAyFxB;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,4DAA4D;IAC5D,QAAQ,CAAC,WAAW,EAAE,SAAS,cAAc,EAAE,CAAC;IAChD,qEAAqE;IACrE,QAAQ,CAAC,WAAW,EAAE,SAAS,cAAc,EAAE,CAAC;CACjD;AAED;;;;;;GAMG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,kBAAkB,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC1D;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,SAAK,GAAG,gBAAgB,CAiKzE;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,OAAO,CAsB5D;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,mBAAmB,CA2B7E;AAMD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,GACX;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAQpD"}
|
package/dist/browser.cjs
CHANGED
|
@@ -380,6 +380,9 @@ function generateJsonSchemaFromIR(ir, options) {
|
|
|
380
380
|
const ctx = makeContext(options);
|
|
381
381
|
for (const [name, typeDef] of Object.entries(ir.typeRegistry)) {
|
|
382
382
|
ctx.defs[name] = generateTypeNode(typeDef.type, ctx);
|
|
383
|
+
if (typeDef.annotations && typeDef.annotations.length > 0) {
|
|
384
|
+
applyAnnotations(ctx.defs[name], typeDef.annotations, ctx);
|
|
385
|
+
}
|
|
383
386
|
}
|
|
384
387
|
const properties = {};
|
|
385
388
|
const required = [];
|
|
@@ -391,6 +394,9 @@ function generateJsonSchemaFromIR(ir, options) {
|
|
|
391
394
|
properties,
|
|
392
395
|
...uniqueRequired.length > 0 && { required: uniqueRequired }
|
|
393
396
|
};
|
|
397
|
+
if (ir.annotations && ir.annotations.length > 0) {
|
|
398
|
+
applyAnnotations(result, ir.annotations, ctx);
|
|
399
|
+
}
|
|
394
400
|
if (Object.keys(ctx.defs).length > 0) {
|
|
395
401
|
result.$defs = ctx.defs;
|
|
396
402
|
}
|
|
@@ -420,22 +426,51 @@ function collectFields(elements, properties, required, ctx) {
|
|
|
420
426
|
}
|
|
421
427
|
function generateFieldSchema(field, ctx) {
|
|
422
428
|
const schema = generateTypeNode(field.type, ctx);
|
|
429
|
+
const itemStringSchema = schema.type === "array" && schema.items?.type === "string" ? schema.items : void 0;
|
|
423
430
|
const directConstraints = [];
|
|
431
|
+
const itemConstraints = [];
|
|
424
432
|
const pathConstraints = [];
|
|
425
433
|
for (const c of field.constraints) {
|
|
426
434
|
if (c.path) {
|
|
427
435
|
pathConstraints.push(c);
|
|
436
|
+
} else if (itemStringSchema !== void 0 && isStringItemConstraint(c)) {
|
|
437
|
+
itemConstraints.push(c);
|
|
428
438
|
} else {
|
|
429
439
|
directConstraints.push(c);
|
|
430
440
|
}
|
|
431
441
|
}
|
|
432
442
|
applyConstraints(schema, directConstraints, ctx);
|
|
433
|
-
|
|
443
|
+
if (itemStringSchema !== void 0) {
|
|
444
|
+
applyConstraints(itemStringSchema, itemConstraints, ctx);
|
|
445
|
+
}
|
|
446
|
+
const rootAnnotations = [];
|
|
447
|
+
const itemAnnotations = [];
|
|
448
|
+
for (const annotation of field.annotations) {
|
|
449
|
+
if (itemStringSchema !== void 0 && annotation.annotationKind === "format") {
|
|
450
|
+
itemAnnotations.push(annotation);
|
|
451
|
+
} else {
|
|
452
|
+
rootAnnotations.push(annotation);
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
applyAnnotations(schema, rootAnnotations, ctx);
|
|
456
|
+
if (itemStringSchema !== void 0) {
|
|
457
|
+
applyAnnotations(itemStringSchema, itemAnnotations, ctx);
|
|
458
|
+
}
|
|
434
459
|
if (pathConstraints.length === 0) {
|
|
435
460
|
return schema;
|
|
436
461
|
}
|
|
437
462
|
return applyPathTargetedConstraints(schema, pathConstraints, ctx);
|
|
438
463
|
}
|
|
464
|
+
function isStringItemConstraint(constraint) {
|
|
465
|
+
switch (constraint.constraintKind) {
|
|
466
|
+
case "minLength":
|
|
467
|
+
case "maxLength":
|
|
468
|
+
case "pattern":
|
|
469
|
+
return true;
|
|
470
|
+
default:
|
|
471
|
+
return false;
|
|
472
|
+
}
|
|
473
|
+
}
|
|
439
474
|
function applyPathTargetedConstraints(schema, pathConstraints, ctx) {
|
|
440
475
|
if (schema.type === "array" && schema.items) {
|
|
441
476
|
schema.items = applyPathTargetedConstraints(schema.items, pathConstraints, ctx);
|
|
@@ -653,6 +688,9 @@ function applyConstraints(schema, constraints, ctx) {
|
|
|
653
688
|
case "uniqueItems":
|
|
654
689
|
schema.uniqueItems = constraint.value;
|
|
655
690
|
break;
|
|
691
|
+
case "const":
|
|
692
|
+
schema.const = constraint.value;
|
|
693
|
+
break;
|
|
656
694
|
case "allowedMembers":
|
|
657
695
|
break;
|
|
658
696
|
case "custom":
|
|
@@ -677,8 +715,14 @@ function applyAnnotations(schema, annotations, ctx) {
|
|
|
677
715
|
case "defaultValue":
|
|
678
716
|
schema.default = annotation.value;
|
|
679
717
|
break;
|
|
718
|
+
case "format":
|
|
719
|
+
schema.format = annotation.value;
|
|
720
|
+
break;
|
|
680
721
|
case "deprecated":
|
|
681
722
|
schema.deprecated = true;
|
|
723
|
+
if (annotation.message !== void 0 && annotation.message !== "") {
|
|
724
|
+
schema["x-formspec-deprecation-description"] = annotation.message;
|
|
725
|
+
}
|
|
682
726
|
break;
|
|
683
727
|
case "placeholder":
|
|
684
728
|
break;
|
|
@@ -866,25 +910,31 @@ function createShowRule(fieldName, value) {
|
|
|
866
910
|
}
|
|
867
911
|
};
|
|
868
912
|
}
|
|
913
|
+
function flattenConditionSchema(scope, schema) {
|
|
914
|
+
if (schema.allOf === void 0) {
|
|
915
|
+
if (scope === "#") {
|
|
916
|
+
return [schema];
|
|
917
|
+
}
|
|
918
|
+
const fieldName = scope.replace("#/properties/", "");
|
|
919
|
+
return [
|
|
920
|
+
{
|
|
921
|
+
properties: {
|
|
922
|
+
[fieldName]: schema
|
|
923
|
+
}
|
|
924
|
+
}
|
|
925
|
+
];
|
|
926
|
+
}
|
|
927
|
+
return schema.allOf.flatMap((member) => flattenConditionSchema(scope, member));
|
|
928
|
+
}
|
|
869
929
|
function combineRules(parentRule, childRule) {
|
|
870
|
-
const parentCondition = parentRule.condition;
|
|
871
|
-
const childCondition = childRule.condition;
|
|
872
930
|
return {
|
|
873
931
|
effect: "SHOW",
|
|
874
932
|
condition: {
|
|
875
933
|
scope: "#",
|
|
876
934
|
schema: {
|
|
877
935
|
allOf: [
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
[parentCondition.scope.replace("#/properties/", "")]: parentCondition.schema
|
|
881
|
-
}
|
|
882
|
-
},
|
|
883
|
-
{
|
|
884
|
-
properties: {
|
|
885
|
-
[childCondition.scope.replace("#/properties/", "")]: childCondition.schema
|
|
886
|
-
}
|
|
887
|
-
}
|
|
936
|
+
...flattenConditionSchema(parentRule.condition.scope, parentRule.condition.schema),
|
|
937
|
+
...flattenConditionSchema(childRule.condition.scope, childRule.condition.schema)
|
|
888
938
|
]
|
|
889
939
|
}
|
|
890
940
|
}
|
|
@@ -892,10 +942,14 @@ function combineRules(parentRule, childRule) {
|
|
|
892
942
|
}
|
|
893
943
|
function fieldNodeToControl(field, parentRule) {
|
|
894
944
|
const displayNameAnnotation = field.annotations.find((a) => a.annotationKind === "displayName");
|
|
945
|
+
const placeholderAnnotation = field.annotations.find((a) => a.annotationKind === "placeholder");
|
|
895
946
|
const control = {
|
|
896
947
|
type: "Control",
|
|
897
948
|
scope: fieldToScope(field.name),
|
|
898
949
|
...displayNameAnnotation !== void 0 && { label: displayNameAnnotation.value },
|
|
950
|
+
...placeholderAnnotation !== void 0 && {
|
|
951
|
+
options: { placeholder: placeholderAnnotation.value }
|
|
952
|
+
},
|
|
899
953
|
...parentRule !== void 0 && { rule: parentRule }
|
|
900
954
|
};
|
|
901
955
|
return control;
|
|
@@ -1090,6 +1144,15 @@ function addUnknownExtension(ctx, message, primary) {
|
|
|
1090
1144
|
relatedLocations: []
|
|
1091
1145
|
});
|
|
1092
1146
|
}
|
|
1147
|
+
function addUnknownPathTarget(ctx, message, primary) {
|
|
1148
|
+
ctx.diagnostics.push({
|
|
1149
|
+
code: "UNKNOWN_PATH_TARGET",
|
|
1150
|
+
message,
|
|
1151
|
+
severity: "error",
|
|
1152
|
+
primaryLocation: primary,
|
|
1153
|
+
relatedLocations: []
|
|
1154
|
+
});
|
|
1155
|
+
}
|
|
1093
1156
|
function addConstraintBroadening(ctx, message, primary, related) {
|
|
1094
1157
|
ctx.diagnostics.push({
|
|
1095
1158
|
code: "CONSTRAINT_BROADENING",
|
|
@@ -1110,6 +1173,45 @@ function findAllowedMembers(constraints) {
|
|
|
1110
1173
|
(c) => c.constraintKind === "allowedMembers"
|
|
1111
1174
|
);
|
|
1112
1175
|
}
|
|
1176
|
+
function findConstConstraints(constraints) {
|
|
1177
|
+
return constraints.filter(
|
|
1178
|
+
(c) => c.constraintKind === "const"
|
|
1179
|
+
);
|
|
1180
|
+
}
|
|
1181
|
+
function jsonValueEquals(left, right) {
|
|
1182
|
+
if (left === right) {
|
|
1183
|
+
return true;
|
|
1184
|
+
}
|
|
1185
|
+
if (Array.isArray(left) || Array.isArray(right)) {
|
|
1186
|
+
if (!Array.isArray(left) || !Array.isArray(right) || left.length !== right.length) {
|
|
1187
|
+
return false;
|
|
1188
|
+
}
|
|
1189
|
+
return left.every((item, index) => jsonValueEquals(item, right[index]));
|
|
1190
|
+
}
|
|
1191
|
+
if (isJsonObject(left) || isJsonObject(right)) {
|
|
1192
|
+
if (!isJsonObject(left) || !isJsonObject(right)) {
|
|
1193
|
+
return false;
|
|
1194
|
+
}
|
|
1195
|
+
const leftKeys = Object.keys(left).sort();
|
|
1196
|
+
const rightKeys = Object.keys(right).sort();
|
|
1197
|
+
if (leftKeys.length !== rightKeys.length) {
|
|
1198
|
+
return false;
|
|
1199
|
+
}
|
|
1200
|
+
return leftKeys.every((key, index) => {
|
|
1201
|
+
const rightKey = rightKeys[index];
|
|
1202
|
+
if (rightKey !== key) {
|
|
1203
|
+
return false;
|
|
1204
|
+
}
|
|
1205
|
+
const leftValue = left[key];
|
|
1206
|
+
const rightValue = right[rightKey];
|
|
1207
|
+
return leftValue !== void 0 && rightValue !== void 0 && jsonValueEquals(leftValue, rightValue);
|
|
1208
|
+
});
|
|
1209
|
+
}
|
|
1210
|
+
return false;
|
|
1211
|
+
}
|
|
1212
|
+
function isJsonObject(value) {
|
|
1213
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
1214
|
+
}
|
|
1113
1215
|
function isOrderedBoundConstraint(constraint) {
|
|
1114
1216
|
return constraint.constraintKind === "minimum" || constraint.constraintKind === "exclusiveMinimum" || constraint.constraintKind === "minLength" || constraint.constraintKind === "minItems" || constraint.constraintKind === "maximum" || constraint.constraintKind === "exclusiveMaximum" || constraint.constraintKind === "maxLength" || constraint.constraintKind === "maxItems";
|
|
1115
1217
|
}
|
|
@@ -1316,6 +1418,25 @@ function checkAllowedMembersContradiction(ctx, fieldName, constraints) {
|
|
|
1316
1418
|
}
|
|
1317
1419
|
}
|
|
1318
1420
|
}
|
|
1421
|
+
function checkConstContradictions(ctx, fieldName, constraints) {
|
|
1422
|
+
const constConstraints = findConstConstraints(constraints);
|
|
1423
|
+
if (constConstraints.length < 2) return;
|
|
1424
|
+
const first = constConstraints[0];
|
|
1425
|
+
if (first === void 0) return;
|
|
1426
|
+
for (let i = 1; i < constConstraints.length; i++) {
|
|
1427
|
+
const current = constConstraints[i];
|
|
1428
|
+
if (current === void 0) continue;
|
|
1429
|
+
if (jsonValueEquals(first.value, current.value)) {
|
|
1430
|
+
continue;
|
|
1431
|
+
}
|
|
1432
|
+
addContradiction(
|
|
1433
|
+
ctx,
|
|
1434
|
+
`Field "${fieldName}": conflicting @const constraints require both ${JSON.stringify(first.value)} and ${JSON.stringify(current.value)}`,
|
|
1435
|
+
first.provenance,
|
|
1436
|
+
current.provenance
|
|
1437
|
+
);
|
|
1438
|
+
}
|
|
1439
|
+
}
|
|
1319
1440
|
function typeLabel(type) {
|
|
1320
1441
|
switch (type.kind) {
|
|
1321
1442
|
case "primitive":
|
|
@@ -1388,6 +1509,8 @@ function checkConstraintOnType(ctx, fieldName, type, constraint) {
|
|
|
1388
1509
|
const isString = effectiveType.kind === "primitive" && effectiveType.primitiveKind === "string";
|
|
1389
1510
|
const isArray = effectiveType.kind === "array";
|
|
1390
1511
|
const isEnum = effectiveType.kind === "enum";
|
|
1512
|
+
const arrayItemType = effectiveType.kind === "array" ? dereferenceType(ctx, effectiveType.items) : void 0;
|
|
1513
|
+
const isStringArray = arrayItemType?.kind === "primitive" && arrayItemType.primitiveKind === "string";
|
|
1391
1514
|
const label = typeLabel(effectiveType);
|
|
1392
1515
|
const ck = constraint.constraintKind;
|
|
1393
1516
|
switch (ck) {
|
|
@@ -1408,10 +1531,10 @@ function checkConstraintOnType(ctx, fieldName, type, constraint) {
|
|
|
1408
1531
|
case "minLength":
|
|
1409
1532
|
case "maxLength":
|
|
1410
1533
|
case "pattern": {
|
|
1411
|
-
if (!isString) {
|
|
1534
|
+
if (!isString && !isStringArray) {
|
|
1412
1535
|
addTypeMismatch(
|
|
1413
1536
|
ctx,
|
|
1414
|
-
`Field "${fieldName}": constraint "${ck}" is only valid on string fields, but field type is "${label}"`,
|
|
1537
|
+
`Field "${fieldName}": constraint "${ck}" is only valid on string fields or string array items, but field type is "${label}"`,
|
|
1415
1538
|
constraint.provenance
|
|
1416
1539
|
);
|
|
1417
1540
|
}
|
|
@@ -1439,6 +1562,37 @@ function checkConstraintOnType(ctx, fieldName, type, constraint) {
|
|
|
1439
1562
|
}
|
|
1440
1563
|
break;
|
|
1441
1564
|
}
|
|
1565
|
+
case "const": {
|
|
1566
|
+
const isPrimitiveConstType = effectiveType.kind === "primitive" && ["string", "number", "boolean", "null"].includes(effectiveType.primitiveKind) || effectiveType.kind === "enum";
|
|
1567
|
+
if (!isPrimitiveConstType) {
|
|
1568
|
+
addTypeMismatch(
|
|
1569
|
+
ctx,
|
|
1570
|
+
`Field "${fieldName}": constraint "const" is only valid on primitive or enum fields, but field type is "${label}"`,
|
|
1571
|
+
constraint.provenance
|
|
1572
|
+
);
|
|
1573
|
+
break;
|
|
1574
|
+
}
|
|
1575
|
+
if (effectiveType.kind === "primitive") {
|
|
1576
|
+
const valueType = constraint.value === null ? "null" : Array.isArray(constraint.value) ? "array" : typeof constraint.value;
|
|
1577
|
+
if (valueType !== effectiveType.primitiveKind) {
|
|
1578
|
+
addTypeMismatch(
|
|
1579
|
+
ctx,
|
|
1580
|
+
`Field "${fieldName}": @const value type "${valueType}" is incompatible with field type "${effectiveType.primitiveKind}"`,
|
|
1581
|
+
constraint.provenance
|
|
1582
|
+
);
|
|
1583
|
+
}
|
|
1584
|
+
break;
|
|
1585
|
+
}
|
|
1586
|
+
const memberValues = effectiveType.members.map((member) => member.value);
|
|
1587
|
+
if (!memberValues.some((member) => jsonValueEquals(member, constraint.value))) {
|
|
1588
|
+
addTypeMismatch(
|
|
1589
|
+
ctx,
|
|
1590
|
+
`Field "${fieldName}": @const value ${JSON.stringify(constraint.value)} is not one of the enum members`,
|
|
1591
|
+
constraint.provenance
|
|
1592
|
+
);
|
|
1593
|
+
}
|
|
1594
|
+
break;
|
|
1595
|
+
}
|
|
1442
1596
|
case "custom": {
|
|
1443
1597
|
checkCustomConstraint(ctx, fieldName, effectiveType, constraint);
|
|
1444
1598
|
break;
|
|
@@ -1457,9 +1611,9 @@ function checkTypeApplicability(ctx, fieldName, type, constraints) {
|
|
|
1457
1611
|
const resolution = resolvePathTargetType(ctx, type, constraint.path.segments);
|
|
1458
1612
|
const targetFieldName = formatPathTargetFieldName(fieldName, constraint.path.segments);
|
|
1459
1613
|
if (resolution.kind === "missing-property") {
|
|
1460
|
-
|
|
1614
|
+
addUnknownPathTarget(
|
|
1461
1615
|
ctx,
|
|
1462
|
-
`Field "${
|
|
1616
|
+
`Field "${targetFieldName}": path-targeted constraint "${constraint.constraintKind}" references unknown path segment "${resolution.segment}"`,
|
|
1463
1617
|
constraint.provenance
|
|
1464
1618
|
);
|
|
1465
1619
|
continue;
|
|
@@ -1519,6 +1673,7 @@ function validateConstraints(ctx, name, type, constraints) {
|
|
|
1519
1673
|
checkNumericContradictions(ctx, name, constraints);
|
|
1520
1674
|
checkLengthContradictions(ctx, name, constraints);
|
|
1521
1675
|
checkAllowedMembersContradiction(ctx, name, constraints);
|
|
1676
|
+
checkConstContradictions(ctx, name, constraints);
|
|
1522
1677
|
checkConstraintBroadening(ctx, name, constraints);
|
|
1523
1678
|
checkTypeApplicability(ctx, name, type, constraints);
|
|
1524
1679
|
}
|