| 63 | } |
| 64 | |
| 65 | private setSpecDefault(spec: PropertySpec<any>) { |
| 66 | spec.hasDefault = typeof spec.default !== 'undefined'; |
| 67 | |
| 68 | switch (spec.type) { |
| 69 | case 'array': |
| 70 | spec.default ??= []; |
| 71 | this.setSpecDefault(spec.item); |
| 72 | break; |
| 73 | case 'boolean': |
| 74 | spec.default ??= false; |
| 75 | break; |
| 76 | case 'node': |
| 77 | spec.default ??= null; |
| 78 | break; |
| 79 | case 'number': |
| 80 | spec.default ??= 0; |
| 81 | break; |
| 82 | case 'object': |
| 83 | for (const field of Object.values(spec.fields)) { |
| 84 | this.setSpecDefault(field); |
| 85 | } |
| 86 | spec.default ??= Object.fromEntries(Object.entries(spec.fields).map(([key, field]) => [key, field.default])); |
| 87 | break; |
| 88 | case 'custom': |
| 89 | break; |
| 90 | case 'radio': |
| 91 | spec.default ??= 'value' in spec.options[0] ? spec.options[0].value : spec.options[0]; |
| 92 | break; |
| 93 | case 'select': |
| 94 | spec.default ??= spec.options[0]?.value; |
| 95 | break; |
| 96 | case 'text': |
| 97 | case 'textarea': |
| 98 | spec.default ??= ''; |
| 99 | break; |
| 100 | default: |
| 101 | throw new Error('Unknown property spec'); |
| 102 | } |
| 103 | } |
| 104 | } |