UNPKG

juvo-rafa-library

Version:

A comprehensive Angular component library featuring real-world components and validators extracted from the Juvo Rafa backoffice application. Now with improved select components and bug fixes.

50 lines 5.25 kB
/** * Validator function for serial port names * * @description * Validates that the input value matches a valid serial port naming format. * Supports Windows (COM1-COM99999), Linux/Unix (ttyUSB0, ttyACM0, ttyS0), and macOS (cu.*) formats. * * @example * ```typescript * // Basic usage in FormControl * const serialControl = new FormControl('', [serialPortValidator()]); * * // Usage in reactive forms * this.deviceForm = this.fb.group({ * serialPort: ['', [Validators.required, serialPortValidator()]] * }); * * // Valid inputs: * // Windows: 'COM1', 'COM10', 'COM99999' * // Linux: 'ttyUSB0', 'ttyACM0', 'ttyS1' * // macOS: 'cu.usbserial-1410', 'cu.Bluetooth-Incoming-Port' * * // Invalid inputs: 'invalid-port', 'COM', 'tty', 'random-string' * ``` * * @returns ValidatorFn that returns null if valid, or validation error object if invalid * * @since 2.0.0 * @author Juvo Rafa Team */ export function serialPortValidator() { return (control) => { // Allow empty values (use Validators.required for required validation) if (!control.value) return null; // Serial port patterns for different operating systems: // Windows: COM1-COM99999 (case insensitive) // Linux/Unix: ttyUSB*, ttyACM*, ttyS* with numbers // macOS: cu.* (anything starting with cu.) const serialPortPattern = /^(COM[0-9]{1,5}|tty(USB|ACM|S)[0-9]{1,5}|cu\..+)$/i; const isValid = serialPortPattern.test(control.value); return isValid ? null : { invalidSerialPort: { value: control.value, message: 'Invalid serial port format. Use COM1-COM99999 (Windows), ttyUSB*/ttyACM*/ttyS* (Linux), or cu.* (macOS)' } }; }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VyaWFsLXBvcnQudmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWktY29tcG9uZW50cy9zcmMvbGliL3ZhbGlkYXRvcnMvc2VyaWFsLXBvcnQudmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTZCRztBQUNILE1BQU0sVUFBVSxtQkFBbUI7SUFDakMsT0FBTyxDQUFDLE9BQXdCLEVBQXFDLEVBQUU7UUFDckUsdUVBQXVFO1FBQ3ZFLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRWhDLHdEQUF3RDtRQUN4RCw0Q0FBNEM7UUFDNUMsbURBQW1EO1FBQ25ELDJDQUEyQztRQUMzQyxNQUFNLGlCQUFpQixHQUFHLG9EQUFvRCxDQUFDO1FBQy9FLE1BQU0sT0FBTyxHQUFHLGlCQUFpQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFdEQsT0FBTyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDdEIsaUJBQWlCLEVBQUU7Z0JBQ2pCLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztnQkFDcEIsT0FBTyxFQUFFLHlHQUF5RzthQUNuSDtTQUNGLENBQUM7SUFDSixDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBWYWxpZGF0b3JGbiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuLyoqXG4gKiBWYWxpZGF0b3IgZnVuY3Rpb24gZm9yIHNlcmlhbCBwb3J0IG5hbWVzXG4gKiBcbiAqIEBkZXNjcmlwdGlvblxuICogVmFsaWRhdGVzIHRoYXQgdGhlIGlucHV0IHZhbHVlIG1hdGNoZXMgYSB2YWxpZCBzZXJpYWwgcG9ydCBuYW1pbmcgZm9ybWF0LlxuICogU3VwcG9ydHMgV2luZG93cyAoQ09NMS1DT005OTk5OSksIExpbnV4L1VuaXggKHR0eVVTQjAsIHR0eUFDTTAsIHR0eVMwKSwgYW5kIG1hY09TIChjdS4qKSBmb3JtYXRzLlxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQmFzaWMgdXNhZ2UgaW4gRm9ybUNvbnRyb2xcbiAqIGNvbnN0IHNlcmlhbENvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woJycsIFtzZXJpYWxQb3J0VmFsaWRhdG9yKCldKTtcbiAqIFxuICogLy8gVXNhZ2UgaW4gcmVhY3RpdmUgZm9ybXNcbiAqIHRoaXMuZGV2aWNlRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICogICBzZXJpYWxQb3J0OiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBzZXJpYWxQb3J0VmFsaWRhdG9yKCldXVxuICogfSk7XG4gKiBcbiAqIC8vIFZhbGlkIGlucHV0czpcbiAqIC8vIFdpbmRvd3M6ICdDT00xJywgJ0NPTTEwJywgJ0NPTTk5OTk5J1xuICogLy8gTGludXg6ICd0dHlVU0IwJywgJ3R0eUFDTTAnLCAndHR5UzEnXG4gKiAvLyBtYWNPUzogJ2N1LnVzYnNlcmlhbC0xNDEwJywgJ2N1LkJsdWV0b290aC1JbmNvbWluZy1Qb3J0J1xuICogXG4gKiAvLyBJbnZhbGlkIGlucHV0czogJ2ludmFsaWQtcG9ydCcsICdDT00nLCAndHR5JywgJ3JhbmRvbS1zdHJpbmcnXG4gKiBgYGBcbiAqIFxuICogQHJldHVybnMgVmFsaWRhdG9yRm4gdGhhdCByZXR1cm5zIG51bGwgaWYgdmFsaWQsIG9yIHZhbGlkYXRpb24gZXJyb3Igb2JqZWN0IGlmIGludmFsaWRcbiAqIFxuICogQHNpbmNlIDIuMC4wXG4gKiBAYXV0aG9yIEp1dm8gUmFmYSBUZWFtXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxQb3J0VmFsaWRhdG9yKCk6IFZhbGlkYXRvckZuIHtcbiAgcmV0dXJuIChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSB8IG51bGwgPT4ge1xuICAgIC8vIEFsbG93IGVtcHR5IHZhbHVlcyAodXNlIFZhbGlkYXRvcnMucmVxdWlyZWQgZm9yIHJlcXVpcmVkIHZhbGlkYXRpb24pXG4gICAgaWYgKCFjb250cm9sLnZhbHVlKSByZXR1cm4gbnVsbDtcblxuICAgIC8vIFNlcmlhbCBwb3J0IHBhdHRlcm5zIGZvciBkaWZmZXJlbnQgb3BlcmF0aW5nIHN5c3RlbXM6XG4gICAgLy8gV2luZG93czogQ09NMS1DT005OTk5OSAoY2FzZSBpbnNlbnNpdGl2ZSlcbiAgICAvLyBMaW51eC9Vbml4OiB0dHlVU0IqLCB0dHlBQ00qLCB0dHlTKiB3aXRoIG51bWJlcnNcbiAgICAvLyBtYWNPUzogY3UuKiAoYW55dGhpbmcgc3RhcnRpbmcgd2l0aCBjdS4pXG4gICAgY29uc3Qgc2VyaWFsUG9ydFBhdHRlcm4gPSAvXihDT01bMC05XXsxLDV9fHR0eShVU0J8QUNNfFMpWzAtOV17MSw1fXxjdVxcLi4rKSQvaTsgICAgXG4gICAgY29uc3QgaXNWYWxpZCA9IHNlcmlhbFBvcnRQYXR0ZXJuLnRlc3QoY29udHJvbC52YWx1ZSk7XG4gICAgXG4gICAgcmV0dXJuIGlzVmFsaWQgPyBudWxsIDogeyBcbiAgICAgIGludmFsaWRTZXJpYWxQb3J0OiB7IFxuICAgICAgICB2YWx1ZTogY29udHJvbC52YWx1ZSwgXG4gICAgICAgIG1lc3NhZ2U6ICdJbnZhbGlkIHNlcmlhbCBwb3J0IGZvcm1hdC4gVXNlIENPTTEtQ09NOTk5OTkgKFdpbmRvd3MpLCB0dHlVU0IqL3R0eUFDTSovdHR5UyogKExpbnV4KSwgb3IgY3UuKiAobWFjT1MpJyBcbiAgICAgIH0gXG4gICAgfTtcbiAgfTtcbn0gIl19