@ng-forge/dynamic-form-mcp 0.7.0 → 0.8.0-next.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -0
- package/bin/ng-forge-mcp.js +1503 -594
- package/package.json +6 -6
- package/src/index.js +1503 -594
- package/src/registry/examples.json +326 -83
- package/src/registry/field-types.d.ts.map +1 -1
- package/src/registry/index.d.ts +40 -0
- package/src/registry/index.d.ts.map +1 -1
- package/src/registry/instructions.d.ts +1 -1
- package/src/registry/instructions.d.ts.map +1 -1
- package/src/registry/ui-adapters.d.ts.map +1 -1
- package/src/registry/wrappers.d.ts +26 -0
- package/src/registry/wrappers.d.ts.map +1 -0
- package/src/resources/index.d.ts.map +1 -1
- package/src/resources/wrappers.resource.d.ts +9 -0
- package/src/resources/wrappers.resource.d.ts.map +1 -0
- package/src/tools/data/lookup-topics.d.ts.map +1 -1
- package/src/tools/examples.tool.d.ts +1 -1
- package/src/tools/examples.tool.d.ts.map +1 -1
- package/src/tools/lookup.tool.d.ts.map +1 -1
- package/src/tools/search.tool.d.ts.map +1 -1
package/bin/ng-forge-mcp.js
CHANGED
|
@@ -20,12 +20,6 @@ var FIELD_TYPES = [
|
|
|
20
20
|
description: "HTML input type",
|
|
21
21
|
required: false,
|
|
22
22
|
default: "text"
|
|
23
|
-
},
|
|
24
|
-
placeholder: {
|
|
25
|
-
name: "placeholder",
|
|
26
|
-
type: "DynamicText",
|
|
27
|
-
description: "Placeholder text displayed when field is empty",
|
|
28
|
-
required: false
|
|
29
23
|
}
|
|
30
24
|
},
|
|
31
25
|
validationSupported: true,
|
|
@@ -37,7 +31,8 @@ var FIELD_TYPES = [
|
|
|
37
31
|
label: 'Email Address',
|
|
38
32
|
required: true,
|
|
39
33
|
email: true,
|
|
40
|
-
|
|
34
|
+
placeholder: 'user@example.com',
|
|
35
|
+
props: { type: 'email' }
|
|
41
36
|
}`,
|
|
42
37
|
minimalExample: `{ key: 'name', type: 'input', label: 'Name' }`
|
|
43
38
|
},
|
|
@@ -54,12 +49,6 @@ var FIELD_TYPES = [
|
|
|
54
49
|
description: "Number of visible text lines",
|
|
55
50
|
required: false,
|
|
56
51
|
default: 3
|
|
57
|
-
},
|
|
58
|
-
placeholder: {
|
|
59
|
-
name: "placeholder",
|
|
60
|
-
type: "DynamicText",
|
|
61
|
-
description: "Placeholder text displayed when field is empty",
|
|
62
|
-
required: false
|
|
63
52
|
}
|
|
64
53
|
},
|
|
65
54
|
validationSupported: true,
|
|
@@ -69,7 +58,8 @@ var FIELD_TYPES = [
|
|
|
69
58
|
key: 'description',
|
|
70
59
|
type: 'textarea',
|
|
71
60
|
label: 'Description',
|
|
72
|
-
|
|
61
|
+
placeholder: 'Enter description...',
|
|
62
|
+
props: { rows: 5 }
|
|
73
63
|
}`,
|
|
74
64
|
minimalExample: `{ key: 'bio', type: 'textarea', label: 'Bio' }`
|
|
75
65
|
},
|
|
@@ -92,12 +82,6 @@ var FIELD_TYPES = [
|
|
|
92
82
|
description: "Allow multiple selections",
|
|
93
83
|
required: false,
|
|
94
84
|
default: false
|
|
95
|
-
},
|
|
96
|
-
placeholder: {
|
|
97
|
-
name: "placeholder",
|
|
98
|
-
type: "DynamicText",
|
|
99
|
-
description: "Placeholder text for empty selection",
|
|
100
|
-
required: false
|
|
101
85
|
}
|
|
102
86
|
},
|
|
103
87
|
validationSupported: true,
|
|
@@ -961,6 +945,20 @@ var UI_ADAPTERS = [
|
|
|
961
945
|
required: false,
|
|
962
946
|
default: "dynamic"
|
|
963
947
|
},
|
|
948
|
+
floatLabel: {
|
|
949
|
+
name: "floatLabel",
|
|
950
|
+
type: "'auto' | 'always' | 'never'",
|
|
951
|
+
description: "Label float behavior",
|
|
952
|
+
required: false,
|
|
953
|
+
default: "auto"
|
|
954
|
+
},
|
|
955
|
+
hideRequiredMarker: {
|
|
956
|
+
name: "hideRequiredMarker",
|
|
957
|
+
type: "boolean",
|
|
958
|
+
description: "Hide the required asterisk",
|
|
959
|
+
required: false,
|
|
960
|
+
default: false
|
|
961
|
+
},
|
|
964
962
|
hint: {
|
|
965
963
|
name: "hint",
|
|
966
964
|
type: "DynamicText",
|
|
@@ -979,6 +977,26 @@ var UI_ADAPTERS = [
|
|
|
979
977
|
description: "Material form field appearance",
|
|
980
978
|
required: false,
|
|
981
979
|
default: "outline"
|
|
980
|
+
},
|
|
981
|
+
floatLabel: {
|
|
982
|
+
name: "floatLabel",
|
|
983
|
+
type: "'auto' | 'always' | 'never'",
|
|
984
|
+
description: "Label float behavior",
|
|
985
|
+
required: false,
|
|
986
|
+
default: "auto"
|
|
987
|
+
},
|
|
988
|
+
hideRequiredMarker: {
|
|
989
|
+
name: "hideRequiredMarker",
|
|
990
|
+
type: "boolean",
|
|
991
|
+
description: "Hide the required asterisk",
|
|
992
|
+
required: false,
|
|
993
|
+
default: false
|
|
994
|
+
},
|
|
995
|
+
hint: {
|
|
996
|
+
name: "hint",
|
|
997
|
+
type: "DynamicText",
|
|
998
|
+
description: "Hint text below the field",
|
|
999
|
+
required: false
|
|
982
1000
|
}
|
|
983
1001
|
}
|
|
984
1002
|
},
|
|
@@ -999,12 +1017,118 @@ var UI_ADAPTERS = [
|
|
|
999
1017
|
type: "datepicker",
|
|
1000
1018
|
componentName: "MatDatepickerFieldComponent",
|
|
1001
1019
|
additionalProps: {
|
|
1020
|
+
appearance: {
|
|
1021
|
+
name: "appearance",
|
|
1022
|
+
type: "'fill' | 'outline'",
|
|
1023
|
+
description: "Material form field appearance",
|
|
1024
|
+
required: false,
|
|
1025
|
+
default: "outline"
|
|
1026
|
+
},
|
|
1027
|
+
subscriptSizing: {
|
|
1028
|
+
name: "subscriptSizing",
|
|
1029
|
+
type: "'fixed' | 'dynamic'",
|
|
1030
|
+
description: "Error/hint text sizing",
|
|
1031
|
+
required: false,
|
|
1032
|
+
default: "dynamic"
|
|
1033
|
+
},
|
|
1034
|
+
floatLabel: {
|
|
1035
|
+
name: "floatLabel",
|
|
1036
|
+
type: "'auto' | 'always' | 'never'",
|
|
1037
|
+
description: "Label float behavior",
|
|
1038
|
+
required: false,
|
|
1039
|
+
default: "auto"
|
|
1040
|
+
},
|
|
1041
|
+
hideRequiredMarker: {
|
|
1042
|
+
name: "hideRequiredMarker",
|
|
1043
|
+
type: "boolean",
|
|
1044
|
+
description: "Hide the required asterisk",
|
|
1045
|
+
required: false,
|
|
1046
|
+
default: false
|
|
1047
|
+
},
|
|
1002
1048
|
startView: {
|
|
1003
1049
|
name: "startView",
|
|
1004
1050
|
type: "'month' | 'year' | 'multi-year'",
|
|
1005
1051
|
description: "Initial calendar view",
|
|
1006
1052
|
required: false,
|
|
1007
1053
|
default: "month"
|
|
1054
|
+
},
|
|
1055
|
+
touchUi: {
|
|
1056
|
+
name: "touchUi",
|
|
1057
|
+
type: "boolean",
|
|
1058
|
+
description: "Use touch-friendly calendar UI",
|
|
1059
|
+
required: false,
|
|
1060
|
+
default: false
|
|
1061
|
+
},
|
|
1062
|
+
hint: {
|
|
1063
|
+
name: "hint",
|
|
1064
|
+
type: "DynamicText",
|
|
1065
|
+
description: "Hint text below the field",
|
|
1066
|
+
required: false
|
|
1067
|
+
}
|
|
1068
|
+
}
|
|
1069
|
+
},
|
|
1070
|
+
{
|
|
1071
|
+
type: "textarea",
|
|
1072
|
+
componentName: "MatTextareaFieldComponent",
|
|
1073
|
+
additionalProps: {
|
|
1074
|
+
appearance: {
|
|
1075
|
+
name: "appearance",
|
|
1076
|
+
type: "'fill' | 'outline'",
|
|
1077
|
+
description: "Material form field appearance",
|
|
1078
|
+
required: false,
|
|
1079
|
+
default: "outline"
|
|
1080
|
+
},
|
|
1081
|
+
subscriptSizing: {
|
|
1082
|
+
name: "subscriptSizing",
|
|
1083
|
+
type: "'fixed' | 'dynamic'",
|
|
1084
|
+
description: "Error/hint text sizing",
|
|
1085
|
+
required: false,
|
|
1086
|
+
default: "dynamic"
|
|
1087
|
+
},
|
|
1088
|
+
floatLabel: {
|
|
1089
|
+
name: "floatLabel",
|
|
1090
|
+
type: "'auto' | 'always' | 'never'",
|
|
1091
|
+
description: "Label float behavior",
|
|
1092
|
+
required: false,
|
|
1093
|
+
default: "auto"
|
|
1094
|
+
},
|
|
1095
|
+
hideRequiredMarker: {
|
|
1096
|
+
name: "hideRequiredMarker",
|
|
1097
|
+
type: "boolean",
|
|
1098
|
+
description: "Hide the required asterisk",
|
|
1099
|
+
required: false,
|
|
1100
|
+
default: false
|
|
1101
|
+
},
|
|
1102
|
+
hint: {
|
|
1103
|
+
name: "hint",
|
|
1104
|
+
type: "DynamicText",
|
|
1105
|
+
description: "Hint text below the field",
|
|
1106
|
+
required: false
|
|
1107
|
+
},
|
|
1108
|
+
rows: {
|
|
1109
|
+
name: "rows",
|
|
1110
|
+
type: "number",
|
|
1111
|
+
description: "Visible row count",
|
|
1112
|
+
required: false
|
|
1113
|
+
},
|
|
1114
|
+
cols: {
|
|
1115
|
+
name: "cols",
|
|
1116
|
+
type: "number",
|
|
1117
|
+
description: "Visible column count",
|
|
1118
|
+
required: false
|
|
1119
|
+
},
|
|
1120
|
+
resize: {
|
|
1121
|
+
name: "resize",
|
|
1122
|
+
type: "'none' | 'both' | 'horizontal' | 'vertical'",
|
|
1123
|
+
description: "Resize handle behavior",
|
|
1124
|
+
required: false,
|
|
1125
|
+
default: "vertical"
|
|
1126
|
+
},
|
|
1127
|
+
maxLength: {
|
|
1128
|
+
name: "maxLength",
|
|
1129
|
+
type: "number",
|
|
1130
|
+
description: "Maximum character length",
|
|
1131
|
+
required: false
|
|
1008
1132
|
}
|
|
1009
1133
|
}
|
|
1010
1134
|
}
|
|
@@ -1279,6 +1403,160 @@ var DOCUMENTATION = [
|
|
|
1279
1403
|
{ id: "example-array", title: "Complete Array Form", category: "examples", url: `${BASE_URL}/examples/array-form` }
|
|
1280
1404
|
];
|
|
1281
1405
|
|
|
1406
|
+
// packages/dynamic-form-mcp/src/registry/wrappers.ts
|
|
1407
|
+
var WRAPPER_AUTHORING_CONTRACT = `All wrapper components MUST:
|
|
1408
|
+
|
|
1409
|
+
1. Implement \`FieldWrapperContract\` from \`@ng-forge/dynamic-forms\`.
|
|
1410
|
+
2. Expose \`readonly fieldComponent = viewChild.required('fieldComponent', { read: ViewContainerRef });\`
|
|
1411
|
+
\u2014 this is the slot where the inner wrapper (or the field) is rendered
|
|
1412
|
+
imperatively by the outlet.
|
|
1413
|
+
3. Place the \`#fieldComponent\` template ref UNCONDITIONALLY. It cannot
|
|
1414
|
+
live inside \`@if\`, \`@defer\`, \`@for\`, \`@switch\`, \`<ng-template>\`,
|
|
1415
|
+
or any structural directive that delays view creation. The outlet reads
|
|
1416
|
+
the \`ViewContainerRef\` immediately after creation \u2014 if the slot isn't
|
|
1417
|
+
materialised yet, \`viewChild.required\` throws \`NG0951\`
|
|
1418
|
+
(REQUIRED_QUERY_NO_VALUE), the wrapper chain is torn down, and the field
|
|
1419
|
+
renders bare.
|
|
1420
|
+
4. Declare every config key the wrapper consumes as an Angular \`input()\`.
|
|
1421
|
+
Unknown keys are silently dropped \u2014 the outlet probes
|
|
1422
|
+
\`reflectComponentType(...).inputs\` before calling \`setInput()\`.
|
|
1423
|
+
Runtime typos in config will NOT throw; rely on TypeScript (via
|
|
1424
|
+
\`FieldRegistryWrappers\` module augmentation) to catch them.
|
|
1425
|
+
5. Optionally accept \`fieldInputs: input<WrapperFieldInputs>()\` to read
|
|
1426
|
+
the wrapped field's mapper outputs and read-only form state.`;
|
|
1427
|
+
var WRAPPERS = [
|
|
1428
|
+
{
|
|
1429
|
+
type: "css",
|
|
1430
|
+
category: "core",
|
|
1431
|
+
availability: "shipping",
|
|
1432
|
+
package: "@ng-forge/dynamic-forms",
|
|
1433
|
+
description: "Invisible wrapper that applies CSS classes to the host element via a `DynamicText` input. Useful for decorating any field (or container) with styling without authoring a custom wrapper. Resolves `Signal<string>` / `Observable<string>` / `string` uniformly.",
|
|
1434
|
+
props: {
|
|
1435
|
+
cssClasses: {
|
|
1436
|
+
name: "cssClasses",
|
|
1437
|
+
type: "DynamicText",
|
|
1438
|
+
description: "Space-separated CSS class names to apply to the wrapper host element. Accepts a literal string, a Signal<string>, or an Observable<string> \u2014 the wrapper subscribes and updates the host [class] binding reactively.",
|
|
1439
|
+
required: false
|
|
1440
|
+
}
|
|
1441
|
+
},
|
|
1442
|
+
autoAppliesTo: [],
|
|
1443
|
+
componentName: "CssWrapperComponent",
|
|
1444
|
+
contract: WRAPPER_AUTHORING_CONTRACT,
|
|
1445
|
+
example: `// Field-level CSS wrapper (scoped to a single field)
|
|
1446
|
+
{
|
|
1447
|
+
key: 'email',
|
|
1448
|
+
type: 'input',
|
|
1449
|
+
label: 'Email',
|
|
1450
|
+
wrappers: [{ type: 'css', cssClasses: 'field--highlight' }]
|
|
1451
|
+
}
|
|
1452
|
+
|
|
1453
|
+
// Dynamic classes via Signal<string>
|
|
1454
|
+
{
|
|
1455
|
+
key: 'amount',
|
|
1456
|
+
type: 'input',
|
|
1457
|
+
label: 'Amount',
|
|
1458
|
+
wrappers: [{ type: 'css', cssClasses: highlightClass }] // highlightClass: Signal<string>
|
|
1459
|
+
}
|
|
1460
|
+
|
|
1461
|
+
// Chained with other wrappers (outer-most first)
|
|
1462
|
+
{
|
|
1463
|
+
key: 'contact',
|
|
1464
|
+
type: 'group',
|
|
1465
|
+
wrappers: [
|
|
1466
|
+
{ type: 'section', title: 'Contact' }, // outer
|
|
1467
|
+
{ type: 'css', cssClasses: 'pad-lg' } // inner
|
|
1468
|
+
],
|
|
1469
|
+
fields: [...]
|
|
1470
|
+
}`,
|
|
1471
|
+
minimalExample: `{ type: 'css', cssClasses: 'my-class' }`
|
|
1472
|
+
},
|
|
1473
|
+
{
|
|
1474
|
+
type: "arraySection",
|
|
1475
|
+
category: "demo",
|
|
1476
|
+
availability: "demo-only",
|
|
1477
|
+
package: "@internal/examples-shared-ui",
|
|
1478
|
+
description: 'Demo wrapper used by the docs sandbox. Wraps an array field in a titled card whose header contains an "Add" button \u2014 the wrapper owns the append behaviour, dispatching `arrayEvent(key).append(itemTemplate)` on click via the `EventBus`. Lets the consumer config drop the separate `addArrayItem` button field. NOT a shipping primitive; copy the component out of `internal/examples-shared-ui/src/lib/demo-wrappers/` or author your own if you want this pattern in production.',
|
|
1479
|
+
props: {
|
|
1480
|
+
title: {
|
|
1481
|
+
name: "title",
|
|
1482
|
+
type: "string",
|
|
1483
|
+
description: "Card header text rendered above the array.",
|
|
1484
|
+
required: false
|
|
1485
|
+
},
|
|
1486
|
+
addLabel: {
|
|
1487
|
+
name: "addLabel",
|
|
1488
|
+
type: "string",
|
|
1489
|
+
description: 'Text for the Add button in the header. Defaults to "Add" when omitted.',
|
|
1490
|
+
required: false
|
|
1491
|
+
},
|
|
1492
|
+
itemTemplate: {
|
|
1493
|
+
name: "itemTemplate",
|
|
1494
|
+
type: "FieldDef<unknown> | readonly FieldDef<unknown>[]",
|
|
1495
|
+
description: "Template passed to `arrayEvent(key).append(template)` when the Add button is clicked. Should match the array's `fields` shape.",
|
|
1496
|
+
required: true
|
|
1497
|
+
}
|
|
1498
|
+
},
|
|
1499
|
+
autoAppliesTo: [],
|
|
1500
|
+
componentName: "ArraySectionWrapperComponent",
|
|
1501
|
+
contract: WRAPPER_AUTHORING_CONTRACT,
|
|
1502
|
+
example: `// Array wrapped with arraySection \u2014 the wrapper owns the Add button
|
|
1503
|
+
import { arrayEvent } from '@ng-forge/dynamic-forms';
|
|
1504
|
+
|
|
1505
|
+
const tagItemTemplate = { key: 'tag', type: 'input', label: 'Tag' } as const satisfies FieldDef;
|
|
1506
|
+
|
|
1507
|
+
{
|
|
1508
|
+
key: 'tags',
|
|
1509
|
+
type: 'array',
|
|
1510
|
+
wrappers: [{
|
|
1511
|
+
type: 'arraySection',
|
|
1512
|
+
title: 'Tags',
|
|
1513
|
+
addLabel: 'Add tag',
|
|
1514
|
+
itemTemplate: tagItemTemplate,
|
|
1515
|
+
}],
|
|
1516
|
+
fields: [tagItemTemplate],
|
|
1517
|
+
}
|
|
1518
|
+
// Clicking the header button dispatches arrayEvent('tags').append(tagItemTemplate)`,
|
|
1519
|
+
minimalExample: `{ type: 'arraySection', title: 'Items', itemTemplate: { key: 'item', type: 'input', label: 'Item' } }`
|
|
1520
|
+
},
|
|
1521
|
+
{
|
|
1522
|
+
type: "section",
|
|
1523
|
+
category: "demo",
|
|
1524
|
+
availability: "demo-only",
|
|
1525
|
+
package: "@internal/examples-shared-ui",
|
|
1526
|
+
description: "Demo wrapper used by the docs sandbox. Renders a titled card around the wrapped content and is registered with every sandbox adapter so the Writing-a-Wrapper docs can demonstrate an end-to-end custom wrapper. NOT a shipping primitive \u2014 use as a pattern/template, not a dependency.",
|
|
1527
|
+
props: {
|
|
1528
|
+
title: {
|
|
1529
|
+
name: "title",
|
|
1530
|
+
type: "string",
|
|
1531
|
+
description: "Card header text. Omit to render a header-less card.",
|
|
1532
|
+
required: false
|
|
1533
|
+
}
|
|
1534
|
+
},
|
|
1535
|
+
autoAppliesTo: [],
|
|
1536
|
+
componentName: "SectionWrapperComponent",
|
|
1537
|
+
contract: WRAPPER_AUTHORING_CONTRACT,
|
|
1538
|
+
example: `// Section wrapper around a group
|
|
1539
|
+
{
|
|
1540
|
+
key: 'address',
|
|
1541
|
+
type: 'group',
|
|
1542
|
+
wrappers: [{ type: 'section', title: 'Shipping address' }],
|
|
1543
|
+
fields: [
|
|
1544
|
+
{ key: 'street', type: 'input', label: 'Street' },
|
|
1545
|
+
{ key: 'city', type: 'input', label: 'City' }
|
|
1546
|
+
]
|
|
1547
|
+
}
|
|
1548
|
+
|
|
1549
|
+
// Header-less card (title omitted)
|
|
1550
|
+
{
|
|
1551
|
+
key: 'details',
|
|
1552
|
+
type: 'group',
|
|
1553
|
+
wrappers: [{ type: 'section' }],
|
|
1554
|
+
fields: [...]
|
|
1555
|
+
}`,
|
|
1556
|
+
minimalExample: `{ type: 'section', title: 'Section title' }`
|
|
1557
|
+
}
|
|
1558
|
+
];
|
|
1559
|
+
|
|
1282
1560
|
// packages/dynamic-form-mcp/src/registry/index.ts
|
|
1283
1561
|
function getFieldTypes() {
|
|
1284
1562
|
return FIELD_TYPES;
|
|
@@ -1304,6 +1582,15 @@ function getUIAdapters() {
|
|
|
1304
1582
|
function getUIAdapter(library) {
|
|
1305
1583
|
return UI_ADAPTERS.find((a) => a.library === library);
|
|
1306
1584
|
}
|
|
1585
|
+
function getWrappers() {
|
|
1586
|
+
return WRAPPERS;
|
|
1587
|
+
}
|
|
1588
|
+
function getWrapper(type) {
|
|
1589
|
+
return WRAPPERS.find((w) => w.type === type);
|
|
1590
|
+
}
|
|
1591
|
+
function getWrappersByCategory(category) {
|
|
1592
|
+
return WRAPPERS.filter((w) => w.category === category);
|
|
1593
|
+
}
|
|
1307
1594
|
function getDocPages() {
|
|
1308
1595
|
return DOCUMENTATION;
|
|
1309
1596
|
}
|
|
@@ -1874,13 +2161,13 @@ For fields that collect user input (\`input\`, \`textarea\`, \`select\`, \`check
|
|
|
1874
2161
|
label: 'Email Address',
|
|
1875
2162
|
required: true, // Shorthand validator
|
|
1876
2163
|
email: true, // Shorthand validator
|
|
2164
|
+
placeholder: 'user@example.com', // Field-level, not inside props
|
|
1877
2165
|
validationMessages: { // Always provide clear messages
|
|
1878
2166
|
required: 'Email is required',
|
|
1879
2167
|
email: 'Please enter a valid email'
|
|
1880
2168
|
},
|
|
1881
2169
|
props: {
|
|
1882
2170
|
type: 'email', // HTML input type
|
|
1883
|
-
placeholder: 'user@example.com',
|
|
1884
2171
|
hint: 'We will never share your email' // UI library specific
|
|
1885
2172
|
}
|
|
1886
2173
|
}
|
|
@@ -1896,11 +2183,11 @@ MUST include \`options\` array:
|
|
|
1896
2183
|
type: 'select',
|
|
1897
2184
|
label: 'Country',
|
|
1898
2185
|
required: true,
|
|
2186
|
+
placeholder: 'Select a country',
|
|
1899
2187
|
options: [
|
|
1900
2188
|
{ value: 'us', label: 'United States' },
|
|
1901
2189
|
{ value: 'uk', label: 'United Kingdom' }
|
|
1902
|
-
]
|
|
1903
|
-
props: { placeholder: 'Select a country' }
|
|
2190
|
+
]
|
|
1904
2191
|
}
|
|
1905
2192
|
\`\`\`
|
|
1906
2193
|
|
|
@@ -2014,6 +2301,27 @@ Use shorthand properties directly on field definitions:
|
|
|
2014
2301
|
|
|
2015
2302
|
Available shorthands: \`required\`, \`email\`, \`min\`, \`max\`, \`minLength\`, \`maxLength\`, \`pattern\`
|
|
2016
2303
|
|
|
2304
|
+
### Nullable Values
|
|
2305
|
+
|
|
2306
|
+
Value fields accept a \`nullable?: boolean\` flag. When \`true\`:
|
|
2307
|
+
|
|
2308
|
+
- \`value\` accepts \`null\` in addition to the field's normal value type.
|
|
2309
|
+
- An omitted \`value\` resolves to \`null\` (instead of the type-specific empty default like \`''\`, \`NaN\`, or \`[]\`).
|
|
2310
|
+
- Orthogonal to \`required\`. \`nullable\` declares that the **model** accepts \`null\`; \`required\` is a **validation** constraint. Angular's \`Validators.required\` treats \`null\` as invalid, so a field that is both \`nullable\` and \`required\` will fail required-validation when the value is \`null\` \u2014 the two flags describe different layers (data shape vs. validation), not conflicting semantics.
|
|
2311
|
+
- Map OpenAPI \`nullable: true\` (3.0) or \`type: [T, null]\` (3.1) to this flag.
|
|
2312
|
+
|
|
2313
|
+
\`\`\`typescript
|
|
2314
|
+
{
|
|
2315
|
+
key: 'middleName',
|
|
2316
|
+
type: 'input',
|
|
2317
|
+
label: 'Middle Name',
|
|
2318
|
+
nullable: true,
|
|
2319
|
+
value: null, // valid; default-resolves to null
|
|
2320
|
+
}
|
|
2321
|
+
\`\`\`
|
|
2322
|
+
|
|
2323
|
+
Read-side caveat: a user clearing a text input reads back as \`""\`, not \`null\` \u2014 this is a DOM/Web IDL contract, identical to classic Reactive Forms. \`nullable\` is a contract for accepted values, not a guarantee of emitted ones.
|
|
2324
|
+
|
|
2017
2325
|
### Validation Messages
|
|
2018
2326
|
|
|
2019
2327
|
ALWAYS provide validation messages. Use template variables:
|
|
@@ -2228,7 +2536,8 @@ Different UI libraries support different properties. Always validate against the
|
|
|
2228
2536
|
|----------|----------|-----------|---------|-------|
|
|
2229
2537
|
| \`appearance\` | \u2713 (fill, outline) | \u2717 | \u2717 | \u2713 (fill, outline) |
|
|
2230
2538
|
| \`subscriptSizing\` | \u2713 | \u2717 | \u2717 | \u2717 |
|
|
2231
|
-
| \`floatLabel\` | \u2713 | \u2717 | \
|
|
2539
|
+
| \`floatLabel\` | \u2713 (auto, always, never) | \u2717 | \u2717 | \u2717 |
|
|
2540
|
+
| \`hideRequiredMarker\` | \u2713 | \u2717 | \u2717 | \u2717 |
|
|
2232
2541
|
| \`hint\` | \u2713 | \u2713 (as \`helpText\`) | \u2713 | \u2713 |
|
|
2233
2542
|
|
|
2234
2543
|
### Container Fields
|
|
@@ -2315,7 +2624,9 @@ var examples_default = [
|
|
|
2315
2624
|
key: "title",
|
|
2316
2625
|
type: "text",
|
|
2317
2626
|
label: "Sign In",
|
|
2318
|
-
props: {
|
|
2627
|
+
props: {
|
|
2628
|
+
elementType: "h2"
|
|
2629
|
+
}
|
|
2319
2630
|
},
|
|
2320
2631
|
{
|
|
2321
2632
|
key: "email",
|
|
@@ -2323,8 +2634,13 @@ var examples_default = [
|
|
|
2323
2634
|
label: "Email Address",
|
|
2324
2635
|
required: true,
|
|
2325
2636
|
email: true,
|
|
2326
|
-
validationMessages: {
|
|
2327
|
-
|
|
2637
|
+
validationMessages: {
|
|
2638
|
+
email: "Please enter a valid email address"
|
|
2639
|
+
},
|
|
2640
|
+
props: {
|
|
2641
|
+
type: "email"
|
|
2642
|
+
},
|
|
2643
|
+
placeholder: "your@email.com"
|
|
2328
2644
|
},
|
|
2329
2645
|
{
|
|
2330
2646
|
key: "password",
|
|
@@ -2332,7 +2648,10 @@ var examples_default = [
|
|
|
2332
2648
|
label: "Password",
|
|
2333
2649
|
required: true,
|
|
2334
2650
|
minLength: 8,
|
|
2335
|
-
props: {
|
|
2651
|
+
props: {
|
|
2652
|
+
type: "password"
|
|
2653
|
+
},
|
|
2654
|
+
placeholder: "Enter your password"
|
|
2336
2655
|
},
|
|
2337
2656
|
{
|
|
2338
2657
|
key: "remember",
|
|
@@ -2343,7 +2662,9 @@ var examples_default = [
|
|
|
2343
2662
|
key: "submit",
|
|
2344
2663
|
type: "submit",
|
|
2345
2664
|
label: "Sign In",
|
|
2346
|
-
props: {
|
|
2665
|
+
props: {
|
|
2666
|
+
color: "primary"
|
|
2667
|
+
}
|
|
2347
2668
|
}
|
|
2348
2669
|
]
|
|
2349
2670
|
}
|
|
@@ -2365,7 +2686,7 @@ var examples_default = [
|
|
|
2365
2686
|
required: "First name is required",
|
|
2366
2687
|
minLength: "Must be at least {{requiredLength}} characters"
|
|
2367
2688
|
},
|
|
2368
|
-
|
|
2689
|
+
placeholder: "Enter your first name"
|
|
2369
2690
|
},
|
|
2370
2691
|
{
|
|
2371
2692
|
key: "lastName",
|
|
@@ -2377,7 +2698,7 @@ var examples_default = [
|
|
|
2377
2698
|
required: "Last name is required",
|
|
2378
2699
|
minLength: "Must be at least {{requiredLength}} characters"
|
|
2379
2700
|
},
|
|
2380
|
-
|
|
2701
|
+
placeholder: "Enter your last name"
|
|
2381
2702
|
},
|
|
2382
2703
|
{
|
|
2383
2704
|
key: "email",
|
|
@@ -2389,7 +2710,10 @@ var examples_default = [
|
|
|
2389
2710
|
required: "Email is required",
|
|
2390
2711
|
email: "Please enter a valid email address"
|
|
2391
2712
|
},
|
|
2392
|
-
props: {
|
|
2713
|
+
props: {
|
|
2714
|
+
type: "email"
|
|
2715
|
+
},
|
|
2716
|
+
placeholder: "user@example.com"
|
|
2393
2717
|
},
|
|
2394
2718
|
{
|
|
2395
2719
|
key: "age",
|
|
@@ -2403,22 +2727,42 @@ var examples_default = [
|
|
|
2403
2727
|
min: "Must be at least {{min}}",
|
|
2404
2728
|
max: "Must not exceed {{max}}"
|
|
2405
2729
|
},
|
|
2406
|
-
props: {
|
|
2730
|
+
props: {
|
|
2731
|
+
type: "number"
|
|
2732
|
+
},
|
|
2733
|
+
placeholder: "18"
|
|
2407
2734
|
},
|
|
2408
2735
|
{
|
|
2409
2736
|
key: "country",
|
|
2410
2737
|
type: "select",
|
|
2411
2738
|
label: "Country",
|
|
2412
2739
|
required: true,
|
|
2413
|
-
validationMessages: {
|
|
2740
|
+
validationMessages: {
|
|
2741
|
+
required: "Please select a country"
|
|
2742
|
+
},
|
|
2414
2743
|
options: [
|
|
2415
|
-
{
|
|
2416
|
-
|
|
2417
|
-
|
|
2418
|
-
|
|
2419
|
-
{
|
|
2744
|
+
{
|
|
2745
|
+
value: "us",
|
|
2746
|
+
label: "United States"
|
|
2747
|
+
},
|
|
2748
|
+
{
|
|
2749
|
+
value: "uk",
|
|
2750
|
+
label: "United Kingdom"
|
|
2751
|
+
},
|
|
2752
|
+
{
|
|
2753
|
+
value: "ca",
|
|
2754
|
+
label: "Canada"
|
|
2755
|
+
},
|
|
2756
|
+
{
|
|
2757
|
+
value: "au",
|
|
2758
|
+
label: "Australia"
|
|
2759
|
+
},
|
|
2760
|
+
{
|
|
2761
|
+
value: "de",
|
|
2762
|
+
label: "Germany"
|
|
2763
|
+
}
|
|
2420
2764
|
],
|
|
2421
|
-
|
|
2765
|
+
placeholder: "Select your country"
|
|
2422
2766
|
},
|
|
2423
2767
|
{
|
|
2424
2768
|
key: "newsletter",
|
|
@@ -2430,13 +2774,17 @@ var examples_default = [
|
|
|
2430
2774
|
type: "checkbox",
|
|
2431
2775
|
label: "I agree to the terms and conditions",
|
|
2432
2776
|
required: true,
|
|
2433
|
-
validationMessages: {
|
|
2777
|
+
validationMessages: {
|
|
2778
|
+
required: "You must accept the terms"
|
|
2779
|
+
}
|
|
2434
2780
|
},
|
|
2435
2781
|
{
|
|
2436
2782
|
key: "submit",
|
|
2437
2783
|
type: "submit",
|
|
2438
2784
|
label: "Create Account",
|
|
2439
|
-
props: {
|
|
2785
|
+
props: {
|
|
2786
|
+
color: "primary"
|
|
2787
|
+
}
|
|
2440
2788
|
}
|
|
2441
2789
|
]
|
|
2442
2790
|
}
|
|
@@ -2461,7 +2809,7 @@ var examples_default = [
|
|
|
2461
2809
|
label: "First Name",
|
|
2462
2810
|
required: true,
|
|
2463
2811
|
col: 6,
|
|
2464
|
-
|
|
2812
|
+
placeholder: "Your first name"
|
|
2465
2813
|
},
|
|
2466
2814
|
{
|
|
2467
2815
|
key: "lastName",
|
|
@@ -2469,7 +2817,7 @@ var examples_default = [
|
|
|
2469
2817
|
label: "Last Name",
|
|
2470
2818
|
required: true,
|
|
2471
2819
|
col: 6,
|
|
2472
|
-
|
|
2820
|
+
placeholder: "Your last name"
|
|
2473
2821
|
}
|
|
2474
2822
|
]
|
|
2475
2823
|
},
|
|
@@ -2479,8 +2827,13 @@ var examples_default = [
|
|
|
2479
2827
|
label: "Email Address",
|
|
2480
2828
|
required: true,
|
|
2481
2829
|
email: true,
|
|
2482
|
-
validationMessages: {
|
|
2483
|
-
|
|
2830
|
+
validationMessages: {
|
|
2831
|
+
email: "Please enter a valid email"
|
|
2832
|
+
},
|
|
2833
|
+
props: {
|
|
2834
|
+
type: "email"
|
|
2835
|
+
},
|
|
2836
|
+
placeholder: "email@example.com"
|
|
2484
2837
|
},
|
|
2485
2838
|
{
|
|
2486
2839
|
key: "subject",
|
|
@@ -2488,12 +2841,24 @@ var examples_default = [
|
|
|
2488
2841
|
label: "Subject",
|
|
2489
2842
|
required: true,
|
|
2490
2843
|
options: [
|
|
2491
|
-
{
|
|
2492
|
-
|
|
2493
|
-
|
|
2494
|
-
|
|
2844
|
+
{
|
|
2845
|
+
value: "general",
|
|
2846
|
+
label: "General Inquiry"
|
|
2847
|
+
},
|
|
2848
|
+
{
|
|
2849
|
+
value: "support",
|
|
2850
|
+
label: "Technical Support"
|
|
2851
|
+
},
|
|
2852
|
+
{
|
|
2853
|
+
value: "billing",
|
|
2854
|
+
label: "Billing Question"
|
|
2855
|
+
},
|
|
2856
|
+
{
|
|
2857
|
+
value: "feedback",
|
|
2858
|
+
label: "Feedback"
|
|
2859
|
+
}
|
|
2495
2860
|
],
|
|
2496
|
-
|
|
2861
|
+
placeholder: "Select a subject"
|
|
2497
2862
|
},
|
|
2498
2863
|
{
|
|
2499
2864
|
key: "message",
|
|
@@ -2506,13 +2871,18 @@ var examples_default = [
|
|
|
2506
2871
|
minLength: "Message must be at least {{requiredLength}} characters",
|
|
2507
2872
|
maxLength: "Message cannot exceed {{requiredLength}} characters"
|
|
2508
2873
|
},
|
|
2509
|
-
props: {
|
|
2874
|
+
props: {
|
|
2875
|
+
rows: 5
|
|
2876
|
+
},
|
|
2877
|
+
placeholder: "How can we help you?"
|
|
2510
2878
|
},
|
|
2511
2879
|
{
|
|
2512
2880
|
key: "submit",
|
|
2513
2881
|
type: "submit",
|
|
2514
2882
|
label: "Send Message",
|
|
2515
|
-
props: {
|
|
2883
|
+
props: {
|
|
2884
|
+
color: "primary"
|
|
2885
|
+
}
|
|
2516
2886
|
}
|
|
2517
2887
|
]
|
|
2518
2888
|
}
|
|
@@ -2539,13 +2909,17 @@ var examples_default = [
|
|
|
2539
2909
|
label: "Email",
|
|
2540
2910
|
required: true,
|
|
2541
2911
|
email: true,
|
|
2542
|
-
props: {
|
|
2912
|
+
props: {
|
|
2913
|
+
type: "email"
|
|
2914
|
+
}
|
|
2543
2915
|
},
|
|
2544
2916
|
{
|
|
2545
2917
|
key: "addressTitle",
|
|
2546
2918
|
type: "text",
|
|
2547
2919
|
label: "Shipping Address",
|
|
2548
|
-
props: {
|
|
2920
|
+
props: {
|
|
2921
|
+
elementType: "h4"
|
|
2922
|
+
}
|
|
2549
2923
|
},
|
|
2550
2924
|
{
|
|
2551
2925
|
key: "address",
|
|
@@ -2561,8 +2935,20 @@ var examples_default = [
|
|
|
2561
2935
|
key: "cityStateRow",
|
|
2562
2936
|
type: "row",
|
|
2563
2937
|
fields: [
|
|
2564
|
-
{
|
|
2565
|
-
|
|
2938
|
+
{
|
|
2939
|
+
key: "city",
|
|
2940
|
+
type: "input",
|
|
2941
|
+
label: "City",
|
|
2942
|
+
required: true,
|
|
2943
|
+
col: 6
|
|
2944
|
+
},
|
|
2945
|
+
{
|
|
2946
|
+
key: "state",
|
|
2947
|
+
type: "input",
|
|
2948
|
+
label: "State",
|
|
2949
|
+
required: true,
|
|
2950
|
+
col: 3
|
|
2951
|
+
},
|
|
2566
2952
|
{
|
|
2567
2953
|
key: "zip",
|
|
2568
2954
|
type: "input",
|
|
@@ -2570,7 +2956,9 @@ var examples_default = [
|
|
|
2570
2956
|
required: true,
|
|
2571
2957
|
col: 3,
|
|
2572
2958
|
pattern: "^\\d{5}$",
|
|
2573
|
-
validationMessages: {
|
|
2959
|
+
validationMessages: {
|
|
2960
|
+
pattern: "ZIP must be 5 digits"
|
|
2961
|
+
}
|
|
2574
2962
|
}
|
|
2575
2963
|
]
|
|
2576
2964
|
},
|
|
@@ -2580,8 +2968,14 @@ var examples_default = [
|
|
|
2580
2968
|
label: "Country",
|
|
2581
2969
|
required: true,
|
|
2582
2970
|
options: [
|
|
2583
|
-
{
|
|
2584
|
-
|
|
2971
|
+
{
|
|
2972
|
+
value: "us",
|
|
2973
|
+
label: "United States"
|
|
2974
|
+
},
|
|
2975
|
+
{
|
|
2976
|
+
value: "ca",
|
|
2977
|
+
label: "Canada"
|
|
2978
|
+
}
|
|
2585
2979
|
]
|
|
2586
2980
|
}
|
|
2587
2981
|
]
|
|
@@ -2612,12 +3006,37 @@ var examples_default = [
|
|
|
2612
3006
|
key: "stepTitle1",
|
|
2613
3007
|
type: "text",
|
|
2614
3008
|
label: "Step 1: Personal Information",
|
|
2615
|
-
props: {
|
|
3009
|
+
props: {
|
|
3010
|
+
elementType: "h3"
|
|
3011
|
+
}
|
|
2616
3012
|
},
|
|
2617
|
-
{
|
|
2618
|
-
|
|
2619
|
-
|
|
2620
|
-
|
|
3013
|
+
{
|
|
3014
|
+
key: "firstName",
|
|
3015
|
+
type: "input",
|
|
3016
|
+
label: "First Name",
|
|
3017
|
+
required: true
|
|
3018
|
+
},
|
|
3019
|
+
{
|
|
3020
|
+
key: "lastName",
|
|
3021
|
+
type: "input",
|
|
3022
|
+
label: "Last Name",
|
|
3023
|
+
required: true
|
|
3024
|
+
},
|
|
3025
|
+
{
|
|
3026
|
+
key: "email",
|
|
3027
|
+
type: "input",
|
|
3028
|
+
label: "Email",
|
|
3029
|
+
required: true,
|
|
3030
|
+
email: true,
|
|
3031
|
+
props: {
|
|
3032
|
+
type: "email"
|
|
3033
|
+
}
|
|
3034
|
+
},
|
|
3035
|
+
{
|
|
3036
|
+
key: "next1",
|
|
3037
|
+
type: "next",
|
|
3038
|
+
label: "Continue"
|
|
3039
|
+
}
|
|
2621
3040
|
]
|
|
2622
3041
|
},
|
|
2623
3042
|
{
|
|
@@ -2628,17 +3047,44 @@ var examples_default = [
|
|
|
2628
3047
|
key: "stepTitle2",
|
|
2629
3048
|
type: "text",
|
|
2630
3049
|
label: "Step 2: Address",
|
|
2631
|
-
props: {
|
|
3050
|
+
props: {
|
|
3051
|
+
elementType: "h3"
|
|
3052
|
+
}
|
|
3053
|
+
},
|
|
3054
|
+
{
|
|
3055
|
+
key: "street",
|
|
3056
|
+
type: "input",
|
|
3057
|
+
label: "Street Address",
|
|
3058
|
+
required: true
|
|
3059
|
+
},
|
|
3060
|
+
{
|
|
3061
|
+
key: "city",
|
|
3062
|
+
type: "input",
|
|
3063
|
+
label: "City",
|
|
3064
|
+
required: true
|
|
3065
|
+
},
|
|
3066
|
+
{
|
|
3067
|
+
key: "state",
|
|
3068
|
+
type: "input",
|
|
3069
|
+
label: "State",
|
|
3070
|
+
required: true
|
|
2632
3071
|
},
|
|
2633
|
-
{ key: "street", type: "input", label: "Street Address", required: true },
|
|
2634
|
-
{ key: "city", type: "input", label: "City", required: true },
|
|
2635
|
-
{ key: "state", type: "input", label: "State", required: true },
|
|
2636
3072
|
{
|
|
2637
3073
|
key: "navRow2",
|
|
2638
3074
|
type: "row",
|
|
2639
3075
|
fields: [
|
|
2640
|
-
{
|
|
2641
|
-
|
|
3076
|
+
{
|
|
3077
|
+
key: "prev2",
|
|
3078
|
+
type: "previous",
|
|
3079
|
+
label: "Back",
|
|
3080
|
+
col: 6
|
|
3081
|
+
},
|
|
3082
|
+
{
|
|
3083
|
+
key: "next2",
|
|
3084
|
+
type: "next",
|
|
3085
|
+
label: "Continue",
|
|
3086
|
+
col: 6
|
|
3087
|
+
}
|
|
2642
3088
|
]
|
|
2643
3089
|
}
|
|
2644
3090
|
]
|
|
@@ -2651,21 +3097,35 @@ var examples_default = [
|
|
|
2651
3097
|
key: "stepTitle3",
|
|
2652
3098
|
type: "text",
|
|
2653
3099
|
label: "Step 3: Review & Submit",
|
|
2654
|
-
props: {
|
|
3100
|
+
props: {
|
|
3101
|
+
elementType: "h3"
|
|
3102
|
+
}
|
|
2655
3103
|
},
|
|
2656
3104
|
{
|
|
2657
3105
|
key: "confirm",
|
|
2658
3106
|
type: "checkbox",
|
|
2659
3107
|
label: "I confirm all information is correct",
|
|
2660
3108
|
required: true,
|
|
2661
|
-
validationMessages: {
|
|
3109
|
+
validationMessages: {
|
|
3110
|
+
required: "Please confirm before submitting"
|
|
3111
|
+
}
|
|
2662
3112
|
},
|
|
2663
3113
|
{
|
|
2664
3114
|
key: "navRow3",
|
|
2665
3115
|
type: "row",
|
|
2666
3116
|
fields: [
|
|
2667
|
-
{
|
|
2668
|
-
|
|
3117
|
+
{
|
|
3118
|
+
key: "prev3",
|
|
3119
|
+
type: "previous",
|
|
3120
|
+
label: "Back",
|
|
3121
|
+
col: 6
|
|
3122
|
+
},
|
|
3123
|
+
{
|
|
3124
|
+
key: "submit",
|
|
3125
|
+
type: "submit",
|
|
3126
|
+
label: "Submit",
|
|
3127
|
+
col: 6
|
|
3128
|
+
}
|
|
2669
3129
|
]
|
|
2670
3130
|
}
|
|
2671
3131
|
]
|
|
@@ -2686,8 +3146,14 @@ var examples_default = [
|
|
|
2686
3146
|
label: "Account Type",
|
|
2687
3147
|
required: true,
|
|
2688
3148
|
options: [
|
|
2689
|
-
{
|
|
2690
|
-
|
|
3149
|
+
{
|
|
3150
|
+
value: "personal",
|
|
3151
|
+
label: "Personal"
|
|
3152
|
+
},
|
|
3153
|
+
{
|
|
3154
|
+
value: "business",
|
|
3155
|
+
label: "Business"
|
|
3156
|
+
}
|
|
2691
3157
|
]
|
|
2692
3158
|
},
|
|
2693
3159
|
{
|
|
@@ -2714,7 +3180,9 @@ var examples_default = [
|
|
|
2714
3180
|
}
|
|
2715
3181
|
}
|
|
2716
3182
|
],
|
|
2717
|
-
validationMessages: {
|
|
3183
|
+
validationMessages: {
|
|
3184
|
+
required: "Business name is required"
|
|
3185
|
+
}
|
|
2718
3186
|
},
|
|
2719
3187
|
{
|
|
2720
3188
|
key: "taxId",
|
|
@@ -2731,7 +3199,7 @@ var examples_default = [
|
|
|
2731
3199
|
}
|
|
2732
3200
|
}
|
|
2733
3201
|
],
|
|
2734
|
-
|
|
3202
|
+
placeholder: "XX-XXXXXXX"
|
|
2735
3203
|
},
|
|
2736
3204
|
{
|
|
2737
3205
|
key: "newsletter",
|
|
@@ -2743,9 +3211,18 @@ var examples_default = [
|
|
|
2743
3211
|
type: "select",
|
|
2744
3212
|
label: "Email Frequency",
|
|
2745
3213
|
options: [
|
|
2746
|
-
{
|
|
2747
|
-
|
|
2748
|
-
|
|
3214
|
+
{
|
|
3215
|
+
value: "daily",
|
|
3216
|
+
label: "Daily"
|
|
3217
|
+
},
|
|
3218
|
+
{
|
|
3219
|
+
value: "weekly",
|
|
3220
|
+
label: "Weekly"
|
|
3221
|
+
},
|
|
3222
|
+
{
|
|
3223
|
+
value: "monthly",
|
|
3224
|
+
label: "Monthly"
|
|
3225
|
+
}
|
|
2749
3226
|
],
|
|
2750
3227
|
logic: [
|
|
2751
3228
|
{
|
|
@@ -2787,7 +3264,9 @@ var examples_default = [
|
|
|
2787
3264
|
key: "contactsTitle",
|
|
2788
3265
|
type: "text",
|
|
2789
3266
|
label: "Emergency Contacts",
|
|
2790
|
-
props: {
|
|
3267
|
+
props: {
|
|
3268
|
+
elementType: "h4"
|
|
3269
|
+
}
|
|
2791
3270
|
},
|
|
2792
3271
|
{
|
|
2793
3272
|
key: "contacts",
|
|
@@ -2802,19 +3281,49 @@ var examples_default = [
|
|
|
2802
3281
|
key: "contactRow",
|
|
2803
3282
|
type: "row",
|
|
2804
3283
|
fields: [
|
|
2805
|
-
{
|
|
2806
|
-
|
|
3284
|
+
{
|
|
3285
|
+
key: "name",
|
|
3286
|
+
type: "input",
|
|
3287
|
+
label: "Contact Name",
|
|
3288
|
+
required: true,
|
|
3289
|
+
col: 4
|
|
3290
|
+
},
|
|
3291
|
+
{
|
|
3292
|
+
key: "phone",
|
|
3293
|
+
type: "input",
|
|
3294
|
+
label: "Phone",
|
|
3295
|
+
required: true,
|
|
3296
|
+
col: 4,
|
|
3297
|
+
props: {
|
|
3298
|
+
type: "tel"
|
|
3299
|
+
}
|
|
3300
|
+
},
|
|
2807
3301
|
{
|
|
2808
3302
|
key: "relationship",
|
|
2809
3303
|
type: "select",
|
|
2810
3304
|
label: "Relationship",
|
|
2811
3305
|
col: 4,
|
|
2812
3306
|
options: [
|
|
2813
|
-
{
|
|
2814
|
-
|
|
2815
|
-
|
|
2816
|
-
|
|
2817
|
-
{
|
|
3307
|
+
{
|
|
3308
|
+
value: "spouse",
|
|
3309
|
+
label: "Spouse"
|
|
3310
|
+
},
|
|
3311
|
+
{
|
|
3312
|
+
value: "parent",
|
|
3313
|
+
label: "Parent"
|
|
3314
|
+
},
|
|
3315
|
+
{
|
|
3316
|
+
value: "sibling",
|
|
3317
|
+
label: "Sibling"
|
|
3318
|
+
},
|
|
3319
|
+
{
|
|
3320
|
+
value: "friend",
|
|
3321
|
+
label: "Friend"
|
|
3322
|
+
},
|
|
3323
|
+
{
|
|
3324
|
+
value: "other",
|
|
3325
|
+
label: "Other"
|
|
3326
|
+
}
|
|
2818
3327
|
]
|
|
2819
3328
|
}
|
|
2820
3329
|
]
|
|
@@ -2842,15 +3351,23 @@ var examples_default = [
|
|
|
2842
3351
|
key: "title",
|
|
2843
3352
|
type: "text",
|
|
2844
3353
|
label: "Customer Feedback",
|
|
2845
|
-
props: {
|
|
3354
|
+
props: {
|
|
3355
|
+
elementType: "h2"
|
|
3356
|
+
}
|
|
2846
3357
|
},
|
|
2847
3358
|
{
|
|
2848
3359
|
key: "satisfaction",
|
|
2849
3360
|
type: "slider",
|
|
2850
3361
|
label: "Overall Satisfaction (1-10)",
|
|
2851
3362
|
required: true,
|
|
2852
|
-
props: {
|
|
2853
|
-
|
|
3363
|
+
props: {
|
|
3364
|
+
min: 1,
|
|
3365
|
+
max: 10,
|
|
3366
|
+
step: 1
|
|
3367
|
+
},
|
|
3368
|
+
validationMessages: {
|
|
3369
|
+
required: "Please rate your satisfaction"
|
|
3370
|
+
}
|
|
2854
3371
|
},
|
|
2855
3372
|
{
|
|
2856
3373
|
key: "recommend",
|
|
@@ -2858,30 +3375,62 @@ var examples_default = [
|
|
|
2858
3375
|
label: "Would you recommend us?",
|
|
2859
3376
|
required: true,
|
|
2860
3377
|
options: [
|
|
2861
|
-
{
|
|
2862
|
-
|
|
2863
|
-
|
|
3378
|
+
{
|
|
3379
|
+
value: "yes",
|
|
3380
|
+
label: "Yes, definitely"
|
|
3381
|
+
},
|
|
3382
|
+
{
|
|
3383
|
+
value: "maybe",
|
|
3384
|
+
label: "Maybe"
|
|
3385
|
+
},
|
|
3386
|
+
{
|
|
3387
|
+
value: "no",
|
|
3388
|
+
label: "No"
|
|
3389
|
+
}
|
|
2864
3390
|
],
|
|
2865
|
-
validationMessages: {
|
|
3391
|
+
validationMessages: {
|
|
3392
|
+
required: "Please select an option"
|
|
3393
|
+
}
|
|
2866
3394
|
},
|
|
2867
3395
|
{
|
|
2868
3396
|
key: "improvements",
|
|
2869
3397
|
type: "select",
|
|
2870
3398
|
label: "What could we improve?",
|
|
2871
|
-
props: {
|
|
3399
|
+
props: {
|
|
3400
|
+
multiple: true
|
|
3401
|
+
},
|
|
2872
3402
|
options: [
|
|
2873
|
-
{
|
|
2874
|
-
|
|
2875
|
-
|
|
2876
|
-
|
|
2877
|
-
{
|
|
2878
|
-
|
|
3403
|
+
{
|
|
3404
|
+
value: "speed",
|
|
3405
|
+
label: "Response Time"
|
|
3406
|
+
},
|
|
3407
|
+
{
|
|
3408
|
+
value: "quality",
|
|
3409
|
+
label: "Product Quality"
|
|
3410
|
+
},
|
|
3411
|
+
{
|
|
3412
|
+
value: "price",
|
|
3413
|
+
label: "Pricing"
|
|
3414
|
+
},
|
|
3415
|
+
{
|
|
3416
|
+
value: "support",
|
|
3417
|
+
label: "Customer Support"
|
|
3418
|
+
},
|
|
3419
|
+
{
|
|
3420
|
+
value: "ui",
|
|
3421
|
+
label: "User Interface"
|
|
3422
|
+
}
|
|
3423
|
+
],
|
|
3424
|
+
placeholder: "Select all that apply"
|
|
2879
3425
|
},
|
|
2880
3426
|
{
|
|
2881
3427
|
key: "comments",
|
|
2882
3428
|
type: "textarea",
|
|
2883
3429
|
label: "Additional Comments",
|
|
2884
|
-
props: {
|
|
3430
|
+
props: {
|
|
3431
|
+
rows: 4
|
|
3432
|
+
},
|
|
3433
|
+
placeholder: "Share any additional feedback..."
|
|
2885
3434
|
},
|
|
2886
3435
|
{
|
|
2887
3436
|
key: "followUp",
|
|
@@ -2893,7 +3442,9 @@ var examples_default = [
|
|
|
2893
3442
|
type: "input",
|
|
2894
3443
|
label: "Email Address",
|
|
2895
3444
|
email: true,
|
|
2896
|
-
props: {
|
|
3445
|
+
props: {
|
|
3446
|
+
type: "email"
|
|
3447
|
+
},
|
|
2897
3448
|
logic: [
|
|
2898
3449
|
{
|
|
2899
3450
|
type: "hidden",
|
|
@@ -2917,7 +3468,8 @@ var examples_default = [
|
|
|
2917
3468
|
validationMessages: {
|
|
2918
3469
|
required: "Email required for follow-up",
|
|
2919
3470
|
email: "Please enter a valid email"
|
|
2920
|
-
}
|
|
3471
|
+
},
|
|
3472
|
+
placeholder: "your@email.com"
|
|
2921
3473
|
},
|
|
2922
3474
|
{
|
|
2923
3475
|
key: "submit",
|
|
@@ -3366,7 +3918,7 @@ var MatButtonPropsSchema = z12.object({
|
|
|
3366
3918
|
});
|
|
3367
3919
|
|
|
3368
3920
|
// internal/dynamic-forms-zod/material/src/fields/mat-input-field.schema.ts
|
|
3369
|
-
import { z as
|
|
3921
|
+
import { z as z23 } from "zod";
|
|
3370
3922
|
|
|
3371
3923
|
// internal/dynamic-forms-zod/src/lib/schemas/field/field-def.schema.ts
|
|
3372
3924
|
import { z as z14 } from "zod";
|
|
@@ -3828,16 +4380,31 @@ var FieldWithValidationSchema = z21.object({
|
|
|
3828
4380
|
schemas: z21.array(SchemaApplicationConfigSchema).optional()
|
|
3829
4381
|
});
|
|
3830
4382
|
|
|
4383
|
+
// internal/dynamic-forms-zod/src/lib/schemas/field/nullable-value.refinement.ts
|
|
4384
|
+
import { z as z22 } from "zod";
|
|
4385
|
+
var nullableValueRefine = (data, ctx) => {
|
|
4386
|
+
if (!data || typeof data !== "object") return;
|
|
4387
|
+
const field = data;
|
|
4388
|
+
if (field.value === null && field.nullable !== true) {
|
|
4389
|
+
ctx.addIssue({
|
|
4390
|
+
code: z22.ZodIssueCode.custom,
|
|
4391
|
+
path: ["value"],
|
|
4392
|
+
message: "value: null is only allowed when nullable is true. Add `nullable: true` or remove the null value."
|
|
4393
|
+
});
|
|
4394
|
+
}
|
|
4395
|
+
};
|
|
4396
|
+
|
|
3831
4397
|
// internal/dynamic-forms-zod/material/src/fields/mat-input-field.schema.ts
|
|
3832
|
-
var
|
|
4398
|
+
var MatInputFieldSchemaObject = BaseFieldDefSchema.merge(FieldWithValidationSchema).extend({
|
|
3833
4399
|
/**
|
|
3834
4400
|
* Field type discriminant.
|
|
3835
4401
|
*/
|
|
3836
|
-
type:
|
|
4402
|
+
type: z23.literal("input"),
|
|
4403
|
+
nullable: z23.boolean().optional(),
|
|
3837
4404
|
/**
|
|
3838
4405
|
* Initial value for the input.
|
|
3839
4406
|
*/
|
|
3840
|
-
value:
|
|
4407
|
+
value: z23.string().nullable().optional(),
|
|
3841
4408
|
/**
|
|
3842
4409
|
* Placeholder text (can also be in props).
|
|
3843
4410
|
*/
|
|
@@ -3847,18 +4414,20 @@ var MatInputFieldSchema = BaseFieldDefSchema.merge(FieldWithValidationSchema).ex
|
|
|
3847
4414
|
*/
|
|
3848
4415
|
props: MatInputPropsSchema.optional()
|
|
3849
4416
|
});
|
|
4417
|
+
var MatInputFieldSchema = MatInputFieldSchemaObject.superRefine(nullableValueRefine);
|
|
3850
4418
|
|
|
3851
4419
|
// internal/dynamic-forms-zod/material/src/fields/mat-textarea-field.schema.ts
|
|
3852
|
-
import { z as
|
|
3853
|
-
var
|
|
4420
|
+
import { z as z24 } from "zod";
|
|
4421
|
+
var MatTextareaFieldSchemaObject = BaseFieldDefSchema.merge(FieldWithValidationSchema).extend({
|
|
3854
4422
|
/**
|
|
3855
4423
|
* Field type discriminant.
|
|
3856
4424
|
*/
|
|
3857
|
-
type:
|
|
4425
|
+
type: z24.literal("textarea"),
|
|
4426
|
+
nullable: z24.boolean().optional(),
|
|
3858
4427
|
/**
|
|
3859
4428
|
* Initial value for the textarea.
|
|
3860
4429
|
*/
|
|
3861
|
-
value:
|
|
4430
|
+
value: z24.string().nullable().optional(),
|
|
3862
4431
|
/**
|
|
3863
4432
|
* Placeholder text (can also be in props).
|
|
3864
4433
|
*/
|
|
@@ -3868,13 +4437,14 @@ var MatTextareaFieldSchema = BaseFieldDefSchema.merge(FieldWithValidationSchema)
|
|
|
3868
4437
|
*/
|
|
3869
4438
|
props: MatTextareaPropsSchema.optional()
|
|
3870
4439
|
});
|
|
4440
|
+
var MatTextareaFieldSchema = MatTextareaFieldSchemaObject.superRefine(nullableValueRefine);
|
|
3871
4441
|
|
|
3872
4442
|
// internal/dynamic-forms-zod/material/src/fields/mat-select-field.schema.ts
|
|
3873
|
-
import { z as
|
|
4443
|
+
import { z as z26 } from "zod";
|
|
3874
4444
|
|
|
3875
4445
|
// internal/dynamic-forms-zod/src/lib/schemas/common/field-option.schema.ts
|
|
3876
|
-
import { z as
|
|
3877
|
-
var FieldOptionSchema =
|
|
4446
|
+
import { z as z25 } from "zod";
|
|
4447
|
+
var FieldOptionSchema = z25.object({
|
|
3878
4448
|
/**
|
|
3879
4449
|
* Display text for the option.
|
|
3880
4450
|
*/
|
|
@@ -3883,25 +4453,26 @@ var FieldOptionSchema = z24.object({
|
|
|
3883
4453
|
* The actual value stored when this option is selected.
|
|
3884
4454
|
* Can be any JSON-serializable value.
|
|
3885
4455
|
*/
|
|
3886
|
-
value:
|
|
4456
|
+
value: z25.unknown(),
|
|
3887
4457
|
/**
|
|
3888
4458
|
* Whether this option is disabled and cannot be selected.
|
|
3889
4459
|
*/
|
|
3890
|
-
disabled:
|
|
4460
|
+
disabled: z25.boolean().optional()
|
|
3891
4461
|
}).passthrough();
|
|
3892
|
-
var FieldOptionsSchema =
|
|
4462
|
+
var FieldOptionsSchema = z25.array(FieldOptionSchema);
|
|
3893
4463
|
|
|
3894
4464
|
// internal/dynamic-forms-zod/material/src/fields/mat-select-field.schema.ts
|
|
3895
|
-
var
|
|
4465
|
+
var MatSelectFieldSchemaObject = BaseFieldDefSchema.merge(FieldWithValidationSchema).extend({
|
|
3896
4466
|
/**
|
|
3897
4467
|
* Field type discriminant.
|
|
3898
4468
|
*/
|
|
3899
|
-
type:
|
|
4469
|
+
type: z26.literal("select"),
|
|
4470
|
+
nullable: z26.boolean().optional(),
|
|
3900
4471
|
/**
|
|
3901
4472
|
* Initial value for the select.
|
|
3902
4473
|
* Can be single value or array if multiple is enabled.
|
|
3903
4474
|
*/
|
|
3904
|
-
value:
|
|
4475
|
+
value: z26.unknown().nullable().optional(),
|
|
3905
4476
|
/**
|
|
3906
4477
|
* Placeholder text (can also be in props).
|
|
3907
4478
|
*/
|
|
@@ -3915,18 +4486,19 @@ var MatSelectFieldSchema = BaseFieldDefSchema.merge(FieldWithValidationSchema).e
|
|
|
3915
4486
|
*/
|
|
3916
4487
|
props: MatSelectPropsSchema.optional()
|
|
3917
4488
|
});
|
|
4489
|
+
var MatSelectFieldSchema = MatSelectFieldSchemaObject.superRefine(nullableValueRefine);
|
|
3918
4490
|
|
|
3919
4491
|
// internal/dynamic-forms-zod/material/src/fields/mat-checkbox-field.schema.ts
|
|
3920
|
-
import { z as
|
|
4492
|
+
import { z as z27 } from "zod";
|
|
3921
4493
|
var MatCheckboxFieldSchema = BaseFieldDefSchema.merge(FieldWithValidationSchema).extend({
|
|
3922
4494
|
/**
|
|
3923
4495
|
* Field type discriminant.
|
|
3924
4496
|
*/
|
|
3925
|
-
type:
|
|
4497
|
+
type: z27.literal("checkbox"),
|
|
3926
4498
|
/**
|
|
3927
4499
|
* Initial checked state.
|
|
3928
4500
|
*/
|
|
3929
|
-
value:
|
|
4501
|
+
value: z27.boolean().optional(),
|
|
3930
4502
|
/**
|
|
3931
4503
|
* Placeholder/helper text.
|
|
3932
4504
|
*/
|
|
@@ -3938,16 +4510,17 @@ var MatCheckboxFieldSchema = BaseFieldDefSchema.merge(FieldWithValidationSchema)
|
|
|
3938
4510
|
});
|
|
3939
4511
|
|
|
3940
4512
|
// internal/dynamic-forms-zod/material/src/fields/mat-radio-field.schema.ts
|
|
3941
|
-
import { z as
|
|
3942
|
-
var
|
|
4513
|
+
import { z as z28 } from "zod";
|
|
4514
|
+
var MatRadioFieldSchemaObject = BaseFieldDefSchema.merge(FieldWithValidationSchema).extend({
|
|
3943
4515
|
/**
|
|
3944
4516
|
* Field type discriminant.
|
|
3945
4517
|
*/
|
|
3946
|
-
type:
|
|
4518
|
+
type: z28.literal("radio"),
|
|
4519
|
+
nullable: z28.boolean().optional(),
|
|
3947
4520
|
/**
|
|
3948
4521
|
* Initial selected value.
|
|
3949
4522
|
*/
|
|
3950
|
-
value:
|
|
4523
|
+
value: z28.unknown().nullable().optional(),
|
|
3951
4524
|
/**
|
|
3952
4525
|
* Placeholder/helper text.
|
|
3953
4526
|
*/
|
|
@@ -3961,18 +4534,20 @@ var MatRadioFieldSchema = BaseFieldDefSchema.merge(FieldWithValidationSchema).ex
|
|
|
3961
4534
|
*/
|
|
3962
4535
|
props: MatRadioPropsSchema.optional()
|
|
3963
4536
|
});
|
|
4537
|
+
var MatRadioFieldSchema = MatRadioFieldSchemaObject.superRefine(nullableValueRefine);
|
|
3964
4538
|
|
|
3965
4539
|
// internal/dynamic-forms-zod/material/src/fields/mat-multi-checkbox-field.schema.ts
|
|
3966
|
-
import { z as
|
|
3967
|
-
var
|
|
4540
|
+
import { z as z29 } from "zod";
|
|
4541
|
+
var MatMultiCheckboxFieldSchemaObject = BaseFieldDefSchema.merge(FieldWithValidationSchema).extend({
|
|
3968
4542
|
/**
|
|
3969
4543
|
* Field type discriminant.
|
|
3970
4544
|
*/
|
|
3971
|
-
type:
|
|
4545
|
+
type: z29.literal("multi-checkbox"),
|
|
4546
|
+
nullable: z29.boolean().optional(),
|
|
3972
4547
|
/**
|
|
3973
4548
|
* Initial selected values (array).
|
|
3974
4549
|
*/
|
|
3975
|
-
value:
|
|
4550
|
+
value: z29.array(z29.unknown()).nullable().optional(),
|
|
3976
4551
|
/**
|
|
3977
4552
|
* Placeholder/helper text.
|
|
3978
4553
|
*/
|
|
@@ -3986,18 +4561,19 @@ var MatMultiCheckboxFieldSchema = BaseFieldDefSchema.merge(FieldWithValidationSc
|
|
|
3986
4561
|
*/
|
|
3987
4562
|
props: MatMultiCheckboxPropsSchema.optional()
|
|
3988
4563
|
});
|
|
4564
|
+
var MatMultiCheckboxFieldSchema = MatMultiCheckboxFieldSchemaObject.superRefine(nullableValueRefine);
|
|
3989
4565
|
|
|
3990
4566
|
// internal/dynamic-forms-zod/material/src/fields/mat-toggle-field.schema.ts
|
|
3991
|
-
import { z as
|
|
4567
|
+
import { z as z30 } from "zod";
|
|
3992
4568
|
var MatToggleFieldSchema = BaseFieldDefSchema.merge(FieldWithValidationSchema).extend({
|
|
3993
4569
|
/**
|
|
3994
4570
|
* Field type discriminant.
|
|
3995
4571
|
*/
|
|
3996
|
-
type:
|
|
4572
|
+
type: z30.literal("toggle"),
|
|
3997
4573
|
/**
|
|
3998
4574
|
* Initial toggle state.
|
|
3999
4575
|
*/
|
|
4000
|
-
value:
|
|
4576
|
+
value: z30.boolean().optional(),
|
|
4001
4577
|
/**
|
|
4002
4578
|
* Placeholder/helper text.
|
|
4003
4579
|
*/
|
|
@@ -4009,28 +4585,29 @@ var MatToggleFieldSchema = BaseFieldDefSchema.merge(FieldWithValidationSchema).e
|
|
|
4009
4585
|
});
|
|
4010
4586
|
|
|
4011
4587
|
// internal/dynamic-forms-zod/material/src/fields/mat-slider-field.schema.ts
|
|
4012
|
-
import { z as
|
|
4013
|
-
var
|
|
4588
|
+
import { z as z31 } from "zod";
|
|
4589
|
+
var MatSliderFieldSchemaObject = BaseFieldDefSchema.merge(FieldWithValidationSchema).extend({
|
|
4014
4590
|
/**
|
|
4015
4591
|
* Field type discriminant.
|
|
4016
4592
|
*/
|
|
4017
|
-
type:
|
|
4593
|
+
type: z31.literal("slider"),
|
|
4594
|
+
nullable: z31.boolean().optional(),
|
|
4018
4595
|
/**
|
|
4019
4596
|
* Initial slider value.
|
|
4020
4597
|
*/
|
|
4021
|
-
value:
|
|
4598
|
+
value: z31.number().nullable().optional(),
|
|
4022
4599
|
/**
|
|
4023
4600
|
* Minimum slider value.
|
|
4024
4601
|
*/
|
|
4025
|
-
minValue:
|
|
4602
|
+
minValue: z31.number().optional(),
|
|
4026
4603
|
/**
|
|
4027
4604
|
* Maximum slider value.
|
|
4028
4605
|
*/
|
|
4029
|
-
maxValue:
|
|
4606
|
+
maxValue: z31.number().optional(),
|
|
4030
4607
|
/**
|
|
4031
4608
|
* Step increment.
|
|
4032
4609
|
*/
|
|
4033
|
-
step:
|
|
4610
|
+
step: z31.number().positive().optional(),
|
|
4034
4611
|
/**
|
|
4035
4612
|
* Placeholder/helper text.
|
|
4036
4613
|
*/
|
|
@@ -4040,19 +4617,21 @@ var MatSliderFieldSchema = BaseFieldDefSchema.merge(FieldWithValidationSchema).e
|
|
|
4040
4617
|
*/
|
|
4041
4618
|
props: MatSliderPropsSchema.optional()
|
|
4042
4619
|
});
|
|
4620
|
+
var MatSliderFieldSchema = MatSliderFieldSchemaObject.superRefine(nullableValueRefine);
|
|
4043
4621
|
|
|
4044
4622
|
// internal/dynamic-forms-zod/material/src/fields/mat-datepicker-field.schema.ts
|
|
4045
|
-
import { z as
|
|
4046
|
-
var DateValueSchema =
|
|
4047
|
-
var
|
|
4623
|
+
import { z as z32 } from "zod";
|
|
4624
|
+
var DateValueSchema = z32.union([z32.string(), z32.null()]);
|
|
4625
|
+
var MatDatepickerFieldSchemaObject = BaseFieldDefSchema.merge(FieldWithValidationSchema).extend({
|
|
4048
4626
|
/**
|
|
4049
4627
|
* Field type discriminant.
|
|
4050
4628
|
*/
|
|
4051
|
-
type:
|
|
4629
|
+
type: z32.literal("datepicker"),
|
|
4630
|
+
nullable: z32.boolean().optional(),
|
|
4052
4631
|
/**
|
|
4053
4632
|
* Initial date value (ISO string in JSON configs).
|
|
4054
4633
|
*/
|
|
4055
|
-
value: DateValueSchema.optional(),
|
|
4634
|
+
value: DateValueSchema.nullable().optional(),
|
|
4056
4635
|
/**
|
|
4057
4636
|
* Minimum selectable date.
|
|
4058
4637
|
*/
|
|
@@ -4074,24 +4653,25 @@ var MatDatepickerFieldSchema = BaseFieldDefSchema.merge(FieldWithValidationSchem
|
|
|
4074
4653
|
*/
|
|
4075
4654
|
props: MatDatepickerPropsSchema.optional()
|
|
4076
4655
|
});
|
|
4656
|
+
var MatDatepickerFieldSchema = MatDatepickerFieldSchemaObject.superRefine(nullableValueRefine);
|
|
4077
4657
|
|
|
4078
4658
|
// internal/dynamic-forms-zod/material/src/fields/mat-button-field.schema.ts
|
|
4079
|
-
import { z as
|
|
4080
|
-
var EventArgSchema =
|
|
4659
|
+
import { z as z33 } from "zod";
|
|
4660
|
+
var EventArgSchema = z33.union([z33.string(), z33.number(), z33.boolean(), z33.null(), z33.undefined()]);
|
|
4081
4661
|
var MatButtonFieldSchema = BaseFieldDefSchema.extend({
|
|
4082
4662
|
/**
|
|
4083
4663
|
* Field type discriminant.
|
|
4084
4664
|
*/
|
|
4085
|
-
type:
|
|
4665
|
+
type: z33.literal("button"),
|
|
4086
4666
|
/**
|
|
4087
4667
|
* Event type name (string reference to registered event).
|
|
4088
4668
|
* Note: Full event configuration requires runtime setup.
|
|
4089
4669
|
*/
|
|
4090
|
-
event:
|
|
4670
|
+
event: z33.string().optional(),
|
|
4091
4671
|
/**
|
|
4092
4672
|
* Arguments passed to the event constructor.
|
|
4093
4673
|
*/
|
|
4094
|
-
eventArgs:
|
|
4674
|
+
eventArgs: z33.array(EventArgSchema).optional(),
|
|
4095
4675
|
/**
|
|
4096
4676
|
* Material-specific button properties.
|
|
4097
4677
|
*/
|
|
@@ -4102,45 +4682,45 @@ var MatButtonFieldSchema = BaseFieldDefSchema.extend({
|
|
|
4102
4682
|
logic: LogicArraySchema.optional()
|
|
4103
4683
|
});
|
|
4104
4684
|
var MatSubmitButtonFieldSchema = BaseFieldDefSchema.extend({
|
|
4105
|
-
type:
|
|
4685
|
+
type: z33.literal("submit"),
|
|
4106
4686
|
props: MatButtonPropsSchema.optional(),
|
|
4107
4687
|
logic: LogicArraySchema.optional()
|
|
4108
4688
|
});
|
|
4109
4689
|
var MatNextButtonFieldSchema = BaseFieldDefSchema.extend({
|
|
4110
|
-
type:
|
|
4690
|
+
type: z33.literal("next"),
|
|
4111
4691
|
props: MatButtonPropsSchema.optional(),
|
|
4112
4692
|
logic: LogicArraySchema.optional()
|
|
4113
4693
|
});
|
|
4114
4694
|
var MatPreviousButtonFieldSchema = BaseFieldDefSchema.extend({
|
|
4115
|
-
type:
|
|
4695
|
+
type: z33.literal("previous"),
|
|
4116
4696
|
props: MatButtonPropsSchema.optional()
|
|
4117
4697
|
});
|
|
4118
4698
|
var MatAddArrayItemButtonFieldSchema = BaseFieldDefSchema.extend({
|
|
4119
|
-
type:
|
|
4699
|
+
type: z33.literal("addArrayItem"),
|
|
4120
4700
|
/**
|
|
4121
4701
|
* Key of the array field to add items to.
|
|
4122
4702
|
* If omitted, uses the parent array context.
|
|
4123
4703
|
*/
|
|
4124
|
-
arrayKey:
|
|
4704
|
+
arrayKey: z33.string().optional(),
|
|
4125
4705
|
props: MatButtonPropsSchema.optional()
|
|
4126
4706
|
});
|
|
4127
4707
|
var MatRemoveArrayItemButtonFieldSchema = BaseFieldDefSchema.extend({
|
|
4128
|
-
type:
|
|
4708
|
+
type: z33.literal("removeArrayItem"),
|
|
4129
4709
|
/**
|
|
4130
4710
|
* Key of the array field to remove items from.
|
|
4131
4711
|
* If omitted, uses the parent array context.
|
|
4132
4712
|
*/
|
|
4133
|
-
arrayKey:
|
|
4713
|
+
arrayKey: z33.string().optional(),
|
|
4134
4714
|
props: MatButtonPropsSchema.optional()
|
|
4135
4715
|
});
|
|
4136
4716
|
|
|
4137
4717
|
// internal/dynamic-forms-zod/material/src/mat-leaf-field.schema.ts
|
|
4138
|
-
import { z as
|
|
4718
|
+
import { z as z36 } from "zod";
|
|
4139
4719
|
|
|
4140
4720
|
// internal/dynamic-forms-zod/src/lib/schemas/leaves/text-field.schema.ts
|
|
4141
|
-
import { z as
|
|
4142
|
-
var TextElementTypeSchema =
|
|
4143
|
-
var TextPropsSchema =
|
|
4721
|
+
import { z as z34 } from "zod";
|
|
4722
|
+
var TextElementTypeSchema = z34.enum(["p", "h1", "h2", "h3", "h4", "h5", "h6", "span"]);
|
|
4723
|
+
var TextPropsSchema = z34.object({
|
|
4144
4724
|
/**
|
|
4145
4725
|
* HTML element type to render the text.
|
|
4146
4726
|
*/
|
|
@@ -4150,7 +4730,7 @@ var TextFieldSchema = BaseFieldDefSchema.extend({
|
|
|
4150
4730
|
/**
|
|
4151
4731
|
* Field type discriminant.
|
|
4152
4732
|
*/
|
|
4153
|
-
type:
|
|
4733
|
+
type: z34.literal("text"),
|
|
4154
4734
|
/**
|
|
4155
4735
|
* Text-specific properties.
|
|
4156
4736
|
*/
|
|
@@ -4162,9 +4742,9 @@ var TextFieldSchema = BaseFieldDefSchema.extend({
|
|
|
4162
4742
|
});
|
|
4163
4743
|
|
|
4164
4744
|
// internal/dynamic-forms-zod/src/lib/schemas/leaves/hidden-field.schema.ts
|
|
4165
|
-
import { z as
|
|
4166
|
-
var HiddenScalarSchema =
|
|
4167
|
-
var HiddenValueSchema =
|
|
4745
|
+
import { z as z35 } from "zod";
|
|
4746
|
+
var HiddenScalarSchema = z35.union([z35.string(), z35.number(), z35.boolean()]);
|
|
4747
|
+
var HiddenValueSchema = z35.union([HiddenScalarSchema, z35.array(HiddenScalarSchema)]);
|
|
4168
4748
|
var HiddenFieldSchema = BaseFieldDefSchema.omit({
|
|
4169
4749
|
label: true,
|
|
4170
4750
|
meta: true,
|
|
@@ -4180,7 +4760,7 @@ var HiddenFieldSchema = BaseFieldDefSchema.omit({
|
|
|
4180
4760
|
/**
|
|
4181
4761
|
* Field type discriminant.
|
|
4182
4762
|
*/
|
|
4183
|
-
type:
|
|
4763
|
+
type: z35.literal("hidden"),
|
|
4184
4764
|
/**
|
|
4185
4765
|
* The value to store. Required for hidden fields.
|
|
4186
4766
|
*/
|
|
@@ -4188,20 +4768,20 @@ var HiddenFieldSchema = BaseFieldDefSchema.omit({
|
|
|
4188
4768
|
});
|
|
4189
4769
|
|
|
4190
4770
|
// internal/dynamic-forms-zod/material/src/mat-leaf-field.schema.ts
|
|
4191
|
-
var MatLeafFieldSchema =
|
|
4771
|
+
var MatLeafFieldSchema = z36.discriminatedUnion("type", [
|
|
4192
4772
|
// Default fields
|
|
4193
4773
|
TextFieldSchema,
|
|
4194
4774
|
HiddenFieldSchema,
|
|
4195
4775
|
// Material value fields
|
|
4196
|
-
|
|
4197
|
-
|
|
4198
|
-
|
|
4776
|
+
MatInputFieldSchemaObject,
|
|
4777
|
+
MatTextareaFieldSchemaObject,
|
|
4778
|
+
MatSelectFieldSchemaObject,
|
|
4199
4779
|
MatCheckboxFieldSchema,
|
|
4200
|
-
|
|
4201
|
-
|
|
4780
|
+
MatRadioFieldSchemaObject,
|
|
4781
|
+
MatMultiCheckboxFieldSchemaObject,
|
|
4202
4782
|
MatToggleFieldSchema,
|
|
4203
|
-
|
|
4204
|
-
|
|
4783
|
+
MatSliderFieldSchemaObject,
|
|
4784
|
+
MatDatepickerFieldSchemaObject,
|
|
4205
4785
|
// Material button fields
|
|
4206
4786
|
MatButtonFieldSchema,
|
|
4207
4787
|
MatSubmitButtonFieldSchema,
|
|
@@ -4209,18 +4789,18 @@ var MatLeafFieldSchema = z35.discriminatedUnion("type", [
|
|
|
4209
4789
|
MatPreviousButtonFieldSchema,
|
|
4210
4790
|
MatAddArrayItemButtonFieldSchema,
|
|
4211
4791
|
MatRemoveArrayItemButtonFieldSchema
|
|
4212
|
-
]);
|
|
4792
|
+
]).superRefine(nullableValueRefine);
|
|
4213
4793
|
|
|
4214
4794
|
// internal/dynamic-forms-zod/src/lib/schemas/containers/factories.ts
|
|
4215
|
-
import { z as
|
|
4216
|
-
var ContainerLogicSchema =
|
|
4217
|
-
type:
|
|
4218
|
-
condition:
|
|
4795
|
+
import { z as z37 } from "zod";
|
|
4796
|
+
var ContainerLogicSchema = z37.object({
|
|
4797
|
+
type: z37.literal("hidden"),
|
|
4798
|
+
condition: z37.union([ConditionalExpressionSchema, z37.boolean()])
|
|
4219
4799
|
});
|
|
4220
4800
|
function createContainerSchemas(options) {
|
|
4221
4801
|
const { leafFieldSchema } = options;
|
|
4222
|
-
const AnyFieldSchema =
|
|
4223
|
-
() =>
|
|
4802
|
+
const AnyFieldSchema = z37.lazy(
|
|
4803
|
+
() => z37.union([
|
|
4224
4804
|
leafFieldSchema,
|
|
4225
4805
|
PageFieldSchema,
|
|
4226
4806
|
RowFieldSchema,
|
|
@@ -4234,67 +4814,67 @@ function createContainerSchemas(options) {
|
|
|
4234
4814
|
}).extend({
|
|
4235
4815
|
// Explicitly forbid label on container fields
|
|
4236
4816
|
// This makes Zod reject any value for these properties
|
|
4237
|
-
label:
|
|
4238
|
-
meta:
|
|
4817
|
+
label: z37.never().optional(),
|
|
4818
|
+
meta: z37.never().optional()
|
|
4239
4819
|
});
|
|
4240
4820
|
const PageFieldSchema = ContainerBaseSchema.extend({
|
|
4241
|
-
type:
|
|
4242
|
-
fields:
|
|
4243
|
-
logic:
|
|
4821
|
+
type: z37.literal("page"),
|
|
4822
|
+
fields: z37.array(AnyFieldSchema),
|
|
4823
|
+
logic: z37.array(ContainerLogicSchema).optional(),
|
|
4244
4824
|
// Also forbid title (common mistake)
|
|
4245
|
-
title:
|
|
4825
|
+
title: z37.never().optional()
|
|
4246
4826
|
});
|
|
4247
4827
|
const RowFieldSchema = ContainerBaseSchema.extend({
|
|
4248
|
-
type:
|
|
4249
|
-
fields:
|
|
4828
|
+
type: z37.literal("row"),
|
|
4829
|
+
fields: z37.array(AnyFieldSchema),
|
|
4250
4830
|
// Container logic - only 'hidden' type allowed (same as pages)
|
|
4251
|
-
logic:
|
|
4831
|
+
logic: z37.array(ContainerLogicSchema).optional()
|
|
4252
4832
|
});
|
|
4253
4833
|
const GroupFieldSchema = ContainerBaseSchema.extend({
|
|
4254
|
-
type:
|
|
4255
|
-
fields:
|
|
4834
|
+
type: z37.literal("group"),
|
|
4835
|
+
fields: z37.array(AnyFieldSchema),
|
|
4256
4836
|
// Container logic - only 'hidden' type allowed (same as pages)
|
|
4257
|
-
logic:
|
|
4837
|
+
logic: z37.array(ContainerLogicSchema).optional()
|
|
4258
4838
|
});
|
|
4259
|
-
const ArrayButtonConfigSchema =
|
|
4260
|
-
label:
|
|
4261
|
-
props:
|
|
4839
|
+
const ArrayButtonConfigSchema = z37.object({
|
|
4840
|
+
label: z37.string().optional(),
|
|
4841
|
+
props: z37.record(z37.unknown()).optional()
|
|
4262
4842
|
});
|
|
4263
4843
|
const FullArrayFieldSchema = ContainerBaseSchema.extend({
|
|
4264
|
-
type:
|
|
4265
|
-
fields:
|
|
4266
|
-
logic:
|
|
4844
|
+
type: z37.literal("array"),
|
|
4845
|
+
fields: z37.array(AnyFieldSchema),
|
|
4846
|
+
logic: z37.array(ContainerLogicSchema).optional(),
|
|
4267
4847
|
// Full API does not use template
|
|
4268
|
-
template:
|
|
4848
|
+
template: z37.never().optional(),
|
|
4269
4849
|
// Array length validation
|
|
4270
|
-
minLength:
|
|
4271
|
-
maxLength:
|
|
4850
|
+
minLength: z37.number().int().min(0).optional(),
|
|
4851
|
+
maxLength: z37.number().int().min(0).optional()
|
|
4272
4852
|
});
|
|
4273
|
-
const ArrayAllowedChildSchema =
|
|
4853
|
+
const ArrayAllowedChildSchema = z37.lazy(
|
|
4274
4854
|
() => AnyFieldSchema.refine((field) => field.type !== "page" && field.type !== "array", {
|
|
4275
4855
|
message: "Array templates cannot contain page or array fields. Only leaf fields, rows, and groups are allowed."
|
|
4276
4856
|
})
|
|
4277
4857
|
);
|
|
4278
4858
|
const SimplifiedArrayFieldSchema = ContainerBaseSchema.extend({
|
|
4279
|
-
type:
|
|
4859
|
+
type: z37.literal("array"),
|
|
4280
4860
|
// Template: single field (primitive array) or array of fields (object array)
|
|
4281
4861
|
// Only ArrayAllowedChildren (leaf fields, rows, groups) are valid — no pages or nested arrays.
|
|
4282
|
-
template:
|
|
4862
|
+
template: z37.union([ArrayAllowedChildSchema, z37.array(ArrayAllowedChildSchema)]),
|
|
4283
4863
|
// Initial values for the array
|
|
4284
|
-
value:
|
|
4864
|
+
value: z37.array(z37.unknown()).optional(),
|
|
4285
4865
|
// Button customization or opt-out (false to disable)
|
|
4286
|
-
addButton:
|
|
4287
|
-
removeButton:
|
|
4288
|
-
logic:
|
|
4866
|
+
addButton: z37.union([ArrayButtonConfigSchema, z37.literal(false)]).optional(),
|
|
4867
|
+
removeButton: z37.union([ArrayButtonConfigSchema, z37.literal(false)]).optional(),
|
|
4868
|
+
logic: z37.array(ContainerLogicSchema).optional(),
|
|
4289
4869
|
// Array length validation
|
|
4290
|
-
minLength:
|
|
4291
|
-
maxLength:
|
|
4870
|
+
minLength: z37.number().int().min(0).optional(),
|
|
4871
|
+
maxLength: z37.number().int().min(0).optional(),
|
|
4292
4872
|
// Simplified API does not use fields
|
|
4293
|
-
fields:
|
|
4294
|
-
minItems:
|
|
4295
|
-
maxItems:
|
|
4873
|
+
fields: z37.never().optional(),
|
|
4874
|
+
minItems: z37.never().optional(),
|
|
4875
|
+
maxItems: z37.never().optional()
|
|
4296
4876
|
});
|
|
4297
|
-
const ArrayFieldSchema =
|
|
4877
|
+
const ArrayFieldSchema = z37.union([FullArrayFieldSchema, SimplifiedArrayFieldSchema]);
|
|
4298
4878
|
const AllFieldsSchema = AnyFieldSchema;
|
|
4299
4879
|
return {
|
|
4300
4880
|
PageFieldSchema,
|
|
@@ -4316,48 +4896,48 @@ var MatArrayFieldSchema = containerSchemas.ArrayFieldSchema;
|
|
|
4316
4896
|
var MatFieldSchema = containerSchemas.AllFieldsSchema;
|
|
4317
4897
|
|
|
4318
4898
|
// internal/dynamic-forms-zod/material/src/mat-form-config.schema.ts
|
|
4319
|
-
import { z as
|
|
4899
|
+
import { z as z41 } from "zod";
|
|
4320
4900
|
|
|
4321
4901
|
// internal/dynamic-forms-zod/src/lib/schemas/form/form-config.schema.ts
|
|
4322
|
-
import { z as
|
|
4902
|
+
import { z as z40 } from "zod";
|
|
4323
4903
|
|
|
4324
4904
|
// internal/dynamic-forms-zod/src/lib/schemas/form/form-options.schema.ts
|
|
4325
|
-
import { z as
|
|
4326
|
-
var SubmitButtonOptionsSchema =
|
|
4905
|
+
import { z as z38 } from "zod";
|
|
4906
|
+
var SubmitButtonOptionsSchema = z38.object({
|
|
4327
4907
|
/**
|
|
4328
4908
|
* Whether to disable the submit button when the form is invalid.
|
|
4329
4909
|
* Defaults to true.
|
|
4330
4910
|
*/
|
|
4331
|
-
disableWhenInvalid:
|
|
4911
|
+
disableWhenInvalid: z38.boolean().optional(),
|
|
4332
4912
|
/**
|
|
4333
4913
|
* Whether to disable the submit button while the form is submitting.
|
|
4334
4914
|
* Defaults to true.
|
|
4335
4915
|
*/
|
|
4336
|
-
disableWhileSubmitting:
|
|
4916
|
+
disableWhileSubmitting: z38.boolean().optional()
|
|
4337
4917
|
});
|
|
4338
|
-
var NextButtonOptionsSchema =
|
|
4918
|
+
var NextButtonOptionsSchema = z38.object({
|
|
4339
4919
|
/**
|
|
4340
4920
|
* Whether to disable the next button when the current page is invalid.
|
|
4341
4921
|
* Defaults to true.
|
|
4342
4922
|
*/
|
|
4343
|
-
disableWhenPageInvalid:
|
|
4923
|
+
disableWhenPageInvalid: z38.boolean().optional(),
|
|
4344
4924
|
/**
|
|
4345
4925
|
* Whether to disable the next button while the form is submitting.
|
|
4346
4926
|
* Defaults to true.
|
|
4347
4927
|
*/
|
|
4348
|
-
disableWhileSubmitting:
|
|
4928
|
+
disableWhileSubmitting: z38.boolean().optional()
|
|
4349
4929
|
});
|
|
4350
|
-
var FormOptionsSchema =
|
|
4930
|
+
var FormOptionsSchema = z38.object({
|
|
4351
4931
|
/**
|
|
4352
4932
|
* Whether the entire form is disabled.
|
|
4353
4933
|
*/
|
|
4354
|
-
disabled:
|
|
4934
|
+
disabled: z38.boolean().optional(),
|
|
4355
4935
|
/**
|
|
4356
4936
|
* Maximum number of derivation iterations before stopping.
|
|
4357
4937
|
* Prevents infinite loops in circular derivations.
|
|
4358
4938
|
* Defaults to 10.
|
|
4359
4939
|
*/
|
|
4360
|
-
maxDerivationIterations:
|
|
4940
|
+
maxDerivationIterations: z38.number().positive().optional(),
|
|
4361
4941
|
/**
|
|
4362
4942
|
* Options for the submit button behavior.
|
|
4363
4943
|
*/
|
|
@@ -4370,36 +4950,36 @@ var FormOptionsSchema = z37.object({
|
|
|
4370
4950
|
* Whether to exclude values of hidden fields from submission output.
|
|
4371
4951
|
* Overrides the global withValueExclusionDefaults() setting for this form.
|
|
4372
4952
|
*/
|
|
4373
|
-
excludeValueIfHidden:
|
|
4953
|
+
excludeValueIfHidden: z38.boolean().optional(),
|
|
4374
4954
|
/**
|
|
4375
4955
|
* Whether to exclude values of disabled fields from submission output.
|
|
4376
4956
|
* Overrides the global withValueExclusionDefaults() setting for this form.
|
|
4377
4957
|
*/
|
|
4378
|
-
excludeValueIfDisabled:
|
|
4958
|
+
excludeValueIfDisabled: z38.boolean().optional(),
|
|
4379
4959
|
/**
|
|
4380
4960
|
* Whether to exclude values of readonly fields from submission output.
|
|
4381
4961
|
* Overrides the global withValueExclusionDefaults() setting for this form.
|
|
4382
4962
|
*/
|
|
4383
|
-
excludeValueIfReadonly:
|
|
4963
|
+
excludeValueIfReadonly: z38.boolean().optional()
|
|
4384
4964
|
});
|
|
4385
4965
|
|
|
4386
4966
|
// internal/dynamic-forms-zod/src/lib/schemas/form/schema-definition.schema.ts
|
|
4387
|
-
import { z as
|
|
4388
|
-
var SchemaDefinitionSchema =
|
|
4967
|
+
import { z as z39 } from "zod";
|
|
4968
|
+
var SchemaDefinitionSchema = z39.object({
|
|
4389
4969
|
/**
|
|
4390
4970
|
* Unique identifier for the schema.
|
|
4391
4971
|
* Used to reference the schema in SchemaApplicationConfig.
|
|
4392
4972
|
*/
|
|
4393
|
-
name:
|
|
4973
|
+
name: z39.string(),
|
|
4394
4974
|
/**
|
|
4395
4975
|
* Human-readable description of what this schema validates.
|
|
4396
4976
|
*/
|
|
4397
|
-
description:
|
|
4977
|
+
description: z39.string().optional(),
|
|
4398
4978
|
/**
|
|
4399
4979
|
* Field path pattern for automatic schema application.
|
|
4400
4980
|
* Supports glob-like patterns.
|
|
4401
4981
|
*/
|
|
4402
|
-
pathPattern:
|
|
4982
|
+
pathPattern: z39.string().optional(),
|
|
4403
4983
|
/**
|
|
4404
4984
|
* Validators to apply to fields using this schema.
|
|
4405
4985
|
*/
|
|
@@ -4411,17 +4991,17 @@ var SchemaDefinitionSchema = z38.object({
|
|
|
4411
4991
|
/**
|
|
4412
4992
|
* Nested schema applications for composing schemas.
|
|
4413
4993
|
*/
|
|
4414
|
-
subSchemas:
|
|
4994
|
+
subSchemas: z39.array(SchemaApplicationConfigSchema).optional()
|
|
4415
4995
|
});
|
|
4416
|
-
var SchemaDefinitionsArraySchema =
|
|
4996
|
+
var SchemaDefinitionsArraySchema = z39.array(SchemaDefinitionSchema);
|
|
4417
4997
|
|
|
4418
4998
|
// internal/dynamic-forms-zod/src/lib/schemas/form/form-config.schema.ts
|
|
4419
4999
|
function createFormConfigSchema(fieldSchema, propsSchema) {
|
|
4420
|
-
const baseSchema =
|
|
5000
|
+
const baseSchema = z40.object({
|
|
4421
5001
|
/**
|
|
4422
5002
|
* Array of field definitions that make up the form.
|
|
4423
5003
|
*/
|
|
4424
|
-
fields:
|
|
5004
|
+
fields: z40.array(fieldSchema),
|
|
4425
5005
|
/**
|
|
4426
5006
|
* Form-level options controlling behavior.
|
|
4427
5007
|
*/
|
|
@@ -4461,15 +5041,15 @@ function createFormConfigSchema(fieldSchema, propsSchema) {
|
|
|
4461
5041
|
}
|
|
4462
5042
|
return baseSchema;
|
|
4463
5043
|
}
|
|
4464
|
-
var BaseFormConfigSchema =
|
|
4465
|
-
fields:
|
|
5044
|
+
var BaseFormConfigSchema = z40.object({
|
|
5045
|
+
fields: z40.array(z40.any()),
|
|
4466
5046
|
options: FormOptionsSchema.optional(),
|
|
4467
5047
|
schemas: SchemaDefinitionsArraySchema.optional(),
|
|
4468
5048
|
defaultValidationMessages: ValidationMessagesSchema.optional()
|
|
4469
5049
|
});
|
|
4470
5050
|
|
|
4471
5051
|
// internal/dynamic-forms-zod/material/src/mat-form-config.schema.ts
|
|
4472
|
-
var MatFormDefaultPropsSchema =
|
|
5052
|
+
var MatFormDefaultPropsSchema = z41.object({
|
|
4473
5053
|
/**
|
|
4474
5054
|
* Default form field appearance for all fields.
|
|
4475
5055
|
*/
|
|
@@ -4486,15 +5066,15 @@ var MatFormDefaultPropsSchema = z40.object({
|
|
|
4486
5066
|
var MatFormConfigSchema = createFormConfigSchema(MatFieldSchema, MatFormDefaultPropsSchema);
|
|
4487
5067
|
|
|
4488
5068
|
// internal/dynamic-forms-zod/bootstrap/src/props/index.ts
|
|
4489
|
-
import { z as
|
|
5069
|
+
import { z as z43 } from "zod";
|
|
4490
5070
|
|
|
4491
5071
|
// internal/dynamic-forms-zod/bootstrap/src/props/bs-common-props.schema.ts
|
|
4492
|
-
import { z as
|
|
4493
|
-
var BsSizeSchema =
|
|
4494
|
-
var BsButtonVariantSchema =
|
|
4495
|
-
var BsFormFieldPropsSchema =
|
|
5072
|
+
import { z as z42 } from "zod";
|
|
5073
|
+
var BsSizeSchema = z42.enum(["sm", "lg"]);
|
|
5074
|
+
var BsButtonVariantSchema = z42.enum(["primary", "secondary", "success", "danger", "warning", "info", "light", "dark", "link"]);
|
|
5075
|
+
var BsFormFieldPropsSchema = z42.object({
|
|
4496
5076
|
size: BsSizeSchema.optional(),
|
|
4497
|
-
floatingLabel:
|
|
5077
|
+
floatingLabel: z42.boolean().optional(),
|
|
4498
5078
|
hint: DynamicTextSchema.optional(),
|
|
4499
5079
|
validFeedback: DynamicTextSchema.optional(),
|
|
4500
5080
|
invalidFeedback: DynamicTextSchema.optional()
|
|
@@ -4502,194 +5082,208 @@ var BsFormFieldPropsSchema = z41.object({
|
|
|
4502
5082
|
|
|
4503
5083
|
// internal/dynamic-forms-zod/bootstrap/src/props/index.ts
|
|
4504
5084
|
var BsInputPropsSchema = BsFormFieldPropsSchema.extend({
|
|
4505
|
-
type:
|
|
5085
|
+
type: z43.enum(["text", "email", "password", "number", "tel", "url"]).optional(),
|
|
4506
5086
|
placeholder: DynamicTextSchema.optional(),
|
|
4507
|
-
plaintext:
|
|
5087
|
+
plaintext: z43.boolean().optional()
|
|
4508
5088
|
});
|
|
4509
5089
|
var BsTextareaPropsSchema = BsFormFieldPropsSchema.extend({
|
|
4510
|
-
rows:
|
|
5090
|
+
rows: z43.number().positive().optional(),
|
|
4511
5091
|
placeholder: DynamicTextSchema.optional()
|
|
4512
5092
|
});
|
|
4513
5093
|
var BsSelectPropsSchema = BsFormFieldPropsSchema.extend({
|
|
4514
|
-
multiple:
|
|
4515
|
-
htmlSize:
|
|
5094
|
+
multiple: z43.boolean().optional(),
|
|
5095
|
+
htmlSize: z43.number().positive().optional(),
|
|
4516
5096
|
placeholder: DynamicTextSchema.optional()
|
|
4517
5097
|
});
|
|
4518
|
-
var BsCheckboxPropsSchema =
|
|
4519
|
-
switch:
|
|
4520
|
-
inline:
|
|
4521
|
-
reverse:
|
|
4522
|
-
indeterminate:
|
|
5098
|
+
var BsCheckboxPropsSchema = z43.object({
|
|
5099
|
+
switch: z43.boolean().optional(),
|
|
5100
|
+
inline: z43.boolean().optional(),
|
|
5101
|
+
reverse: z43.boolean().optional(),
|
|
5102
|
+
indeterminate: z43.boolean().optional(),
|
|
4523
5103
|
hint: DynamicTextSchema.optional()
|
|
4524
5104
|
});
|
|
4525
|
-
var BsRadioPropsSchema =
|
|
4526
|
-
inline:
|
|
4527
|
-
reverse:
|
|
4528
|
-
buttonGroup:
|
|
5105
|
+
var BsRadioPropsSchema = z43.object({
|
|
5106
|
+
inline: z43.boolean().optional(),
|
|
5107
|
+
reverse: z43.boolean().optional(),
|
|
5108
|
+
buttonGroup: z43.boolean().optional(),
|
|
4529
5109
|
buttonSize: BsSizeSchema.optional(),
|
|
4530
5110
|
hint: DynamicTextSchema.optional()
|
|
4531
5111
|
});
|
|
4532
|
-
var BsMultiCheckboxPropsSchema =
|
|
4533
|
-
switch:
|
|
4534
|
-
inline:
|
|
4535
|
-
reverse:
|
|
5112
|
+
var BsMultiCheckboxPropsSchema = z43.object({
|
|
5113
|
+
switch: z43.boolean().optional(),
|
|
5114
|
+
inline: z43.boolean().optional(),
|
|
5115
|
+
reverse: z43.boolean().optional(),
|
|
4536
5116
|
hint: DynamicTextSchema.optional()
|
|
4537
5117
|
});
|
|
4538
|
-
var BsTogglePropsSchema =
|
|
5118
|
+
var BsTogglePropsSchema = z43.object({
|
|
4539
5119
|
size: BsSizeSchema.optional(),
|
|
4540
|
-
reverse:
|
|
4541
|
-
inline:
|
|
5120
|
+
reverse: z43.boolean().optional(),
|
|
5121
|
+
inline: z43.boolean().optional(),
|
|
4542
5122
|
hint: DynamicTextSchema.optional()
|
|
4543
5123
|
});
|
|
4544
5124
|
var BsDatepickerPropsSchema = BsFormFieldPropsSchema.extend({
|
|
4545
|
-
useNgBootstrap:
|
|
4546
|
-
displayMonths:
|
|
4547
|
-
navigation:
|
|
4548
|
-
outsideDays:
|
|
4549
|
-
showWeekNumbers:
|
|
5125
|
+
useNgBootstrap: z43.boolean().optional(),
|
|
5126
|
+
displayMonths: z43.number().positive().optional(),
|
|
5127
|
+
navigation: z43.enum(["select", "arrows", "none"]).optional(),
|
|
5128
|
+
outsideDays: z43.enum(["visible", "collapsed", "hidden"]).optional(),
|
|
5129
|
+
showWeekNumbers: z43.boolean().optional(),
|
|
4550
5130
|
placeholder: DynamicTextSchema.optional()
|
|
4551
5131
|
});
|
|
4552
|
-
var BsSliderPropsSchema =
|
|
4553
|
-
showValue:
|
|
4554
|
-
valuePrefix:
|
|
4555
|
-
valueSuffix:
|
|
5132
|
+
var BsSliderPropsSchema = z43.object({
|
|
5133
|
+
showValue: z43.boolean().optional(),
|
|
5134
|
+
valuePrefix: z43.string().optional(),
|
|
5135
|
+
valueSuffix: z43.string().optional(),
|
|
4556
5136
|
hint: DynamicTextSchema.optional(),
|
|
4557
|
-
min:
|
|
4558
|
-
max:
|
|
4559
|
-
step:
|
|
5137
|
+
min: z43.number().optional(),
|
|
5138
|
+
max: z43.number().optional(),
|
|
5139
|
+
step: z43.number().positive().optional()
|
|
4560
5140
|
});
|
|
4561
|
-
var BsButtonPropsSchema =
|
|
5141
|
+
var BsButtonPropsSchema = z43.object({
|
|
4562
5142
|
variant: BsButtonVariantSchema.optional(),
|
|
4563
|
-
outline:
|
|
5143
|
+
outline: z43.boolean().optional(),
|
|
4564
5144
|
size: BsSizeSchema.optional(),
|
|
4565
|
-
block:
|
|
4566
|
-
active:
|
|
4567
|
-
type:
|
|
5145
|
+
block: z43.boolean().optional(),
|
|
5146
|
+
active: z43.boolean().optional(),
|
|
5147
|
+
type: z43.enum(["button", "submit", "reset"]).optional()
|
|
4568
5148
|
});
|
|
4569
5149
|
|
|
4570
5150
|
// internal/dynamic-forms-zod/bootstrap/src/fields/index.ts
|
|
4571
|
-
import { z as
|
|
5151
|
+
import { z as z44 } from "zod";
|
|
4572
5152
|
var BsValueFieldBase = BaseFieldDefSchema.merge(FieldWithValidationSchema);
|
|
4573
|
-
var
|
|
4574
|
-
type:
|
|
4575
|
-
|
|
5153
|
+
var BsInputFieldSchemaObject = BsValueFieldBase.extend({
|
|
5154
|
+
type: z44.literal("input"),
|
|
5155
|
+
nullable: z44.boolean().optional(),
|
|
5156
|
+
value: z44.string().nullable().optional(),
|
|
4576
5157
|
placeholder: DynamicTextSchema.optional(),
|
|
4577
5158
|
props: BsInputPropsSchema.optional()
|
|
4578
5159
|
});
|
|
4579
|
-
var
|
|
4580
|
-
|
|
4581
|
-
|
|
5160
|
+
var BsInputFieldSchema = BsInputFieldSchemaObject.superRefine(nullableValueRefine);
|
|
5161
|
+
var BsTextareaFieldSchemaObject = BsValueFieldBase.extend({
|
|
5162
|
+
type: z44.literal("textarea"),
|
|
5163
|
+
nullable: z44.boolean().optional(),
|
|
5164
|
+
value: z44.string().nullable().optional(),
|
|
4582
5165
|
placeholder: DynamicTextSchema.optional(),
|
|
4583
5166
|
props: BsTextareaPropsSchema.optional()
|
|
4584
5167
|
});
|
|
4585
|
-
var
|
|
4586
|
-
|
|
4587
|
-
|
|
5168
|
+
var BsTextareaFieldSchema = BsTextareaFieldSchemaObject.superRefine(nullableValueRefine);
|
|
5169
|
+
var BsSelectFieldSchemaObject = BsValueFieldBase.extend({
|
|
5170
|
+
type: z44.literal("select"),
|
|
5171
|
+
nullable: z44.boolean().optional(),
|
|
5172
|
+
value: z44.string().nullable().optional(),
|
|
4588
5173
|
// Bootstrap select only supports strings
|
|
4589
5174
|
placeholder: DynamicTextSchema.optional(),
|
|
4590
5175
|
options: FieldOptionsSchema,
|
|
4591
5176
|
props: BsSelectPropsSchema.optional()
|
|
4592
5177
|
});
|
|
5178
|
+
var BsSelectFieldSchema = BsSelectFieldSchemaObject.superRefine(nullableValueRefine);
|
|
4593
5179
|
var BsCheckboxFieldSchema = BsValueFieldBase.extend({
|
|
4594
|
-
type:
|
|
4595
|
-
value:
|
|
5180
|
+
type: z44.literal("checkbox"),
|
|
5181
|
+
value: z44.boolean().optional(),
|
|
4596
5182
|
placeholder: DynamicTextSchema.optional(),
|
|
4597
5183
|
props: BsCheckboxPropsSchema.optional()
|
|
4598
5184
|
});
|
|
4599
|
-
var
|
|
4600
|
-
type:
|
|
4601
|
-
|
|
5185
|
+
var BsRadioFieldSchemaObject = BsValueFieldBase.extend({
|
|
5186
|
+
type: z44.literal("radio"),
|
|
5187
|
+
nullable: z44.boolean().optional(),
|
|
5188
|
+
value: z44.unknown().nullable().optional(),
|
|
4602
5189
|
placeholder: DynamicTextSchema.optional(),
|
|
4603
5190
|
options: FieldOptionsSchema,
|
|
4604
5191
|
props: BsRadioPropsSchema.optional()
|
|
4605
5192
|
});
|
|
4606
|
-
var
|
|
4607
|
-
|
|
4608
|
-
|
|
5193
|
+
var BsRadioFieldSchema = BsRadioFieldSchemaObject.superRefine(nullableValueRefine);
|
|
5194
|
+
var BsMultiCheckboxFieldSchemaObject = BsValueFieldBase.extend({
|
|
5195
|
+
type: z44.literal("multi-checkbox"),
|
|
5196
|
+
nullable: z44.boolean().optional(),
|
|
5197
|
+
value: z44.array(z44.unknown()).nullable().optional(),
|
|
4609
5198
|
placeholder: DynamicTextSchema.optional(),
|
|
4610
5199
|
options: FieldOptionsSchema,
|
|
4611
5200
|
props: BsMultiCheckboxPropsSchema.optional()
|
|
4612
5201
|
});
|
|
5202
|
+
var BsMultiCheckboxFieldSchema = BsMultiCheckboxFieldSchemaObject.superRefine(nullableValueRefine);
|
|
4613
5203
|
var BsToggleFieldSchema = BsValueFieldBase.extend({
|
|
4614
|
-
type:
|
|
4615
|
-
value:
|
|
5204
|
+
type: z44.literal("toggle"),
|
|
5205
|
+
value: z44.boolean().optional(),
|
|
4616
5206
|
placeholder: DynamicTextSchema.optional(),
|
|
4617
5207
|
props: BsTogglePropsSchema.optional()
|
|
4618
5208
|
});
|
|
4619
|
-
var
|
|
4620
|
-
type:
|
|
4621
|
-
|
|
4622
|
-
|
|
4623
|
-
|
|
4624
|
-
|
|
5209
|
+
var BsDatepickerFieldSchemaObject = BsValueFieldBase.extend({
|
|
5210
|
+
type: z44.literal("datepicker"),
|
|
5211
|
+
nullable: z44.boolean().optional(),
|
|
5212
|
+
value: z44.union([z44.string(), z44.null()]).optional(),
|
|
5213
|
+
minDate: z44.union([z44.string(), z44.null()]).optional(),
|
|
5214
|
+
maxDate: z44.union([z44.string(), z44.null()]).optional(),
|
|
5215
|
+
startAt: z44.union([z44.string(), z44.null()]).optional(),
|
|
4625
5216
|
placeholder: DynamicTextSchema.optional(),
|
|
4626
5217
|
props: BsDatepickerPropsSchema.optional()
|
|
4627
5218
|
});
|
|
4628
|
-
var
|
|
4629
|
-
|
|
4630
|
-
|
|
4631
|
-
|
|
4632
|
-
|
|
4633
|
-
|
|
5219
|
+
var BsDatepickerFieldSchema = BsDatepickerFieldSchemaObject.superRefine(nullableValueRefine);
|
|
5220
|
+
var BsSliderFieldSchemaObject = BsValueFieldBase.extend({
|
|
5221
|
+
type: z44.literal("slider"),
|
|
5222
|
+
nullable: z44.boolean().optional(),
|
|
5223
|
+
value: z44.number().nullable().optional(),
|
|
5224
|
+
minValue: z44.number().optional(),
|
|
5225
|
+
maxValue: z44.number().optional(),
|
|
5226
|
+
step: z44.number().positive().optional(),
|
|
4634
5227
|
placeholder: DynamicTextSchema.optional(),
|
|
4635
5228
|
props: BsSliderPropsSchema.optional()
|
|
4636
5229
|
});
|
|
5230
|
+
var BsSliderFieldSchema = BsSliderFieldSchemaObject.superRefine(nullableValueRefine);
|
|
4637
5231
|
var BsButtonFieldSchema = BaseFieldDefSchema.extend({
|
|
4638
|
-
type:
|
|
4639
|
-
event:
|
|
4640
|
-
eventArgs:
|
|
5232
|
+
type: z44.literal("button"),
|
|
5233
|
+
event: z44.string().optional(),
|
|
5234
|
+
eventArgs: z44.array(z44.union([z44.string(), z44.number(), z44.boolean(), z44.null(), z44.undefined()])).optional(),
|
|
4641
5235
|
props: BsButtonPropsSchema.optional(),
|
|
4642
5236
|
logic: LogicArraySchema.optional()
|
|
4643
5237
|
});
|
|
4644
5238
|
var BsSubmitButtonFieldSchema = BaseFieldDefSchema.extend({
|
|
4645
|
-
type:
|
|
5239
|
+
type: z44.literal("submit"),
|
|
4646
5240
|
props: BsButtonPropsSchema.optional(),
|
|
4647
5241
|
logic: LogicArraySchema.optional()
|
|
4648
5242
|
});
|
|
4649
5243
|
var BsNextButtonFieldSchema = BaseFieldDefSchema.extend({
|
|
4650
|
-
type:
|
|
5244
|
+
type: z44.literal("next"),
|
|
4651
5245
|
props: BsButtonPropsSchema.optional(),
|
|
4652
5246
|
logic: LogicArraySchema.optional()
|
|
4653
5247
|
});
|
|
4654
5248
|
var BsPreviousButtonFieldSchema = BaseFieldDefSchema.extend({
|
|
4655
|
-
type:
|
|
5249
|
+
type: z44.literal("previous"),
|
|
4656
5250
|
props: BsButtonPropsSchema.optional()
|
|
4657
5251
|
});
|
|
4658
5252
|
var BsAddArrayItemButtonFieldSchema = BaseFieldDefSchema.extend({
|
|
4659
|
-
type:
|
|
4660
|
-
arrayKey:
|
|
5253
|
+
type: z44.literal("addArrayItem"),
|
|
5254
|
+
arrayKey: z44.string().optional(),
|
|
4661
5255
|
props: BsButtonPropsSchema.optional()
|
|
4662
5256
|
});
|
|
4663
5257
|
var BsRemoveArrayItemButtonFieldSchema = BaseFieldDefSchema.extend({
|
|
4664
|
-
type:
|
|
4665
|
-
arrayKey:
|
|
5258
|
+
type: z44.literal("removeArrayItem"),
|
|
5259
|
+
arrayKey: z44.string().optional(),
|
|
4666
5260
|
props: BsButtonPropsSchema.optional()
|
|
4667
5261
|
});
|
|
4668
5262
|
|
|
4669
5263
|
// internal/dynamic-forms-zod/bootstrap/src/bs-leaf-field.schema.ts
|
|
4670
|
-
import { z as
|
|
4671
|
-
var BsLeafFieldSchema =
|
|
5264
|
+
import { z as z45 } from "zod";
|
|
5265
|
+
var BsLeafFieldSchema = z45.discriminatedUnion("type", [
|
|
4672
5266
|
TextFieldSchema,
|
|
4673
5267
|
HiddenFieldSchema,
|
|
4674
|
-
|
|
4675
|
-
|
|
4676
|
-
|
|
5268
|
+
BsInputFieldSchemaObject,
|
|
5269
|
+
BsTextareaFieldSchemaObject,
|
|
5270
|
+
BsSelectFieldSchemaObject,
|
|
4677
5271
|
BsCheckboxFieldSchema,
|
|
4678
|
-
|
|
4679
|
-
|
|
5272
|
+
BsRadioFieldSchemaObject,
|
|
5273
|
+
BsMultiCheckboxFieldSchemaObject,
|
|
4680
5274
|
BsToggleFieldSchema,
|
|
4681
|
-
|
|
4682
|
-
|
|
5275
|
+
BsDatepickerFieldSchemaObject,
|
|
5276
|
+
BsSliderFieldSchemaObject,
|
|
4683
5277
|
BsButtonFieldSchema,
|
|
4684
5278
|
BsSubmitButtonFieldSchema,
|
|
4685
5279
|
BsNextButtonFieldSchema,
|
|
4686
5280
|
BsPreviousButtonFieldSchema,
|
|
4687
5281
|
BsAddArrayItemButtonFieldSchema,
|
|
4688
5282
|
BsRemoveArrayItemButtonFieldSchema
|
|
4689
|
-
]);
|
|
5283
|
+
]).superRefine(nullableValueRefine);
|
|
4690
5284
|
|
|
4691
5285
|
// internal/dynamic-forms-zod/bootstrap/src/bs-form-config.schema.ts
|
|
4692
|
-
import { z as
|
|
5286
|
+
import { z as z46 } from "zod";
|
|
4693
5287
|
var containerSchemas2 = createContainerSchemas({
|
|
4694
5288
|
leafFieldSchema: BsLeafFieldSchema
|
|
4695
5289
|
});
|
|
@@ -4698,186 +5292,200 @@ var BsRowFieldSchema = containerSchemas2.RowFieldSchema;
|
|
|
4698
5292
|
var BsGroupFieldSchema = containerSchemas2.GroupFieldSchema;
|
|
4699
5293
|
var BsArrayFieldSchema = containerSchemas2.ArrayFieldSchema;
|
|
4700
5294
|
var BsFieldSchema = containerSchemas2.AllFieldsSchema;
|
|
4701
|
-
var BsFormDefaultPropsSchema =
|
|
5295
|
+
var BsFormDefaultPropsSchema = z46.object({
|
|
4702
5296
|
size: BsSizeSchema.optional(),
|
|
4703
|
-
floatingLabel:
|
|
5297
|
+
floatingLabel: z46.boolean().optional()
|
|
4704
5298
|
});
|
|
4705
5299
|
var BsFormConfigSchema = createFormConfigSchema(BsFieldSchema, BsFormDefaultPropsSchema);
|
|
4706
5300
|
|
|
4707
5301
|
// internal/dynamic-forms-zod/primeng/src/props/index.ts
|
|
4708
|
-
import { z as
|
|
4709
|
-
var PrimeSeveritySchema =
|
|
4710
|
-
var PrimeCommonPropsSchema =
|
|
4711
|
-
styleClass:
|
|
5302
|
+
import { z as z47 } from "zod";
|
|
5303
|
+
var PrimeSeveritySchema = z47.enum(["primary", "secondary", "success", "info", "warn", "danger", "help", "contrast"]);
|
|
5304
|
+
var PrimeCommonPropsSchema = z47.object({
|
|
5305
|
+
styleClass: z47.string().optional(),
|
|
4712
5306
|
hint: DynamicTextSchema.optional()
|
|
4713
5307
|
});
|
|
4714
5308
|
var PrimeInputPropsSchema = PrimeCommonPropsSchema.extend({
|
|
4715
|
-
type:
|
|
5309
|
+
type: z47.enum(["text", "email", "password", "number", "tel", "url"]).optional(),
|
|
4716
5310
|
placeholder: DynamicTextSchema.optional(),
|
|
4717
|
-
size:
|
|
4718
|
-
variant:
|
|
5311
|
+
size: z47.enum(["small", "large"]).optional(),
|
|
5312
|
+
variant: z47.enum(["outlined", "filled"]).optional()
|
|
4719
5313
|
});
|
|
4720
5314
|
var PrimeCheckboxPropsSchema = PrimeCommonPropsSchema.extend({
|
|
4721
|
-
binary:
|
|
4722
|
-
trueValue:
|
|
4723
|
-
falseValue:
|
|
5315
|
+
binary: z47.boolean().optional(),
|
|
5316
|
+
trueValue: z47.unknown().optional(),
|
|
5317
|
+
falseValue: z47.unknown().optional()
|
|
4724
5318
|
});
|
|
4725
5319
|
var PrimeRadioPropsSchema = PrimeCommonPropsSchema.extend({
|
|
4726
|
-
name:
|
|
5320
|
+
name: z47.string().optional()
|
|
4727
5321
|
});
|
|
4728
5322
|
var PrimeSelectPropsSchema = PrimeCommonPropsSchema.extend({
|
|
4729
|
-
multiple:
|
|
4730
|
-
filter:
|
|
5323
|
+
multiple: z47.boolean().optional(),
|
|
5324
|
+
filter: z47.boolean().optional(),
|
|
4731
5325
|
placeholder: DynamicTextSchema.optional(),
|
|
4732
|
-
showClear:
|
|
5326
|
+
showClear: z47.boolean().optional()
|
|
4733
5327
|
});
|
|
4734
5328
|
var PrimeMultiCheckboxPropsSchema = PrimeCommonPropsSchema;
|
|
4735
5329
|
var PrimeDatepickerPropsSchema = PrimeCommonPropsSchema.extend({
|
|
4736
|
-
dateFormat:
|
|
4737
|
-
inline:
|
|
4738
|
-
showIcon:
|
|
4739
|
-
showButtonBar:
|
|
4740
|
-
selectionMode:
|
|
4741
|
-
touchUI:
|
|
4742
|
-
view:
|
|
5330
|
+
dateFormat: z47.string().optional(),
|
|
5331
|
+
inline: z47.boolean().optional(),
|
|
5332
|
+
showIcon: z47.boolean().optional(),
|
|
5333
|
+
showButtonBar: z47.boolean().optional(),
|
|
5334
|
+
selectionMode: z47.enum(["single", "multiple", "range"]).optional(),
|
|
5335
|
+
touchUI: z47.boolean().optional(),
|
|
5336
|
+
view: z47.enum(["date", "month", "year"]).optional(),
|
|
4743
5337
|
placeholder: DynamicTextSchema.optional()
|
|
4744
5338
|
});
|
|
4745
5339
|
var PrimeTextareaPropsSchema = PrimeCommonPropsSchema.extend({
|
|
4746
|
-
rows:
|
|
4747
|
-
autoResize:
|
|
4748
|
-
maxlength:
|
|
5340
|
+
rows: z47.number().positive().optional(),
|
|
5341
|
+
autoResize: z47.boolean().optional(),
|
|
5342
|
+
maxlength: z47.number().positive().optional(),
|
|
4749
5343
|
placeholder: DynamicTextSchema.optional()
|
|
4750
5344
|
});
|
|
4751
5345
|
var PrimeSliderPropsSchema = PrimeCommonPropsSchema.extend({
|
|
4752
|
-
min:
|
|
4753
|
-
max:
|
|
4754
|
-
step:
|
|
4755
|
-
range:
|
|
4756
|
-
orientation:
|
|
5346
|
+
min: z47.number().optional(),
|
|
5347
|
+
max: z47.number().optional(),
|
|
5348
|
+
step: z47.number().positive().optional(),
|
|
5349
|
+
range: z47.boolean().optional(),
|
|
5350
|
+
orientation: z47.enum(["horizontal", "vertical"]).optional()
|
|
4757
5351
|
});
|
|
4758
5352
|
var PrimeTogglePropsSchema = PrimeCommonPropsSchema;
|
|
4759
|
-
var PrimeButtonPropsSchema =
|
|
5353
|
+
var PrimeButtonPropsSchema = z47.object({
|
|
4760
5354
|
severity: PrimeSeveritySchema.optional(),
|
|
4761
|
-
text:
|
|
4762
|
-
outlined:
|
|
4763
|
-
raised:
|
|
4764
|
-
rounded:
|
|
4765
|
-
icon:
|
|
4766
|
-
iconPos:
|
|
4767
|
-
type:
|
|
5355
|
+
text: z47.boolean().optional(),
|
|
5356
|
+
outlined: z47.boolean().optional(),
|
|
5357
|
+
raised: z47.boolean().optional(),
|
|
5358
|
+
rounded: z47.boolean().optional(),
|
|
5359
|
+
icon: z47.string().optional(),
|
|
5360
|
+
iconPos: z47.enum(["left", "right", "top", "bottom"]).optional(),
|
|
5361
|
+
type: z47.enum(["button", "submit", "reset"]).optional()
|
|
4768
5362
|
});
|
|
4769
5363
|
|
|
4770
5364
|
// internal/dynamic-forms-zod/primeng/src/fields/index.ts
|
|
4771
|
-
import { z as
|
|
5365
|
+
import { z as z48 } from "zod";
|
|
4772
5366
|
var PrimeValueFieldBase = BaseFieldDefSchema.merge(FieldWithValidationSchema);
|
|
4773
|
-
var
|
|
4774
|
-
type:
|
|
4775
|
-
|
|
5367
|
+
var PrimeInputFieldSchemaObject = PrimeValueFieldBase.extend({
|
|
5368
|
+
type: z48.literal("input"),
|
|
5369
|
+
nullable: z48.boolean().optional(),
|
|
5370
|
+
value: z48.string().nullable().optional(),
|
|
4776
5371
|
placeholder: DynamicTextSchema.optional(),
|
|
4777
5372
|
props: PrimeInputPropsSchema.optional()
|
|
4778
5373
|
});
|
|
5374
|
+
var PrimeInputFieldSchema = PrimeInputFieldSchemaObject.superRefine(nullableValueRefine);
|
|
4779
5375
|
var PrimeCheckboxFieldSchema = PrimeValueFieldBase.extend({
|
|
4780
|
-
type:
|
|
4781
|
-
value:
|
|
5376
|
+
type: z48.literal("checkbox"),
|
|
5377
|
+
value: z48.boolean().optional(),
|
|
4782
5378
|
placeholder: DynamicTextSchema.optional(),
|
|
4783
5379
|
props: PrimeCheckboxPropsSchema.optional()
|
|
4784
5380
|
});
|
|
4785
|
-
var
|
|
4786
|
-
type:
|
|
4787
|
-
|
|
5381
|
+
var PrimeRadioFieldSchemaObject = PrimeValueFieldBase.extend({
|
|
5382
|
+
type: z48.literal("radio"),
|
|
5383
|
+
nullable: z48.boolean().optional(),
|
|
5384
|
+
value: z48.unknown().nullable().optional(),
|
|
4788
5385
|
placeholder: DynamicTextSchema.optional(),
|
|
4789
5386
|
options: FieldOptionsSchema,
|
|
4790
5387
|
props: PrimeRadioPropsSchema.optional()
|
|
4791
5388
|
});
|
|
4792
|
-
var
|
|
4793
|
-
|
|
4794
|
-
|
|
5389
|
+
var PrimeRadioFieldSchema = PrimeRadioFieldSchemaObject.superRefine(nullableValueRefine);
|
|
5390
|
+
var PrimeSelectFieldSchemaObject = PrimeValueFieldBase.extend({
|
|
5391
|
+
type: z48.literal("select"),
|
|
5392
|
+
nullable: z48.boolean().optional(),
|
|
5393
|
+
value: z48.unknown().nullable().optional(),
|
|
4795
5394
|
placeholder: DynamicTextSchema.optional(),
|
|
4796
5395
|
options: FieldOptionsSchema,
|
|
4797
5396
|
props: PrimeSelectPropsSchema.optional()
|
|
4798
5397
|
});
|
|
4799
|
-
var
|
|
4800
|
-
|
|
4801
|
-
|
|
5398
|
+
var PrimeSelectFieldSchema = PrimeSelectFieldSchemaObject.superRefine(nullableValueRefine);
|
|
5399
|
+
var PrimeMultiCheckboxFieldSchemaObject = PrimeValueFieldBase.extend({
|
|
5400
|
+
type: z48.literal("multi-checkbox"),
|
|
5401
|
+
nullable: z48.boolean().optional(),
|
|
5402
|
+
value: z48.array(z48.unknown()).nullable().optional(),
|
|
4802
5403
|
placeholder: DynamicTextSchema.optional(),
|
|
4803
5404
|
options: FieldOptionsSchema,
|
|
4804
5405
|
props: PrimeMultiCheckboxPropsSchema.optional()
|
|
4805
5406
|
});
|
|
4806
|
-
var
|
|
4807
|
-
|
|
4808
|
-
|
|
4809
|
-
|
|
4810
|
-
|
|
4811
|
-
|
|
5407
|
+
var PrimeMultiCheckboxFieldSchema = PrimeMultiCheckboxFieldSchemaObject.superRefine(nullableValueRefine);
|
|
5408
|
+
var PrimeDatepickerFieldSchemaObject = PrimeValueFieldBase.extend({
|
|
5409
|
+
type: z48.literal("datepicker"),
|
|
5410
|
+
nullable: z48.boolean().optional(),
|
|
5411
|
+
value: z48.union([z48.string(), z48.null()]).optional(),
|
|
5412
|
+
minDate: z48.union([z48.string(), z48.null()]).optional(),
|
|
5413
|
+
maxDate: z48.union([z48.string(), z48.null()]).optional(),
|
|
5414
|
+
startAt: z48.union([z48.string(), z48.null()]).optional(),
|
|
4812
5415
|
placeholder: DynamicTextSchema.optional(),
|
|
4813
5416
|
props: PrimeDatepickerPropsSchema.optional()
|
|
4814
5417
|
});
|
|
4815
|
-
var
|
|
4816
|
-
|
|
4817
|
-
|
|
5418
|
+
var PrimeDatepickerFieldSchema = PrimeDatepickerFieldSchemaObject.superRefine(nullableValueRefine);
|
|
5419
|
+
var PrimeTextareaFieldSchemaObject = PrimeValueFieldBase.extend({
|
|
5420
|
+
type: z48.literal("textarea"),
|
|
5421
|
+
nullable: z48.boolean().optional(),
|
|
5422
|
+
value: z48.string().nullable().optional(),
|
|
4818
5423
|
placeholder: DynamicTextSchema.optional(),
|
|
4819
5424
|
props: PrimeTextareaPropsSchema.optional()
|
|
4820
5425
|
});
|
|
4821
|
-
var
|
|
4822
|
-
|
|
4823
|
-
|
|
4824
|
-
|
|
4825
|
-
|
|
4826
|
-
|
|
5426
|
+
var PrimeTextareaFieldSchema = PrimeTextareaFieldSchemaObject.superRefine(nullableValueRefine);
|
|
5427
|
+
var PrimeSliderFieldSchemaObject = PrimeValueFieldBase.extend({
|
|
5428
|
+
type: z48.literal("slider"),
|
|
5429
|
+
nullable: z48.boolean().optional(),
|
|
5430
|
+
value: z48.number().nullable().optional(),
|
|
5431
|
+
minValue: z48.number().optional(),
|
|
5432
|
+
maxValue: z48.number().optional(),
|
|
5433
|
+
step: z48.number().positive().optional(),
|
|
4827
5434
|
placeholder: DynamicTextSchema.optional(),
|
|
4828
5435
|
props: PrimeSliderPropsSchema.optional()
|
|
4829
5436
|
});
|
|
5437
|
+
var PrimeSliderFieldSchema = PrimeSliderFieldSchemaObject.superRefine(nullableValueRefine);
|
|
4830
5438
|
var PrimeToggleFieldSchema = PrimeValueFieldBase.extend({
|
|
4831
|
-
type:
|
|
4832
|
-
value:
|
|
5439
|
+
type: z48.literal("toggle"),
|
|
5440
|
+
value: z48.boolean().optional(),
|
|
4833
5441
|
placeholder: DynamicTextSchema.optional(),
|
|
4834
5442
|
props: PrimeTogglePropsSchema.optional()
|
|
4835
5443
|
});
|
|
4836
5444
|
var PrimeButtonFieldSchema = BaseFieldDefSchema.extend({
|
|
4837
|
-
type:
|
|
4838
|
-
event:
|
|
4839
|
-
eventArgs:
|
|
5445
|
+
type: z48.literal("button"),
|
|
5446
|
+
event: z48.string().optional(),
|
|
5447
|
+
eventArgs: z48.array(z48.union([z48.string(), z48.number(), z48.boolean(), z48.null(), z48.undefined()])).optional(),
|
|
4840
5448
|
props: PrimeButtonPropsSchema.optional(),
|
|
4841
5449
|
logic: LogicArraySchema.optional()
|
|
4842
5450
|
});
|
|
4843
5451
|
var PrimeSubmitButtonFieldSchema = BaseFieldDefSchema.extend({
|
|
4844
|
-
type:
|
|
5452
|
+
type: z48.literal("submit"),
|
|
4845
5453
|
props: PrimeButtonPropsSchema.optional(),
|
|
4846
5454
|
logic: LogicArraySchema.optional()
|
|
4847
5455
|
});
|
|
4848
5456
|
var PrimeNextButtonFieldSchema = BaseFieldDefSchema.extend({
|
|
4849
|
-
type:
|
|
5457
|
+
type: z48.literal("next"),
|
|
4850
5458
|
props: PrimeButtonPropsSchema.optional(),
|
|
4851
5459
|
logic: LogicArraySchema.optional()
|
|
4852
5460
|
});
|
|
4853
5461
|
var PrimePreviousButtonFieldSchema = BaseFieldDefSchema.extend({
|
|
4854
|
-
type:
|
|
5462
|
+
type: z48.literal("previous"),
|
|
4855
5463
|
props: PrimeButtonPropsSchema.optional()
|
|
4856
5464
|
});
|
|
4857
5465
|
var PrimeAddArrayItemButtonFieldSchema = BaseFieldDefSchema.extend({
|
|
4858
|
-
type:
|
|
4859
|
-
arrayKey:
|
|
5466
|
+
type: z48.literal("addArrayItem"),
|
|
5467
|
+
arrayKey: z48.string().optional(),
|
|
4860
5468
|
props: PrimeButtonPropsSchema.optional()
|
|
4861
5469
|
});
|
|
4862
5470
|
var PrimeRemoveArrayItemButtonFieldSchema = BaseFieldDefSchema.extend({
|
|
4863
|
-
type:
|
|
4864
|
-
arrayKey:
|
|
5471
|
+
type: z48.literal("removeArrayItem"),
|
|
5472
|
+
arrayKey: z48.string().optional(),
|
|
4865
5473
|
props: PrimeButtonPropsSchema.optional()
|
|
4866
5474
|
});
|
|
4867
5475
|
|
|
4868
5476
|
// internal/dynamic-forms-zod/primeng/src/prime-leaf-field.schema.ts
|
|
4869
|
-
import { z as
|
|
4870
|
-
var PrimeLeafFieldSchema =
|
|
5477
|
+
import { z as z49 } from "zod";
|
|
5478
|
+
var PrimeLeafFieldSchema = z49.discriminatedUnion("type", [
|
|
4871
5479
|
TextFieldSchema,
|
|
4872
5480
|
HiddenFieldSchema,
|
|
4873
|
-
|
|
5481
|
+
PrimeInputFieldSchemaObject,
|
|
4874
5482
|
PrimeCheckboxFieldSchema,
|
|
4875
|
-
|
|
4876
|
-
|
|
4877
|
-
|
|
4878
|
-
|
|
4879
|
-
|
|
4880
|
-
|
|
5483
|
+
PrimeRadioFieldSchemaObject,
|
|
5484
|
+
PrimeSelectFieldSchemaObject,
|
|
5485
|
+
PrimeMultiCheckboxFieldSchemaObject,
|
|
5486
|
+
PrimeDatepickerFieldSchemaObject,
|
|
5487
|
+
PrimeTextareaFieldSchemaObject,
|
|
5488
|
+
PrimeSliderFieldSchemaObject,
|
|
4881
5489
|
PrimeToggleFieldSchema,
|
|
4882
5490
|
PrimeButtonFieldSchema,
|
|
4883
5491
|
PrimeSubmitButtonFieldSchema,
|
|
@@ -4885,10 +5493,10 @@ var PrimeLeafFieldSchema = z48.discriminatedUnion("type", [
|
|
|
4885
5493
|
PrimePreviousButtonFieldSchema,
|
|
4886
5494
|
PrimeAddArrayItemButtonFieldSchema,
|
|
4887
5495
|
PrimeRemoveArrayItemButtonFieldSchema
|
|
4888
|
-
]);
|
|
5496
|
+
]).superRefine(nullableValueRefine);
|
|
4889
5497
|
|
|
4890
5498
|
// internal/dynamic-forms-zod/primeng/src/prime-form-config.schema.ts
|
|
4891
|
-
import { z as
|
|
5499
|
+
import { z as z50 } from "zod";
|
|
4892
5500
|
var containerSchemas3 = createContainerSchemas({
|
|
4893
5501
|
leafFieldSchema: PrimeLeafFieldSchema
|
|
4894
5502
|
});
|
|
@@ -4897,240 +5505,254 @@ var PrimeRowFieldSchema = containerSchemas3.RowFieldSchema;
|
|
|
4897
5505
|
var PrimeGroupFieldSchema = containerSchemas3.GroupFieldSchema;
|
|
4898
5506
|
var PrimeArrayFieldSchema = containerSchemas3.ArrayFieldSchema;
|
|
4899
5507
|
var PrimeFieldSchema = containerSchemas3.AllFieldsSchema;
|
|
4900
|
-
var PrimeFormDefaultPropsSchema =
|
|
4901
|
-
styleClass:
|
|
5508
|
+
var PrimeFormDefaultPropsSchema = z50.object({
|
|
5509
|
+
styleClass: z50.string().optional()
|
|
4902
5510
|
});
|
|
4903
5511
|
var PrimeFormConfigSchema = createFormConfigSchema(PrimeFieldSchema, PrimeFormDefaultPropsSchema);
|
|
4904
5512
|
|
|
4905
5513
|
// internal/dynamic-forms-zod/ionic/src/props/index.ts
|
|
4906
|
-
import { z as
|
|
4907
|
-
var IonicColorSchema =
|
|
4908
|
-
var IonicLabelPlacementSchema =
|
|
4909
|
-
var IonicJustifySchema =
|
|
4910
|
-
var IonicFillSchema =
|
|
4911
|
-
var IonicInputPropsSchema =
|
|
4912
|
-
fill:
|
|
4913
|
-
shape:
|
|
5514
|
+
import { z as z51 } from "zod";
|
|
5515
|
+
var IonicColorSchema = z51.enum(["primary", "secondary", "tertiary", "success", "warning", "danger", "light", "medium", "dark"]);
|
|
5516
|
+
var IonicLabelPlacementSchema = z51.enum(["start", "end", "fixed", "stacked", "floating"]);
|
|
5517
|
+
var IonicJustifySchema = z51.enum(["start", "end", "space-between"]);
|
|
5518
|
+
var IonicFillSchema = z51.enum(["solid", "outline", "clear", "default"]);
|
|
5519
|
+
var IonicInputPropsSchema = z51.object({
|
|
5520
|
+
fill: z51.enum(["solid", "outline"]).optional(),
|
|
5521
|
+
shape: z51.literal("round").optional(),
|
|
4914
5522
|
labelPlacement: IonicLabelPlacementSchema.optional(),
|
|
4915
5523
|
color: IonicColorSchema.optional(),
|
|
4916
5524
|
hint: DynamicTextSchema.optional(),
|
|
4917
5525
|
errorText: DynamicTextSchema.optional(),
|
|
4918
|
-
counter:
|
|
4919
|
-
maxlength:
|
|
4920
|
-
clearInput:
|
|
4921
|
-
type:
|
|
5526
|
+
counter: z51.boolean().optional(),
|
|
5527
|
+
maxlength: z51.number().positive().optional(),
|
|
5528
|
+
clearInput: z51.boolean().optional(),
|
|
5529
|
+
type: z51.enum(["text", "email", "password", "number", "tel", "url"]).optional(),
|
|
4922
5530
|
placeholder: DynamicTextSchema.optional()
|
|
4923
5531
|
});
|
|
4924
|
-
var IonicCheckboxPropsSchema =
|
|
4925
|
-
labelPlacement:
|
|
5532
|
+
var IonicCheckboxPropsSchema = z51.object({
|
|
5533
|
+
labelPlacement: z51.enum(["start", "end", "fixed", "stacked"]).optional(),
|
|
4926
5534
|
justify: IonicJustifySchema.optional(),
|
|
4927
|
-
color:
|
|
4928
|
-
indeterminate:
|
|
5535
|
+
color: z51.enum(["primary", "secondary", "tertiary", "success", "warning", "danger"]).optional(),
|
|
5536
|
+
indeterminate: z51.boolean().optional(),
|
|
4929
5537
|
hint: DynamicTextSchema.optional()
|
|
4930
5538
|
});
|
|
4931
|
-
var IonicRadioPropsSchema =
|
|
4932
|
-
labelPlacement:
|
|
5539
|
+
var IonicRadioPropsSchema = z51.object({
|
|
5540
|
+
labelPlacement: z51.enum(["start", "end", "fixed", "stacked"]).optional(),
|
|
4933
5541
|
justify: IonicJustifySchema.optional(),
|
|
4934
|
-
color:
|
|
5542
|
+
color: z51.enum(["primary", "secondary", "tertiary", "success", "warning", "danger"]).optional(),
|
|
4935
5543
|
hint: DynamicTextSchema.optional()
|
|
4936
5544
|
});
|
|
4937
|
-
var IonicTogglePropsSchema =
|
|
4938
|
-
labelPlacement:
|
|
5545
|
+
var IonicTogglePropsSchema = z51.object({
|
|
5546
|
+
labelPlacement: z51.enum(["start", "end", "fixed", "stacked"]).optional(),
|
|
4939
5547
|
justify: IonicJustifySchema.optional(),
|
|
4940
|
-
color:
|
|
4941
|
-
enableOnOffLabels:
|
|
5548
|
+
color: z51.enum(["primary", "secondary", "tertiary", "success", "warning", "danger"]).optional(),
|
|
5549
|
+
enableOnOffLabels: z51.boolean().optional(),
|
|
4942
5550
|
hint: DynamicTextSchema.optional()
|
|
4943
5551
|
});
|
|
4944
|
-
var IonicSliderPropsSchema =
|
|
4945
|
-
min:
|
|
4946
|
-
max:
|
|
4947
|
-
step:
|
|
4948
|
-
dualKnobs:
|
|
4949
|
-
pin:
|
|
4950
|
-
ticks:
|
|
4951
|
-
snaps:
|
|
4952
|
-
color:
|
|
4953
|
-
labelPlacement:
|
|
5552
|
+
var IonicSliderPropsSchema = z51.object({
|
|
5553
|
+
min: z51.number().optional(),
|
|
5554
|
+
max: z51.number().optional(),
|
|
5555
|
+
step: z51.number().positive().optional(),
|
|
5556
|
+
dualKnobs: z51.boolean().optional(),
|
|
5557
|
+
pin: z51.boolean().optional(),
|
|
5558
|
+
ticks: z51.boolean().optional(),
|
|
5559
|
+
snaps: z51.boolean().optional(),
|
|
5560
|
+
color: z51.enum(["primary", "secondary", "tertiary", "success", "warning", "danger"]).optional(),
|
|
5561
|
+
labelPlacement: z51.enum(["start", "end", "fixed", "stacked"]).optional(),
|
|
4954
5562
|
hint: DynamicTextSchema.optional()
|
|
4955
5563
|
});
|
|
4956
|
-
var IonicDatepickerPropsSchema =
|
|
4957
|
-
presentation:
|
|
4958
|
-
multiple:
|
|
4959
|
-
preferWheel:
|
|
4960
|
-
showDefaultButtons:
|
|
4961
|
-
showDefaultTitle:
|
|
4962
|
-
showDefaultTimeLabel:
|
|
4963
|
-
showClearButton:
|
|
4964
|
-
doneText:
|
|
4965
|
-
cancelText:
|
|
4966
|
-
size:
|
|
4967
|
-
color:
|
|
5564
|
+
var IonicDatepickerPropsSchema = z51.object({
|
|
5565
|
+
presentation: z51.enum(["date", "date-time", "time", "time-date", "month", "month-year", "year"]).optional(),
|
|
5566
|
+
multiple: z51.boolean().optional(),
|
|
5567
|
+
preferWheel: z51.boolean().optional(),
|
|
5568
|
+
showDefaultButtons: z51.boolean().optional(),
|
|
5569
|
+
showDefaultTitle: z51.boolean().optional(),
|
|
5570
|
+
showDefaultTimeLabel: z51.boolean().optional(),
|
|
5571
|
+
showClearButton: z51.boolean().optional(),
|
|
5572
|
+
doneText: z51.string().optional(),
|
|
5573
|
+
cancelText: z51.string().optional(),
|
|
5574
|
+
size: z51.enum(["cover", "fixed"]).optional(),
|
|
5575
|
+
color: z51.enum(["primary", "secondary", "tertiary", "success", "warning", "danger"]).optional(),
|
|
4968
5576
|
hint: DynamicTextSchema.optional(),
|
|
4969
5577
|
placeholder: DynamicTextSchema.optional()
|
|
4970
5578
|
});
|
|
4971
|
-
var IonicSelectPropsSchema =
|
|
4972
|
-
multiple:
|
|
4973
|
-
interface:
|
|
4974
|
-
cancelText:
|
|
4975
|
-
okText:
|
|
5579
|
+
var IonicSelectPropsSchema = z51.object({
|
|
5580
|
+
multiple: z51.boolean().optional(),
|
|
5581
|
+
interface: z51.enum(["action-sheet", "popover", "alert"]).optional(),
|
|
5582
|
+
cancelText: z51.string().optional(),
|
|
5583
|
+
okText: z51.string().optional(),
|
|
4976
5584
|
placeholder: DynamicTextSchema.optional(),
|
|
4977
|
-
fill:
|
|
4978
|
-
shape:
|
|
5585
|
+
fill: z51.enum(["solid", "outline"]).optional(),
|
|
5586
|
+
shape: z51.literal("round").optional(),
|
|
4979
5587
|
labelPlacement: IonicLabelPlacementSchema.optional(),
|
|
4980
|
-
color:
|
|
5588
|
+
color: z51.enum(["primary", "secondary", "tertiary", "success", "warning", "danger"]).optional(),
|
|
4981
5589
|
hint: DynamicTextSchema.optional()
|
|
4982
5590
|
});
|
|
4983
|
-
var IonicTextareaPropsSchema =
|
|
4984
|
-
rows:
|
|
4985
|
-
autoGrow:
|
|
4986
|
-
maxlength:
|
|
4987
|
-
counter:
|
|
4988
|
-
fill:
|
|
4989
|
-
shape:
|
|
5591
|
+
var IonicTextareaPropsSchema = z51.object({
|
|
5592
|
+
rows: z51.number().positive().optional(),
|
|
5593
|
+
autoGrow: z51.boolean().optional(),
|
|
5594
|
+
maxlength: z51.number().positive().optional(),
|
|
5595
|
+
counter: z51.boolean().optional(),
|
|
5596
|
+
fill: z51.enum(["solid", "outline"]).optional(),
|
|
5597
|
+
shape: z51.literal("round").optional(),
|
|
4990
5598
|
labelPlacement: IonicLabelPlacementSchema.optional(),
|
|
4991
5599
|
hint: DynamicTextSchema.optional(),
|
|
4992
5600
|
errorText: DynamicTextSchema.optional(),
|
|
4993
5601
|
color: IonicColorSchema.optional(),
|
|
4994
5602
|
placeholder: DynamicTextSchema.optional()
|
|
4995
5603
|
});
|
|
4996
|
-
var IonicMultiCheckboxPropsSchema =
|
|
4997
|
-
labelPlacement:
|
|
5604
|
+
var IonicMultiCheckboxPropsSchema = z51.object({
|
|
5605
|
+
labelPlacement: z51.enum(["start", "end", "fixed", "stacked"]).optional(),
|
|
4998
5606
|
justify: IonicJustifySchema.optional(),
|
|
4999
|
-
color:
|
|
5607
|
+
color: z51.enum(["primary", "secondary", "tertiary", "success", "warning", "danger"]).optional(),
|
|
5000
5608
|
hint: DynamicTextSchema.optional()
|
|
5001
5609
|
});
|
|
5002
|
-
var IonicButtonPropsSchema =
|
|
5003
|
-
expand:
|
|
5610
|
+
var IonicButtonPropsSchema = z51.object({
|
|
5611
|
+
expand: z51.enum(["full", "block"]).optional(),
|
|
5004
5612
|
fill: IonicFillSchema.optional(),
|
|
5005
|
-
shape:
|
|
5006
|
-
size:
|
|
5613
|
+
shape: z51.literal("round").optional(),
|
|
5614
|
+
size: z51.enum(["small", "default", "large"]).optional(),
|
|
5007
5615
|
color: IonicColorSchema.optional(),
|
|
5008
|
-
strong:
|
|
5009
|
-
type:
|
|
5616
|
+
strong: z51.boolean().optional(),
|
|
5617
|
+
type: z51.enum(["button", "submit", "reset"]).optional()
|
|
5010
5618
|
});
|
|
5011
5619
|
|
|
5012
5620
|
// internal/dynamic-forms-zod/ionic/src/fields/index.ts
|
|
5013
|
-
import { z as
|
|
5621
|
+
import { z as z52 } from "zod";
|
|
5014
5622
|
var IonicValueFieldBase = BaseFieldDefSchema.merge(FieldWithValidationSchema);
|
|
5015
|
-
var
|
|
5016
|
-
type:
|
|
5017
|
-
|
|
5623
|
+
var IonicInputFieldSchemaObject = IonicValueFieldBase.extend({
|
|
5624
|
+
type: z52.literal("input"),
|
|
5625
|
+
nullable: z52.boolean().optional(),
|
|
5626
|
+
value: z52.string().nullable().optional(),
|
|
5018
5627
|
placeholder: DynamicTextSchema.optional(),
|
|
5019
5628
|
props: IonicInputPropsSchema.optional()
|
|
5020
5629
|
});
|
|
5630
|
+
var IonicInputFieldSchema = IonicInputFieldSchemaObject.superRefine(nullableValueRefine);
|
|
5021
5631
|
var IonicCheckboxFieldSchema = IonicValueFieldBase.extend({
|
|
5022
|
-
type:
|
|
5023
|
-
value:
|
|
5632
|
+
type: z52.literal("checkbox"),
|
|
5633
|
+
value: z52.boolean().optional(),
|
|
5024
5634
|
placeholder: DynamicTextSchema.optional(),
|
|
5025
5635
|
props: IonicCheckboxPropsSchema.optional()
|
|
5026
5636
|
});
|
|
5027
|
-
var
|
|
5028
|
-
type:
|
|
5029
|
-
|
|
5637
|
+
var IonicRadioFieldSchemaObject = IonicValueFieldBase.extend({
|
|
5638
|
+
type: z52.literal("radio"),
|
|
5639
|
+
nullable: z52.boolean().optional(),
|
|
5640
|
+
value: z52.unknown().nullable().optional(),
|
|
5030
5641
|
placeholder: DynamicTextSchema.optional(),
|
|
5031
5642
|
options: FieldOptionsSchema,
|
|
5032
5643
|
props: IonicRadioPropsSchema.optional()
|
|
5033
5644
|
});
|
|
5645
|
+
var IonicRadioFieldSchema = IonicRadioFieldSchemaObject.superRefine(nullableValueRefine);
|
|
5034
5646
|
var IonicToggleFieldSchema = IonicValueFieldBase.extend({
|
|
5035
|
-
type:
|
|
5036
|
-
value:
|
|
5647
|
+
type: z52.literal("toggle"),
|
|
5648
|
+
value: z52.boolean().optional(),
|
|
5037
5649
|
placeholder: DynamicTextSchema.optional(),
|
|
5038
5650
|
props: IonicTogglePropsSchema.optional()
|
|
5039
5651
|
});
|
|
5040
|
-
var
|
|
5041
|
-
type:
|
|
5042
|
-
|
|
5043
|
-
|
|
5044
|
-
|
|
5045
|
-
|
|
5652
|
+
var IonicSliderFieldSchemaObject = IonicValueFieldBase.extend({
|
|
5653
|
+
type: z52.literal("slider"),
|
|
5654
|
+
nullable: z52.boolean().optional(),
|
|
5655
|
+
value: z52.number().nullable().optional(),
|
|
5656
|
+
minValue: z52.number().optional(),
|
|
5657
|
+
maxValue: z52.number().optional(),
|
|
5658
|
+
step: z52.number().positive().optional(),
|
|
5046
5659
|
placeholder: DynamicTextSchema.optional(),
|
|
5047
5660
|
props: IonicSliderPropsSchema.optional()
|
|
5048
5661
|
});
|
|
5049
|
-
var
|
|
5050
|
-
|
|
5051
|
-
|
|
5052
|
-
|
|
5053
|
-
|
|
5054
|
-
|
|
5662
|
+
var IonicSliderFieldSchema = IonicSliderFieldSchemaObject.superRefine(nullableValueRefine);
|
|
5663
|
+
var IonicDatepickerFieldSchemaObject = IonicValueFieldBase.extend({
|
|
5664
|
+
type: z52.literal("datepicker"),
|
|
5665
|
+
nullable: z52.boolean().optional(),
|
|
5666
|
+
value: z52.union([z52.string(), z52.null()]).optional(),
|
|
5667
|
+
minDate: z52.union([z52.string(), z52.null()]).optional(),
|
|
5668
|
+
maxDate: z52.union([z52.string(), z52.null()]).optional(),
|
|
5669
|
+
startAt: z52.union([z52.string(), z52.null()]).optional(),
|
|
5055
5670
|
placeholder: DynamicTextSchema.optional(),
|
|
5056
5671
|
props: IonicDatepickerPropsSchema.optional()
|
|
5057
5672
|
});
|
|
5058
|
-
var
|
|
5059
|
-
|
|
5060
|
-
|
|
5673
|
+
var IonicDatepickerFieldSchema = IonicDatepickerFieldSchemaObject.superRefine(nullableValueRefine);
|
|
5674
|
+
var IonicSelectFieldSchemaObject = IonicValueFieldBase.extend({
|
|
5675
|
+
type: z52.literal("select"),
|
|
5676
|
+
nullable: z52.boolean().optional(),
|
|
5677
|
+
value: z52.unknown().nullable().optional(),
|
|
5061
5678
|
placeholder: DynamicTextSchema.optional(),
|
|
5062
5679
|
options: FieldOptionsSchema,
|
|
5063
5680
|
props: IonicSelectPropsSchema.optional()
|
|
5064
5681
|
});
|
|
5065
|
-
var
|
|
5066
|
-
|
|
5067
|
-
|
|
5682
|
+
var IonicSelectFieldSchema = IonicSelectFieldSchemaObject.superRefine(nullableValueRefine);
|
|
5683
|
+
var IonicTextareaFieldSchemaObject = IonicValueFieldBase.extend({
|
|
5684
|
+
type: z52.literal("textarea"),
|
|
5685
|
+
nullable: z52.boolean().optional(),
|
|
5686
|
+
value: z52.string().nullable().optional(),
|
|
5068
5687
|
placeholder: DynamicTextSchema.optional(),
|
|
5069
5688
|
props: IonicTextareaPropsSchema.optional()
|
|
5070
5689
|
});
|
|
5071
|
-
var
|
|
5072
|
-
|
|
5073
|
-
|
|
5690
|
+
var IonicTextareaFieldSchema = IonicTextareaFieldSchemaObject.superRefine(nullableValueRefine);
|
|
5691
|
+
var IonicMultiCheckboxFieldSchemaObject = IonicValueFieldBase.extend({
|
|
5692
|
+
type: z52.literal("multi-checkbox"),
|
|
5693
|
+
nullable: z52.boolean().optional(),
|
|
5694
|
+
value: z52.array(z52.unknown()).nullable().optional(),
|
|
5074
5695
|
placeholder: DynamicTextSchema.optional(),
|
|
5075
5696
|
options: FieldOptionsSchema,
|
|
5076
5697
|
props: IonicMultiCheckboxPropsSchema.optional()
|
|
5077
5698
|
});
|
|
5699
|
+
var IonicMultiCheckboxFieldSchema = IonicMultiCheckboxFieldSchemaObject.superRefine(nullableValueRefine);
|
|
5078
5700
|
var IonicButtonFieldSchema = BaseFieldDefSchema.extend({
|
|
5079
|
-
type:
|
|
5080
|
-
event:
|
|
5081
|
-
eventArgs:
|
|
5701
|
+
type: z52.literal("button"),
|
|
5702
|
+
event: z52.string().optional(),
|
|
5703
|
+
eventArgs: z52.array(z52.union([z52.string(), z52.number(), z52.boolean(), z52.null(), z52.undefined()])).optional(),
|
|
5082
5704
|
props: IonicButtonPropsSchema.optional(),
|
|
5083
5705
|
logic: LogicArraySchema.optional()
|
|
5084
5706
|
});
|
|
5085
5707
|
var IonicSubmitButtonFieldSchema = BaseFieldDefSchema.extend({
|
|
5086
|
-
type:
|
|
5708
|
+
type: z52.literal("submit"),
|
|
5087
5709
|
props: IonicButtonPropsSchema.optional(),
|
|
5088
5710
|
logic: LogicArraySchema.optional()
|
|
5089
5711
|
});
|
|
5090
5712
|
var IonicNextButtonFieldSchema = BaseFieldDefSchema.extend({
|
|
5091
|
-
type:
|
|
5713
|
+
type: z52.literal("next"),
|
|
5092
5714
|
props: IonicButtonPropsSchema.optional(),
|
|
5093
5715
|
logic: LogicArraySchema.optional()
|
|
5094
5716
|
});
|
|
5095
5717
|
var IonicPreviousButtonFieldSchema = BaseFieldDefSchema.extend({
|
|
5096
|
-
type:
|
|
5718
|
+
type: z52.literal("previous"),
|
|
5097
5719
|
props: IonicButtonPropsSchema.optional()
|
|
5098
5720
|
});
|
|
5099
5721
|
var IonicAddArrayItemButtonFieldSchema = BaseFieldDefSchema.extend({
|
|
5100
|
-
type:
|
|
5101
|
-
arrayKey:
|
|
5722
|
+
type: z52.literal("addArrayItem"),
|
|
5723
|
+
arrayKey: z52.string().optional(),
|
|
5102
5724
|
props: IonicButtonPropsSchema.optional()
|
|
5103
5725
|
});
|
|
5104
5726
|
var IonicRemoveArrayItemButtonFieldSchema = BaseFieldDefSchema.extend({
|
|
5105
|
-
type:
|
|
5106
|
-
arrayKey:
|
|
5727
|
+
type: z52.literal("removeArrayItem"),
|
|
5728
|
+
arrayKey: z52.string().optional(),
|
|
5107
5729
|
props: IonicButtonPropsSchema.optional()
|
|
5108
5730
|
});
|
|
5109
5731
|
|
|
5110
5732
|
// internal/dynamic-forms-zod/ionic/src/ionic-leaf-field.schema.ts
|
|
5111
|
-
import { z as
|
|
5112
|
-
var IonicLeafFieldSchema =
|
|
5733
|
+
import { z as z53 } from "zod";
|
|
5734
|
+
var IonicLeafFieldSchema = z53.discriminatedUnion("type", [
|
|
5113
5735
|
TextFieldSchema,
|
|
5114
5736
|
HiddenFieldSchema,
|
|
5115
|
-
|
|
5737
|
+
IonicInputFieldSchemaObject,
|
|
5116
5738
|
IonicCheckboxFieldSchema,
|
|
5117
|
-
|
|
5739
|
+
IonicRadioFieldSchemaObject,
|
|
5118
5740
|
IonicToggleFieldSchema,
|
|
5119
|
-
|
|
5120
|
-
|
|
5121
|
-
|
|
5122
|
-
|
|
5123
|
-
|
|
5741
|
+
IonicSliderFieldSchemaObject,
|
|
5742
|
+
IonicDatepickerFieldSchemaObject,
|
|
5743
|
+
IonicSelectFieldSchemaObject,
|
|
5744
|
+
IonicTextareaFieldSchemaObject,
|
|
5745
|
+
IonicMultiCheckboxFieldSchemaObject,
|
|
5124
5746
|
IonicButtonFieldSchema,
|
|
5125
5747
|
IonicSubmitButtonFieldSchema,
|
|
5126
5748
|
IonicNextButtonFieldSchema,
|
|
5127
5749
|
IonicPreviousButtonFieldSchema,
|
|
5128
5750
|
IonicAddArrayItemButtonFieldSchema,
|
|
5129
5751
|
IonicRemoveArrayItemButtonFieldSchema
|
|
5130
|
-
]);
|
|
5752
|
+
]).superRefine(nullableValueRefine);
|
|
5131
5753
|
|
|
5132
5754
|
// internal/dynamic-forms-zod/ionic/src/ionic-form-config.schema.ts
|
|
5133
|
-
import { z as
|
|
5755
|
+
import { z as z54 } from "zod";
|
|
5134
5756
|
var containerSchemas4 = createContainerSchemas({
|
|
5135
5757
|
leafFieldSchema: IonicLeafFieldSchema
|
|
5136
5758
|
});
|
|
@@ -5139,7 +5761,7 @@ var IonicRowFieldSchema = containerSchemas4.RowFieldSchema;
|
|
|
5139
5761
|
var IonicGroupFieldSchema = containerSchemas4.GroupFieldSchema;
|
|
5140
5762
|
var IonicArrayFieldSchema = containerSchemas4.ArrayFieldSchema;
|
|
5141
5763
|
var IonicFieldSchema = containerSchemas4.AllFieldsSchema;
|
|
5142
|
-
var IonicFormDefaultPropsSchema =
|
|
5764
|
+
var IonicFormDefaultPropsSchema = z54.object({
|
|
5143
5765
|
color: IonicColorSchema.optional(),
|
|
5144
5766
|
labelPlacement: IonicLabelPlacementSchema.optional()
|
|
5145
5767
|
});
|
|
@@ -5870,6 +6492,110 @@ ${fieldTypes.map((ft) => `- ${ft}`).join("\n")}
|
|
|
5870
6492
|
});
|
|
5871
6493
|
}
|
|
5872
6494
|
|
|
6495
|
+
// packages/dynamic-form-mcp/src/resources/wrappers.resource.ts
|
|
6496
|
+
function registerWrappersResource(server) {
|
|
6497
|
+
server.resource("ng-forge Wrappers", "ng-forge://wrappers", async () => {
|
|
6498
|
+
const wrappers = getWrappers();
|
|
6499
|
+
return {
|
|
6500
|
+
contents: [
|
|
6501
|
+
{
|
|
6502
|
+
uri: "ng-forge://wrappers",
|
|
6503
|
+
mimeType: "application/json",
|
|
6504
|
+
text: JSON.stringify(
|
|
6505
|
+
{
|
|
6506
|
+
description: 'Available ng-forge field wrappers. Wrappers decorate the rendered output of a field or container without changing form data. Compose via `wrappers: [{ type: "...", ...props }]`.',
|
|
6507
|
+
categories: {
|
|
6508
|
+
core: "Ships from @ng-forge/dynamic-forms \u2014 always importable.",
|
|
6509
|
+
demo: "Ships from @internal/examples-shared-ui for the docs sandbox \u2014 NOT a library primitive.",
|
|
6510
|
+
adapter: "Ships from a UI adapter library (reserved)."
|
|
6511
|
+
},
|
|
6512
|
+
authoringContract: WRAPPER_AUTHORING_CONTRACT,
|
|
6513
|
+
wrappers: wrappers.map((w) => ({
|
|
6514
|
+
type: w.type,
|
|
6515
|
+
category: w.category,
|
|
6516
|
+
availability: w.availability,
|
|
6517
|
+
package: w.package,
|
|
6518
|
+
description: w.description,
|
|
6519
|
+
autoAppliesTo: w.autoAppliesTo
|
|
6520
|
+
}))
|
|
6521
|
+
},
|
|
6522
|
+
null,
|
|
6523
|
+
2
|
|
6524
|
+
)
|
|
6525
|
+
}
|
|
6526
|
+
]
|
|
6527
|
+
};
|
|
6528
|
+
});
|
|
6529
|
+
server.resource("Wrapper Details", "ng-forge://wrappers/{type}", async (uri) => {
|
|
6530
|
+
const match = uri.href.match(/ng-forge:\/\/wrappers\/(.+)/);
|
|
6531
|
+
const typeName = match?.[1];
|
|
6532
|
+
if (!typeName) {
|
|
6533
|
+
return {
|
|
6534
|
+
contents: [
|
|
6535
|
+
{
|
|
6536
|
+
uri: uri.href,
|
|
6537
|
+
mimeType: "text/plain",
|
|
6538
|
+
text: "Wrapper type not specified in URI"
|
|
6539
|
+
}
|
|
6540
|
+
]
|
|
6541
|
+
};
|
|
6542
|
+
}
|
|
6543
|
+
const wrapper = getWrapper(typeName);
|
|
6544
|
+
if (!wrapper) {
|
|
6545
|
+
return {
|
|
6546
|
+
contents: [
|
|
6547
|
+
{
|
|
6548
|
+
uri: uri.href,
|
|
6549
|
+
mimeType: "text/plain",
|
|
6550
|
+
text: `Wrapper type '${typeName}' not found. Available types: ${getWrappers().map((w) => w.type).join(", ")}`
|
|
6551
|
+
}
|
|
6552
|
+
]
|
|
6553
|
+
};
|
|
6554
|
+
}
|
|
6555
|
+
return {
|
|
6556
|
+
contents: [
|
|
6557
|
+
{
|
|
6558
|
+
uri: uri.href,
|
|
6559
|
+
mimeType: "application/json",
|
|
6560
|
+
text: JSON.stringify(wrapper, null, 2)
|
|
6561
|
+
}
|
|
6562
|
+
]
|
|
6563
|
+
};
|
|
6564
|
+
});
|
|
6565
|
+
server.resource("Wrappers by Category", "ng-forge://wrappers/category/{category}", async (uri) => {
|
|
6566
|
+
const match = uri.href.match(/ng-forge:\/\/wrappers\/category\/(.+)/);
|
|
6567
|
+
const category = match?.[1];
|
|
6568
|
+
if (!category || !["core", "demo", "adapter"].includes(category)) {
|
|
6569
|
+
return {
|
|
6570
|
+
contents: [
|
|
6571
|
+
{
|
|
6572
|
+
uri: uri.href,
|
|
6573
|
+
mimeType: "text/plain",
|
|
6574
|
+
text: "Valid categories: core, demo, adapter"
|
|
6575
|
+
}
|
|
6576
|
+
]
|
|
6577
|
+
};
|
|
6578
|
+
}
|
|
6579
|
+
const wrappers = getWrappersByCategory(category);
|
|
6580
|
+
return {
|
|
6581
|
+
contents: [
|
|
6582
|
+
{
|
|
6583
|
+
uri: uri.href,
|
|
6584
|
+
mimeType: "application/json",
|
|
6585
|
+
text: JSON.stringify(
|
|
6586
|
+
{
|
|
6587
|
+
category,
|
|
6588
|
+
wrappers
|
|
6589
|
+
},
|
|
6590
|
+
null,
|
|
6591
|
+
2
|
|
6592
|
+
)
|
|
6593
|
+
}
|
|
6594
|
+
]
|
|
6595
|
+
};
|
|
6596
|
+
});
|
|
6597
|
+
}
|
|
6598
|
+
|
|
5873
6599
|
// packages/dynamic-form-mcp/src/resources/index.ts
|
|
5874
6600
|
function registerResources(server) {
|
|
5875
6601
|
registerInstructionsResource(server);
|
|
@@ -5877,22 +6603,24 @@ function registerResources(server) {
|
|
|
5877
6603
|
registerFieldTypesResource(server);
|
|
5878
6604
|
registerValidatorsResource(server);
|
|
5879
6605
|
registerUIAdaptersResource(server);
|
|
6606
|
+
registerWrappersResource(server);
|
|
5880
6607
|
registerDocumentationResource(server);
|
|
5881
6608
|
registerSchemasResource(server);
|
|
5882
6609
|
}
|
|
5883
6610
|
|
|
5884
6611
|
// packages/dynamic-form-mcp/src/tools/lookup.tool.ts
|
|
5885
|
-
import { z as
|
|
6612
|
+
import { z as z55 } from "zod";
|
|
5886
6613
|
|
|
5887
6614
|
// packages/dynamic-form-mcp/src/tools/data/lookup-topics.ts
|
|
5888
6615
|
var TOPICS = {
|
|
5889
6616
|
// ========== FIELD TYPES ==========
|
|
5890
6617
|
input: {
|
|
5891
6618
|
brief: `\`\`\`typescript
|
|
5892
|
-
{ key: 'email', type: 'input', label: 'Email', required: true, email: true, props: { type: 'email'
|
|
6619
|
+
{ key: 'email', type: 'input', label: 'Email', required: true, email: true, placeholder: 'you@example.com', props: { type: 'email' } }
|
|
5893
6620
|
\`\`\`
|
|
5894
6621
|
**Shorthand:** required, email, min, max, minLength, maxLength, pattern
|
|
5895
|
-
**
|
|
6622
|
+
**Field-level:** placeholder
|
|
6623
|
+
**Props:** type (text|email|password|number|tel|url), appearance (Material)`,
|
|
5896
6624
|
full: `# Input Field
|
|
5897
6625
|
|
|
5898
6626
|
\`\`\`typescript
|
|
@@ -5902,9 +6630,9 @@ var TOPICS = {
|
|
|
5902
6630
|
label: 'Email',
|
|
5903
6631
|
required: true,
|
|
5904
6632
|
email: true,
|
|
6633
|
+
placeholder: 'you@example.com',
|
|
5905
6634
|
props: {
|
|
5906
6635
|
type: 'email', // 'text' | 'email' | 'password' | 'number' | 'tel' | 'url'
|
|
5907
|
-
placeholder: 'you@example.com',
|
|
5908
6636
|
appearance: 'outline' // Material: 'outline' | 'fill'
|
|
5909
6637
|
}
|
|
5910
6638
|
}
|
|
@@ -5912,7 +6640,8 @@ var TOPICS = {
|
|
|
5912
6640
|
|
|
5913
6641
|
**Validation shorthand:** \`required\`, \`email\`, \`min\`, \`max\`, \`minLength\`, \`maxLength\`, \`pattern\`
|
|
5914
6642
|
|
|
5915
|
-
**
|
|
6643
|
+
**Field-level:** \`placeholder\`
|
|
6644
|
+
**Props:** \`type\`, \`appearance\` (Material), \`hint\` (Material)
|
|
5916
6645
|
|
|
5917
6646
|
**Value Type:** \`string | number\`
|
|
5918
6647
|
|
|
@@ -5920,7 +6649,7 @@ var TOPICS = {
|
|
|
5920
6649
|
},
|
|
5921
6650
|
select: {
|
|
5922
6651
|
brief: `\`\`\`typescript
|
|
5923
|
-
{ key: 'country', type: 'select', label: 'Country', options: [{ label: 'USA', value: 'us' }]
|
|
6652
|
+
{ key: 'country', type: 'select', label: 'Country', placeholder: 'Choose...', options: [{ label: 'USA', value: 'us' }] }
|
|
5924
6653
|
\`\`\`
|
|
5925
6654
|
\u26A0\uFE0F **options at FIELD level, NOT in props!**`,
|
|
5926
6655
|
full: `# Select Field
|
|
@@ -5935,8 +6664,8 @@ var TOPICS = {
|
|
|
5935
6664
|
{ label: 'USA', value: 'us' },
|
|
5936
6665
|
{ label: 'Canada', value: 'ca' }
|
|
5937
6666
|
],
|
|
6667
|
+
placeholder: 'Choose...',
|
|
5938
6668
|
props: {
|
|
5939
|
-
placeholder: 'Choose...',
|
|
5940
6669
|
multiple: false // Allow multiple selection
|
|
5941
6670
|
}
|
|
5942
6671
|
}
|
|
@@ -6029,7 +6758,7 @@ For multiple selections, use **multi-checkbox** type.`,
|
|
|
6029
6758
|
},
|
|
6030
6759
|
textarea: {
|
|
6031
6760
|
brief: `\`\`\`typescript
|
|
6032
|
-
{ key: 'bio', type: 'textarea', label: 'Bio', maxLength: 500,
|
|
6761
|
+
{ key: 'bio', type: 'textarea', label: 'Bio', maxLength: 500, placeholder: 'Tell us about yourself...', props: { rows: 4 } }
|
|
6033
6762
|
\`\`\``,
|
|
6034
6763
|
full: `# Textarea Field
|
|
6035
6764
|
|
|
@@ -6039,9 +6768,9 @@ For multiple selections, use **multi-checkbox** type.`,
|
|
|
6039
6768
|
type: 'textarea',
|
|
6040
6769
|
label: 'Biography',
|
|
6041
6770
|
maxLength: 500,
|
|
6771
|
+
placeholder: 'Tell us about yourself...',
|
|
6042
6772
|
props: {
|
|
6043
6773
|
rows: 4,
|
|
6044
|
-
placeholder: 'Tell us about yourself...'
|
|
6045
6774
|
}
|
|
6046
6775
|
}
|
|
6047
6776
|
\`\`\`
|
|
@@ -8304,7 +9033,13 @@ var TOPIC_DESCRIPTIONS = {
|
|
|
8304
9033
|
conditions: "Condition operators and types for logic rules",
|
|
8305
9034
|
"common-expressions": "Frequently used derivation expressions (age, math, concatenation)",
|
|
8306
9035
|
"type-narrowing": "TypeScript type safety with as const satisfies FormConfig",
|
|
8307
|
-
workflow: "Recommended tool usage guide \u2014 start here"
|
|
9036
|
+
workflow: "Recommended tool usage guide \u2014 start here",
|
|
9037
|
+
// Wrappers
|
|
9038
|
+
wrappers: "Overview of the wrapper chain: how to apply, compose, and author wrappers",
|
|
9039
|
+
wrapper: "Overview of the wrapper chain (alias of `wrappers`)",
|
|
9040
|
+
css: "Built-in CSS wrapper \u2014 applies DynamicText class names to the host element",
|
|
9041
|
+
arraySection: "Demo wrapper \u2014 array card whose header owns the Add button (examples-shared-ui)",
|
|
9042
|
+
section: "Demo wrapper \u2014 titled card around any field or container (examples-shared-ui)"
|
|
8308
9043
|
};
|
|
8309
9044
|
var TOPIC_ALIASES = {
|
|
8310
9045
|
// Field type aliases
|
|
@@ -8431,7 +9166,21 @@ var TOPIC_ALIASES = {
|
|
|
8431
9166
|
// Workflow aliases
|
|
8432
9167
|
"how-to": "workflow",
|
|
8433
9168
|
guide: "workflow",
|
|
8434
|
-
"getting-started": "workflow"
|
|
9169
|
+
"getting-started": "workflow",
|
|
9170
|
+
// Wrapper aliases
|
|
9171
|
+
wrapper: "wrappers",
|
|
9172
|
+
"field-wrapper": "wrappers",
|
|
9173
|
+
"field-wrappers": "wrappers",
|
|
9174
|
+
decorator: "wrappers",
|
|
9175
|
+
decorators: "wrappers",
|
|
9176
|
+
"wrapper-chain": "wrappers",
|
|
9177
|
+
"css-wrapper": "css",
|
|
9178
|
+
csswrapper: "css",
|
|
9179
|
+
cssclasses: "css",
|
|
9180
|
+
"array-section": "arraySection",
|
|
9181
|
+
arraysection: "arraySection",
|
|
9182
|
+
"section-wrapper": "section",
|
|
9183
|
+
sectionwrapper: "section"
|
|
8435
9184
|
};
|
|
8436
9185
|
|
|
8437
9186
|
// packages/dynamic-form-mcp/src/services/topic-mapper.ts
|
|
@@ -8528,6 +9277,7 @@ function formatTopicItem(key) {
|
|
|
8528
9277
|
function getTopicList() {
|
|
8529
9278
|
const fieldTypes = ["input", "select", "slider", "radio", "checkbox", "textarea", "datepicker", "toggle", "text", "hidden"];
|
|
8530
9279
|
const containers = ["group", "row", "array", "simplified-array", "page"];
|
|
9280
|
+
const wrappers = ["wrappers", ...getWrappers().map((w) => w.type)];
|
|
8531
9281
|
const concepts = [
|
|
8532
9282
|
"validation",
|
|
8533
9283
|
"validation-messages",
|
|
@@ -8563,6 +9313,9 @@ ${fieldTypes.map(formatTopicItem).join("\n")}
|
|
|
8563
9313
|
## Containers
|
|
8564
9314
|
${containers.map(formatTopicItem).join("\n")}
|
|
8565
9315
|
|
|
9316
|
+
## Wrappers
|
|
9317
|
+
${wrappers.map(formatTopicItem).join("\n")}
|
|
9318
|
+
|
|
8566
9319
|
## Concepts
|
|
8567
9320
|
${concepts.map(formatTopicItem).join("\n")}
|
|
8568
9321
|
|
|
@@ -8629,7 +9382,144 @@ function formatFieldInfoFull(field, uiFieldType) {
|
|
|
8629
9382
|
lines.push("```");
|
|
8630
9383
|
return lines.join("\n");
|
|
8631
9384
|
}
|
|
9385
|
+
function formatWrapperInfo(wrapper) {
|
|
9386
|
+
const lines = [];
|
|
9387
|
+
lines.push(`# ${wrapper.type} wrapper`);
|
|
9388
|
+
lines.push("");
|
|
9389
|
+
lines.push(`**Category:** ${wrapper.category}`);
|
|
9390
|
+
lines.push(`**Availability:** ${wrapper.availability}`);
|
|
9391
|
+
lines.push(`**Package:** \`${wrapper.package}\``);
|
|
9392
|
+
lines.push(`**Component:** \`${wrapper.componentName}\``);
|
|
9393
|
+
lines.push(`**Description:** ${wrapper.description}`);
|
|
9394
|
+
if (wrapper.availability === "demo-only") {
|
|
9395
|
+
lines.push("");
|
|
9396
|
+
lines.push(
|
|
9397
|
+
"> **Note:** This is a demo wrapper that ships with the docs sandbox, not a library primitive. Use it as a pattern/template and author your own wrapper (or copy the component out of `internal/examples-shared-ui/src/lib/demo-wrappers/`) when adopting the idea in production."
|
|
9398
|
+
);
|
|
9399
|
+
}
|
|
9400
|
+
if (wrapper.autoAppliesTo.length > 0) {
|
|
9401
|
+
lines.push("");
|
|
9402
|
+
lines.push(`**Auto-applies to:** ${wrapper.autoAppliesTo.join(", ")}`);
|
|
9403
|
+
lines.push(
|
|
9404
|
+
"_(Injected automatically into these field types. Can be overridden via `FormConfig.defaultWrappers` or per-field `wrappers: [...]`; clear entirely with `wrappers: null`.)_"
|
|
9405
|
+
);
|
|
9406
|
+
} else {
|
|
9407
|
+
lines.push("");
|
|
9408
|
+
lines.push("**Auto-applies to:** _(none \u2014 opt-in via the field's `wrappers` array)_");
|
|
9409
|
+
}
|
|
9410
|
+
if (Object.keys(wrapper.props).length > 0) {
|
|
9411
|
+
lines.push("");
|
|
9412
|
+
lines.push("### Config Props");
|
|
9413
|
+
for (const prop of Object.values(wrapper.props)) {
|
|
9414
|
+
const req = prop.required ? " **(required)**" : "";
|
|
9415
|
+
const def = prop.default !== void 0 ? ` (default: ${JSON.stringify(prop.default)})` : "";
|
|
9416
|
+
lines.push(`- \`${prop.name}\`: ${prop.type}${req}${def} \u2014 ${prop.description}`);
|
|
9417
|
+
}
|
|
9418
|
+
} else {
|
|
9419
|
+
lines.push("");
|
|
9420
|
+
lines.push("### Config Props");
|
|
9421
|
+
lines.push("_(none \u2014 no configurable inputs on this wrapper)_");
|
|
9422
|
+
}
|
|
9423
|
+
if (wrapper.minimalExample) {
|
|
9424
|
+
lines.push("");
|
|
9425
|
+
lines.push("### Minimal Config");
|
|
9426
|
+
lines.push("```typescript");
|
|
9427
|
+
lines.push(wrapper.minimalExample);
|
|
9428
|
+
lines.push("```");
|
|
9429
|
+
}
|
|
9430
|
+
lines.push("");
|
|
9431
|
+
lines.push("### Full Example");
|
|
9432
|
+
lines.push("```typescript");
|
|
9433
|
+
lines.push(wrapper.example);
|
|
9434
|
+
lines.push("```");
|
|
9435
|
+
lines.push("");
|
|
9436
|
+
lines.push("### Authoring Contract");
|
|
9437
|
+
lines.push(wrapper.contract);
|
|
9438
|
+
return lines.join("\n");
|
|
9439
|
+
}
|
|
9440
|
+
function formatWrappersOverview() {
|
|
9441
|
+
const wrappers = getWrappers();
|
|
9442
|
+
const lines = [];
|
|
9443
|
+
lines.push("# Wrappers");
|
|
9444
|
+
lines.push("");
|
|
9445
|
+
lines.push(
|
|
9446
|
+
"Wrappers decorate the rendered output of a field (or container) without changing the form data structure. They are composed as a chain: each wrapper exposes a `#fieldComponent` `ViewContainerRef` slot where the next wrapper \u2014 or the field itself \u2014 is rendered."
|
|
9447
|
+
);
|
|
9448
|
+
lines.push("");
|
|
9449
|
+
lines.push("## Applying a wrapper");
|
|
9450
|
+
lines.push("");
|
|
9451
|
+
lines.push("```typescript");
|
|
9452
|
+
lines.push(`// Per-field wrapper chain (outer-most first)
|
|
9453
|
+
{
|
|
9454
|
+
key: 'email',
|
|
9455
|
+
type: 'input',
|
|
9456
|
+
label: 'Email',
|
|
9457
|
+
wrappers: [
|
|
9458
|
+
{ type: 'section', title: 'Account' }, // outer
|
|
9459
|
+
{ type: 'css', cssClasses: 'pad-lg' } // inner
|
|
9460
|
+
]
|
|
9461
|
+
}
|
|
9462
|
+
|
|
9463
|
+
// Form-level defaults applied to every field
|
|
9464
|
+
const config = {
|
|
9465
|
+
defaultWrappers: [{ type: 'css', cssClasses: 'field-default' }],
|
|
9466
|
+
fields: [...]
|
|
9467
|
+
} as const satisfies FormConfig;
|
|
9468
|
+
|
|
9469
|
+
// Clear all wrappers on a specific field (overrides defaults + auto)
|
|
9470
|
+
{ key: 'id', type: 'hidden', value: 'abc', wrappers: null }`);
|
|
9471
|
+
lines.push("```");
|
|
9472
|
+
lines.push("");
|
|
9473
|
+
lines.push("## Registered Wrappers");
|
|
9474
|
+
lines.push("");
|
|
9475
|
+
for (const w of wrappers) {
|
|
9476
|
+
const flag = w.availability === "demo-only" ? " _(demo-only)_" : "";
|
|
9477
|
+
lines.push(`- **${w.type}** (${w.category}, \`${w.package}\`)${flag} \u2014 ${w.description.split(".")[0]}.`);
|
|
9478
|
+
}
|
|
9479
|
+
lines.push("");
|
|
9480
|
+
lines.push('Use `ngforge_lookup topic="<name>"` for full details on any individual wrapper.');
|
|
9481
|
+
lines.push("");
|
|
9482
|
+
lines.push("## Authoring Contract");
|
|
9483
|
+
lines.push("");
|
|
9484
|
+
lines.push(wrappers[0]?.contract ?? "");
|
|
9485
|
+
return lines.join("\n");
|
|
9486
|
+
}
|
|
8632
9487
|
async function resolveTopicContent(resolvedTopic, depth, uiIntegration) {
|
|
9488
|
+
if (resolvedTopic === "wrappers" || resolvedTopic === "wrapper") {
|
|
9489
|
+
if (depth === "brief") {
|
|
9490
|
+
const wrappers = getWrappers();
|
|
9491
|
+
return [
|
|
9492
|
+
"**Wrappers** decorate a field's rendered output without changing form data.",
|
|
9493
|
+
"",
|
|
9494
|
+
"Registered:",
|
|
9495
|
+
...wrappers.map((w) => `- \`${w.type}\` (${w.category}${w.availability === "demo-only" ? ", demo-only" : ""})`),
|
|
9496
|
+
"",
|
|
9497
|
+
'Use `wrappers: [{ type: "css", cssClasses: "..." }]` on any field. See `ngforge_lookup topic="wrappers"` for the full overview.'
|
|
9498
|
+
].join("\n");
|
|
9499
|
+
}
|
|
9500
|
+
return formatWrappersOverview();
|
|
9501
|
+
}
|
|
9502
|
+
const wrapperInfo = getWrapper(resolvedTopic);
|
|
9503
|
+
if (wrapperInfo) {
|
|
9504
|
+
const formatted = formatWrapperInfo(wrapperInfo);
|
|
9505
|
+
if (depth === "brief") {
|
|
9506
|
+
const lines = [
|
|
9507
|
+
`# ${wrapperInfo.type} wrapper`,
|
|
9508
|
+
"",
|
|
9509
|
+
`${wrapperInfo.description.split(".")[0]}.`,
|
|
9510
|
+
"",
|
|
9511
|
+
"```typescript",
|
|
9512
|
+
wrapperInfo.minimalExample ?? `{ type: '${wrapperInfo.type}' }`,
|
|
9513
|
+
"```"
|
|
9514
|
+
];
|
|
9515
|
+
if (wrapperInfo.availability === "demo-only") {
|
|
9516
|
+
lines.push("");
|
|
9517
|
+
lines.push(`**Demo-only** \u2014 ships from \`${wrapperInfo.package}\`, not \`@ng-forge/dynamic-forms\`.`);
|
|
9518
|
+
}
|
|
9519
|
+
return lines.join("\n");
|
|
9520
|
+
}
|
|
9521
|
+
return formatted;
|
|
9522
|
+
}
|
|
8633
9523
|
if (depth === "brief") {
|
|
8634
9524
|
const topicContent2 = TOPICS[resolvedTopic];
|
|
8635
9525
|
if (topicContent2) {
|
|
@@ -8717,7 +9607,12 @@ var NEXT_STEPS = {
|
|
|
8717
9607
|
"logic-matrix": '**Next:** `ngforge_lookup topic="conditional"` for condition syntax \xB7 `ngforge_lookup topic="derivation"` for derivation syntax',
|
|
8718
9608
|
"field-placement": '**Next:** `ngforge_lookup topic="containers"` for container overview',
|
|
8719
9609
|
conditions: '**Next:** `ngforge_lookup topic="conditional"` for full conditional logic docs \xB7 `ngforge_examples pattern="minimal-conditional"` for working example',
|
|
8720
|
-
workflow: '**Next:** `ngforge_lookup topic="golden-path"` for form structure templates \xB7 `ngforge_examples pattern="complete"` for a full working example'
|
|
9610
|
+
workflow: '**Next:** `ngforge_lookup topic="golden-path"` for form structure templates \xB7 `ngforge_examples pattern="complete"` for a full working example',
|
|
9611
|
+
// Wrappers
|
|
9612
|
+
wrappers: '**Next:** `ngforge_lookup topic="css"` for the shipping CSS wrapper \xB7 `ngforge_lookup topic="section"` or `ngforge_lookup topic="arraySection"` for demo wrappers \xB7 `ngforge_examples pattern="wrapper-array-actions"` for a working array-section example',
|
|
9613
|
+
css: '**Next:** `ngforge_lookup topic="wrappers"` for the full wrapper overview \xB7 `ngforge_lookup topic="field-placement"` for where wrappers can apply',
|
|
9614
|
+
arraySection: '**Next:** `ngforge_lookup topic="wrappers"` for the wrapper overview \xB7 `ngforge_lookup topic="array"` for array field docs \xB7 `ngforge_lookup topic="array-buttons"` for the button-field alternative',
|
|
9615
|
+
section: '**Next:** `ngforge_lookup topic="wrappers"` for the wrapper overview \xB7 `ngforge_lookup topic="css"` for the shipping CSS wrapper'
|
|
8721
9616
|
};
|
|
8722
9617
|
function getNextSteps(topic) {
|
|
8723
9618
|
return NEXT_STEPS[topic];
|
|
@@ -8738,6 +9633,8 @@ Field types: input, select, slider, radio, checkbox, textarea, datepicker, toggl
|
|
|
8738
9633
|
|
|
8739
9634
|
Containers: group, row, array, simplified-array, page
|
|
8740
9635
|
|
|
9636
|
+
Wrappers: wrappers (overview), css (shipping), section, arraySection (demo-only)
|
|
9637
|
+
|
|
8741
9638
|
Concepts: validation, conditional, derivation, property-derivation, options-format, expression-variables, async-validators
|
|
8742
9639
|
|
|
8743
9640
|
Patterns: field-placement, logic-matrix, context-api, containers, multi-page-gotchas
|
|
@@ -8745,11 +9642,11 @@ Patterns: field-placement, logic-matrix, context-api, containers, multi-page-got
|
|
|
8745
9642
|
Use topic="list" to see all available topics with descriptions.
|
|
8746
9643
|
Use ngforge_search query="your question" to find topics by keyword.`,
|
|
8747
9644
|
{
|
|
8748
|
-
topic:
|
|
8749
|
-
'Topic to look up: field types (input, select, hidden, group, row, array, page), concepts (validation, conditional, derivation, property-derivation, options-format), patterns (golden-path, pitfalls, multi-page-gotchas), or "list" to see all topics'
|
|
9645
|
+
topic: z55.string().describe(
|
|
9646
|
+
'Topic to look up: field types (input, select, hidden, group, row, array, page), wrappers (wrappers, css, section, arraySection), concepts (validation, conditional, derivation, property-derivation, options-format), patterns (golden-path, pitfalls, multi-page-gotchas), or "list" to see all topics'
|
|
8750
9647
|
),
|
|
8751
|
-
depth:
|
|
8752
|
-
uiIntegration:
|
|
9648
|
+
depth: z55.enum(["brief", "full", "schema"]).default("full").describe("brief=quick syntax (~20 lines), full=complete docs with examples, schema=include JSON schema"),
|
|
9649
|
+
uiIntegration: z55.enum(UI_INTEGRATIONS2).optional().describe("Filter UI-specific info (only with depth=schema). material, bootstrap, primeng, ionic")
|
|
8753
9650
|
},
|
|
8754
9651
|
async ({ topic, depth, uiIntegration }) => {
|
|
8755
9652
|
const normalizedTopic = topic.toLowerCase().trim();
|
|
@@ -8797,7 +9694,7 @@ ${nextSteps}`;
|
|
|
8797
9694
|
}
|
|
8798
9695
|
|
|
8799
9696
|
// packages/dynamic-form-mcp/src/tools/examples.tool.ts
|
|
8800
|
-
import { z as
|
|
9697
|
+
import { z as z56 } from "zod";
|
|
8801
9698
|
var PATTERNS = {
|
|
8802
9699
|
// ========== MINIMAL PATTERNS (NEW) ==========
|
|
8803
9700
|
"minimal-multipage": {
|
|
@@ -10780,7 +11677,7 @@ const megaFormConfig = {
|
|
|
10780
11677
|
{ key: 'pageHeader', type: 'text', label: 'All Field Types Demo', props: { elementType: 'h1' } },
|
|
10781
11678
|
|
|
10782
11679
|
// TEXT INPUTS
|
|
10783
|
-
{ key: 'textInput', type: 'input', label: 'Text Input',
|
|
11680
|
+
{ key: 'textInput', type: 'input', label: 'Text Input', placeholder: 'Type here' },
|
|
10784
11681
|
{ key: 'emailInput', type: 'input', label: 'Email', email: true, props: { type: 'email' } },
|
|
10785
11682
|
{ key: 'passwordInput', type: 'input', label: 'Password', minLength: 8, props: { type: 'password' } },
|
|
10786
11683
|
{ key: 'numberInput', type: 'input', label: 'Number', min: 0, max: 100, props: { type: 'number' } },
|
|
@@ -11023,10 +11920,10 @@ Standard patterns: derivation, property-derivation, multi-page, conditional, val
|
|
|
11023
11920
|
Use pattern="list" to see all available patterns.
|
|
11024
11921
|
Use depth="minimal" for code-only output (no markdown).`,
|
|
11025
11922
|
{
|
|
11026
|
-
pattern:
|
|
11923
|
+
pattern: z56.string().optional().describe(
|
|
11027
11924
|
'Pattern to get: minimal-multipage, minimal-array, minimal-simplified-array, minimal-conditional, minimal-validation, minimal-hidden, derivation, property-derivation, multi-page, conditional, validation, complete, mega. Use "list" to see all.'
|
|
11028
11925
|
),
|
|
11029
|
-
depth:
|
|
11926
|
+
depth: z56.enum(["minimal", "brief", "full", "explained"]).default("full").describe(
|
|
11030
11927
|
"minimal=code only (~20-50 lines), brief=code+summary, full=code+comments (default), explained=code+detailed explanation"
|
|
11031
11928
|
)
|
|
11032
11929
|
},
|
|
@@ -11103,7 +12000,7 @@ function extractCode(markdown) {
|
|
|
11103
12000
|
}
|
|
11104
12001
|
|
|
11105
12002
|
// packages/dynamic-form-mcp/src/tools/validate.tool.ts
|
|
11106
|
-
import { z as
|
|
12003
|
+
import { z as z57 } from "zod";
|
|
11107
12004
|
import { readFile } from "fs/promises";
|
|
11108
12005
|
|
|
11109
12006
|
// packages/dynamic-form-mcp/src/utils/ast-extractor.ts
|
|
@@ -11717,10 +12614,10 @@ Example errors you'll see:
|
|
|
11717
12614
|
- "options MUST be at FIELD level, NOT inside props"
|
|
11718
12615
|
- "containers only support 'hidden' logic type"`,
|
|
11719
12616
|
{
|
|
11720
|
-
config:
|
|
12617
|
+
config: z57.union([z57.string(), z57.object({}).passthrough()]).describe(
|
|
11721
12618
|
"File path (.ts/.js) OR JSON string OR JSON object. Auto-detects: paths ending in .ts/.js or starting with / are treated as files."
|
|
11722
12619
|
),
|
|
11723
|
-
uiIntegration:
|
|
12620
|
+
uiIntegration: z57.enum(UI_INTEGRATIONS3).default("material").describe("UI library to validate against (material, bootstrap, primeng, ionic). Defaults to material.")
|
|
11724
12621
|
},
|
|
11725
12622
|
async ({ config, uiIntegration }) => {
|
|
11726
12623
|
try {
|
|
@@ -11826,7 +12723,7 @@ If validating JSON, ensure:
|
|
|
11826
12723
|
}
|
|
11827
12724
|
|
|
11828
12725
|
// packages/dynamic-form-mcp/src/tools/scaffold.tool.ts
|
|
11829
|
-
import { z as
|
|
12726
|
+
import { z as z58 } from "zod";
|
|
11830
12727
|
var UI_INTEGRATIONS4 = ["material", "bootstrap", "primeng", "ionic"];
|
|
11831
12728
|
function parseFieldDefs(fields) {
|
|
11832
12729
|
return fields.map((f) => {
|
|
@@ -12081,12 +12978,12 @@ Examples:
|
|
|
12081
12978
|
- With groups: pages=0 groups=["address","billing"]
|
|
12082
12979
|
- With hidden: hidden=["userId:abc123","source:web"]`,
|
|
12083
12980
|
{
|
|
12084
|
-
pages:
|
|
12085
|
-
arrays:
|
|
12086
|
-
groups:
|
|
12087
|
-
hidden:
|
|
12088
|
-
fields:
|
|
12089
|
-
uiIntegration:
|
|
12981
|
+
pages: z58.number().min(0).max(10).default(0).describe("Number of pages (0 = single-page form, 1-10 = multi-page wizard)"),
|
|
12982
|
+
arrays: z58.array(z58.string()).optional().describe('Array field names for dynamic lists, e.g., ["contacts", "addresses"]'),
|
|
12983
|
+
groups: z58.array(z58.string()).optional().describe('Group field names for nested objects, e.g., ["address", "billing"]'),
|
|
12984
|
+
hidden: z58.array(z58.string()).optional().describe('Hidden fields as "name:value" pairs, e.g., ["userId:abc", "version:1"]'),
|
|
12985
|
+
fields: z58.array(z58.string()).optional().describe('Basic fields as "name:type" pairs, e.g., ["email:input", "country:select", "age:slider"]'),
|
|
12986
|
+
uiIntegration: z58.enum(UI_INTEGRATIONS4).default("material").describe("UI library (for future UI-specific props). Defaults to material.")
|
|
12090
12987
|
},
|
|
12091
12988
|
async ({ pages, arrays = [], groups = [], hidden = [], fields = [] }) => {
|
|
12092
12989
|
const fieldDefs = parseFieldDefs(fields);
|
|
@@ -12128,7 +13025,7 @@ Examples:
|
|
|
12128
13025
|
}
|
|
12129
13026
|
|
|
12130
13027
|
// packages/dynamic-form-mcp/src/tools/search.tool.ts
|
|
12131
|
-
import { z as
|
|
13028
|
+
import { z as z59 } from "zod";
|
|
12132
13029
|
var searchIndex = null;
|
|
12133
13030
|
function getTopicSubcategory(key) {
|
|
12134
13031
|
const fieldTypes = ["input", "select", "slider", "radio", "checkbox", "textarea", "datepicker", "toggle", "text", "hidden"];
|
|
@@ -12183,6 +13080,18 @@ function buildIndex() {
|
|
|
12183
13080
|
toolCall: `ngforge_examples pattern="${key}"`
|
|
12184
13081
|
});
|
|
12185
13082
|
}
|
|
13083
|
+
for (const wrapper of getWrappers()) {
|
|
13084
|
+
const subcategory = wrapper.availability === "demo-only" ? `Wrapper (demo, ${wrapper.category})` : `Wrapper (${wrapper.category})`;
|
|
13085
|
+
entries.push({
|
|
13086
|
+
id: wrapper.type,
|
|
13087
|
+
category: "wrapper",
|
|
13088
|
+
subcategory,
|
|
13089
|
+
description: wrapper.description,
|
|
13090
|
+
aliases: [],
|
|
13091
|
+
content: `${wrapper.type} wrapper ${wrapper.description} ${wrapper.package}`.toLowerCase(),
|
|
13092
|
+
toolCall: `ngforge_lookup topic="${wrapper.type}"`
|
|
13093
|
+
});
|
|
13094
|
+
}
|
|
12186
13095
|
searchIndex = entries;
|
|
12187
13096
|
return entries;
|
|
12188
13097
|
}
|
|
@@ -12225,7 +13134,7 @@ Try broader terms or check available topics:
|
|
|
12225
13134
|
const lines = ["# Search Results", ""];
|
|
12226
13135
|
for (let i = 0; i < results.length; i++) {
|
|
12227
13136
|
const { entry } = results[i];
|
|
12228
|
-
const categoryLabel = entry.category === "topic" ? `Topic \xB7 ${entry.subcategory}` : `Example \xB7 ${entry.subcategory}`;
|
|
13137
|
+
const categoryLabel = entry.category === "topic" ? `Topic \xB7 ${entry.subcategory}` : entry.category === "wrapper" ? entry.subcategory : `Example \xB7 ${entry.subcategory}`;
|
|
12229
13138
|
lines.push(`${i + 1}. **${entry.id}** (${categoryLabel})`);
|
|
12230
13139
|
lines.push(` ${entry.description}`);
|
|
12231
13140
|
lines.push(` \u2192 \`${entry.toolCall}\``);
|
|
@@ -12252,7 +13161,7 @@ Use this when you don't know the exact topic name.
|
|
|
12252
13161
|
|
|
12253
13162
|
New to ng-forge? Start with: ngforge_lookup topic="workflow"`,
|
|
12254
13163
|
{
|
|
12255
|
-
query:
|
|
13164
|
+
query: z59.string().describe("Natural language or keywords to search for")
|
|
12256
13165
|
},
|
|
12257
13166
|
async ({ query }) => {
|
|
12258
13167
|
const index = buildIndex();
|