I'm working on a tool to transform what I call an Application Definition File (a format specified as a JSON schema) into a line-of business NodeJS/Express/Postgres web app.<p>You might think of it a lo-code tool, but I'm aiming more for it to be a no-code tool, as in the level of sophistication should be such that there is rarely a need to touch the generated application.<p>Here is a sample application definition file (to model an app for the tool itself):<p><pre><code> {
"name": "VReal",
"description": "Virtual realtor web app",
"entities": {
"propertyHeader": {
"title": "Listing Header",
"description": "The headers for all listings, whether sale or rental",
"namePlural": "listingHeaders",
"fields": {
"title": "medium_text",
"description": "long_text",
"propertyType": [
"apartment",
"office",
"shop",
"house"
],
"currency": "short_text",
"squareFeet": {
"optional": true,
"type": "integer"
},
"bedrooms": "integer",
"bathrooms": "integer",
"garages": "integer",
"hall": "boolean",
"kitchen": "boolean",
"furnished": "boolean",
"neighborhood": "medium_text",
"latitude": {
"optional": true,
"type": "float"
},
"longitude": {
"optional": true,
"type": "float"
},
"phone": "phone_number",
"phoneAlt": {
"type": "phone_number",
"optional": true,
"title": "Alternative Phone"
},
"email": "email_address",
"contact": "medium_text",
"whenPosted": "datetime",
"externalUrl": {
"optional": true,
"type": "url"
}
},
"parentsManyToMany": [
"project"
],
"parentsOneToMany": [
"city"
]
},
"propertyForLease": {
"title": "Property for Lease",
"namePlural": "propertiesForLease",
"extends": "propertyHeader",
"fields": {
"basePeriod": [
"month",
"day",
"week",
"hour",
"quarter"
],
"pricePerPeriod": "integer",
"termNumPeriods": {
"type": "integer",
"title": "Rental Lease Term (Base periods)"
},
"advanceNumPeriods": {
"type": "integer",
"title": "Advance Required (Base periods)"
}
}
},
"propertyForSale": {
"title": "Property for Sale",
"namePlural": "propertiesForSale",
"extends": "propertyHeader",
"fields": {
"salePrice": "integer"
}
},
"propertyMessage": {
"title": "Message",
"namePlural": "propertyMessages",
"fields": {
"direction": [
"incoming",
"outgoing"
],
"content": "long_text",
"timestamp": "datetime"
},
"parentsOneToMany": [
"propertyHeader",
"user"
]
},
"project": {
"title": "Project",
"description": "Projects in which users an place properties",
"namePlural": "projects",
"fields": {
"name": "medium_text",
"description": "long_text"
}
},
"listingMedia": {
"title": "Listing Media",
"description": "Media (images, videos, etc) for listings",
"namePlural": "listingMedia",
"fields": {
"content": "media"
},
"readonly": false,
"parents": [
"propertyForLease",
"propertyForSale"
]
},
"city": {
"title": "City",
"description": "Cities in which properties are located",
"namePlural": "Cities",
"fields": {
"name": "medium_text",
"latitude": {
"optional": true,
"type": "float"
},
"longitude": {
"optional": true,
"type": "float"
}
}
}
},
"UI": {
"pages": {
"perEntity": {
"propertyForLease": {
"objectEditor": {
"kind": "form",
"columns": "dynamic"
},
"objectListViewer": {
"container": {
"control": "list",
"orientation": "vertical",
"template": {
"fields": [
"title",
"pricePerPeriod",
"basePeriod",
"whenPosted",
"listingMedia#content"
],
"labels": "caption"
}
}
},
"editingStrategy": "only-devs"
},
"propertyForSale": {
"objectEditor": {
"kind": "form",
"columns": "dynamic"
},
"objectListViewer": {
"container": {
"control": "list",
"orientation": "vertical",
"template": {
"fields": []
}
}
},
"editingStrategy": "only-devs"
},
"listingMedia": {
"objectEditor": {
"kind": "form",
"columns": "dynamic"
},
"objectListViewer": {
"container": {
"control": "list",
"orientation": "vertical",
"template": {
"fields": []
}
}
}
}
},
"custom": {
"404": {},
"splash": {
"slogan": "Supercharge your real estate acquisition",
"description": "VReal is your virtual real estate agent that provides superior and fast service, backed by an outstanding human team you can speak to",
"callToAction": "Get Started",
"inputForCTA": {
"name": "search",
"description": ""
},
"targetUrlForCTA": "/listings",
"smallPrintForCTA": "",
"extraContentUrl": "",
"corporateUsers": []
},
"login": {},
"register": {},
"userVerify": {},
"userAccount": {}
}
},
"initialAdhocPage": "splash",
"initialSessionPage": "propertyForLease",
"elements": {
"menu": "hierarchical-entity-groups",
"footer": {
"copyright": "© Example Systems, LLC. 2022. All rights reserved.",
"linkSets": [
{
"header": "Company",
"links": [
{
"title": "About Us",
"url": "/about"
},
{
"title": "Contact Us",
"url": "/contact"
},
{
"title": "Partners",
"url": "/partners"
},
{
"title": "Careers",
"url": "/careers"
},
{
"title": "Newsroom",
"url": "/news"
},
{
"title": "Blog",
"url": "/blog"
},
{
"title": "Events",
"url": "/events"
}
]
},
{
"header": "Support",
"links": [
{
"title": "Guides",
"url": "/help/docs"
},
{
"title": "Forum",
"url": "/help/forum"
},
{
"title": "Chat",
"url": "/help/chat"
},
{
"title": "Privacy",
"url": "/privacy"
},
{
"title": "Terms",
"url": "/terms"
}
]
},
{
"header": "Platform",
"links": [
{
"title": "Developer API",
"url": "/help/api"
},
{
"title": "Integrations",
"url": "/help/integrate"
}
]
}
],
"socialMediaLinks": {
"twitter": "https://twitter.com/VReal",
"facebook": "https://www.facebook.com/VReal/",
"instagram": "https://www.instagram.com/VReal",
"linkedin": "https://www.linkedin.com/company/VReal/"
},
"mobileAppLinks": {
"iosAppStore": "https://itunes.apple.com/US/app/id914172636",
"googlePlayStore": "http://example.com/z/buying/app-download?btn_android-download"
}
}
},
"architecture": {}
},
"security": {
"level": "authentication",
"userIdType": "sim",
"factors": {
"password": {
"validityRules": {}
},
"email": {}
}
}
}</code></pre>