@shippack/isbn-verify
Version:
Verify ISBN string format and check digit.
201 lines (165 loc) • 6.58 kB
JavaScript
'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
var id = 0;
function _classPrivateFieldLooseKey(name) {
return "__private_" + id++ + "_" + name;
}
function _classPrivateFieldLooseBase(receiver, privateKey) {
if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) {
throw new TypeError("attempted to use private field on non-instance");
}
return receiver;
}
var _isbnNoHyphens = /*#__PURE__*/_classPrivateFieldLooseKey("isbnNoHyphens");
var _isbn = /*#__PURE__*/_classPrivateFieldLooseKey("isbn13");
var _isbn2 = /*#__PURE__*/_classPrivateFieldLooseKey("isbn10");
/**
* ISBN Verify
*/
var _default = /*#__PURE__*/function () {
/**
* @param {string} isbn - ISBN value to check
* @param {boolean} strict - Strict mode. If `true`, syntax without hyphens is an error. If not specified, it defaults to `false`
*/
function _default(isbn, strict) {
if (strict === void 0) {
strict = false;
}
Object.defineProperty(this, _isbnNoHyphens, {
writable: true,
value: void 0
});
Object.defineProperty(this, _isbn, {
writable: true,
value: void 0
});
Object.defineProperty(this, _isbn2, {
writable: true,
value: void 0
});
_classPrivateFieldLooseBase(this, _isbn)[_isbn] = false; // 現行規格(13桁)の ISBN か
_classPrivateFieldLooseBase(this, _isbn2)[_isbn2] = false; // 旧規格(10桁)の ISBN か
var isbnNoHyphens = isbn.replace(/-/g, '');
_classPrivateFieldLooseBase(this, _isbnNoHyphens)[_isbnNoHyphens] = isbnNoHyphens;
if (strict) {
var length = isbn.length;
if (length === 17 && /^(978|979)-\d{1,5}-\d{1,7}-\d{1,7}-\d$/.test(isbn)) {
_classPrivateFieldLooseBase(this, _isbn)[_isbn] = true;
} else if (length === 13 && /^\d{1,5}-\d{1,7}-\d{1,7}-[\dX]$/.test(isbn)) {
_classPrivateFieldLooseBase(this, _isbn2)[_isbn2] = true;
}
} else {
if (!isbn.includes('--')) {
if (/^(978|979)\d{10}$/.test(isbnNoHyphens)) {
if (/^\d[\d-]{11,15}\d$/.test(isbn)) {
_classPrivateFieldLooseBase(this, _isbn)[_isbn] = true;
}
} else if (/^\d{9}[\dX]$/.test(isbnNoHyphens)) {
if (/^\d[\d-]{8,11}[\dX]$/.test(isbn)) {
_classPrivateFieldLooseBase(this, _isbn2)[_isbn2] = true;
}
}
}
}
}
var _proto = _default.prototype;
// 旧規格(10桁)の ISBN か
/**
* Alias of `verifyCheckDigit()`
*
* @returns {boolean} `true` if both format and check digit are correct
*/
_proto.isValid = function isValid() {
return this.verifyCheckDigit();
}
/**
* Whether it is a 13-digit ISBN
*
* @param {isOption} options - Specifies characteristics about the check item.
*
* @returns {boolean} `true` for current standard (13 digit) ISBN
*/
;
_proto.isIsbn13 = function isIsbn13(options) {
if (options !== undefined && options.check_digit) {
return _classPrivateFieldLooseBase(this, _isbn)[_isbn] && this.verifyCheckDigit();
}
return _classPrivateFieldLooseBase(this, _isbn)[_isbn];
}
/**
* Whether it is a 10-digit ISBN
*
* @param {isOption} options - Specifies characteristics about the check item.
*
* @returns {boolean} `true` for old standard (10 digit) ISBN
*/
;
_proto.isIsbn10 = function isIsbn10(options) {
if (options !== undefined && options.check_digit) {
return _classPrivateFieldLooseBase(this, _isbn2)[_isbn2] && this.verifyCheckDigit();
}
return _classPrivateFieldLooseBase(this, _isbn2)[_isbn2];
}
/**
* Verify format (do not verify check digit)
*
* @returns {boolean} `true` if the format is correct
*/
;
_proto.verifyFormat = function verifyFormat() {
return _classPrivateFieldLooseBase(this, _isbn)[_isbn] || _classPrivateFieldLooseBase(this, _isbn2)[_isbn2];
}
/**
* Verify format including check digit (not necessarily applicable publication)
*
* @returns {boolean} `true` if both format and check digit are correct
*/
;
_proto.verifyCheckDigit = function verifyCheckDigit() {
if (_classPrivateFieldLooseBase(this, _isbn)[_isbn]) {
var isbnNoHyphens = _classPrivateFieldLooseBase(this, _isbnNoHyphens)[_isbnNoHyphens];
return isbnNoHyphens.substring(12) === this._getCheckDigit13(isbnNoHyphens);
} else if (_classPrivateFieldLooseBase(this, _isbn2)[_isbn2]) {
var _isbnNoHyphens2 = _classPrivateFieldLooseBase(this, _isbnNoHyphens)[_isbnNoHyphens];
return _isbnNoHyphens2.substring(9) === this._getCheckDigit10(_isbnNoHyphens2);
}
return false;
}
/**
* ISBN-13 のチェックデジットを取得する
*
* @param {string} isbnNoHyphens - ハイフンなしの ISBN
*
* @returns {string} チェックデジット
*/
;
_proto._getCheckDigit13 = function _getCheckDigit13(isbnNoHyphens) {
var checkDigit = String(10 - (Number(isbnNoHyphens.substring(0, 1)) + Number(isbnNoHyphens.substring(1, 2)) * 3 + Number(isbnNoHyphens.substring(2, 3)) + Number(isbnNoHyphens.substring(3, 4)) * 3 + Number(isbnNoHyphens.substring(4, 5)) + Number(isbnNoHyphens.substring(5, 6)) * 3 + Number(isbnNoHyphens.substring(6, 7)) + Number(isbnNoHyphens.substring(7, 8)) * 3 + Number(isbnNoHyphens.substring(8, 9)) + Number(isbnNoHyphens.substring(9, 10)) * 3 + Number(isbnNoHyphens.substring(10, 11)) + Number(isbnNoHyphens.substring(11, 12)) * 3) % 10);
switch (checkDigit) {
case '10':
return '0';
}
return checkDigit;
}
/**
* ISBN-10 のチェックデジットを取得する
*
* @param {string} isbnNoHyphens - ハイフンなしの ISBN
*
* @returns {string} チェックデジット
*/
;
_proto._getCheckDigit10 = function _getCheckDigit10(isbnNoHyphens) {
var checkDigit = String(11 - (Number(isbnNoHyphens.substring(0, 1)) * 10 + Number(isbnNoHyphens.substring(1, 2)) * 9 + Number(isbnNoHyphens.substring(2, 3)) * 8 + Number(isbnNoHyphens.substring(3, 4)) * 7 + Number(isbnNoHyphens.substring(4, 5)) * 6 + Number(isbnNoHyphens.substring(5, 6)) * 5 + Number(isbnNoHyphens.substring(6, 7)) * 4 + Number(isbnNoHyphens.substring(7, 8)) * 3 + Number(isbnNoHyphens.substring(8, 9)) * 2) % 11);
switch (checkDigit) {
case '10':
return 'X';
case '11':
return '0';
}
return checkDigit;
};
return _default;
}();
exports.default = _default;
//# sourceMappingURL=isbn-verify.cjs.development.js.map