@natlibfi/marc-record-validators-melinda 11.6.5 → 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 +6 -7
  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 +7 -7
  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
package/dist/urn.js CHANGED
@@ -46,7 +46,6 @@ function _default(isLegalDeposit = false, useMelindaTemp = true) {
46
46
  // We probably should not do these additions
47
47
 
48
48
  if (f856sUrn.length === 0) {
49
- // eslint-disable-line functional/no-conditional-statements
50
49
  const {
51
50
  code,
52
51
  value,
@@ -78,9 +77,8 @@ function _default(isLegalDeposit = false, useMelindaTemp = true) {
78
77
  }, ...ldSubfields]
79
78
  });
80
79
  return true;
81
- } else if (isLegalDeposit) {
82
- // eslint-disable-line functional/no-conditional-statements
83
-
80
+ }
81
+ if (isLegalDeposit) {
84
82
  // We add here legal deposit information to all URN-f856s - we probably should not do this
85
83
  // We should add extra f856 URN / URNs for legal deposits that already have a open (non-legal-deposit) URN
86
84
  // How do we decide which URN to use as a template if there are several URNs
@@ -89,16 +87,13 @@ function _default(isLegalDeposit = false, useMelindaTemp = true) {
89
87
  f856sUrn.forEach(f => {
90
88
  // Change phrase from old to new if field with old phrase is found
91
89
  if (f.subfields.some(sf => hasOld856LdPhrase(sf))) {
92
- // eslint-disable-line functional/no-conditional-statements
93
- f.subfields // eslint-disable-line functional/immutable-data
94
- .find(sf => hasOld856LdPhrase(sf)).value = 'Käytettävissä vapaakappaletyöasemilla';
90
+ f.subfields.find(sf => hasOld856LdPhrase(sf)).value = 'Käytettävissä vapaakappaletyöasemilla';
95
91
  }
96
92
 
97
93
  // Create subfields if necessary
98
94
  ldSubfields.forEach(ldsf => {
99
95
  if (!f.subfields.some(sf => sf.code === ldsf.code && sf.value === ldsf.value && !hasOld856LdPhrase(sf))) {
100
- // eslint-disable-line functional/no-conditional-statements
101
- f.subfields.push(ldsf); // eslint-disable-line functional/immutable-data
96
+ f.subfields.push(ldsf);
102
97
  }
103
98
  });
104
99
  });
package/dist/urn.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"urn.js","names":["_nodeFetch","_interopRequireDefault","require","_utils","_debug","e","__esModule","default","URN_GENERATOR_URL","_default","isLegalDeposit","useMelindaTemp","debug","createDebugLogger","debugData","extend","hasLegalDepositURN","field","tag","includes","ind2","subfields","some","sf","code","value","test","description","validate","fix","record","f856sUrn","fields","filter","JSON","stringify","ldSubfields","createLDSubfields","length","generated","createURNSubfield","tempSubField","insertField","ind1","forEach","f","hasOld856LdPhrase","find","ldsf","push","rec","isbn","reduce","acc","a","undefined","createURN","response","fetch","body","text","fieldHasLDSubfields","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 = 'https://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 //console.log(`IS LEGAL DEPOSIT? ${isLegalDeposit ? 'YES' : 'NO'}`); // eslint-disable-line no-console\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 function hasLegalDepositURN(field) {\n if (field.tag !== '856' || ['1', '2', '3', '4'].includes(field.ind2)) {\n return false;\n }\n\n // First attempt to fix MET-573. However, does useMelindaTemp come into play as well?\n if (isLegalDeposit && !field.subfields.some(sf => sf.code === '5' && sf.value === 'FI-Vapaa')) {\n return false;\n }\n\n return field.subfields.some(sf => sf.code === 'u' && (/^https?:\\/\\/urn\\.fi/u).test(sf.value));\n }\n\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(hasLegalDepositURN);\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-statements\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-statements\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 // Change phrase from old to new if field with old phrase is found\n if (f.subfields.some(sf => hasOld856LdPhrase(sf))) { // eslint-disable-line functional/no-conditional-statements\n f.subfields // eslint-disable-line functional/immutable-data\n .find(sf => hasOld856LdPhrase(sf))\n .value = 'Käytettävissä vapaakappaletyöasemilla';\n }\n\n // Create subfields if necessary\n ldSubfields.forEach(ldsf => {\n if (!f.subfields.some(sf => sf.code === ldsf.code && sf.value === ldsf.value && !hasOld856LdPhrase(sf))) { // eslint-disable-line functional/no-conditional-statements\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: `https://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: `https://urn.fi/${body}`};\n }\n }\n\n function hasOld856LdPhrase({code, value}) {\n if (code === 'z' && value === 'Käytettävissä vapaakappalekirjastoissa') {\n return true;\n }\n\n return false;\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ä vapaakappaletyöasemilla'\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(hasLegalDepositURN);\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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","ignoreList":[]}
1
+ {"version":3,"file":"urn.js","names":["_nodeFetch","_interopRequireDefault","require","_utils","_debug","e","__esModule","default","URN_GENERATOR_URL","_default","isLegalDeposit","useMelindaTemp","debug","createDebugLogger","debugData","extend","hasLegalDepositURN","field","tag","includes","ind2","subfields","some","sf","code","value","test","description","validate","fix","record","f856sUrn","fields","filter","JSON","stringify","ldSubfields","createLDSubfields","length","generated","createURNSubfield","tempSubField","insertField","ind1","forEach","f","hasOld856LdPhrase","find","ldsf","push","rec","isbn","reduce","acc","a","undefined","createURN","response","fetch","body","text","fieldHasLDSubfields","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 = 'https://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 //console.log(`IS LEGAL DEPOSIT? ${isLegalDeposit ? 'YES' : 'NO'}`); // eslint-disable-line no-console\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 function hasLegalDepositURN(field) {\n if (field.tag !== '856' || ['1', '2', '3', '4'].includes(field.ind2)) {\n return false;\n }\n\n // First attempt to fix MET-573. However, does useMelindaTemp come into play as well?\n if (isLegalDeposit && !field.subfields.some(sf => sf.code === '5' && sf.value === 'FI-Vapaa')) {\n return false;\n }\n\n return field.subfields.some(sf => sf.code === 'u' && (/^https?:\\/\\/urn\\.fi/u).test(sf.value));\n }\n\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(hasLegalDepositURN);\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) {\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 }\n\n if (isLegalDeposit) {\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 // Change phrase from old to new if field with old phrase is found\n if (f.subfields.some(sf => hasOld856LdPhrase(sf))) {\n f.subfields\n .find(sf => hasOld856LdPhrase(sf))\n .value = 'Käytettävissä vapaakappaletyöasemilla';\n }\n\n // Create subfields if necessary\n ldSubfields.forEach(ldsf => {\n if (!f.subfields.some(sf => sf.code === ldsf.code && sf.value === ldsf.value && !hasOld856LdPhrase(sf))) {\n f.subfields.push(ldsf);\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: `https://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: `https://urn.fi/${body}`};\n }\n }\n\n function hasOld856LdPhrase({code, value}) {\n if (code === 'z' && value === 'Käytettävissä vapaakappalekirjastoissa') {\n return true;\n }\n\n return false;\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ä vapaakappaletyöasemilla'\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(hasLegalDepositURN);\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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","ignoreList":[]}
package/dist/utils.js CHANGED
@@ -43,7 +43,6 @@ function isElectronicMaterial(record) {
43
43
  }
44
44
  function nvdebug(message, func = undefined) {
45
45
  if (func) {
46
- // eslint-disable-line functional/no-conditional-statements
47
46
  func(message);
48
47
  }
49
48
  //console.info(message); // eslint-disable-line no-console
@@ -76,12 +75,11 @@ function recordToString(record) {
76
75
  }
77
76
  function removeSubfield(record, tag, subfieldCode) {
78
77
  record.fields = record.fields.map(field => {
79
- // eslint-disable-line functional/immutable-data
80
78
  if (field.tag !== tag || !field.subfields) {
81
79
  // Don't procss irrelevant fields
82
80
  return field;
83
81
  }
84
- field.subfields = field.subfields.filter(sf => sf.code !== subfieldCode); // eslint-disable-line functional/immutable-data
82
+ field.subfields = field.subfields.filter(sf => sf.code !== subfieldCode);
85
83
  if (field.subfields.length === 0) {
86
84
  return false;
87
85
  }
@@ -90,14 +88,12 @@ function removeSubfield(record, tag, subfieldCode) {
90
88
  }
91
89
  function recordRemoveValuelessSubfields(record) {
92
90
  record.fields = record.fields.map(field => {
93
- // eslint-disable-line functional/immutable-data
94
91
  if (!field.subfields) {
95
92
  // Keep control fields
96
93
  return field;
97
94
  }
98
95
  // Remove empty subfields from datafields:
99
- field.subfields = field.subfields.filter(sf => sf.value); // eslint-disable-line functional/immutable-data
100
-
96
+ field.subfields = field.subfields.filter(sf => sf.value);
101
97
  if (field.subfields && field.subfields.length === 0) {
102
98
  return false; // Return false instead of a field if field has no subfields left. These will soon be filtered out.
103
99
  }
@@ -117,7 +113,7 @@ function fieldsToString(fields) {
117
113
  return fields.map(f => fieldToString(f)).join('\t__SEPARATOR__\t');
118
114
  }
119
115
  function nvdebugFieldArray(fields, prefix = ' ', func = undefined) {
120
- fields.forEach(field => nvdebug(`${prefix}${fieldToString(field)}`, func));
116
+ fields.forEach(field => nvdebug(`${prefix}${fieldToString(field)}`, func)); // eslint-disable-line array-callback-return
121
117
  }
122
118
  function isControlSubfieldCode(subfieldCode) {
123
119
  if (['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'w'].includes(subfieldCode)) {
@@ -158,7 +154,7 @@ function fieldHasNSubfields(field, subfieldCode /*, subfieldValue = null*/) {
158
154
  //return subset.length;
159
155
  }
160
156
  function removeCopyright(value) {
161
- return value.replace(/^(?:c|p|©|℗|Cop\. ?) ?((?:1[0-9][0-9][0-9]|20[012][0-9])\.?)$/ui, '$1'); // eslint-disable-line prefer-named-capture-group
157
+ return value.replace(/^(?:c|p|©|℗|Cop\. ?) ?((?:1[0-9][0-9][0-9]|20[012][0-9])\.?)$/ui, '$1');
162
158
  }
163
159
  function isNonStandardNonrepeatableSubfield(tag, subfieldCode) {
164
160
  // Put these into config or so...
@@ -217,7 +213,7 @@ function marc21GetTagsLegalInd2Value(tag) {
217
213
  return indicator.ind2;
218
214
  }
219
215
  function nvdebugSubfieldArray(subfields, prefix = ' ', func = undefined) {
220
- subfields.forEach(subfield => nvdebug(`${prefix}${subfieldToString(subfield)}`, func));
216
+ subfields.forEach(subfield => nvdebug(`${prefix}${subfieldToString(subfield)}`, func)); // eslint-disable-line array-callback-return
221
217
  }
222
218
  function subfieldsAreIdentical(subfieldA, subfieldB) {
223
219
  return subfieldA.code === subfieldB.code && subfieldA.value === subfieldB.value;
package/dist/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":["_debug","_interopRequireDefault","require","_melindaCustomMergeFields","e","__esModule","default","debug","createDebugLogger","debugDev","extend","isElectronicMaterial","record","f337s","get","length","some","f","fieldHasSubfield","nvdebug","message","func","undefined","field","subfieldCode","subfieldValue","subfields","sf","code","value","subfieldToString","normalizeIndicatorValue","val","recordToString","ldr","leader","fields","map","fieldToString","join","removeSubfield","tag","filter","recordRemoveValuelessSubfields","ind1","ind2","formatSubfields","fieldsToString","nvdebugFieldArray","prefix","forEach","isControlSubfieldCode","includes","getCatalogingLanguage","defaultCatalogingLanguage","field040","b","uniqArray","arr","i","indexOf","fieldsAreIdentical","field1","field2","fieldHasNSubfields","relevantSubfields","removeCopyright","replace","isNonStandardNonrepeatableSubfield","subfieldIsRepeatable","fieldSpecs","melindaFields","subfieldSpecs","subfield","repeatable","marc21GetTagsLegalIndicators","indicators","marc21GetTagsLegalInd1Value","indicator","marc21GetTagsLegalInd2Value","nvdebugSubfieldArray","subfieldsAreIdentical","subfieldA","subfieldB","fieldHasMultipleSubfields","hasCopyright","modValue"],"sources":["../src/utils.js"],"sourcesContent":["import createDebugLogger from 'debug';\n\n//import fs from 'fs';\n//import path from 'path';\n\nconst debug = createDebugLogger('@natlibfi/melinda-marc-record-merge-reducers:utils');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\nimport {melindaCustomMergeFields as melindaFields} from './melindaCustomMergeFields';\n\n//JSON.parse(fs.readFileSync(path.join(__dirname, '..', 'src', 'melindaCustomMergeFields.json'), 'utf8'));\n\nexport function isElectronicMaterial(record) {\n const f337s = record.get('337');\n\n return f337s.length > 0 && f337s.some(f => fieldHasSubfield(f, 'b', 'c') && fieldHasSubfield(f, '2', 'rdamedia'));\n}\n\nexport function nvdebug(message, func = undefined) {\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\nexport function fieldHasSubfield(field, subfieldCode, subfieldValue = null) {\n if (!field.subfields) {\n return false;\n }\n if (subfieldValue === null) {\n return field.subfields.some(sf => sf.code === subfieldCode);\n }\n return field.subfields.some(sf => sf.code === subfieldCode && subfieldValue === sf.value);\n}\n\nexport function subfieldToString(sf) {\n if (!sf.value) {\n return `‡${sf.code}`;\n }\n return `‡${sf.code} ${sf.value}`;\n}\n\nfunction normalizeIndicatorValue(val) {\n if (val === ' ') {\n return '#';\n }\n return val;\n}\n\nexport function recordToString(record) {\n const ldr = `LDR ${record.leader}`;\n const fields = record.fields.map(f => fieldToString(f));\n return `${ldr}\\n${fields.join('\\n')}`;\n}\n\nexport function removeSubfield(record, tag, subfieldCode) {\n record.fields = record.fields.map(field => { // eslint-disable-line functional/immutable-data\n if (field.tag !== tag || !field.subfields) { // Don't procss irrelevant fields\n return field;\n }\n field.subfields = field.subfields.filter(sf => sf.code !== subfieldCode); // eslint-disable-line functional/immutable-data\n if (field.subfields.length === 0) {\n return false;\n }\n return field;\n }).filter(field => field);\n}\n\nexport function recordRemoveValuelessSubfields(record) {\n record.fields = record.fields.map(field => { // eslint-disable-line functional/immutable-data\n if (!field.subfields) { // Keep control fields\n return field;\n }\n // Remove empty subfields from datafields:\n field.subfields = field.subfields.filter(sf => sf.value); // eslint-disable-line functional/immutable-data\n\n if (field.subfields && field.subfields.length === 0) {\n return false; // Return false instead of a field if field has no subfields left. These will soon be filtered out.\n }\n\n return field; //if field has subfields return it\n }).filter(field => field); // Filter those falses out\n}\n\nexport function fieldToString(f) {\n if ('subfields' in f) {\n return `${f.tag} ${normalizeIndicatorValue(f.ind1)}${normalizeIndicatorValue(f.ind2)}${formatSubfields(f)}`;\n }\n return `${f.tag} ${f.value}`;\n\n function formatSubfields(field) {\n return field.subfields.map(sf => ` ${subfieldToString(sf)}`).join('');\n }\n}\n\nexport function fieldsToString(fields) {\n return fields.map(f => fieldToString(f)).join('\\t__SEPARATOR__\\t');\n}\n\nexport function nvdebugFieldArray(fields, prefix = ' ', func = undefined) {\n fields.forEach(field => nvdebug(`${prefix}${fieldToString(field)}`, func));\n}\n\nexport function isControlSubfieldCode(subfieldCode) {\n if (['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'w'].includes(subfieldCode)) {\n return true;\n }\n return false;\n}\n\nexport function getCatalogingLanguage(record, defaultCatalogingLanguage = undefined) {\n const [field040] = record.get(/^040$/u);\n if (!field040) {\n return defaultCatalogingLanguage;\n }\n const [b] = field040.subfields.filter(sf => sf.code === 'b');\n if (!b) {\n return defaultCatalogingLanguage;\n }\n return b.value;\n}\n\n\nexport function uniqArray(arr) {\n return arr.filter((val, i) => arr.indexOf(val) === i);\n}\n\nexport function fieldsAreIdentical(field1, field2) {\n if (field1.tag !== field2.tag) { // NB! We are skipping normalizations here on purpose! They should be done beforehand...\n return false;\n }\n return fieldToString(field1) === fieldToString(field2);\n\n // The order of subfields is relevant! Bloody JS idiotisms make people use conditions such as:\n // return field1.subfields.every(sf => field2.subfields.some(sf2 => sf.code === sf2.code && sf.value === sf2.value));\n}\n\nexport function fieldHasNSubfields(field, subfieldCode/*, subfieldValue = null*/) {\n const relevantSubfields = field.subfields.filter(sf => sf.code === subfieldCode);\n //if (subfieldValue === null) {\n return relevantSubfields.length;\n //}\n //const subset = relevantSubfields.filter(value => value === subfieldValue);\n //return subset.length;\n}\n\nexport function removeCopyright(value) {\n return value.replace(/^(?:c|p|©|℗|Cop\\. ?) ?((?:1[0-9][0-9][0-9]|20[012][0-9])\\.?)$/ui, '$1'); // eslint-disable-line prefer-named-capture-group\n}\n\nfunction isNonStandardNonrepeatableSubfield(tag, subfieldCode) {\n // Put these into config or so...\n if (tag === '264') {\n return ['a', 'b', 'c'].includes(subfieldCode);\n }\n\n if (['336', '337', '338'].includes(tag)) {\n return ['a', 'b', '2'].includes(subfieldCode);\n }\n\n return false;\n}\n\n\nexport function subfieldIsRepeatable(tag, subfieldCode) {\n\n if (isNonStandardNonrepeatableSubfield(tag, subfieldCode)) {\n return false;\n }\n\n // These we know or \"know\":\n // NB! $5 is (according to MARC21 format) non-repeatable, and not usable in all fields, but Melinda has a local exception to this, see MET-300\n if ('0159'.indexOf(subfieldCode) > -1) {\n // Uh, can $0 appear on any field?\n return true;\n }\n\n const fieldSpecs = melindaFields.fields.filter(field => field.tag === tag);\n if (fieldSpecs.length !== 1) {\n nvdebug(` WARNING! Getting field ${tag} data failed! ${fieldSpecs.length} hits. Default value true is used for'${subfieldCode}' .`, debugDev);\n return true;\n }\n\n const subfieldSpecs = fieldSpecs[0].subfields.filter(subfield => subfield.code === subfieldCode);\n // Currently we don't support multiple $6 fields due to re-indexing limitations...\n // Well, $6 is non-repeatable, isn't it?!?\n // (This might actually already be fixed... Marginal issue, but check eventually.)\n if (subfieldSpecs.length !== 1 || subfieldCode === '6') {\n return false; // repeatable if not specified, I guess. Maybe add log or warn?\n }\n return subfieldSpecs[0].repeatable;\n}\n\nfunction marc21GetTagsLegalIndicators(tag) {\n const fieldSpecs = melindaFields.fields.filter(field => field.tag === tag);\n if (fieldSpecs.length === 0) {\n return undefined;\n }\n return fieldSpecs[0].indicators;\n}\n\nexport function marc21GetTagsLegalInd1Value(tag) {\n const indicator = marc21GetTagsLegalIndicators(tag);\n if (indicator === undefined) {\n return undefined;\n }\n return indicator.ind1;\n}\n\nexport function marc21GetTagsLegalInd2Value(tag) {\n const indicator = marc21GetTagsLegalIndicators(tag);\n if (indicator === undefined) {\n return undefined;\n }\n return indicator.ind2;\n}\n\nexport function nvdebugSubfieldArray(subfields, prefix = ' ', func = undefined) {\n subfields.forEach(subfield => nvdebug(`${prefix}${subfieldToString(subfield)}`, func));\n}\n\nexport function subfieldsAreIdentical(subfieldA, subfieldB) {\n return subfieldA.code === subfieldB.code && subfieldA.value === subfieldB.value;\n}\n\nexport function fieldHasMultipleSubfields(field, subfieldCode/*, subfieldValue = null*/) {\n return fieldHasNSubfields(field, subfieldCode) > 1;\n}\n\nexport function hasCopyright(value) {\n const modValue = removeCopyright(value);\n return value !== modValue;\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"utils.js","names":["_debug","_interopRequireDefault","require","_melindaCustomMergeFields","e","__esModule","default","debug","createDebugLogger","debugDev","extend","isElectronicMaterial","record","f337s","get","length","some","f","fieldHasSubfield","nvdebug","message","func","undefined","field","subfieldCode","subfieldValue","subfields","sf","code","value","subfieldToString","normalizeIndicatorValue","val","recordToString","ldr","leader","fields","map","fieldToString","join","removeSubfield","tag","filter","recordRemoveValuelessSubfields","ind1","ind2","formatSubfields","fieldsToString","nvdebugFieldArray","prefix","forEach","isControlSubfieldCode","includes","getCatalogingLanguage","defaultCatalogingLanguage","field040","b","uniqArray","arr","i","indexOf","fieldsAreIdentical","field1","field2","fieldHasNSubfields","relevantSubfields","removeCopyright","replace","isNonStandardNonrepeatableSubfield","subfieldIsRepeatable","fieldSpecs","melindaFields","subfieldSpecs","subfield","repeatable","marc21GetTagsLegalIndicators","indicators","marc21GetTagsLegalInd1Value","indicator","marc21GetTagsLegalInd2Value","nvdebugSubfieldArray","subfieldsAreIdentical","subfieldA","subfieldB","fieldHasMultipleSubfields","hasCopyright","modValue"],"sources":["../src/utils.js"],"sourcesContent":["import createDebugLogger from 'debug';\n\n//import fs from 'fs';\n//import path from 'path';\n\nconst debug = createDebugLogger('@natlibfi/melinda-marc-record-merge-reducers:utils');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\nimport {melindaCustomMergeFields as melindaFields} from './melindaCustomMergeFields';\n\n//JSON.parse(fs.readFileSync(path.join(__dirname, '..', 'src', 'melindaCustomMergeFields.json'), 'utf8'));\n\nexport function isElectronicMaterial(record) {\n const f337s = record.get('337');\n\n return f337s.length > 0 && f337s.some(f => fieldHasSubfield(f, 'b', 'c') && fieldHasSubfield(f, '2', 'rdamedia'));\n}\n\nexport function nvdebug(message, func = undefined) {\n if (func) {\n func(message);\n }\n //console.info(message); // eslint-disable-line no-console\n}\n\nexport function fieldHasSubfield(field, subfieldCode, subfieldValue = null) {\n if (!field.subfields) {\n return false;\n }\n if (subfieldValue === null) {\n return field.subfields.some(sf => sf.code === subfieldCode);\n }\n return field.subfields.some(sf => sf.code === subfieldCode && subfieldValue === sf.value);\n}\n\nexport function subfieldToString(sf) {\n if (!sf.value) {\n return `‡${sf.code}`;\n }\n return `‡${sf.code} ${sf.value}`;\n}\n\nfunction normalizeIndicatorValue(val) {\n if (val === ' ') {\n return '#';\n }\n return val;\n}\n\nexport function recordToString(record) {\n const ldr = `LDR ${record.leader}`;\n const fields = record.fields.map(f => fieldToString(f));\n return `${ldr}\\n${fields.join('\\n')}`;\n}\n\nexport function removeSubfield(record, tag, subfieldCode) {\n record.fields = record.fields.map(field => {\n if (field.tag !== tag || !field.subfields) { // Don't procss irrelevant fields\n return field;\n }\n field.subfields = field.subfields.filter(sf => sf.code !== subfieldCode);\n if (field.subfields.length === 0) {\n return false;\n }\n return field;\n }).filter(field => field);\n}\n\nexport function recordRemoveValuelessSubfields(record) {\n record.fields = record.fields.map(field => {\n if (!field.subfields) { // Keep control fields\n return field;\n }\n // Remove empty subfields from datafields:\n field.subfields = field.subfields.filter(sf => sf.value);\n\n if (field.subfields && field.subfields.length === 0) {\n return false; // Return false instead of a field if field has no subfields left. These will soon be filtered out.\n }\n\n return field; //if field has subfields return it\n }).filter(field => field); // Filter those falses out\n}\n\nexport function fieldToString(f) {\n if ('subfields' in f) {\n return `${f.tag} ${normalizeIndicatorValue(f.ind1)}${normalizeIndicatorValue(f.ind2)}${formatSubfields(f)}`;\n }\n return `${f.tag} ${f.value}`;\n\n function formatSubfields(field) {\n return field.subfields.map(sf => ` ${subfieldToString(sf)}`).join('');\n }\n}\n\nexport function fieldsToString(fields) {\n return fields.map(f => fieldToString(f)).join('\\t__SEPARATOR__\\t');\n}\n\nexport function nvdebugFieldArray(fields, prefix = ' ', func = undefined) {\n fields.forEach(field => nvdebug(`${prefix}${fieldToString(field)}`, func)); // eslint-disable-line array-callback-return\n}\n\nexport function isControlSubfieldCode(subfieldCode) {\n if (['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'w'].includes(subfieldCode)) {\n return true;\n }\n return false;\n}\n\nexport function getCatalogingLanguage(record, defaultCatalogingLanguage = undefined) {\n const [field040] = record.get(/^040$/u);\n if (!field040) {\n return defaultCatalogingLanguage;\n }\n const [b] = field040.subfields.filter(sf => sf.code === 'b');\n if (!b) {\n return defaultCatalogingLanguage;\n }\n return b.value;\n}\n\n\nexport function uniqArray(arr) {\n return arr.filter((val, i) => arr.indexOf(val) === i);\n}\n\nexport function fieldsAreIdentical(field1, field2) {\n if (field1.tag !== field2.tag) { // NB! We are skipping normalizations here on purpose! They should be done beforehand...\n return false;\n }\n return fieldToString(field1) === fieldToString(field2);\n\n // The order of subfields is relevant! Bloody JS idiotisms make people use conditions such as:\n // return field1.subfields.every(sf => field2.subfields.some(sf2 => sf.code === sf2.code && sf.value === sf2.value));\n}\n\nexport function fieldHasNSubfields(field, subfieldCode/*, subfieldValue = null*/) {\n const relevantSubfields = field.subfields.filter(sf => sf.code === subfieldCode);\n //if (subfieldValue === null) {\n return relevantSubfields.length;\n //}\n //const subset = relevantSubfields.filter(value => value === subfieldValue);\n //return subset.length;\n}\n\nexport function removeCopyright(value) {\n return value.replace(/^(?:c|p|©|℗|Cop\\. ?) ?((?:1[0-9][0-9][0-9]|20[012][0-9])\\.?)$/ui, '$1');\n}\n\nfunction isNonStandardNonrepeatableSubfield(tag, subfieldCode) {\n // Put these into config or so...\n if (tag === '264') {\n return ['a', 'b', 'c'].includes(subfieldCode);\n }\n\n if (['336', '337', '338'].includes(tag)) {\n return ['a', 'b', '2'].includes(subfieldCode);\n }\n\n return false;\n}\n\n\nexport function subfieldIsRepeatable(tag, subfieldCode) {\n\n if (isNonStandardNonrepeatableSubfield(tag, subfieldCode)) {\n return false;\n }\n\n // These we know or \"know\":\n // NB! $5 is (according to MARC21 format) non-repeatable, and not usable in all fields, but Melinda has a local exception to this, see MET-300\n if ('0159'.indexOf(subfieldCode) > -1) {\n // Uh, can $0 appear on any field?\n return true;\n }\n\n const fieldSpecs = melindaFields.fields.filter(field => field.tag === tag);\n if (fieldSpecs.length !== 1) {\n nvdebug(` WARNING! Getting field ${tag} data failed! ${fieldSpecs.length} hits. Default value true is used for'${subfieldCode}' .`, debugDev);\n return true;\n }\n\n const subfieldSpecs = fieldSpecs[0].subfields.filter(subfield => subfield.code === subfieldCode);\n // Currently we don't support multiple $6 fields due to re-indexing limitations...\n // Well, $6 is non-repeatable, isn't it?!?\n // (This might actually already be fixed... Marginal issue, but check eventually.)\n if (subfieldSpecs.length !== 1 || subfieldCode === '6') {\n return false; // repeatable if not specified, I guess. Maybe add log or warn?\n }\n return subfieldSpecs[0].repeatable;\n}\n\nfunction marc21GetTagsLegalIndicators(tag) {\n const fieldSpecs = melindaFields.fields.filter(field => field.tag === tag);\n if (fieldSpecs.length === 0) {\n return undefined;\n }\n return fieldSpecs[0].indicators;\n}\n\nexport function marc21GetTagsLegalInd1Value(tag) {\n const indicator = marc21GetTagsLegalIndicators(tag);\n if (indicator === undefined) {\n return undefined;\n }\n return indicator.ind1;\n}\n\nexport function marc21GetTagsLegalInd2Value(tag) {\n const indicator = marc21GetTagsLegalIndicators(tag);\n if (indicator === undefined) {\n return undefined;\n }\n return indicator.ind2;\n}\n\nexport function nvdebugSubfieldArray(subfields, prefix = ' ', func = undefined) {\n subfields.forEach(subfield => nvdebug(`${prefix}${subfieldToString(subfield)}`, func)); // eslint-disable-line array-callback-return\n}\n\nexport function subfieldsAreIdentical(subfieldA, subfieldB) {\n return subfieldA.code === subfieldB.code && subfieldA.value === subfieldB.value;\n}\n\nexport function fieldHasMultipleSubfields(field, subfieldCode/*, subfieldValue = null*/) {\n return fieldHasNSubfields(field, subfieldCode) > 1;\n}\n\nexport function hasCopyright(value) {\n const modValue = removeCopyright(value);\n return value !== modValue;\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,53 @@
1
+ // Eslint configuration object for src
2
+ const configSrc = {
3
+ files: [
4
+ "src/*"
5
+ ],
6
+ linterOptions: {
7
+ reportUnusedDisableDirectives: true,
8
+ },
9
+ rules: {
10
+ "no-console": "warn",
11
+ "eqeqeq": ["error", "always"],
12
+ "no-const-assign": "error",
13
+ "max-depth": ["warn", 4],
14
+ "max-lines": ["warn", 500],
15
+ "max-lines-per-function": ["warn", {"max": 100}],
16
+ "no-else-return": ["error", {allowElseIf: false}],
17
+ "no-plusplus": [
18
+ "error",
19
+ {
20
+ "allowForLoopAfterthoughts": true
21
+ }
22
+ ],
23
+ "array-callback-return": [
24
+ "error",
25
+ {
26
+ "checkForEach": true
27
+ }
28
+ ],
29
+ "no-unused-vars": [
30
+ "error",
31
+ {
32
+ "argsIgnorePattern": "next"
33
+ }
34
+ ],
35
+ "no-warning-comments": "off"
36
+ }
37
+ };
38
+
39
+ // Eslint configuration object for globally ignoring .js files
40
+ // - ignore all files that start with a dot
41
+ // - ignore all files inside directories named 'dist'
42
+ const configIgnores = {
43
+ ignores: [
44
+ "coverage",
45
+ "**/.*",
46
+ "**/dist/"
47
+ ]
48
+ };
49
+
50
+ export default [
51
+ configSrc,
52
+ configIgnores
53
+ ];
package/package.json CHANGED
@@ -14,7 +14,7 @@
14
14
  "url": "git@github.com:natlibfi/marc-record-validators-melinda.git"
15
15
  },
16
16
  "license": "MIT",
17
- "version": "11.6.5",
17
+ "version": "11.6.7-alpha.1",
18
18
  "main": "./dist/index.js",
19
19
  "publishConfig": {
20
20
  "access": "public"
@@ -39,16 +39,16 @@
39
39
  "comment-sfs4900": "Package sfs-4900 npm version is 1.1.0, github 1.1.3.",
40
40
  "dependencies": {
41
41
  "@natlibfi/issn-verify": "^1.0.6",
42
- "@natlibfi/marc-record": "^9.1.5",
42
+ "@natlibfi/marc-record": "^9.1.6",
43
43
  "@natlibfi/marc-record-serializers": "^10.1.6",
44
44
  "@natlibfi/marc-record-validate": "^8.0.14",
45
- "@natlibfi/melinda-commons": "^13.0.20",
45
+ "@natlibfi/melinda-commons": "^13.0.21",
46
46
  "@natlibfi/sfs-4900": "github:NatLibFi/sfs-4900",
47
47
  "@natlibfi/sru-client": "^6.0.18",
48
48
  "cld3-asm": "^4.0.0",
49
49
  "clone": "^2.1.2",
50
50
  "debug": "^4.4.0",
51
- "isbn3": "^1.2.10",
51
+ "isbn3": "^1.2.13",
52
52
  "iso9_1995": "^0.0.2",
53
53
  "langs": "^2.0.0",
54
54
  "node-fetch": "^2.7.0",
@@ -59,22 +59,21 @@
59
59
  "@natlibfi/marc-record-validate": "^8.0.14"
60
60
  },
61
61
  "devDependencies": {
62
- "@babel/cli": "^7.27.2",
63
- "@babel/core": "^7.27.1",
64
- "@babel/preset-env": "^7.27.2",
62
+ "@babel/cli": "^7.28.0",
63
+ "@babel/core": "^7.28.0",
64
+ "@babel/preset-env": "^7.28.0",
65
65
  "@babel/register": "^7.27.1",
66
- "@babel/runtime": "^7.27.1",
67
- "@natlibfi/eslint-config-melinda-backend": "^3.0.5",
68
- "@natlibfi/fixugen": "^2.0.14",
69
- "@natlibfi/fixura": "^3.0.13",
66
+ "@babel/runtime": "^7.28.2",
67
+ "@natlibfi/fixugen": "^2.0.15",
68
+ "@natlibfi/fixura": "^3.0.14",
70
69
  "babel-plugin-istanbul": "^7.0.0",
71
70
  "babel-plugin-rewire": "^1.2.0",
72
71
  "chai": "^4.5.0",
73
72
  "chai-as-promised": "^7.1.2",
74
73
  "cross-env": "^7.0.3",
75
- "eslint": "^8.57.1",
74
+ "eslint": "^9.33.0",
76
75
  "fetch-mock": "^11.1.5",
77
- "mocha": "^11.4.0",
76
+ "mocha": "^11.7.1",
78
77
  "nyc": "^17.1.0"
79
78
  },
80
79
  "overrides": {
@@ -9,7 +9,7 @@ export default function (isViolaRecord = false) {
9
9
  // If printed do nothing
10
10
 
11
11
  // If material is electronic add theis if missing
12
- if (!hasTag(record, '506', sf506) && !hasTag(record, '506', sf506old)) { // eslint-disable-line functional/no-conditional-statements
12
+ if (!hasTag(record, '506', sf506) && !hasTag(record, '506', sf506old)) {
13
13
  const subfield9 = isViolaRecord ? [{code: '9', value: 'VIOLA<KEEP>'}] : [{code: '9', value: 'FENNI<KEEP>'}];
14
14
  const staticSubfields = [
15
15
  {
@@ -35,14 +35,14 @@ export default function (isViolaRecord = false) {
35
35
  }
36
36
 
37
37
  // Change phrase from old to new if field with old phrase is found
38
- if (!hasTag(record, '506', sf506) && hasTag(record, '506', sf506old)) { // eslint-disable-line functional/no-conditional-statements
39
- record.fields // eslint-disable-line functional/immutable-data
38
+ if (!hasTag(record, '506', sf506) && hasTag(record, '506', sf506old)) {
39
+ record.fields
40
40
  .find(f => f.tag === '506' && sf506old.every(({code, value}) => f.subfields.some(sf => sf.code === code && value.test(sf.value))))
41
41
  .subfields.find(sf => sf506old.every(({code, value}) => sf.code === code && value.test(sf.value)))
42
42
  .value = 'Aineisto on käytettävissä vapaakappaletyöasemilla.';
43
43
  }
44
44
 
45
- if (!hasTag(record, '540', sf540) && !isViolaRecord) { // eslint-disable-line functional/no-conditional-statements
45
+ if (!hasTag(record, '540', sf540) && !isViolaRecord) {
46
46
  record.insertField({
47
47
  tag: '540',
48
48
  subfields: [
@@ -21,7 +21,7 @@ export default function () {
21
21
  // 336 ## ‡a tietokoneohjelma ‡b cop ‡2 rdacontent
22
22
  const res = {message: [], fix: [], valid: true};
23
23
  if (newFields.length) {
24
- newFields.forEach(f => record.insertField(f));
24
+ newFields.forEach(f => record.insertField(f)); // eslint-disable-line array-callback-return
25
25
  return res;
26
26
  }
27
27
  return res;
@@ -50,15 +50,15 @@ export default function () {
50
50
  }
51
51
 
52
52
  // Update LDR/17 to '4'
53
- record.leader = `${record.leader.substring(0, 17)}4${record.leader.substring(18, 24)}`; // eslint-disable-line functional/immutable-data
53
+ record.leader = `${record.leader.substring(0, 17)}4${record.leader.substring(18, 24)}`;
54
54
 
55
55
  // Remove unwanted fields:
56
- record.fields = record.fields.filter(f => !dropTags.includes(f.tag)); // eslint-disable-line functional/immutable-data
56
+ record.fields = record.fields.filter(f => !dropTags.includes(f.tag));
57
57
 
58
58
  removeSubfield(record, '020', 'c');
59
59
 
60
60
  // Remove 084 fields that don't have $2 ykl (based on USEMARCON-RDA/bw_rda_kyril.rul code by LL 2019)
61
- record.fields = record.fields.filter(f => f.tag !== '084' || f.subfields.some(sf => sf.code === '2' && sf.value === 'ykl')); // eslint-disable-line functional/immutable-data
61
+ record.fields = record.fields.filter(f => f.tag !== '084' || f.subfields.some(sf => sf.code === '2' && sf.value === 'ykl'));
62
62
 
63
63
  fieldSpecificStuff(record.fields);
64
64
 
@@ -93,7 +93,7 @@ export default function () {
93
93
 
94
94
  function field100eKirjoittaja(f) { // LL 2019 USEMARCON-RDA rule
95
95
  if (f.tag === '100' && !fieldHasSubfield(f, 'e') && record.isBK()) {
96
- f.subfields = [{code: 'e', value: 'kirjoittaja.'}, ...f.subfields]; // eslint-disable-line functional/immutable-data
96
+ f.subfields = [{code: 'e', value: 'kirjoittaja.'}, ...f.subfields];
97
97
  sortAdjacentSubfields(f);
98
98
  // Punctuation will be done later on...
99
99
  return;
@@ -121,7 +121,7 @@ export default function () {
121
121
 
122
122
  // Field 028: use $b$a, not $a$b:
123
123
  const f028 = record.fields.filter(f => f.tag === '028');
124
- f028.forEach(f => sortAdjacentSubfields(f));
124
+ f028.forEach(f => sortAdjacentSubfields(f)); // eslint-disable-line array-callback-return
125
125
 
126
126
  add041().fix(record);
127
127
 
@@ -187,12 +187,12 @@ function fixField040(record) {
187
187
  return;
188
188
  }
189
189
 
190
- f040.forEach(f => fixField040Subfields(f));
190
+ f040.forEach(f => fixField040Subfields(f)); // eslint-disable-line array-callback-return
191
191
 
192
192
  function fixField040Subfields(field) {
193
- field.subfields = field.subfields.filter(sf => !['b', 'e'].includes(sf.code)); // eslint-disable-line functional/immutable-data
194
- field.subfields.push(subfieldsBE[0]); // eslint-disable-line functional/immutable-data
195
- field.subfields.push(subfieldsBE[1]); // eslint-disable-line functional/immutable-data
193
+ field.subfields = field.subfields.filter(sf => !['b', 'e'].includes(sf.code));
194
+ field.subfields.push(subfieldsBE[0]);
195
+ field.subfields.push(subfieldsBE[1]);
196
196
  sortAdjacentSubfields(field); // put $b and $e to their proper places
197
197
  }
198
198
 
@@ -203,13 +203,13 @@ export function removeFromOldCatalog(field) {
203
203
  return;
204
204
  }
205
205
  // See https://catalog.loc.gov/vwebv/ui/en_US/htdocs/help/faqs.html for motivation
206
- field.subfields?.forEach(sf => removeFromOldCatalogFromSubfield(sf));
206
+ field.subfields?.forEach(sf => removeFromOldCatalogFromSubfield(sf)); // eslint-disable-line array-callback-return
207
207
 
208
208
  function removeFromOldCatalogFromSubfield(subfield) {
209
209
  if (!subfield.value.includes('[from old catalog]')) {
210
210
  return;
211
211
  }
212
- subfield.value = subfield.value.replace(/ *\[from old catalog\]/gui, ''); // eslint-disable-line functional/immutable-data
212
+ subfield.value = subfield.value.replace(/ *\[from old catalog\]/gui, '');
213
213
  }
214
214
  }
215
215
 
@@ -220,7 +220,7 @@ function removeSubfieldH(field) {
220
220
 
221
221
  const filteredFields = field.subfields.filter(sf => sf.code !== 'h');
222
222
  if (filteredFields.length > 0) {
223
- field.subfields = filteredFields; // eslint-disable-line functional/immutable-data
223
+ field.subfields = filteredFields;
224
224
  return;
225
225
  }
226
226
 
@@ -234,11 +234,11 @@ export function removeOwnershipSubfield5(field) {
234
234
  if (remainingSubfields.length === 0) { // sanity check/robustness
235
235
  return;
236
236
  }
237
- field.subfields = remainingSubfields; // eslint-disable-line functional/immutable-data
237
+ field.subfields = remainingSubfields;
238
238
  }
239
239
 
240
240
  export function fixLeader(record) {
241
- record.leader = `${record.leader.substring(0, 9)}a22${record.leader.substring(12, 18)}i${record.leader.substring(19, 20)}4500`; // eslint-disable-line functional/immutable-data
241
+ record.leader = `${record.leader.substring(0, 9)}a22${record.leader.substring(12, 18)}i${record.leader.substring(19, 20)}4500`;
242
242
  }
243
243
 
244
244
  function field410To490And810(field, record) { // might be generic... if so, move to utils...
@@ -248,15 +248,15 @@ function field410To490And810(field, record) { // might be generic... if so, move
248
248
 
249
249
  const field810 = clone(field);
250
250
 
251
- field.tag = '490'; // eslint-disable-line functional/immutable-data
252
- field.ind1 = '1'; // eslint-disable-line functional/immutable-data
253
- field.ind2 = ' '; // eslint-disable-line functional/immutable-data
251
+ field.tag = '490';
252
+ field.ind1 = '1';
253
+ field.ind2 = ' ';
254
254
  sortAdjacentSubfields(field);
255
255
  // 490: Fix punctuation elsewhere. (Note that the current support is lagging...)
256
256
 
257
257
 
258
- field810.tag = '810'; // eslint-disable-line functional/immutable-data
259
- field810.ind2 = ' '; // eslint-disable-line functional/immutable-data
258
+ field810.tag = '810';
259
+ field810.ind2 = ' ';
260
260
  // 810: Fix punctuation elsewhere. (Note that the current support is lagging...)
261
261
  record.insertField(field810);
262
262
  }
@@ -268,11 +268,11 @@ function field440To490And830(field, record) { // might be generic... if so, move
268
268
 
269
269
  const field830 = clone(field);
270
270
 
271
- field.tag = '490'; // eslint-disable-line functional/immutable-data
272
- field.ind1 = '1'; // eslint-disable-line functional/immutable-data
273
- field.ind2 = ' '; // eslint-disable-line functional/immutable-data
271
+ field.tag = '490';
272
+ field.ind1 = '1';
273
+ field.ind2 = ' ';
274
274
  // 490: Fix punctuation elsewhere. (Note that the current support is lagging...)
275
- field830.tag = '830'; // eslint-disable-line functional/immutable-data
275
+ field830.tag = '830';
276
276
  // 830: Fix punctuation elsewhere. (Note that the current support is lagging...)
277
277
  record.insertField(field830);
278
278
  }
@@ -290,9 +290,9 @@ function field260To264s(field, record) { // might be generic... if so, move to u
290
290
 
291
291
  createCopyright264Field(field);
292
292
 
293
- field.tag = '264'; // eslint-disable-line functional/immutable-data
294
- field.ind1 = ' '; // eslint-disable-line functional/immutable-data
295
- field.ind2 = '1'; // eslint-disable-line functional/immutable-data
293
+ field.tag = '264';
294
+ field.ind1 = ' ';
295
+ field.ind2 = '1';
296
296
 
297
297
  // NB! Usemarcon does not handle 260$e$f$g => 264$a$b$c, so I'm not botherin with it either... (However, we could check our merge reducer code...)
298
298
 
@@ -303,10 +303,10 @@ function field260To264s(field, record) { // might be generic... if so, move to u
303
303
  return false;
304
304
  }
305
305
 
306
- field.subfields?.forEach(sf => field260To264Normalization(sf));
306
+ field.subfields?.forEach(sf => field260To264Normalization(sf)); // eslint-disable-line array-callback-return
307
307
 
308
308
  function field260To264Normalization(subfield) {
309
- subfield.value = field260To264Normalization2(subfield); // eslint-disable-line functional/immutable-data
309
+ subfield.value = field260To264Normalization2(subfield);
310
310
  }
311
311
 
312
312
  function createCopyright264Value(field) {
@@ -322,7 +322,7 @@ function field260To264s(field, record) { // might be generic... if so, move to u
322
322
  const copType = c.value.match(/(?:^\[?p|℗)/u) ? '℗' : '©';
323
323
  const returnValue = c.value.includes('[') ? `[${copType}${copyrightYear}]` : `${copType}${copyrightYear}`;
324
324
  // Moidy the original value:
325
- c.value = `[${copyrightYear}]`; // eslint-disable-line functional/immutable-data
325
+ c.value = `[${copyrightYear}]`;
326
326
  return returnValue;
327
327
  }
328
328
 
@@ -365,12 +365,12 @@ function handle505(field) {
365
365
  return;
366
366
  }
367
367
  // Don't know how/why usemarcon-cyrillux is so sure about ind1...
368
- field.ind1 = '0'; // eslint-disable-line functional/immutable-data
368
+ field.ind1 = '0';
369
369
  // usemarcon-cyrillux drops irrelevant subfields, so we do the same. However, we have included some control subfields in the kept side:
370
370
  const keptSubfields = field.subfields.filter(sf => ['a', 'g', 'r', 't', 'u', '6', '8', '9'].includes(sf.code));
371
371
 
372
372
  if (keptSubfields.some(sf => ['a', 'g', 'r', 't', 'u'].includes(sf.code))) {
373
- field.subfields = keptSubfields; // eslint-disable-line functional/immutable-data
373
+ field.subfields = keptSubfields;
374
374
  return;
375
375
  }
376
376
  }
@@ -380,15 +380,15 @@ function translateFieldToFinnish(field) {
380
380
  if (!['020', '300'].includes(field.tag)) {
381
381
  return;
382
382
  }
383
- field.subfields?.forEach(sf => translateSubfieldToFinnish(sf));
383
+ field.subfields?.forEach(sf => translateSubfieldToFinnish(sf)); // eslint-disable-line array-callback-return
384
384
 
385
385
  function translateSubfieldToFinnish(subfield) {
386
386
  if (field.tag === '020' && ['a', 'q', 'z'].includes(subfield.code)) {
387
- subfield.value = finnishTranslationsAndMappings(expandFinnishAbbreviations(expandSwedishAbbreviations(expandEnglishAbbreviations(subfield.value)))); // eslint-disable-line functional/immutable-data
387
+ subfield.value = finnishTranslationsAndMappings(expandFinnishAbbreviations(expandSwedishAbbreviations(expandEnglishAbbreviations(subfield.value))));
388
388
  return;
389
389
  }
390
390
  if (field.tag === '300') {
391
- subfield.value = finnishTranslationsAndMappings(expandFinnishAbbreviations(expandSwedishAbbreviations(expandEnglishAbbreviations(subfield.value)))); // eslint-disable-line functional/immutable-data
391
+ subfield.value = finnishTranslationsAndMappings(expandFinnishAbbreviations(expandSwedishAbbreviations(expandEnglishAbbreviations(subfield.value))));
392
392
  return;
393
393
  }
394
394
  }
@@ -424,7 +424,7 @@ function expandFinnishAbbreviations(value) {
424
424
  replace(/\bnid\./gu, 'nidottu').replace(/\bnid\b/gui, 'nidottu').
425
425
  replace(/\bsid\./gu, 'sidottu').replace(/\bsid\b/gui, 'sidottu').
426
426
  replace(/\bverkkojulk\.\b/gu, 'verkkojulkaisu').replace(/\bverkkojulk\b/gu, 'verkkojulkaisu').
427
- replace(/^\(([^)]+)\)$/u, '$1'); // eslint-disable-line prefer-named-capture-group
427
+ replace(/^\(([^)]+)\)$/u, '$1');
428
428
  // <- removal of brackets above could use a better location
429
429
  }
430
430
 
@@ -443,9 +443,9 @@ function finnishTranslationsAndMappings(value) {
443
443
  replace(/\bbilaga\b/gui, 'liite').
444
444
  replace(/\bbilagor\b/gui, 'liitettä').
445
445
  // https://github.com/NatLibFi/USEMARCON-BOOKWHERE-RDA/blob/master/bw_rda_kyril.rul#L365
446
- replace(/(\b1\]?) с\./gui, '$1 sivu'). // eslint-disable-line prefer-named-capture-group
447
- replace(/(\d\]?) с\./gui, '$1 sivua'). // eslint-disable-line prefer-named-capture-group
448
- replace(/(\d) см/gui, '$1 cm'). // eslint-disable-line prefer-named-capture-group
446
+ replace(/(\b1\]?) с\./gui, '$1 sivu').
447
+ replace(/(\d\]?) с\./gui, '$1 sivua').
448
+ replace(/(\d) см/gui, '$1 cm').
449
449
 
450
450
  replace(/\bcharts\b/gui, 'kaavioita').
451
451
  replace('chiefly color illustrations', 'pääosin värikuvitettu').