47 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			47 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
	
	
| import assertString from './util/assertString';
 | |
| var possibleIsbn10 = /^(?:[0-9]{9}X|[0-9]{10})$/;
 | |
| var possibleIsbn13 = /^(?:[0-9]{13})$/;
 | |
| var factor = [1, 3];
 | |
| export default function isISBN(isbn, options) {
 | |
|   assertString(isbn);
 | |
| 
 | |
|   // For backwards compatibility:
 | |
|   // isISBN(str [, version]), i.e. `options` could be used as argument for the legacy `version`
 | |
|   var version = String((options === null || options === void 0 ? void 0 : options.version) || options);
 | |
|   if (!(options !== null && options !== void 0 && options.version || options)) {
 | |
|     return isISBN(isbn, {
 | |
|       version: 10
 | |
|     }) || isISBN(isbn, {
 | |
|       version: 13
 | |
|     });
 | |
|   }
 | |
|   var sanitizedIsbn = isbn.replace(/[\s-]+/g, '');
 | |
|   var checksum = 0;
 | |
|   if (version === '10') {
 | |
|     if (!possibleIsbn10.test(sanitizedIsbn)) {
 | |
|       return false;
 | |
|     }
 | |
|     for (var i = 0; i < version - 1; i++) {
 | |
|       checksum += (i + 1) * sanitizedIsbn.charAt(i);
 | |
|     }
 | |
|     if (sanitizedIsbn.charAt(9) === 'X') {
 | |
|       checksum += 10 * 10;
 | |
|     } else {
 | |
|       checksum += 10 * sanitizedIsbn.charAt(9);
 | |
|     }
 | |
|     if (checksum % 11 === 0) {
 | |
|       return true;
 | |
|     }
 | |
|   } else if (version === '13') {
 | |
|     if (!possibleIsbn13.test(sanitizedIsbn)) {
 | |
|       return false;
 | |
|     }
 | |
|     for (var _i = 0; _i < 12; _i++) {
 | |
|       checksum += factor[_i % 2] * sanitizedIsbn.charAt(_i);
 | |
|     }
 | |
|     if (sanitizedIsbn.charAt(12) - (10 - checksum % 10) % 10 === 0) {
 | |
|       return true;
 | |
|     }
 | |
|   }
 | |
|   return false;
 | |
| } |