@natlibfi/marc-record-validators-melinda 11.6.7-alpha.1 → 12.0.0-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 (545) hide show
  1. package/.github/workflows/melinda-node-tests.yml +1 -1
  2. package/dist/access-rights.js +63 -91
  3. package/dist/access-rights.js.map +7 -1
  4. package/dist/access-rights.test.js +137 -0
  5. package/dist/access-rights.test.js.map +7 -0
  6. package/dist/addMissingField041.js +21 -53
  7. package/dist/addMissingField041.js.map +7 -1
  8. package/dist/addMissingField041.test.js +39 -0
  9. package/dist/addMissingField041.test.js.map +7 -0
  10. package/dist/addMissingField336.js +99 -191
  11. package/dist/addMissingField336.js.map +7 -1
  12. package/dist/addMissingField336.test.js +39 -0
  13. package/dist/addMissingField336.test.js.map +7 -0
  14. package/dist/addMissingField337.js +63 -132
  15. package/dist/addMissingField337.js.map +7 -1
  16. package/dist/addMissingField337.test.js +39 -0
  17. package/dist/addMissingField337.test.js.map +7 -0
  18. package/dist/addMissingField338.js +147 -253
  19. package/dist/addMissingField338.js.map +7 -1
  20. package/dist/addMissingField338.test.js +39 -0
  21. package/dist/addMissingField338.test.js.map +7 -0
  22. package/dist/cyrillux-usemarcon-replacement.js +119 -272
  23. package/dist/cyrillux-usemarcon-replacement.js.map +7 -1
  24. package/dist/cyrillux-usemarcon-replacement.test.js +46 -0
  25. package/dist/cyrillux-usemarcon-replacement.test.js.map +7 -0
  26. package/dist/cyrillux.js +119 -223
  27. package/dist/cyrillux.js.map +7 -1
  28. package/dist/cyrillux.test.js +39 -0
  29. package/dist/cyrillux.test.js.map +7 -0
  30. package/dist/disambiguateSeriesStatements.js +40 -81
  31. package/dist/disambiguateSeriesStatements.js.map +7 -1
  32. package/dist/disambiguateSeriesStatements.test.js +44 -0
  33. package/dist/disambiguateSeriesStatements.test.js.map +7 -0
  34. package/dist/double-commas.js +7 -14
  35. package/dist/double-commas.js.map +7 -1
  36. package/dist/double-commas.test.js +48 -0
  37. package/dist/double-commas.test.js.map +7 -0
  38. package/dist/duplicates-ind1.js +10 -31
  39. package/dist/duplicates-ind1.js.map +7 -1
  40. package/dist/duplicates-ind1.test.js +40 -0
  41. package/dist/duplicates-ind1.test.js.map +7 -0
  42. package/dist/empty-fields.js +10 -22
  43. package/dist/empty-fields.js.map +7 -1
  44. package/dist/empty-fields.test.js +129 -0
  45. package/dist/empty-fields.test.js.map +7 -0
  46. package/dist/ending-punctuation-conf.js +871 -769
  47. package/dist/ending-punctuation-conf.js.map +7 -1
  48. package/dist/ending-punctuation.js +84 -167
  49. package/dist/ending-punctuation.js.map +7 -1
  50. package/dist/ending-punctuation.test.js +2290 -0
  51. package/dist/ending-punctuation.test.js.map +7 -0
  52. package/dist/ending-whitespace.js +10 -35
  53. package/dist/ending-whitespace.js.map +7 -1
  54. package/dist/ending-whitespace.test.js +38 -0
  55. package/dist/ending-whitespace.test.js.map +7 -0
  56. package/dist/field-008-18-34-character-groups.js +40 -125
  57. package/dist/field-008-18-34-character-groups.js.map +7 -1
  58. package/dist/field-008-18-34-character-groups.test.js +45 -0
  59. package/dist/field-008-18-34-character-groups.test.js.map +7 -0
  60. package/dist/field-505-separators.js +19 -39
  61. package/dist/field-505-separators.js.map +7 -1
  62. package/dist/field-505-separators.test.js +45 -0
  63. package/dist/field-505-separators.test.js.map +7 -0
  64. package/dist/field-521-fix.js +19 -47
  65. package/dist/field-521-fix.js.map +7 -1
  66. package/dist/field-521-fix.test.js +44 -0
  67. package/dist/field-521-fix.test.js.map +7 -0
  68. package/dist/field-exclusion.js +37 -91
  69. package/dist/field-exclusion.js.map +7 -1
  70. package/dist/field-exclusion.test.js +821 -0
  71. package/dist/field-exclusion.test.js.map +7 -0
  72. package/dist/field-structure.js +52 -104
  73. package/dist/field-structure.js.map +7 -1
  74. package/dist/field-structure.test.js +587 -0
  75. package/dist/field-structure.test.js.map +7 -0
  76. package/dist/field33XUtils.js +119 -503
  77. package/dist/field33XUtils.js.map +7 -1
  78. package/dist/fields-present.js +11 -23
  79. package/dist/fields-present.js.map +7 -1
  80. package/dist/fields-present.test.js +95 -0
  81. package/dist/fields-present.test.js.map +7 -0
  82. package/dist/fix-33X.js +393 -431
  83. package/dist/fix-33X.js.map +7 -1
  84. package/dist/fix-33X.test.js +39 -0
  85. package/dist/fix-33X.test.js.map +7 -0
  86. package/dist/fix-country-codes.js +20 -50
  87. package/dist/fix-country-codes.js.map +7 -1
  88. package/dist/fix-country-codes.test.js +44 -0
  89. package/dist/fix-country-codes.test.js.map +7 -0
  90. package/dist/fix-language-codes.js +23 -53
  91. package/dist/fix-language-codes.js.map +7 -1
  92. package/dist/fix-language-codes.test.js +38 -0
  93. package/dist/fix-language-codes.test.js.map +7 -0
  94. package/dist/fixRelatorTerms.js +82 -209
  95. package/dist/fixRelatorTerms.js.map +7 -1
  96. package/dist/fixRelatorTerms.test.js +44 -0
  97. package/dist/fixRelatorTerms.test.js.map +7 -0
  98. package/dist/fixed-fields.js +21 -30
  99. package/dist/fixed-fields.js.map +7 -1
  100. package/dist/fixed-fields.test.js +87 -0
  101. package/dist/fixed-fields.test.js.map +7 -0
  102. package/dist/identical-fields.js +8 -24
  103. package/dist/identical-fields.js.map +7 -1
  104. package/dist/identical-fields.test.js +119 -0
  105. package/dist/identical-fields.test.js.map +7 -0
  106. package/dist/index.js +119 -413
  107. package/dist/index.js.map +7 -1
  108. package/dist/indicator-fixes.js +57 -95
  109. package/dist/indicator-fixes.js.map +7 -1
  110. package/dist/indicator-fixes.test.js +42 -0
  111. package/dist/indicator-fixes.test.js.map +7 -0
  112. package/dist/isbn-issn.js +66 -126
  113. package/dist/isbn-issn.js.map +7 -1
  114. package/dist/isbn-issn.test.js +398 -0
  115. package/dist/isbn-issn.test.js.map +7 -0
  116. package/dist/item-language.js +32 -65
  117. package/dist/item-language.js.map +7 -1
  118. package/dist/item-language.test.js +322 -0
  119. package/dist/item-language.test.js.map +7 -0
  120. package/dist/melindaCustomMergeFields.js +5182 -11233
  121. package/dist/melindaCustomMergeFields.js.map +7 -1
  122. package/dist/merge-fields/controlSubfields.js +75 -142
  123. package/dist/merge-fields/controlSubfields.js.map +7 -1
  124. package/dist/merge-fields/counterpartField.js +182 -379
  125. package/dist/merge-fields/counterpartField.js.map +7 -1
  126. package/dist/merge-fields/index.js +15 -49
  127. package/dist/merge-fields/index.js.map +7 -1
  128. package/dist/merge-fields/mergableIndicator.js +18 -51
  129. package/dist/merge-fields/mergableIndicator.js.map +7 -1
  130. package/dist/merge-fields/mergableTag.js +78 -30
  131. package/dist/merge-fields/mergableTag.js.map +7 -1
  132. package/dist/merge-fields/mergeConfig.js +66 -171
  133. package/dist/merge-fields/mergeConfig.js.map +7 -1
  134. package/dist/merge-fields/mergeConstraints.js +323 -1214
  135. package/dist/merge-fields/mergeConstraints.js.map +7 -1
  136. package/dist/merge-fields/mergeField.js +47 -111
  137. package/dist/merge-fields/mergeField.js.map +7 -1
  138. package/dist/merge-fields/mergeIndicator.js +64 -118
  139. package/dist/merge-fields/mergeIndicator.js.map +7 -1
  140. package/dist/merge-fields/mergeOrAddPostprocess.js +14 -38
  141. package/dist/merge-fields/mergeOrAddPostprocess.js.map +7 -1
  142. package/dist/merge-fields/mergeOrAddSubfield.js +62 -104
  143. package/dist/merge-fields/mergeOrAddSubfield.js.map +7 -1
  144. package/dist/merge-fields/mergeSubfield.js +47 -95
  145. package/dist/merge-fields/mergeSubfield.js.map +7 -1
  146. package/dist/merge-fields/removeDuplicateSubfields.js +18 -31
  147. package/dist/merge-fields/removeDuplicateSubfields.js.map +7 -1
  148. package/dist/merge-fields/worldKnowledge.js +15 -40
  149. package/dist/merge-fields/worldKnowledge.js.map +7 -1
  150. package/dist/merge-fields.test.js +44 -0
  151. package/dist/merge-fields.test.js.map +7 -0
  152. package/dist/mergeField500Lisapainokset.js +28 -57
  153. package/dist/mergeField500Lisapainokset.js.map +7 -1
  154. package/dist/mergeField500Lisapainokset.test.js +44 -0
  155. package/dist/mergeField500Lisapainokset.test.js.map +7 -0
  156. package/dist/mergeRelatorTermFields.js +33 -69
  157. package/dist/mergeRelatorTermFields.js.map +7 -1
  158. package/dist/mergeRelatorTermFields.test.js +44 -0
  159. package/dist/mergeRelatorTermFields.test.js.map +7 -0
  160. package/dist/modernize-502.js +23 -55
  161. package/dist/modernize-502.js.map +7 -1
  162. package/dist/modernize-502.test.js +38 -0
  163. package/dist/modernize-502.test.js.map +7 -0
  164. package/dist/multiple-subfield-0.js +23 -48
  165. package/dist/multiple-subfield-0.js.map +7 -1
  166. package/dist/multiple-subfield-0.test.js +44 -0
  167. package/dist/multiple-subfield-0.test.js.map +7 -0
  168. package/dist/non-breaking-space.js +11 -32
  169. package/dist/non-breaking-space.js.map +7 -1
  170. package/dist/non-breaking-space.test.js +38 -0
  171. package/dist/non-breaking-space.test.js.map +7 -0
  172. package/dist/normalize-dashes.js +18 -37
  173. package/dist/normalize-dashes.js.map +7 -1
  174. package/dist/normalize-dashes.test.js +44 -0
  175. package/dist/normalize-dashes.test.js.map +7 -0
  176. package/dist/normalize-identifiers.js +54 -140
  177. package/dist/normalize-identifiers.js.map +7 -1
  178. package/dist/normalize-identifiers.test.js +44 -0
  179. package/dist/normalize-identifiers.test.js.map +7 -0
  180. package/dist/normalize-qualifying-information.js +23 -48
  181. package/dist/normalize-qualifying-information.js.map +7 -1
  182. package/dist/normalize-qualifying-information.test.js +44 -0
  183. package/dist/normalize-qualifying-information.test.js.map +7 -0
  184. package/dist/normalize-utf8-diacritics.js +19 -105
  185. package/dist/normalize-utf8-diacritics.js.map +7 -1
  186. package/dist/normalize-utf8-diacritics.test.js +44 -0
  187. package/dist/normalize-utf8-diacritics.test.js.map +7 -0
  188. package/dist/normalizeFieldForComparison.js +67 -158
  189. package/dist/normalizeFieldForComparison.js.map +7 -1
  190. package/dist/normalizeSubfieldValueForComparison.js +37 -77
  191. package/dist/normalizeSubfieldValueForComparison.js.map +7 -1
  192. package/dist/prepublicationUtils.js +58 -111
  193. package/dist/prepublicationUtils.js.map +7 -1
  194. package/dist/punctuation/index.js +56 -72
  195. package/dist/punctuation/index.js.map +7 -1
  196. package/dist/punctuation/rules/aut.js +372 -331
  197. package/dist/punctuation/rules/aut.js.map +7 -1
  198. package/dist/punctuation/rules/bib.js +420 -373
  199. package/dist/punctuation/rules/bib.js.map +7 -1
  200. package/dist/punctuation/rules/index.js +7 -21
  201. package/dist/punctuation/rules/index.js.map +7 -1
  202. package/dist/punctuation.test.js +44 -0
  203. package/dist/punctuation.test.js.map +7 -0
  204. package/dist/punctuation2.js +251 -800
  205. package/dist/punctuation2.js.map +7 -1
  206. package/dist/punctuation2.test.js +44 -0
  207. package/dist/punctuation2.test.js.map +7 -0
  208. package/dist/reindexSubfield6OccurenceNumbers.js +61 -96
  209. package/dist/reindexSubfield6OccurenceNumbers.js.map +7 -1
  210. package/dist/reindexSubfield6OccurenceNumbers.test.js +44 -0
  211. package/dist/reindexSubfield6OccurenceNumbers.test.js.map +7 -0
  212. package/dist/removeDuplicateDataFields.js +102 -202
  213. package/dist/removeDuplicateDataFields.js.map +7 -1
  214. package/dist/removeDuplicateDataFields.test.js +44 -0
  215. package/dist/removeDuplicateDataFields.test.js.map +7 -0
  216. package/dist/removeInferiorDataFields.js +103 -227
  217. package/dist/removeInferiorDataFields.js.map +7 -1
  218. package/dist/removeInferiorDataFields.test.js +44 -0
  219. package/dist/removeInferiorDataFields.test.js.map +7 -0
  220. package/dist/resolvable-ext-references-melinda.js +25 -60
  221. package/dist/resolvable-ext-references-melinda.js.map +7 -1
  222. package/dist/resolvable-ext-references-melinda.test.js +160 -0
  223. package/dist/resolvable-ext-references-melinda.test.js.map +7 -0
  224. package/dist/resolveOrphanedSubfield6s.js +33 -64
  225. package/dist/resolveOrphanedSubfield6s.js.map +7 -1
  226. package/dist/resolveOrphanedSubfield6s.test.js +44 -0
  227. package/dist/resolveOrphanedSubfield6s.test.js.map +7 -0
  228. package/dist/sanitize-vocabulary-source-codes.js +27 -55
  229. package/dist/sanitize-vocabulary-source-codes.js.map +7 -1
  230. package/dist/sanitize-vocabulary-source-codes.test.js +45 -0
  231. package/dist/sanitize-vocabulary-source-codes.test.js.map +7 -0
  232. package/dist/sort-tags.js +13 -25
  233. package/dist/sort-tags.js.map +7 -1
  234. package/dist/sort-tags.test.js +261 -0
  235. package/dist/sort-tags.test.js.map +7 -0
  236. package/dist/sortFields.js +152 -222
  237. package/dist/sortFields.js.map +7 -1
  238. package/dist/sortFields.test.js +44 -0
  239. package/dist/sortFields.test.js.map +7 -0
  240. package/dist/sortRelatorTerms.js +30 -68
  241. package/dist/sortRelatorTerms.js.map +7 -1
  242. package/dist/sortRelatorTerms.test.js +44 -0
  243. package/dist/sortRelatorTerms.test.js.map +7 -0
  244. package/dist/sortSubfields.js +102 -255
  245. package/dist/sortSubfields.js.map +7 -1
  246. package/dist/sortSubfields.test.js +44 -0
  247. package/dist/sortSubfields.test.js.map +7 -0
  248. package/dist/stripPunctuation.js +13 -36
  249. package/dist/stripPunctuation.js.map +7 -1
  250. package/dist/stripPunctuation.test.js +44 -0
  251. package/dist/stripPunctuation.test.js.map +7 -0
  252. package/dist/subfield-exclusion.js +28 -75
  253. package/dist/subfield-exclusion.js.map +7 -1
  254. package/dist/subfield-exclusion.test.js +471 -0
  255. package/dist/subfield-exclusion.test.js.map +7 -0
  256. package/dist/subfield6Utils.js +107 -269
  257. package/dist/subfield6Utils.js.map +7 -1
  258. package/dist/subfield8Utils.js +26 -50
  259. package/dist/subfield8Utils.js.map +7 -1
  260. package/dist/subfieldValueNormalizations.js +40 -74
  261. package/dist/subfieldValueNormalizations.js.map +7 -1
  262. package/dist/subfieldValueNormalizations.test.js +45 -0
  263. package/dist/subfieldValueNormalizations.test.js.map +7 -0
  264. package/dist/sync-007-and-300.js +22 -53
  265. package/dist/sync-007-and-300.js.map +7 -1
  266. package/dist/sync-007-and-300.test.js +44 -0
  267. package/dist/sync-007-and-300.test.js.map +7 -0
  268. package/dist/translate-terms.js +67 -155
  269. package/dist/translate-terms.js.map +7 -1
  270. package/dist/translate-terms.test.js +44 -0
  271. package/dist/translate-terms.test.js.map +7 -0
  272. package/dist/typeOfDate-008.js +10 -25
  273. package/dist/typeOfDate-008.js.map +7 -1
  274. package/dist/typeOfDate-008.test.js +40 -0
  275. package/dist/typeOfDate-008.test.js.map +7 -0
  276. package/dist/unicode-decomposition.js +94 -107
  277. package/dist/unicode-decomposition.js.map +7 -1
  278. package/dist/unicode-decomposition.test.js +94 -0
  279. package/dist/unicode-decomposition.test.js.map +7 -0
  280. package/dist/update-field-540.js +30 -75
  281. package/dist/update-field-540.js.map +7 -1
  282. package/dist/update-field-540.test.js +44 -0
  283. package/dist/update-field-540.test.js.map +7 -0
  284. package/dist/urn.js +55 -128
  285. package/dist/urn.js.map +7 -1
  286. package/dist/urn.test.js +44 -0
  287. package/dist/urn.test.js.map +7 -0
  288. package/dist/utils.js +72 -126
  289. package/dist/utils.js.map +7 -1
  290. package/eslint.config.mjs +1 -2
  291. package/package.json +21 -93
  292. package/src/access-rights.js +1 -1
  293. package/src/{access-rights.spec.js → access-rights.test.js} +9 -10
  294. package/src/addMissingField041.js +1 -1
  295. package/src/{addMissingField336.spec.js → addMissingField041.test.js} +13 -14
  296. package/src/addMissingField336.js +3 -3
  297. package/src/{addMissingField041.spec.js → addMissingField336.test.js} +13 -14
  298. package/src/addMissingField337.js +2 -2
  299. package/src/{addMissingField337.spec.js → addMissingField337.test.js} +13 -14
  300. package/src/addMissingField338.js +2 -2
  301. package/src/{addMissingField338.spec.js → addMissingField338.test.js} +13 -14
  302. package/src/cyrillux-usemarcon-replacement.js +18 -18
  303. package/src/cyrillux-usemarcon-replacement.test.js +55 -0
  304. package/src/cyrillux.js +19 -12
  305. package/src/{cyrillux.spec.js → cyrillux.test.js} +13 -14
  306. package/src/disambiguateSeriesStatements.js +2 -2
  307. package/src/{disambiguateSeriesStatements.spec.js → disambiguateSeriesStatements.test.js} +12 -13
  308. package/src/double-commas.js +1 -1
  309. package/src/{double-commas.spec.js → double-commas.test.js} +9 -11
  310. package/src/duplicates-ind1.js +1 -1
  311. package/src/{duplicates-ind1.spec.js → duplicates-ind1.test.js} +12 -13
  312. package/src/{empty-fields.spec.js → empty-fields.test.js} +11 -13
  313. package/src/ending-punctuation.js +1 -1
  314. package/src/{ending-punctuation.spec.js → ending-punctuation.test.js} +172 -173
  315. package/src/{ending-whitespace.spec.js → ending-whitespace.test.js} +12 -13
  316. package/src/field-008-18-34-character-groups.js +2 -2
  317. package/src/{field-008-18-34-character-groups.spec.js → field-008-18-34-character-groups.test.js} +13 -13
  318. package/src/field-505-separators.js +3 -3
  319. package/src/{field-505-separators.spec.js → field-505-separators.test.js} +16 -14
  320. package/src/field-521-fix.js +2 -2
  321. package/src/{field-521-fix.spec.js → field-521-fix.test.js} +12 -13
  322. package/src/field-exclusion.js +1 -1
  323. package/src/{field-exclusion.spec.js → field-exclusion.test.js} +60 -57
  324. package/src/{field-structure.spec.js → field-structure.test.js} +29 -29
  325. package/src/{fields-present.spec.js → fields-present.test.js} +12 -15
  326. package/src/fix-33X.js +4 -4
  327. package/src/{fix-33X.spec.js → fix-33X.test.js} +13 -14
  328. package/src/fix-country-codes.js +1 -1
  329. package/src/{fix-country-codes.spec.js → fix-country-codes.test.js} +12 -13
  330. package/src/fix-language-codes.js +5 -5
  331. package/src/{fix-language-codes.spec.js → fix-language-codes.test.js} +12 -13
  332. package/src/fixRelatorTerms.js +5 -5
  333. package/src/{fixRelatorTerms.spec.js → fixRelatorTerms.test.js} +13 -13
  334. package/src/{fixed-fields.spec.js → fixed-fields.test.js} +11 -14
  335. package/src/identical-fields.js +1 -1
  336. package/src/{identical-fields.spec.js → identical-fields.test.js} +9 -11
  337. package/src/indicator-fixes.js +3 -3
  338. package/src/{indicator-fixes.spec.js → indicator-fixes.test.js} +9 -12
  339. package/src/isbn-issn.js +1 -1
  340. package/src/{isbn-issn.spec.js → isbn-issn.test.js} +20 -22
  341. package/src/{item-language.spec.js → item-language.test.js} +21 -22
  342. package/src/merge-fields/controlSubfields.js +1 -1
  343. package/src/merge-fields/counterpartField.js +8 -9
  344. package/src/merge-fields/index.js +1 -1
  345. package/src/merge-fields/mergableIndicator.js +1 -1
  346. package/src/merge-fields/mergeField.js +6 -6
  347. package/src/merge-fields/mergeIndicator.js +1 -1
  348. package/src/merge-fields/mergeOrAddPostprocess.js +4 -4
  349. package/src/merge-fields/mergeOrAddSubfield.js +2 -2
  350. package/src/merge-fields/mergeSubfield.js +4 -4
  351. package/src/merge-fields/removeDuplicateSubfields.js +2 -2
  352. package/src/{merge-fields.spec.js → merge-fields.test.js} +12 -13
  353. package/src/{mergeField500Lisapainokset.spec.js → mergeField500Lisapainokset.test.js} +12 -13
  354. package/src/mergeRelatorTermFields.js +5 -7
  355. package/src/{mergeRelatorTermFields.spec.js → mergeRelatorTermFields.test.js} +12 -13
  356. package/src/modernize-502.js +1 -1
  357. package/src/{modernize-502.spec.js → modernize-502.test.js} +12 -13
  358. package/src/multiple-subfield-0.js +3 -3
  359. package/src/{multiple-subfield-0.spec.js → multiple-subfield-0.test.js} +13 -13
  360. package/src/{non-breaking-space.spec.js → non-breaking-space.test.js} +12 -13
  361. package/src/normalize-dashes.js +2 -2
  362. package/src/{normalize-dashes.spec.js → normalize-dashes.test.js} +12 -13
  363. package/src/normalize-identifiers.js +1 -1
  364. package/src/{normalize-identifiers.spec.js → normalize-identifiers.test.js} +12 -13
  365. package/src/normalize-qualifying-information.js +2 -2
  366. package/src/{normalize-qualifying-information.spec.js → normalize-qualifying-information.test.js} +12 -13
  367. package/src/normalize-utf8-diacritics.js +2 -2
  368. package/src/{normalize-utf8-diacritics.spec.js → normalize-utf8-diacritics.test.js} +13 -13
  369. package/src/normalizeFieldForComparison.js +6 -6
  370. package/src/normalizeSubfieldValueForComparison.js +1 -1
  371. package/src/prepublicationUtils.js +4 -4
  372. package/src/punctuation/index.js +1 -1
  373. package/src/punctuation/rules/index.js +2 -2
  374. package/src/{punctuation.spec.js → punctuation.test.js} +12 -13
  375. package/src/punctuation2.js +4 -4
  376. package/src/{punctuation2.spec.js → punctuation2.test.js} +12 -13
  377. package/src/reindexSubfield6OccurenceNumbers.js +5 -7
  378. package/src/{reindexSubfield6OccurenceNumbers.spec.js → reindexSubfield6OccurenceNumbers.test.js} +12 -13
  379. package/src/removeDuplicateDataFields.js +11 -19
  380. package/src/{removeDuplicateDataFields.spec.js → removeDuplicateDataFields.test.js} +12 -13
  381. package/src/removeInferiorDataFields.js +11 -11
  382. package/src/{removeInferiorDataFields.spec.js → removeInferiorDataFields.test.js} +13 -13
  383. package/src/resolvable-ext-references-melinda.js +1 -1
  384. package/src/{resolvable-ext-references-melinda.spec.js → resolvable-ext-references-melinda.test.js} +42 -27
  385. package/src/resolveOrphanedSubfield6s.js +5 -5
  386. package/src/{resolveOrphanedSubfield6s.spec.js → resolveOrphanedSubfield6s.test.js} +13 -13
  387. package/src/sanitize-vocabulary-source-codes.js +4 -4
  388. package/src/{sanitize-vocabulary-source-codes.spec.js → sanitize-vocabulary-source-codes.test.js} +16 -14
  389. package/src/{sort-tags.spec.js → sort-tags.test.js} +9 -11
  390. package/src/sortFields.js +4 -4
  391. package/src/{sortFields.spec.js → sortFields.test.js} +12 -13
  392. package/src/sortRelatorTerms.js +3 -3
  393. package/src/{sortRelatorTerms.spec.js → sortRelatorTerms.test.js} +13 -13
  394. package/src/sortSubfields.js +1 -1
  395. package/src/{sortSubfields.spec.js → sortSubfields.test.js} +13 -13
  396. package/src/stripPunctuation.js +3 -3
  397. package/src/{stripPunctuation.spec.js → stripPunctuation.test.js} +13 -13
  398. package/src/subfield-exclusion.js +1 -1
  399. package/src/{subfield-exclusion.spec.js → subfield-exclusion.test.js} +45 -36
  400. package/src/subfield6Utils.js +6 -10
  401. package/src/subfield8Utils.js +4 -4
  402. package/src/subfieldValueNormalizations.js +3 -3
  403. package/src/{subfieldValueNormalizations.spec.js → subfieldValueNormalizations.test.js} +18 -14
  404. package/src/sync-007-and-300.js +2 -2
  405. package/src/{sync-007-and-300.spec.js → sync-007-and-300.test.js} +13 -13
  406. package/src/translate-terms.js +3 -3
  407. package/src/{translate-terms.spec.js → translate-terms.test.js} +13 -13
  408. package/src/{typeOfDate-008.spec.js → typeOfDate-008.test.js} +12 -13
  409. package/src/{unicode-decomposition.spec.js → unicode-decomposition.test.js} +10 -16
  410. package/src/update-field-540.js +2 -2
  411. package/src/{update-field-540.spec.js → update-field-540.test.js} +13 -10
  412. package/src/urn.js +2 -2
  413. package/src/{urn.spec.js → urn.test.js} +12 -13
  414. package/src/utils.js +3 -3
  415. package/test-fixtures/field-505-separators/03/expectedResult.json +3 -1
  416. package/test-fixtures/field-505-separators/03/record.json +3 -0
  417. package/test-fixtures/normalize-subfield-value/01/metadata.json +4 -1
  418. package/test-fixtures/normalize-subfield-value/01/record.json +3 -0
  419. package/test-fixtures/normalize-subfield-value/02/expectedResult.json +3 -1
  420. package/test-fixtures/normalize-subfield-value/02/metadata.json +2 -1
  421. package/test-fixtures/normalize-subfield-value/02/record.json +3 -0
  422. package/test-fixtures/sanitize-vocabulary-source-codes/f03/expectedResult.json +3 -1
  423. package/test-fixtures/sanitize-vocabulary-source-codes/f04/expectedResult.json +3 -1
  424. package/test-fixtures/sanitize-vocabulary-source-codes/v04/metadata.json +1 -4
  425. package/test-fixtures/sanitize-vocabulary-source-codes/v04/record.json +1 -1
  426. package/dist/access-rights.spec.js +0 -195
  427. package/dist/access-rights.spec.js.map +0 -1
  428. package/dist/addMissingField041.spec.js +0 -45
  429. package/dist/addMissingField041.spec.js.map +0 -1
  430. package/dist/addMissingField336.spec.js +0 -45
  431. package/dist/addMissingField336.spec.js.map +0 -1
  432. package/dist/addMissingField337.spec.js +0 -43
  433. package/dist/addMissingField337.spec.js.map +0 -1
  434. package/dist/addMissingField338.spec.js +0 -45
  435. package/dist/addMissingField338.spec.js.map +0 -1
  436. package/dist/cyrillux-usemarcon-replacement.spec.js +0 -45
  437. package/dist/cyrillux-usemarcon-replacement.spec.js.map +0 -1
  438. package/dist/cyrillux.spec.js +0 -46
  439. package/dist/cyrillux.spec.js.map +0 -1
  440. package/dist/disambiguateSeriesStatements.spec.js +0 -51
  441. package/dist/disambiguateSeriesStatements.spec.js.map +0 -1
  442. package/dist/double-commas.spec.js +0 -73
  443. package/dist/double-commas.spec.js.map +0 -1
  444. package/dist/duplicates-ind1.spec.js +0 -45
  445. package/dist/duplicates-ind1.spec.js.map +0 -1
  446. package/dist/empty-fields.spec.js +0 -118
  447. package/dist/empty-fields.spec.js.map +0 -1
  448. package/dist/ending-punctuation.spec.js +0 -2654
  449. package/dist/ending-punctuation.spec.js.map +0 -1
  450. package/dist/ending-whitespace.spec.js +0 -42
  451. package/dist/ending-whitespace.spec.js.map +0 -1
  452. package/dist/field-008-18-34-character-groups.spec.js +0 -51
  453. package/dist/field-008-18-34-character-groups.spec.js.map +0 -1
  454. package/dist/field-505-separators.spec.js +0 -51
  455. package/dist/field-505-separators.spec.js.map +0 -1
  456. package/dist/field-521-fix.spec.js +0 -51
  457. package/dist/field-521-fix.spec.js.map +0 -1
  458. package/dist/field-exclusion.spec.js +0 -1054
  459. package/dist/field-exclusion.spec.js.map +0 -1
  460. package/dist/field-structure.spec.js +0 -535
  461. package/dist/field-structure.spec.js.map +0 -1
  462. package/dist/fields-present.spec.js +0 -121
  463. package/dist/fields-present.spec.js.map +0 -1
  464. package/dist/fix-33X.spec.js +0 -45
  465. package/dist/fix-33X.spec.js.map +0 -1
  466. package/dist/fix-country-codes.spec.js +0 -51
  467. package/dist/fix-country-codes.spec.js.map +0 -1
  468. package/dist/fix-language-codes.spec.js +0 -44
  469. package/dist/fix-language-codes.spec.js.map +0 -1
  470. package/dist/fixRelatorTerms.spec.js +0 -51
  471. package/dist/fixRelatorTerms.spec.js.map +0 -1
  472. package/dist/fixed-fields.spec.js +0 -140
  473. package/dist/fixed-fields.spec.js.map +0 -1
  474. package/dist/identical-fields.spec.js +0 -99
  475. package/dist/identical-fields.spec.js.map +0 -1
  476. package/dist/indicator-fixes.spec.js +0 -51
  477. package/dist/indicator-fixes.spec.js.map +0 -1
  478. package/dist/isbn-issn.spec.js +0 -595
  479. package/dist/isbn-issn.spec.js.map +0 -1
  480. package/dist/item-language.spec.js +0 -306
  481. package/dist/item-language.spec.js.map +0 -1
  482. package/dist/melindaCustomMergeFields.json +0 -5120
  483. package/dist/merge-fields.spec.js +0 -51
  484. package/dist/merge-fields.spec.js.map +0 -1
  485. package/dist/mergeField500Lisapainokset.spec.js +0 -51
  486. package/dist/mergeField500Lisapainokset.spec.js.map +0 -1
  487. package/dist/mergeRelatorTermFields.spec.js +0 -51
  488. package/dist/mergeRelatorTermFields.spec.js.map +0 -1
  489. package/dist/modernize-502.spec.js +0 -49
  490. package/dist/modernize-502.spec.js.map +0 -1
  491. package/dist/multiple-subfield-0.spec.js +0 -51
  492. package/dist/multiple-subfield-0.spec.js.map +0 -1
  493. package/dist/non-breaking-space.spec.js +0 -42
  494. package/dist/non-breaking-space.spec.js.map +0 -1
  495. package/dist/normalize-dashes.spec.js +0 -51
  496. package/dist/normalize-dashes.spec.js.map +0 -1
  497. package/dist/normalize-identifiers.spec.js +0 -51
  498. package/dist/normalize-identifiers.spec.js.map +0 -1
  499. package/dist/normalize-qualifying-information.spec.js +0 -51
  500. package/dist/normalize-qualifying-information.spec.js.map +0 -1
  501. package/dist/normalize-utf8-diacritics.spec.js +0 -51
  502. package/dist/normalize-utf8-diacritics.spec.js.map +0 -1
  503. package/dist/punctuation.spec.js +0 -51
  504. package/dist/punctuation.spec.js.map +0 -1
  505. package/dist/punctuation2.spec.js +0 -51
  506. package/dist/punctuation2.spec.js.map +0 -1
  507. package/dist/reindexSubfield6OccurenceNumbers.spec.js +0 -51
  508. package/dist/reindexSubfield6OccurenceNumbers.spec.js.map +0 -1
  509. package/dist/removeDuplicateDataFields.spec.js +0 -51
  510. package/dist/removeDuplicateDataFields.spec.js.map +0 -1
  511. package/dist/removeInferiorDataFields.spec.js +0 -51
  512. package/dist/removeInferiorDataFields.spec.js.map +0 -1
  513. package/dist/resolvable-ext-references-melinda.spec.js +0 -166
  514. package/dist/resolvable-ext-references-melinda.spec.js.map +0 -1
  515. package/dist/resolveOrphanedSubfield6s.spec.js +0 -51
  516. package/dist/resolveOrphanedSubfield6s.spec.js.map +0 -1
  517. package/dist/sanitize-vocabulary-source-codes.spec.js +0 -51
  518. package/dist/sanitize-vocabulary-source-codes.spec.js.map +0 -1
  519. package/dist/sort-tags.spec.js +0 -207
  520. package/dist/sort-tags.spec.js.map +0 -1
  521. package/dist/sortFields.spec.js +0 -51
  522. package/dist/sortFields.spec.js.map +0 -1
  523. package/dist/sortRelatorTerms.spec.js +0 -51
  524. package/dist/sortRelatorTerms.spec.js.map +0 -1
  525. package/dist/sortSubfields.spec.js +0 -52
  526. package/dist/sortSubfields.spec.js.map +0 -1
  527. package/dist/stripPunctuation.spec.js +0 -51
  528. package/dist/stripPunctuation.spec.js.map +0 -1
  529. package/dist/subfield-exclusion.spec.js +0 -523
  530. package/dist/subfield-exclusion.spec.js.map +0 -1
  531. package/dist/subfieldValueNormalizations.spec.js +0 -51
  532. package/dist/subfieldValueNormalizations.spec.js.map +0 -1
  533. package/dist/sync-007-and-300.spec.js +0 -51
  534. package/dist/sync-007-and-300.spec.js.map +0 -1
  535. package/dist/translate-terms.spec.js +0 -51
  536. package/dist/translate-terms.spec.js.map +0 -1
  537. package/dist/typeOfDate-008.spec.js +0 -47
  538. package/dist/typeOfDate-008.spec.js.map +0 -1
  539. package/dist/unicode-decomposition.spec.js +0 -91
  540. package/dist/unicode-decomposition.spec.js.map +0 -1
  541. package/dist/update-field-540.spec.js +0 -51
  542. package/dist/update-field-540.spec.js.map +0 -1
  543. package/dist/urn.spec.js +0 -52
  544. package/dist/urn.spec.js.map +0 -1
  545. package/src/cyrillux-usemarcon-replacement.spec.js +0 -47
@@ -0,0 +1,398 @@
1
+ import assert from "node:assert";
2
+ import { MarcRecord } from "@natlibfi/marc-record";
3
+ import validatorFactory from "../src/isbn-issn.js";
4
+ import { describe, it } from "node:test";
5
+ describe("isbn-issn", () => {
6
+ it("Creates a validator", async () => {
7
+ const validator = await validatorFactory();
8
+ assert.equal(typeof validator, "object");
9
+ assert.equal(typeof validator.description, "string");
10
+ assert.equal(typeof validator.validate, "function");
11
+ });
12
+ describe("#validate", () => {
13
+ it("Finds the record valid", async () => {
14
+ const validator = await validatorFactory({ hyphenateISBN: true });
15
+ const record = new MarcRecord({
16
+ fields: [
17
+ {
18
+ tag: "020",
19
+ ind1: " ",
20
+ ind2: " ",
21
+ subfields: [{ code: "a", value: "978-600-377-017-1" }]
22
+ },
23
+ {
24
+ tag: "020",
25
+ ind1: " ",
26
+ ind2: " ",
27
+ subfields: [{ code: "a", value: "90-6831-372-X" }]
28
+ },
29
+ { tag: "020", ind1: " ", ind2: " ", subfields: [{ code: "z", value: "978-600-377-017-1" }] },
30
+ {
31
+ tag: "022",
32
+ ind1: " ",
33
+ ind2: " ",
34
+ subfields: [{ code: "a", value: "0355-0893" }]
35
+ }
36
+ ]
37
+ });
38
+ const result = await validator.validate(record);
39
+ assert.deepEqual(result, { valid: true });
40
+ });
41
+ it("Finds the record invalid", async () => {
42
+ const validator = await validatorFactory();
43
+ const record = new MarcRecord({
44
+ fields: [
45
+ {
46
+ tag: "020",
47
+ ind1: " ",
48
+ ind2: " ",
49
+ subfields: [{ code: "a", value: "foo" }]
50
+ },
51
+ {
52
+ tag: "020",
53
+ ind1: " ",
54
+ ind2: " ",
55
+ subfields: [{ code: "a", value: "90-68-31-372-X" }]
56
+ // contains an extra hyphen
57
+ },
58
+ {
59
+ tag: "022",
60
+ ind1: " ",
61
+ ind2: " ",
62
+ subfields: [{ code: "a", value: "bar" }]
63
+ }
64
+ ]
65
+ });
66
+ const result = await validator.validate(record);
67
+ assert.deepEqual(result, {
68
+ valid: false,
69
+ messages: [
70
+ "ISBN (foo) is not valid",
71
+ "ISSN (bar) is not valid"
72
+ ]
73
+ });
74
+ });
75
+ it("020 field without $a and $z is ok in this context (= no invalid ISBNs)", async () => {
76
+ const validator = await validatorFactory();
77
+ const record = new MarcRecord({
78
+ fields: [
79
+ {
80
+ tag: "020",
81
+ ind1: " ",
82
+ ind2: " ",
83
+ subfields: [{ code: "q", value: "nidottu" }]
84
+ }
85
+ ]
86
+ });
87
+ const result = await validator.validate(record);
88
+ assert.deepEqual(result, {
89
+ valid: true
90
+ });
91
+ });
92
+ it("Finds the invalid 022 field", async () => {
93
+ const validator = await validatorFactory();
94
+ const record = new MarcRecord({
95
+ fields: [
96
+ {
97
+ tag: "022",
98
+ ind1: " ",
99
+ ind2: " ",
100
+ subfields: [{ code: "z", value: "0000-0000" }]
101
+ }
102
+ ]
103
+ });
104
+ const result = await validator.validate(record);
105
+ assert.deepEqual(result, {
106
+ valid: false,
107
+ messages: ["ISSN (undefined) is not valid"]
108
+ });
109
+ });
110
+ it("Finds the record invalid (reason: multiword)", async () => {
111
+ const validator = await validatorFactory();
112
+ const record = new MarcRecord({
113
+ fields: [
114
+ {
115
+ tag: "020",
116
+ ind1: " ",
117
+ ind2: " ",
118
+ subfields: [{ code: "a", value: "978-600-377-017-1 (nid.)" }]
119
+ }
120
+ ]
121
+ });
122
+ const result = await validator.validate(record);
123
+ assert.deepEqual(result, { valid: false, messages: ["ISBN (978-600-377-017-1 (nid.)) is not valid"] });
124
+ });
125
+ it("Finds the record invalid (ISSN in 'l'-subfield)", async () => {
126
+ const validator = await validatorFactory();
127
+ const record = new MarcRecord({
128
+ fields: [
129
+ {
130
+ tag: "020",
131
+ ind1: " ",
132
+ ind2: " ",
133
+ subfields: [{ code: "a", value: "foo" }]
134
+ },
135
+ {
136
+ tag: "022",
137
+ ind1: " ",
138
+ ind2: " ",
139
+ subfields: [{ code: "l", value: "bar" }]
140
+ }
141
+ ]
142
+ });
143
+ const result = await validator.validate(record);
144
+ assert.deepEqual(result, {
145
+ valid: false,
146
+ messages: [
147
+ "ISBN (foo) is not valid",
148
+ "ISSN (bar) is not valid"
149
+ ]
150
+ });
151
+ });
152
+ it("Finds the record invalid (valid ISBN without hyphens)", async () => {
153
+ const validator = await validatorFactory({ hyphenateISBN: true });
154
+ const record = new MarcRecord({
155
+ fields: [
156
+ {
157
+ tag: "020",
158
+ ind1: " ",
159
+ ind2: " ",
160
+ subfields: [{ code: "a", value: "9789519155470" }]
161
+ },
162
+ {
163
+ tag: "020",
164
+ ind1: " ",
165
+ ind2: " ",
166
+ subfields: [{ code: "a", value: "9068-31-372-X" }]
167
+ // legal digits, but bad hyphenation
168
+ },
169
+ {
170
+ tag: "020",
171
+ ind1: " ",
172
+ ind2: " ",
173
+ subfields: [{ code: "a", value: "386006004X" }]
174
+ }
175
+ ]
176
+ });
177
+ const result = await validator.validate(record);
178
+ assert.deepEqual(result, { valid: false, messages: [
179
+ "ISBN (9789519155470) is not valid",
180
+ "ISBN (9068-31-372-X) is not valid",
181
+ "ISBN (386006004X) is not valid"
182
+ ] });
183
+ });
184
+ it.skip("Finds the record invalid (Missing ISBN)");
185
+ it.skip("Finds the record invalid (Missing ISSN)");
186
+ });
187
+ describe("#fix", () => {
188
+ it("Moves invalid ISBN to z-subfield", async () => {
189
+ const validator = await validatorFactory({ handleInvalid: true });
190
+ const record = new MarcRecord({
191
+ fields: [
192
+ {
193
+ tag: "020",
194
+ ind1: " ",
195
+ ind2: " ",
196
+ subfields: [{ code: "a", value: "foo" }]
197
+ },
198
+ {
199
+ tag: "020",
200
+ ind1: " ",
201
+ ind2: " ",
202
+ subfields: [{ code: "a", value: "crappy val" }]
203
+ },
204
+ { tag: "020", ind1: " ", ind2: " ", subfields: [{ code: "a", value: "97895234216609" }] },
205
+ // Just a sanity check due to earlier issues:
206
+ { tag: "020", ind1: " ", ind2: " ", subfields: [{ code: "z", value: "97895234216609" }] }
207
+ ]
208
+ });
209
+ await validator.fix(record);
210
+ assert.deepEqual(record.fields, [
211
+ { tag: "020", ind1: " ", ind2: " ", subfields: [{ code: "z", value: "foo" }] },
212
+ { tag: "020", ind1: " ", ind2: " ", subfields: [{ code: "z", value: "crappy val" }] },
213
+ { tag: "020", ind1: " ", ind2: " ", subfields: [{ code: "z", value: "97895234216609" }] },
214
+ { tag: "020", ind1: " ", ind2: " ", subfields: [{ code: "z", value: "97895234216609" }] }
215
+ ]);
216
+ });
217
+ it("Moves invalid ISSN to y-subfield", async () => {
218
+ const validator = await validatorFactory({ handleInvalid: true });
219
+ const record = new MarcRecord({
220
+ fields: [
221
+ {
222
+ tag: "022",
223
+ ind1: " ",
224
+ ind2: " ",
225
+ subfields: [{ code: "a", value: "foo" }]
226
+ }
227
+ ]
228
+ });
229
+ await validator.fix(record);
230
+ assert.deepEqual(record.fields, [
231
+ {
232
+ tag: "022",
233
+ ind1: " ",
234
+ ind2: " ",
235
+ subfields: [{ code: "y", value: "foo" }]
236
+ }
237
+ ]);
238
+ });
239
+ it("Moves invalid ISSN to y-subfield (Origin l-subfield)", async () => {
240
+ const validator = await validatorFactory({ handleInvalid: true });
241
+ const record = new MarcRecord({
242
+ fields: [
243
+ {
244
+ tag: "022",
245
+ ind1: " ",
246
+ ind2: " ",
247
+ subfields: [{ code: "l", value: "foo" }]
248
+ }
249
+ ]
250
+ });
251
+ await validator.fix(record);
252
+ assert.deepEqual(record.fields, [
253
+ {
254
+ tag: "022",
255
+ ind1: " ",
256
+ ind2: " ",
257
+ subfields: [{ code: "y", value: "foo" }]
258
+ }
259
+ ]);
260
+ });
261
+ it("Trims spaces from value (No hyphenate)", async () => {
262
+ const validator = await validatorFactory();
263
+ const record = new MarcRecord({
264
+ fields: [
265
+ {
266
+ tag: "020",
267
+ ind1: " ",
268
+ ind2: " ",
269
+ subfields: [{ code: "a", value: " 9786003770171" }]
270
+ },
271
+ {
272
+ tag: "020",
273
+ ind1: " ",
274
+ ind2: " ",
275
+ subfields: [{ code: "a", value: "9786003770171 (nidottu)" }]
276
+ }
277
+ ]
278
+ });
279
+ await validator.fix(record);
280
+ assert.deepEqual(record.fields, [
281
+ // NB! Initial space does not need to be removed. It's crap, but not this fixer's crap.
282
+ { tag: "020", ind1: " ", ind2: " ", subfields: [{ code: "a", value: " 9786003770171" }] },
283
+ { tag: "020", ind1: " ", ind2: " ", subfields: [{ code: "a", value: "9786003770171" }, { code: "q", value: "(nidottu)" }] }
284
+ ]);
285
+ });
286
+ it("Trims spaces and hyphenates value", async () => {
287
+ const validator = await validatorFactory({ hyphenateISBN: true });
288
+ const record = new MarcRecord({
289
+ fields: [
290
+ {
291
+ tag: "020",
292
+ ind1: " ",
293
+ ind2: " ",
294
+ subfields: [
295
+ { code: "a", value: "9786003770171 (nid.)" },
296
+ { code: "z", value: "9786003770171 (nid.)" },
297
+ { code: "z", value: "foo bar" }
298
+ ]
299
+ }
300
+ ]
301
+ });
302
+ await validator.fix(record);
303
+ assert.deepEqual(record.fields, [
304
+ {
305
+ tag: "020",
306
+ ind1: " ",
307
+ ind2: " ",
308
+ subfields: [
309
+ { code: "a", value: "978-600-377-017-1" },
310
+ { code: "z", value: "978-600-377-017-1" },
311
+ { code: "z", value: "foo bar" },
312
+ // NB! Technically $q should come before $z subfields, but this is good enough.
313
+ { code: "q", value: "(nid.)" }
314
+ ]
315
+ }
316
+ ]);
317
+ });
318
+ it("No relevant data", async () => {
319
+ const validator = await validatorFactory({ hyphenateISBN: true });
320
+ const record = new MarcRecord({
321
+ fields: [
322
+ {
323
+ tag: "005",
324
+ value: "whatever"
325
+ },
326
+ {
327
+ tag: "020",
328
+ ind1: " ",
329
+ ind2: " ",
330
+ subfields: [{ code: "q", value: "sidottu" }]
331
+ },
332
+ {
333
+ tag: "024",
334
+ ind1: " ",
335
+ ind2: " ",
336
+ subfields: [{ code: "a", value: " 9786003770171" }]
337
+ }
338
+ ]
339
+ });
340
+ await validator.fix(record);
341
+ assert.deepEqual(record.fields, [
342
+ { tag: "005", value: "whatever" },
343
+ { tag: "020", ind1: " ", ind2: " ", subfields: [{ code: "q", value: "sidottu" }] },
344
+ { tag: "024", ind1: " ", ind2: " ", subfields: [{ code: "a", value: " 9786003770171" }] }
345
+ ]);
346
+ });
347
+ it("Add hyphens to ISBN", async () => {
348
+ const validator = await validatorFactory({ hyphenateISBN: true });
349
+ const record = new MarcRecord({
350
+ fields: [
351
+ {
352
+ tag: "020",
353
+ ind1: " ",
354
+ ind2: " ",
355
+ subfields: [{ code: "a", value: "9789916605325" }]
356
+ },
357
+ {
358
+ tag: "020",
359
+ ind1: " ",
360
+ ind2: " ",
361
+ subfields: [{ code: "a", value: "917153086X" }]
362
+ },
363
+ {
364
+ tag: "020",
365
+ ind1: " ",
366
+ ind2: " ",
367
+ subfields: [{ code: "a", value: "9068-31-372-X" }]
368
+ // legal digits, but bad hyphenation
369
+ },
370
+ {
371
+ tag: "020",
372
+ ind1: " ",
373
+ ind2: " ",
374
+ subfields: [{ code: "a", value: "386006004X (nid.)" }]
375
+ },
376
+ {
377
+ tag: "020",
378
+ ind1: " ",
379
+ ind2: " ",
380
+ subfields: [{ code: "z", value: "9789916605325" }]
381
+ },
382
+ { tag: "020", ind1: " ", ind2: " ", subfields: [{ code: "z", value: "9789916605325 (sid.)" }] }
383
+ ]
384
+ });
385
+ await validator.fix(record);
386
+ assert.deepEqual(record.fields, [
387
+ { tag: "020", ind1: " ", ind2: " ", subfields: [{ code: "a", value: "978-9916-605-32-5" }] },
388
+ { tag: "020", ind1: " ", ind2: " ", subfields: [{ code: "a", value: "91-7153-086-X" }] },
389
+ { tag: "020", ind1: " ", ind2: " ", subfields: [{ code: "a", value: "90-6831-372-X" }] },
390
+ // corrected hyphens
391
+ { tag: "020", ind1: " ", ind2: " ", subfields: [{ code: "a", value: "3-86006-004-X" }, { code: "q", value: "(nid.)" }] },
392
+ { tag: "020", ind1: " ", ind2: " ", subfields: [{ code: "z", value: "978-9916-605-32-5" }] },
393
+ { tag: "020", ind1: " ", ind2: " ", subfields: [{ code: "z", value: "978-9916-605-32-5" }] }
394
+ ]);
395
+ });
396
+ });
397
+ });
398
+ //# sourceMappingURL=isbn-issn.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/isbn-issn.test.js"],
4
+ "sourcesContent": ["import assert from 'node:assert';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from '../src/isbn-issn.js';\nimport {describe, it} from 'node:test';\n\ndescribe('isbn-issn', () => {\n it('Creates a validator', async () => {\n const validator = await validatorFactory();\n\n assert.equal(typeof validator, 'object');\n assert.equal(typeof validator.description, 'string');\n assert.equal(typeof validator.validate, 'function');\n });\n\n describe('#validate', () => {\n it('Finds the record valid', async () => {\n const validator = await validatorFactory({hyphenateISBN: true});\n const record = new MarcRecord({\n fields: [\n {\n tag: '020',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: '978-600-377-017-1'}]\n },\n {\n tag: '020',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: '90-6831-372-X'}]\n },\n {tag: '020', ind1: ' ', ind2: ' ', subfields: [{code: 'z', value: '978-600-377-017-1'}]},\n {\n tag: '022',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: '0355-0893'}]\n }\n ]\n });\n const result = await validator.validate(record);\n\n assert.deepEqual(result, {valid: true});\n });\n\n it('Finds the record invalid', async () => {\n const validator = await validatorFactory();\n const record = new MarcRecord({\n fields: [\n {\n tag: '020',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'foo'}]\n },\n {\n tag: '020',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: '90-68-31-372-X'}] // contains an extra hyphen\n },\n {\n tag: '022',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'bar'}]\n }\n ]\n });\n const result = await validator.validate(record);\n\n assert.deepEqual(result, {\n valid: false, messages: [\n 'ISBN (foo) is not valid',\n 'ISSN (bar) is not valid'\n ]\n });\n });\n\n it('020 field without $a and $z is ok in this context (= no invalid ISBNs)', async () => {\n const validator = await validatorFactory();\n const record = new MarcRecord({\n fields: [\n {\n tag: '020',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'q', value: 'nidottu'}]\n }\n ]\n });\n const result = await validator.validate(record);\n\n assert.deepEqual(result, {\n valid: true\n });\n });\n\n it('Finds the invalid 022 field', async () => {\n const validator = await validatorFactory();\n const record = new MarcRecord({\n fields: [\n {\n tag: '022',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'z', value: '0000-0000'}]\n }\n ]\n });\n const result = await validator.validate(record);\n\n assert.deepEqual(result, {\n valid: false, messages: ['ISSN (undefined) is not valid']\n });\n });\n\n it('Finds the record invalid (reason: multiword)', async () => {\n const validator = await validatorFactory();\n const record = new MarcRecord({\n fields: [\n {\n tag: '020',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: '978-600-377-017-1 (nid.)'}]\n }\n ]\n });\n const result = await validator.validate(record);\n\n assert.deepEqual(result, {valid: false, messages: ['ISBN (978-600-377-017-1 (nid.)) is not valid']});\n });\n\n it('Finds the record invalid (ISSN in \\'l\\'-subfield)', async () => {\n const validator = await validatorFactory();\n const record = new MarcRecord({\n fields: [\n {\n tag: '020',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'foo'}]\n },\n {\n tag: '022',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'l', value: 'bar'}]\n }\n ]\n });\n const result = await validator.validate(record);\n\n assert.deepEqual(result, {\n valid: false, messages: [\n 'ISBN (foo) is not valid',\n 'ISSN (bar) is not valid'\n ]\n });\n });\n\n it('Finds the record invalid (valid ISBN without hyphens)', async () => {\n const validator = await validatorFactory({hyphenateISBN: true});\n const record = new MarcRecord({\n fields: [\n {\n tag: '020',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: '9789519155470'}]\n },\n {\n tag: '020',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: '9068-31-372-X'}] // legal digits, but bad hyphenation\n },\n {\n tag: '020',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: '386006004X'}]\n }\n ]\n });\n const result = await validator.validate(record);\n\n assert.deepEqual(result, {valid: false, messages: [\n 'ISBN (9789519155470) is not valid',\n 'ISBN (9068-31-372-X) is not valid',\n 'ISBN (386006004X) is not valid'\n ]});\n });\n\n it.skip('Finds the record invalid (Missing ISBN)');\n it.skip('Finds the record invalid (Missing ISSN)');\n });\n\n describe('#fix', () => {\n it('Moves invalid ISBN to z-subfield', async () => {\n const validator = await validatorFactory({handleInvalid: true});\n const record = new MarcRecord({\n fields: [\n {\n tag: '020', ind1: ' ', ind2: ' ',\n subfields: [{code: 'a', value: 'foo'}]\n },\n {\n tag: '020', ind1: ' ', ind2: ' ',\n subfields: [{code: 'a', value: 'crappy val'}]\n },\n {tag: '020', ind1: ' ', ind2: ' ', subfields: [{code: 'a', value: '97895234216609'}]},\n // Just a sanity check due to earlier issues:\n {tag: '020', ind1: ' ', ind2: ' ', subfields: [{code: 'z', value: '97895234216609'}]}\n ]\n });\n\n await validator.fix(record);\n\n assert.deepEqual(record.fields, [\n {tag: '020', ind1: ' ', ind2: ' ', subfields: [{code: 'z', value: 'foo'}]},\n {tag: '020', ind1: ' ', ind2: ' ', subfields: [{code: 'z', value: 'crappy val'}]},\n {tag: '020', ind1: ' ', ind2: ' ', subfields: [{code: 'z', value: '97895234216609'}]},\n {tag: '020', ind1: ' ', ind2: ' ', subfields: [{code: 'z', value: '97895234216609'}]}\n ]);\n });\n\n it('Moves invalid ISSN to y-subfield', async () => {\n const validator = await validatorFactory({handleInvalid: true});\n const record = new MarcRecord({\n fields: [\n {\n tag: '022', ind1: ' ', ind2: ' ',\n subfields: [{code: 'a', value: 'foo'}]\n }\n ]\n });\n\n await validator.fix(record);\n\n assert.deepEqual(record.fields, [\n {\n tag: '022', ind1: ' ', ind2: ' ', subfields: [{code: 'y', value: 'foo'}]\n }\n ]);\n });\n\n it('Moves invalid ISSN to y-subfield (Origin l-subfield)', async () => {\n const validator = await validatorFactory({handleInvalid: true});\n const record = new MarcRecord({\n fields: [\n {\n tag: '022', ind1: ' ', ind2: ' ',\n subfields: [{code: 'l', value: 'foo'}]\n }\n ]\n });\n\n await validator.fix(record);\n\n assert.deepEqual(record.fields, [\n {\n tag: '022', ind1: ' ', ind2: ' ', subfields: [{code: 'y', value: 'foo'}]\n }\n ]);\n });\n\n it('Trims spaces from value (No hyphenate)', async () => {\n const validator = await validatorFactory();\n const record = new MarcRecord({\n fields: [\n {\n tag: '020',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: ' 9786003770171'}]\n },\n {\n tag: '020',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: '9786003770171 (nidottu)'}]\n }\n ]\n });\n await validator.fix(record);\n\n assert.deepEqual(record.fields, [\n // NB! Initial space does not need to be removed. It's crap, but not this fixer's crap.\n {tag: '020', ind1: ' ', ind2: ' ', subfields: [{code: 'a', value: ' 9786003770171'}]},\n {tag: '020', ind1: ' ', ind2: ' ', subfields: [{code: 'a', value: '9786003770171'}, {code: 'q', value: '(nidottu)'}]}\n ]);\n });\n\n it('Trims spaces and hyphenates value', async () => {\n const validator = await validatorFactory({hyphenateISBN: true});\n const record = new MarcRecord({\n fields: [\n {\n tag: '020',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {code: 'a', value: '9786003770171 (nid.)'},\n {code: 'z', value: '9786003770171 (nid.)'},\n {code: 'z', value: 'foo bar'}\n ]\n }\n ]\n });\n await validator.fix(record);\n\n assert.deepEqual(record.fields, [\n {\n tag: '020',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {code: 'a', value: '978-600-377-017-1'},\n {code: 'z', value: '978-600-377-017-1'},\n {code: 'z', value: 'foo bar'},\n // NB! Technically $q should come before $z subfields, but this is good enough.\n {code: 'q', value: '(nid.)'}\n ]\n }\n ]);\n });\n\n it('No relevant data', async () => {\n const validator = await validatorFactory({hyphenateISBN: true});\n const record = new MarcRecord({\n fields: [\n {\n tag: '005',\n value: 'whatever'\n },\n {\n tag: '020',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'q', value: 'sidottu'}]\n },\n {\n tag: '024',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: ' 9786003770171'}]\n }\n ]\n });\n await validator.fix(record);\n\n assert.deepEqual(record.fields, [\n {tag: '005', value: 'whatever'},\n {tag: '020', ind1: ' ', ind2: ' ', subfields: [{code: 'q', value: 'sidottu'}]},\n {tag: '024', ind1: ' ', ind2: ' ', subfields: [{code: 'a', value: ' 9786003770171'}]}\n ]);\n });\n\n it('Add hyphens to ISBN', async () => {\n const validator = await validatorFactory({hyphenateISBN: true});\n const record = new MarcRecord({\n fields: [\n {\n tag: '020', ind1: ' ', ind2: ' ',\n subfields: [{code: 'a', value: '9789916605325'}]\n },\n {\n tag: '020', ind1: ' ', ind2: ' ',\n subfields: [{code: 'a', value: '917153086X'}]\n },\n {\n tag: '020',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: '9068-31-372-X'}] // legal digits, but bad hyphenation\n },\n {\n tag: '020', ind1: ' ', ind2: ' ',\n subfields: [{code: 'a', value: '386006004X (nid.)'}]\n },\n {\n tag: '020', ind1: ' ', ind2: ' ',\n subfields: [{code: 'z', value: '9789916605325'}]\n },\n {tag: '020', ind1: ' ', ind2: ' ', subfields: [{code: 'z', value: '9789916605325 (sid.)'}]}\n ]\n });\n\n await validator.fix(record);\n\n assert.deepEqual(record.fields, [\n {tag: '020', ind1: ' ', ind2: ' ', subfields: [{code: 'a', value: '978-9916-605-32-5'}]},\n {tag: '020', ind1: ' ', ind2: ' ', subfields: [{code: 'a', value: '91-7153-086-X'}]},\n {tag: '020', ind1: ' ', ind2: ' ', subfields: [{code: 'a', value: '90-6831-372-X'}]}, // corrected hyphens\n {tag: '020', ind1: ' ', ind2: ' ', subfields: [{code: 'a', value: '3-86006-004-X'}, {code: 'q', value: '(nid.)'}]},\n {tag: '020', ind1: ' ', ind2: ' ', subfields: [{code: 'z', value: '978-9916-605-32-5'}]},\n {tag: '020', ind1: ' ', ind2: ' ', subfields: [{code: 'z', value: '978-9916-605-32-5'}]}\n ]);\n });\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -1,48 +1,30 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = _default;
7
- var _cld3Asm = require("cld3-asm");
8
- var _langs = _interopRequireDefault(require("langs"));
9
- var _debug = _interopRequireDefault(require("debug"));
10
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
11
- async function _default(tagPattern, treshold = 0.9) {
12
- const debug = (0, _debug.default)('@natlibfi/marc-record-validators-melinda/item-language');
13
- const cldFactory = await (0, _cld3Asm.loadModule)();
1
+ import { loadModule as loadCLD } from "cld3-asm";
2
+ import LanguageCodes from "langs";
3
+ import createDebugLogger from "debug";
4
+ export default async function(tagPattern, treshold = 0.9) {
5
+ const debug = createDebugLogger("@natlibfi/marc-record-validators-melinda/item-language");
6
+ const cldFactory = await loadCLD();
14
7
  if (tagPattern instanceof RegExp) {
15
8
  return {
16
- description: 'Handles invalid/missing item language code',
9
+ description: "Handles invalid/missing item language code",
17
10
  validate,
18
11
  fix
19
12
  };
20
13
  }
21
- throw new Error('No tagPattern provided');
14
+ throw new Error("No tagPattern provided");
22
15
  async function validate(record) {
23
16
  const results = await checkLanguage(record);
24
17
  if (results.failed) {
25
- return {
26
- valid: Boolean(results.currentCode),
27
- messages: ['Language detection failed']
28
- };
18
+ return { valid: Boolean(results.currentCode), messages: ["Language detection failed"] };
29
19
  }
30
20
  if (results.detected) {
31
21
  if (results.detected !== results.currentCode) {
32
- return {
33
- valid: false,
34
- messages: [`Item language code is invalid. Correct language code: ${results.detected}`]
35
- };
22
+ return { valid: false, messages: [`Item language code is invalid. Correct language code: ${results.detected}`] };
36
23
  }
37
- return {
38
- valid: true
39
- };
24
+ return { valid: true };
40
25
  }
41
26
  if (results.suggested) {
42
- return {
43
- valid: Boolean(results.currentCode),
44
- messages: [`Item language code is invalid. Current code: ${results.currentCode}, suggestions: ${results.suggested.join()}`]
45
- };
27
+ return { valid: Boolean(results.currentCode), messages: [`Item language code is invalid. Current code: ${results.currentCode}, suggestions: ${results.suggested.join()}`] };
46
28
  }
47
29
  }
48
30
  async function fix(record) {
@@ -62,14 +44,11 @@ async function _default(tagPattern, treshold = 0.9) {
62
44
  }
63
45
  const f041 = record.get(/^041$/u).shift();
64
46
  if (f041) {
65
- const subfield = f041.subfields.find(sf => sf.code === 'a');
47
+ const subfield = f041.subfields.find((sf) => sf.code === "a");
66
48
  if (subfield) {
67
49
  subfield.value = results.detected;
68
50
  } else {
69
- f041.subfields.push({
70
- code: 'a',
71
- value: results.detected
72
- });
51
+ f041.subfields.push({ code: "a", value: results.detected });
73
52
  f041.subfields.sort((a, b) => {
74
53
  if (a.code < b.code) {
75
54
  return -1;
@@ -81,15 +60,12 @@ async function _default(tagPattern, treshold = 0.9) {
81
60
  });
82
61
  }
83
62
  } else {
84
- record.insertField({
85
- tag: '041',
86
- ind1: ' ',
87
- ind2: ' ',
88
- subfields: [{
89
- code: 'a',
63
+ record.insertField({ tag: "041", ind1: " ", ind2: " ", subfields: [
64
+ {
65
+ code: "a",
90
66
  value: results.detected
91
- }]
92
- });
67
+ }
68
+ ] });
93
69
  }
94
70
  }
95
71
  }
@@ -99,10 +75,7 @@ async function _default(tagPattern, treshold = 0.9) {
99
75
  const Identifier = cldFactory.create();
100
76
  if (text.length === 0) {
101
77
  Identifier.dispose();
102
- return {
103
- failed: true,
104
- currentCode: langCode
105
- };
78
+ return { failed: true, currentCode: langCode };
106
79
  }
107
80
  try {
108
81
  const results = await Identifier.findLanguage(text);
@@ -119,44 +92,38 @@ async function _default(tagPattern, treshold = 0.9) {
119
92
  suggested: [get2TLangCode(results.language)]
120
93
  };
121
94
  }
122
- return {
123
- failed: true,
124
- currentCode: langCode
125
- };
95
+ return { failed: true, currentCode: langCode };
126
96
  } catch (err) {
127
- /* istanbul ignore next: How to cause errors? */
128
97
  try {
129
98
  Identifier.dispose();
130
99
  } catch (err2) {
131
100
  debug(`Got error disposing identifier: ${err2 instanceof Error ? err2.stack : err2}`);
132
101
  }
133
-
134
- /* istanbul ignore next: How to cause errors? */
135
102
  throw err instanceof Error ? err : new Error(err.message);
136
103
  }
137
- function getText(record) {
138
- return record.get(tagPattern).reduce((acc, field) => {
139
- const fieldText = field.subfields.find(sf => sf.code === 'a').value;
104
+ function getText(record2) {
105
+ return record2.get(tagPattern).reduce((acc, field) => {
106
+ const fieldText = field.subfields.find((sf) => sf.code === "a").value;
140
107
  return `${acc}${fieldText}`;
141
- }, '');
108
+ }, "");
142
109
  }
143
- function getLanguageCode(record) {
144
- const [f008] = record.get(/^008$/u);
110
+ function getLanguageCode(record2) {
111
+ const [f008] = record2.get(/^008$/u);
145
112
  if (f008) {
146
113
  const code = f008.value.slice(35, 38);
147
- if (/^[a-z][a-z][a-z]$/u.test(code) && code !== 'zxx') {
114
+ if (/^[a-z][a-z][a-z]$/u.test(code) && code !== "zxx") {
148
115
  return code;
149
116
  }
150
117
  }
151
- const [f041] = record.get(/^041$/u);
118
+ const [f041] = record2.get(/^041$/u);
152
119
  if (f041) {
153
- const code = f041.subfields.find(sf => sf.code === 'a').value;
120
+ const code = f041.subfields.find((sf) => sf.code === "a").value;
154
121
  return code;
155
122
  }
156
123
  }
157
124
  function get2TLangCode(code) {
158
- return _langs.default.where('1', code)['2T'];
125
+ return LanguageCodes.where("1", code)["2T"];
159
126
  }
160
127
  }
161
128
  }
162
- //# sourceMappingURL=item-language.js.map
129
+ //# sourceMappingURL=item-language.js.map