diff --git a/package-lock.json b/package-lock.json index 1543635..62666d3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@lolocompany/ra-lolo-cli", - "version": "0.2.3", + "version": "0.3.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@lolocompany/ra-lolo-cli", - "version": "0.2.3", + "version": "0.3.0", "license": "ISC", "dependencies": { "change-case": "^5.4.4", diff --git a/package.json b/package.json index 147c0de..197fc4b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@lolocompany/ra-lolo-cli", - "version": "0.2.3", + "version": "0.3.0", "description": "CLI tool to build react-admin components based on json-schema", "main": "index.js", "bin": { diff --git a/services/componentService.js b/services/componentService.js index db8b887..e2af333 100644 --- a/services/componentService.js +++ b/services/componentService.js @@ -1,25 +1,45 @@ export const generateFields = (properties, disableChoices = false) => { + if (!Array.isArray(properties)) { + throw new Error("Invalid properties: must be an array."); + } + return properties.map((field) => { + if (!field || !field.component || !field.value) { + console.warn("Invalid field definition:", field); + return null; + } + // Handle NestedObjectSection if (field.component === "NestedObjectSection") { + if (!Array.isArray(field.properties)) { + console.warn("Invalid NestedObjectSection properties:", field); + return null; + } const nestedFields = field.properties .map( (nestedField) => - `<${nestedField.component} source="${nestedField.value}" />` + nestedField.component && nestedField.value + ? `<${nestedField.component} source="${nestedField.value}" />` + : null ) + .filter(Boolean) .join("\n"); return `<> -

${field.name}

+

${field.name || "Section"}

${nestedFields} `; } // Handle ArrayObjectSimpleFormIterator if (field.component === "ArrayObjectSimpleFormIterator") { + if (!Array.isArray(field.items)) { + console.warn("Invalid items for ArrayObjectSimpleFormIterator:", field); + return null; + } return `<> - ${generateFields(field.items).join("\n")} + ${generateFields(field.items, disableChoices).join("\n")} `; @@ -39,12 +59,16 @@ export const generateFields = (properties, disableChoices = false) => { return ` - + `; } // Handle CheckboxGroupInput for createView if (field.component === "CheckboxGroupInput") { + if (!disableChoices && !Array.isArray(field.choices)) { + console.warn("Invalid choices for CheckboxGroupInput:", field); + return null; + } return ``; @@ -61,5 +85,5 @@ export const generateFields = (properties, disableChoices = false) => { ? ` choices={${JSON.stringify(field.choices)}}` : "" } />`; - }); -}; + }).filter(Boolean); // Remove null/invalid fields from the result +}; \ No newline at end of file diff --git a/services/schemaService.js b/services/schemaService.js index 375c7ee..301e66c 100644 --- a/services/schemaService.js +++ b/services/schemaService.js @@ -16,6 +16,17 @@ export const getProperties = (schema, parentKey = "") => { filter: [], }; + // Validate schema and schema.properties + if ( + !schema || + typeof schema !== "object" || + !schema.properties || + typeof schema.properties !== "object" + ) { + console.warn("Invalid schema or schema.properties is not an object."); + return views; // Return empty views if invalid + } + Object.keys(schema.properties).forEach((key) => { const property = schema.properties[key]; const fieldName = parentKey ? `${parentKey}.${key}` : key; @@ -76,4 +87,4 @@ export const getProperties = (schema, parentKey = "") => { }); return views; -}; +}; \ No newline at end of file