swc/crates/swc_bundler/tests/.cache/deno/6a000c7c420b15b3a5e00d66c7448d51ce440c96.ts
2021-11-09 20:42:49 +09:00

59 lines
1.3 KiB
TypeScript

// Loaded from https://deno.land/x/segno@v1.1.0/lib/validations/isISBN.ts
// @ts-ignore allowing typedoc to build
import { assertString } from '../helpers/assertString.ts';
/**
* @ignore
*/
const isbn10Maybe = /^(?:[0-9]{9}X|[0-9]{10})$/;
/**
* @ignore
*/
const isbn13Maybe = /^(?:[0-9]{13})$/;
/**
* @ignore
*/
const factor = [1, 3];
export const isISBN = (str: string, version?: number): boolean => {
assertString(str);
const _version = version ? String(version) : '';
if (!_version) {
return isISBN(str, 10) || isISBN(str, 13);
}
const sanitized = str.replace(/[\s-]+/g, '');
let checksum = 0;
let i;
if (_version === '10') {
if (!isbn10Maybe.test(sanitized)) {
return false;
}
for (i = 0; i < 9; i++) {
checksum += (i + 1) * +sanitized.charAt(i);
}
if (sanitized.charAt(9) === 'X') {
checksum += 10 * 10;
} else {
checksum += 10 * +sanitized.charAt(9);
}
if (checksum % 11 === 0) {
return !!sanitized;
}
} else if (_version === '13') {
if (!isbn13Maybe.test(sanitized)) {
return false;
}
for (i = 0; i < 12; i++) {
checksum += factor[i % 2] * +sanitized.charAt(i);
}
if (+sanitized.charAt(12) - ((10 - (checksum % 10)) % 10) === 0) {
return !!sanitized;
}
}
return false;
};