diff --git a/README.md b/README.md index 70e9dac..fe04f82 100644 --- a/README.md +++ b/README.md @@ -45,6 +45,18 @@ isOld("GI-1234-BL"); //=> true isOld("DGP 1234 BL"); //=> true ``` +### isSpecial() + +Police, Air force, Army, Navy, etc. have special plates. + +```js +import { isSpecial } from "spanish-car-plate"; + +isSpecial("DGP 3874"); //=> true +isSpecial("CNP-5764"); //=> true +isSpecial("E8720"); //=> true +``` + ### getCounter() ```js @@ -78,6 +90,23 @@ getProvinceCode("M 1234 BL"); //=> "M" getProvinceCode("SO-1234 BL"); //=> "SO" ``` +### getSpecialCode() + +```js +import { getSpecialCode } from "spanish-car-plate"; + +getSpecialCode("DGP1234"); //=> "DGP" +``` + +### getSpecialName() + +```js +import { getSpecialName } from "spanish-car-plate"; + +getSpecialName("DGP1234"); //=> "Spanish Police" +getSpecialName("CME1234"); //=> "Corps of the Mossos d'Esquadra" +``` + ### parse() Get all the information about the plate diff --git a/dist/index.js b/dist/index.js index 241ada7..bf54fa0 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1,4 +1,4 @@ -// Spanish Car Plate v0.0.6 +// Spanish Car Plate v0.0.7 // https://github.com/singuerinc/spanish-car-plate // (c) 2019-2019 Nahuel Scotti // Spanish Car Plate may be freely distributed under the MIT license. @@ -9,6 +9,10 @@ (factory((global.SpanishCarPlate = {}))); }(this, (function (exports) { 'use strict'; + function _partsSpecial(str) { + var cleaned = str.replace(/^[\s]*([CMEDGPNATFSHMORW]{1,5})[^A-Z0-9]*([0-9]{4})[\s]*$/i, "$1,$2"); + return cleaned.split(","); + } function _partsOld(str) { var cleaned = str.replace(/^[\s]*([A-Z]{1,3})[^A-Z0-9]*([0-9]{4})[^A-Z0-9]*([A-Z]{2})[\s]*$/i, "$1,$2,$3"); return cleaned.split(","); @@ -136,6 +140,56 @@ throw new TypeError("Invalid attempt to destructure non-iterable instance"); } + var SPECIALS = { + CME: "Corps of the Mossos d'Esquadra", + DGP: "Spanish Police", + CNP: "Spanish Police", + E: "Autonomous police force of the Basque Country", + EA: "Air Force", + ET: "Spanish Army", + FAE: "Allied Forces in Spain", + FN: "Spanish Navy", + GSH: "Colonial police on Sahara", + PGC: "Spanish civil guard", + MF: "Public Works Ministry", + MMA: "Environment Ministry", + MOP: "Public Works Ministry", + PME: "State owned vehicles", + PMM: "State owned vehicles, on a Ministry", + Crown: "King's Car" + }; + + /** + * Returns true if is a valid spacial car plate + * @param {string} value + * @returns {boolean} + * @since 0.0.7 + * @example + * isSpecial("CME 2342"); // => true + * isSpecial("E 1660"); // => true + */ + + function isSpecial(value) { + var str = !value ? "" : value; + + var _partsSpecial2 = _partsSpecial(str), + _partsSpecial3 = _slicedToArray(_partsSpecial2, 2), + code = _partsSpecial3[0], + num = _partsSpecial3[1]; + + var cleaned = "".concat(code).concat(num); + + if (cleaned.length < 5 || cleaned.length > 9) { + return false; + } + + if (!SPECIALS[code]) { + return false; + } + + return /^[CMEDGPNATFSHMORW]{1,5}[0-9]{4}$/i.test(cleaned); + } + /** * * @param {string} value @@ -185,17 +239,61 @@ num = _partsOld3[1]; return parseInt(num, 10); + } else if (isSpecial(str) === true) { + var _partsSpecial2 = _partsSpecial(str), + _partsSpecial3 = _slicedToArray(_partsSpecial2, 2), + _num = _partsSpecial3[1]; + + return parseInt(_num, 10); } else if (isValid(str)) { var _partsNew2 = _partsNew(str), _partsNew3 = _slicedToArray(_partsNew2, 1), - _num = _partsNew3[0]; + _num2 = _partsNew3[0]; - return parseInt(_num, 10); + return parseInt(_num2, 10); } return null; } + /** + * Returns the special code for a valid car plate + * @param {string} value + * @returns {string} + * @since 0.0.7 + * @example + * getSpecialCode("DGP-1234"); // => "DGP" + */ + + function getSpecialCode(value) { + var str = !value ? "" : value; + + if (!isSpecial(str)) { + return null; + } + + var _partsSpecial2 = _partsSpecial(str), + _partsSpecial3 = _slicedToArray(_partsSpecial2, 1), + code = _partsSpecial3[0]; + + return SPECIALS[code] ? code : null; + } + + /** + * Returns the special name for a valid car plate + * @param {string} value + * @returns {string} + * @since 0.0.7 + * @example + * getSpecialCode("CME1234"); // => "Corps of the Mossos d'Esquadra" + */ + + function getSpecialName(value) { + var str = !value ? "" : value; + var code = getSpecialCode(str); + return SPECIALS[code] || null; + } + var PROVINCES = { A: "Province of Alicante", AB: "Province of Albacete", @@ -297,6 +395,9 @@ function _parseNew(str) { var parsed = {}; parsed.isOld = false; + parsed.provinceName = null; + parsed.provinceCode = null; + parsed.specialCode = null; parsed.counter = getCounter(str); parsed.number = getNumber(str); return parsed; @@ -305,14 +406,25 @@ function _parseOld(str) { var parsed = {}; parsed.isOld = true; - var provinceName = getProvinceName(str); - var provinceCode = getProvinceCode(str); - parsed.provinceName = provinceName; - parsed.provinceCode = provinceCode; + parsed.provinceName = getProvinceName(str); + parsed.provinceCode = getProvinceCode(str); + parsed.specialCode = null; parsed.counter = getCounter(str); parsed.number = getNumber(str); return parsed; } + + function _parseSpecial(str) { + var parsed = {}; + parsed.isOld = false; + parsed.provinceName = null; + parsed.provinceCode = null; + parsed.specialCode = getSpecialCode(str); + parsed.counter = null; + parsed.number = getNumber(str); + parsed.isSpecial = true; + return parsed; + } /** * Returns an object containing information about the plate * @param {string} value @@ -326,14 +438,15 @@ function parse(value) { var str = !value ? "" : value; - var old = isOld(str); var parsed = { isSpecial: false // TODO: not implemented }; - if (old === true) { + if (isOld(str) === true) { return _objectSpread({}, parsed, _parseOld(str)); + } else if (isSpecial(str) === true) { + return _objectSpread({}, parsed, _parseSpecial(str)); } else if (isValid(str) === true) { return _objectSpread({}, parsed, _parseNew(str)); } @@ -343,12 +456,16 @@ exports.isValid = isValid; exports.isOld = isOld; + exports.isSpecial = isSpecial; exports.getCounter = getCounter; exports.getNumber = getNumber; + exports.getSpecialCode = getSpecialCode; + exports.getSpecialName = getSpecialName; exports.getProvinceName = getProvinceName; exports.getProvinceCode = getProvinceCode; exports.parse = parse; exports.PROVINCES = PROVINCES; + exports.SPECIALS = SPECIALS; Object.defineProperty(exports, '__esModule', { value: true }); diff --git a/dist/index.js.map b/dist/index.js.map index 7890457..cb0eeac 100644 --- a/dist/index.js.map +++ b/dist/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sources":["../src/_utils.js","../src/isOld.js","../src/isValid.js","../src/getCounter.js","../src/getNumber.js","../src/provinces.js","../src/getProvinceCode.js","../src/getProvinceName.js","../src/parse.js"],"sourcesContent":["export function _partsOld(str) {\n const cleaned = str.replace(\n /^[\\s]*([A-Z]{1,3})[^A-Z0-9]*([0-9]{4})[^A-Z0-9]*([A-Z]{2})[\\s]*$/i,\n \"$1,$2,$3\"\n );\n\n return cleaned.split(\",\");\n}\n\nexport function _partsNew(str) {\n const cleaned = str.replace(\n /^[\\s]*([0-9]{4})[^A-Z0-9]*([BCDFGHJKLMNPRSTVWXYZ]{3})[\\s]*$/i,\n \"$1,$2\"\n );\n\n return cleaned.split(\",\");\n}\n","import { _partsOld } from \"./_utils\";\n\n/**\n * Returns true if is a valid (old system 1971-2000) car plate\n * @param {string} value\n * @returns {boolean}\n * @since 0.0.2\n * @example\n * isOld(\"GI-1234-CS\"); // => true\n */\nfunction isOld(value) {\n const str = !value ? \"\" : value;\n const cleaned = _partsOld(str).join(\"\");\n\n if (cleaned.length < 7 || cleaned.length > 9) {\n return false;\n }\n\n return /^[A-Z]{1,3}[0-9]{4}[A-Z]{2}$/i.test(cleaned);\n}\n\nexport { isOld };\n","import { _partsNew } from \"./_utils\";\nimport { isOld } from \"./isOld\";\n\n/**\n * Returns true if is a valid (post year 2000) car plate\n * @param {string} value\n * @returns {boolean}\n * @since 0.0.1\n * @example\n * isValid(\"2345BCF\"); // => true\n */\nfunction isValid(value) {\n if (isOld(value)) {\n return true;\n }\n\n const str = !value ? \"\" : value;\n const cleaned = _partsNew(str).join(\"\");\n\n if (cleaned.length !== 7) {\n return false;\n }\n\n return /^[0-9]{4}[BCDFGHJKLMNPRSTVWXYZ]{3}$/i.test(cleaned);\n}\n\nexport { isValid };\n","import { isOld } from \"./isOld\";\nimport { isValid } from \"./isValid\";\nimport { _partsOld, _partsNew } from \"./_utils\";\n\n/**\n *\n * @param {string} value\n * @returns {string}\n * @since 0.0.5\n * @example\n * getCounter(\"GI-1234-CS\"); // => \"CS\"\n * getCounter(\"2345BCF\"); // => \"CS\"\n */\nfunction getCounter(value) {\n const str = !value ? \"\" : value;\n\n if (isOld(str) === true) {\n const [, , counter] = _partsOld(str);\n return counter;\n } else if (isValid(str)) {\n const [, counter] = _partsNew(str);\n return counter;\n }\n\n return null;\n}\n\nexport { getCounter };\n","import { isOld } from \"./isOld\";\nimport { isValid } from \"./isValid\";\nimport { _partsNew, _partsOld } from \"./_utils\";\n\n/**\n *\n * @param {string} value\n * @returns {number}\n * @since 0.0.5\n * @example\n * getNumber(\"2345BCF\"); // => 2345\n * getNumber(\"GI-1234-CS\"); // => 1234\n */\nfunction getNumber(value) {\n const str = !value ? \"\" : value;\n\n if (isOld(str) === true) {\n const [, num] = _partsOld(str);\n return parseInt(num, 10);\n } else if (isValid(str)) {\n const [num] = _partsNew(str);\n return parseInt(num, 10);\n }\n\n return null;\n}\n\nexport { getNumber };\n","export const PROVINCES = {\n A: \"Province of Alicante\",\n AB: \"Province of Albacete\",\n AL: \"Province of Almería\",\n AV: \"Province of Ávila\",\n B: \"Province of Barcelona\",\n BA: \"Province of Badajoz\",\n BI: \"Bilbao\",\n BU: \"Province of Burgos\",\n C: \"Province of A Coruña\",\n CA: \"Province of Cádiz\",\n CC: \"Province of Cáceres\",\n CE: \"Ceuta\",\n CO: \"Province of Córdoba\",\n CR: \"Province of Ciudad Real\",\n CS: \"Castelló\",\n CU: \"Province of Cuenca\",\n FP: \"Bioko\",\n GC: \"Province of Las Palmas\",\n GE: \"Gerona (Girona)\",\n GI: \"Province of Girona\",\n GR: \"Province of Granada\",\n GU: \"Province of Guadalajara\",\n H: \"Province of Huelva\",\n HU: \"Province of Huesca\",\n IF: \"Ifni\",\n J: \"Province of Jaén\",\n L: \"Province of Lleida\",\n LE: \"Province of León\",\n LO: \"Logroño\",\n LR: \"La Rioja\",\n LU: \"Province of Lugo\",\n M: \"Community of Madrid\",\n MA: \"Province of Málaga\",\n ML: \"Melilla\",\n MU: \"Region of Murcia\",\n NA: \"Navarre\",\n O: \"Oviedo\",\n OU: \"Province of Ourense\",\n P: \"Province of Palencia\",\n PM: \"Palma, Majorca\",\n PO: \"Province of Pontevedra\",\n RM: \"Rio Muni\",\n S: \"Santander\",\n SA: \"Province of Salamanca\",\n SE: \"Province of Seville\",\n SG: \"Province of Segovia\",\n SO: \"Province of Soria\",\n SS: \"Donostia\",\n T: \"Province of Tarragona\",\n TE: \"Province of Teruel\",\n TF: \"Province of Santa Cruz de Tenerife\",\n TO: \"Province of Toledo\",\n V: \"Province of Valencia\",\n VA: \"Province of Valladolid\",\n VI: \"Vitoria\",\n Z: \"Province of Zaragoza\",\n ZA: \"Province of Zamora\"\n};\n","import { PROVINCES } from \"./provinces\";\nimport { isOld } from \"./isOld\";\nimport { _partsOld } from \"./_utils\";\n\n/**\n * Returns the province code for a valid car plate in the old system (1971-2000)\n * @param {string} value\n * @returns {string}\n * @since 0.0.5\n * @example\n * getProvinceCode(\"GI-1234-CS\"); // => \"GI\"\n */\nfunction getProvinceCode(value) {\n const str = !value ? \"\" : value;\n\n if (!isOld(str)) {\n return null;\n }\n\n const [code] = _partsOld(str);\n\n return PROVINCES[code] ? code : null;\n}\n\nexport { getProvinceCode };\n","import { PROVINCES } from \"./provinces\";\nimport { getProvinceCode } from \"./getProvinceCode\";\n\n/**\n * Returns the province name for a valid car plate in the old system (1971-2000)\n * @param {string} value\n * @returns {string}\n * @since 0.0.5\n * @example\n * getProvinceName(\"GI-1234-CS\"); // => \"Province of Girona\"\n */\nfunction getProvinceName(value) {\n const str = !value ? \"\" : value;\n const code = getProvinceCode(str);\n\n return PROVINCES[code] || null;\n}\n\nexport { getProvinceName };\n","import { isValid } from \"./isValid\";\nimport { isOld } from \"./isOld\";\nimport { getProvinceName } from \"./getProvinceName\";\nimport { getProvinceCode } from \"./getProvinceCode\";\nimport { getCounter } from \"./getCounter\";\nimport { getNumber } from \"./getNumber\";\n\nfunction _parseNew(str) {\n const parsed = {};\n parsed.isOld = false;\n parsed.counter = getCounter(str);\n parsed.number = getNumber(str);\n return parsed;\n}\n\nfunction _parseOld(str) {\n const parsed = {};\n parsed.isOld = true;\n const provinceName = getProvinceName(str);\n const provinceCode = getProvinceCode(str);\n parsed.provinceName = provinceName;\n parsed.provinceCode = provinceCode;\n parsed.counter = getCounter(str);\n parsed.number = getNumber(str);\n return parsed;\n}\n\n/**\n * Returns an object containing information about the plate\n * @param {string} value\n * @returns {boolean}\n * @since 0.0.5\n * @example\n * parse(\"2345BCF\"); // => { isSpecial: false, isOld: false, provinceCode: null, provinceName: null, number: 2345, counter: \"BCF\" }\n * parse(\"GI2345BC\"); // => { isSpecial: false, isOld: true, provinceCode: \"GI\", provinceName: \"Province of Girona\", number: 2345, counter: \"BC\" }\n */\nfunction parse(value) {\n const str = !value ? \"\" : value;\n const old = isOld(str);\n const parsed = {\n isSpecial: false // TODO: not implemented\n };\n\n if (old === true) {\n return {\n ...parsed,\n ..._parseOld(str)\n };\n } else if (isValid(str) === true) {\n return {\n ...parsed,\n ..._parseNew(str)\n };\n }\n\n return null;\n}\n\nexport { parse };\n"],"names":["_partsOld","str","cleaned","replace","split","_partsNew","isOld","value","join","length","test","isValid","getCounter","counter","getNumber","num","parseInt","PROVINCES","A","AB","AL","AV","B","BA","BI","BU","C","CA","CC","CE","CO","CR","CS","CU","FP","GC","GE","GI","GR","GU","H","HU","IF","J","L","LE","LO","LR","LU","M","MA","ML","MU","NA","O","OU","P","PM","PO","RM","S","SA","SE","SG","SO","SS","T","TE","TF","TO","V","VA","VI","Z","ZA","getProvinceCode","code","getProvinceName","_parseNew","parsed","number","_parseOld","provinceName","provinceCode","parse","old","isSpecial"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.js","sources":["../src/_utils.js","../src/isOld.js","../src/isValid.js","../src/specials.js","../src/isSpecial.js","../src/getCounter.js","../src/getNumber.js","../src/getSpecialCode.js","../src/getSpecialName.js","../src/provinces.js","../src/getProvinceCode.js","../src/getProvinceName.js","../src/parse.js"],"sourcesContent":["export function _partsSpecial(str) {\n const cleaned = str.replace(\n /^[\\s]*([CMEDGPNATFSHMORW]{1,5})[^A-Z0-9]*([0-9]{4})[\\s]*$/i,\n \"$1,$2\"\n );\n\n return cleaned.split(\",\");\n}\n\nexport function _partsOld(str) {\n const cleaned = str.replace(\n /^[\\s]*([A-Z]{1,3})[^A-Z0-9]*([0-9]{4})[^A-Z0-9]*([A-Z]{2})[\\s]*$/i,\n \"$1,$2,$3\"\n );\n\n return cleaned.split(\",\");\n}\n\nexport function _partsNew(str) {\n const cleaned = str.replace(\n /^[\\s]*([0-9]{4})[^A-Z0-9]*([BCDFGHJKLMNPRSTVWXYZ]{3})[\\s]*$/i,\n \"$1,$2\"\n );\n\n return cleaned.split(\",\");\n}\n","import { _partsOld } from \"./_utils\";\n\n/**\n * Returns true if is a valid (old system 1971-2000) car plate\n * @param {string} value\n * @returns {boolean}\n * @since 0.0.2\n * @example\n * isOld(\"GI-1234-CS\"); // => true\n */\nfunction isOld(value) {\n const str = !value ? \"\" : value;\n const cleaned = _partsOld(str).join(\"\");\n\n if (cleaned.length < 7 || cleaned.length > 9) {\n return false;\n }\n\n return /^[A-Z]{1,3}[0-9]{4}[A-Z]{2}$/i.test(cleaned);\n}\n\nexport { isOld };\n","import { _partsNew } from \"./_utils\";\nimport { isOld } from \"./isOld\";\n\n/**\n * Returns true if is a valid (post year 2000) car plate\n * @param {string} value\n * @returns {boolean}\n * @since 0.0.1\n * @example\n * isValid(\"2345BCF\"); // => true\n */\nfunction isValid(value) {\n if (isOld(value)) {\n return true;\n }\n\n const str = !value ? \"\" : value;\n const cleaned = _partsNew(str).join(\"\");\n\n if (cleaned.length !== 7) {\n return false;\n }\n\n return /^[0-9]{4}[BCDFGHJKLMNPRSTVWXYZ]{3}$/i.test(cleaned);\n}\n\nexport { isValid };\n","export const SPECIALS = {\n CME: \"Corps of the Mossos d'Esquadra\",\n DGP: \"Spanish Police\",\n CNP: \"Spanish Police\",\n E: \"Autonomous police force of the Basque Country\",\n EA: \"Air Force\",\n ET: \"Spanish Army\",\n FAE: \"Allied Forces in Spain\",\n FN: \"Spanish Navy\",\n GSH: \"Colonial police on Sahara\",\n PGC: \"Spanish civil guard\",\n MF: \"Public Works Ministry\",\n MMA: \"Environment Ministry\",\n MOP: \"Public Works Ministry\",\n PME: \"State owned vehicles\",\n PMM: \"State owned vehicles, on a Ministry\",\n Crown: \"King's Car\"\n};\n","import { _partsSpecial } from \"./_utils\";\nimport { SPECIALS } from \"./specials\";\n\n/**\n * Returns true if is a valid spacial car plate\n * @param {string} value\n * @returns {boolean}\n * @since 0.0.7\n * @example\n * isSpecial(\"CME 2342\"); // => true\n * isSpecial(\"E 1660\"); // => true\n */\nfunction isSpecial(value) {\n const str = !value ? \"\" : value;\n const [code, num] = _partsSpecial(str);\n const cleaned = `${code}${num}`;\n\n if (cleaned.length < 5 || cleaned.length > 9) {\n return false;\n }\n\n if (!SPECIALS[code]) {\n return false;\n }\n\n return /^[CMEDGPNATFSHMORW]{1,5}[0-9]{4}$/i.test(cleaned);\n}\n\nexport { isSpecial };\n","import { isOld } from \"./isOld\";\nimport { isValid } from \"./isValid\";\nimport { _partsOld, _partsNew } from \"./_utils\";\n\n/**\n *\n * @param {string} value\n * @returns {string}\n * @since 0.0.5\n * @example\n * getCounter(\"GI-1234-CS\"); // => \"CS\"\n * getCounter(\"2345BCF\"); // => \"CS\"\n */\nfunction getCounter(value) {\n const str = !value ? \"\" : value;\n\n if (isOld(str) === true) {\n const [, , counter] = _partsOld(str);\n return counter;\n } else if (isValid(str)) {\n const [, counter] = _partsNew(str);\n return counter;\n }\n\n return null;\n}\n\nexport { getCounter };\n","import { isOld } from \"./isOld\";\nimport { isValid } from \"./isValid\";\nimport { isSpecial } from \"./isSpecial\";\nimport { _partsNew, _partsOld, _partsSpecial } from \"./_utils\";\n\n/**\n *\n * @param {string} value\n * @returns {number}\n * @since 0.0.5\n * @example\n * getNumber(\"2345BCF\"); // => 2345\n * getNumber(\"GI-1234-CS\"); // => 1234\n */\nfunction getNumber(value) {\n const str = !value ? \"\" : value;\n\n if (isOld(str) === true) {\n const [, num] = _partsOld(str);\n return parseInt(num, 10);\n } else if (isSpecial(str) === true) {\n const [, num] = _partsSpecial(str);\n return parseInt(num, 10);\n } else if (isValid(str)) {\n const [num] = _partsNew(str);\n return parseInt(num, 10);\n }\n\n return null;\n}\n\nexport { getNumber };\n","import { SPECIALS } from \"./specials\";\nimport { isSpecial } from \"./isSpecial\";\nimport { _partsSpecial } from \"./_utils\";\n\n/**\n * Returns the special code for a valid car plate\n * @param {string} value\n * @returns {string}\n * @since 0.0.7\n * @example\n * getSpecialCode(\"DGP-1234\"); // => \"DGP\"\n */\nfunction getSpecialCode(value) {\n const str = !value ? \"\" : value;\n\n if (!isSpecial(str)) {\n return null;\n }\n\n const [code] = _partsSpecial(str);\n\n return SPECIALS[code] ? code : null;\n}\n\nexport { getSpecialCode };\n","import { SPECIALS } from \"./specials\";\nimport { getSpecialCode } from \"./getSpecialCode\";\n\n/**\n * Returns the special name for a valid car plate\n * @param {string} value\n * @returns {string}\n * @since 0.0.7\n * @example\n * getSpecialCode(\"CME1234\"); // => \"Corps of the Mossos d'Esquadra\"\n */\nfunction getSpecialName(value) {\n const str = !value ? \"\" : value;\n const code = getSpecialCode(str);\n\n return SPECIALS[code] || null;\n}\n\nexport { getSpecialName };\n","export const PROVINCES = {\n A: \"Province of Alicante\",\n AB: \"Province of Albacete\",\n AL: \"Province of Almería\",\n AV: \"Province of Ávila\",\n B: \"Province of Barcelona\",\n BA: \"Province of Badajoz\",\n BI: \"Bilbao\",\n BU: \"Province of Burgos\",\n C: \"Province of A Coruña\",\n CA: \"Province of Cádiz\",\n CC: \"Province of Cáceres\",\n CE: \"Ceuta\",\n CO: \"Province of Córdoba\",\n CR: \"Province of Ciudad Real\",\n CS: \"Castelló\",\n CU: \"Province of Cuenca\",\n FP: \"Bioko\",\n GC: \"Province of Las Palmas\",\n GE: \"Gerona (Girona)\",\n GI: \"Province of Girona\",\n GR: \"Province of Granada\",\n GU: \"Province of Guadalajara\",\n H: \"Province of Huelva\",\n HU: \"Province of Huesca\",\n IF: \"Ifni\",\n J: \"Province of Jaén\",\n L: \"Province of Lleida\",\n LE: \"Province of León\",\n LO: \"Logroño\",\n LR: \"La Rioja\",\n LU: \"Province of Lugo\",\n M: \"Community of Madrid\",\n MA: \"Province of Málaga\",\n ML: \"Melilla\",\n MU: \"Region of Murcia\",\n NA: \"Navarre\",\n O: \"Oviedo\",\n OU: \"Province of Ourense\",\n P: \"Province of Palencia\",\n PM: \"Palma, Majorca\",\n PO: \"Province of Pontevedra\",\n RM: \"Rio Muni\",\n S: \"Santander\",\n SA: \"Province of Salamanca\",\n SE: \"Province of Seville\",\n SG: \"Province of Segovia\",\n SO: \"Province of Soria\",\n SS: \"Donostia\",\n T: \"Province of Tarragona\",\n TE: \"Province of Teruel\",\n TF: \"Province of Santa Cruz de Tenerife\",\n TO: \"Province of Toledo\",\n V: \"Province of Valencia\",\n VA: \"Province of Valladolid\",\n VI: \"Vitoria\",\n Z: \"Province of Zaragoza\",\n ZA: \"Province of Zamora\"\n};\n","import { PROVINCES } from \"./provinces\";\nimport { isOld } from \"./isOld\";\nimport { _partsOld } from \"./_utils\";\n\n/**\n * Returns the province code for a valid car plate in the old system (1971-2000)\n * @param {string} value\n * @returns {string}\n * @since 0.0.5\n * @example\n * getProvinceCode(\"GI-1234-CS\"); // => \"GI\"\n */\nfunction getProvinceCode(value) {\n const str = !value ? \"\" : value;\n\n if (!isOld(str)) {\n return null;\n }\n\n const [code] = _partsOld(str);\n\n return PROVINCES[code] ? code : null;\n}\n\nexport { getProvinceCode };\n","import { PROVINCES } from \"./provinces\";\nimport { getProvinceCode } from \"./getProvinceCode\";\n\n/**\n * Returns the province name for a valid car plate in the old system (1971-2000)\n * @param {string} value\n * @returns {string}\n * @since 0.0.5\n * @example\n * getProvinceName(\"GI-1234-CS\"); // => \"Province of Girona\"\n */\nfunction getProvinceName(value) {\n const str = !value ? \"\" : value;\n const code = getProvinceCode(str);\n\n return PROVINCES[code] || null;\n}\n\nexport { getProvinceName };\n","import { isValid } from \"./isValid\";\nimport { isOld } from \"./isOld\";\nimport { isSpecial } from \"./isSpecial\";\nimport { getProvinceName } from \"./getProvinceName\";\nimport { getProvinceCode } from \"./getProvinceCode\";\nimport { getCounter } from \"./getCounter\";\nimport { getNumber } from \"./getNumber\";\nimport { getSpecialCode } from \"./getSpecialCode\";\n\nfunction _parseNew(str) {\n const parsed = {};\n parsed.isOld = false;\n parsed.provinceName = null;\n parsed.provinceCode = null;\n parsed.specialCode = null;\n parsed.counter = getCounter(str);\n parsed.number = getNumber(str);\n return parsed;\n}\n\nfunction _parseOld(str) {\n const parsed = {};\n parsed.isOld = true;\n parsed.provinceName = getProvinceName(str);\n parsed.provinceCode = getProvinceCode(str);\n parsed.specialCode = null;\n parsed.counter = getCounter(str);\n parsed.number = getNumber(str);\n return parsed;\n}\n\nfunction _parseSpecial(str) {\n const parsed = {};\n parsed.isOld = false;\n parsed.provinceName = null;\n parsed.provinceCode = null;\n parsed.specialCode = getSpecialCode(str);\n parsed.counter = null;\n parsed.number = getNumber(str);\n parsed.isSpecial = true;\n return parsed;\n}\n\n/**\n * Returns an object containing information about the plate\n * @param {string} value\n * @returns {boolean}\n * @since 0.0.5\n * @example\n * parse(\"2345BCF\"); // => { isSpecial: false, isOld: false, provinceCode: null, provinceName: null, number: 2345, counter: \"BCF\" }\n * parse(\"GI2345BC\"); // => { isSpecial: false, isOld: true, provinceCode: \"GI\", provinceName: \"Province of Girona\", number: 2345, counter: \"BC\" }\n */\nfunction parse(value) {\n const str = !value ? \"\" : value;\n const parsed = {\n isSpecial: false // TODO: not implemented\n };\n\n if (isOld(str) === true) {\n return {\n ...parsed,\n ..._parseOld(str)\n };\n } else if (isSpecial(str) === true) {\n return {\n ...parsed,\n ..._parseSpecial(str)\n };\n } else if (isValid(str) === true) {\n return {\n ...parsed,\n ..._parseNew(str)\n };\n }\n\n return null;\n}\n\nexport { parse };\n"],"names":["_partsSpecial","str","cleaned","replace","split","_partsOld","_partsNew","isOld","value","join","length","test","isValid","SPECIALS","CME","DGP","CNP","E","EA","ET","FAE","FN","GSH","PGC","MF","MMA","MOP","PME","PMM","Crown","isSpecial","code","num","getCounter","counter","getNumber","parseInt","getSpecialCode","getSpecialName","PROVINCES","A","AB","AL","AV","B","BA","BI","BU","C","CA","CC","CE","CO","CR","CS","CU","FP","GC","GE","GI","GR","GU","H","HU","IF","J","L","LE","LO","LR","LU","M","MA","ML","MU","NA","O","OU","P","PM","PO","RM","S","SA","SE","SG","SO","SS","T","TE","TF","TO","V","VA","VI","Z","ZA","getProvinceCode","getProvinceName","_parseNew","parsed","provinceName","provinceCode","specialCode","number","_parseOld","_parseSpecial","parse"],"mappings":"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"} \ No newline at end of file diff --git a/package.json b/package.json index 07154f4..3771c09 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "spanish-car-plate", - "version": "0.0.6", + "version": "0.0.7", "description": "Spanish Car Plate validation", "main": "dist/index.js", "license": "MIT", diff --git a/src/_utils.js b/src/_utils.js index bc7f661..59c5a01 100644 --- a/src/_utils.js +++ b/src/_utils.js @@ -1,3 +1,12 @@ +export function _partsSpecial(str) { + const cleaned = str.replace( + /^[\s]*([CMEDGPNATFSHMORW]{1,5})[^A-Z0-9]*([0-9]{4})[\s]*$/i, + "$1,$2" + ); + + return cleaned.split(","); +} + export function _partsOld(str) { const cleaned = str.replace( /^[\s]*([A-Z]{1,3})[^A-Z0-9]*([0-9]{4})[^A-Z0-9]*([A-Z]{2})[\s]*$/i, diff --git a/src/getNumber.js b/src/getNumber.js index 81a1b9d..86a106a 100644 --- a/src/getNumber.js +++ b/src/getNumber.js @@ -1,6 +1,7 @@ import { isOld } from "./isOld"; import { isValid } from "./isValid"; -import { _partsNew, _partsOld } from "./_utils"; +import { isSpecial } from "./isSpecial"; +import { _partsNew, _partsOld, _partsSpecial } from "./_utils"; /** * @@ -17,6 +18,9 @@ function getNumber(value) { if (isOld(str) === true) { const [, num] = _partsOld(str); return parseInt(num, 10); + } else if (isSpecial(str) === true) { + const [, num] = _partsSpecial(str); + return parseInt(num, 10); } else if (isValid(str)) { const [num] = _partsNew(str); return parseInt(num, 10); diff --git a/src/getSpecialCode.js b/src/getSpecialCode.js new file mode 100644 index 0000000..ef93b6e --- /dev/null +++ b/src/getSpecialCode.js @@ -0,0 +1,25 @@ +import { SPECIALS } from "./specials"; +import { isSpecial } from "./isSpecial"; +import { _partsSpecial } from "./_utils"; + +/** + * Returns the special code for a valid car plate + * @param {string} value + * @returns {string} + * @since 0.0.7 + * @example + * getSpecialCode("DGP-1234"); // => "DGP" + */ +function getSpecialCode(value) { + const str = !value ? "" : value; + + if (!isSpecial(str)) { + return null; + } + + const [code] = _partsSpecial(str); + + return SPECIALS[code] ? code : null; +} + +export { getSpecialCode }; diff --git a/src/getSpecialName.js b/src/getSpecialName.js new file mode 100644 index 0000000..1fbf5db --- /dev/null +++ b/src/getSpecialName.js @@ -0,0 +1,19 @@ +import { SPECIALS } from "./specials"; +import { getSpecialCode } from "./getSpecialCode"; + +/** + * Returns the special name for a valid car plate + * @param {string} value + * @returns {string} + * @since 0.0.7 + * @example + * getSpecialCode("CME1234"); // => "Corps of the Mossos d'Esquadra" + */ +function getSpecialName(value) { + const str = !value ? "" : value; + const code = getSpecialCode(str); + + return SPECIALS[code] || null; +} + +export { getSpecialName }; diff --git a/src/index.js b/src/index.js index e3a9ed9..051768c 100644 --- a/src/index.js +++ b/src/index.js @@ -1,8 +1,12 @@ export { isValid } from "./isValid"; export { isOld } from "./isOld"; +export { isSpecial } from "./isSpecial"; export { getCounter } from "./getCounter"; export { getNumber } from "./getNumber"; +export { getSpecialCode } from "./getSpecialCode"; +export { getSpecialName } from "./getSpecialName"; export { getProvinceName } from "./getProvinceName"; export { getProvinceCode } from "./getProvinceCode"; export { parse } from "./parse"; export { PROVINCES } from "./provinces"; +export { SPECIALS } from "./specials"; diff --git a/src/isSpecial.js b/src/isSpecial.js new file mode 100644 index 0000000..0a09127 --- /dev/null +++ b/src/isSpecial.js @@ -0,0 +1,29 @@ +import { _partsSpecial } from "./_utils"; +import { SPECIALS } from "./specials"; + +/** + * Returns true if is a valid spacial car plate + * @param {string} value + * @returns {boolean} + * @since 0.0.7 + * @example + * isSpecial("CME 2342"); // => true + * isSpecial("E 1660"); // => true + */ +function isSpecial(value) { + const str = !value ? "" : value; + const [code, num] = _partsSpecial(str); + const cleaned = `${code}${num}`; + + if (cleaned.length < 5 || cleaned.length > 9) { + return false; + } + + if (!SPECIALS[code]) { + return false; + } + + return /^[CMEDGPNATFSHMORW]{1,5}[0-9]{4}$/i.test(cleaned); +} + +export { isSpecial }; diff --git a/src/parse.js b/src/parse.js index 08b5076..173eada 100644 --- a/src/parse.js +++ b/src/parse.js @@ -1,13 +1,18 @@ import { isValid } from "./isValid"; import { isOld } from "./isOld"; +import { isSpecial } from "./isSpecial"; import { getProvinceName } from "./getProvinceName"; import { getProvinceCode } from "./getProvinceCode"; import { getCounter } from "./getCounter"; import { getNumber } from "./getNumber"; +import { getSpecialCode } from "./getSpecialCode"; function _parseNew(str) { const parsed = {}; parsed.isOld = false; + parsed.provinceName = null; + parsed.provinceCode = null; + parsed.specialCode = null; parsed.counter = getCounter(str); parsed.number = getNumber(str); return parsed; @@ -16,15 +21,26 @@ function _parseNew(str) { function _parseOld(str) { const parsed = {}; parsed.isOld = true; - const provinceName = getProvinceName(str); - const provinceCode = getProvinceCode(str); - parsed.provinceName = provinceName; - parsed.provinceCode = provinceCode; + parsed.provinceName = getProvinceName(str); + parsed.provinceCode = getProvinceCode(str); + parsed.specialCode = null; parsed.counter = getCounter(str); parsed.number = getNumber(str); return parsed; } +function _parseSpecial(str) { + const parsed = {}; + parsed.isOld = false; + parsed.provinceName = null; + parsed.provinceCode = null; + parsed.specialCode = getSpecialCode(str); + parsed.counter = null; + parsed.number = getNumber(str); + parsed.isSpecial = true; + return parsed; +} + /** * Returns an object containing information about the plate * @param {string} value @@ -36,16 +52,20 @@ function _parseOld(str) { */ function parse(value) { const str = !value ? "" : value; - const old = isOld(str); const parsed = { isSpecial: false // TODO: not implemented }; - if (old === true) { + if (isOld(str) === true) { return { ...parsed, ..._parseOld(str) }; + } else if (isSpecial(str) === true) { + return { + ...parsed, + ..._parseSpecial(str) + }; } else if (isValid(str) === true) { return { ...parsed, diff --git a/src/specials.js b/src/specials.js new file mode 100644 index 0000000..3b548be --- /dev/null +++ b/src/specials.js @@ -0,0 +1,18 @@ +export const SPECIALS = { + CME: "Corps of the Mossos d'Esquadra", + DGP: "Spanish Police", + CNP: "Spanish Police", + E: "Autonomous police force of the Basque Country", + EA: "Air Force", + ET: "Spanish Army", + FAE: "Allied Forces in Spain", + FN: "Spanish Navy", + GSH: "Colonial police on Sahara", + PGC: "Spanish civil guard", + MF: "Public Works Ministry", + MMA: "Environment Ministry", + MOP: "Public Works Ministry", + PME: "State owned vehicles", + PMM: "State owned vehicles, on a Ministry", + Crown: "King's Car" +}; diff --git a/test/getSpecialCode.test.js b/test/getSpecialCode.test.js new file mode 100644 index 0000000..9cb953d --- /dev/null +++ b/test/getSpecialCode.test.js @@ -0,0 +1,30 @@ +const assert = require("assert"); +const { getSpecialCode, SPECIALS } = require("../dist/index"); + +describe("#getSpecialCode", () => { + describe("invalid", () => { + describe("wrong input", () => { + it("should return null with null", () => { + assert.equal(getSpecialCode(null), null); + }); + + it("should return null with undefined", () => { + assert.equal(getSpecialCode(undefined), null); + }); + + it("should return null with empty", () => { + assert.equal(getSpecialCode(""), null); + }); + }); + }); + + describe("valid", () => { + it("should get the special counter for Spanish Police", () => { + assert.equal(getSpecialCode("DGP1234"), "DGP"); + }); + + it("should get the special counter for Environment Ministry", () => { + assert.equal(getSpecialCode("MMA1234"), "MMA"); + }); + }); +}); diff --git a/test/getSpecialName.test.js b/test/getSpecialName.test.js new file mode 100644 index 0000000..1303076 --- /dev/null +++ b/test/getSpecialName.test.js @@ -0,0 +1,102 @@ +const assert = require("assert"); +const { getSpecialName } = require("../dist/index"); + +describe("#getSpecialName", () => { + describe("invalid", () => { + describe("special plates only", () => { + it("should work only with special plates 1", () => { + assert.equal(getSpecialName("1234BCD"), null); + }); + + it("should work only with special plates 2", () => { + assert.equal(getSpecialName("A 1234 BL"), null); + }); + }); + + describe("unknown special", () => { + it("should not work with unknown code", () => { + assert.equal(getSpecialName("AAA1234"), null); + }); + }); + + describe("wrong input", () => { + it("should return null with null", () => { + assert.equal(getSpecialName(null), null); + }); + + it("should return null with undefined", () => { + assert.equal(getSpecialName(undefined), null); + }); + + it("should return null with empty", () => { + assert.equal(getSpecialName(""), null); + }); + }); + }); + + describe("valid", () => { + it("should get CME", () => { + assert.equal(getSpecialName("CME1234"), "Corps of the Mossos d'Esquadra"); + }); + + it("should get DGP", () => { + assert.equal(getSpecialName("DGP1234"), "Spanish Police"); + }); + + it("should get CNP", () => { + assert.equal(getSpecialName("CNP1234"), "Spanish Police"); + }); + + it("should get E", () => { + assert.equal(getSpecialName("E1234"), "Autonomous police force of the Basque Country"); + }); + + it("should get EA", () => { + assert.equal(getSpecialName("EA1234"), "Air Force"); + }); + + it("should get ET", () => { + assert.equal(getSpecialName("ET1234"), "Spanish Army"); + }); + + it("should get FAE", () => { + assert.equal(getSpecialName("FAE1234"), "Allied Forces in Spain"); + }); + + it("should get FN", () => { + assert.equal(getSpecialName("FN1234"), "Spanish Navy"); + }); + + it("should get GSH", () => { + assert.equal(getSpecialName("GSH1234"), "Colonial police on Sahara"); + }); + + it("should get PGC", () => { + assert.equal(getSpecialName("PGC1234"), "Spanish civil guard"); + }); + + it("should get MF", () => { + assert.equal(getSpecialName("MF1234"), "Public Works Ministry"); + }); + + it("should get MMA", () => { + assert.equal(getSpecialName("MMA1234"), "Environment Ministry"); + }); + + it("should get MOP", () => { + assert.equal(getSpecialName("MOP1234"), "Public Works Ministry"); + }); + + it("should get PME", () => { + assert.equal(getSpecialName("PME1234"), "State owned vehicles"); + }); + + it("should get PMM", () => { + assert.equal(getSpecialName("PMM1234"), "State owned vehicles, on a Ministry"); + }); + + it("should get Crown", () => { + assert.equal(getSpecialName("Crown1234"), "King's Car"); + }); + }); +}); diff --git a/test/index.test.js b/test/index.test.js index 8635786..bbb72aa 100644 --- a/test/index.test.js +++ b/test/index.test.js @@ -3,9 +3,12 @@ const { isValid, parse, isOld, + isSpecial, getCounter, getProvinceName, getProvinceCode, + getSpecialCode, + getSpecialName, PROVINCES } = require("../dist/index"); @@ -22,6 +25,10 @@ describe("api", () => { assert.ok(isOld); }); + it("should export isSpecial", () => { + assert.ok(isSpecial); + }); + it("should export getProvinceName", () => { assert.ok(getProvinceName); }); @@ -30,6 +37,14 @@ describe("api", () => { assert.ok(getProvinceCode); }); + it("should export getSpecialCode", () => { + assert.ok(getSpecialCode); + }); + + it("should export getSpecialName", () => { + assert.ok(getSpecialName); + }); + it("should export getCounter", () => { assert.ok(getCounter); }); diff --git a/test/isSpecial.test.js b/test/isSpecial.test.js new file mode 100644 index 0000000..8b49deb --- /dev/null +++ b/test/isSpecial.test.js @@ -0,0 +1,88 @@ +const assert = require("assert"); +const { isSpecial } = require("../dist/index"); + +describe("#isSpecial", () => { + describe("invalid", () => { + it("should not be valid without all chars required", () => { + assert.equal(isSpecial("X"), false); + }); + + it("should not be valid with null", () => { + assert.equal(isSpecial(null), false); + }); + + it("should not be valid with undefined", () => { + assert.equal(isSpecial(undefined), false); + }); + + it("should not be valid with empty string", () => { + assert.equal(isSpecial(""), false); + }); + }); + + describe("valid", () => { + it("should be valid with Crown", () => { + assert.equal(isSpecial("Crown 0000"), true); + }); + + it("should be valid with CME", () => { + assert.equal(isSpecial("CME 0001"), true); + }); + + it("should be valid with DGP", () => { + assert.equal(isSpecial("DGP 0001"), true); + }); + + it("should be valid with CNP", () => { + assert.equal(isSpecial("CNP 0001"), true); + }); + + it("should be valid with E", () => { + assert.equal(isSpecial("E 0001"), true); + }); + + it("should be valid with EA", () => { + assert.equal(isSpecial("EA 0001"), true); + }); + + it("should be valid with ET", () => { + assert.equal(isSpecial("ET 0001"), true); + }); + + it("should be valid with FAE", () => { + assert.equal(isSpecial("FAE 0001"), true); + }); + + it("should be valid with FN", () => { + assert.equal(isSpecial("FN 0001"), true); + }); + + it("should be valid with GSH", () => { + assert.equal(isSpecial("GSH 0001"), true); + }); + + it("should be valid with PGC", () => { + assert.equal(isSpecial("PGC 0001"), true); + }); + + it("should be valid with MF", () => { + assert.equal(isSpecial("MF 0001"), true); + }); + + it("should be valid with MMA", () => { + assert.equal(isSpecial("MMA 0001"), true); + }); + + it("should be valid with MOP", () => { + assert.equal(isSpecial("MOP 0001"), true); + }); + + it("should be valid with PME", () => { + assert.equal(isSpecial("PME 0001"), true); + }); + + it("should be valid with PMM", () => { + assert.equal(isSpecial("PMM 0001"), true); + }); + }); +}); diff --git a/test/parse.test.js b/test/parse.test.js index 695ded0..a3b5993 100644 --- a/test/parse.test.js +++ b/test/parse.test.js @@ -21,11 +21,26 @@ describe("#parse", () => { }); describe("valid", () => { + describe("special", () => { + it("parse", () => { + assert.deepStrictEqual(parse("DGP 1234"), { + isSpecial: true, + isOld: false, + specialCode: "DGP", + provinceCode: null, + provinceName: null, + number: 1234, + counter: null + }); + }); + }); + describe("old", () => { it("parse", () => { assert.deepStrictEqual(parse("GI 2345 BC"), { isSpecial: false, isOld: true, + specialCode: null, provinceCode: "GI", provinceName: "Province of Girona", number: 2345, @@ -39,6 +54,9 @@ describe("#parse", () => { assert.deepStrictEqual(parse("2345GBC"), { isSpecial: false, isOld: false, + specialCode: null, + provinceCode: null, + provinceName: null, number: 2345, counter: "GBC" }); diff --git a/types/index.d.ts b/types/index.d.ts index 2e70166..8ea3bd0 100644 --- a/types/index.d.ts +++ b/types/index.d.ts @@ -3,6 +3,7 @@ declare function getNumber(value: string): number; declare function getProvinceCode(value: string): string; declare function getProvinceName(value: string): string; +declare function isSpecial(value: string): boolean; /** * Returns true if is a valid (old system 1971-2000) car plate */ @@ -24,14 +25,17 @@ interface IPlate { declare function parse(value: string): IPlate; declare const PROVINCES: object; +declare const SPECIALS: object; export { IPlate, isValid, isOld, + isSpecial, getCounter, getProvinceName, getProvinceCode, getNumber, - PROVINCES + PROVINCES, + SPECIALS };