@mindmakr/gs-websdk
Version:
Web SDK for Guru SaaS System - Complete JavaScript/TypeScript SDK for building applications with dynamic schema management
790 lines • 19.8 kB
JavaScript
"use strict";
/**
* Fluent API Template Builder
* Provides a developer-friendly way to build schema templates declaratively
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.ArrayFieldBuilder = exports.ObjectFieldBuilder = exports.FieldBuilder = exports.TemplateBuilder = void 0;
/**
* Fluent API Template Builder
*
* @example
* ```typescript
* const template = new TemplateBuilder('customer_profile', 'Customer Profile')
* .category('customer_management')
* .description('Comprehensive customer information form')
* .section('Basic Information', 'Essential customer details')
* .text('firstName', 'First Name')
* .required()
* .minLength(1)
* .maxLength(50)
* .placeholder('Enter first name')
* .layout({ width: 'half' })
* .email('email', 'Email Address')
* .required()
* .placeholder('customer@example.com')
* .layout({ width: 'half' })
* .section('Contact Information')
* .phone('phone', 'Phone Number')
* .layout({ width: 'half' })
* .select('country', 'Country')
* .options(['US', 'CA', 'UK'], ['United States', 'Canada', 'United Kingdom'])
* .default('US')
* .layout({ width: 'half' })
* .section('Preferences')
* .boolean('newsletter', 'Subscribe to Newsletter')
* .default(false)
* .multiSelect('interests', 'Areas of Interest')
* .options(['technology', 'sports', 'music', 'travel'])
* .minItems(1)
* .build();
* ```
*/
class TemplateBuilder {
constructor(code, name) {
this.fieldOrder = [];
this.requiredFields = new Set();
this.enhancedProperties = {};
this.templateData = {
name,
code,
category: 'general',
schema_definition: {
type: 'object',
title: name,
properties: {},
required: [],
'x-field-order': []
}
};
}
/**
* Set template category
*/
category(category) {
this.templateData.category = category;
return this;
}
/**
* Set template description
*/
description(description) {
this.templateData.description = description;
this.templateData.schema_definition.description = description;
return this;
}
/**
* Set template path for hierarchical organization
*/
path(path) {
this.templateData.path = path;
return this;
}
/**
* Set template version
*/
version(version) {
this.templateData.version = version;
return this;
}
/**
* Mark template as system template
*/
system(isSystem = true) {
this.templateData.is_system = isSystem;
return this;
}
/**
* Add a section divider
*/
section(title, description) {
const sectionKey = `section_${Date.now()}`;
this.templateData.schema_definition.properties[sectionKey] = {
type: 'null',
title,
description,
'ui:widget': 'section'
};
this.fieldOrder.push(sectionKey);
return this;
}
/**
* Add a text field
*/
text(key, title) {
return this.addField(key, {
type: 'string',
title: title || key
});
}
/**
* Add an email field
*/
email(key, title) {
return this.addField(key, {
type: 'string',
format: 'email',
title: title || key
});
}
/**
* Add a password field
*/
password(key, title) {
return this.addField(key, {
type: 'string',
format: 'password',
title: title || key
});
}
/**
* Add a phone field
*/
phone(key, title) {
return this.addField(key, {
type: 'string',
format: 'phone',
title: title || key
});
}
/**
* Add a URL field
*/
url(key, title) {
return this.addField(key, {
type: 'string',
format: 'url',
title: title || key
});
}
/**
* Add a textarea field
*/
textarea(key, title) {
return this.addField(key, {
type: 'string',
format: 'textarea',
title: title || key,
'ui:widget': 'textarea'
});
}
/**
* Add a rich text field
*/
richText(key, title) {
return this.addField(key, {
type: 'string',
format: 'richtext',
title: title || key,
'ui:widget': 'richtext'
});
}
/**
* Add a number field
*/
number(key, title) {
return this.addField(key, {
type: 'number',
title: title || key
});
}
/**
* Add an integer field
*/
integer(key, title) {
return this.addField(key, {
type: 'integer',
title: title || key
});
}
/**
* Add a boolean field
*/
boolean(key, title) {
return this.addField(key, {
type: 'boolean',
title: title || key
});
}
/**
* Add a date field
*/
date(key, title) {
return this.addField(key, {
type: 'string',
format: 'date',
title: title || key
});
}
/**
* Add a datetime field
*/
datetime(key, title) {
return this.addField(key, {
type: 'string',
format: 'datetime',
title: title || key
});
}
/**
* Add a time field
*/
time(key, title) {
return this.addField(key, {
type: 'string',
format: 'time',
title: title || key
});
}
/**
* Add a color picker field
*/
color(key, title) {
return this.addField(key, {
type: 'string',
format: 'color',
title: title || key
});
}
/**
* Add a select dropdown field
*/
select(key, title) {
return this.addField(key, {
type: 'string',
title: title || key
});
}
/**
* Add a radio button field
*/
radio(key, title) {
return this.addField(key, {
type: 'string',
title: title || key,
'ui:widget': 'radio'
});
}
/**
* Add a multi-select field
*/
multiSelect(key, title) {
return this.addField(key, {
type: 'array',
title: title || key,
items: {
type: 'string'
},
uniqueItems: true
});
}
/**
* Add a checkbox array field
*/
checkboxes(key, title) {
return this.addField(key, {
type: 'array',
title: title || key,
'ui:widget': 'checkboxes',
items: {
type: 'string'
},
uniqueItems: true
});
}
/**
* Add a file upload field
*/
file(key, title) {
return this.addField(key, {
type: 'string',
format: 'data-url',
title: title || key,
'ui:widget': 'file'
});
}
/**
* Add an image upload field
*/
image(key, title) {
return this.addField(key, {
type: 'string',
format: 'image-url-or-upload',
title: title || key,
'ui:widget': 'ImageInputWidget'
});
}
/**
* Add a video upload field
*/
video(key, title) {
return this.addField(key, {
type: 'string',
format: 'video-url-or-upload',
title: title || key,
'ui:widget': 'VideoInputWidget'
});
}
/**
* Add an audio upload field
*/
audio(key, title) {
return this.addField(key, {
type: 'string',
format: 'audio-url-or-upload',
title: title || key,
'ui:widget': 'AudioInputWidget'
});
}
/**
* Add a reference field (foreign key)
*/
reference(key, title) {
return this.addField(key, {
type: 'string',
format: 'reference',
title: title || key,
'ui:widget': 'ReferenceFieldWidget'
});
}
/**
* Add an object field (nested form)
*/
object(key, title) {
const field = {
type: 'object',
title: title || key,
properties: {}
};
this.templateData.schema_definition.properties[key] = field;
this.fieldOrder.push(key);
this.currentField = key;
return new ObjectFieldBuilder(this, key, field);
}
/**
* Add an array field (list of items)
*/
array(key, title) {
const field = {
type: 'array',
title: title || key,
items: {
type: 'string'
}
};
this.templateData.schema_definition.properties[key] = field;
this.fieldOrder.push(key);
this.currentField = key;
return new ArrayFieldBuilder(this, key, field);
}
/**
* Internal method to add a field
*/
addField(key, config) {
this.templateData.schema_definition.properties[key] = config;
this.fieldOrder.push(key);
this.currentField = key;
return new FieldBuilder(this, key);
}
/**
* Mark current field as required
*/
markRequired(key) {
this.requiredFields.add(key);
}
/**
* Set enhancement for current field
*/
setEnhancement(key, enhancement) {
if (!this.enhancedProperties[key]) {
this.enhancedProperties[key] = {};
}
Object.assign(this.enhancedProperties[key], enhancement);
}
/**
* Get current field configuration
*/
getField(key) {
return this.templateData.schema_definition.properties[key];
}
/**
* Build the final template configuration
*/
build() {
// Finalize required fields
this.templateData.schema_definition.required = Array.from(this.requiredFields);
// Set field order
this.templateData.schema_definition['x-field-order'] = this.fieldOrder;
// Add enhanced properties if any
if (Object.keys(this.enhancedProperties).length > 0) {
this.templateData.enhanced_properties = this.enhancedProperties;
}
return this.templateData;
}
}
exports.TemplateBuilder = TemplateBuilder;
/**
* Field builder for fluent configuration of individual fields
*/
class FieldBuilder {
constructor(templateBuilder, fieldKey) {
this.templateBuilder = templateBuilder;
this.fieldKey = fieldKey;
}
/**
* Mark field as required
*/
required() {
this.templateBuilder.markRequired(this.fieldKey);
return this;
}
/**
* Set field placeholder
*/
placeholder(placeholder) {
const field = this.templateBuilder.getField(this.fieldKey);
field['ui:placeholder'] = placeholder;
return this;
}
/**
* Set field help text
*/
help(helpText) {
const field = this.templateBuilder.getField(this.fieldKey);
field['ui:help'] = helpText;
return this;
}
/**
* Set field description
*/
description(description) {
const field = this.templateBuilder.getField(this.fieldKey);
field.description = description;
return this;
}
/**
* Set default value
*/
default(value) {
const field = this.templateBuilder.getField(this.fieldKey);
field.default = value;
return this;
}
/**
* Set minimum length (for strings)
*/
minLength(length) {
const field = this.templateBuilder.getField(this.fieldKey);
field.minLength = length;
return this;
}
/**
* Set maximum length (for strings)
*/
maxLength(length) {
const field = this.templateBuilder.getField(this.fieldKey);
field.maxLength = length;
return this;
}
/**
* Set minimum value (for numbers)
*/
min(value) {
const field = this.templateBuilder.getField(this.fieldKey);
field.minimum = value;
return this;
}
/**
* Set maximum value (for numbers)
*/
max(value) {
const field = this.templateBuilder.getField(this.fieldKey);
field.maximum = value;
return this;
}
/**
* Set validation pattern (regex)
*/
pattern(pattern) {
const field = this.templateBuilder.getField(this.fieldKey);
field.pattern = pattern;
return this;
}
/**
* Set enum options for select/radio fields
*/
options(values, labels) {
const field = this.templateBuilder.getField(this.fieldKey);
field.enum = values;
if (labels) {
field.enumNames = labels;
}
// For array fields, set items.enum
if (field.type === 'array' && field.items) {
field.items.enum = values;
if (labels) {
field.items.enumNames = labels;
}
}
return this;
}
/**
* Set minimum items (for arrays)
*/
minItems(count) {
const field = this.templateBuilder.getField(this.fieldKey);
field.minItems = count;
return this;
}
/**
* Set maximum items (for arrays)
*/
maxItems(count) {
const field = this.templateBuilder.getField(this.fieldKey);
field.maxItems = count;
return this;
}
/**
* Ensure unique items in array
*/
unique() {
const field = this.templateBuilder.getField(this.fieldKey);
field.uniqueItems = true;
return this;
}
/**
* Set layout configuration
*/
layout(config) {
const field = this.templateBuilder.getField(this.fieldKey);
field.layout = config;
return this;
}
/**
* Set field styling
*/
style(config) {
this.templateBuilder.setEnhancement(this.fieldKey, {
style: config
});
return this;
}
/**
* Set field icon
*/
icon(icon) {
this.templateBuilder.setEnhancement(this.fieldKey, {
icon
});
return this;
}
/**
* Add conditional display logic
*/
conditional(config) {
const field = this.templateBuilder.getField(this.fieldKey);
if (!field.layout)
field.layout = {};
field.layout.conditional = config;
return this;
}
/**
* Add custom validation rules
*/
validation(rules) {
this.templateBuilder.setEnhancement(this.fieldKey, {
validation: rules
});
return this;
}
/**
* Return to template builder
*/
end() {
return this.templateBuilder;
}
// Proxy methods to allow chaining with template builder
section(title, description) {
return this.templateBuilder.section(title, description);
}
text(key, title) {
return this.templateBuilder.text(key, title);
}
email(key, title) {
return this.templateBuilder.email(key, title);
}
password(key, title) {
return this.templateBuilder.password(key, title);
}
phone(key, title) {
return this.templateBuilder.phone(key, title);
}
url(key, title) {
return this.templateBuilder.url(key, title);
}
textarea(key, title) {
return this.templateBuilder.textarea(key, title);
}
richText(key, title) {
return this.templateBuilder.richText(key, title);
}
number(key, title) {
return this.templateBuilder.number(key, title);
}
integer(key, title) {
return this.templateBuilder.integer(key, title);
}
boolean(key, title) {
return this.templateBuilder.boolean(key, title);
}
date(key, title) {
return this.templateBuilder.date(key, title);
}
datetime(key, title) {
return this.templateBuilder.datetime(key, title);
}
time(key, title) {
return this.templateBuilder.time(key, title);
}
color(key, title) {
return this.templateBuilder.color(key, title);
}
select(key, title) {
return this.templateBuilder.select(key, title);
}
radio(key, title) {
return this.templateBuilder.radio(key, title);
}
multiSelect(key, title) {
return this.templateBuilder.multiSelect(key, title);
}
checkboxes(key, title) {
return this.templateBuilder.checkboxes(key, title);
}
file(key, title) {
return this.templateBuilder.file(key, title);
}
image(key, title) {
return this.templateBuilder.image(key, title);
}
video(key, title) {
return this.templateBuilder.video(key, title);
}
audio(key, title) {
return this.templateBuilder.audio(key, title);
}
reference(key, title) {
return this.templateBuilder.reference(key, title);
}
build() {
return this.templateBuilder.build();
}
}
exports.FieldBuilder = FieldBuilder;
/**
* Object field builder for nested forms
*/
class ObjectFieldBuilder {
constructor(templateBuilder, fieldKey, objectField) {
this.templateBuilder = templateBuilder;
this.fieldKey = fieldKey;
this.objectField = objectField;
}
/**
* Add property to object
*/
property(key, config) {
this.objectField.properties[key] = config;
return this;
}
/**
* Add text property
*/
text(key, title) {
return this.property(key, {
type: 'string',
title: title || key
});
}
/**
* Add number property
*/
number(key, title) {
return this.property(key, {
type: 'number',
title: title || key
});
}
/**
* Add boolean property
*/
boolean(key, title) {
return this.property(key, {
type: 'boolean',
title: title || key
});
}
/**
* Return to template builder
*/
end() {
return this.templateBuilder;
}
}
exports.ObjectFieldBuilder = ObjectFieldBuilder;
/**
* Array field builder for list items
*/
class ArrayFieldBuilder {
constructor(templateBuilder, fieldKey, arrayField) {
this.templateBuilder = templateBuilder;
this.fieldKey = fieldKey;
this.arrayField = arrayField;
}
/**
* Set item type for array
*/
itemType(type) {
this.arrayField.items.type = type;
return this;
}
/**
* Set items as objects with properties
*/
itemsAsObject(properties) {
this.arrayField.items = {
type: 'object',
properties
};
return this;
}
/**
* Set minimum items
*/
minItems(count) {
this.arrayField.minItems = count;
return this;
}
/**
* Set maximum items
*/
maxItems(count) {
this.arrayField.maxItems = count;
return this;
}
/**
* Ensure unique items
*/
unique() {
this.arrayField.uniqueItems = true;
return this;
}
/**
* Return to template builder
*/
end() {
return this.templateBuilder;
}
}
exports.ArrayFieldBuilder = ArrayFieldBuilder;
//# sourceMappingURL=template-builder.js.map