UNPKG

@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
"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