angular-dynamic-forms-ai
Version:
AI-enhanced dynamic form generator for Angular using Template-Driven Forms
94 lines • 12.7 kB
JavaScript
import { Injectable } from '@angular/core';
import * as i0 from "@angular/core";
class AiValidationService {
validationRules = new Map([
['email', /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/],
['phone', /^\+?[\d\s-]{10,}$/],
['url', /^(https?:\/\/)?([\da-z.-]+)\.([a-z.]{2,6})([\/\w .-]*)*\/?$/],
['zipcode', /^\d{5}(-\d{4})?$/],
]);
suggestValidations(field) {
const fieldNameLower = field.name.toLowerCase();
const validations = { ...field.validations } || {};
// Email validation
if (fieldNameLower.includes('email')) {
validations.email = true;
validations.required = true;
field.type = 'email';
}
// Password validation
if (fieldNameLower.includes('password')) {
validations.required = true;
validations.minLength = 6;
field.type = 'password';
validations.pattern = '^(?=.*[A-Za-z])(?=.*\\d)[A-Za-z\\d]{6,}$';
}
// Phone validation
if (fieldNameLower.includes('phone')) {
validations.pattern = this.validationRules.get('phone')?.toString().slice(1, -1);
validations.required = true;
}
// Name validation
if (fieldNameLower.includes('name')) {
validations.required = true;
validations.minLength = 2;
}
// URL validation
if (fieldNameLower.includes('url') || fieldNameLower.includes('website')) {
validations.pattern = this.validationRules.get('url')?.toString().slice(1, -1);
}
// Zip code validation
if (fieldNameLower.includes('zip')) {
validations.pattern = this.validationRules.get('zipcode')?.toString().slice(1, -1);
}
field.validations = validations;
field.errorMessages = this.generateErrorMessages(field);
return field;
}
generateErrorMessages(field) {
const messages = {};
const validations = field.validations || {};
if (validations.required) {
messages.required = `${field.label} is required`;
}
if (validations.minLength) {
messages.minlength = `${field.label} must be at least ${validations.minLength} characters`;
}
if (validations.maxLength) {
messages.maxlength = `${field.label} cannot exceed ${validations.maxLength} characters`;
}
if (validations.email) {
messages.email = `Please enter a valid email address`;
}
if (validations.pattern) {
messages.pattern = this.getPatternErrorMessage(field.name);
}
return messages;
}
getPatternErrorMessage(fieldName) {
const fieldNameLower = fieldName.toLowerCase();
if (fieldNameLower.includes('password')) {
return 'Password must contain at least one letter and one number';
}
if (fieldNameLower.includes('phone')) {
return 'Please enter a valid phone number';
}
if (fieldNameLower.includes('url') || fieldNameLower.includes('website')) {
return 'Please enter a valid URL';
}
if (fieldNameLower.includes('zip')) {
return 'Please enter a valid ZIP code';
}
return 'Please enter a valid value';
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.6", ngImport: i0, type: AiValidationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.6", ngImport: i0, type: AiValidationService, providedIn: 'root' });
}
export { AiValidationService };
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.6", ngImport: i0, type: AiValidationService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWktdmFsaWRhdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZHluYW1pYy1mb3Jtcy9zcmMvbGliL3NlcnZpY2VzL2FpLXZhbGlkYXRpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUczQyxNQUdhLG1CQUFtQjtJQUN0QixlQUFlLEdBQUcsSUFBSSxHQUFHLENBQWlCO1FBQ2hELENBQUMsT0FBTyxFQUFFLGtEQUFrRCxDQUFDO1FBQzdELENBQUMsT0FBTyxFQUFFLG1CQUFtQixDQUFDO1FBQzlCLENBQUMsS0FBSyxFQUFFLDZEQUE2RCxDQUFDO1FBQ3RFLENBQUMsU0FBUyxFQUFFLGtCQUFrQixDQUFDO0tBQ2hDLENBQUMsQ0FBQztJQUVILGtCQUFrQixDQUFDLEtBQXNCO1FBQ3ZDLE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDaEQsTUFBTSxXQUFXLEdBQUcsRUFBRSxHQUFHLEtBQUssQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFFbkQsbUJBQW1CO1FBQ25CLElBQUksY0FBYyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUNwQyxXQUFXLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztZQUN6QixXQUFXLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztZQUM1QixLQUFLLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQztTQUN0QjtRQUVELHNCQUFzQjtRQUN0QixJQUFJLGNBQWMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDdkMsV0FBVyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7WUFDNUIsV0FBVyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7WUFDMUIsS0FBSyxDQUFDLElBQUksR0FBRyxVQUFVLENB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LENBQUM7U0FDNUM7UUFDRCxJQUFJLGNBQWMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksY0FBYyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUN4RSxPQUFPLDBCQUEwQixDQUFDO1NBQ25DO1FBQ0QsSUFBSSxjQUFjLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ2xDLE9BQU8sK0JBQStCLENBQUM7U0FDeEM7UUFFRCxPQUFPLDRCQUE0QixDQUFDO0lBQ3RDLENBQUM7dUdBbkdVLG1CQUFtQjsyR0FBbkIsbUJBQW1CLGNBRmxCLE1BQU07O1NBRVAsbUJBQW1COzJGQUFuQixtQkFBbUI7a0JBSC9CLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUZpZWxkQ29uZmlnIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9mb3JtLWZpZWxkLmludGVyZmFjZSc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIEFpVmFsaWRhdGlvblNlcnZpY2Uge1xuICBwcml2YXRlIHZhbGlkYXRpb25SdWxlcyA9IG5ldyBNYXA8c3RyaW5nLCBSZWdFeHA+KFtcbiAgICBbJ2VtYWlsJywgL15bYS16QS1aMC05Ll8lKy1dK0BbYS16QS1aMC05Li1dK1xcLlthLXpBLVpdezIsfSQvXSxcbiAgICBbJ3Bob25lJywgL15cXCs/W1xcZFxccy1dezEwLH0kL10sXG4gICAgWyd1cmwnLCAvXihodHRwcz86XFwvXFwvKT8oW1xcZGEtei4tXSspXFwuKFthLXouXXsyLDZ9KShbXFwvXFx3IC4tXSopKlxcLz8kL10sXG4gICAgWyd6aXBjb2RlJywgL15cXGR7NX0oLVxcZHs0fSk/JC9dLFxuICBdKTtcblxuICBzdWdnZXN0VmFsaWRhdGlvbnMoZmllbGQ6IEZvcm1GaWVsZENvbmZpZyk6IEZvcm1GaWVsZENvbmZpZyB7XG4gICAgY29uc3QgZmllbGROYW1lTG93ZXIgPSBmaWVsZC5uYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgdmFsaWRhdGlvbnMgPSB7IC4uLmZpZWxkLnZhbGlkYXRpb25zIH0gfHwge307XG5cbiAgICAvLyBFbWFpbCB2YWxpZGF0aW9uXG4gICAgaWYgKGZpZWxkTmFtZUxvd2VyLmluY2x1ZGVzKCdlbWFpbCcpKSB7XG4gICAgICB2YWxpZGF0aW9ucy5lbWFpbCA9IHRydWU7XG4gICAgICB2YWxpZGF0aW9ucy5yZXF1aXJlZCA9IHRydWU7XG4gICAgICBmaWVsZC50eXBlID0gJ2VtYWlsJztcbiAgICB9XG5cbiAgICAvLyBQYXNzd29yZCB2YWxpZGF0aW9uXG4gICAgaWYgKGZpZWxkTmFtZUxvd2VyLmluY2x1ZGVzKCdwYXNzd29yZCcpKSB7XG4gICAgICB2YWxpZGF0aW9ucy5yZXF1aXJlZCA9IHRydWU7XG4gICAgICB2YWxpZGF0aW9ucy5taW5MZW5ndGggPSA2O1xuICAgICAgZmllbGQudHlwZSA9ICdwYXNzd29yZCc7XG4gICAgICB2YWxpZGF0aW9ucy5wYXR0ZXJuID0gJ14oPz0uKltBLVphLXpdKSg/PS4qXFxcXGQpW0EtWmEtelxcXFxkXXs2LH0kJztcbiAgICB9XG5cbiAgICAvLyBQaG9uZSB2YWxpZGF0aW9uXG4gICAgaWYgKGZpZWxkTmFtZUxvd2VyLmluY2x1ZGVzKCdwaG9uZScpKSB7XG4gICAgICB2YWxpZGF0aW9ucy5wYXR0ZXJuID0gdGhpcy52YWxpZGF0aW9uUnVsZXMuZ2V0KCdwaG9uZScpPy50b1N0cmluZygpLnNsaWNlKDEsIC0xKTtcbiAgICAgIHZhbGlkYXRpb25zLnJlcXVpcmVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBOYW1lIHZhbGlkYXRpb25cbiAgICBpZiAoZmllbGROYW1lTG93ZXIuaW5jbHVkZXMoJ25hbWUnKSkge1xuICAgICAgdmFsaWRhdGlvbnMucmVxdWlyZWQgPSB0cnVlO1xuICAgICAgdmFsaWRhdGlvbnMubWluTGVuZ3RoID0gMjtcbiAgICB9XG5cbiAgICAvLyBVUkwgdmFsaWRhdGlvblxuICAgIGlmIChmaWVsZE5hbWVMb3dlci5pbmNsdWRlcygndXJsJykgfHwgZmllbGROYW1lTG93ZXIuaW5jbHVkZXMoJ3dlYnNpdGUnKSkge1xuICAgICAgdmFsaWRhdGlvbnMucGF0dGVybiA9IHRoaXMudmFsaWRhdGlvblJ1bGVzLmdldCgndXJsJyk/LnRvU3RyaW5nKCkuc2xpY2UoMSwgLTEpO1xuICAgIH1cblxuICAgIC8vIFppcCBjb2RlIHZhbGlkYXRpb25cbiAgICBpZiAoZmllbGROYW1lTG93ZXIuaW5jbHVkZXMoJ3ppcCcpKSB7XG4gICAgICB2YWxpZGF0aW9ucy5wYXR0ZXJuID0gdGhpcy52YWxpZGF0aW9uUnVsZXMuZ2V0KCd6aXBjb2RlJyk/LnRvU3RyaW5nKCkuc2xpY2UoMSwgLTEpO1xuICAgIH1cblxuICAgIGZpZWxkLnZhbGlkYXRpb25zID0gdmFsaWRhdGlvbnM7XG4gICAgZmllbGQuZXJyb3JNZXNzYWdlcyA9IHRoaXMuZ2VuZXJhdGVFcnJvck1lc3NhZ2VzKGZpZWxkKTtcblxuICAgIHJldHVybiBmaWVsZDtcbiAgfVxuXG4gIHByaXZhdGUgZ2VuZXJhdGVFcnJvck1lc3NhZ2VzKGZpZWxkOiBGb3JtRmllbGRDb25maWcpOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgICBjb25zdCBtZXNzYWdlczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xuICAgIGNvbnN0IHZhbGlkYXRpb25zID0gZmllbGQudmFsaWRhdGlvbnMgfHwge307XG5cbiAgICBpZiAodmFsaWRhdGlvbnMucmVxdWlyZWQpIHtcbiAgICAgIG1lc3NhZ2VzLnJlcXVpcmVkID0gYCR7ZmllbGQubGFiZWx9IGlzIHJlcXVpcmVkYDtcbiAgICB9XG5cbiAgICBpZiAodmFsaWRhdGlvbnMubWluTGVuZ3RoKSB7XG4gICAgICBtZXNzYWdlcy5taW5sZW5ndGggPSBgJHtmaWVsZC5sYWJlbH0gbXVzdCBiZSBhdCBsZWFzdCAke3ZhbGlkYXRpb25zLm1pbkxlbmd0aH0gY2hhcmFjdGVyc2A7XG4gICAgfVxuXG4gICAgaWYgKHZhbGlkYXRpb25zLm1heExlbmd0aCkge1xuICAgICAgbWVzc2FnZXMubWF4bGVuZ3RoID0gYCR7ZmllbGQubGFiZWx9IGNhbm5vdCBleGNlZWQgJHt2YWxpZGF0aW9ucy5tYXhMZW5ndGh9IGNoYXJhY3RlcnNgO1xuICAgIH1cblxuICAgIGlmICh2YWxpZGF0aW9ucy5lbWFpbCkge1xuICAgICAgbWVzc2FnZXMuZW1haWwgPSBgUGxlYXNlIGVudGVyIGEgdmFsaWQgZW1haWwgYWRkcmVzc2A7XG4gICAgfVxuXG4gICAgaWYgKHZhbGlkYXRpb25zLnBhdHRlcm4pIHtcbiAgICAgIG1lc3NhZ2VzLnBhdHRlcm4gPSB0aGlzLmdldFBhdHRlcm5FcnJvck1lc3NhZ2UoZmllbGQubmFtZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1lc3NhZ2VzO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQYXR0ZXJuRXJyb3JNZXNzYWdlKGZpZWxkTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBmaWVsZE5hbWVMb3dlciA9IGZpZWxkTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIFxuICAgIGlmIChmaWVsZE5hbWVMb3dlci5pbmNsdWRlcygncGFzc3dvcmQnKSkge1xuICAgICAgcmV0dXJuICdQYXNzd29yZCBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIGxldHRlciBhbmQgb25lIG51bWJlcic7XG4gICAgfVxuICAgIGlmIChmaWVsZE5hbWVMb3dlci5pbmNsdWRlcygncGhvbmUnKSkge1xuICAgICAgcmV0dXJuICdQbGVhc2UgZW50ZXIgYSB2YWxpZCBwaG9uZSBudW1iZXInO1xuICAgIH1cbiAgICBpZiAoZmllbGROYW1lTG93ZXIuaW5jbHVkZXMoJ3VybCcpIHx8IGZpZWxkTmFtZUxvd2VyLmluY2x1ZGVzKCd3ZWJzaXRlJykpIHtcbiAgICAgIHJldHVybiAnUGxlYXNlIGVudGVyIGEgdmFsaWQgVVJMJztcbiAgICB9XG4gICAgaWYgKGZpZWxkTmFtZUxvd2VyLmluY2x1ZGVzKCd6aXAnKSkge1xuICAgICAgcmV0dXJuICdQbGVhc2UgZW50ZXIgYSB2YWxpZCBaSVAgY29kZSc7XG4gICAgfVxuXG4gICAgcmV0dXJuICdQbGVhc2UgZW50ZXIgYSB2YWxpZCB2YWx1ZSc7XG4gIH1cbn1cbiJdfQ==