@natlibfi/marc-record-validators-melinda 10.2.3 → 10.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/melinda-node-tests.yml +2 -2
- package/dist/access-rights.js.map +1 -1
- package/dist/access-rights.spec.js.map +1 -1
- package/dist/double-commas.js.map +1 -1
- package/dist/double-commas.spec.js.map +1 -1
- package/dist/duplicates-ind1.js.map +1 -1
- package/dist/duplicates-ind1.spec.js.map +1 -1
- package/dist/empty-fields.js.map +1 -1
- package/dist/empty-fields.spec.js.map +1 -1
- package/dist/ending-punctuation-conf.js.map +1 -1
- package/dist/ending-punctuation.js.map +1 -1
- package/dist/ending-punctuation.spec.js.map +1 -1
- package/dist/ending-whitespace.js.map +1 -1
- package/dist/ending-whitespace.spec.js.map +1 -1
- package/dist/field-exclusion.js.map +1 -1
- package/dist/field-exclusion.spec.js.map +1 -1
- package/dist/field-structure.js.map +1 -1
- package/dist/field-structure.spec.js.map +1 -1
- package/dist/fields-present.js.map +1 -1
- package/dist/fields-present.spec.js.map +1 -1
- package/dist/fixed-fields.js.map +1 -1
- package/dist/fixed-fields.spec.js.map +1 -1
- package/dist/identical-fields.js.map +1 -1
- package/dist/identical-fields.spec.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/indicator-fixes.js.map +1 -1
- package/dist/indicator-fixes.spec.js.map +1 -1
- package/dist/isbn-issn.js.map +1 -1
- package/dist/isbn-issn.spec.js.map +1 -1
- package/dist/item-language.js.map +1 -1
- package/dist/item-language.spec.js.map +1 -1
- package/dist/mergeField500Lisapainokset.js.map +1 -1
- package/dist/mergeField500Lisapainokset.spec.js.map +1 -1
- package/dist/multiple-subfield-0.js.map +1 -1
- package/dist/multiple-subfield-0.spec.js.map +1 -1
- package/dist/non-breaking-space.js.map +1 -1
- package/dist/non-breaking-space.spec.js.map +1 -1
- package/dist/normalize-identifiers.js.map +1 -1
- package/dist/normalize-identifiers.spec.js.map +1 -1
- package/dist/normalize-utf8-diacritics.js.map +1 -1
- package/dist/normalize-utf8-diacritics.spec.js.map +1 -1
- package/dist/punctuation/index.js.map +1 -1
- package/dist/punctuation/rules/aut.js.map +1 -1
- package/dist/punctuation/rules/bib.js.map +1 -1
- package/dist/punctuation/rules/index.js.map +1 -1
- package/dist/punctuation.spec.js.map +1 -1
- package/dist/punctuation2.js +677 -0
- package/dist/punctuation2.js.map +1 -0
- package/dist/punctuation2.spec.js +51 -0
- package/dist/punctuation2.spec.js.map +1 -0
- package/dist/reindexSubfield6OccurenceNumbers.js.map +1 -1
- package/dist/reindexSubfield6OccurenceNumbers.spec.js.map +1 -1
- package/dist/removeDuplicateDataFields.js +117 -30
- package/dist/removeDuplicateDataFields.js.map +1 -1
- package/dist/removeDuplicateDataFields.spec.js.map +1 -1
- package/dist/removeInferiorDataFields.js +98 -0
- package/dist/removeInferiorDataFields.js.map +1 -0
- package/dist/removeInferiorDataFields.spec.js +51 -0
- package/dist/removeInferiorDataFields.spec.js.map +1 -0
- package/dist/resolvable-ext-references-melinda.js.map +1 -1
- package/dist/resolvable-ext-references-melinda.spec.js.map +1 -1
- package/dist/resolveOrphanedSubfield6s.js.map +1 -1
- package/dist/resolveOrphanedSubfield6s.spec.js.map +1 -1
- package/dist/sort-tags.js.map +1 -1
- package/dist/sort-tags.spec.js.map +1 -1
- package/dist/subfield-exclusion.js.map +1 -1
- package/dist/subfield-exclusion.spec.js.map +1 -1
- package/dist/subfield6Utils.js.map +1 -1
- package/dist/subfield8Utils.js +17 -10
- package/dist/subfield8Utils.js.map +1 -1
- package/dist/unicode-decomposition.js.map +1 -1
- package/dist/unicode-decomposition.spec.js.map +1 -1
- package/dist/urn.js.map +1 -1
- package/dist/urn.spec.js.map +1 -1
- package/dist/utils.js.map +1 -1
- package/package.json +2 -2
- package/src/punctuation2.js +398 -0
- package/src/punctuation2.spec.js +52 -0
- package/src/removeDuplicateDataFields.js +141 -31
- package/src/removeInferiorDataFields.js +97 -0
- package/src/removeInferiorDataFields.spec.js +52 -0
- package/src/subfield8Utils.js +16 -11
- package/test-fixtures/punctuation2/01/expectedResult.json +12 -0
- package/test-fixtures/punctuation2/01/metadata.json +6 -0
- package/test-fixtures/punctuation2/01/record.json +37 -0
- package/test-fixtures/punctuation2/02/expectedResult.json +4 -0
- package/test-fixtures/punctuation2/02/metadata.json +6 -0
- package/test-fixtures/punctuation2/02/record.json +14 -0
- package/test-fixtures/punctuation2/04/expectedResult.json +7 -0
- package/test-fixtures/punctuation2/04/metadata.json +6 -0
- package/test-fixtures/punctuation2/04/record.json +22 -0
- package/test-fixtures/punctuation2/05/expectedResult.json +6 -0
- package/test-fixtures/punctuation2/05/metadata.json +6 -0
- package/test-fixtures/punctuation2/05/record.json +12 -0
- package/test-fixtures/punctuation2/98/expectedResult.json +39 -0
- package/test-fixtures/punctuation2/98/metadata.json +6 -0
- package/test-fixtures/punctuation2/98/record.json +37 -0
- package/test-fixtures/punctuation2/99/expectedResult.json +15 -0
- package/test-fixtures/punctuation2/99/metadata.json +6 -0
- package/test-fixtures/punctuation2/99/record.json +14 -0
- package/test-fixtures/remove-duplicate-datafields/f03/expectedResult.json +20 -0
- package/test-fixtures/remove-duplicate-datafields/f03/metadata.json +6 -0
- package/test-fixtures/remove-duplicate-datafields/f03/record.json +33 -0
- package/test-fixtures/remove-duplicate-datafields/f03b/expectedResult.json +20 -0
- package/test-fixtures/remove-duplicate-datafields/f03b/metadata.json +6 -0
- package/test-fixtures/remove-duplicate-datafields/f03b/record.json +35 -0
- package/test-fixtures/remove-duplicate-datafields/f03c/expectedResult.json +25 -0
- package/test-fixtures/remove-duplicate-datafields/f03c/metadata.json +6 -0
- package/test-fixtures/remove-duplicate-datafields/f03c/record.json +43 -0
- package/test-fixtures/remove-duplicate-datafields/f06/expectedResult.json +0 -18
- package/test-fixtures/remove-duplicate-datafields/v02/expectedResult.json +1 -3
- package/test-fixtures/remove-duplicate-datafields/v03/expectedResult.json +1 -2
- package/test-fixtures/remove-inferior-datafields/f01/expectedResult.json +21 -0
- package/test-fixtures/remove-inferior-datafields/f01/metadata.json +6 -0
- package/test-fixtures/remove-inferior-datafields/f01/record.json +31 -0
- package/test-fixtures/remove-inferior-datafields/v01/expectedResult.json +6 -0
- package/test-fixtures/remove-inferior-datafields/v01/metadata.json +6 -0
- package/test-fixtures/remove-inferior-datafields/v01/record.json +31 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subfield-exclusion.js","names":["confSpec","tag","type","mandatory","ind1","ind2","subfields","code","value","forEach","obj","fun","Object","entries","isRegExp","re","RegExp","config","Array","isArray","TypeError","configValid","description","validate","record","excludeSubfields","fix","checkMandatory","key","val","configMatchesSpec","data","spec","Error","subObj","subKey","subVal","conf","res","message","valid","confObj","found","get","element","every","confKey","confField","test","subField","excluded","elemSub","subFieldCodeFine","subFieldValueFine","push","sf","removeSubfield","length","removeField"],"sources":["../src/subfield-exclusion.js"],"sourcesContent":["// Tag (RegExp): Pattern to match the field's tags Mandatory\n// ind1 (RegExp): Pattern to match the field's ind1 property\n// ind2 (RegExp): Pattern to match the field's ind2 property\n// subfields (Array<Object>): An array of objects with the following properties (Mandatory):\n// // code (RegExp): Pattern to match the subfield's code Mandatory\n// // value (RegExp): Pattern to match the subfield's value\n\n// Configuration specification\nconst confSpec = {\n tag: { // Pattern to match the field's tags\n type: 'RegExp',\n mandatory: true\n },\n ind1: { // Pattern to match the field's ind1 property.\n type: 'RegExp' // Array<Indicator>\n },\n ind2: { // Pattern to match the field's ind2 property.\n type: 'RegExp' // Array<Indicator>\n },\n subfields: { // An array of objects with the following properties\n code: {\n type: 'RegExp',\n mandatory: true\n },\n value: {\n type: 'RegExp'\n },\n mandatory: true\n }\n};\n\nfunction forEach(obj, fun) {\n Object.entries(obj).forEach(fun);\n}\n\nfunction isRegExp(re) {\n return re instanceof RegExp;\n}\n\nexport default function (config) {\n if (!Array.isArray(config)) {\n throw new TypeError('Configuration array not provided');\n }\n\n configValid(config);\n\n return {\n description:\n 'Checks that the record does not contain the configured subfields',\n validate: record => excludeSubfields(record, config, false),\n fix: record => excludeSubfields(record, config, true)\n };\n\n /// /////////////////////////////////////////\n // These check that configuration is valid\n function configValid(config) {\n config.forEach(obj => {\n checkMandatory(confSpec, obj);\n\n forEach(obj, ([key, val]) => {\n configMatchesSpec(val, key, confSpec);\n });\n });\n }\n\n // Recursive validator\n function configMatchesSpec(data, key, spec) {\n // Field not found in configuration spec\n if (!spec[key]) {\n throw new Error(`Configuration not valid - unidentified value: ${key}`);\n }\n\n // If configuration type does not match type in configuration spec\n if (typeof data !== spec[key].type &&\n (spec[key].type === 'RegExp' && !isRegExp(data))) {\n throw new Error(`Configuration not valid - invalid data type for: ${key}`);\n }\n\n // Check subfields recursively\n if (key === 'subfields') { // eslint-disable-line functional/no-conditional-statement\n forEach(data, ([, subObj]) => {\n // Console.log(\"subObj: \", subObj, \" type: \", typeof subObj, !(Array.isArray(subObj)))\n if (typeof subObj === 'object' && !Array.isArray(subObj)) { // eslint-disable-line functional/no-conditional-statement\n checkMandatory(spec[key], subObj);\n\n forEach(subObj, ([subKey, subVal]) => {\n configMatchesSpec(subVal, subKey, spec[key]);\n });\n } else {\n throw new TypeError(`Configuration not valid - subfield: ${subObj} not object`);\n }\n });\n }\n }\n\n function checkMandatory(spec, obj) {\n // Check if all mandatory fields are present\n forEach(spec, ([key, val]) => {\n if (val.mandatory && typeof obj[key] === 'undefined') {\n throw new Error(`Configuration not valid - missing mandatory element: ${key}`);\n }\n });\n }\n /// /////////////////////////////////////////\n\n /// /////////////////////////////////////////\n // These check that record is valid\n function excludeSubfields(record, conf, fix) {\n const res = {message: [], valid: true};\n\n // Parse trough every element of config array\n conf.forEach(confObj => {\n const found = record.get(confObj.tag); // Find matching record fields based on mandatory tag\n\n // Check if some of found record fields matches all configuration fields\n found.forEach(element => {\n // Compare each found element against each configuration object\n if (Object.entries(confObj).every(([confKey, confField]) => {\n // Tag already checked at .get(), subfields later\n if (confKey === 'tag' || confKey === 'subfields') {\n return true;\n }\n\n // Configuration object is RegExp and record value matches it\n if (element[confKey] && isRegExp(confField) && confField.test(element[confKey])) {\n return true;\n }\n\n // Configuration object not found from found element\n return false;\n })) { // eslint-disable-line functional/no-conditional-statement\n // All configuration fields match, check if some subfields should be excluded.\n confObj.subfields.forEach(subField => {\n const excluded = [];\n\n element.subfields.forEach(elemSub => {\n // Check if subfield matches configuration spec\n const subFieldCodeFine = subField.code && elemSub.code && subField.code.test(elemSub.code);\n const subFieldValueFine = subField.value && elemSub.value && subField.value.test(elemSub.value);\n if (subFieldCodeFine && (typeof subField.value === 'undefined' || subFieldValueFine)) {\n if (fix) { // eslint-disable-line functional/no-conditional-statement\n excluded.push(elemSub); // eslint-disable-line functional/immutable-data\n } else { // eslint-disable-line functional/no-conditional-statement\n res.message.push(`Subfield $${element.tag}$$${elemSub.code}should be excluded`); // eslint-disable-line functional/immutable-data\n }\n }\n });\n\n excluded.forEach(sf => record.removeSubfield(sf, element));\n // If no subfields remains, the whole field will be removed as well:\n if (element.subfields && element.subfields.length === 0) { // eslint-disable-line functional/no-conditional-statement\n record.removeField(element);\n }\n });\n }\n });\n });\n\n // Fix does not send response\n if (!fix) {\n if (res.message.length > 0) { // eslint-disable-line functional/no-conditional-statement\n res.valid = false; // eslint-disable-line functional/immutable-data\n }\n\n return res;\n }\n // Res.fix.push('Field $' + element.tag + ' excluded');\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"subfield-exclusion.js","names":["confSpec","tag","type","mandatory","ind1","ind2","subfields","code","value","forEach","obj","fun","Object","entries","isRegExp","re","RegExp","_default","config","Array","isArray","TypeError","configValid","description","validate","record","excludeSubfields","fix","checkMandatory","key","val","configMatchesSpec","data","spec","Error","subObj","subKey","subVal","conf","res","message","valid","confObj","found","get","element","every","confKey","confField","test","subField","excluded","elemSub","subFieldCodeFine","subFieldValueFine","push","sf","removeSubfield","length","removeField"],"sources":["../src/subfield-exclusion.js"],"sourcesContent":["// Tag (RegExp): Pattern to match the field's tags Mandatory\n// ind1 (RegExp): Pattern to match the field's ind1 property\n// ind2 (RegExp): Pattern to match the field's ind2 property\n// subfields (Array<Object>): An array of objects with the following properties (Mandatory):\n// // code (RegExp): Pattern to match the subfield's code Mandatory\n// // value (RegExp): Pattern to match the subfield's value\n\n// Configuration specification\nconst confSpec = {\n tag: { // Pattern to match the field's tags\n type: 'RegExp',\n mandatory: true\n },\n ind1: { // Pattern to match the field's ind1 property.\n type: 'RegExp' // Array<Indicator>\n },\n ind2: { // Pattern to match the field's ind2 property.\n type: 'RegExp' // Array<Indicator>\n },\n subfields: { // An array of objects with the following properties\n code: {\n type: 'RegExp',\n mandatory: true\n },\n value: {\n type: 'RegExp'\n },\n mandatory: true\n }\n};\n\nfunction forEach(obj, fun) {\n Object.entries(obj).forEach(fun);\n}\n\nfunction isRegExp(re) {\n return re instanceof RegExp;\n}\n\nexport default function (config) {\n if (!Array.isArray(config)) {\n throw new TypeError('Configuration array not provided');\n }\n\n configValid(config);\n\n return {\n description:\n 'Checks that the record does not contain the configured subfields',\n validate: record => excludeSubfields(record, config, false),\n fix: record => excludeSubfields(record, config, true)\n };\n\n /// /////////////////////////////////////////\n // These check that configuration is valid\n function configValid(config) {\n config.forEach(obj => {\n checkMandatory(confSpec, obj);\n\n forEach(obj, ([key, val]) => {\n configMatchesSpec(val, key, confSpec);\n });\n });\n }\n\n // Recursive validator\n function configMatchesSpec(data, key, spec) {\n // Field not found in configuration spec\n if (!spec[key]) {\n throw new Error(`Configuration not valid - unidentified value: ${key}`);\n }\n\n // If configuration type does not match type in configuration spec\n if (typeof data !== spec[key].type &&\n (spec[key].type === 'RegExp' && !isRegExp(data))) {\n throw new Error(`Configuration not valid - invalid data type for: ${key}`);\n }\n\n // Check subfields recursively\n if (key === 'subfields') { // eslint-disable-line functional/no-conditional-statement\n forEach(data, ([, subObj]) => {\n // Console.log(\"subObj: \", subObj, \" type: \", typeof subObj, !(Array.isArray(subObj)))\n if (typeof subObj === 'object' && !Array.isArray(subObj)) { // eslint-disable-line functional/no-conditional-statement\n checkMandatory(spec[key], subObj);\n\n forEach(subObj, ([subKey, subVal]) => {\n configMatchesSpec(subVal, subKey, spec[key]);\n });\n } else {\n throw new TypeError(`Configuration not valid - subfield: ${subObj} not object`);\n }\n });\n }\n }\n\n function checkMandatory(spec, obj) {\n // Check if all mandatory fields are present\n forEach(spec, ([key, val]) => {\n if (val.mandatory && typeof obj[key] === 'undefined') {\n throw new Error(`Configuration not valid - missing mandatory element: ${key}`);\n }\n });\n }\n /// /////////////////////////////////////////\n\n /// /////////////////////////////////////////\n // These check that record is valid\n function excludeSubfields(record, conf, fix) {\n const res = {message: [], valid: true};\n\n // Parse trough every element of config array\n conf.forEach(confObj => {\n const found = record.get(confObj.tag); // Find matching record fields based on mandatory tag\n\n // Check if some of found record fields matches all configuration fields\n found.forEach(element => {\n // Compare each found element against each configuration object\n if (Object.entries(confObj).every(([confKey, confField]) => {\n // Tag already checked at .get(), subfields later\n if (confKey === 'tag' || confKey === 'subfields') {\n return true;\n }\n\n // Configuration object is RegExp and record value matches it\n if (element[confKey] && isRegExp(confField) && confField.test(element[confKey])) {\n return true;\n }\n\n // Configuration object not found from found element\n return false;\n })) { // eslint-disable-line functional/no-conditional-statement\n // All configuration fields match, check if some subfields should be excluded.\n confObj.subfields.forEach(subField => {\n const excluded = [];\n\n element.subfields.forEach(elemSub => {\n // Check if subfield matches configuration spec\n const subFieldCodeFine = subField.code && elemSub.code && subField.code.test(elemSub.code);\n const subFieldValueFine = subField.value && elemSub.value && subField.value.test(elemSub.value);\n if (subFieldCodeFine && (typeof subField.value === 'undefined' || subFieldValueFine)) {\n if (fix) { // eslint-disable-line functional/no-conditional-statement\n excluded.push(elemSub); // eslint-disable-line functional/immutable-data\n } else { // eslint-disable-line functional/no-conditional-statement\n res.message.push(`Subfield $${element.tag}$$${elemSub.code}should be excluded`); // eslint-disable-line functional/immutable-data\n }\n }\n });\n\n excluded.forEach(sf => record.removeSubfield(sf, element));\n // If no subfields remains, the whole field will be removed as well:\n if (element.subfields && element.subfields.length === 0) { // eslint-disable-line functional/no-conditional-statement\n record.removeField(element);\n }\n });\n }\n });\n });\n\n // Fix does not send response\n if (!fix) {\n if (res.message.length > 0) { // eslint-disable-line functional/no-conditional-statement\n res.valid = false; // eslint-disable-line functional/immutable-data\n }\n\n return res;\n }\n // Res.fix.push('Field $' + element.tag + ' excluded');\n }\n}\n"],"mappings":";;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,MAAMA,QAAQ,GAAG;EACfC,GAAG,EAAE;IAAE;IACLC,IAAI,EAAE,QAAQ;IACdC,SAAS,EAAE;EACb,CAAC;EACDC,IAAI,EAAE;IAAE;IACNF,IAAI,EAAE,QAAQ,CAAC;EACjB,CAAC;;EACDG,IAAI,EAAE;IAAE;IACNH,IAAI,EAAE,QAAQ,CAAC;EACjB,CAAC;;EACDI,SAAS,EAAE;IAAE;IACXC,IAAI,EAAE;MACJL,IAAI,EAAE,QAAQ;MACdC,SAAS,EAAE;IACb,CAAC;IACDK,KAAK,EAAE;MACLN,IAAI,EAAE;IACR,CAAC;IACDC,SAAS,EAAE;EACb;AACF,CAAC;AAED,SAASM,OAAOA,CAACC,GAAG,EAAEC,GAAG,EAAE;EACzBC,MAAM,CAACC,OAAO,CAACH,GAAG,CAAC,CAACD,OAAO,CAACE,GAAG,CAAC;AAClC;AAEA,SAASG,QAAQA,CAACC,EAAE,EAAE;EACpB,OAAOA,EAAE,YAAYC,MAAM;AAC7B;AAEe,SAAAC,SAAUC,MAAM,EAAE;EAC/B,IAAI,CAACC,KAAK,CAACC,OAAO,CAACF,MAAM,CAAC,EAAE;IAC1B,MAAM,IAAIG,SAAS,CAAC,kCAAkC,CAAC;EACzD;EAEAC,WAAW,CAACJ,MAAM,CAAC;EAEnB,OAAO;IACLK,WAAW,EACT,kEAAkE;IACpEC,QAAQ,EAAEC,MAAM,IAAIC,gBAAgB,CAACD,MAAM,EAAEP,MAAM,EAAE,KAAK,CAAC;IAC3DS,GAAG,EAAEF,MAAM,IAAIC,gBAAgB,CAACD,MAAM,EAAEP,MAAM,EAAE,IAAI;EACtD,CAAC;;EAED;EACA;EACA,SAASI,WAAWA,CAACJ,MAAM,EAAE;IAC3BA,MAAM,CAACT,OAAO,CAACC,GAAG,IAAI;MACpBkB,cAAc,CAAC5B,QAAQ,EAAEU,GAAG,CAAC;MAE7BD,OAAO,CAACC,GAAG,EAAE,CAAC,CAACmB,GAAG,EAAEC,GAAG,CAAC,KAAK;QAC3BC,iBAAiB,CAACD,GAAG,EAAED,GAAG,EAAE7B,QAAQ,CAAC;MACvC,CAAC,CAAC;IACJ,CAAC,CAAC;EACJ;;EAEA;EACA,SAAS+B,iBAAiBA,CAACC,IAAI,EAAEH,GAAG,EAAEI,IAAI,EAAE;IAC1C;IACA,IAAI,CAACA,IAAI,CAACJ,GAAG,CAAC,EAAE;MACd,MAAM,IAAIK,KAAK,CAAE,iDAAgDL,GAAI,EAAC,CAAC;IACzE;;IAEA;IACA,IAAI,OAAOG,IAAI,KAAKC,IAAI,CAACJ,GAAG,CAAC,CAAC3B,IAAI,IAC/B+B,IAAI,CAACJ,GAAG,CAAC,CAAC3B,IAAI,KAAK,QAAQ,IAAI,CAACY,QAAQ,CAACkB,IAAI,CAAE,EAAE;MAClD,MAAM,IAAIE,KAAK,CAAE,oDAAmDL,GAAI,EAAC,CAAC;IAC5E;;IAEA;IACA,IAAIA,GAAG,KAAK,WAAW,EAAE;MAAE;MACzBpB,OAAO,CAACuB,IAAI,EAAE,CAAC,GAAGG,MAAM,CAAC,KAAK;QAC5B;QACA,IAAI,OAAOA,MAAM,KAAK,QAAQ,IAAI,CAAChB,KAAK,CAACC,OAAO,CAACe,MAAM,CAAC,EAAE;UAAE;UAC1DP,cAAc,CAACK,IAAI,CAACJ,GAAG,CAAC,EAAEM,MAAM,CAAC;UAEjC1B,OAAO,CAAC0B,MAAM,EAAE,CAAC,CAACC,MAAM,EAAEC,MAAM,CAAC,KAAK;YACpCN,iBAAiB,CAACM,MAAM,EAAED,MAAM,EAAEH,IAAI,CAACJ,GAAG,CAAC,CAAC;UAC9C,CAAC,CAAC;QACJ,CAAC,MAAM;UACL,MAAM,IAAIR,SAAS,CAAE,uCAAsCc,MAAO,aAAY,CAAC;QACjF;MACF,CAAC,CAAC;IACJ;EACF;EAEA,SAASP,cAAcA,CAACK,IAAI,EAAEvB,GAAG,EAAE;IACjC;IACAD,OAAO,CAACwB,IAAI,EAAE,CAAC,CAACJ,GAAG,EAAEC,GAAG,CAAC,KAAK;MAC5B,IAAIA,GAAG,CAAC3B,SAAS,IAAI,OAAOO,GAAG,CAACmB,GAAG,CAAC,KAAK,WAAW,EAAE;QACpD,MAAM,IAAIK,KAAK,CAAE,wDAAuDL,GAAI,EAAC,CAAC;MAChF;IACF,CAAC,CAAC;EACJ;EACA;;EAEA;EACA;EACA,SAASH,gBAAgBA,CAACD,MAAM,EAAEa,IAAI,EAAEX,GAAG,EAAE;IAC3C,MAAMY,GAAG,GAAG;MAACC,OAAO,EAAE,EAAE;MAAEC,KAAK,EAAE;IAAI,CAAC;;IAEtC;IACAH,IAAI,CAAC7B,OAAO,CAACiC,OAAO,IAAI;MACtB,MAAMC,KAAK,GAAGlB,MAAM,CAACmB,GAAG,CAACF,OAAO,CAACzC,GAAG,CAAC,CAAC,CAAC;;MAEvC;MACA0C,KAAK,CAAClC,OAAO,CAACoC,OAAO,IAAI;QACvB;QACA,IAAIjC,MAAM,CAACC,OAAO,CAAC6B,OAAO,CAAC,CAACI,KAAK,CAAC,CAAC,CAACC,OAAO,EAAEC,SAAS,CAAC,KAAK;UAC1D;UACA,IAAID,OAAO,KAAK,KAAK,IAAIA,OAAO,KAAK,WAAW,EAAE;YAChD,OAAO,IAAI;UACb;;UAEA;UACA,IAAIF,OAAO,CAACE,OAAO,CAAC,IAAIjC,QAAQ,CAACkC,SAAS,CAAC,IAAIA,SAAS,CAACC,IAAI,CAACJ,OAAO,CAACE,OAAO,CAAC,CAAC,EAAE;YAC/E,OAAO,IAAI;UACb;;UAEA;UACA,OAAO,KAAK;QACd,CAAC,CAAC,EAAE;UAAE;UACJ;UACAL,OAAO,CAACpC,SAAS,CAACG,OAAO,CAACyC,QAAQ,IAAI;YACpC,MAAMC,QAAQ,GAAG,EAAE;YAEnBN,OAAO,CAACvC,SAAS,CAACG,OAAO,CAAC2C,OAAO,IAAI;cACnC;cACA,MAAMC,gBAAgB,GAAGH,QAAQ,CAAC3C,IAAI,IAAI6C,OAAO,CAAC7C,IAAI,IAAI2C,QAAQ,CAAC3C,IAAI,CAAC0C,IAAI,CAACG,OAAO,CAAC7C,IAAI,CAAC;cAC1F,MAAM+C,iBAAiB,GAAGJ,QAAQ,CAAC1C,KAAK,IAAI4C,OAAO,CAAC5C,KAAK,IAAI0C,QAAQ,CAAC1C,KAAK,CAACyC,IAAI,CAACG,OAAO,CAAC5C,KAAK,CAAC;cAC/F,IAAI6C,gBAAgB,KAAK,OAAOH,QAAQ,CAAC1C,KAAK,KAAK,WAAW,IAAI8C,iBAAiB,CAAC,EAAE;gBACpF,IAAI3B,GAAG,EAAE;kBAAE;kBACTwB,QAAQ,CAACI,IAAI,CAACH,OAAO,CAAC,CAAC,CAAC;gBAC1B,CAAC,MAAM;kBAAE;kBACPb,GAAG,CAACC,OAAO,CAACe,IAAI,CAAE,aAAYV,OAAO,CAAC5C,GAAI,KAAImD,OAAO,CAAC7C,IAAK,oBAAmB,CAAC,CAAC,CAAC;gBACnF;cACF;YACF,CAAC,CAAC;;YAEF4C,QAAQ,CAAC1C,OAAO,CAAC+C,EAAE,IAAI/B,MAAM,CAACgC,cAAc,CAACD,EAAE,EAAEX,OAAO,CAAC,CAAC;YAC1D;YACA,IAAIA,OAAO,CAACvC,SAAS,IAAIuC,OAAO,CAACvC,SAAS,CAACoD,MAAM,KAAK,CAAC,EAAE;cAAE;cACzDjC,MAAM,CAACkC,WAAW,CAACd,OAAO,CAAC;YAC7B;UACF,CAAC,CAAC;QACJ;MACF,CAAC,CAAC;IACJ,CAAC,CAAC;;IAEF;IACA,IAAI,CAAClB,GAAG,EAAE;MACR,IAAIY,GAAG,CAACC,OAAO,CAACkB,MAAM,GAAG,CAAC,EAAE;QAAE;QAC5BnB,GAAG,CAACE,KAAK,GAAG,KAAK,CAAC,CAAC;MACrB;;MAEA,OAAOF,GAAG;IACZ;IACA;EACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subfield-exclusion.spec.js","names":["describe","it","config","tag","subfields","code","validator","validatorFactory","expect","to","be","an","that","has","any","keys","description","a","validate","ind2","value","error","with","property","unidentified","recordValid","MarcRecord","leader","fields","ind1","recordInvalid","recordInvalidFixed","result","eql","valid","message","fix","equalsTo","recordOriginal","recordModified","configInd","recordIndInvalid","recordIndInvalidFixed"],"sources":["../src/subfield-exclusion.spec.js"],"sourcesContent":["import {expect} from 'chai';\n//import chaiAsPromised from 'chai-as-promised';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from '../src/subfield-exclusion';\n\n//chai.use(chaiAsPromised);\n\n// Factory validation\ndescribe('subfield-exclusion', () => {\n describe('#validate: Check configuration validation', () => {\n it('Creates a validator from simple config', async () => {\n const config = [\n {\n tag: /^500$/u,\n subfields: [{code: /4/u}]\n }\n ];\n\n const validator = await validatorFactory(config);\n expect(validator)\n .to.be.an('object')\n .that.has.any.keys('description', 'validate');\n\n expect(validator.description).to.be.a('string');\n expect(validator.validate).to.be.a('function');\n });\n\n it('Creates a validator from complex config', async () => {\n const config = [\n {\n tag: /^210$/u,\n ind2: /\\s/u,\n subfields: [\n {\n code: /2/u,\n value: /.+/u\n }\n ]\n }\n ];\n\n const validator = await validatorFactory(config);\n expect(validator)\n .to.be.an('object')\n .that.has.any.keys('description', 'validate');\n\n expect(validator.description).to.be.a('string');\n expect(validator.validate).to.be.a('function');\n });\n\n it('Fails to create a validator from invalid config - subfields missing', () => {\n const config = [\n {\n tag: /^210$/u\n }\n ];\n\n try {\n validatorFactory(config);\n } catch (error) {\n expect(error).to.be.an('error').with.property('message', 'Configuration not valid - missing mandatory element: subfields');\n }\n });\n\n it('Fails to create a validator from invalid config - tag', () => {\n const config = [\n {\n tag: '500',\n subfields: [{code: /9/u, value: /^(?!FENNI<KEEP>).*$/u}]\n }\n ];\n\n try {\n validatorFactory(config);\n } catch (error) {\n expect(error).to.be.an('error').with.property('message', 'Configuration not valid - invalid data type for: tag');\n }\n });\n\n it('Fails to create a validator from invalid config - missing array', () => {\n const config = {\n tag: '500',\n subfields: [{code: /9/u, value: /^(?!FENNI<KEEP>).*$/u}]\n };\n\n try {\n validatorFactory(config);\n } catch (error) {\n expect(error).to.be.an('error').with.property('message', 'Configuration array not provided');\n }\n });\n\n it('Fails to create a validator from invalid config - code', () => {\n const config = [\n {\n tag: /^500$/u,\n subfields: [{code: 9, value: /^(?!FENNI<KEEP>).*$/u}]\n }\n ];\n\n try {\n validatorFactory(config);\n } catch (error) {\n expect(error).to.be.an('error').with.property('message', 'Configuration not valid - invalid data type for: code');\n }\n });\n\n it('Fails to create a validator from invalid config - value', () => {\n const config = [\n {\n tag: /^500$/u,\n subfields: [{code: /9/u, value: 'Fenni'}]\n }\n ];\n\n try {\n validatorFactory(config);\n } catch (error) {\n expect(error).to.be.an('error').with.property('message', 'Configuration not valid - invalid data type for: value');\n }\n });\n\n\n it('Fails to create a validator from invalid config - missing mandatory: tag', () => {\n const config = [\n {\n value: /^500$/u,\n subfields: [{code: /9/u, value: /^(?!FENNI<KEEP>).*$/u}]\n }\n ];\n\n try {\n validatorFactory(config);\n } catch (error) {\n expect(error).to.be.an('error').with.property('message', 'Configuration not valid - missing mandatory element: tag');\n }\n });\n\n it('Fails to create a validator from invalid config - subfield not object: array', () => {\n const config = [\n {\n tag: /^500$/u,\n subfields: [\n ['/9/', '/^(?!FENNI<KEEP>).*$/'],\n {value: /^(?!FENNI<KEEP>).*$/u}\n ]\n }\n ];\n\n try {\n validatorFactory(config);\n } catch (error) {\n expect(error).to.be.an('error').with.property('message', 'Configuration not valid - subfield: /9/,/^(?!FENNI<KEEP>).*$/ not object');\n }\n });\n\n it('Fails to create a validator from invalid config - subfield not object: string', () => {\n const config = [\n {\n tag: /^500$/u,\n subfields: [\n '/9/',\n '/^(?!FENNI<KEEP>).*$/',\n {value: /^(?!FENNI<KEEP>).*$/u}\n ]\n }\n ];\n\n try {\n validatorFactory(config);\n } catch (error) {\n expect(error).to.be.an('error').with.property('message', 'Configuration not valid - subfield: /9/ not object');\n }\n });\n\n it('Fails to create a validator from invalid config - missing mandatory: subfield.code', () => {\n const config = [\n {\n tag: /^500$/u,\n subfields: [\n {code: /9/u, value: /^(?!FENNI<KEEP>).*$/u},\n {value: /^(?!FENNI<KEEP>).*$/u}\n ]\n }\n ];\n\n try {\n validatorFactory(config);\n } catch (error) {\n expect(error).to.be.an('error').with.property('message', 'Configuration not valid - missing mandatory element: code');\n }\n });\n\n it('Fails to create a validator from invalid config - unidentified field: unidentified', () => {\n const config = [\n {\n tag: /^500$/u,\n unidentified: /^500$/u,\n subfields: [\n {code: /9/u, value: /^(?!FENNI<KEEP>).*$/u},\n {value: /^(?!FENNI<KEEP>).*$/u}\n ]\n }\n ];\n\n try {\n validatorFactory(config);\n } catch (error) {\n expect(error).to.be.an('error').with.property('message', 'Configuration not valid - unidentified value: unidentified');\n }\n });\n });\n\n // Simple configuration https://github.com/NatLibFi/marc-record-validators-melinda/issues/46\n describe('#validate: Simple configuration (spec)', () => {\n const config = [\n {\n tag: /^100$/u,\n subfields: [{code: /4/u}]\n }\n ];\n\n const recordValid = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '100',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Foo Bar'}]\n }, {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Fubar'}]\n }\n ]\n });\n\n const recordInvalid = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '100',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {code: 'a', value: 'Foo Bar'},\n {code: '4', value: 'att'}\n ]\n }, {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Fubar'}]\n }\n ]\n });\n\n const recordInvalidFixed = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '100',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Foo Bar'}]\n }, {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Fubar'}]\n }\n ]\n });\n\n it('Finds the record valid (spec)', async () => {\n const validator = await validatorFactory(config);\n const result = await validator.validate(recordValid);\n expect(result).to.eql({valid: true, message: []});\n });\n\n it('Finds the record invalid (spec)', async () => {\n const validator = await validatorFactory(config);\n const result = await validator.validate(recordInvalid);\n expect(result).to.eql({valid: false, message: ['Subfield $100$$4should be excluded']});\n });\n\n it('Repairs invalid record', async () => {\n const validator = await validatorFactory(config);\n await validator.fix(recordInvalid);\n expect(recordInvalid.equalsTo(recordInvalidFixed)).to.eql(true);\n });\n });\n\n\n describe('#validate: Remove only subfield -> remove field as well', () => {\n const config = [\n {\n tag: /^041$/u,\n subfields: [{code: /^[ad]$/u, value: /^zxx$/u}]\n }\n ];\n\n const recordOriginal = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '041',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'zxx'}]\n }, {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Fubar'}]\n }\n ]\n });\n\n const recordModified = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Fubar'}]\n }\n ]\n });\n\n it('Finds the record with 041$a zxx invalid (spec)', async () => {\n const validator = await validatorFactory(config);\n const result = await validator.validate(recordOriginal);\n expect(result).to.eql({valid: false, message: ['Subfield $041$$ashould be excluded']});\n });\n\n it('Repairs invalid record', async () => {\n const validator = await validatorFactory(config);\n await validator.fix(recordOriginal);\n expect(recordOriginal.equalsTo(recordModified)).to.eql(true);\n });\n });\n\n // Complex configuration https://github.com/NatLibFi/marc-record-validators-melinda/issues/46\n describe('#validate: Complex configuration (spec)', () => {\n const config = [\n {\n tag: /^210$/u,\n ind2: /\\s/u,\n subfields: [{code: /2/u, value: /.+/u}]\n }\n ];\n\n const recordValid = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '210',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Foo'}]\n }, {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Fubar'}]\n }\n ]\n });\n\n const recordInvalid = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '210',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {code: 'a', value: 'Foo'},\n {code: '2', value: 'dnlm'}\n ]\n }, {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Fubar'}]\n }\n ]\n });\n\n const recordInvalidFixed = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '210',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Foo'}]\n }, {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Fubar'}]\n }\n ]\n });\n\n it('Finds the record valid (spec)', async () => {\n const validator = await validatorFactory(config);\n const result = await validator.validate(recordValid);\n expect(result).to.eql({valid: true, message: []});\n });\n\n it('Finds the record invalid (spec)', async () => {\n const validator = await validatorFactory(config);\n const result = await validator.validate(recordInvalid);\n expect(result).to.eql({valid: false, message: ['Subfield $210$$2should be excluded']});\n });\n\n it('Repairs invalid record', async () => {\n const validator = await validatorFactory(config);\n await validator.fix(recordInvalid);\n expect(recordInvalid.equalsTo(recordInvalidFixed)).to.eql(true);\n });\n });\n\n // More special cases to increase coverage\n describe('#validate: Custom configuration', () => {\n const configInd = [\n {\n tag: /^500$/u,\n ind1: /^8$/u,\n ind2: /^4$/u,\n subfields: [{code: /2/u, value: /.+/u}]\n }\n ];\n\n const recordValid = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '210',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Foo'}]\n }, {\n tag: '500',\n subfields: [\n {code: 'a', value: 'Foo'},\n {code: '2', value: 'dnlm'}\n ]\n }\n ]\n });\n\n const recordIndInvalid = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Fubar'}]\n }, {\n tag: '500',\n ind1: '8',\n ind2: '4',\n subfields: [\n {code: 'a', value: 'Foo'},\n {code: '2', value: 'dnlm'}\n ]\n }\n ]\n });\n\n const recordIndInvalidFixed = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Fubar'}]\n }, {\n tag: '500',\n ind1: '8',\n ind2: '4',\n subfields: [{code: 'a', value: 'Foo'}]\n }\n ]\n });\n\n it('Finds the record valid - Ind1&Ind2', async () => {\n const validator = await validatorFactory(configInd);\n const result = await validator.validate(recordValid);\n expect(result).to.eql({valid: true, message: []});\n });\n\n it('Finds the record invalid - Ind', async () => {\n const validator = await validatorFactory(configInd);\n const result = await validator.validate(recordIndInvalid);\n expect(result).to.eql({valid: false, message: ['Subfield $500$$2should be excluded']});\n });\n\n it('Repairs invalid record', async () => {\n const validator = await validatorFactory(configInd);\n await validator.fix(recordIndInvalid);\n expect(recordIndInvalid.equalsTo(recordIndInvalidFixed)).to.eql(true);\n });\n });\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"subfield-exclusion.spec.js","names":["_chai","require","_marcRecord","_subfieldExclusion","_interopRequireDefault","obj","__esModule","default","describe","it","config","tag","subfields","code","validator","validatorFactory","expect","to","be","an","that","has","any","keys","description","a","validate","ind2","value","error","with","property","unidentified","recordValid","MarcRecord","leader","fields","ind1","recordInvalid","recordInvalidFixed","result","eql","valid","message","fix","equalsTo","recordOriginal","recordModified","configInd","recordIndInvalid","recordIndInvalidFixed"],"sources":["../src/subfield-exclusion.spec.js"],"sourcesContent":["import {expect} from 'chai';\n//import chaiAsPromised from 'chai-as-promised';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from '../src/subfield-exclusion';\n\n//chai.use(chaiAsPromised);\n\n// Factory validation\ndescribe('subfield-exclusion', () => {\n describe('#validate: Check configuration validation', () => {\n it('Creates a validator from simple config', async () => {\n const config = [\n {\n tag: /^500$/u,\n subfields: [{code: /4/u}]\n }\n ];\n\n const validator = await validatorFactory(config);\n expect(validator)\n .to.be.an('object')\n .that.has.any.keys('description', 'validate');\n\n expect(validator.description).to.be.a('string');\n expect(validator.validate).to.be.a('function');\n });\n\n it('Creates a validator from complex config', async () => {\n const config = [\n {\n tag: /^210$/u,\n ind2: /\\s/u,\n subfields: [\n {\n code: /2/u,\n value: /.+/u\n }\n ]\n }\n ];\n\n const validator = await validatorFactory(config);\n expect(validator)\n .to.be.an('object')\n .that.has.any.keys('description', 'validate');\n\n expect(validator.description).to.be.a('string');\n expect(validator.validate).to.be.a('function');\n });\n\n it('Fails to create a validator from invalid config - subfields missing', () => {\n const config = [\n {\n tag: /^210$/u\n }\n ];\n\n try {\n validatorFactory(config);\n } catch (error) {\n expect(error).to.be.an('error').with.property('message', 'Configuration not valid - missing mandatory element: subfields');\n }\n });\n\n it('Fails to create a validator from invalid config - tag', () => {\n const config = [\n {\n tag: '500',\n subfields: [{code: /9/u, value: /^(?!FENNI<KEEP>).*$/u}]\n }\n ];\n\n try {\n validatorFactory(config);\n } catch (error) {\n expect(error).to.be.an('error').with.property('message', 'Configuration not valid - invalid data type for: tag');\n }\n });\n\n it('Fails to create a validator from invalid config - missing array', () => {\n const config = {\n tag: '500',\n subfields: [{code: /9/u, value: /^(?!FENNI<KEEP>).*$/u}]\n };\n\n try {\n validatorFactory(config);\n } catch (error) {\n expect(error).to.be.an('error').with.property('message', 'Configuration array not provided');\n }\n });\n\n it('Fails to create a validator from invalid config - code', () => {\n const config = [\n {\n tag: /^500$/u,\n subfields: [{code: 9, value: /^(?!FENNI<KEEP>).*$/u}]\n }\n ];\n\n try {\n validatorFactory(config);\n } catch (error) {\n expect(error).to.be.an('error').with.property('message', 'Configuration not valid - invalid data type for: code');\n }\n });\n\n it('Fails to create a validator from invalid config - value', () => {\n const config = [\n {\n tag: /^500$/u,\n subfields: [{code: /9/u, value: 'Fenni'}]\n }\n ];\n\n try {\n validatorFactory(config);\n } catch (error) {\n expect(error).to.be.an('error').with.property('message', 'Configuration not valid - invalid data type for: value');\n }\n });\n\n\n it('Fails to create a validator from invalid config - missing mandatory: tag', () => {\n const config = [\n {\n value: /^500$/u,\n subfields: [{code: /9/u, value: /^(?!FENNI<KEEP>).*$/u}]\n }\n ];\n\n try {\n validatorFactory(config);\n } catch (error) {\n expect(error).to.be.an('error').with.property('message', 'Configuration not valid - missing mandatory element: tag');\n }\n });\n\n it('Fails to create a validator from invalid config - subfield not object: array', () => {\n const config = [\n {\n tag: /^500$/u,\n subfields: [\n ['/9/', '/^(?!FENNI<KEEP>).*$/'],\n {value: /^(?!FENNI<KEEP>).*$/u}\n ]\n }\n ];\n\n try {\n validatorFactory(config);\n } catch (error) {\n expect(error).to.be.an('error').with.property('message', 'Configuration not valid - subfield: /9/,/^(?!FENNI<KEEP>).*$/ not object');\n }\n });\n\n it('Fails to create a validator from invalid config - subfield not object: string', () => {\n const config = [\n {\n tag: /^500$/u,\n subfields: [\n '/9/',\n '/^(?!FENNI<KEEP>).*$/',\n {value: /^(?!FENNI<KEEP>).*$/u}\n ]\n }\n ];\n\n try {\n validatorFactory(config);\n } catch (error) {\n expect(error).to.be.an('error').with.property('message', 'Configuration not valid - subfield: /9/ not object');\n }\n });\n\n it('Fails to create a validator from invalid config - missing mandatory: subfield.code', () => {\n const config = [\n {\n tag: /^500$/u,\n subfields: [\n {code: /9/u, value: /^(?!FENNI<KEEP>).*$/u},\n {value: /^(?!FENNI<KEEP>).*$/u}\n ]\n }\n ];\n\n try {\n validatorFactory(config);\n } catch (error) {\n expect(error).to.be.an('error').with.property('message', 'Configuration not valid - missing mandatory element: code');\n }\n });\n\n it('Fails to create a validator from invalid config - unidentified field: unidentified', () => {\n const config = [\n {\n tag: /^500$/u,\n unidentified: /^500$/u,\n subfields: [\n {code: /9/u, value: /^(?!FENNI<KEEP>).*$/u},\n {value: /^(?!FENNI<KEEP>).*$/u}\n ]\n }\n ];\n\n try {\n validatorFactory(config);\n } catch (error) {\n expect(error).to.be.an('error').with.property('message', 'Configuration not valid - unidentified value: unidentified');\n }\n });\n });\n\n // Simple configuration https://github.com/NatLibFi/marc-record-validators-melinda/issues/46\n describe('#validate: Simple configuration (spec)', () => {\n const config = [\n {\n tag: /^100$/u,\n subfields: [{code: /4/u}]\n }\n ];\n\n const recordValid = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '100',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Foo Bar'}]\n }, {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Fubar'}]\n }\n ]\n });\n\n const recordInvalid = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '100',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {code: 'a', value: 'Foo Bar'},\n {code: '4', value: 'att'}\n ]\n }, {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Fubar'}]\n }\n ]\n });\n\n const recordInvalidFixed = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '100',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Foo Bar'}]\n }, {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Fubar'}]\n }\n ]\n });\n\n it('Finds the record valid (spec)', async () => {\n const validator = await validatorFactory(config);\n const result = await validator.validate(recordValid);\n expect(result).to.eql({valid: true, message: []});\n });\n\n it('Finds the record invalid (spec)', async () => {\n const validator = await validatorFactory(config);\n const result = await validator.validate(recordInvalid);\n expect(result).to.eql({valid: false, message: ['Subfield $100$$4should be excluded']});\n });\n\n it('Repairs invalid record', async () => {\n const validator = await validatorFactory(config);\n await validator.fix(recordInvalid);\n expect(recordInvalid.equalsTo(recordInvalidFixed)).to.eql(true);\n });\n });\n\n\n describe('#validate: Remove only subfield -> remove field as well', () => {\n const config = [\n {\n tag: /^041$/u,\n subfields: [{code: /^[ad]$/u, value: /^zxx$/u}]\n }\n ];\n\n const recordOriginal = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '041',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'zxx'}]\n }, {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Fubar'}]\n }\n ]\n });\n\n const recordModified = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Fubar'}]\n }\n ]\n });\n\n it('Finds the record with 041$a zxx invalid (spec)', async () => {\n const validator = await validatorFactory(config);\n const result = await validator.validate(recordOriginal);\n expect(result).to.eql({valid: false, message: ['Subfield $041$$ashould be excluded']});\n });\n\n it('Repairs invalid record', async () => {\n const validator = await validatorFactory(config);\n await validator.fix(recordOriginal);\n expect(recordOriginal.equalsTo(recordModified)).to.eql(true);\n });\n });\n\n // Complex configuration https://github.com/NatLibFi/marc-record-validators-melinda/issues/46\n describe('#validate: Complex configuration (spec)', () => {\n const config = [\n {\n tag: /^210$/u,\n ind2: /\\s/u,\n subfields: [{code: /2/u, value: /.+/u}]\n }\n ];\n\n const recordValid = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '210',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Foo'}]\n }, {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Fubar'}]\n }\n ]\n });\n\n const recordInvalid = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '210',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {code: 'a', value: 'Foo'},\n {code: '2', value: 'dnlm'}\n ]\n }, {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Fubar'}]\n }\n ]\n });\n\n const recordInvalidFixed = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '210',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Foo'}]\n }, {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Fubar'}]\n }\n ]\n });\n\n it('Finds the record valid (spec)', async () => {\n const validator = await validatorFactory(config);\n const result = await validator.validate(recordValid);\n expect(result).to.eql({valid: true, message: []});\n });\n\n it('Finds the record invalid (spec)', async () => {\n const validator = await validatorFactory(config);\n const result = await validator.validate(recordInvalid);\n expect(result).to.eql({valid: false, message: ['Subfield $210$$2should be excluded']});\n });\n\n it('Repairs invalid record', async () => {\n const validator = await validatorFactory(config);\n await validator.fix(recordInvalid);\n expect(recordInvalid.equalsTo(recordInvalidFixed)).to.eql(true);\n });\n });\n\n // More special cases to increase coverage\n describe('#validate: Custom configuration', () => {\n const configInd = [\n {\n tag: /^500$/u,\n ind1: /^8$/u,\n ind2: /^4$/u,\n subfields: [{code: /2/u, value: /.+/u}]\n }\n ];\n\n const recordValid = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '210',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Foo'}]\n }, {\n tag: '500',\n subfields: [\n {code: 'a', value: 'Foo'},\n {code: '2', value: 'dnlm'}\n ]\n }\n ]\n });\n\n const recordIndInvalid = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Fubar'}]\n }, {\n tag: '500',\n ind1: '8',\n ind2: '4',\n subfields: [\n {code: 'a', value: 'Foo'},\n {code: '2', value: 'dnlm'}\n ]\n }\n ]\n });\n\n const recordIndInvalidFixed = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Fubar'}]\n }, {\n tag: '500',\n ind1: '8',\n ind2: '4',\n subfields: [{code: 'a', value: 'Foo'}]\n }\n ]\n });\n\n it('Finds the record valid - Ind1&Ind2', async () => {\n const validator = await validatorFactory(configInd);\n const result = await validator.validate(recordValid);\n expect(result).to.eql({valid: true, message: []});\n });\n\n it('Finds the record invalid - Ind', async () => {\n const validator = await validatorFactory(configInd);\n const result = await validator.validate(recordIndInvalid);\n expect(result).to.eql({valid: false, message: ['Subfield $500$$2should be excluded']});\n });\n\n it('Repairs invalid record', async () => {\n const validator = await validatorFactory(configInd);\n await validator.fix(recordIndInvalid);\n expect(recordIndInvalid.equalsTo(recordIndInvalidFixed)).to.eql(true);\n });\n });\n});\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subfield6Utils.js","names":["sf6Regexp","isValidSubfield6","subfield","code","value","match","subfield6GetTag","substring","undefined","subfield6GetOccurrenceNumber","replace","subfield6GetOccurrenceNumberAsInteger","index","result","parseInt","resetSubfield6OccurrenceNumber","occurrenceNumber","occurrenceNumberAsString","intToOccurrenceNumberString","newValue","subfield6GetTail","fieldGetUnambiguousTag","field","tags","subfields","filter","sf","length","nvdebug","subfieldToString","fieldGetUnambiguousOccurrenceNumber","occurrenceNumbers","fieldHasOccurrenceNumber","some","resetFieldOccurrenceNumber","newOccurrenceNumber","oldOccurrenceNumber","forEach","innerReset","currOccurrenceNumber","i","fieldGetMaxSubfield6OccurrenceNumberAsInteger","sf6s","vals","map","Math","max","recordGetMaxSubfield6OccurrenceNumberAsInteger","record","fields","hasWantedTagAndOccurrenceNumber","tagAndOccurrenceNumber","key","fieldHasWantedTagAndOccurrenceNumber","fieldHasValidSubfield6","isSubfield6Pair","otherField","tagsArePairable6","tag","fieldIndex","otherFieldIndex","tag1","tag2","fieldGetOccurrenceNumberPairs","candFields","pairs","fieldToString","pairedField","is7XX","includes","subfieldToNormalizedString","targetLinkingNumber","isValidSubfield8","currLinkingNumber","getSubfield8LinkingNumber","normVal","fieldToNormalizedString","ind1","ind2","formatAndNormalizeSubfields","join","fieldsToNormalizedString","strings","sort"],"sources":["../src/subfield6Utils.js"],"sourcesContent":["// import createDebugLogger from 'debug';\n// const debug = createDebugLogger('@natlibfi/marc-record-validator-melinda/subfield6Utils');\n\nimport {getSubfield8LinkingNumber, isValidSubfield8} from './subfield8Utils';\nimport {fieldToString, nvdebug, subfieldToString} from './utils';\n\n// NB! Subfield 6 is non-repeatable and it should always comes first!\n// NB! Index size should always be 2 (preceding 0 required for 01..09) However, support for 100+ was added on 2023-02-27.\n// NB! Index value '00' are left as they are (is not paired/indexed/whatever.\nconst sf6Regexp = /^[0-9][0-9][0-9]-(?:[0-9][0-9]|[1-9][0-9]+)(?:[^0-9].*)?$/u;\n\nexport function isValidSubfield6(subfield) {\n if (subfield.code !== '6') {\n return false;\n }\n return subfield.value.match(sf6Regexp);\n}\n\nfunction subfield6GetTag(subfield) {\n if (isValidSubfield6(subfield)) {\n return subfield.value.substring(0, 3);\n }\n return undefined;\n}\n\nexport function subfield6GetOccurrenceNumber(subfield) {\n if (isValidSubfield6(subfield)) {\n // Skip \"TAG-\" prefix. 2023-02-20: removed 2-digit requirement from here...\n return subfield.value.substring(4).replace(/\\D.*$/u, '');\n }\n return undefined;\n}\n\nexport function subfield6GetOccurrenceNumberAsInteger(subfield) {\n const index = subfield6GetOccurrenceNumber(subfield);\n if (index === undefined || index === '00') {\n return 0;\n }\n const result = parseInt(index, 10);\n //nvdebug(`SF6: ${subfield.value} => ${index} => ${result}`, debug);\n return result;\n}\n\nexport function resetSubfield6OccurrenceNumber(subfield, occurrenceNumber) {\n if (!isValidSubfield6(subfield)) {\n return;\n }\n const occurrenceNumberAsString = typeof occurrenceNumber === 'number' ? intToOccurrenceNumberString(occurrenceNumber) : occurrenceNumber;\n\n const newValue = subfield.value.substring(0, 4) + occurrenceNumberAsString + subfield6GetTail(subfield); // eslint-disable-line functional/immutable-data\n //nvdebug(`Set subfield $6 value from ${subfieldToString(subfield)} to ${newValue}`);\n subfield.value = newValue; // eslint-disable-line functional/immutable-data\n}\n\n\nfunction subfield6GetTail(subfield) {\n if (isValidSubfield6(subfield)) {\n // Skip \"TAG-\" prefix. 2023-02-20: removed 2-digit requirement from here...\n return subfield.value.replace(/^\\d+-\\d+/u, '');\n }\n return '';\n}\n\n// <= SUBFIELD, FIELD =>\n\n/*\nexport function fieldHasValidSubfield6AndIsNotAnAlternateGraphicRepresentation(field) {\n // AlternateGraphicRepresentation is same as \"field.tag === '880'\"\"\n if (!field.subfields || field.tag === '880') {\n return false;\n }\n const sf6s = field.subfields.filter(sf => sf.code === '6' && sf.value.match(sf6Regexp));\n return sf6s.length === 1;\n}\n*/\n\nexport function fieldGetUnambiguousTag(field) {\n const tags = field.subfields.filter(sf => subfield6GetTag(sf));\n if (tags.length === 1) {\n nvdebug(` GOT ${tags.length} tag(s): ${subfieldToString(tags[0])}`);\n return subfield6GetTag(tags[0]);\n }\n return undefined;\n}\n\nexport function fieldGetUnambiguousOccurrenceNumber(field) {\n const occurrenceNumbers = field.subfields.filter(sf => subfield6GetOccurrenceNumber(sf));\n if (occurrenceNumbers.length === 1) {\n return subfield6GetOccurrenceNumber(occurrenceNumbers[0]);\n }\n return undefined;\n}\n\nexport function fieldHasOccurrenceNumber(field, occurrenceNumber) {\n //nvdebug(`${occurrenceNumber} vs ${fieldToString(field)}`);\n return field.subfields && field.subfields.some(sf => subfield6GetOccurrenceNumber(sf) === occurrenceNumber);\n}\n\nexport function resetFieldOccurrenceNumber(field, newOccurrenceNumber, oldOccurrenceNumber = undefined) {\n field.subfields.forEach(subfield => innerReset(subfield));\n\n function innerReset(subfield) {\n // (Optional) Check that this is really the occurrence number we wan't to reseot\n if (oldOccurrenceNumber !== undefined) {\n const currOccurrenceNumber = subfield6GetOccurrenceNumber(subfield);\n if (currOccurrenceNumber !== oldOccurrenceNumber) {\n return;\n }\n }\n resetSubfield6OccurrenceNumber(subfield, newOccurrenceNumber);\n }\n}\n\nexport function intToOccurrenceNumberString(i) {\n return i < 10 ? `0${i}` : `${i}`;\n}\n\nfunction fieldGetMaxSubfield6OccurrenceNumberAsInteger(field) {\n //nvdebug(`Checking subfields $6 from ${JSON.stringify(field)}`);\n const sf6s = field.subfields ? field.subfields.filter(subfield => isValidSubfield6(subfield)) : [];\n if (sf6s.length === 0) {\n return 0;\n }\n // There should always be one, but here we check every subfield.\n //nvdebug(`Got ${field.subfields} $6-subfield(s) from ${JSON.stringify(field)}`, debug);\n const vals = sf6s.map(sf => subfield6GetOccurrenceNumberAsInteger(sf));\n return Math.max(...vals);\n}\n\n\nexport function recordGetMaxSubfield6OccurrenceNumberAsInteger(record) {\n // Should we cache the value here?\n const vals = record.fields.map((field) => fieldGetMaxSubfield6OccurrenceNumberAsInteger(field));\n return Math.max(...vals);\n}\n\nexport function hasWantedTagAndOccurrenceNumber(subfield, tagAndOccurrenceNumber) {\n if (subfield.code !== '6') {\n return false;\n }\n // We could also use generic code and go getTag()+'-'+getIndex() instead of regexp...\n const key = subfield.value.replace(/^([0-9][0-9][0-9]-[0-9][0-9]+).*$/u, '$1'); // eslint-disable-line prefer-named-capture-group\n nvdebug(` Compare '${key}' vs '${tagAndOccurrenceNumber}'`);\n return key === tagAndOccurrenceNumber;\n}\n\n\nexport function fieldHasWantedTagAndOccurrenceNumber(field, tagAndOccurrenceNumber) {\n return field.subfields && field.subfields.some(sf => hasWantedTagAndOccurrenceNumber(sf, tagAndOccurrenceNumber));\n}\n\n\n/*\nexport function getFieldsWithGivenOccurrenceNumberSubfield6(record, occurrenceNumberAsString) {\n const record.fields.filter(field => field\n\n function fieldHasIndex(field, index) {\n if (!field.subfields) {\n return false;\n }\n return field.subfields.find(sf => isValidSubfield6(sf) && subfieldGetOccurrenceNumber6(sf) === index);\n }\n}\n*/\n\n\nfunction fieldHasValidSubfield6(field) {\n return field.subfields && field.subfields.some(sf => isValidSubfield6(sf));\n}\n\n\n/*\n\nexport function subfieldGetOccurrenceNumber6(subfield) {\n if (isValidSubfield6(subfield)) {\n // Skip \"TAG-\" prefix. 2023-02-20: removed 2-digit requirement from here...\n return subfield.value.substring(4).replace(/\\D.*$/u, '');\n }\n return undefined;\n}\n\nfunction subfieldGetTag6(subfield) {\n if (isValidSubfield6(subfield)) {\n return subfield.value.substring(0, 3);\n }\n return undefined;\n}\n\n\nexport function resetSubfield6Tag(subfield, tag) {\n if (!isValidSubfield6(subfield)) {\n return;\n }\n // NB! mainly for 1XX<->7XX transfers\n const newValue = `${tag}-${subfield.value.substring(4)}`;\n nvdebug(`Set subfield $6 value from ${subfieldToString(subfield)} to ${newValue}`);\n subfield.value = newValue; // eslint-disable-line functional/immutable-data\n}\n\n\n*/\n\n\n/*\nexport function fieldGetOccurrenceNumber6(field) {\n if (!field.subfields) {\n return undefined;\n }\n // Subfield $6 should always be the 1st subfield... (not implemented)\n // There should be only one $6, so find is ok.\n const sf6 = field.subfields.find(subfield => isValidSubfield6(subfield));\n if (sf6 === undefined) {\n return undefined;\n }\n return subfieldGetOccurrenceNumber6(sf6);\n}\n\nfunction fieldGetTag6(field) {\n if (!field.subfields) {\n return undefined;\n }\n // Subfield $6 should always be the 1st subfield... (not implemented)\n // There should be only one $6, so find is ok.\n const sf6 = field.subfields.find(subfield => isValidSubfield6(subfield));\n if (sf6 === undefined) {\n return undefined;\n }\n return subfieldGetTag6(sf6);\n}\n\n*/\n\nfunction isSubfield6Pair(field, otherField) {\n // No need to log this:\n //nvdebug(`LOOK for $6-pair:\\n ${fieldToString(field)}\\n ${fieldToString(otherField)}`);\n if (!fieldHasValidSubfield6(field) || !fieldHasValidSubfield6(otherField)) {\n return false;\n }\n\n if (!tagsArePairable6(field.tag, otherField.tag)) {\n //nvdebug(` FAILED. REASON: TAGS NOT PAIRABLE!`);\n return false;\n }\n\n\n const fieldIndex = fieldGetUnambiguousOccurrenceNumber(field);\n if (fieldIndex === undefined || fieldIndex === '00') {\n //nvdebug(` FAILED. REASON: NO INDEX FOUND`);\n return false;\n }\n\n const otherFieldIndex = fieldGetUnambiguousOccurrenceNumber(otherField);\n\n\n if (fieldIndex !== otherFieldIndex) {\n //nvdebug(` FAILURE: INDEXES: ${fieldIndex} vs ${otherFieldIndex}`);\n return false;\n }\n\n if (fieldGetUnambiguousTag(field) !== otherField.tag || field.tag !== fieldGetUnambiguousTag(otherField)) {\n //nvdebug(` FAILURE: TAG vs $6 TAG`);\n return false;\n }\n return true;\n\n function tagsArePairable6(tag1, tag2) {\n // How to do XOR operation in one line? Well, this is probably more readable...\n if (tag1 === '880' && tag2 === '880') {\n return false;\n }\n if (tag1 !== '880' && tag2 !== '880') {\n return false;\n }\n return true;\n }\n}\n\nexport function fieldGetOccurrenceNumberPairs(field, candFields) {\n // NB! TAG!=880 returns 880 fields, TAG==880 returns non-880 field\n //nvdebug(` Trying to finds pair for ${fieldToString(field)} in ${candFields.length} fields`);\n const pairs = candFields.filter(otherField => isSubfield6Pair(field, otherField));\n if (pairs.length === 0) {\n nvdebug(`NO PAIRS FOUND FOR '${fieldToString(field)}'`);\n return pairs;\n }\n nvdebug(`${pairs.length} PAIR(S) FOUND FOR '${fieldToString(field)}'`);\n pairs.forEach(pairedField => nvdebug(` '${fieldToString(pairedField)}'`));\n return pairs;\n}\n\n/*\nexport function fieldGetSubfield6Pair(field, record) {\n const pairedFields = record.fields.filter(otherField => isSubfield6Pair(field, otherField));\n if (pairedFields.length !== 1) {\n return undefined;\n }\n // NB! It is theoretically possible to have multiple pairable 880 fields (one for each encoding)\n nvdebug(`fieldGetSubfield6Pair(): ${fieldToString(field)} => ${fieldToString(pairedFields[0])}`);\n return pairedFields[0];\n}\n*/\n\n/*\nexport function pairAndStringify6(field, record) {\n const pair6 = fieldGetSubfield6Pair(field, record);\n if (!pair6) {\n return fieldToNormalizedString(field);\n }\n return fieldsToNormalizedString([field, pair6]);\n}\n*/\n\nexport function is7XX(tag) {\n return ['700', '710', '711', '730'].includes(tag);\n}\n\nexport function subfieldToNormalizedString(sf, targetLinkingNumber = 0) {\n if (isValidSubfield6(sf) && targetLinkingNumber === 0) {\n const tag = sf.value.substring(0, 3);\n // 100/700 normalization:\n const tag2 = tag.match(/^[17](?:00|10|11|30)$/u) ? `X${tag.substring(1)}` : tag;\n\n // If we are normalizing $8 stuff, don't normalize $6 occurrence number!\n // Replace $6 occurrence number with XX:\n return ` ‡${sf.code} ${tag2}-XX${subfield6GetTail(sf)}`;\n }\n\n if (isValidSubfield8(sf)) {\n const currLinkingNumber = getSubfield8LinkingNumber(sf); //getSubfield8Index(sf);\n if (targetLinkingNumber > 0 && currLinkingNumber === targetLinkingNumber) {\n // For $8 we should only XX the index we are looking at...\n const normVal = sf.value.replace(/^[0-9]+/u, 'XX');\n return ` ‡${sf.code} ${normVal}`;\n }\n return ''; // Other $8 subfields are meaningless in this context\n }\n return ` ${subfieldToString(sf)}`; // `‡${sf.code} ${sf.value}`;\n}\n\nexport function fieldToNormalizedString(field, targetLinkingNumber = 0) {\n if ('subfields' in field) {\n return `${field.tag} ${field.ind1}${field.ind2}${formatAndNormalizeSubfields(field)}`;\n }\n return `${field.tag} ${field.value}`;\n\n function formatAndNormalizeSubfields(field) {\n return field.subfields.map(sf => subfieldToNormalizedString(sf, targetLinkingNumber)).join('');\n }\n\n}\n\nexport function fieldsToNormalizedString(fields, index = 0) {\n const strings = fields.map(field => fieldToNormalizedString(field, index));\n strings.sort(); // eslint-disable-line functional/immutable-data\n return strings.join('\\t__SEPARATOR__\\t');\n}\n\n/*\n\nexport function removeField6IfNeeded(field, record, fieldsAsString) {\n const pairField = fieldGetSubfield6Pair(field, record);\n const asString = pairField ? fieldsToNormalizedString([field, pairField]) : fieldToNormalizedString(field);\n nvdebug(`SOURCE: ${asString} -- REALITY: ${fieldToString(field)}`);\n const tmp = pairField ? fieldToString(pairField) : 'HUTI';\n nvdebug(`PAIR: ${tmp}`);\n nvdebug(`BASE:\\n ${fieldsAsString.join('\\n ')}`);\n if (!fieldsAsString.includes(asString)) {\n return;\n }\n nvdebug(`Duplicate $6 removal: ${fieldToString(field)}`);\n record.removeField(field);\n\n if (pairField === undefined) {\n return;\n }\n nvdebug(`Duplicate $6 removal (pair): ${fieldToString(pairField)}`);\n record.removeField(pairField);\n}\n*/\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"subfield6Utils.js","names":["_subfield8Utils","require","_utils","sf6Regexp","isValidSubfield6","subfield","code","value","match","subfield6GetTag","substring","undefined","subfield6GetOccurrenceNumber","replace","subfield6GetOccurrenceNumberAsInteger","index","result","parseInt","resetSubfield6OccurrenceNumber","occurrenceNumber","occurrenceNumberAsString","intToOccurrenceNumberString","newValue","subfield6GetTail","fieldGetUnambiguousTag","field","tags","subfields","filter","sf","length","nvdebug","subfieldToString","fieldGetUnambiguousOccurrenceNumber","occurrenceNumbers","fieldHasOccurrenceNumber","some","resetFieldOccurrenceNumber","newOccurrenceNumber","oldOccurrenceNumber","forEach","innerReset","currOccurrenceNumber","i","fieldGetMaxSubfield6OccurrenceNumberAsInteger","sf6s","vals","map","Math","max","recordGetMaxSubfield6OccurrenceNumberAsInteger","record","fields","hasWantedTagAndOccurrenceNumber","tagAndOccurrenceNumber","key","fieldHasWantedTagAndOccurrenceNumber","fieldHasValidSubfield6","isSubfield6Pair","otherField","tagsArePairable6","tag","fieldIndex","otherFieldIndex","tag1","tag2","fieldGetOccurrenceNumberPairs","candFields","pairs","fieldToString","pairedField","is7XX","includes","subfieldToNormalizedString","targetLinkingNumber","isValidSubfield8","currLinkingNumber","getSubfield8LinkingNumber","normVal","fieldToNormalizedString","ind1","ind2","formatAndNormalizeSubfields","join","fieldsToNormalizedString","strings","sort"],"sources":["../src/subfield6Utils.js"],"sourcesContent":["// import createDebugLogger from 'debug';\n// const debug = createDebugLogger('@natlibfi/marc-record-validator-melinda/subfield6Utils');\n\nimport {getSubfield8LinkingNumber, isValidSubfield8} from './subfield8Utils';\nimport {fieldToString, nvdebug, subfieldToString} from './utils';\n\n// NB! Subfield 6 is non-repeatable and it should always comes first!\n// NB! Index size should always be 2 (preceding 0 required for 01..09) However, support for 100+ was added on 2023-02-27.\n// NB! Index value '00' are left as they are (is not paired/indexed/whatever.\nconst sf6Regexp = /^[0-9][0-9][0-9]-(?:[0-9][0-9]|[1-9][0-9]+)(?:[^0-9].*)?$/u;\n\nexport function isValidSubfield6(subfield) {\n if (subfield.code !== '6') {\n return false;\n }\n return subfield.value.match(sf6Regexp);\n}\n\nfunction subfield6GetTag(subfield) {\n if (isValidSubfield6(subfield)) {\n return subfield.value.substring(0, 3);\n }\n return undefined;\n}\n\nexport function subfield6GetOccurrenceNumber(subfield) {\n if (isValidSubfield6(subfield)) {\n // Skip \"TAG-\" prefix. 2023-02-20: removed 2-digit requirement from here...\n return subfield.value.substring(4).replace(/\\D.*$/u, '');\n }\n return undefined;\n}\n\nexport function subfield6GetOccurrenceNumberAsInteger(subfield) {\n const index = subfield6GetOccurrenceNumber(subfield);\n if (index === undefined || index === '00') {\n return 0;\n }\n const result = parseInt(index, 10);\n //nvdebug(`SF6: ${subfield.value} => ${index} => ${result}`, debug);\n return result;\n}\n\nexport function resetSubfield6OccurrenceNumber(subfield, occurrenceNumber) {\n if (!isValidSubfield6(subfield)) {\n return;\n }\n const occurrenceNumberAsString = typeof occurrenceNumber === 'number' ? intToOccurrenceNumberString(occurrenceNumber) : occurrenceNumber;\n\n const newValue = subfield.value.substring(0, 4) + occurrenceNumberAsString + subfield6GetTail(subfield); // eslint-disable-line functional/immutable-data\n //nvdebug(`Set subfield $6 value from ${subfieldToString(subfield)} to ${newValue}`);\n subfield.value = newValue; // eslint-disable-line functional/immutable-data\n}\n\n\nfunction subfield6GetTail(subfield) {\n if (isValidSubfield6(subfield)) {\n // Skip \"TAG-\" prefix. 2023-02-20: removed 2-digit requirement from here...\n return subfield.value.replace(/^\\d+-\\d+/u, '');\n }\n return '';\n}\n\n// <= SUBFIELD, FIELD =>\n\n/*\nexport function fieldHasValidSubfield6AndIsNotAnAlternateGraphicRepresentation(field) {\n // AlternateGraphicRepresentation is same as \"field.tag === '880'\"\"\n if (!field.subfields || field.tag === '880') {\n return false;\n }\n const sf6s = field.subfields.filter(sf => sf.code === '6' && sf.value.match(sf6Regexp));\n return sf6s.length === 1;\n}\n*/\n\nexport function fieldGetUnambiguousTag(field) {\n const tags = field.subfields.filter(sf => subfield6GetTag(sf));\n if (tags.length === 1) {\n nvdebug(` GOT ${tags.length} tag(s): ${subfieldToString(tags[0])}`);\n return subfield6GetTag(tags[0]);\n }\n return undefined;\n}\n\nexport function fieldGetUnambiguousOccurrenceNumber(field) {\n const occurrenceNumbers = field.subfields.filter(sf => subfield6GetOccurrenceNumber(sf));\n if (occurrenceNumbers.length === 1) {\n return subfield6GetOccurrenceNumber(occurrenceNumbers[0]);\n }\n return undefined;\n}\n\nexport function fieldHasOccurrenceNumber(field, occurrenceNumber) {\n //nvdebug(`${occurrenceNumber} vs ${fieldToString(field)}`);\n return field.subfields && field.subfields.some(sf => subfield6GetOccurrenceNumber(sf) === occurrenceNumber);\n}\n\nexport function resetFieldOccurrenceNumber(field, newOccurrenceNumber, oldOccurrenceNumber = undefined) {\n field.subfields.forEach(subfield => innerReset(subfield));\n\n function innerReset(subfield) {\n // (Optional) Check that this is really the occurrence number we wan't to reseot\n if (oldOccurrenceNumber !== undefined) {\n const currOccurrenceNumber = subfield6GetOccurrenceNumber(subfield);\n if (currOccurrenceNumber !== oldOccurrenceNumber) {\n return;\n }\n }\n resetSubfield6OccurrenceNumber(subfield, newOccurrenceNumber);\n }\n}\n\nexport function intToOccurrenceNumberString(i) {\n return i < 10 ? `0${i}` : `${i}`;\n}\n\nfunction fieldGetMaxSubfield6OccurrenceNumberAsInteger(field) {\n //nvdebug(`Checking subfields $6 from ${JSON.stringify(field)}`);\n const sf6s = field.subfields ? field.subfields.filter(subfield => isValidSubfield6(subfield)) : [];\n if (sf6s.length === 0) {\n return 0;\n }\n // There should always be one, but here we check every subfield.\n //nvdebug(`Got ${field.subfields} $6-subfield(s) from ${JSON.stringify(field)}`, debug);\n const vals = sf6s.map(sf => subfield6GetOccurrenceNumberAsInteger(sf));\n return Math.max(...vals);\n}\n\n\nexport function recordGetMaxSubfield6OccurrenceNumberAsInteger(record) {\n // Should we cache the value here?\n const vals = record.fields.map((field) => fieldGetMaxSubfield6OccurrenceNumberAsInteger(field));\n return Math.max(...vals);\n}\n\nexport function hasWantedTagAndOccurrenceNumber(subfield, tagAndOccurrenceNumber) {\n if (subfield.code !== '6') {\n return false;\n }\n // We could also use generic code and go getTag()+'-'+getIndex() instead of regexp...\n const key = subfield.value.replace(/^([0-9][0-9][0-9]-[0-9][0-9]+).*$/u, '$1'); // eslint-disable-line prefer-named-capture-group\n nvdebug(` Compare '${key}' vs '${tagAndOccurrenceNumber}'`);\n return key === tagAndOccurrenceNumber;\n}\n\n\nexport function fieldHasWantedTagAndOccurrenceNumber(field, tagAndOccurrenceNumber) {\n return field.subfields && field.subfields.some(sf => hasWantedTagAndOccurrenceNumber(sf, tagAndOccurrenceNumber));\n}\n\n\n/*\nexport function getFieldsWithGivenOccurrenceNumberSubfield6(record, occurrenceNumberAsString) {\n const record.fields.filter(field => field\n\n function fieldHasIndex(field, index) {\n if (!field.subfields) {\n return false;\n }\n return field.subfields.find(sf => isValidSubfield6(sf) && subfieldGetOccurrenceNumber6(sf) === index);\n }\n}\n*/\n\n\nfunction fieldHasValidSubfield6(field) {\n return field.subfields && field.subfields.some(sf => isValidSubfield6(sf));\n}\n\n\n/*\n\nexport function subfieldGetOccurrenceNumber6(subfield) {\n if (isValidSubfield6(subfield)) {\n // Skip \"TAG-\" prefix. 2023-02-20: removed 2-digit requirement from here...\n return subfield.value.substring(4).replace(/\\D.*$/u, '');\n }\n return undefined;\n}\n\nfunction subfieldGetTag6(subfield) {\n if (isValidSubfield6(subfield)) {\n return subfield.value.substring(0, 3);\n }\n return undefined;\n}\n\n\nexport function resetSubfield6Tag(subfield, tag) {\n if (!isValidSubfield6(subfield)) {\n return;\n }\n // NB! mainly for 1XX<->7XX transfers\n const newValue = `${tag}-${subfield.value.substring(4)}`;\n nvdebug(`Set subfield $6 value from ${subfieldToString(subfield)} to ${newValue}`);\n subfield.value = newValue; // eslint-disable-line functional/immutable-data\n}\n\n\n*/\n\n\n/*\nexport function fieldGetOccurrenceNumber6(field) {\n if (!field.subfields) {\n return undefined;\n }\n // Subfield $6 should always be the 1st subfield... (not implemented)\n // There should be only one $6, so find is ok.\n const sf6 = field.subfields.find(subfield => isValidSubfield6(subfield));\n if (sf6 === undefined) {\n return undefined;\n }\n return subfieldGetOccurrenceNumber6(sf6);\n}\n\nfunction fieldGetTag6(field) {\n if (!field.subfields) {\n return undefined;\n }\n // Subfield $6 should always be the 1st subfield... (not implemented)\n // There should be only one $6, so find is ok.\n const sf6 = field.subfields.find(subfield => isValidSubfield6(subfield));\n if (sf6 === undefined) {\n return undefined;\n }\n return subfieldGetTag6(sf6);\n}\n\n*/\n\nfunction isSubfield6Pair(field, otherField) {\n // No need to log this:\n //nvdebug(`LOOK for $6-pair:\\n ${fieldToString(field)}\\n ${fieldToString(otherField)}`);\n if (!fieldHasValidSubfield6(field) || !fieldHasValidSubfield6(otherField)) {\n return false;\n }\n\n if (!tagsArePairable6(field.tag, otherField.tag)) {\n //nvdebug(` FAILED. REASON: TAGS NOT PAIRABLE!`);\n return false;\n }\n\n\n const fieldIndex = fieldGetUnambiguousOccurrenceNumber(field);\n if (fieldIndex === undefined || fieldIndex === '00') {\n //nvdebug(` FAILED. REASON: NO INDEX FOUND`);\n return false;\n }\n\n const otherFieldIndex = fieldGetUnambiguousOccurrenceNumber(otherField);\n\n\n if (fieldIndex !== otherFieldIndex) {\n //nvdebug(` FAILURE: INDEXES: ${fieldIndex} vs ${otherFieldIndex}`);\n return false;\n }\n\n if (fieldGetUnambiguousTag(field) !== otherField.tag || field.tag !== fieldGetUnambiguousTag(otherField)) {\n //nvdebug(` FAILURE: TAG vs $6 TAG`);\n return false;\n }\n return true;\n\n function tagsArePairable6(tag1, tag2) {\n // How to do XOR operation in one line? Well, this is probably more readable...\n if (tag1 === '880' && tag2 === '880') {\n return false;\n }\n if (tag1 !== '880' && tag2 !== '880') {\n return false;\n }\n return true;\n }\n}\n\nexport function fieldGetOccurrenceNumberPairs(field, candFields) {\n // NB! TAG!=880 returns 880 fields, TAG==880 returns non-880 field\n //nvdebug(` Trying to finds pair for ${fieldToString(field)} in ${candFields.length} fields`);\n const pairs = candFields.filter(otherField => isSubfield6Pair(field, otherField));\n if (pairs.length === 0) {\n nvdebug(`NO PAIRS FOUND FOR '${fieldToString(field)}'`);\n return pairs;\n }\n nvdebug(`${pairs.length} PAIR(S) FOUND FOR '${fieldToString(field)}'`);\n pairs.forEach(pairedField => nvdebug(` '${fieldToString(pairedField)}'`));\n return pairs;\n}\n\n/*\nexport function fieldGetSubfield6Pair(field, record) {\n const pairedFields = record.fields.filter(otherField => isSubfield6Pair(field, otherField));\n if (pairedFields.length !== 1) {\n return undefined;\n }\n // NB! It is theoretically possible to have multiple pairable 880 fields (one for each encoding)\n nvdebug(`fieldGetSubfield6Pair(): ${fieldToString(field)} => ${fieldToString(pairedFields[0])}`);\n return pairedFields[0];\n}\n*/\n\n/*\nexport function pairAndStringify6(field, record) {\n const pair6 = fieldGetSubfield6Pair(field, record);\n if (!pair6) {\n return fieldToNormalizedString(field);\n }\n return fieldsToNormalizedString([field, pair6]);\n}\n*/\n\nexport function is7XX(tag) {\n return ['700', '710', '711', '730'].includes(tag);\n}\n\nexport function subfieldToNormalizedString(sf, targetLinkingNumber = 0) {\n if (isValidSubfield6(sf) && targetLinkingNumber === 0) {\n const tag = sf.value.substring(0, 3);\n // 100/700 normalization:\n const tag2 = tag.match(/^[17](?:00|10|11|30)$/u) ? `X${tag.substring(1)}` : tag;\n\n // If we are normalizing $8 stuff, don't normalize $6 occurrence number!\n // Replace $6 occurrence number with XX:\n return ` ‡${sf.code} ${tag2}-XX${subfield6GetTail(sf)}`;\n }\n\n if (isValidSubfield8(sf)) {\n const currLinkingNumber = getSubfield8LinkingNumber(sf); //getSubfield8Index(sf);\n if (targetLinkingNumber > 0 && currLinkingNumber === targetLinkingNumber) {\n // For $8 we should only XX the index we are looking at...\n const normVal = sf.value.replace(/^[0-9]+/u, 'XX');\n return ` ‡${sf.code} ${normVal}`;\n }\n return ''; // Other $8 subfields are meaningless in this context\n }\n return ` ${subfieldToString(sf)}`; // `‡${sf.code} ${sf.value}`;\n}\n\nexport function fieldToNormalizedString(field, targetLinkingNumber = 0) {\n if ('subfields' in field) {\n return `${field.tag} ${field.ind1}${field.ind2}${formatAndNormalizeSubfields(field)}`;\n }\n return `${field.tag} ${field.value}`;\n\n function formatAndNormalizeSubfields(field) {\n return field.subfields.map(sf => subfieldToNormalizedString(sf, targetLinkingNumber)).join('');\n }\n\n}\n\nexport function fieldsToNormalizedString(fields, index = 0) {\n const strings = fields.map(field => fieldToNormalizedString(field, index));\n strings.sort(); // eslint-disable-line functional/immutable-data\n return strings.join('\\t__SEPARATOR__\\t');\n}\n\n/*\n\nexport function removeField6IfNeeded(field, record, fieldsAsString) {\n const pairField = fieldGetSubfield6Pair(field, record);\n const asString = pairField ? fieldsToNormalizedString([field, pairField]) : fieldToNormalizedString(field);\n nvdebug(`SOURCE: ${asString} -- REALITY: ${fieldToString(field)}`);\n const tmp = pairField ? fieldToString(pairField) : 'HUTI';\n nvdebug(`PAIR: ${tmp}`);\n nvdebug(`BASE:\\n ${fieldsAsString.join('\\n ')}`);\n if (!fieldsAsString.includes(asString)) {\n return;\n }\n nvdebug(`Duplicate $6 removal: ${fieldToString(field)}`);\n record.removeField(field);\n\n if (pairField === undefined) {\n return;\n }\n nvdebug(`Duplicate $6 removal (pair): ${fieldToString(pairField)}`);\n record.removeField(pairField);\n}\n*/\n"],"mappings":"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"}
|
package/dist/subfield8Utils.js
CHANGED
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
+
exports.fieldHasLinkingNumber = fieldHasLinkingNumber;
|
|
7
|
+
exports.fieldsGetAllSubfield8LinkingNumbers = fieldsGetAllSubfield8LinkingNumbers;
|
|
6
8
|
exports.getSubfield8LinkingNumber = getSubfield8LinkingNumber;
|
|
7
9
|
exports.isValidSubfield8 = isValidSubfield8;
|
|
8
10
|
exports.recordGetAllSubfield8LinkingNumbers = recordGetAllSubfield8LinkingNumbers;
|
|
@@ -17,7 +19,8 @@ function isValidSubfield8(subfield) {
|
|
|
17
19
|
if (subfield.code !== '8') {
|
|
18
20
|
return false;
|
|
19
21
|
}
|
|
20
|
-
|
|
22
|
+
|
|
23
|
+
//nvdebug(` IS VALID $8? '${subfieldToString(subfield)}'`);
|
|
21
24
|
const match = subfield.value.match(sf8Regexp);
|
|
22
25
|
//nvdebug(` IS VALID $8? '${subfieldToString(subfield)}' vs ${match.length}}`);
|
|
23
26
|
return match && match.length > 0;
|
|
@@ -35,22 +38,22 @@ function getSubfield8LinkingNumber(subfield) {
|
|
|
35
38
|
}
|
|
36
39
|
return parseInt(value, 10);
|
|
37
40
|
}
|
|
41
|
+
function fieldHasLinkingNumber(field, linkingNumber) {
|
|
42
|
+
if (!field.subfields) {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
return field.subfields.some(sf => getSubfield8LinkingNumber(sf) === linkingNumber);
|
|
46
|
+
}
|
|
38
47
|
function recordGetFieldsWithSubfield8LinkingNumber(record, linkingNumber) {
|
|
39
48
|
if (linkingNumber < 1) {
|
|
40
49
|
return;
|
|
41
50
|
}
|
|
42
|
-
return record.fields.filter(field =>
|
|
43
|
-
function relevant4GFWS8I(field) {
|
|
44
|
-
if (!field.subfields) {
|
|
45
|
-
return false;
|
|
46
|
-
}
|
|
47
|
-
return field.subfields.some(sf => getSubfield8LinkingNumber(sf) === linkingNumber);
|
|
48
|
-
}
|
|
51
|
+
return record.fields.filter(field => fieldHasLinkingNumber(field, linkingNumber));
|
|
49
52
|
}
|
|
50
|
-
function
|
|
53
|
+
function fieldsGetAllSubfield8LinkingNumbers(fields) {
|
|
51
54
|
/* eslint-disable */
|
|
52
55
|
let subfield8LinkingNumbers = [];
|
|
53
|
-
|
|
56
|
+
fields.forEach(field => {
|
|
54
57
|
if (!field.subfields) {
|
|
55
58
|
return;
|
|
56
59
|
}
|
|
@@ -66,4 +69,8 @@ function recordGetAllSubfield8LinkingNumbers(record) {
|
|
|
66
69
|
return subfield8LinkingNumbers;
|
|
67
70
|
/* eslint-enable */
|
|
68
71
|
}
|
|
72
|
+
|
|
73
|
+
function recordGetAllSubfield8LinkingNumbers(record) {
|
|
74
|
+
return fieldsGetAllSubfield8LinkingNumbers(record.fields);
|
|
75
|
+
}
|
|
69
76
|
//# sourceMappingURL=subfield8Utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subfield8Utils.js","names":["
|
|
1
|
+
{"version":3,"file":"subfield8Utils.js","names":["_utils","require","sf8Regexp","isValidSubfield8","subfield","code","match","value","length","getSubfield8Value","undefined","getSubfield8LinkingNumber","parseInt","fieldHasLinkingNumber","field","linkingNumber","subfields","some","sf","recordGetFieldsWithSubfield8LinkingNumber","record","fields","filter","fieldsGetAllSubfield8LinkingNumbers","subfield8LinkingNumbers","forEach","nvdebug","subfieldToString","includes","push","recordGetAllSubfield8LinkingNumbers"],"sources":["../src/subfield8Utils.js"],"sourcesContent":["// import createDebugLogger from 'debug';\n// const debug = createDebugLogger('@natlibfi/marc-record-validator-melinda/subfield8Utils');\n\nimport {nvdebug, subfieldToString} from './utils';\n\nconst sf8Regexp = /^([1-9][0-9]*)(?:\\.[0-9]+)?(?:\\\\[acprux])?$/u; // eslint-disable-line prefer-named-capture-group\n\nexport function isValidSubfield8(subfield) {\n if (subfield.code !== '8') {\n return false;\n }\n\n //nvdebug(` IS VALID $8? '${subfieldToString(subfield)}'`);\n const match = subfield.value.match(sf8Regexp);\n //nvdebug(` IS VALID $8? '${subfieldToString(subfield)}' vs ${match.length}}`);\n return match && match.length > 0;\n}\n\nfunction getSubfield8Value(subfield) {\n if (!isValidSubfield8(subfield)) {\n return undefined;\n }\n return subfield.value;\n}\n\nexport function getSubfield8LinkingNumber(subfield) {\n const value = getSubfield8Value(subfield);\n if (value === undefined) {\n return 0;\n }\n return parseInt(value, 10);\n}\n\n\nexport function fieldHasLinkingNumber(field, linkingNumber) {\n if (!field.subfields) {\n return false;\n }\n return field.subfields.some(sf => getSubfield8LinkingNumber(sf) === linkingNumber);\n}\n\nexport function recordGetFieldsWithSubfield8LinkingNumber(record, linkingNumber) {\n if (linkingNumber < 1) {\n return;\n }\n return record.fields.filter(field => fieldHasLinkingNumber(field, linkingNumber));\n}\n\n\nexport function fieldsGetAllSubfield8LinkingNumbers(fields) {\n /* eslint-disable */\n let subfield8LinkingNumbers = [];\n fields.forEach(field => {\n if (!field.subfields) {\n return;\n }\n field.subfields.forEach(sf => {\n const linkingNumber = getSubfield8LinkingNumber(sf);\n nvdebug(`WP50: ${linkingNumber} vs '${subfieldToString(sf)}`);\n if (linkingNumber > 0 && !subfield8LinkingNumbers.includes(linkingNumber)) {\n nvdebug(` LINK8: Add subfield \\$8 ${linkingNumber} to seen values list`);\n subfield8LinkingNumbers.push(linkingNumber);\n }\n });\n });\n\n return subfield8LinkingNumbers;\n /* eslint-enable */\n\n}\n\nexport function recordGetAllSubfield8LinkingNumbers(record) {\n return fieldsGetAllSubfield8LinkingNumbers(record.fields);\n}\n"],"mappings":";;;;;;;;;;;AAGA,IAAAA,MAAA,GAAAC,OAAA;AAHA;AACA;;AAIA,MAAMC,SAAS,GAAG,8CAA8C,CAAC,CAAC;;AAE3D,SAASC,gBAAgBA,CAACC,QAAQ,EAAE;EACzC,IAAIA,QAAQ,CAACC,IAAI,KAAK,GAAG,EAAE;IACzB,OAAO,KAAK;EACd;;EAEA;EACA,MAAMC,KAAK,GAAGF,QAAQ,CAACG,KAAK,CAACD,KAAK,CAACJ,SAAS,CAAC;EAC7C;EACA,OAAOI,KAAK,IAAIA,KAAK,CAACE,MAAM,GAAG,CAAC;AAClC;AAEA,SAASC,iBAAiBA,CAACL,QAAQ,EAAE;EACnC,IAAI,CAACD,gBAAgB,CAACC,QAAQ,CAAC,EAAE;IAC/B,OAAOM,SAAS;EAClB;EACA,OAAON,QAAQ,CAACG,KAAK;AACvB;AAEO,SAASI,yBAAyBA,CAACP,QAAQ,EAAE;EAClD,MAAMG,KAAK,GAAGE,iBAAiB,CAACL,QAAQ,CAAC;EACzC,IAAIG,KAAK,KAAKG,SAAS,EAAE;IACvB,OAAO,CAAC;EACV;EACA,OAAOE,QAAQ,CAACL,KAAK,EAAE,EAAE,CAAC;AAC5B;AAGO,SAASM,qBAAqBA,CAACC,KAAK,EAAEC,aAAa,EAAE;EAC1D,IAAI,CAACD,KAAK,CAACE,SAAS,EAAE;IACpB,OAAO,KAAK;EACd;EACA,OAAOF,KAAK,CAACE,SAAS,CAACC,IAAI,CAACC,EAAE,IAAIP,yBAAyB,CAACO,EAAE,CAAC,KAAKH,aAAa,CAAC;AACpF;AAEO,SAASI,yCAAyCA,CAACC,MAAM,EAAEL,aAAa,EAAE;EAC/E,IAAIA,aAAa,GAAG,CAAC,EAAE;IACrB;EACF;EACA,OAAOK,MAAM,CAACC,MAAM,CAACC,MAAM,CAACR,KAAK,IAAID,qBAAqB,CAACC,KAAK,EAAEC,aAAa,CAAC,CAAC;AACnF;AAGO,SAASQ,mCAAmCA,CAACF,MAAM,EAAE;EAC1D;EACA,IAAIG,uBAAuB,GAAG,EAAE;EAChCH,MAAM,CAACI,OAAO,CAACX,KAAK,IAAI;IACtB,IAAI,CAACA,KAAK,CAACE,SAAS,EAAE;MACpB;IACF;IACAF,KAAK,CAACE,SAAS,CAACS,OAAO,CAACP,EAAE,IAAI;MAC5B,MAAMH,aAAa,GAAGJ,yBAAyB,CAACO,EAAE,CAAC;MACnD,IAAAQ,cAAO,EAAE,SAAQX,aAAc,QAAO,IAAAY,uBAAgB,EAACT,EAAE,CAAE,EAAC,CAAC;MAC7D,IAAIH,aAAa,GAAG,CAAC,IAAI,CAACS,uBAAuB,CAACI,QAAQ,CAACb,aAAa,CAAC,EAAE;QACzE,IAAAW,cAAO,EAAE,4BAA2BX,aAAc,sBAAqB,CAAC;QACxES,uBAAuB,CAACK,IAAI,CAACd,aAAa,CAAC;MAC7C;IACF,CAAC,CAAC;EACJ,CAAC,CAAC;EAEF,OAAOS,uBAAuB;EAC9B;AAEF;;AAEO,SAASM,mCAAmCA,CAACV,MAAM,EAAE;EAC1D,OAAOG,mCAAmC,CAACH,MAAM,CAACC,MAAM,CAAC;AAC3D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unicode-decomposition.js","names":["MAP_CONVERSION","å","ä","ö","Å","Ä","Ö","á","à","â","ã","ć","č","ç","é","è","ê","ẽ","ë","í","ì","î","ĩ","ï","ñ","ó","ò","ô","õ","ś","š","ú","ù","û","ü","ũ","ý","ỳ","ŷ","ỹ","ÿ","ž","Á","À","Â","Ã","É","È","Ê","Ẽ","Ë","Í","Ì","Î","Ĩ","Ï","Ñ","Ó","Ò","Ô","Õ","Ś","Ú","Ù","Û","Ũ","Ü","Ý","Ỳ","Ŷ","Ỹ","Ÿ","PATTERN","Object","keys","reduce","result","key","index","list","length","RegExp","description","validate","fix","record","codes","getFields","fields","map","field","subfields","filter","subfield","test","value","code","valid","messages","join","forEach","convert","some","includes","replace"],"sources":["../src/unicode-decomposition.js"],"sourcesContent":["const MAP_CONVERSION = {\n\n /**\n * @internal Normalizations\n **/\n '‐': '-',\n '‑': '-',\n '‒': '-',\n '–': '-',\n '—': '-',\n '―': '-',\n\n /**\n * @internal Normalizations (MELINDA-4172, MELINDA-4175)\n **/\n 'Ⓒ': '©',\n 'Ⓟ': '℗',\n\n /**\n * @internal Precompose å, ä, ö, Å, Ä and Ö\n **/\n å: 'å',\n ä: 'ä',\n ö: 'ö',\n Å: 'Å',\n Ä: 'Ä',\n Ö: 'Ö',\n\n /**\n * @internal Decompose everything else (list incomplete)\n **/\n á: 'á',\n à: 'à',\n â: 'â',\n ã: 'ã',\n ć: 'ć',\n č: 'č',\n ç: 'ç',\n é: 'é',\n è: 'è',\n ê: 'ê',\n ẽ: 'ẽ',\n ë: 'ë',\n í: 'í',\n ì: 'ì',\n î: 'î',\n ĩ: 'ĩ',\n ï: 'ï',\n ñ: 'ñ',\n ó: 'ó',\n ò: 'ò',\n ô: 'ô',\n õ: 'õ',\n ś: 'ś',\n š: 'š',\n ú: 'ú',\n ù: 'ù',\n û: 'û',\n ü: 'ü',\n ũ: 'ũ',\n ý: 'ý',\n ỳ: 'ỳ',\n ŷ: 'ŷ',\n ỹ: 'ỹ',\n ÿ: 'ÿ',\n ž: 'ž',\n Á: 'Á',\n À: 'À',\n Â: 'Â',\n Ã: 'Ã',\n É: 'É',\n È: 'È',\n Ê: 'Ê',\n Ẽ: 'Ẽ',\n Ë: 'Ë',\n Í: 'Í',\n Ì: 'Ì',\n Î: 'Î',\n Ĩ: 'Ĩ',\n Ï: 'Ï',\n Ñ: 'Ñ',\n Ó: 'Ó',\n Ò: 'Ò',\n Ô: 'Ô',\n Õ: 'Õ',\n Ś: 'Ś',\n Ú: 'Ú',\n Ù: 'Ù',\n Û: 'Û',\n Ũ: 'Ũ',\n Ü: 'Ü',\n Ý: 'Ý',\n Ỳ: 'Ỳ',\n Ŷ: 'Ŷ',\n Ỹ: 'Ỹ',\n Ÿ: 'Ÿ'\n};\n\nexport default function () {\n const PATTERN = Object.keys(MAP_CONVERSION).reduce((result, key, index, list) => index === list.length - 1 ? new RegExp(`${result}${key})`, 'u') : `${result}${key}|`, '(');\n\n return {\n description: 'Unicode decomposer',\n validate,\n fix\n };\n\n function validate(record) {\n const codes = getFields(record.fields).map(field => {\n if ('subfields' in field) {\n return field.subfields.filter(subfield => PATTERN.test(subfield.value))\n .map(subfield => subfield.code);\n }\n\n return null;\n });\n return codes.length < 1 ? {valid: true, messages: []} : {valid: false, messages: [`The following subfields are not properly decomposed: ${codes.join(', ')}`]};\n }\n\n function fix(record) {\n getFields(record.fields).forEach(field => {\n field.subfields\n .filter(subfield => PATTERN.test(subfield.value))\n .forEach(subfield => {\n subfield.value = convert(subfield.value); // eslint-disable-line functional/immutable-data\n });\n });\n }\n\n function getFields(fields) {\n return fields.filter(field => {\n if ('subfields' in field) {\n return field.subfields.some(subfield => PATTERN.test(subfield.value));\n }\n\n return null;\n });\n }\n}\n\nexport function convert(value) {\n return Object.keys(MAP_CONVERSION).reduce((result, key) => result.includes(key) ? result.replace(new RegExp(key, 'ug'), MAP_CONVERSION[key]) : result, value);\n}\n\n"],"mappings":";;;;;;;AAAA,MAAMA,cAAc,GAAG;EAErB;AACF;AACA;EACE,GAAG,EAAE,GAAG;EACR,GAAG,EAAE,GAAG;EACR,GAAG,EAAE,GAAG;EACR,GAAG,EAAE,GAAG;EACR,GAAG,EAAE,GAAG;EACR,GAAG,EAAE,GAAG;EAER;AACF;AACA;EACE,GAAG,EAAE,GAAG;EACR,GAAG,EAAE,GAAG;EAER;AACF;AACA;EACEC,EAAE,EAAE,GAAG;EACPC,EAAE,EAAE,GAAG;EACPC,EAAE,EAAE,GAAG;EACPC,EAAE,EAAE,GAAG;EACPC,EAAE,EAAE,GAAG;EACPC,EAAE,EAAE,GAAG;EAEP;AACF;AACA;EACEC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE,IAAI;EACPC,CAAC,EAAE;AACL,CAAC;AAEc,
|
|
1
|
+
{"version":3,"file":"unicode-decomposition.js","names":["MAP_CONVERSION","å","ä","ö","Å","Ä","Ö","á","à","â","ã","ć","č","ç","é","è","ê","ẽ","ë","í","ì","î","ĩ","ï","ñ","ó","ò","ô","õ","ś","š","ú","ù","û","ü","ũ","ý","ỳ","ŷ","ỹ","ÿ","ž","Á","À","Â","Ã","É","È","Ê","Ẽ","Ë","Í","Ì","Î","Ĩ","Ï","Ñ","Ó","Ò","Ô","Õ","Ś","Ú","Ù","Û","Ũ","Ü","Ý","Ỳ","Ŷ","Ỹ","Ÿ","_default","PATTERN","Object","keys","reduce","result","key","index","list","length","RegExp","description","validate","fix","record","codes","getFields","fields","map","field","subfields","filter","subfield","test","value","code","valid","messages","join","forEach","convert","some","includes","replace"],"sources":["../src/unicode-decomposition.js"],"sourcesContent":["const MAP_CONVERSION = {\n\n /**\n * @internal Normalizations\n **/\n '‐': '-',\n '‑': '-',\n '‒': '-',\n '–': '-',\n '—': '-',\n '―': '-',\n\n /**\n * @internal Normalizations (MELINDA-4172, MELINDA-4175)\n **/\n 'Ⓒ': '©',\n 'Ⓟ': '℗',\n\n /**\n * @internal Precompose å, ä, ö, Å, Ä and Ö\n **/\n å: 'å',\n ä: 'ä',\n ö: 'ö',\n Å: 'Å',\n Ä: 'Ä',\n Ö: 'Ö',\n\n /**\n * @internal Decompose everything else (list incomplete)\n **/\n á: 'á',\n à: 'à',\n â: 'â',\n ã: 'ã',\n ć: 'ć',\n č: 'č',\n ç: 'ç',\n é: 'é',\n è: 'è',\n ê: 'ê',\n ẽ: 'ẽ',\n ë: 'ë',\n í: 'í',\n ì: 'ì',\n î: 'î',\n ĩ: 'ĩ',\n ï: 'ï',\n ñ: 'ñ',\n ó: 'ó',\n ò: 'ò',\n ô: 'ô',\n õ: 'õ',\n ś: 'ś',\n š: 'š',\n ú: 'ú',\n ù: 'ù',\n û: 'û',\n ü: 'ü',\n ũ: 'ũ',\n ý: 'ý',\n ỳ: 'ỳ',\n ŷ: 'ŷ',\n ỹ: 'ỹ',\n ÿ: 'ÿ',\n ž: 'ž',\n Á: 'Á',\n À: 'À',\n Â: 'Â',\n Ã: 'Ã',\n É: 'É',\n È: 'È',\n Ê: 'Ê',\n Ẽ: 'Ẽ',\n Ë: 'Ë',\n Í: 'Í',\n Ì: 'Ì',\n Î: 'Î',\n Ĩ: 'Ĩ',\n Ï: 'Ï',\n Ñ: 'Ñ',\n Ó: 'Ó',\n Ò: 'Ò',\n Ô: 'Ô',\n Õ: 'Õ',\n Ś: 'Ś',\n Ú: 'Ú',\n Ù: 'Ù',\n Û: 'Û',\n Ũ: 'Ũ',\n Ü: 'Ü',\n Ý: 'Ý',\n Ỳ: 'Ỳ',\n Ŷ: 'Ŷ',\n Ỹ: 'Ỹ',\n Ÿ: 'Ÿ'\n};\n\nexport default function () {\n const PATTERN = Object.keys(MAP_CONVERSION).reduce((result, key, index, list) => index === list.length - 1 ? new RegExp(`${result}${key})`, 'u') : `${result}${key}|`, '(');\n\n return {\n description: 'Unicode decomposer',\n validate,\n fix\n };\n\n function validate(record) {\n const codes = getFields(record.fields).map(field => {\n if ('subfields' in field) {\n return field.subfields.filter(subfield => PATTERN.test(subfield.value))\n .map(subfield => subfield.code);\n }\n\n return null;\n });\n return codes.length < 1 ? {valid: true, messages: []} : {valid: false, messages: [`The following subfields are not properly decomposed: ${codes.join(', ')}`]};\n }\n\n function fix(record) {\n getFields(record.fields).forEach(field => {\n field.subfields\n .filter(subfield => PATTERN.test(subfield.value))\n .forEach(subfield => {\n subfield.value = convert(subfield.value); // eslint-disable-line functional/immutable-data\n });\n });\n }\n\n function getFields(fields) {\n return fields.filter(field => {\n if ('subfields' in field) {\n return field.subfields.some(subfield => PATTERN.test(subfield.value));\n }\n\n return null;\n });\n }\n}\n\nexport function convert(value) {\n return Object.keys(MAP_CONVERSION).reduce((result, key) => result.includes(key) ? result.replace(new RegExp(key, 'ug'), MAP_CONVERSION[key]) : result, value);\n}\n\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unicode-decomposition.spec.js","names":["expect","chai","use","chaiAsPromised","describe","it","validator","validatorFactory","to","be","an","that","has","any","keys","description","a","validate","record","MarcRecord","fields","tag","subfields","code","value","result","eql","valid","messages","ind1","ind2","recordOriginal","toObject","fieldModified","fix","not"],"sources":["../src/unicode-decomposition.spec.js"],"sourcesContent":["import chai from 'chai';\nimport chaiAsPromised from 'chai-as-promised';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from '../src/unicode-decomposition';\n\nconst {expect} = chai;\nchai.use(chaiAsPromised);\n\ndescribe('unicode-decomposition', () => {\n it('Creates a validator', async () => {\n const validator = await validatorFactory();\n\n expect(validator)\n .to.be.an('object')\n .that.has.any.keys('description', 'validate');\n\n expect(validator.description).to.be.a('string');\n expect(validator.validate).to.be.a('function');\n });\n\n describe('#validate', () => {\n it('Finds the record valid', async () => {\n const validator = await validatorFactory();\n const record = new MarcRecord({\n fields: [\n {\n tag: '245',\n subfields: [\n {\n code: 'a',\n value: 'Föö, Bär'\n }\n ]\n }\n ]\n });\n const result = await validator.validate(record);\n expect(result).to.eql({valid: true, messages: []});\n });\n\n it('Finds the record invalid', async () => {\n const validator = await validatorFactory();\n const record = new MarcRecord({\n fields: [\n {\n tag: '001',\n ind1: ' ',\n ind2: '0',\n subfields: [\n {\n code: 'a',\n value: 'Föö, Bär'\n }\n ]\n }\n ]\n });\n const result = await validator.validate(record);\n\n expect(result).to.eql({valid: false, messages: ['The following subfields are not properly decomposed: a']});\n });\n\n describe('#fix', () => {\n it('Should fix the record', async () => {\n const validator = await validatorFactory();\n\n const record = new MarcRecord({\n fields: [\n {\n tag: '245',\n subfields: [\n {\n code: 'a',\n value: 'Föö, Bär'\n },\n {\n code: 'b',\n value: '== Fubar'\n }\n ]\n }\n ]\n });\n\n const recordOriginal = record.toObject();\n const fieldModified = {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'Föö, Bär'\n },\n {\n code: 'b',\n value: '== Fubar'\n }\n ]\n };\n await validator.fix(record);\n\n expect(recordOriginal).to.not.eql(record);\n expect(record.fields).to.eql([fieldModified]);\n });\n });\n });\n});\n"],"mappings":";;AAAA;AACA;AACA;AACA;AAA4D;AAE5D,MAAM;
|
|
1
|
+
{"version":3,"file":"unicode-decomposition.spec.js","names":["_chai","_interopRequireDefault","require","_chaiAsPromised","_marcRecord","_unicodeDecomposition","obj","__esModule","default","expect","chai","use","chaiAsPromised","describe","it","validator","validatorFactory","to","be","an","that","has","any","keys","description","a","validate","record","MarcRecord","fields","tag","subfields","code","value","result","eql","valid","messages","ind1","ind2","recordOriginal","toObject","fieldModified","fix","not"],"sources":["../src/unicode-decomposition.spec.js"],"sourcesContent":["import chai from 'chai';\nimport chaiAsPromised from 'chai-as-promised';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from '../src/unicode-decomposition';\n\nconst {expect} = chai;\nchai.use(chaiAsPromised);\n\ndescribe('unicode-decomposition', () => {\n it('Creates a validator', async () => {\n const validator = await validatorFactory();\n\n expect(validator)\n .to.be.an('object')\n .that.has.any.keys('description', 'validate');\n\n expect(validator.description).to.be.a('string');\n expect(validator.validate).to.be.a('function');\n });\n\n describe('#validate', () => {\n it('Finds the record valid', async () => {\n const validator = await validatorFactory();\n const record = new MarcRecord({\n fields: [\n {\n tag: '245',\n subfields: [\n {\n code: 'a',\n value: 'Föö, Bär'\n }\n ]\n }\n ]\n });\n const result = await validator.validate(record);\n expect(result).to.eql({valid: true, messages: []});\n });\n\n it('Finds the record invalid', async () => {\n const validator = await validatorFactory();\n const record = new MarcRecord({\n fields: [\n {\n tag: '001',\n ind1: ' ',\n ind2: '0',\n subfields: [\n {\n code: 'a',\n value: 'Föö, Bär'\n }\n ]\n }\n ]\n });\n const result = await validator.validate(record);\n\n expect(result).to.eql({valid: false, messages: ['The following subfields are not properly decomposed: a']});\n });\n\n describe('#fix', () => {\n it('Should fix the record', async () => {\n const validator = await validatorFactory();\n\n const record = new MarcRecord({\n fields: [\n {\n tag: '245',\n subfields: [\n {\n code: 'a',\n value: 'Föö, Bär'\n },\n {\n code: 'b',\n value: '== Fubar'\n }\n ]\n }\n ]\n });\n\n const recordOriginal = record.toObject();\n const fieldModified = {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'Föö, Bär'\n },\n {\n code: 'b',\n value: '== Fubar'\n }\n ]\n };\n await validator.fix(record);\n\n expect(recordOriginal).to.not.eql(record);\n expect(record.fields).to.eql([fieldModified]);\n });\n });\n });\n});\n"],"mappings":"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"}
|
package/dist/urn.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"urn.js","names":["URN_GENERATOR_URL","isLegalDeposit","useMelindaTemp","debug","createDebugLogger","debugData","extend","hasURN","f","tag","subfields","some","code","value","test","description","validate","fix","record","f856sUrn","fields","filter","JSON","stringify","ldSubfields","createLDSubfields","length","generated","createURNSubfield","tempSubField","insertField","ind1","ind2","forEach","ldsf","sf","push","rec","isbn","reduce","acc","a","find","undefined","createURN","response","fetch","body","text","fieldHasLDSubfields","field","every","validateLD","f856sUrnWithLdSubfields","isElectronicMaterial","valid"],"sources":["../src/urn.js"],"sourcesContent":["import fetch from 'node-fetch';\nimport {isElectronicMaterial} from './utils';\nimport createDebugLogger from 'debug';\n\nconst URN_GENERATOR_URL = 'http://generator.urn.fi/cgi-bin/urn_generator.cgi?type=nbn';\n\nexport default function (isLegalDeposit = false, useMelindaTemp = true) {\n const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:urn');\n const debugData = debug.extend('data');\n\n // We should check that the f856 with URN has second indicator '0' (Resource), ' ' (No information provided) or '8' (No display constant generated)\n // - if second indicator is '1' (Version of resource) or '2' (Related resource) the URN in f856 is not correct for the resource described in the record\n\n // This checks only the existence of URNs from the Finnish urn.fi -resolver\n\n const hasURN = f => f.tag === '856' && f.subfields.some(({code, value}) => code === 'u' && (/urn.fi/u).test(value));\n\n return {\n description: 'Adds URN for record, to 856-field (if not existing). If isLegalDeposit is active, adds legal deposit subfields to the f856s with URN.',\n validate,\n fix\n };\n\n async function fix(record) {\n const f856sUrn = record.fields.filter(hasURN);\n debugData(`f856sUrn: ${JSON.stringify(f856sUrn)}`);\n\n const ldSubfields = isLegalDeposit ? createLDSubfields() : [];\n debugData(`IsLegalDeposit: ${isLegalDeposit}, LegalDepositSubfields: ${JSON.stringify(ldSubfields)}`);\n\n // We add the URN even if we're not getting the legalDeposit - where does this URN resolve?\n // We probably should not do these additions\n\n if (f856sUrn.length === 0) { // eslint-disable-line functional/no-conditional-statement\n const {code, value, generated} = await createURNSubfield(record);\n\n if (generated && useMelindaTemp) {\n const tempSubField = {code: '9', value: 'MELINDA<TEMP>'};\n\n record.insertField({\n tag: '856',\n ind1: '4',\n ind2: '0',\n subfields: [{code, value}, ...ldSubfields, tempSubField]\n });\n\n return true;\n }\n\n record.insertField({\n tag: '856',\n ind1: '4',\n ind2: '0',\n subfields: [{code, value}, ...ldSubfields]\n });\n\n return true;\n } else if (isLegalDeposit) { // eslint-disable-line functional/no-conditional-statement\n\n // We add here legal deposit information to all URN-f856s - we probably should not do this\n // We should add extra f856 URN / URNs for legal deposits that already have a open (non-legal-deposit) URN\n // How do we decide which URN to use as a template if there are several URNs\n // We should check for existence of a legal deposit URN anyways\n\n f856sUrn.forEach(f => {\n ldSubfields.forEach(ldsf => {\n if (!f.subfields.some(sf => sf.code === ldsf.code && sf.value === ldsf.value)) { // eslint-disable-line functional/no-conditional-statement\n f.subfields.push(ldsf); // eslint-disable-line functional/immutable-data\n }\n });\n });\n }\n\n return true;\n\n // We should check existence of URN in f024 i1: '7' $2 urn/URN for this too\n\n async function createURNSubfield(rec) {\n // isbn is picked from the last 020 $a in the record\n // what should we do in case of several 020 $a:s\n const isbn = rec.fields.reduce((acc, f) => {\n if (f.tag === '020') {\n const a = f.subfields.find(sf => sf.code === 'a');\n return a ? a.value : undefined;\n }\n\n return acc;\n }, undefined);\n\n debugData(`isbns: ${isbn}`);\n\n const {generated, value} = await createURN(isbn);\n return {code: 'u', value, generated};\n\n async function createURN(isbn = false) {\n if (isbn) {\n return {generated: false, value: `http://urn.fi/URN:ISBN:${isbn}`};\n }\n\n const response = await fetch(URN_GENERATOR_URL);\n const body = await response.text();\n\n // If we generated URN we could also add it to the 024\n // generated 024 should also have $9 MELINDA<TEMP>\n return {generated: true, value: `http://urn.fi/${body}`};\n }\n }\n\n }\n\n // Later when the new subfields that have f506/f540 -type contents, we should add also them here\n function createLDSubfields() {\n return [\n {\n code: 'z',\n value: 'Käytettävissä vapaakappalekirjastoissa'\n },\n {\n code: '5',\n value: 'FI-Vapaa'\n }\n ];\n }\n\n function fieldHasLDSubfields(field, ldSubfields) {\n if (ldSubfields.every(ldsf => field.subfields.some(sf => sf.code === ldsf.code && sf.value === ldsf.value))) {\n return true;\n }\n }\n\n function validateLD(f856sUrn) {\n debug(`Validating the existence of legal deposit subfields`);\n const ldSubfields = createLDSubfields();\n const f856sUrnWithLdSubfields = f856sUrn.filter(field => fieldHasLDSubfields(field, ldSubfields));\n if (f856sUrnWithLdSubfields.length > 0) {\n debug(`Record has ${f856sUrnWithLdSubfields.length} URN fields with all necessary legal deposit subfields`);\n debugData(`f856sUrnWithLdSubfields: ${JSON.stringify(f856sUrnWithLdSubfields)}`);\n return true;\n }\n return false;\n }\n\n function validate(record) {\n // if not electronic skip this validator\n if (!isElectronicMaterial(record)) {\n debug(`Record is not electronic - no need to validate legal deposit URNs`);\n return {valid: true};\n }\n\n const f856sUrn = record.fields.filter(hasURN);\n\n if (f856sUrn.length > 0) {\n debug(`Record has ${f856sUrn.length} URN fields`);\n debugData(`f856sUrn: ${JSON.stringify(f856sUrn)}`);\n\n if (!isLegalDeposit || validateLD(f856sUrn)) {\n debug(`Record is valid`);\n return {valid: true};\n }\n }\n debug(`No (valid) URN fields - Record is not valid`);\n return {valid: false};\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"urn.js","names":["_nodeFetch","_interopRequireDefault","require","_utils","_debug","obj","__esModule","default","URN_GENERATOR_URL","_default","isLegalDeposit","useMelindaTemp","debug","createDebugLogger","debugData","extend","hasURN","f","tag","subfields","some","code","value","test","description","validate","fix","record","f856sUrn","fields","filter","JSON","stringify","ldSubfields","createLDSubfields","length","generated","createURNSubfield","tempSubField","insertField","ind1","ind2","forEach","ldsf","sf","push","rec","isbn","reduce","acc","a","find","undefined","createURN","response","fetch","body","text","fieldHasLDSubfields","field","every","validateLD","f856sUrnWithLdSubfields","isElectronicMaterial","valid"],"sources":["../src/urn.js"],"sourcesContent":["import fetch from 'node-fetch';\nimport {isElectronicMaterial} from './utils';\nimport createDebugLogger from 'debug';\n\nconst URN_GENERATOR_URL = 'http://generator.urn.fi/cgi-bin/urn_generator.cgi?type=nbn';\n\nexport default function (isLegalDeposit = false, useMelindaTemp = true) {\n const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:urn');\n const debugData = debug.extend('data');\n\n // We should check that the f856 with URN has second indicator '0' (Resource), ' ' (No information provided) or '8' (No display constant generated)\n // - if second indicator is '1' (Version of resource) or '2' (Related resource) the URN in f856 is not correct for the resource described in the record\n\n // This checks only the existence of URNs from the Finnish urn.fi -resolver\n\n const hasURN = f => f.tag === '856' && f.subfields.some(({code, value}) => code === 'u' && (/urn.fi/u).test(value));\n\n return {\n description: 'Adds URN for record, to 856-field (if not existing). If isLegalDeposit is active, adds legal deposit subfields to the f856s with URN.',\n validate,\n fix\n };\n\n async function fix(record) {\n const f856sUrn = record.fields.filter(hasURN);\n debugData(`f856sUrn: ${JSON.stringify(f856sUrn)}`);\n\n const ldSubfields = isLegalDeposit ? createLDSubfields() : [];\n debugData(`IsLegalDeposit: ${isLegalDeposit}, LegalDepositSubfields: ${JSON.stringify(ldSubfields)}`);\n\n // We add the URN even if we're not getting the legalDeposit - where does this URN resolve?\n // We probably should not do these additions\n\n if (f856sUrn.length === 0) { // eslint-disable-line functional/no-conditional-statement\n const {code, value, generated} = await createURNSubfield(record);\n\n if (generated && useMelindaTemp) {\n const tempSubField = {code: '9', value: 'MELINDA<TEMP>'};\n\n record.insertField({\n tag: '856',\n ind1: '4',\n ind2: '0',\n subfields: [{code, value}, ...ldSubfields, tempSubField]\n });\n\n return true;\n }\n\n record.insertField({\n tag: '856',\n ind1: '4',\n ind2: '0',\n subfields: [{code, value}, ...ldSubfields]\n });\n\n return true;\n } else if (isLegalDeposit) { // eslint-disable-line functional/no-conditional-statement\n\n // We add here legal deposit information to all URN-f856s - we probably should not do this\n // We should add extra f856 URN / URNs for legal deposits that already have a open (non-legal-deposit) URN\n // How do we decide which URN to use as a template if there are several URNs\n // We should check for existence of a legal deposit URN anyways\n\n f856sUrn.forEach(f => {\n ldSubfields.forEach(ldsf => {\n if (!f.subfields.some(sf => sf.code === ldsf.code && sf.value === ldsf.value)) { // eslint-disable-line functional/no-conditional-statement\n f.subfields.push(ldsf); // eslint-disable-line functional/immutable-data\n }\n });\n });\n }\n\n return true;\n\n // We should check existence of URN in f024 i1: '7' $2 urn/URN for this too\n\n async function createURNSubfield(rec) {\n // isbn is picked from the last 020 $a in the record\n // what should we do in case of several 020 $a:s\n const isbn = rec.fields.reduce((acc, f) => {\n if (f.tag === '020') {\n const a = f.subfields.find(sf => sf.code === 'a');\n return a ? a.value : undefined;\n }\n\n return acc;\n }, undefined);\n\n debugData(`isbns: ${isbn}`);\n\n const {generated, value} = await createURN(isbn);\n return {code: 'u', value, generated};\n\n async function createURN(isbn = false) {\n if (isbn) {\n return {generated: false, value: `http://urn.fi/URN:ISBN:${isbn}`};\n }\n\n const response = await fetch(URN_GENERATOR_URL);\n const body = await response.text();\n\n // If we generated URN we could also add it to the 024\n // generated 024 should also have $9 MELINDA<TEMP>\n return {generated: true, value: `http://urn.fi/${body}`};\n }\n }\n\n }\n\n // Later when the new subfields that have f506/f540 -type contents, we should add also them here\n function createLDSubfields() {\n return [\n {\n code: 'z',\n value: 'Käytettävissä vapaakappalekirjastoissa'\n },\n {\n code: '5',\n value: 'FI-Vapaa'\n }\n ];\n }\n\n function fieldHasLDSubfields(field, ldSubfields) {\n if (ldSubfields.every(ldsf => field.subfields.some(sf => sf.code === ldsf.code && sf.value === ldsf.value))) {\n return true;\n }\n }\n\n function validateLD(f856sUrn) {\n debug(`Validating the existence of legal deposit subfields`);\n const ldSubfields = createLDSubfields();\n const f856sUrnWithLdSubfields = f856sUrn.filter(field => fieldHasLDSubfields(field, ldSubfields));\n if (f856sUrnWithLdSubfields.length > 0) {\n debug(`Record has ${f856sUrnWithLdSubfields.length} URN fields with all necessary legal deposit subfields`);\n debugData(`f856sUrnWithLdSubfields: ${JSON.stringify(f856sUrnWithLdSubfields)}`);\n return true;\n }\n return false;\n }\n\n function validate(record) {\n // if not electronic skip this validator\n if (!isElectronicMaterial(record)) {\n debug(`Record is not electronic - no need to validate legal deposit URNs`);\n return {valid: true};\n }\n\n const f856sUrn = record.fields.filter(hasURN);\n\n if (f856sUrn.length > 0) {\n debug(`Record has ${f856sUrn.length} URN fields`);\n debugData(`f856sUrn: ${JSON.stringify(f856sUrn)}`);\n\n if (!isLegalDeposit || validateLD(f856sUrn)) {\n debug(`Record is valid`);\n return {valid: true};\n }\n }\n debug(`No (valid) URN fields - Record is not valid`);\n return {valid: false};\n }\n}\n"],"mappings":"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"}
|