@natlibfi/marc-record-validators-melinda 11.6.6 → 11.6.7-alpha.1

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.
Files changed (223) hide show
  1. package/.github/workflows/melinda-node-tests.yml +1 -1
  2. package/dist/access-rights.js +1 -5
  3. package/dist/access-rights.js.map +1 -1
  4. package/dist/addMissingField336.js +1 -1
  5. package/dist/addMissingField336.js.map +1 -1
  6. package/dist/cyrillux-usemarcon-replacement.js +41 -45
  7. package/dist/cyrillux-usemarcon-replacement.js.map +1 -1
  8. package/dist/cyrillux.js +13 -17
  9. package/dist/cyrillux.js.map +1 -1
  10. package/dist/disambiguateSeriesStatements.js +3 -4
  11. package/dist/disambiguateSeriesStatements.js.map +1 -1
  12. package/dist/double-commas.js +2 -1
  13. package/dist/double-commas.js.map +1 -1
  14. package/dist/duplicates-ind1.js +1 -1
  15. package/dist/duplicates-ind1.js.map +1 -1
  16. package/dist/empty-fields.js +0 -4
  17. package/dist/empty-fields.js.map +1 -1
  18. package/dist/ending-punctuation.js +21 -49
  19. package/dist/ending-punctuation.js.map +1 -1
  20. package/dist/ending-whitespace.js +0 -4
  21. package/dist/ending-whitespace.js.map +1 -1
  22. package/dist/field-008-18-34-character-groups.js +4 -5
  23. package/dist/field-008-18-34-character-groups.js.map +1 -1
  24. package/dist/field-505-separators.js +8 -6
  25. package/dist/field-505-separators.js.map +1 -1
  26. package/dist/field-521-fix.js +5 -6
  27. package/dist/field-521-fix.js.map +1 -1
  28. package/dist/field-exclusion.js +5 -12
  29. package/dist/field-exclusion.js.map +1 -1
  30. package/dist/field-exclusion.spec.js +3 -5
  31. package/dist/field-exclusion.spec.js.map +1 -1
  32. package/dist/field-structure.js +2 -5
  33. package/dist/field-structure.js.map +1 -1
  34. package/dist/fields-present.js +1 -1
  35. package/dist/fields-present.js.map +1 -1
  36. package/dist/fields-present.spec.js +1 -1
  37. package/dist/fields-present.spec.js.map +1 -1
  38. package/dist/fix-33X.js +5 -6
  39. package/dist/fix-33X.js.map +1 -1
  40. package/dist/fix-country-codes.js +3 -4
  41. package/dist/fix-country-codes.js.map +1 -1
  42. package/dist/fix-language-codes.js +12 -9
  43. package/dist/fix-language-codes.js.map +1 -1
  44. package/dist/fixRelatorTerms.js +8 -8
  45. package/dist/fixRelatorTerms.js.map +1 -1
  46. package/dist/fixed-fields.js +1 -4
  47. package/dist/fixed-fields.js.map +1 -1
  48. package/dist/identical-fields.js +2 -3
  49. package/dist/identical-fields.js.map +1 -1
  50. package/dist/indicator-fixes.js +14 -15
  51. package/dist/indicator-fixes.js.map +1 -1
  52. package/dist/isbn-issn.js +8 -11
  53. package/dist/isbn-issn.js.map +1 -1
  54. package/dist/item-language.js +5 -12
  55. package/dist/item-language.js.map +1 -1
  56. package/dist/merge-fields/counterpartField.js +6 -8
  57. package/dist/merge-fields/counterpartField.js.map +1 -1
  58. package/dist/merge-fields/index.js +3 -3
  59. package/dist/merge-fields/index.js.map +1 -1
  60. package/dist/merge-fields/mergeConstraints.js +0 -1
  61. package/dist/merge-fields/mergeConstraints.js.map +1 -1
  62. package/dist/merge-fields/mergeField.js +12 -18
  63. package/dist/merge-fields/mergeField.js.map +1 -1
  64. package/dist/merge-fields/mergeIndicator.js +5 -5
  65. package/dist/merge-fields/mergeIndicator.js.map +1 -1
  66. package/dist/merge-fields/mergeOrAddPostprocess.js +6 -9
  67. package/dist/merge-fields/mergeOrAddPostprocess.js.map +1 -1
  68. package/dist/merge-fields/mergeOrAddSubfield.js +6 -8
  69. package/dist/merge-fields/mergeOrAddSubfield.js.map +1 -1
  70. package/dist/merge-fields/mergeSubfield.js +8 -8
  71. package/dist/merge-fields/mergeSubfield.js.map +1 -1
  72. package/dist/merge-fields/removeDuplicateSubfields.js +1 -2
  73. package/dist/merge-fields/removeDuplicateSubfields.js.map +1 -1
  74. package/dist/merge-fields/worldKnowledge.js +1 -1
  75. package/dist/merge-fields/worldKnowledge.js.map +1 -1
  76. package/dist/mergeField500Lisapainokset.js +0 -3
  77. package/dist/mergeField500Lisapainokset.js.map +1 -1
  78. package/dist/mergeRelatorTermFields.js +3 -3
  79. package/dist/mergeRelatorTermFields.js.map +1 -1
  80. package/dist/modernize-502.js +6 -6
  81. package/dist/modernize-502.js.map +1 -1
  82. package/dist/multiple-subfield-0.js +4 -4
  83. package/dist/multiple-subfield-0.js.map +1 -1
  84. package/dist/non-breaking-space.js +0 -4
  85. package/dist/non-breaking-space.js.map +1 -1
  86. package/dist/normalize-dashes.js +5 -4
  87. package/dist/normalize-dashes.js.map +1 -1
  88. package/dist/normalize-identifiers.js +6 -6
  89. package/dist/normalize-identifiers.js.map +1 -1
  90. package/dist/normalize-qualifying-information.js +4 -4
  91. package/dist/normalize-qualifying-information.js.map +1 -1
  92. package/dist/normalize-utf8-diacritics.js +7 -7
  93. package/dist/normalize-utf8-diacritics.js.map +1 -1
  94. package/dist/normalizeFieldForComparison.js +21 -20
  95. package/dist/normalizeFieldForComparison.js.map +1 -1
  96. package/dist/normalizeSubfieldValueForComparison.js +1 -2
  97. package/dist/normalizeSubfieldValueForComparison.js.map +1 -1
  98. package/dist/prepublicationUtils.js +3 -3
  99. package/dist/prepublicationUtils.js.map +1 -1
  100. package/dist/punctuation/index.js +14 -31
  101. package/dist/punctuation/index.js.map +1 -1
  102. package/dist/punctuation2.js +9 -10
  103. package/dist/punctuation2.js.map +1 -1
  104. package/dist/reindexSubfield6OccurenceNumbers.js +8 -9
  105. package/dist/reindexSubfield6OccurenceNumbers.js.map +1 -1
  106. package/dist/removeDuplicateDataFields.js +18 -20
  107. package/dist/removeDuplicateDataFields.js.map +1 -1
  108. package/dist/removeInferiorDataFields.js +16 -19
  109. package/dist/removeInferiorDataFields.js.map +1 -1
  110. package/dist/resolvable-ext-references-melinda.js +4 -8
  111. package/dist/resolvable-ext-references-melinda.js.map +1 -1
  112. package/dist/resolveOrphanedSubfield6s.js +9 -9
  113. package/dist/resolveOrphanedSubfield6s.js.map +1 -1
  114. package/dist/sanitize-vocabulary-source-codes.js +9 -9
  115. package/dist/sanitize-vocabulary-source-codes.js.map +1 -1
  116. package/dist/sort-tags.js +2 -2
  117. package/dist/sort-tags.js.map +1 -1
  118. package/dist/sortFields.js +4 -9
  119. package/dist/sortFields.js.map +1 -1
  120. package/dist/sortRelatorTerms.js +4 -5
  121. package/dist/sortRelatorTerms.js.map +1 -1
  122. package/dist/sortSubfields.js +5 -6
  123. package/dist/sortSubfields.js.map +1 -1
  124. package/dist/stripPunctuation.js +2 -2
  125. package/dist/stripPunctuation.js.map +1 -1
  126. package/dist/subfield-exclusion.js +4 -11
  127. package/dist/subfield-exclusion.js.map +1 -1
  128. package/dist/subfield6Utils.js +12 -11
  129. package/dist/subfield6Utils.js.map +1 -1
  130. package/dist/subfield8Utils.js +8 -9
  131. package/dist/subfield8Utils.js.map +1 -1
  132. package/dist/subfieldValueNormalizations.js +5 -8
  133. package/dist/subfieldValueNormalizations.js.map +1 -1
  134. package/dist/sync-007-and-300.js +8 -8
  135. package/dist/sync-007-and-300.js.map +1 -1
  136. package/dist/translate-terms.js +5 -6
  137. package/dist/translate-terms.js.map +1 -1
  138. package/dist/typeOfDate-008.js +3 -4
  139. package/dist/typeOfDate-008.js.map +1 -1
  140. package/dist/unicode-decomposition.js +1 -1
  141. package/dist/unicode-decomposition.js.map +1 -1
  142. package/dist/update-field-540.js +5 -6
  143. package/dist/update-field-540.js.map +1 -1
  144. package/dist/urn.js +4 -9
  145. package/dist/urn.js.map +1 -1
  146. package/dist/utils.js +5 -9
  147. package/dist/utils.js.map +1 -1
  148. package/eslint.config.mjs +53 -0
  149. package/package.json +12 -13
  150. package/src/access-rights.js +4 -4
  151. package/src/addMissingField336.js +1 -1
  152. package/src/cyrillux-usemarcon-replacement.js +38 -38
  153. package/src/cyrillux.js +14 -14
  154. package/src/disambiguateSeriesStatements.js +3 -3
  155. package/src/double-commas.js +2 -2
  156. package/src/duplicates-ind1.js +1 -1
  157. package/src/empty-fields.js +4 -4
  158. package/src/ending-punctuation.js +46 -49
  159. package/src/ending-whitespace.js +0 -2
  160. package/src/field-008-18-34-character-groups.js +5 -5
  161. package/src/field-505-separators.js +6 -6
  162. package/src/field-521-fix.js +6 -6
  163. package/src/field-exclusion.js +12 -12
  164. package/src/field-exclusion.spec.js +4 -4
  165. package/src/field-structure.js +5 -5
  166. package/src/fields-present.js +1 -1
  167. package/src/fields-present.spec.js +1 -1
  168. package/src/fix-33X.js +5 -5
  169. package/src/fix-country-codes.js +3 -3
  170. package/src/fix-language-codes.js +10 -9
  171. package/src/fixRelatorTerms.js +8 -8
  172. package/src/fixed-fields.js +3 -3
  173. package/src/identical-fields.js +3 -3
  174. package/src/indicator-fixes.js +15 -15
  175. package/src/isbn-issn.js +11 -11
  176. package/src/item-language.js +10 -10
  177. package/src/merge-fields/counterpartField.js +7 -7
  178. package/src/merge-fields/index.js +3 -3
  179. package/src/merge-fields/mergeConstraints.js +1 -1
  180. package/src/merge-fields/mergeField.js +16 -17
  181. package/src/merge-fields/mergeIndicator.js +5 -5
  182. package/src/merge-fields/mergeOrAddPostprocess.js +9 -9
  183. package/src/merge-fields/mergeOrAddSubfield.js +6 -6
  184. package/src/merge-fields/mergeSubfield.js +8 -8
  185. package/src/merge-fields/removeDuplicateSubfields.js +1 -2
  186. package/src/merge-fields/worldKnowledge.js +1 -1
  187. package/src/mergeField500Lisapainokset.js +0 -2
  188. package/src/mergeRelatorTermFields.js +3 -3
  189. package/src/modernize-502.js +6 -6
  190. package/src/multiple-subfield-0.js +4 -4
  191. package/src/non-breaking-space.js +0 -2
  192. package/src/normalize-dashes.js +4 -4
  193. package/src/normalize-identifiers.js +6 -6
  194. package/src/normalize-qualifying-information.js +4 -4
  195. package/src/normalize-utf8-diacritics.js +7 -7
  196. package/src/normalizeFieldForComparison.js +20 -20
  197. package/src/normalizeSubfieldValueForComparison.js +1 -1
  198. package/src/prepublicationUtils.js +3 -3
  199. package/src/punctuation/index.js +29 -29
  200. package/src/punctuation2.js +10 -10
  201. package/src/reindexSubfield6OccurenceNumbers.js +9 -9
  202. package/src/removeDuplicateDataFields.js +21 -23
  203. package/src/removeInferiorDataFields.js +19 -19
  204. package/src/resolvable-ext-references-melinda.js +8 -8
  205. package/src/resolveOrphanedSubfield6s.js +9 -9
  206. package/src/sanitize-vocabulary-source-codes.js +8 -8
  207. package/src/sort-tags.js +2 -2
  208. package/src/sortFields.js +6 -6
  209. package/src/sortRelatorTerms.js +5 -5
  210. package/src/sortSubfields.js +6 -6
  211. package/src/stripPunctuation.js +2 -2
  212. package/src/subfield-exclusion.js +11 -11
  213. package/src/subfield6Utils.js +11 -11
  214. package/src/subfield8Utils.js +6 -9
  215. package/src/subfieldValueNormalizations.js +5 -7
  216. package/src/sync-007-and-300.js +8 -8
  217. package/src/translate-terms.js +3 -5
  218. package/src/typeOfDate-008.js +3 -3
  219. package/src/unicode-decomposition.js +1 -1
  220. package/src/update-field-540.js +6 -6
  221. package/src/urn.js +8 -6
  222. package/src/utils.js +8 -8
  223. package/.eslintignore +0 -1
@@ -29,7 +29,7 @@ function _default() {
29
29
  normalizeField502(field);
30
30
  });
31
31
 
32
- // message.valid = !(message.message.length >= 1); // eslint-disable-line functional/immutable-data
32
+ // message.valid = !(message.message.length >= 1);
33
33
  return res;
34
34
  }
35
35
  function validate(record) {
@@ -39,7 +39,7 @@ function _default() {
39
39
  record.fields.forEach(field => {
40
40
  validateField(field, res);
41
41
  });
42
- res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data
42
+ res.valid = !(res.message.length >= 1);
43
43
  return res;
44
44
  }
45
45
  function validateField(field, res) {
@@ -51,7 +51,7 @@ function _default() {
51
51
  const mod = (0, _utils.fieldToString)(normalizedField);
52
52
  if (orig !== mod) {
53
53
  // Fail as the input is "broken"/"crap"/sumthing
54
- res.message.push(`Fix '${orig}' => '${mod}'`); // eslint-disable-line functional/immutable-data
54
+ res.message.push(`Fix '${orig}' => '${mod}'`);
55
55
  return;
56
56
  }
57
57
  return;
@@ -69,7 +69,7 @@ function normalizeField502(field) {
69
69
  }
70
70
 
71
71
  // "a = acd[0]"" is way more readable than "[a] = acd"...
72
- const a = acd[0]; // eslint-disable-line prefer-destructuring
72
+ const a = acd[0];
73
73
  const c = acd[1].code === 'c' ? acd[1] : null;
74
74
  const d = acd[acd.length - 1].code === 'd' ? acd[acd.length - 1] : null;
75
75
 
@@ -79,8 +79,8 @@ function normalizeField502(field) {
79
79
  return field;
80
80
  }
81
81
  const newValue = `${extractA()}--${extractC()}${extractD()}`;
82
- a.value = newValue; // eslint-disable-line functional/immutable-data
83
- field.subfields = field.subfields.filter(sf => !['c', 'd'].includes(sf.code)); // eslint-disable-line functional/immutable-data
82
+ a.value = newValue;
83
+ field.subfields = field.subfields.filter(sf => !['c', 'd'].includes(sf.code));
84
84
  return field;
85
85
  function extractA() {
86
86
  return a.value.replace(/[ ,:]+$/u, '');
@@ -1 +1 @@
1
- {"version":3,"file":"modernize-502.js","names":["_clone","_interopRequireDefault","require","_utils","e","__esModule","default","_default","description","validate","fix","record","res","message","valid","fields","forEach","field","normalizeField502","validateField","length","subfields","orig","fieldToString","normalizedField","clone","mod","push","acd","filter","sf","includes","code","str","map","join","a","c","d","hasValidA","hasValidD","newValue","extractA","extractC","extractD","value","replace","match"],"sources":["../src/modernize-502.js"],"sourcesContent":["//import createDebugLogger from 'debug';\nimport clone from 'clone';\nimport {fieldToString} from './utils';\n\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/modernize-502');\n\n// Author(s): Nicholas Volk\nexport default function () {\n\n return {\n description: 'Normalizes Finnish national convention 502$a$c$d fields to a 502$a (which is better supported by LoC).',\n validate, fix\n };\n\n function fix(record) {\n const res = {message: [], fix: [], valid: true};\n\n record.fields.forEach(field => {\n normalizeField502(field);\n });\n\n // message.valid = !(message.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n record.fields.forEach(field => {\n validateField(field, res);\n });\n\n res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n\n function validateField(field, res) {\n if (!field.subfields) {\n return;\n }\n const orig = fieldToString(field);\n\n const normalizedField = normalizeField502(clone(field));\n const mod = fieldToString(normalizedField);\n if (orig !== mod) { // Fail as the input is \"broken\"/\"crap\"/sumthing\n res.message.push(`Fix '${orig}' => '${mod}'`); // eslint-disable-line functional/immutable-data\n return;\n }\n return;\n }\n}\n\n\nexport function normalizeField502(field) {\n if (!field.subfields) {\n return field;\n }\n const acd = field.subfields.filter(sf => 'acd'.includes(sf.code));\n const str = acd.map(sf => sf.code).join('');\n // Check that we have relevant subfields and that they are in relevant order (with each other):\n if (!['acd', 'ac', 'ad'].includes(str)) {\n return field;\n }\n\n // \"a = acd[0]\"\" is way more readable than \"[a] = acd\"...\n const a = acd[0]; // eslint-disable-line prefer-destructuring\n const c = acd[1].code === 'c' ? acd[1] : null;\n const d = acd[acd.length - 1].code === 'd' ? acd[acd.length - 1] : null;\n\n //console.log(JSON.stringify(d)); // eslint-disable-line no-console\n\n if (!hasValidA() || !hasValidD()) {\n return field;\n }\n\n const newValue = `${extractA()}--${extractC()}${extractD()}`;\n a.value = newValue; // eslint-disable-line functional/immutable-data\n field.subfields = field.subfields.filter(sf => !['c', 'd'].includes(sf.code)); // eslint-disable-line functional/immutable-data\n return field;\n\n function extractA() {\n return a.value.replace(/[ ,:]+$/u, '');\n }\n\n function extractC() {\n if (!c) {\n return '';\n }\n if (c) {\n // Here we assume that there was correct punctuation between $c and $d...\n return `${c.value}${d ? ' ' : ''}`;\n }\n return c.value;\n }\n\n function extractD() {\n return d ? d.value : '';\n }\n\n function hasValidA() {\n // Belongs to https://finto.fi/mts/fi/page/m91\n if (a.value.match(/^(?:AMK-opinnäytetyö|Anbalyysiseminaarityö|Artikkeliväitöskirja|Diplomityö|Erikoistyö|Esseeväitöskirja|Kandidaatintutkielma|Laudaturseminaarityö|Laudaturtyö|Lisensiaatintyö|Lopputyö|Monografiaväitöskirja|Opinnäyte|Opinnäytetyö|Pro gradu -tutkielma|Proseminaarityö|Seminaarityö|Väitöskirja|Ylempi AMK-opinnäytetyö)[, :]*$/u) ||\n a.value.match(/^(?:Analysseminariearbete|Artikelavhandling|Diplomarbete|Doktorsavhandling|Essäavhandling|Högre YH-examensarbete|Kandidatavhandling|Laudaturarbete|Laudaturseminariearbete|Licentiatavhandling|Lärdomsprov|Monografiavhandling|Pro gradu-avhandling|Proseminariearbete|Seminariearbete|Slutarbete|Specialarbete|YH-examesarbete)[:, ]*$/u)) {\n return true;\n }\n return false;\n }\n\n\n function hasValidD() {\n if (!d) { // We can live without $d:\n return true;\n }\n // Content makes sense:\n return d.value.match(/^\\[?(?:[0-9]{4}|[0-9]{4}-[0-9]{4}|1[89]uu|Vuosien [0-9]{4} ja [0-9]{4} välillä)[\\].]{0,2}$/u);\n }\n\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"modernize-502.js","names":["_clone","_interopRequireDefault","require","_utils","e","__esModule","default","_default","description","validate","fix","record","res","message","valid","fields","forEach","field","normalizeField502","validateField","length","subfields","orig","fieldToString","normalizedField","clone","mod","push","acd","filter","sf","includes","code","str","map","join","a","c","d","hasValidA","hasValidD","newValue","extractA","extractC","extractD","value","replace","match"],"sources":["../src/modernize-502.js"],"sourcesContent":["//import createDebugLogger from 'debug';\nimport clone from 'clone';\nimport {fieldToString} from './utils';\n\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/modernize-502');\n\n// Author(s): Nicholas Volk\nexport default function () {\n\n return {\n description: 'Normalizes Finnish national convention 502$a$c$d fields to a 502$a (which is better supported by LoC).',\n validate, fix\n };\n\n function fix(record) {\n const res = {message: [], fix: [], valid: true};\n\n record.fields.forEach(field => {\n normalizeField502(field);\n });\n\n // message.valid = !(message.message.length >= 1);\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n record.fields.forEach(field => {\n validateField(field, res);\n });\n\n res.valid = !(res.message.length >= 1);\n return res;\n }\n\n function validateField(field, res) {\n if (!field.subfields) {\n return;\n }\n const orig = fieldToString(field);\n\n const normalizedField = normalizeField502(clone(field));\n const mod = fieldToString(normalizedField);\n if (orig !== mod) { // Fail as the input is \"broken\"/\"crap\"/sumthing\n res.message.push(`Fix '${orig}' => '${mod}'`);\n return;\n }\n return;\n }\n}\n\n\nexport function normalizeField502(field) {\n if (!field.subfields) {\n return field;\n }\n const acd = field.subfields.filter(sf => 'acd'.includes(sf.code));\n const str = acd.map(sf => sf.code).join('');\n // Check that we have relevant subfields and that they are in relevant order (with each other):\n if (!['acd', 'ac', 'ad'].includes(str)) {\n return field;\n }\n\n // \"a = acd[0]\"\" is way more readable than \"[a] = acd\"...\n const a = acd[0];\n const c = acd[1].code === 'c' ? acd[1] : null;\n const d = acd[acd.length - 1].code === 'd' ? acd[acd.length - 1] : null;\n\n //console.log(JSON.stringify(d)); // eslint-disable-line no-console\n\n if (!hasValidA() || !hasValidD()) {\n return field;\n }\n\n const newValue = `${extractA()}--${extractC()}${extractD()}`;\n a.value = newValue;\n field.subfields = field.subfields.filter(sf => !['c', 'd'].includes(sf.code));\n return field;\n\n function extractA() {\n return a.value.replace(/[ ,:]+$/u, '');\n }\n\n function extractC() {\n if (!c) {\n return '';\n }\n if (c) {\n // Here we assume that there was correct punctuation between $c and $d...\n return `${c.value}${d ? ' ' : ''}`;\n }\n return c.value;\n }\n\n function extractD() {\n return d ? d.value : '';\n }\n\n function hasValidA() {\n // Belongs to https://finto.fi/mts/fi/page/m91\n if (a.value.match(/^(?:AMK-opinnäytetyö|Anbalyysiseminaarityö|Artikkeliväitöskirja|Diplomityö|Erikoistyö|Esseeväitöskirja|Kandidaatintutkielma|Laudaturseminaarityö|Laudaturtyö|Lisensiaatintyö|Lopputyö|Monografiaväitöskirja|Opinnäyte|Opinnäytetyö|Pro gradu -tutkielma|Proseminaarityö|Seminaarityö|Väitöskirja|Ylempi AMK-opinnäytetyö)[, :]*$/u) ||\n a.value.match(/^(?:Analysseminariearbete|Artikelavhandling|Diplomarbete|Doktorsavhandling|Essäavhandling|Högre YH-examensarbete|Kandidatavhandling|Laudaturarbete|Laudaturseminariearbete|Licentiatavhandling|Lärdomsprov|Monografiavhandling|Pro gradu-avhandling|Proseminariearbete|Seminariearbete|Slutarbete|Specialarbete|YH-examesarbete)[:, ]*$/u)) {\n return true;\n }\n return false;\n }\n\n\n function hasValidD() {\n if (!d) { // We can live without $d:\n return true;\n }\n // Content makes sense:\n return d.value.match(/^\\[?(?:[0-9]{4}|[0-9]{4}-[0-9]{4}|1[89]uu|Vuosien [0-9]{4} ja [0-9]{4} välillä)[\\].]{0,2}$/u);\n }\n\n}\n"],"mappings":"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","ignoreList":[]}
@@ -19,7 +19,7 @@ function _default() {
19
19
  function fix(record) {
20
20
  function fixField(field) {
21
21
  const removableSubfields = fieldGetDeletableSubfields(field);
22
- removableSubfields.forEach(sf => record.removeSubfield(sf, field));
22
+ removableSubfields.forEach(sf => record.removeSubfield(sf, field)); // eslint-disable-line array-callback-return
23
23
  }
24
24
  const res = {
25
25
  message: [],
@@ -27,9 +27,9 @@ function _default() {
27
27
  valid: true
28
28
  };
29
29
  const relevantFields = getRelevantFields(record);
30
- relevantFields.forEach(field => fixField(field));
30
+ relevantFields.forEach(field => fixField(field)); // eslint-disable-line array-callback-return
31
31
 
32
- // message.valid = !(message.message.length >= 1); // eslint-disable-line functional/immutable-data
32
+ // message.valid = !(message.message.length >= 1);
33
33
  return res;
34
34
  }
35
35
  function validate(record) {
@@ -45,7 +45,7 @@ function _default() {
45
45
  const res = {
46
46
  message: messages
47
47
  };
48
- res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data
48
+ res.valid = !(res.message.length >= 1);
49
49
  return res;
50
50
  }
51
51
  function fieldGetSubfields(field, code) {
@@ -1 +1 @@
1
- {"version":3,"file":"multiple-subfield-0.js","names":["_utils","require","asteriNamePrefixes","_default","description","validate","fix","record","fixField","field","removableSubfields","fieldGetDeletableSubfields","forEach","sf","removeSubfield","res","message","valid","relevantFields","getRelevantFields","validateField","relevantSubfields","length","fieldToString","map","value","join","messages","fieldGetSubfields","code","subfields","filter","isDeletableNamePartID","match","isAsteriNameId","nineDigitTail","slice","test","currPrefix","includes","neverDropThisID","prefixes","some","prefix","startsWith","fieldHasTitlePart","tag","fieldHasSubfield","subfield0s","nonAsteriNameSubfields","suspiciousSubfields","otherKnownNamePartIdentifiers","fieldIsRelevant","fields"],"sources":["../src/multiple-subfield-0.js"],"sourcesContent":["// import createDebugLogger from 'debug';\n// import clone from 'clone';\n// const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:multiple-subfield-0');\n\nimport {fieldHasSubfield, fieldToString} from './utils';\n\nconst asteriNamePrefixes = ['(FI-ASTERI-N)', '(FIN11)', 'http://urn.fi/URN:NBN:fi:au:finaf:', 'https://urn.fi/URN:NBN:fi:au:finaf:'];\n\nexport default function () {\n\n return {\n description: 'If Asteri subfield $0 is found, remove non-Asteri $0 subfields',\n validate, fix\n };\n\n function fix(record) {\n function fixField(field) {\n const removableSubfields = fieldGetDeletableSubfields(field);\n removableSubfields.forEach(sf => record.removeSubfield(sf, field));\n }\n\n const res = {message: [], fix: [], valid: true};\n\n const relevantFields = getRelevantFields(record);\n\n relevantFields.forEach(field => fixField(field));\n\n // message.valid = !(message.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n\n function validate(record) {\n function validateField(field) {\n const relevantSubfields = fieldGetDeletableSubfields(field);\n if (relevantSubfields.length === 0) {\n return 'TROUBLE';\n }\n return `Field '${fieldToString(field)}' contains deletable $0 subfield(s): ${relevantSubfields.map(sf => sf.value).join(', ')}`;\n }\n const relevantFields = getRelevantFields(record);\n const messages = relevantFields.map(field => validateField(field));\n const res = {message: messages};\n res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n\n function fieldGetSubfields(field, code) {\n return field.subfields.filter(sf => sf.code === code);\n }\n\n function isDeletableNamePartID(value) {\n // List here $0s that always refer to name part, and to never to title part\n if (value.match(/(?:isni|orcid)/ui)) {\n return true;\n }\n return false;\n }\n\n function isAsteriNameId(value) { // This is true if have a valid Asteri entry (nine digits etc)\n const nineDigitTail = value.slice(-9);\n if (!(/^[0-9]{9}$/u).test(nineDigitTail)) {\n return false;\n }\n // Normalize prefix:\n const currPrefix = value.slice(0, -9);\n\n if (asteriNamePrefixes.includes(currPrefix)) {\n return true;\n }\n return false;\n }\n\n function neverDropThisID(value) {\n if (isAsteriNameId(value)) {\n return true;\n }\n\n const prefixes = ['(FIN', '(FI-'];\n if (prefixes.some(prefix => value.startsWith(prefix))) {\n return true;\n }\n\n return false;\n }\n\n\n function fieldHasTitlePart(field) {\n if (['600', '610', '700', '710', '800', '810'].includes(field.tag)) {\n if (fieldHasSubfield(field, 't')) {\n return true;\n }\n }\n return false;\n }\n\n function fieldGetDeletableSubfields(field) {\n const subfield0s = fieldGetSubfields(field, '0');\n\n if (subfield0s.length < 2) {\n return []; // We have nothing to delete\n }\n\n // Field must contain non-Asteri subfields and Asteri subfiels.\n const nonAsteriNameSubfields = subfield0s.filter(sf => !isAsteriNameId(sf.value));\n if (nonAsteriNameSubfields.length === 0 || nonAsteriNameSubfields.length === subfield0s.length) {\n return [];\n }\n\n const suspiciousSubfields = nonAsteriNameSubfields.filter(sf => !neverDropThisID(sf.value));\n\n // Field has deletable name part $0s:\n const otherKnownNamePartIdentifiers = suspiciousSubfields.filter(sf => isDeletableNamePartID(sf.value));\n\n if (fieldHasTitlePart(field)) {\n return otherKnownNamePartIdentifiers;\n }\n\n return suspiciousSubfields;\n }\n\n function fieldIsRelevant(field) {\n const subfields = fieldGetDeletableSubfields(field);\n return subfields.length > 0;\n }\n\n function getRelevantFields(record) {\n return record.fields.filter(field => field.subfields && fieldIsRelevant(field));\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"multiple-subfield-0.js","names":["_utils","require","asteriNamePrefixes","_default","description","validate","fix","record","fixField","field","removableSubfields","fieldGetDeletableSubfields","forEach","sf","removeSubfield","res","message","valid","relevantFields","getRelevantFields","validateField","relevantSubfields","length","fieldToString","map","value","join","messages","fieldGetSubfields","code","subfields","filter","isDeletableNamePartID","match","isAsteriNameId","nineDigitTail","slice","test","currPrefix","includes","neverDropThisID","prefixes","some","prefix","startsWith","fieldHasTitlePart","tag","fieldHasSubfield","subfield0s","nonAsteriNameSubfields","suspiciousSubfields","otherKnownNamePartIdentifiers","fieldIsRelevant","fields"],"sources":["../src/multiple-subfield-0.js"],"sourcesContent":["// import createDebugLogger from 'debug';\n// import clone from 'clone';\n// const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:multiple-subfield-0');\n\nimport {fieldHasSubfield, fieldToString} from './utils';\n\nconst asteriNamePrefixes = ['(FI-ASTERI-N)', '(FIN11)', 'http://urn.fi/URN:NBN:fi:au:finaf:', 'https://urn.fi/URN:NBN:fi:au:finaf:'];\n\nexport default function () {\n\n return {\n description: 'If Asteri subfield $0 is found, remove non-Asteri $0 subfields',\n validate, fix\n };\n\n function fix(record) {\n function fixField(field) {\n const removableSubfields = fieldGetDeletableSubfields(field);\n removableSubfields.forEach(sf => record.removeSubfield(sf, field)); // eslint-disable-line array-callback-return\n }\n\n const res = {message: [], fix: [], valid: true};\n\n const relevantFields = getRelevantFields(record);\n\n relevantFields.forEach(field => fixField(field)); // eslint-disable-line array-callback-return\n\n // message.valid = !(message.message.length >= 1);\n return res;\n }\n\n function validate(record) {\n function validateField(field) {\n const relevantSubfields = fieldGetDeletableSubfields(field);\n if (relevantSubfields.length === 0) {\n return 'TROUBLE';\n }\n return `Field '${fieldToString(field)}' contains deletable $0 subfield(s): ${relevantSubfields.map(sf => sf.value).join(', ')}`;\n }\n const relevantFields = getRelevantFields(record);\n const messages = relevantFields.map(field => validateField(field));\n const res = {message: messages};\n res.valid = !(res.message.length >= 1);\n return res;\n }\n\n function fieldGetSubfields(field, code) {\n return field.subfields.filter(sf => sf.code === code);\n }\n\n function isDeletableNamePartID(value) {\n // List here $0s that always refer to name part, and to never to title part\n if (value.match(/(?:isni|orcid)/ui)) {\n return true;\n }\n return false;\n }\n\n function isAsteriNameId(value) { // This is true if have a valid Asteri entry (nine digits etc)\n const nineDigitTail = value.slice(-9);\n if (!(/^[0-9]{9}$/u).test(nineDigitTail)) {\n return false;\n }\n // Normalize prefix:\n const currPrefix = value.slice(0, -9);\n\n if (asteriNamePrefixes.includes(currPrefix)) {\n return true;\n }\n return false;\n }\n\n function neverDropThisID(value) {\n if (isAsteriNameId(value)) {\n return true;\n }\n\n const prefixes = ['(FIN', '(FI-'];\n if (prefixes.some(prefix => value.startsWith(prefix))) {\n return true;\n }\n\n return false;\n }\n\n\n function fieldHasTitlePart(field) {\n if (['600', '610', '700', '710', '800', '810'].includes(field.tag)) {\n if (fieldHasSubfield(field, 't')) {\n return true;\n }\n }\n return false;\n }\n\n function fieldGetDeletableSubfields(field) {\n const subfield0s = fieldGetSubfields(field, '0');\n\n if (subfield0s.length < 2) {\n return []; // We have nothing to delete\n }\n\n // Field must contain non-Asteri subfields and Asteri subfiels.\n const nonAsteriNameSubfields = subfield0s.filter(sf => !isAsteriNameId(sf.value));\n if (nonAsteriNameSubfields.length === 0 || nonAsteriNameSubfields.length === subfield0s.length) {\n return [];\n }\n\n const suspiciousSubfields = nonAsteriNameSubfields.filter(sf => !neverDropThisID(sf.value));\n\n // Field has deletable name part $0s:\n const otherKnownNamePartIdentifiers = suspiciousSubfields.filter(sf => isDeletableNamePartID(sf.value));\n\n if (fieldHasTitlePart(field)) {\n return otherKnownNamePartIdentifiers;\n }\n\n return suspiciousSubfields;\n }\n\n function fieldIsRelevant(field) {\n const subfields = fieldGetDeletableSubfields(field);\n return subfields.length > 0;\n }\n\n function getRelevantFields(record) {\n return record.fields.filter(field => field.subfields && fieldIsRelevant(field));\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -35,8 +35,6 @@ function _default() {
35
35
  return field.subfields.filter(valueContainsNonBreakingSpace).length > 0;
36
36
  }
37
37
  }
38
-
39
- /* eslint-disable functional/immutable-data,functional/no-conditional-statements */
40
38
  function fix(record) {
41
39
  record.fields.forEach(field => {
42
40
  if (field.value) {
@@ -50,8 +48,6 @@ function _default() {
50
48
  });
51
49
  });
52
50
  }
53
- /* eslint-enable functional/immutable-data,functional/no-conditional-statements */
54
-
55
51
  function valueContainsNonBreakingSpace({
56
52
  value
57
53
  }) {
@@ -1 +1 @@
1
- {"version":3,"file":"non-breaking-space.js","names":["_default","description","validate","fix","record","nonValidFields","fields","filter","field","collectNonValidFields","valid","length","messages","flatMap","tag","subfields","map","sf","code","value","test","valueContainsNonBreakingSpace","forEach","replaceAll","subfield"],"sources":["../src/non-breaking-space.js"],"sourcesContent":["/**\n * Provides interface to validate and fix record fields, which include subfields that contain no-breaking space character\n * @returns {Object} Object containing interfaces required by marc-record-validators-melinda package\n */\nexport default function () {\n return {\n description: 'Handles subfields that contains non-breaking space character',\n validate,\n fix\n };\n\n function validate(record) {\n const nonValidFields = record.fields.filter((field) => collectNonValidFields(field));\n\n const valid = nonValidFields.length === 0;\n const messages = nonValidFields.flatMap(({tag, subfields}) => subfields.map(sf => `Field ${tag} subfield $${sf.code} contains non-breaking space character(s)`));\n\n return valid ? {valid, messages: []} : {valid, messages};\n\n function collectNonValidFields(field) {\n if (field.value) {\n return (/\\u00A0/u).test(field.value);\n }\n\n return field.subfields.filter(valueContainsNonBreakingSpace).length > 0;\n }\n }\n\n /* eslint-disable functional/immutable-data,functional/no-conditional-statements */\n function fix(record) {\n record.fields.forEach((field) => {\n if (field.value) {\n field.value = field.value.replaceAll(/\\u00A0/gu, ' ');\n return;\n }\n\n field.subfields.forEach(subfield => {\n if (valueContainsNonBreakingSpace(subfield)) {\n subfield.value = subfield.value.replaceAll(/\\u00A0/gu, ' ');\n }\n });\n });\n }\n /* eslint-enable functional/immutable-data,functional/no-conditional-statements */\n\n function valueContainsNonBreakingSpace({value}) {\n return (/\\u00A0/u).test(value);\n }\n}\n"],"mappings":";;;;;;AAAA;AACA;AACA;AACA;AACe,SAAAA,SAAA,EAAY;EACzB,OAAO;IACLC,WAAW,EAAE,8DAA8D;IAC3EC,QAAQ;IACRC;EACF,CAAC;EAED,SAASD,QAAQA,CAACE,MAAM,EAAE;IACxB,MAAMC,cAAc,GAAGD,MAAM,CAACE,MAAM,CAACC,MAAM,CAAEC,KAAK,IAAKC,qBAAqB,CAACD,KAAK,CAAC,CAAC;IAEpF,MAAME,KAAK,GAAGL,cAAc,CAACM,MAAM,KAAK,CAAC;IACzC,MAAMC,QAAQ,GAAGP,cAAc,CAACQ,OAAO,CAAC,CAAC;MAACC,GAAG;MAAEC;IAAS,CAAC,KAAKA,SAAS,CAACC,GAAG,CAACC,EAAE,IAAI,SAASH,GAAG,cAAcG,EAAE,CAACC,IAAI,2CAA2C,CAAC,CAAC;IAEhK,OAAOR,KAAK,GAAG;MAACA,KAAK;MAAEE,QAAQ,EAAE;IAAE,CAAC,GAAG;MAACF,KAAK;MAAEE;IAAQ,CAAC;IAExD,SAASH,qBAAqBA,CAACD,KAAK,EAAE;MACpC,IAAIA,KAAK,CAACW,KAAK,EAAE;QACf,OAAQ,SAAS,CAAEC,IAAI,CAACZ,KAAK,CAACW,KAAK,CAAC;MACtC;MAEA,OAAOX,KAAK,CAACO,SAAS,CAACR,MAAM,CAACc,6BAA6B,CAAC,CAACV,MAAM,GAAG,CAAC;IACzE;EACF;;EAEA;EACA,SAASR,GAAGA,CAACC,MAAM,EAAE;IACnBA,MAAM,CAACE,MAAM,CAACgB,OAAO,CAAEd,KAAK,IAAK;MAC/B,IAAIA,KAAK,CAACW,KAAK,EAAE;QACfX,KAAK,CAACW,KAAK,GAAGX,KAAK,CAACW,KAAK,CAACI,UAAU,CAAC,UAAU,EAAE,GAAG,CAAC;QACrD;MACF;MAEAf,KAAK,CAACO,SAAS,CAACO,OAAO,CAACE,QAAQ,IAAI;QAClC,IAAIH,6BAA6B,CAACG,QAAQ,CAAC,EAAE;UAC3CA,QAAQ,CAACL,KAAK,GAAGK,QAAQ,CAACL,KAAK,CAACI,UAAU,CAAC,UAAU,EAAE,GAAG,CAAC;QAC7D;MACF,CAAC,CAAC;IACJ,CAAC,CAAC;EACJ;EACA;;EAEA,SAASF,6BAA6BA,CAAC;IAACF;EAAK,CAAC,EAAE;IAC9C,OAAQ,SAAS,CAAEC,IAAI,CAACD,KAAK,CAAC;EAChC;AACF","ignoreList":[]}
1
+ {"version":3,"file":"non-breaking-space.js","names":["_default","description","validate","fix","record","nonValidFields","fields","filter","field","collectNonValidFields","valid","length","messages","flatMap","tag","subfields","map","sf","code","value","test","valueContainsNonBreakingSpace","forEach","replaceAll","subfield"],"sources":["../src/non-breaking-space.js"],"sourcesContent":["/**\n * Provides interface to validate and fix record fields, which include subfields that contain no-breaking space character\n * @returns {Object} Object containing interfaces required by marc-record-validators-melinda package\n */\nexport default function () {\n return {\n description: 'Handles subfields that contains non-breaking space character',\n validate,\n fix\n };\n\n function validate(record) {\n const nonValidFields = record.fields.filter((field) => collectNonValidFields(field));\n\n const valid = nonValidFields.length === 0;\n const messages = nonValidFields.flatMap(({tag, subfields}) => subfields.map(sf => `Field ${tag} subfield $${sf.code} contains non-breaking space character(s)`));\n\n return valid ? {valid, messages: []} : {valid, messages};\n\n function collectNonValidFields(field) {\n if (field.value) {\n return (/\\u00A0/u).test(field.value);\n }\n\n return field.subfields.filter(valueContainsNonBreakingSpace).length > 0;\n }\n }\n\n function fix(record) {\n record.fields.forEach((field) => {\n if (field.value) {\n field.value = field.value.replaceAll(/\\u00A0/gu, ' ');\n return;\n }\n\n field.subfields.forEach(subfield => {\n if (valueContainsNonBreakingSpace(subfield)) {\n subfield.value = subfield.value.replaceAll(/\\u00A0/gu, ' ');\n }\n });\n });\n }\n\n function valueContainsNonBreakingSpace({value}) {\n return (/\\u00A0/u).test(value);\n }\n}\n"],"mappings":";;;;;;AAAA;AACA;AACA;AACA;AACe,SAAAA,SAAA,EAAY;EACzB,OAAO;IACLC,WAAW,EAAE,8DAA8D;IAC3EC,QAAQ;IACRC;EACF,CAAC;EAED,SAASD,QAAQA,CAACE,MAAM,EAAE;IACxB,MAAMC,cAAc,GAAGD,MAAM,CAACE,MAAM,CAACC,MAAM,CAAEC,KAAK,IAAKC,qBAAqB,CAACD,KAAK,CAAC,CAAC;IAEpF,MAAME,KAAK,GAAGL,cAAc,CAACM,MAAM,KAAK,CAAC;IACzC,MAAMC,QAAQ,GAAGP,cAAc,CAACQ,OAAO,CAAC,CAAC;MAACC,GAAG;MAAEC;IAAS,CAAC,KAAKA,SAAS,CAACC,GAAG,CAACC,EAAE,IAAI,SAASH,GAAG,cAAcG,EAAE,CAACC,IAAI,2CAA2C,CAAC,CAAC;IAEhK,OAAOR,KAAK,GAAG;MAACA,KAAK;MAAEE,QAAQ,EAAE;IAAE,CAAC,GAAG;MAACF,KAAK;MAAEE;IAAQ,CAAC;IAExD,SAASH,qBAAqBA,CAACD,KAAK,EAAE;MACpC,IAAIA,KAAK,CAACW,KAAK,EAAE;QACf,OAAQ,SAAS,CAAEC,IAAI,CAACZ,KAAK,CAACW,KAAK,CAAC;MACtC;MAEA,OAAOX,KAAK,CAACO,SAAS,CAACR,MAAM,CAACc,6BAA6B,CAAC,CAACV,MAAM,GAAG,CAAC;IACzE;EACF;EAEA,SAASR,GAAGA,CAACC,MAAM,EAAE;IACnBA,MAAM,CAACE,MAAM,CAACgB,OAAO,CAAEd,KAAK,IAAK;MAC/B,IAAIA,KAAK,CAACW,KAAK,EAAE;QACfX,KAAK,CAACW,KAAK,GAAGX,KAAK,CAACW,KAAK,CAACI,UAAU,CAAC,UAAU,EAAE,GAAG,CAAC;QACrD;MACF;MAEAf,KAAK,CAACO,SAAS,CAACO,OAAO,CAACE,QAAQ,IAAI;QAClC,IAAIH,6BAA6B,CAACG,QAAQ,CAAC,EAAE;UAC3CA,QAAQ,CAACL,KAAK,GAAGK,QAAQ,CAACL,KAAK,CAACI,UAAU,CAAC,UAAU,EAAE,GAAG,CAAC;QAC7D;MACF,CAAC,CAAC;IACJ,CAAC,CAAC;EACJ;EAEA,SAASF,6BAA6BA,CAAC;IAACF;EAAK,CAAC,EAAE;IAC9C,OAAQ,SAAS,CAAEC,IAAI,CAACD,KAAK,CAAC;EAChC;AACF","ignoreList":[]}
@@ -36,7 +36,7 @@ function _default() {
36
36
  record.fields?.forEach(field => {
37
37
  validateField(field, res);
38
38
  });
39
- res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data
39
+ res.valid = !(res.message.length >= 1);
40
40
  return res;
41
41
  }
42
42
  function validateField(field, res) {
@@ -48,7 +48,7 @@ function _default() {
48
48
  // Fail as the input is "broken"/"crap"/sumthing
49
49
  return;
50
50
  }
51
- res.message.push(`'TODO: ${orig}' => '${mod}'`); // eslint-disable-line functional/immutable-data
51
+ res.message.push(`'TODO: ${orig}' => '${mod}'`);
52
52
  return;
53
53
  }
54
54
  }
@@ -57,14 +57,15 @@ function fixDashes(field) {
57
57
  return field;
58
58
  }
59
59
  (0, _utils.nvdebug)(`Dashing ${(0, _utils.fieldToString)(field)}`);
60
- field.subfields.forEach(sf => subfieldFixDashes(sf));
60
+ field.subfields.forEach(sf => subfieldFixDashes(sf)); // eslint-disable-line array-callback-return
61
+
61
62
  return field;
62
63
  function subfieldFixDashes(subfield) {
63
64
  if ((0, _utils.isControlSubfieldCode)(subfield.code)) {
64
65
  return;
65
66
  }
66
67
  // Normalize dashes U+2010 ... U+2015 to '-':
67
- subfield.value = subfield.value.replace(/[\u2010\u2011\u2012\u2013\u2014\u2015]/ug, '-'); // eslint-disable-line functional/immutable-data
68
+ subfield.value = subfield.value.replace(/[\u2010\u2011\u2012\u2013\u2014\u2015]/ug, '-');
68
69
  }
69
70
  }
70
71
  //# sourceMappingURL=normalize-dashes.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"normalize-dashes.js","names":["_clone","_interopRequireDefault","require","_utils","e","__esModule","default","_default","description","validate","fix","record","nvdebug","fields","forEach","field","fixDashes","res","message","valid","validateField","length","orig","fieldToString","normalizedField","clone","mod","push","subfields","sf","subfieldFixDashes","subfield","isControlSubfieldCode","code","value","replace"],"sources":["../src/normalize-dashes.js"],"sourcesContent":["//import createDebugLogger from 'debug';\nimport clone from 'clone';\nimport {fieldToString, isControlSubfieldCode, nvdebug} from './utils';\n\n// Author(s): Nicholas Volk\nexport default function () {\n\n return {\n description: 'Normalize various dashes to \"-\"',\n validate, fix\n };\n\n function fix(record) {\n nvdebug(`FIX ME`);\n record.fields.forEach(field => {\n fixDashes(field);\n });\n\n const res = {message: [], fix: [], valid: true};\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n nvdebug(`VALIDATE ME`);\n record.fields?.forEach(field => {\n validateField(field, res);\n });\n\n res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n\n function validateField(field, res) {\n const orig = fieldToString(field);\n nvdebug(` VALIDATE FIELD '${orig}'`);\n\n const normalizedField = fixDashes(clone(field));\n const mod = fieldToString(normalizedField);\n if (orig === mod) { // Fail as the input is \"broken\"/\"crap\"/sumthing\n return;\n }\n res.message.push(`'TODO: ${orig}' => '${mod}'`); // eslint-disable-line functional/immutable-data\n return;\n }\n}\n\n\nfunction fixDashes(field) {\n if (!field.subfields) {\n return field;\n }\n\n nvdebug(`Dashing ${fieldToString(field)}`);\n\n field.subfields.forEach(sf => subfieldFixDashes(sf));\n\n return field;\n\n function subfieldFixDashes(subfield) {\n if (isControlSubfieldCode(subfield.code)) {\n return;\n }\n // Normalize dashes U+2010 ... U+2015 to '-':\n subfield.value = subfield.value.replace(/[\\u2010\\u2011\\u2012\\u2013\\u2014\\u2015]/ug, '-'); // eslint-disable-line functional/immutable-data\n }\n\n}\n"],"mappings":";;;;;;AACA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,MAAA,GAAAD,OAAA;AAAsE,SAAAD,uBAAAG,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAFtE;;AAIA;AACe,SAAAG,SAAA,EAAY;EAEzB,OAAO;IACLC,WAAW,EAAE,iCAAiC;IAC9CC,QAAQ;IAAEC;EACZ,CAAC;EAED,SAASA,GAAGA,CAACC,MAAM,EAAE;IACnB,IAAAC,cAAO,EAAC,QAAQ,CAAC;IACjBD,MAAM,CAACE,MAAM,CAACC,OAAO,CAACC,KAAK,IAAI;MAC7BC,SAAS,CAACD,KAAK,CAAC;IAClB,CAAC,CAAC;IAEF,MAAME,GAAG,GAAG;MAACC,OAAO,EAAE,EAAE;MAAER,GAAG,EAAE,EAAE;MAAES,KAAK,EAAE;IAAI,CAAC;IAC/C,OAAOF,GAAG;EACZ;EAEA,SAASR,QAAQA,CAACE,MAAM,EAAE;IACxB,MAAMM,GAAG,GAAG;MAACC,OAAO,EAAE;IAAE,CAAC;IAEzB,IAAAN,cAAO,EAAC,aAAa,CAAC;IACtBD,MAAM,CAACE,MAAM,EAAEC,OAAO,CAACC,KAAK,IAAI;MAC9BK,aAAa,CAACL,KAAK,EAAEE,GAAG,CAAC;IAC3B,CAAC,CAAC;IAEFA,GAAG,CAACE,KAAK,GAAG,EAAEF,GAAG,CAACC,OAAO,CAACG,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC;IACxC,OAAOJ,GAAG;EACZ;EAEA,SAASG,aAAaA,CAACL,KAAK,EAAEE,GAAG,EAAE;IACjC,MAAMK,IAAI,GAAG,IAAAC,oBAAa,EAACR,KAAK,CAAC;IACjC,IAAAH,cAAO,EAAC,oBAAoBU,IAAI,GAAG,CAAC;IAEpC,MAAME,eAAe,GAAGR,SAAS,CAAC,IAAAS,cAAK,EAACV,KAAK,CAAC,CAAC;IAC/C,MAAMW,GAAG,GAAG,IAAAH,oBAAa,EAACC,eAAe,CAAC;IAC1C,IAAIF,IAAI,KAAKI,GAAG,EAAE;MAAE;MAClB;IACF;IACAT,GAAG,CAACC,OAAO,CAACS,IAAI,CAAC,UAAUL,IAAI,SAASI,GAAG,GAAG,CAAC,CAAC,CAAC;IACjD;EACF;AACF;AAGA,SAASV,SAASA,CAACD,KAAK,EAAE;EACxB,IAAI,CAACA,KAAK,CAACa,SAAS,EAAE;IACpB,OAAOb,KAAK;EACd;EAEA,IAAAH,cAAO,EAAC,WAAW,IAAAW,oBAAa,EAACR,KAAK,CAAC,EAAE,CAAC;EAE1CA,KAAK,CAACa,SAAS,CAACd,OAAO,CAACe,EAAE,IAAIC,iBAAiB,CAACD,EAAE,CAAC,CAAC;EAEpD,OAAOd,KAAK;EAEZ,SAASe,iBAAiBA,CAACC,QAAQ,EAAE;IACnC,IAAI,IAAAC,4BAAqB,EAACD,QAAQ,CAACE,IAAI,CAAC,EAAE;MACxC;IACF;IACA;IACAF,QAAQ,CAACG,KAAK,GAAGH,QAAQ,CAACG,KAAK,CAACC,OAAO,CAAC,0CAA0C,EAAE,GAAG,CAAC,CAAC,CAAC;EAC5F;AAEF","ignoreList":[]}
1
+ {"version":3,"file":"normalize-dashes.js","names":["_clone","_interopRequireDefault","require","_utils","e","__esModule","default","_default","description","validate","fix","record","nvdebug","fields","forEach","field","fixDashes","res","message","valid","validateField","length","orig","fieldToString","normalizedField","clone","mod","push","subfields","sf","subfieldFixDashes","subfield","isControlSubfieldCode","code","value","replace"],"sources":["../src/normalize-dashes.js"],"sourcesContent":["//import createDebugLogger from 'debug';\nimport clone from 'clone';\nimport {fieldToString, isControlSubfieldCode, nvdebug} from './utils';\n\n// Author(s): Nicholas Volk\nexport default function () {\n\n return {\n description: 'Normalize various dashes to \"-\"',\n validate, fix\n };\n\n function fix(record) {\n nvdebug(`FIX ME`);\n record.fields.forEach(field => {\n fixDashes(field);\n });\n\n const res = {message: [], fix: [], valid: true};\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n nvdebug(`VALIDATE ME`);\n record.fields?.forEach(field => {\n validateField(field, res);\n });\n\n res.valid = !(res.message.length >= 1);\n return res;\n }\n\n function validateField(field, res) {\n const orig = fieldToString(field);\n nvdebug(` VALIDATE FIELD '${orig}'`);\n\n const normalizedField = fixDashes(clone(field));\n const mod = fieldToString(normalizedField);\n if (orig === mod) { // Fail as the input is \"broken\"/\"crap\"/sumthing\n return;\n }\n res.message.push(`'TODO: ${orig}' => '${mod}'`);\n return;\n }\n}\n\n\nfunction fixDashes(field) {\n if (!field.subfields) {\n return field;\n }\n\n nvdebug(`Dashing ${fieldToString(field)}`);\n\n field.subfields.forEach(sf => subfieldFixDashes(sf)); // eslint-disable-line array-callback-return\n\n return field;\n\n function subfieldFixDashes(subfield) {\n if (isControlSubfieldCode(subfield.code)) {\n return;\n }\n // Normalize dashes U+2010 ... U+2015 to '-':\n subfield.value = subfield.value.replace(/[\\u2010\\u2011\\u2012\\u2013\\u2014\\u2015]/ug, '-');\n }\n\n}\n"],"mappings":";;;;;;AACA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,MAAA,GAAAD,OAAA;AAAsE,SAAAD,uBAAAG,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAFtE;;AAIA;AACe,SAAAG,SAAA,EAAY;EAEzB,OAAO;IACLC,WAAW,EAAE,iCAAiC;IAC9CC,QAAQ;IAAEC;EACZ,CAAC;EAED,SAASA,GAAGA,CAACC,MAAM,EAAE;IACnB,IAAAC,cAAO,EAAC,QAAQ,CAAC;IACjBD,MAAM,CAACE,MAAM,CAACC,OAAO,CAACC,KAAK,IAAI;MAC7BC,SAAS,CAACD,KAAK,CAAC;IAClB,CAAC,CAAC;IAEF,MAAME,GAAG,GAAG;MAACC,OAAO,EAAE,EAAE;MAAER,GAAG,EAAE,EAAE;MAAES,KAAK,EAAE;IAAI,CAAC;IAC/C,OAAOF,GAAG;EACZ;EAEA,SAASR,QAAQA,CAACE,MAAM,EAAE;IACxB,MAAMM,GAAG,GAAG;MAACC,OAAO,EAAE;IAAE,CAAC;IAEzB,IAAAN,cAAO,EAAC,aAAa,CAAC;IACtBD,MAAM,CAACE,MAAM,EAAEC,OAAO,CAACC,KAAK,IAAI;MAC9BK,aAAa,CAACL,KAAK,EAAEE,GAAG,CAAC;IAC3B,CAAC,CAAC;IAEFA,GAAG,CAACE,KAAK,GAAG,EAAEF,GAAG,CAACC,OAAO,CAACG,MAAM,IAAI,CAAC,CAAC;IACtC,OAAOJ,GAAG;EACZ;EAEA,SAASG,aAAaA,CAACL,KAAK,EAAEE,GAAG,EAAE;IACjC,MAAMK,IAAI,GAAG,IAAAC,oBAAa,EAACR,KAAK,CAAC;IACjC,IAAAH,cAAO,EAAC,oBAAoBU,IAAI,GAAG,CAAC;IAEpC,MAAME,eAAe,GAAGR,SAAS,CAAC,IAAAS,cAAK,EAACV,KAAK,CAAC,CAAC;IAC/C,MAAMW,GAAG,GAAG,IAAAH,oBAAa,EAACC,eAAe,CAAC;IAC1C,IAAIF,IAAI,KAAKI,GAAG,EAAE;MAAE;MAClB;IACF;IACAT,GAAG,CAACC,OAAO,CAACS,IAAI,CAAC,UAAUL,IAAI,SAASI,GAAG,GAAG,CAAC;IAC/C;EACF;AACF;AAGA,SAASV,SAASA,CAACD,KAAK,EAAE;EACxB,IAAI,CAACA,KAAK,CAACa,SAAS,EAAE;IACpB,OAAOb,KAAK;EACd;EAEA,IAAAH,cAAO,EAAC,WAAW,IAAAW,oBAAa,EAACR,KAAK,CAAC,EAAE,CAAC;EAE1CA,KAAK,CAACa,SAAS,CAACd,OAAO,CAACe,EAAE,IAAIC,iBAAiB,CAACD,EAAE,CAAC,CAAC,CAAC,CAAC;;EAEtD,OAAOd,KAAK;EAEZ,SAASe,iBAAiBA,CAACC,QAAQ,EAAE;IACnC,IAAI,IAAAC,4BAAqB,EAACD,QAAQ,CAACE,IAAI,CAAC,EAAE;MACxC;IACF;IACA;IACAF,QAAQ,CAACG,KAAK,GAAGH,QAAQ,CAACG,KAAK,CAACC,OAAO,CAAC,0CAA0C,EAAE,GAAG,CAAC;EAC1F;AAEF","ignoreList":[]}
@@ -19,7 +19,7 @@ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e
19
19
 
20
20
  /*
21
21
  function nvdebug(message, func) {
22
- if (func) { // eslint-disable-line functional/no-conditional-statements
22
+ if (func) {
23
23
  func(message);
24
24
  }
25
25
  console.info(message); // eslint-disable-line no-console
@@ -39,7 +39,7 @@ function _default() {
39
39
  fix: [],
40
40
  valid: true
41
41
  };
42
- //message.fix = []; // eslint-disable-line functional/immutable-data
42
+ //message.fix = [];
43
43
 
44
44
  // Actual parsing of all fields
45
45
  /*
@@ -56,7 +56,7 @@ function _default() {
56
56
  //validateField(field, true, message);
57
57
  });
58
58
 
59
- // message.valid = !(message.message.length >= 1); // eslint-disable-line functional/immutable-data
59
+ // message.valid = !(message.message.length >= 1);
60
60
  return res;
61
61
  }
62
62
  function validate(record) {
@@ -75,7 +75,7 @@ function _default() {
75
75
  //nvdebug(` NORMALIZE CONTROL NUMBER VALIDATE ${fieldToString(field)}`, debug);
76
76
  validateField(field, res);
77
77
  });
78
- res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data
78
+ res.valid = !(res.message.length >= 1);
79
79
  return res;
80
80
  }
81
81
  function validateField(field, res) {
@@ -88,7 +88,7 @@ function _default() {
88
88
  const mod = (0, _utils.fieldToString)(normalizedField);
89
89
  if (orig !== mod) {
90
90
  // Fail as the input is "broken"/"crap"/sumthing
91
- res.message.push(`'${orig}' could do with control number identifier normalization`); // eslint-disable-line functional/immutable-data
91
+ res.message.push(`'${orig}' could do with control number identifier normalization`);
92
92
  return;
93
93
  }
94
94
  return;
@@ -204,7 +204,7 @@ function fieldNormalizeControlNumbers(field) {
204
204
  const targetFormat = normalizeAs(field.tag, sf.code);
205
205
  if (targetFormat !== undefined) {
206
206
  //nvdebug(`NORMALIZE SUBFIELD $${sf.code} IN FIELD: '${fieldToString(field)}' TO ${targetFormat}`);
207
- sf.value = normalizeControlSubfieldValue(sf.value, targetFormat); // eslint-disable-line functional/immutable-data
207
+ sf.value = normalizeControlSubfieldValue(sf.value, targetFormat);
208
208
  return;
209
209
  }
210
210
  });
@@ -1 +1 @@
1
- {"version":3,"file":"normalize-identifiers.js","names":["_clone","_interopRequireDefault","require","_utils","e","__esModule","default","_default","description","validate","fix","record","res","message","valid","fields","forEach","field","fieldNormalizeControlNumbers","validateField","length","subfields","normalizedField","clone","orig","fieldToString","mod","push","alephInternal01","alephInternal10","alephInternal11","alephInternal12","alephInternal13","standard01","standard10","standard11","standard12","standard13","both01","ALEPH_INTERNAL","STANDARD","both10","both11","both12","both13","mappings","normalizeNineDigitIDs","value","targetFormat","nineDigitTail","slice","test","currPrefix","isIsni","normalizeIsni","replace","normalizeControlSubfieldValue","normalizedValue","normalizeAs","tag","subfieldCode","includes","undefined","sf","code"],"sources":["../src/normalize-identifiers.js"],"sourcesContent":["// Relocated from melinda-marc-record-merge-reducers (and renamed)\n//import createDebugLogger from 'debug';\nimport clone from 'clone';\nimport {fieldToString} from './utils';\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:normalize-identifiers');\n\n/*\nfunction nvdebug(message, func) {\n if (func) { // eslint-disable-line functional/no-conditional-statements\n func(message);\n }\n console.info(message); // eslint-disable-line no-console\n}\n*/\n\nexport default function () {\n\n // NB! We should and could handle ISNIs here as well.\n return {\n description: 'Normalizes identifiers such as subfield $0 values',\n validate, fix\n };\n\n function fix(record) {\n const res = {message: [], fix: [], valid: true};\n //message.fix = []; // eslint-disable-line functional/immutable-data\n\n // Actual parsing of all fields\n /*\n if (!record.fields) {\n return false;\n }\n */\n\n //nvdebug(`NORMALIZE CONTROL NUMBER FIX`, debug);\n record.fields.forEach(field => {\n //nvdebug(` NORMALIZE CONTROL NUMBER FIX ${fieldToString(field)}`, debug);\n\n fieldNormalizeControlNumbers(field);\n //validateField(field, true, message);\n });\n\n // message.valid = !(message.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n //nvdebug(`NORMALIZE CONTROL NUMBER VALIDATE`, debug);\n // Actual parsing of all fields\n /*\n if (!record.fields) {\n return false;\n }\n */\n\n record.fields.forEach(field => {\n //nvdebug(` NORMALIZE CONTROL NUMBER VALIDATE ${fieldToString(field)}`, debug);\n validateField(field, res);\n });\n\n res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n\n function validateField(field, res) {\n if (!field.subfields) {\n return;\n }\n\n const normalizedField = clone(field);\n fieldNormalizeControlNumbers(normalizedField);\n\n const orig = fieldToString(field);\n const mod = fieldToString(normalizedField);\n if (orig !== mod) { // Fail as the input is \"broken\"/\"crap\"/sumthing\n res.message.push(`'${orig}' could do with control number identifier normalization`); // eslint-disable-line functional/immutable-data\n return;\n }\n\n return;\n }\n}\n\nconst alephInternal01 = '(FIN01)';\nconst alephInternal10 = '(FIN10)';\nconst alephInternal11 = '(FIN11)';\nconst alephInternal12 = '(FIN12)';\nconst alephInternal13 = '(FIN13)';\n\nconst standard01 = '(FI-MELINDA)';\nconst standard10 = '(FI-ASTERI-S)';\nconst standard11 = '(FI-ASTERI-N)';\nconst standard12 = '(FI-ASTERI-A)';\nconst standard13 = '(FI-ASTERI-W)';\n\nconst both01 = {ALEPH_INTERNAL: alephInternal01, STANDARD: standard01};\nconst both10 = {ALEPH_INTERNAL: alephInternal10, STANDARD: standard10};\nconst both11 = {ALEPH_INTERNAL: alephInternal11, STANDARD: standard11};\nconst both12 = {ALEPH_INTERNAL: alephInternal12, STANDARD: standard12};\nconst both13 = {ALEPH_INTERNAL: alephInternal13, STANDARD: standard13};\n\nconst mappings = {\n 'FCC': both01,\n '(FI-ASTERI-A)': both12,\n '(FI-ASTERI-N)': both11,\n '(FI-ASTERI-S)': both10,\n '(FI-ASTERI-W)': both13,\n '(FI-MELINDA)': both01,\n '(FIN01)': both01,\n '(FIN10)': both10,\n '(FIN11)': both11,\n '(FIN12)': both12,\n '(FIN13)': both13,\n 'http://urn.fi/URN:NBN:fi:au:finaf:': both11,\n 'https://urn.fi/URN:NBN:fi:au:finaf:': both11\n};\n\nfunction normalizeNineDigitIDs(value, targetFormat = 'ALEPH_INTERNAL') {\n // $value should be prefix + nine-digits. Do nothing if nine-digit tail condition is not met:\n const nineDigitTail = value.slice(-9);\n if (!(/^[0-9]{9}$/u).test(nineDigitTail)) {\n return value;\n }\n // Normalize prefix:\n const currPrefix = value.slice(0, -9);\n\n if (currPrefix in mappings) {\n //nvdebug(`${currPrefix}, TF:${targetFormat}...`);\n //nvdebug(`${JSON.stringify(mappings[currPrefix])}`);\n return `${mappings[currPrefix][targetFormat]}${nineDigitTail}`;\n }\n return value;\n}\n\nexport function isIsni(value) {\n if ((/^\\(isni\\)(?: ?[0-9]{4}){4}$/u).test(value)) {\n return true;\n }\n if ((/^https:\\/\\/isni.org\\/isni\\/[0-9]{16}$/u).test(value)) {\n return true;\n }\n return false;\n}\n\nexport function normalizeIsni(value) {\n if (isIsni(value)) {\n return `https://isni.org/isni/${value.replace(/[^0-9]/gu, '')}`;\n }\n return value;\n}\n\n\nexport function normalizeControlSubfieldValue(value = '', targetFormat = 'ALEPH_INTERNAL') {\n if (isIsni(value)) {\n return normalizeIsni(value);\n }\n\n const normalizedValue = normalizeNineDigitIDs(value, targetFormat);\n if (normalizedValue !== value) {\n return normalizedValue;\n }\n\n // Something for isni IDs?\n return value;\n}\n\n//export function normalizableSubfieldPrefix(tag, sf) {\nexport function normalizeAs(tag, subfieldCode) {\n //nvdebug(`nAs ${tag}, ${subfieldCode}`);\n if (subfieldCode === '0' || subfieldCode === '1' || subfieldCode === 'w') {\n return 'ALEPH_INTERNAL';\n }\n\n if (tag === '035' && ['a', 'z'].includes(subfieldCode)) {\n return 'STANDARD';\n }\n return undefined;\n}\n\nexport function fieldNormalizeControlNumbers(field) {\n // Rename \"Prefixes\" as \"ControlNumberIdentifiers\"?\n // No, since isni etc... however, just \"ControlNumber\" would do...\n // \"identifiers\" ?\n if (!field.subfields) {\n return;\n }\n\n field.subfields.forEach(sf => {\n const targetFormat = normalizeAs(field.tag, sf.code);\n if (targetFormat !== undefined) {\n //nvdebug(`NORMALIZE SUBFIELD $${sf.code} IN FIELD: '${fieldToString(field)}' TO ${targetFormat}`);\n sf.value = normalizeControlSubfieldValue(sf.value, targetFormat); // eslint-disable-line functional/immutable-data\n return;\n }\n });\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"normalize-identifiers.js","names":["_clone","_interopRequireDefault","require","_utils","e","__esModule","default","_default","description","validate","fix","record","res","message","valid","fields","forEach","field","fieldNormalizeControlNumbers","validateField","length","subfields","normalizedField","clone","orig","fieldToString","mod","push","alephInternal01","alephInternal10","alephInternal11","alephInternal12","alephInternal13","standard01","standard10","standard11","standard12","standard13","both01","ALEPH_INTERNAL","STANDARD","both10","both11","both12","both13","mappings","normalizeNineDigitIDs","value","targetFormat","nineDigitTail","slice","test","currPrefix","isIsni","normalizeIsni","replace","normalizeControlSubfieldValue","normalizedValue","normalizeAs","tag","subfieldCode","includes","undefined","sf","code"],"sources":["../src/normalize-identifiers.js"],"sourcesContent":["// Relocated from melinda-marc-record-merge-reducers (and renamed)\n//import createDebugLogger from 'debug';\nimport clone from 'clone';\nimport {fieldToString} from './utils';\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:normalize-identifiers');\n\n/*\nfunction nvdebug(message, func) {\n if (func) {\n func(message);\n }\n console.info(message); // eslint-disable-line no-console\n}\n*/\n\nexport default function () {\n\n // NB! We should and could handle ISNIs here as well.\n return {\n description: 'Normalizes identifiers such as subfield $0 values',\n validate, fix\n };\n\n function fix(record) {\n const res = {message: [], fix: [], valid: true};\n //message.fix = [];\n\n // Actual parsing of all fields\n /*\n if (!record.fields) {\n return false;\n }\n */\n\n //nvdebug(`NORMALIZE CONTROL NUMBER FIX`, debug);\n record.fields.forEach(field => {\n //nvdebug(` NORMALIZE CONTROL NUMBER FIX ${fieldToString(field)}`, debug);\n\n fieldNormalizeControlNumbers(field);\n //validateField(field, true, message);\n });\n\n // message.valid = !(message.message.length >= 1);\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n //nvdebug(`NORMALIZE CONTROL NUMBER VALIDATE`, debug);\n // Actual parsing of all fields\n /*\n if (!record.fields) {\n return false;\n }\n */\n\n record.fields.forEach(field => {\n //nvdebug(` NORMALIZE CONTROL NUMBER VALIDATE ${fieldToString(field)}`, debug);\n validateField(field, res);\n });\n\n res.valid = !(res.message.length >= 1);\n return res;\n }\n\n function validateField(field, res) {\n if (!field.subfields) {\n return;\n }\n\n const normalizedField = clone(field);\n fieldNormalizeControlNumbers(normalizedField);\n\n const orig = fieldToString(field);\n const mod = fieldToString(normalizedField);\n if (orig !== mod) { // Fail as the input is \"broken\"/\"crap\"/sumthing\n res.message.push(`'${orig}' could do with control number identifier normalization`);\n return;\n }\n\n return;\n }\n}\n\nconst alephInternal01 = '(FIN01)';\nconst alephInternal10 = '(FIN10)';\nconst alephInternal11 = '(FIN11)';\nconst alephInternal12 = '(FIN12)';\nconst alephInternal13 = '(FIN13)';\n\nconst standard01 = '(FI-MELINDA)';\nconst standard10 = '(FI-ASTERI-S)';\nconst standard11 = '(FI-ASTERI-N)';\nconst standard12 = '(FI-ASTERI-A)';\nconst standard13 = '(FI-ASTERI-W)';\n\nconst both01 = {ALEPH_INTERNAL: alephInternal01, STANDARD: standard01};\nconst both10 = {ALEPH_INTERNAL: alephInternal10, STANDARD: standard10};\nconst both11 = {ALEPH_INTERNAL: alephInternal11, STANDARD: standard11};\nconst both12 = {ALEPH_INTERNAL: alephInternal12, STANDARD: standard12};\nconst both13 = {ALEPH_INTERNAL: alephInternal13, STANDARD: standard13};\n\nconst mappings = {\n 'FCC': both01,\n '(FI-ASTERI-A)': both12,\n '(FI-ASTERI-N)': both11,\n '(FI-ASTERI-S)': both10,\n '(FI-ASTERI-W)': both13,\n '(FI-MELINDA)': both01,\n '(FIN01)': both01,\n '(FIN10)': both10,\n '(FIN11)': both11,\n '(FIN12)': both12,\n '(FIN13)': both13,\n 'http://urn.fi/URN:NBN:fi:au:finaf:': both11,\n 'https://urn.fi/URN:NBN:fi:au:finaf:': both11\n};\n\nfunction normalizeNineDigitIDs(value, targetFormat = 'ALEPH_INTERNAL') {\n // $value should be prefix + nine-digits. Do nothing if nine-digit tail condition is not met:\n const nineDigitTail = value.slice(-9);\n if (!(/^[0-9]{9}$/u).test(nineDigitTail)) {\n return value;\n }\n // Normalize prefix:\n const currPrefix = value.slice(0, -9);\n\n if (currPrefix in mappings) {\n //nvdebug(`${currPrefix}, TF:${targetFormat}...`);\n //nvdebug(`${JSON.stringify(mappings[currPrefix])}`);\n return `${mappings[currPrefix][targetFormat]}${nineDigitTail}`;\n }\n return value;\n}\n\nexport function isIsni(value) {\n if ((/^\\(isni\\)(?: ?[0-9]{4}){4}$/u).test(value)) {\n return true;\n }\n if ((/^https:\\/\\/isni.org\\/isni\\/[0-9]{16}$/u).test(value)) {\n return true;\n }\n return false;\n}\n\nexport function normalizeIsni(value) {\n if (isIsni(value)) {\n return `https://isni.org/isni/${value.replace(/[^0-9]/gu, '')}`;\n }\n return value;\n}\n\n\nexport function normalizeControlSubfieldValue(value = '', targetFormat = 'ALEPH_INTERNAL') {\n if (isIsni(value)) {\n return normalizeIsni(value);\n }\n\n const normalizedValue = normalizeNineDigitIDs(value, targetFormat);\n if (normalizedValue !== value) {\n return normalizedValue;\n }\n\n // Something for isni IDs?\n return value;\n}\n\n//export function normalizableSubfieldPrefix(tag, sf) {\nexport function normalizeAs(tag, subfieldCode) {\n //nvdebug(`nAs ${tag}, ${subfieldCode}`);\n if (subfieldCode === '0' || subfieldCode === '1' || subfieldCode === 'w') {\n return 'ALEPH_INTERNAL';\n }\n\n if (tag === '035' && ['a', 'z'].includes(subfieldCode)) {\n return 'STANDARD';\n }\n return undefined;\n}\n\nexport function fieldNormalizeControlNumbers(field) {\n // Rename \"Prefixes\" as \"ControlNumberIdentifiers\"?\n // No, since isni etc... however, just \"ControlNumber\" would do...\n // \"identifiers\" ?\n if (!field.subfields) {\n return;\n }\n\n field.subfields.forEach(sf => {\n const targetFormat = normalizeAs(field.tag, sf.code);\n if (targetFormat !== undefined) {\n //nvdebug(`NORMALIZE SUBFIELD $${sf.code} IN FIELD: '${fieldToString(field)}' TO ${targetFormat}`);\n sf.value = normalizeControlSubfieldValue(sf.value, targetFormat);\n return;\n }\n });\n}\n"],"mappings":"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","ignoreList":[]}
@@ -35,7 +35,7 @@ function _default() {
35
35
  record.fields?.forEach(field => {
36
36
  validateField(field, res);
37
37
  });
38
- res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data
38
+ res.valid = !(res.message.length >= 1);
39
39
  return res;
40
40
  }
41
41
  function validateField(field, res) {
@@ -45,7 +45,7 @@ function _default() {
45
45
  const mod = (0, _utils.fieldToString)(normalizedField);
46
46
  if (orig !== mod) {
47
47
  // Fail as the input is "broken"/"crap"/sumthing
48
- res.message.push(`'TODO: ${orig}' => '${mod}'`); // eslint-disable-line functional/immutable-data
48
+ res.message.push(`'TODO: ${orig}' => '${mod}'`);
49
49
  return;
50
50
  }
51
51
  return;
@@ -55,13 +55,13 @@ function normalizeQualifyingInformationField(field) {
55
55
  if (!['015', '020', '024', '028'].includes(field.tag) || !field.subfields) {
56
56
  return;
57
57
  }
58
- field.subfields.forEach(sf => fixSubfield(sf));
58
+ field.subfields.forEach(sf => fixSubfield(sf)); // eslint-disable-line array-callback-return
59
59
  return;
60
60
  function fixSubfield(sf) {
61
61
  if (sf.code !== 'q') {
62
62
  return;
63
63
  }
64
- sf.value = normalizeValue(sf.value); // eslint-disable-line functional/immutable-data
64
+ sf.value = normalizeValue(sf.value);
65
65
  }
66
66
  function normalizeValue(val) {
67
67
  // Should we do English as well: "coil bound" and "comb-bound" => "spiral-bound" (as per MTS)?
@@ -1 +1 @@
1
- {"version":3,"file":"normalize-qualifying-information.js","names":["_clone","_interopRequireDefault","require","_utils","e","__esModule","default","_default","description","validate","fix","record","fields","forEach","field","normalizeQualifyingInformationField","res","message","valid","validateField","length","orig","fieldToString","normalizedField","clone","mod","push","includes","tag","subfields","sf","fixSubfield","code","value","normalizeValue","val","match"],"sources":["../src/normalize-qualifying-information.js"],"sourcesContent":["//import createDebugLogger from 'debug';\nimport clone from 'clone';\nimport {fieldToString} from './utils';\n\n// Author(s): Nicholas Volk\nexport default function () {\n\n return {\n // Fixes MELINDA-8740\n description: 'Normalize qualifying information (020$q, 015$q, 024$q, 028$q)',\n validate, fix\n };\n\n function fix(record) {\n record.fields.forEach(field => {\n normalizeQualifyingInformationField(field);\n });\n\n const res = {message: [], fix: [], valid: true};\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n record.fields?.forEach(field => {\n validateField(field, res);\n });\n\n res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n\n function validateField(field, res) {\n const orig = fieldToString(field);\n\n const normalizedField = clone(field);\n normalizeQualifyingInformationField(normalizedField);\n const mod = fieldToString(normalizedField);\n if (orig !== mod) { // Fail as the input is \"broken\"/\"crap\"/sumthing\n res.message.push(`'TODO: ${orig}' => '${mod}'`); // eslint-disable-line functional/immutable-data\n return;\n }\n return;\n }\n}\n\n\nfunction normalizeQualifyingInformationField(field) {\n if (!['015', '020', '024', '028'].includes(field.tag) || !field.subfields) {\n return;\n }\n\n field.subfields.forEach(sf => fixSubfield(sf));\n return;\n\n function fixSubfield(sf) {\n if (sf.code !== 'q') {\n return;\n }\n sf.value = normalizeValue(sf.value); // eslint-disable-line functional/immutable-data\n }\n\n function normalizeValue(val) {\n // Should we do English as well: \"coil bound\" and \"comb-bound\" => \"spiral-bound\" (as per MTS)?\n\n if (val.match(/^(?:hft|häftad)[.,]*$/iu)) { // MELINDA-8740\n return 'mjuka pärmar';\n }\n\n if (val.match(/^inb(?:\\.|unden)[.,]*$/iu)) { // MELINDA-8740\n return 'hårda pärmar';\n }\n\n if (val === 'rengaskirja') { // https://www.kiwi.fi/display/melinda/Talonmies+tiedottaa+16.12.2021\n return 'kierreselkä';\n }\n\n if (val === 'ringpärm') { // https://www.kiwi.fi/display/melinda/Talonmies+tiedottaa+16.12.2021\n return 'spiralrygg';\n }\n\n if (val.match(/^nid(?:\\.|ottu)[.,]*$/iu)) { // MELINDA-8740\n return 'pehmeäkantinen';\n }\n\n if (val.match(/^sid(?:\\.|ottu)[.,]*$/iu)) { // MELINDA-8740\n return 'kovakantinen';\n }\n return val;\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"normalize-qualifying-information.js","names":["_clone","_interopRequireDefault","require","_utils","e","__esModule","default","_default","description","validate","fix","record","fields","forEach","field","normalizeQualifyingInformationField","res","message","valid","validateField","length","orig","fieldToString","normalizedField","clone","mod","push","includes","tag","subfields","sf","fixSubfield","code","value","normalizeValue","val","match"],"sources":["../src/normalize-qualifying-information.js"],"sourcesContent":["//import createDebugLogger from 'debug';\nimport clone from 'clone';\nimport {fieldToString} from './utils';\n\n// Author(s): Nicholas Volk\nexport default function () {\n\n return {\n // Fixes MELINDA-8740\n description: 'Normalize qualifying information (020$q, 015$q, 024$q, 028$q)',\n validate, fix\n };\n\n function fix(record) {\n record.fields.forEach(field => {\n normalizeQualifyingInformationField(field);\n });\n\n const res = {message: [], fix: [], valid: true};\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n record.fields?.forEach(field => {\n validateField(field, res);\n });\n\n res.valid = !(res.message.length >= 1);\n return res;\n }\n\n function validateField(field, res) {\n const orig = fieldToString(field);\n\n const normalizedField = clone(field);\n normalizeQualifyingInformationField(normalizedField);\n const mod = fieldToString(normalizedField);\n if (orig !== mod) { // Fail as the input is \"broken\"/\"crap\"/sumthing\n res.message.push(`'TODO: ${orig}' => '${mod}'`);\n return;\n }\n return;\n }\n}\n\n\nfunction normalizeQualifyingInformationField(field) {\n if (!['015', '020', '024', '028'].includes(field.tag) || !field.subfields) {\n return;\n }\n\n field.subfields.forEach(sf => fixSubfield(sf)); // eslint-disable-line array-callback-return\n return;\n\n function fixSubfield(sf) {\n if (sf.code !== 'q') {\n return;\n }\n sf.value = normalizeValue(sf.value);\n }\n\n function normalizeValue(val) {\n // Should we do English as well: \"coil bound\" and \"comb-bound\" => \"spiral-bound\" (as per MTS)?\n\n if (val.match(/^(?:hft|häftad)[.,]*$/iu)) { // MELINDA-8740\n return 'mjuka pärmar';\n }\n\n if (val.match(/^inb(?:\\.|unden)[.,]*$/iu)) { // MELINDA-8740\n return 'hårda pärmar';\n }\n\n if (val === 'rengaskirja') { // https://www.kiwi.fi/display/melinda/Talonmies+tiedottaa+16.12.2021\n return 'kierreselkä';\n }\n\n if (val === 'ringpärm') { // https://www.kiwi.fi/display/melinda/Talonmies+tiedottaa+16.12.2021\n return 'spiralrygg';\n }\n\n if (val.match(/^nid(?:\\.|ottu)[.,]*$/iu)) { // MELINDA-8740\n return 'pehmeäkantinen';\n }\n\n if (val.match(/^sid(?:\\.|ottu)[.,]*$/iu)) { // MELINDA-8740\n return 'kovakantinen';\n }\n return val;\n }\n}\n"],"mappings":";;;;;;AACA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,MAAA,GAAAD,OAAA;AAAsC,SAAAD,uBAAAG,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAFtC;;AAIA;AACe,SAAAG,SAAA,EAAY;EAEzB,OAAO;IACL;IACAC,WAAW,EAAE,+DAA+D;IAC5EC,QAAQ;IAAEC;EACZ,CAAC;EAED,SAASA,GAAGA,CAACC,MAAM,EAAE;IACnBA,MAAM,CAACC,MAAM,CAACC,OAAO,CAACC,KAAK,IAAI;MAC7BC,mCAAmC,CAACD,KAAK,CAAC;IAC5C,CAAC,CAAC;IAEF,MAAME,GAAG,GAAG;MAACC,OAAO,EAAE,EAAE;MAAEP,GAAG,EAAE,EAAE;MAAEQ,KAAK,EAAE;IAAI,CAAC;IAC/C,OAAOF,GAAG;EACZ;EAEA,SAASP,QAAQA,CAACE,MAAM,EAAE;IACxB,MAAMK,GAAG,GAAG;MAACC,OAAO,EAAE;IAAE,CAAC;IAEzBN,MAAM,CAACC,MAAM,EAAEC,OAAO,CAACC,KAAK,IAAI;MAC9BK,aAAa,CAACL,KAAK,EAAEE,GAAG,CAAC;IAC3B,CAAC,CAAC;IAEFA,GAAG,CAACE,KAAK,GAAG,EAAEF,GAAG,CAACC,OAAO,CAACG,MAAM,IAAI,CAAC,CAAC;IACtC,OAAOJ,GAAG;EACZ;EAEA,SAASG,aAAaA,CAACL,KAAK,EAAEE,GAAG,EAAE;IACjC,MAAMK,IAAI,GAAG,IAAAC,oBAAa,EAACR,KAAK,CAAC;IAEjC,MAAMS,eAAe,GAAG,IAAAC,cAAK,EAACV,KAAK,CAAC;IACpCC,mCAAmC,CAACQ,eAAe,CAAC;IACpD,MAAME,GAAG,GAAG,IAAAH,oBAAa,EAACC,eAAe,CAAC;IAC1C,IAAIF,IAAI,KAAKI,GAAG,EAAE;MAAE;MAClBT,GAAG,CAACC,OAAO,CAACS,IAAI,CAAC,UAAUL,IAAI,SAASI,GAAG,GAAG,CAAC;MAC/C;IACF;IACA;EACF;AACF;AAGA,SAASV,mCAAmCA,CAACD,KAAK,EAAE;EAClD,IAAI,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAACa,QAAQ,CAACb,KAAK,CAACc,GAAG,CAAC,IAAI,CAACd,KAAK,CAACe,SAAS,EAAE;IACzE;EACF;EAEAf,KAAK,CAACe,SAAS,CAAChB,OAAO,CAACiB,EAAE,IAAIC,WAAW,CAACD,EAAE,CAAC,CAAC,CAAC,CAAC;EAChD;EAEA,SAASC,WAAWA,CAACD,EAAE,EAAE;IACvB,IAAIA,EAAE,CAACE,IAAI,KAAK,GAAG,EAAE;MACnB;IACF;IACAF,EAAE,CAACG,KAAK,GAAGC,cAAc,CAACJ,EAAE,CAACG,KAAK,CAAC;EACrC;EAEA,SAASC,cAAcA,CAACC,GAAG,EAAE;IAC3B;;IAEA,IAAIA,GAAG,CAACC,KAAK,CAAC,yBAAyB,CAAC,EAAE;MAAE;MAC1C,OAAO,cAAc;IACvB;IAEA,IAAID,GAAG,CAACC,KAAK,CAAC,0BAA0B,CAAC,EAAE;MAAE;MAC3C,OAAO,cAAc;IACvB;IAEA,IAAID,GAAG,KAAK,aAAa,EAAE;MAAE;MAC3B,OAAO,aAAa;IACtB;IAEA,IAAIA,GAAG,KAAK,UAAU,EAAE;MAAE;MACxB,OAAO,YAAY;IACrB;IAEA,IAAIA,GAAG,CAACC,KAAK,CAAC,yBAAyB,CAAC,EAAE;MAAE;MAC1C,OAAO,gBAAgB;IACzB;IAEA,IAAID,GAAG,CAACC,KAAK,CAAC,yBAAyB,CAAC,EAAE;MAAE;MAC1C,OAAO,cAAc;IACvB;IACA,OAAOD,GAAG;EACZ;AACF","ignoreList":[]}
@@ -36,7 +36,7 @@ function _default() {
36
36
  fix: [],
37
37
  valid: true
38
38
  };
39
- //message.fix = []; // eslint-disable-line functional/immutable-data
39
+ //message.fix = [];
40
40
 
41
41
  // Actual parsing of all fields
42
42
  /*
@@ -50,7 +50,7 @@ function _default() {
50
50
  //validateField(field, true, message);
51
51
  });
52
52
 
53
- // message.valid = !(message.message.length >= 1); // eslint-disable-line functional/immutable-data
53
+ // message.valid = !(message.message.length >= 1);
54
54
  return res;
55
55
  }
56
56
  function validate(record) {
@@ -68,7 +68,7 @@ function _default() {
68
68
  record.fields.forEach(field => {
69
69
  validateField(field, res);
70
70
  });
71
- res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data
71
+ res.valid = !(res.message.length >= 1);
72
72
  return res;
73
73
  }
74
74
  function validateField(field, res) {
@@ -80,7 +80,7 @@ function _default() {
80
80
  const mod = (0, _utils.fieldToString)(normalizedField);
81
81
  if (orig !== mod) {
82
82
  // Fail as the input is "broken"/"crap"/sumthing
83
- res.message.push(`'${orig}' requires normalization`); // eslint-disable-line functional/immutable-data
83
+ res.message.push(`'${orig}' requires normalization`);
84
84
  return;
85
85
  }
86
86
  return;
@@ -115,10 +115,10 @@ function fieldFixComposition(field) {
115
115
  //const originalValue = fieldToString(field);
116
116
  //nvdebug(`fFC: '${originalValue}'`, debug);
117
117
  field.subfields.forEach((subfield, index) => {
118
- field.subfields[index].value = fixComposition(subfield.value); // eslint-disable-line functional/immutable-data
118
+ field.subfields[index].value = fixComposition(subfield.value);
119
119
  });
120
120
  //const newValue = fieldToString(field);
121
- //if (originalValue !== newValue) { // eslint-disable-line functional/no-conditional-statements
121
+ //if (originalValue !== newValue) {
122
122
  // debug(`FIXCOMP: '${originalValue}' => '${newValue}'`);
123
123
  //}
124
124
  return field;
@@ -129,7 +129,7 @@ export function fieldRemoveDecomposedDiacritics(field) {
129
129
  // Raison d'être/motivation: "Sirén" and diacriticless "Siren" might refer to a same surname, so this normalization
130
130
  // allows us to compare authors and avoid duplicate fields.
131
131
  field.subfields.forEach((sf) => {
132
- sf.value = removeDecomposedDiacritics(sf.value); // eslint-disable-line functional/immutable-data
132
+ sf.value = removeDecomposedDiacritics(sf.value);
133
133
  });
134
134
 
135
135
  function removeDecomposedDiacritics(value = '') {
@@ -1 +1 @@
1
- {"version":3,"file":"normalize-utf8-diacritics.js","names":["_clone","_interopRequireDefault","require","_unicodeDecomposition","_utils","e","__esModule","default","_default","description","validate","fix","record","res","message","valid","fields","forEach","field","fieldFixComposition","validateField","length","subfields","orig","fieldToString","normalizedField","clone","mod","push","precomposeFinnishLetters","value","replace","fixComposition","match","nongenericNormalization","String","normalize","subfield","index"],"sources":["../src/normalize-utf8-diacritics.js"],"sourcesContent":["//import createDebugLogger from 'debug';\nimport clone from 'clone';\nimport {convert as nongenericNormalization} from './unicode-decomposition';\nimport {fieldToString} from './utils';\n\n// Note that https://github.com/NatLibFi/marc-record-validators-melinda/blob/master/src/unicode-decomposition.js contains\n// similar functionalities. It's less generic and lacks diacritic removal but has it advantages as well.\n\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/normalize-utf-diacritics');\n\n// See also https://github.com/NatLibFi/marc-record-validators-melinda/blob/master/src/unicode-decomposition.js .\n// It uses a list of convertable characters whilst this uses a generic stuff as well.\n// It handles various '.' and '©' type normalizations as well.\n// NB! This version has minor bug/feature issue regarding fixComposition()\n\n// Author(s): Nicholas Volk\nexport default function () {\n\n return {\n description: 'Generic normalization of latin UTF-8 diacritics. Precompose Finnish å, ä and ö. Decompose others.',\n validate, fix\n };\n\n function fix(record) {\n const res = {message: [], fix: [], valid: true};\n //message.fix = []; // eslint-disable-line functional/immutable-data\n\n // Actual parsing of all fields\n /*\n if (!record.fields) {\n return false;\n }\n */\n\n record.fields.forEach(field => {\n fieldFixComposition(field);\n //validateField(field, true, message);\n });\n\n // message.valid = !(message.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n // Actual parsing of all fields\n /*\n if (!record.fields) {\n return false;\n }\n */\n\n record.fields.forEach(field => {\n validateField(field, res);\n });\n\n res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n\n function validateField(field, res) {\n if (!field.subfields) {\n return;\n }\n const orig = fieldToString(field);\n\n const normalizedField = fieldFixComposition(clone(field));\n const mod = fieldToString(normalizedField);\n if (orig !== mod) { // Fail as the input is \"broken\"/\"crap\"/sumthing\n res.message.push(`'${orig}' requires normalization`); // eslint-disable-line functional/immutable-data\n return;\n }\n return;\n }\n}\n\n\n// Traditionally these six are precomposed and all the rest decomposed\nexport function precomposeFinnishLetters(value = '') {\n return value.\n replace(/å/gu, 'å').\n replace(/ä/gu, 'ä').\n replace(/ö/gu, 'ö').\n replace(/Å/gu, 'Å').\n replace(/Ä/gu, 'Ä').\n replace(/Ö/gu, 'Ö');\n}\n\nexport function fixComposition(value = '') {\n // Target: Diacritics use Melinda internal notation.\n // General solution: Decompose everything and then compose 'å', 'ä', 'ö', 'Å', 'Ä' and 'Ö'.\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize\n // Bug/Feature: the generic normalize() function also normalizes non-latin encodings as well, is this ok?\n // Exception: Input contains non-Latin script letters: don't decompose (see field 880 tests):\n if (value.match(/[^\\p{Script=Latin}\\p{Script=Common}\\p{Script=Inherited}]/u)) {\n // Problem with this approach: mixed language content (eg. cyrillic + latin) won't get normalized.\n // Hack/Damage control: we might add decomposition rules for most common diacritis here (eg. ü, é...).\n // OR we could split input to words and handle them separately?\n // NB! Hack not implemented yet. The main source of problematic case would probably be greek characters\n // within texts, that are written with latin alphabet.\n //return precomposeFinnishLetters(value);\n return nongenericNormalization(value);\n }\n return precomposeFinnishLetters(String(value).normalize('NFD'));\n}\n\n\nexport function fieldFixComposition(field) {\n if (!field.subfields) {\n return field;\n }\n //const originalValue = fieldToString(field);\n //nvdebug(`fFC: '${originalValue}'`, debug);\n field.subfields.forEach((subfield, index) => {\n field.subfields[index].value = fixComposition(subfield.value); // eslint-disable-line functional/immutable-data\n });\n //const newValue = fieldToString(field);\n //if (originalValue !== newValue) { // eslint-disable-line functional/no-conditional-statements\n // debug(`FIXCOMP: '${originalValue}' => '${newValue}'`);\n //}\n return field;\n}\n\n/*\nexport function fieldRemoveDecomposedDiacritics(field) {\n // Raison d'être/motivation: \"Sirén\" and diacriticless \"Siren\" might refer to a same surname, so this normalization\n // allows us to compare authors and avoid duplicate fields.\n field.subfields.forEach((sf) => {\n sf.value = removeDecomposedDiacritics(sf.value); // eslint-disable-line functional/immutable-data\n });\n\n function removeDecomposedDiacritics(value = '') {\n // NB #1: Does nothing to precomposed letters. String.normalize('NFD') can handle them.\n // NB #2: Finnish letters 'å', 'ä', 'ö', 'Å', Ä', and 'Ö' should be handled (=precomposed) before calling this.\n // NB #3: Calling our very own fixComposition() before this function handles both #1 and #2.\n return String(value).replace(/\\p{Diacritic}/gu, '');\n }\n}\n*/\n\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"normalize-utf8-diacritics.js","names":["_clone","_interopRequireDefault","require","_unicodeDecomposition","_utils","e","__esModule","default","_default","description","validate","fix","record","res","message","valid","fields","forEach","field","fieldFixComposition","validateField","length","subfields","orig","fieldToString","normalizedField","clone","mod","push","precomposeFinnishLetters","value","replace","fixComposition","match","nongenericNormalization","String","normalize","subfield","index"],"sources":["../src/normalize-utf8-diacritics.js"],"sourcesContent":["//import createDebugLogger from 'debug';\nimport clone from 'clone';\nimport {convert as nongenericNormalization} from './unicode-decomposition';\nimport {fieldToString} from './utils';\n\n// Note that https://github.com/NatLibFi/marc-record-validators-melinda/blob/master/src/unicode-decomposition.js contains\n// similar functionalities. It's less generic and lacks diacritic removal but has it advantages as well.\n\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/normalize-utf-diacritics');\n\n// See also https://github.com/NatLibFi/marc-record-validators-melinda/blob/master/src/unicode-decomposition.js .\n// It uses a list of convertable characters whilst this uses a generic stuff as well.\n// It handles various '.' and '©' type normalizations as well.\n// NB! This version has minor bug/feature issue regarding fixComposition()\n\n// Author(s): Nicholas Volk\nexport default function () {\n\n return {\n description: 'Generic normalization of latin UTF-8 diacritics. Precompose Finnish å, ä and ö. Decompose others.',\n validate, fix\n };\n\n function fix(record) {\n const res = {message: [], fix: [], valid: true};\n //message.fix = [];\n\n // Actual parsing of all fields\n /*\n if (!record.fields) {\n return false;\n }\n */\n\n record.fields.forEach(field => {\n fieldFixComposition(field);\n //validateField(field, true, message);\n });\n\n // message.valid = !(message.message.length >= 1);\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n // Actual parsing of all fields\n /*\n if (!record.fields) {\n return false;\n }\n */\n\n record.fields.forEach(field => {\n validateField(field, res);\n });\n\n res.valid = !(res.message.length >= 1);\n return res;\n }\n\n function validateField(field, res) {\n if (!field.subfields) {\n return;\n }\n const orig = fieldToString(field);\n\n const normalizedField = fieldFixComposition(clone(field));\n const mod = fieldToString(normalizedField);\n if (orig !== mod) { // Fail as the input is \"broken\"/\"crap\"/sumthing\n res.message.push(`'${orig}' requires normalization`);\n return;\n }\n return;\n }\n}\n\n\n// Traditionally these six are precomposed and all the rest decomposed\nexport function precomposeFinnishLetters(value = '') {\n return value.\n replace(/å/gu, 'å').\n replace(/ä/gu, 'ä').\n replace(/ö/gu, 'ö').\n replace(/Å/gu, 'Å').\n replace(/Ä/gu, 'Ä').\n replace(/Ö/gu, 'Ö');\n}\n\nexport function fixComposition(value = '') {\n // Target: Diacritics use Melinda internal notation.\n // General solution: Decompose everything and then compose 'å', 'ä', 'ö', 'Å', 'Ä' and 'Ö'.\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize\n // Bug/Feature: the generic normalize() function also normalizes non-latin encodings as well, is this ok?\n // Exception: Input contains non-Latin script letters: don't decompose (see field 880 tests):\n if (value.match(/[^\\p{Script=Latin}\\p{Script=Common}\\p{Script=Inherited}]/u)) {\n // Problem with this approach: mixed language content (eg. cyrillic + latin) won't get normalized.\n // Hack/Damage control: we might add decomposition rules for most common diacritis here (eg. ü, é...).\n // OR we could split input to words and handle them separately?\n // NB! Hack not implemented yet. The main source of problematic case would probably be greek characters\n // within texts, that are written with latin alphabet.\n //return precomposeFinnishLetters(value);\n return nongenericNormalization(value);\n }\n return precomposeFinnishLetters(String(value).normalize('NFD'));\n}\n\n\nexport function fieldFixComposition(field) {\n if (!field.subfields) {\n return field;\n }\n //const originalValue = fieldToString(field);\n //nvdebug(`fFC: '${originalValue}'`, debug);\n field.subfields.forEach((subfield, index) => {\n field.subfields[index].value = fixComposition(subfield.value);\n });\n //const newValue = fieldToString(field);\n //if (originalValue !== newValue) {\n // debug(`FIXCOMP: '${originalValue}' => '${newValue}'`);\n //}\n return field;\n}\n\n/*\nexport function fieldRemoveDecomposedDiacritics(field) {\n // Raison d'être/motivation: \"Sirén\" and diacriticless \"Siren\" might refer to a same surname, so this normalization\n // allows us to compare authors and avoid duplicate fields.\n field.subfields.forEach((sf) => {\n sf.value = removeDecomposedDiacritics(sf.value);\n });\n\n function removeDecomposedDiacritics(value = '') {\n // NB #1: Does nothing to precomposed letters. String.normalize('NFD') can handle them.\n // NB #2: Finnish letters 'å', 'ä', 'ö', 'Å', Ä', and 'Ö' should be handled (=precomposed) before calling this.\n // NB #3: Calling our very own fixComposition() before this function handles both #1 and #2.\n return String(value).replace(/\\p{Diacritic}/gu, '');\n }\n}\n*/\n\n"],"mappings":"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","ignoreList":[]}