UNPKG

stackpress

Version:

Incept is a content management framework.

203 lines (202 loc) 7.83 kB
export default function generate(directory, registry) { for (const model of registry.model.values()) { model.columns.forEach(column => column.list.method === 'fieldset' ? (column.multiple ? generateFieldsetTable(directory, model, column) : generateFieldsetInfo(directory, model, column)) : generateFormat(directory, model, column)); } for (const fieldset of registry.fieldset.values()) { fieldset.columns.forEach(column => column.list.method === 'fieldset' ? (column.multiple ? generateFieldsetTable(directory, fieldset, column) : generateFieldsetInfo(directory, fieldset, column)) : generateFormat(directory, fieldset, column)); } } export function generateFieldsetTable(directory, fieldset, column) { if (!column.fieldset) return; const columnFieldset = column.fieldset; const path = `${fieldset.name}/components/lists/${column.title}ListFormat.tsx`; const source = directory.createSourceFile(path, '', { overwrite: true }); source.addImportDeclaration({ moduleSpecifier: 'r22n', namedImports: ['useLanguage'] }); source.addImportDeclaration({ moduleSpecifier: 'stackpress/view/client', namedImports: ['useStripe'] }); source.addImportDeclaration({ moduleSpecifier: 'frui/element/Table', namedImports: ['Table', 'Thead', 'Trow', 'Tcol'] }); columnFieldset.lists.forEach(column => { if (typeof column.list.component !== 'string') return; source.addImportDeclaration({ moduleSpecifier: `../../../${columnFieldset.name}/components/lists/${column.title}ListFormat.js`, defaultImport: `${column.title}ListFormat` }); }); const props = `{ data: ${fieldset.title}Extended, value: ${columnFieldset.title}${column.multiple ? '[]' : ''} }`; source.addFunction({ isDefaultExport: true, name: `${column.title}ListFormat`, parameters: [{ name: 'props', type: props }], statements: (` const { value } = props; const { _ } = useLanguage(); const stripe = useStripe('theme-bg-bg0', 'theme-bg-bg1'); if (!Array.isArray(value) || !value.length) return null; return ( <Table> ${columnFieldset.lists.filter(column => column.list.method !== 'hide').map(column => { return (` <Trow> <Tcol noWrap className={\`!theme-bc-bd2 font-bold \${stripe(true)}\`}> {_('${column.label}')} </Tcol> <Tcol noWrap className={\`!theme-bc-bd2 \${stripe()}\`}> ${column.required && !column.list.component ? `{value.${column.name}.toString()}` : column.required && column.list.component ? `<${column.title}ListFormat data={value} value={value.${column.name}} />` : !column.required && !column.list.component ? `{value.${column.name} ? value.${column.name}.toString() : ''}` : `{value.${column.name} ? (<${column.title}ListFormat data={value} value={value.${column.name}} />) : ''}`} </Tcol> </Trow> `); })} </Table> ); `) }); } export function generateFieldsetInfo(directory, fieldset, column) { if (!column.fieldset) return; const columnFieldset = column.fieldset; const path = `${fieldset.name}/components/lists/${column.title}ListFormat.tsx`; const source = directory.createSourceFile(path, '', { overwrite: true }); source.addImportDeclaration({ moduleSpecifier: 'r22n', namedImports: ['useLanguage'] }); source.addImportDeclaration({ moduleSpecifier: 'stackpress/view/client', namedImports: ['useStripe'] }); source.addImportDeclaration({ moduleSpecifier: 'frui/element/Table', namedImports: ['Table', 'Trow', 'Tcol'] }); columnFieldset.lists.forEach(column => { if (typeof column.list.component !== 'string') return; source.addImportDeclaration({ moduleSpecifier: `../../../${columnFieldset.name}/components/lists/${column.title}ListFormat.js`, defaultImport: `${column.title}ListFormat` }); }); const props = `{ data: ${fieldset.title}Extended, value: ${columnFieldset.title}${column.multiple ? '[]' : ''} }`; source.addFunction({ isDefaultExport: true, name: `${column.title}ListFormat`, parameters: [{ name: 'props', type: props }], statements: (` const { value } = props; const { _ } = useLanguage(); const stripe = useStripe('theme-bg-bg0', 'theme-bg-bg1'); return ( <Table> ${columnFieldset.lists.filter(column => column.list.method !== 'hide').map(column => { return (` <Trow> <Tcol noWrap className={\`!theme-bc-bd2 font-bold \${stripe(true)}\`}> {_('${column.label}')} </Tcol> <Tcol noWrap className={\`!theme-bc-bd2 \${stripe()}\`}> ${column.required && !column.list.component ? `{value.${column.name}.toString()}` : column.required && column.list.component ? `<${column.title}ListFormat data={value} value={value.${column.name}} />` : !column.required && !column.list.component ? `{value.${column.name} ? value.${column.name}.toString() : ''}` : `{value.${column.name} ? (<${column.title}ListFormat data={value} value={value.${column.name}} />) : ''}`} </Tcol> </Trow> `); })} </Table> ); `) }); } export function generateFormat(directory, fieldset, column) { if (typeof column.list.component !== 'string') return; const path = `${fieldset.name}/components/lists/${column.title}ListFormat.tsx`; const source = directory.createSourceFile(path, '', { overwrite: true }); source.addImportDeclaration({ moduleSpecifier: `frui/format/${column.list.component}`, defaultImport: column.list.component }); const props = `{ data: ${fieldset.title}Extended, value: ${column.typemap.format}${column.multiple ? '[]' : ''} }`; if (column.list.method === 'template') { source.addImportDeclaration({ moduleSpecifier: 'mustache', defaultImport: 'mustache' }); source.addImportDeclaration({ isTypeOnly: true, moduleSpecifier: '../../types.js', namedImports: [`${fieldset.title}Extended`] }); source.addFunction({ isDefaultExport: true, name: `${column.title}Format`, parameters: [{ name: 'props', type: props }], statements: (` //props const { data } = props; const value = mustache.render( '${column.list.attributes.template}', data ); //render return ( <${column.list.component} value={value} /> ); `) }); return; } source.addFunction({ isDefaultExport: true, name: `${column.title}ListFormat`, parameters: [ { name: 'props', type: props } ], statements: (` //props const { data, value } = props; const attributes = ${JSON.stringify(column.list.attributes)}; //render return ( <${column.list.component} {...attributes} data={data} value={value} /> ); `) }); }