@natlibfi/marc-record-validators-melinda 11.6.7 → 12.0.0-alpha.12

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 (563) hide show
  1. package/.github/workflows/{melinda-node-tests.yml → melinda-node-tests-and-publish.yml} +37 -12
  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 +43 -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 +873 -769
  47. package/dist/ending-punctuation-conf.js.map +7 -1
  48. package/dist/ending-punctuation.js +156 -169
  49. package/dist/ending-punctuation.js.map +7 -1
  50. package/dist/ending-punctuation.test.js +2385 -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 +182 -413
  107. package/dist/index.js.map +7 -1
  108. package/dist/indicator-fixes.js +66 -94
  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 +71 -128
  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 +187 -379
  125. package/dist/merge-fields/counterpartField.js.map +7 -1
  126. package/dist/merge-fields/dataProvenance.js +29 -0
  127. package/dist/merge-fields/dataProvenance.js.map +7 -0
  128. package/dist/merge-fields/index.js +25 -50
  129. package/dist/merge-fields/index.js.map +7 -1
  130. package/dist/merge-fields/mergableIndicator.js +18 -51
  131. package/dist/merge-fields/mergableIndicator.js.map +7 -1
  132. package/dist/merge-fields/mergableTag.js +78 -30
  133. package/dist/merge-fields/mergableTag.js.map +7 -1
  134. package/dist/merge-fields/mergeConfig.js +66 -171
  135. package/dist/merge-fields/mergeConfig.js.map +7 -1
  136. package/dist/merge-fields/mergeConstraints.js +323 -1214
  137. package/dist/merge-fields/mergeConstraints.js.map +7 -1
  138. package/dist/merge-fields/mergeField.js +47 -111
  139. package/dist/merge-fields/mergeField.js.map +7 -1
  140. package/dist/merge-fields/mergeIndicator.js +64 -118
  141. package/dist/merge-fields/mergeIndicator.js.map +7 -1
  142. package/dist/merge-fields/mergeOrAddPostprocess.js +14 -38
  143. package/dist/merge-fields/mergeOrAddPostprocess.js.map +7 -1
  144. package/dist/merge-fields/mergeOrAddSubfield.js +62 -104
  145. package/dist/merge-fields/mergeOrAddSubfield.js.map +7 -1
  146. package/dist/merge-fields/mergeSubfield.js +47 -95
  147. package/dist/merge-fields/mergeSubfield.js.map +7 -1
  148. package/dist/merge-fields/removeDuplicateSubfields.js +18 -31
  149. package/dist/merge-fields/removeDuplicateSubfields.js.map +7 -1
  150. package/dist/merge-fields/worldKnowledge.js +15 -40
  151. package/dist/merge-fields/worldKnowledge.js.map +7 -1
  152. package/dist/merge-fields.test.js +46 -0
  153. package/dist/merge-fields.test.js.map +7 -0
  154. package/dist/mergeField500Lisapainokset.js +27 -56
  155. package/dist/mergeField500Lisapainokset.js.map +7 -1
  156. package/dist/mergeField500Lisapainokset.test.js +44 -0
  157. package/dist/mergeField500Lisapainokset.test.js.map +7 -0
  158. package/dist/mergeRelatorTermFields.js +33 -69
  159. package/dist/mergeRelatorTermFields.js.map +7 -1
  160. package/dist/mergeRelatorTermFields.test.js +44 -0
  161. package/dist/mergeRelatorTermFields.test.js.map +7 -0
  162. package/dist/modernize-502.js +23 -55
  163. package/dist/modernize-502.js.map +7 -1
  164. package/dist/modernize-502.test.js +38 -0
  165. package/dist/modernize-502.test.js.map +7 -0
  166. package/dist/multiple-subfield-0.js +23 -48
  167. package/dist/multiple-subfield-0.js.map +7 -1
  168. package/dist/multiple-subfield-0.test.js +44 -0
  169. package/dist/multiple-subfield-0.test.js.map +7 -0
  170. package/dist/non-breaking-space.js +11 -32
  171. package/dist/non-breaking-space.js.map +7 -1
  172. package/dist/non-breaking-space.test.js +38 -0
  173. package/dist/non-breaking-space.test.js.map +7 -0
  174. package/dist/normalize-dashes.js +18 -37
  175. package/dist/normalize-dashes.js.map +7 -1
  176. package/dist/normalize-dashes.test.js +44 -0
  177. package/dist/normalize-dashes.test.js.map +7 -0
  178. package/dist/normalize-identifiers.js +54 -140
  179. package/dist/normalize-identifiers.js.map +7 -1
  180. package/dist/normalize-identifiers.test.js +44 -0
  181. package/dist/normalize-identifiers.test.js.map +7 -0
  182. package/dist/normalize-qualifying-information.js +23 -48
  183. package/dist/normalize-qualifying-information.js.map +7 -1
  184. package/dist/normalize-qualifying-information.test.js +44 -0
  185. package/dist/normalize-qualifying-information.test.js.map +7 -0
  186. package/dist/normalize-utf8-diacritics.js +19 -105
  187. package/dist/normalize-utf8-diacritics.js.map +7 -1
  188. package/dist/normalize-utf8-diacritics.test.js +44 -0
  189. package/dist/normalize-utf8-diacritics.test.js.map +7 -0
  190. package/dist/normalizeFieldForComparison.js +91 -158
  191. package/dist/normalizeFieldForComparison.js.map +7 -1
  192. package/dist/normalizeSubfieldValueForComparison.js +37 -77
  193. package/dist/normalizeSubfieldValueForComparison.js.map +7 -1
  194. package/dist/prepublicationUtils.js +58 -111
  195. package/dist/prepublicationUtils.js.map +7 -1
  196. package/dist/punctuation/index.js +56 -72
  197. package/dist/punctuation/index.js.map +7 -1
  198. package/dist/punctuation/rules/aut.js +372 -331
  199. package/dist/punctuation/rules/aut.js.map +7 -1
  200. package/dist/punctuation/rules/bib.js +420 -373
  201. package/dist/punctuation/rules/bib.js.map +7 -1
  202. package/dist/punctuation/rules/index.js +7 -21
  203. package/dist/punctuation/rules/index.js.map +7 -1
  204. package/dist/punctuation.test.js +44 -0
  205. package/dist/punctuation.test.js.map +7 -0
  206. package/dist/punctuation2.js +259 -802
  207. package/dist/punctuation2.js.map +7 -1
  208. package/dist/punctuation2.test.js +44 -0
  209. package/dist/punctuation2.test.js.map +7 -0
  210. package/dist/reindexSubfield6OccurenceNumbers.js +61 -96
  211. package/dist/reindexSubfield6OccurenceNumbers.js.map +7 -1
  212. package/dist/reindexSubfield6OccurenceNumbers.test.js +44 -0
  213. package/dist/reindexSubfield6OccurenceNumbers.test.js.map +7 -0
  214. package/dist/removeDuplicateDataFields.js +102 -202
  215. package/dist/removeDuplicateDataFields.js.map +7 -1
  216. package/dist/removeDuplicateDataFields.test.js +44 -0
  217. package/dist/removeDuplicateDataFields.test.js.map +7 -0
  218. package/dist/removeInferiorDataFields.js +104 -227
  219. package/dist/removeInferiorDataFields.js.map +7 -1
  220. package/dist/removeInferiorDataFields.test.js +44 -0
  221. package/dist/removeInferiorDataFields.test.js.map +7 -0
  222. package/dist/resolvable-ext-references-melinda.js +25 -60
  223. package/dist/resolvable-ext-references-melinda.js.map +7 -1
  224. package/dist/resolvable-ext-references-melinda.test.js +160 -0
  225. package/dist/resolvable-ext-references-melinda.test.js.map +7 -0
  226. package/dist/resolveOrphanedSubfield6s.js +32 -63
  227. package/dist/resolveOrphanedSubfield6s.js.map +7 -1
  228. package/dist/resolveOrphanedSubfield6s.test.js +44 -0
  229. package/dist/resolveOrphanedSubfield6s.test.js.map +7 -0
  230. package/dist/sanitize-vocabulary-source-codes.js +27 -55
  231. package/dist/sanitize-vocabulary-source-codes.js.map +7 -1
  232. package/dist/sanitize-vocabulary-source-codes.test.js +45 -0
  233. package/dist/sanitize-vocabulary-source-codes.test.js.map +7 -0
  234. package/dist/sort-tags.js +13 -25
  235. package/dist/sort-tags.js.map +7 -1
  236. package/dist/sort-tags.test.js +261 -0
  237. package/dist/sort-tags.test.js.map +7 -0
  238. package/dist/sortFields.js +152 -222
  239. package/dist/sortFields.js.map +7 -1
  240. package/dist/sortFields.test.js +44 -0
  241. package/dist/sortFields.test.js.map +7 -0
  242. package/dist/sortRelatorTerms.js +30 -68
  243. package/dist/sortRelatorTerms.js.map +7 -1
  244. package/dist/sortRelatorTerms.test.js +44 -0
  245. package/dist/sortRelatorTerms.test.js.map +7 -0
  246. package/dist/sortSubfields.js +102 -255
  247. package/dist/sortSubfields.js.map +7 -1
  248. package/dist/sortSubfields.test.js +44 -0
  249. package/dist/sortSubfields.test.js.map +7 -0
  250. package/dist/stripPunctuation.js +13 -36
  251. package/dist/stripPunctuation.js.map +7 -1
  252. package/dist/stripPunctuation.test.js +44 -0
  253. package/dist/stripPunctuation.test.js.map +7 -0
  254. package/dist/subfield-exclusion.js +28 -75
  255. package/dist/subfield-exclusion.js.map +7 -1
  256. package/dist/subfield-exclusion.test.js +471 -0
  257. package/dist/subfield-exclusion.test.js.map +7 -0
  258. package/dist/subfield6Utils.js +107 -269
  259. package/dist/subfield6Utils.js.map +7 -1
  260. package/dist/subfield8Utils.js +26 -50
  261. package/dist/subfield8Utils.js.map +7 -1
  262. package/dist/subfieldValueNormalizations.js +40 -74
  263. package/dist/subfieldValueNormalizations.js.map +7 -1
  264. package/dist/subfieldValueNormalizations.test.js +45 -0
  265. package/dist/subfieldValueNormalizations.test.js.map +7 -0
  266. package/dist/sync-007-and-300.js +22 -53
  267. package/dist/sync-007-and-300.js.map +7 -1
  268. package/dist/sync-007-and-300.test.js +44 -0
  269. package/dist/sync-007-and-300.test.js.map +7 -0
  270. package/dist/translate-terms.js +67 -155
  271. package/dist/translate-terms.js.map +7 -1
  272. package/dist/translate-terms.test.js +54 -0
  273. package/dist/translate-terms.test.js.map +7 -0
  274. package/dist/typeOfDate-008.js +10 -25
  275. package/dist/typeOfDate-008.js.map +7 -1
  276. package/dist/typeOfDate-008.test.js +40 -0
  277. package/dist/typeOfDate-008.test.js.map +7 -0
  278. package/dist/unicode-decomposition.js +94 -107
  279. package/dist/unicode-decomposition.js.map +7 -1
  280. package/dist/unicode-decomposition.test.js +94 -0
  281. package/dist/unicode-decomposition.test.js.map +7 -0
  282. package/dist/update-field-540.js +30 -75
  283. package/dist/update-field-540.js.map +7 -1
  284. package/dist/update-field-540.test.js +44 -0
  285. package/dist/update-field-540.test.js.map +7 -0
  286. package/dist/urn.js +55 -128
  287. package/dist/urn.js.map +7 -1
  288. package/dist/urn.test.js +44 -0
  289. package/dist/urn.test.js.map +7 -0
  290. package/dist/utils.js +78 -126
  291. package/dist/utils.js.map +7 -1
  292. package/eslint.config.mjs +1 -2
  293. package/package.json +28 -101
  294. package/src/access-rights.js +1 -1
  295. package/src/{access-rights.spec.js → access-rights.test.js} +9 -10
  296. package/src/addMissingField041.js +1 -1
  297. package/src/{addMissingField336.spec.js → addMissingField041.test.js} +13 -14
  298. package/src/addMissingField336.js +3 -3
  299. package/src/{addMissingField041.spec.js → addMissingField336.test.js} +13 -14
  300. package/src/addMissingField337.js +2 -2
  301. package/src/{addMissingField337.spec.js → addMissingField337.test.js} +13 -14
  302. package/src/addMissingField338.js +2 -2
  303. package/src/{addMissingField338.spec.js → addMissingField338.test.js} +13 -14
  304. package/src/cyrillux-usemarcon-replacement.js +18 -18
  305. package/src/{cyrillux-usemarcon-replacement.spec.js → cyrillux-usemarcon-replacement.test.js} +17 -14
  306. package/src/cyrillux.js +19 -12
  307. package/src/{cyrillux.spec.js → cyrillux.test.js} +13 -14
  308. package/src/disambiguateSeriesStatements.js +2 -2
  309. package/src/{disambiguateSeriesStatements.spec.js → disambiguateSeriesStatements.test.js} +12 -13
  310. package/src/double-commas.js +1 -1
  311. package/src/{double-commas.spec.js → double-commas.test.js} +9 -11
  312. package/src/duplicates-ind1.js +1 -1
  313. package/src/{duplicates-ind1.spec.js → duplicates-ind1.test.js} +12 -13
  314. package/src/{empty-fields.spec.js → empty-fields.test.js} +11 -13
  315. package/src/ending-punctuation-conf.js +6 -5
  316. package/src/ending-punctuation.js +115 -24
  317. package/src/{ending-punctuation.spec.js → ending-punctuation.test.js} +357 -275
  318. package/src/{ending-whitespace.spec.js → ending-whitespace.test.js} +12 -13
  319. package/src/field-008-18-34-character-groups.js +2 -2
  320. package/src/{field-008-18-34-character-groups.spec.js → field-008-18-34-character-groups.test.js} +13 -13
  321. package/src/field-505-separators.js +3 -3
  322. package/src/{field-505-separators.spec.js → field-505-separators.test.js} +16 -14
  323. package/src/field-521-fix.js +2 -2
  324. package/src/{field-521-fix.spec.js → field-521-fix.test.js} +12 -13
  325. package/src/field-exclusion.js +1 -1
  326. package/src/{field-exclusion.spec.js → field-exclusion.test.js} +60 -57
  327. package/src/{field-structure.spec.js → field-structure.test.js} +29 -29
  328. package/src/{fields-present.spec.js → fields-present.test.js} +12 -15
  329. package/src/fix-33X.js +4 -4
  330. package/src/{fix-33X.spec.js → fix-33X.test.js} +13 -14
  331. package/src/fix-country-codes.js +1 -1
  332. package/src/{fix-country-codes.spec.js → fix-country-codes.test.js} +12 -13
  333. package/src/fix-language-codes.js +5 -5
  334. package/src/{fix-language-codes.spec.js → fix-language-codes.test.js} +12 -13
  335. package/src/fixRelatorTerms.js +5 -5
  336. package/src/{fixRelatorTerms.spec.js → fixRelatorTerms.test.js} +13 -13
  337. package/src/{fixed-fields.spec.js → fixed-fields.test.js} +11 -14
  338. package/src/identical-fields.js +1 -1
  339. package/src/{identical-fields.spec.js → identical-fields.test.js} +9 -11
  340. package/src/index.js +132 -59
  341. package/src/indicator-fixes.js +17 -4
  342. package/src/{indicator-fixes.spec.js → indicator-fixes.test.js} +9 -12
  343. package/src/isbn-issn.js +12 -7
  344. package/src/{isbn-issn.spec.js → isbn-issn.test.js} +20 -22
  345. package/src/{item-language.spec.js → item-language.test.js} +21 -22
  346. package/src/melindaCustomMergeFields.js +1 -1
  347. package/src/merge-fields/controlSubfields.js +1 -1
  348. package/src/merge-fields/counterpartField.js +14 -9
  349. package/src/merge-fields/dataProvenance.js +41 -0
  350. package/src/merge-fields/index.js +12 -3
  351. package/src/merge-fields/mergableIndicator.js +1 -1
  352. package/src/merge-fields/mergeField.js +8 -8
  353. package/src/merge-fields/mergeIndicator.js +1 -1
  354. package/src/merge-fields/mergeOrAddPostprocess.js +4 -4
  355. package/src/merge-fields/mergeOrAddSubfield.js +2 -2
  356. package/src/merge-fields/mergeSubfield.js +4 -4
  357. package/src/merge-fields/removeDuplicateSubfields.js +2 -2
  358. package/src/{merge-fields.spec.js → merge-fields.test.js} +18 -15
  359. package/src/mergeField500Lisapainokset.js +1 -1
  360. package/src/{mergeField500Lisapainokset.spec.js → mergeField500Lisapainokset.test.js} +12 -13
  361. package/src/mergeRelatorTermFields.js +5 -7
  362. package/src/{mergeRelatorTermFields.spec.js → mergeRelatorTermFields.test.js} +12 -13
  363. package/src/modernize-502.js +1 -1
  364. package/src/{modernize-502.spec.js → modernize-502.test.js} +12 -13
  365. package/src/multiple-subfield-0.js +3 -3
  366. package/src/{multiple-subfield-0.spec.js → multiple-subfield-0.test.js} +13 -13
  367. package/src/{non-breaking-space.spec.js → non-breaking-space.test.js} +12 -13
  368. package/src/normalize-dashes.js +2 -2
  369. package/src/{normalize-dashes.spec.js → normalize-dashes.test.js} +12 -13
  370. package/src/normalize-identifiers.js +1 -1
  371. package/src/{normalize-identifiers.spec.js → normalize-identifiers.test.js} +12 -13
  372. package/src/normalize-qualifying-information.js +2 -2
  373. package/src/{normalize-qualifying-information.spec.js → normalize-qualifying-information.test.js} +12 -13
  374. package/src/normalize-utf8-diacritics.js +2 -2
  375. package/src/{normalize-utf8-diacritics.spec.js → normalize-utf8-diacritics.test.js} +13 -13
  376. package/src/normalizeFieldForComparison.js +32 -6
  377. package/src/normalizeSubfieldValueForComparison.js +1 -1
  378. package/src/prepublicationUtils.js +4 -4
  379. package/src/punctuation/index.js +1 -1
  380. package/src/punctuation/rules/index.js +2 -2
  381. package/src/{punctuation.spec.js → punctuation.test.js} +12 -13
  382. package/src/punctuation2.js +17 -8
  383. package/src/{punctuation2.spec.js → punctuation2.test.js} +12 -13
  384. package/src/reindexSubfield6OccurenceNumbers.js +5 -7
  385. package/src/{reindexSubfield6OccurenceNumbers.spec.js → reindexSubfield6OccurenceNumbers.test.js} +12 -13
  386. package/src/removeDuplicateDataFields.js +11 -19
  387. package/src/{removeDuplicateDataFields.spec.js → removeDuplicateDataFields.test.js} +12 -13
  388. package/src/removeInferiorDataFields.js +15 -12
  389. package/src/{removeInferiorDataFields.spec.js → removeInferiorDataFields.test.js} +13 -13
  390. package/src/resolvable-ext-references-melinda.js +1 -1
  391. package/src/{resolvable-ext-references-melinda.spec.js → resolvable-ext-references-melinda.test.js} +42 -27
  392. package/src/resolveOrphanedSubfield6s.js +6 -6
  393. package/src/{resolveOrphanedSubfield6s.spec.js → resolveOrphanedSubfield6s.test.js} +13 -13
  394. package/src/sanitize-vocabulary-source-codes.js +4 -4
  395. package/src/{sanitize-vocabulary-source-codes.spec.js → sanitize-vocabulary-source-codes.test.js} +16 -14
  396. package/src/{sort-tags.spec.js → sort-tags.test.js} +9 -11
  397. package/src/sortFields.js +4 -4
  398. package/src/{sortFields.spec.js → sortFields.test.js} +12 -13
  399. package/src/sortRelatorTerms.js +3 -3
  400. package/src/{sortRelatorTerms.spec.js → sortRelatorTerms.test.js} +13 -13
  401. package/src/sortSubfields.js +8 -6
  402. package/src/{sortSubfields.spec.js → sortSubfields.test.js} +13 -13
  403. package/src/stripPunctuation.js +3 -3
  404. package/src/{stripPunctuation.spec.js → stripPunctuation.test.js} +13 -13
  405. package/src/subfield-exclusion.js +1 -1
  406. package/src/{subfield-exclusion.spec.js → subfield-exclusion.test.js} +45 -36
  407. package/src/subfield6Utils.js +6 -10
  408. package/src/subfield8Utils.js +4 -4
  409. package/src/subfieldValueNormalizations.js +3 -3
  410. package/src/{subfieldValueNormalizations.spec.js → subfieldValueNormalizations.test.js} +18 -14
  411. package/src/sync-007-and-300.js +2 -2
  412. package/src/{sync-007-and-300.spec.js → sync-007-and-300.test.js} +13 -13
  413. package/src/translate-terms.js +3 -3
  414. package/src/translate-terms.test.js +75 -0
  415. package/src/{typeOfDate-008.spec.js → typeOfDate-008.test.js} +12 -13
  416. package/src/{unicode-decomposition.spec.js → unicode-decomposition.test.js} +10 -16
  417. package/src/update-field-540.js +2 -2
  418. package/src/{update-field-540.spec.js → update-field-540.test.js} +13 -10
  419. package/src/urn.js +2 -2
  420. package/src/{urn.spec.js → urn.test.js} +12 -13
  421. package/src/utils.js +21 -5
  422. package/test-fixtures/field-505-separators/03/expectedResult.json +3 -1
  423. package/test-fixtures/field-505-separators/03/record.json +3 -0
  424. package/test-fixtures/indicator-fixes/10/expectedResult.json +11 -0
  425. package/test-fixtures/indicator-fixes/10/metadata.json +4 -0
  426. package/test-fixtures/indicator-fixes/10/record.json +11 -0
  427. package/test-fixtures/merge-fields/f05/expectedResult.json +24 -0
  428. package/test-fixtures/merge-fields/f05/metadata.json +6 -0
  429. package/test-fixtures/merge-fields/f05/record.json +30 -0
  430. package/test-fixtures/normalize-subfield-value/01/metadata.json +4 -1
  431. package/test-fixtures/normalize-subfield-value/01/record.json +3 -0
  432. package/test-fixtures/normalize-subfield-value/02/expectedResult.json +3 -1
  433. package/test-fixtures/normalize-subfield-value/02/metadata.json +2 -1
  434. package/test-fixtures/normalize-subfield-value/02/record.json +3 -0
  435. package/test-fixtures/remove-inferior-datafields/f16/expectedResult.json +12 -0
  436. package/test-fixtures/remove-inferior-datafields/f16/metadata.json +5 -0
  437. package/test-fixtures/remove-inferior-datafields/f16/record.json +14 -0
  438. package/test-fixtures/sanitize-vocabulary-source-codes/f03/expectedResult.json +3 -1
  439. package/test-fixtures/sanitize-vocabulary-source-codes/f04/expectedResult.json +3 -1
  440. package/test-fixtures/sanitize-vocabulary-source-codes/v04/metadata.json +1 -4
  441. package/test-fixtures/sanitize-vocabulary-source-codes/v04/record.json +1 -1
  442. package/test-fixtures/translate-terms-data.js +42 -0
  443. package/dist/access-rights.spec.js +0 -195
  444. package/dist/access-rights.spec.js.map +0 -1
  445. package/dist/addMissingField041.spec.js +0 -45
  446. package/dist/addMissingField041.spec.js.map +0 -1
  447. package/dist/addMissingField336.spec.js +0 -45
  448. package/dist/addMissingField336.spec.js.map +0 -1
  449. package/dist/addMissingField337.spec.js +0 -43
  450. package/dist/addMissingField337.spec.js.map +0 -1
  451. package/dist/addMissingField338.spec.js +0 -45
  452. package/dist/addMissingField338.spec.js.map +0 -1
  453. package/dist/cyrillux-usemarcon-replacement.spec.js +0 -45
  454. package/dist/cyrillux-usemarcon-replacement.spec.js.map +0 -1
  455. package/dist/cyrillux.spec.js +0 -46
  456. package/dist/cyrillux.spec.js.map +0 -1
  457. package/dist/disambiguateSeriesStatements.spec.js +0 -51
  458. package/dist/disambiguateSeriesStatements.spec.js.map +0 -1
  459. package/dist/double-commas.spec.js +0 -73
  460. package/dist/double-commas.spec.js.map +0 -1
  461. package/dist/duplicates-ind1.spec.js +0 -45
  462. package/dist/duplicates-ind1.spec.js.map +0 -1
  463. package/dist/empty-fields.spec.js +0 -118
  464. package/dist/empty-fields.spec.js.map +0 -1
  465. package/dist/ending-punctuation.spec.js +0 -2654
  466. package/dist/ending-punctuation.spec.js.map +0 -1
  467. package/dist/ending-whitespace.spec.js +0 -42
  468. package/dist/ending-whitespace.spec.js.map +0 -1
  469. package/dist/field-008-18-34-character-groups.spec.js +0 -51
  470. package/dist/field-008-18-34-character-groups.spec.js.map +0 -1
  471. package/dist/field-505-separators.spec.js +0 -51
  472. package/dist/field-505-separators.spec.js.map +0 -1
  473. package/dist/field-521-fix.spec.js +0 -51
  474. package/dist/field-521-fix.spec.js.map +0 -1
  475. package/dist/field-exclusion.spec.js +0 -1054
  476. package/dist/field-exclusion.spec.js.map +0 -1
  477. package/dist/field-structure.spec.js +0 -535
  478. package/dist/field-structure.spec.js.map +0 -1
  479. package/dist/fields-present.spec.js +0 -121
  480. package/dist/fields-present.spec.js.map +0 -1
  481. package/dist/fix-33X.spec.js +0 -45
  482. package/dist/fix-33X.spec.js.map +0 -1
  483. package/dist/fix-country-codes.spec.js +0 -51
  484. package/dist/fix-country-codes.spec.js.map +0 -1
  485. package/dist/fix-language-codes.spec.js +0 -44
  486. package/dist/fix-language-codes.spec.js.map +0 -1
  487. package/dist/fixRelatorTerms.spec.js +0 -51
  488. package/dist/fixRelatorTerms.spec.js.map +0 -1
  489. package/dist/fixed-fields.spec.js +0 -140
  490. package/dist/fixed-fields.spec.js.map +0 -1
  491. package/dist/identical-fields.spec.js +0 -99
  492. package/dist/identical-fields.spec.js.map +0 -1
  493. package/dist/indicator-fixes.spec.js +0 -51
  494. package/dist/indicator-fixes.spec.js.map +0 -1
  495. package/dist/isbn-issn.spec.js +0 -595
  496. package/dist/isbn-issn.spec.js.map +0 -1
  497. package/dist/item-language.spec.js +0 -306
  498. package/dist/item-language.spec.js.map +0 -1
  499. package/dist/melindaCustomMergeFields.json +0 -5120
  500. package/dist/merge-fields.spec.js +0 -51
  501. package/dist/merge-fields.spec.js.map +0 -1
  502. package/dist/mergeField500Lisapainokset.spec.js +0 -51
  503. package/dist/mergeField500Lisapainokset.spec.js.map +0 -1
  504. package/dist/mergeRelatorTermFields.spec.js +0 -51
  505. package/dist/mergeRelatorTermFields.spec.js.map +0 -1
  506. package/dist/modernize-502.spec.js +0 -49
  507. package/dist/modernize-502.spec.js.map +0 -1
  508. package/dist/multiple-subfield-0.spec.js +0 -51
  509. package/dist/multiple-subfield-0.spec.js.map +0 -1
  510. package/dist/non-breaking-space.spec.js +0 -42
  511. package/dist/non-breaking-space.spec.js.map +0 -1
  512. package/dist/normalize-dashes.spec.js +0 -51
  513. package/dist/normalize-dashes.spec.js.map +0 -1
  514. package/dist/normalize-identifiers.spec.js +0 -51
  515. package/dist/normalize-identifiers.spec.js.map +0 -1
  516. package/dist/normalize-qualifying-information.spec.js +0 -51
  517. package/dist/normalize-qualifying-information.spec.js.map +0 -1
  518. package/dist/normalize-utf8-diacritics.spec.js +0 -51
  519. package/dist/normalize-utf8-diacritics.spec.js.map +0 -1
  520. package/dist/punctuation.spec.js +0 -51
  521. package/dist/punctuation.spec.js.map +0 -1
  522. package/dist/punctuation2.spec.js +0 -51
  523. package/dist/punctuation2.spec.js.map +0 -1
  524. package/dist/reindexSubfield6OccurenceNumbers.spec.js +0 -51
  525. package/dist/reindexSubfield6OccurenceNumbers.spec.js.map +0 -1
  526. package/dist/removeDuplicateDataFields.spec.js +0 -51
  527. package/dist/removeDuplicateDataFields.spec.js.map +0 -1
  528. package/dist/removeInferiorDataFields.spec.js +0 -51
  529. package/dist/removeInferiorDataFields.spec.js.map +0 -1
  530. package/dist/resolvable-ext-references-melinda.spec.js +0 -166
  531. package/dist/resolvable-ext-references-melinda.spec.js.map +0 -1
  532. package/dist/resolveOrphanedSubfield6s.spec.js +0 -51
  533. package/dist/resolveOrphanedSubfield6s.spec.js.map +0 -1
  534. package/dist/sanitize-vocabulary-source-codes.spec.js +0 -51
  535. package/dist/sanitize-vocabulary-source-codes.spec.js.map +0 -1
  536. package/dist/sort-tags.spec.js +0 -207
  537. package/dist/sort-tags.spec.js.map +0 -1
  538. package/dist/sortFields.spec.js +0 -51
  539. package/dist/sortFields.spec.js.map +0 -1
  540. package/dist/sortRelatorTerms.spec.js +0 -51
  541. package/dist/sortRelatorTerms.spec.js.map +0 -1
  542. package/dist/sortSubfields.spec.js +0 -52
  543. package/dist/sortSubfields.spec.js.map +0 -1
  544. package/dist/stripPunctuation.spec.js +0 -51
  545. package/dist/stripPunctuation.spec.js.map +0 -1
  546. package/dist/subfield-exclusion.spec.js +0 -523
  547. package/dist/subfield-exclusion.spec.js.map +0 -1
  548. package/dist/subfieldValueNormalizations.spec.js +0 -51
  549. package/dist/subfieldValueNormalizations.spec.js.map +0 -1
  550. package/dist/sync-007-and-300.spec.js +0 -51
  551. package/dist/sync-007-and-300.spec.js.map +0 -1
  552. package/dist/translate-terms.spec.js +0 -51
  553. package/dist/translate-terms.spec.js.map +0 -1
  554. package/dist/typeOfDate-008.spec.js +0 -47
  555. package/dist/typeOfDate-008.spec.js.map +0 -1
  556. package/dist/unicode-decomposition.spec.js +0 -91
  557. package/dist/unicode-decomposition.spec.js.map +0 -1
  558. package/dist/update-field-540.spec.js +0 -51
  559. package/dist/update-field-540.spec.js.map +0 -1
  560. package/dist/urn.spec.js +0 -52
  561. package/dist/urn.spec.js.map +0 -1
  562. package/src/melindaCustomMergeFields.json +0 -5120
  563. package/src/translate-terms.spec.js +0 -52
@@ -1,34 +1,20 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = _default;
7
- var _marcRecord = require("@natlibfi/marc-record");
8
- var _debug = _interopRequireDefault(require("debug"));
9
- var _rules = require("./rules");
10
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
11
- const debug = (0, _debug.default)('@natlibfi/marc-record-validator-melinda/punctuation:dev');
1
+ import { MarcRecord } from "@natlibfi/marc-record";
2
+ import createDebug from "debug";
3
+ import { autRules, bibRules } from "./rules/index.js";
4
+ const debug = createDebug("@natlibfi/marc-record-validator-melinda/punctuation:dev");
12
5
  function cloneDeep(field) {
13
- const r = new _marcRecord.MarcRecord();
6
+ const r = new MarcRecord();
14
7
  r.appendField(field);
15
8
  return r.get(field.tag)?.[0];
16
9
  }
17
- function _default() {
10
+ export default function() {
18
11
  function readPunctuationRulesFromJSON(recordType) {
19
12
  const json = getRules(recordType);
20
- const rules = json.filter(row => row.selector !== '').map(row => {
21
- const {
22
- selector,
23
- namePortion,
24
- description,
25
- portion,
26
- preceedingPunctuation,
27
- exceptions
28
- } = row;
13
+ const rules = json.filter((row) => row.selector !== "").map((row) => {
14
+ const { selector, namePortion, description, portion, preceedingPunctuation, exceptions } = row;
29
15
  return {
30
- selector: new RegExp(selector.replace(/X/ug, '.'), 'u'),
31
- namePortion: namePortion.replace(/\$/ug, '').trim(),
16
+ selector: new RegExp(selector.replace(/X/ug, "."), "u"),
17
+ namePortion: namePortion.replace(/\$/ug, "").trim(),
32
18
  description,
33
19
  portion,
34
20
  preceedingPunctuation,
@@ -38,33 +24,33 @@ function _default() {
38
24
  return rules;
39
25
  }
40
26
  function getRules(recordType) {
41
- if (recordType === 'z') {
42
- return _rules.autRules;
27
+ if (recordType === "z") {
28
+ return autRules;
43
29
  }
44
- return _rules.bibRules;
30
+ return bibRules;
45
31
  }
46
32
  function fieldToString(field) {
47
33
  if (field && field.subfields) {
48
- const ind1 = field.ind1 || ' ';
49
- const ind2 = field.ind2 || ' ';
50
- const subfields = field.subfields.map(subfield => `‡${subfield.code}${subfield.value}`).join('');
34
+ const ind1 = field.ind1 || " ";
35
+ const ind2 = field.ind2 || " ";
36
+ const subfields = field.subfields.map((subfield) => `\u2021${subfield.code}${subfield.value}`).join("");
51
37
  return `${field.tag} ${ind1}${ind2} ${subfields}`;
52
38
  }
53
39
  return `${field.tag} ${field.value}`;
54
40
  }
55
- function validateField(recordType = 'a') {
56
- return function (element) {
41
+ function validateField(recordType = "a") {
42
+ return function(element) {
57
43
  const testField = cloneDeep(element);
58
44
  debug(`Original field: ${JSON.stringify(element)}`);
59
45
  const punctuated = punctuateField(testField, recordType);
60
46
  debug(`Punctuation result: ${JSON.stringify(punctuated)}`);
61
47
  if (!punctuated) {
62
- debug('No punctuation result -> true');
48
+ debug("No punctuation result -> true");
63
49
  return true;
64
50
  }
65
- if (_marcRecord.MarcRecord.isEqual(punctuated, element)) {
51
+ if (MarcRecord.isEqual(punctuated, element)) {
66
52
  debug(`Original field (element): ${JSON.stringify(element)}`);
67
- debug('Punctuation result equals original field');
53
+ debug("Punctuation result equals original field");
68
54
  return true;
69
55
  }
70
56
  return false;
@@ -82,26 +68,26 @@ function _default() {
82
68
  let currentPortion;
83
69
  let preceedingField;
84
70
  let inNamePortion = true;
85
- debug(`Field subfields: ${field.subfields.map(sub => sub.code)}`);
86
- debug(`Field portions: ${field.subfields.map(sub => getPortion(sub, rulesForField))}`);
87
- field.subfields.forEach(subfield => {
71
+ debug(`Field subfields: ${field.subfields.map((sub) => sub.code)}`);
72
+ debug(`Field portions: ${field.subfields.map((sub) => getPortion(sub, rulesForField))}`);
73
+ field.subfields.forEach((subfield) => {
88
74
  debug(`Handling subfield ${subfield.code}`);
89
75
  let portion = getPortion(subfield, rulesForField);
90
76
  if (portion === false) {
91
77
  return;
92
78
  }
93
- if (portion === 'CF' || portion === 'NC') {
79
+ if (portion === "CF" || portion === "NC") {
94
80
  return;
95
81
  }
96
- if (inNamePortion && portion.includes('T', 'S')) {
82
+ if (inNamePortion && portion.includes("T", "S")) {
97
83
  debug(`Portion changed to ${portion}. Not in name portion anymore`);
98
84
  inNamePortion = false;
99
85
  }
100
- if (inNamePortion && portion === 'NT') {
101
- portion = 'N';
86
+ if (inNamePortion && portion === "NT") {
87
+ portion = "N";
102
88
  }
103
- if (!inNamePortion && portion === 'NT') {
104
- portion = 'T';
89
+ if (!inNamePortion && portion === "NT") {
90
+ portion = "T";
105
91
  }
106
92
  debug(`Current portion is ${portion}.`);
107
93
  if (currentPortion) {
@@ -110,8 +96,8 @@ function _default() {
110
96
  addSubfieldPunctuation(preceedingField, subfield, rulesForField);
111
97
  } else {
112
98
  debug(`Current portion changed to ${portion}.`);
113
- if (portion !== 'S') {
114
- debug('Adding punctuation for portion.');
99
+ if (portion !== "S") {
100
+ debug("Adding punctuation for portion.");
115
101
  addNamePortionPunctuation(preceedingField);
116
102
  }
117
103
  }
@@ -119,19 +105,19 @@ function _default() {
119
105
  currentPortion = portion;
120
106
  preceedingField = subfield;
121
107
  });
122
- if (recordType !== 'z') {
108
+ if (recordType !== "z") {
123
109
  addNamePortionPunctuation(preceedingField);
124
110
  }
125
111
  debug(`After punctuation: ${fieldToString(field)}`);
126
112
  return field;
127
113
  }
128
114
  function getRulesForField(tag, rules) {
129
- return rules.filter(rule => rule.selector.test(tag));
115
+ return rules.filter((rule) => rule.selector.test(tag));
130
116
  }
131
117
  function getPortion(subfield, rules) {
132
118
  debug(`Looking for namePortion for ${subfield.code}`);
133
- const [portion] = rules.filter(rule => rule.namePortion === subfield.code).map(rule => rule.portion);
134
- if (portion === undefined) {
119
+ const [portion] = rules.filter((rule) => rule.namePortion === subfield.code).map((rule) => rule.portion);
120
+ if (portion === void 0) {
135
121
  return false;
136
122
  }
137
123
  return portion.toUpperCase();
@@ -147,20 +133,20 @@ function _default() {
147
133
  function addSubfieldPunctuation(preceedingSubfield, currentSubfield, rules) {
148
134
  const punctType = getPrecedingPunctuation(currentSubfield, rules);
149
135
  const exceptionsFunctions = getExceptions(currentSubfield, rules);
150
- const isExceptionCase = exceptionsFunctions.some(fn => fn(preceedingSubfield));
136
+ const isExceptionCase = exceptionsFunctions.some((fn) => fn(preceedingSubfield));
151
137
  if (isExceptionCase) {
152
138
  return;
153
139
  }
154
140
  const endsInPunctuation = /[?")\]\-!,]$/u.test(preceedingSubfield.value);
155
141
  debug(`addSubfieldPunctuation -- punctType: ${punctType} endsInPunctuation: ${endsInPunctuation}`);
156
142
  if (!endsInPunctuation) {
157
- if (punctType === 'PERIOD' && !/\.$/u.test(preceedingSubfield.value)) {
143
+ if (punctType === "PERIOD" && !/\.$/u.test(preceedingSubfield.value)) {
158
144
  const nextValue = `${preceedingSubfield.value}.`;
159
145
  debug(`Updated subfield ${preceedingSubfield.code} from '${preceedingSubfield.value}' to '${nextValue}'`);
160
146
  preceedingSubfield.value = nextValue;
161
147
  }
162
148
  }
163
- if (punctType === 'COMMA') {
149
+ if (punctType === "COMMA") {
164
150
  if (!/,$/u.test(preceedingSubfield.value)) {
165
151
  if (!/^[[(]/u.test(currentSubfield.value)) {
166
152
  const nextValue = `${preceedingSubfield.value},`;
@@ -169,14 +155,14 @@ function _default() {
169
155
  }
170
156
  }
171
157
  }
172
- if (punctType === 'COND_COMMA') {
158
+ if (punctType === "COND_COMMA") {
173
159
  if (!/[-,]$/u.test(preceedingSubfield.value)) {
174
160
  const nextValue = `${preceedingSubfield.value},`;
175
161
  debug(`Updated subfield ${preceedingSubfield.code} from '${preceedingSubfield.value}' to '${nextValue}'`);
176
162
  preceedingSubfield.value = nextValue;
177
163
  }
178
164
  }
179
- if (punctType === 'SPACECOLON') {
165
+ if (punctType === "SPACECOLON") {
180
166
  if (!/:$/u.test(preceedingSubfield.value)) {
181
167
  const nextValue = `${preceedingSubfield.value} :`;
182
168
  debug(`Updated subfield ${preceedingSubfield.code} from '${preceedingSubfield.value}' to '${nextValue}'`);
@@ -188,46 +174,46 @@ function _default() {
188
174
  preceedingSubfield.value = nextValue;
189
175
  }
190
176
  }
191
- debug('addSubfieldPunctuation -- end');
177
+ debug("addSubfieldPunctuation -- end");
192
178
  }
193
179
  function getPrecedingPunctuation(subfield, rules) {
194
- const [punct] = rules.filter(rule => rule.namePortion === subfield.code).map(rule => rule.preceedingPunctuation);
195
- if (punct === undefined) {
180
+ const [punct] = rules.filter((rule) => rule.namePortion === subfield.code).map((rule) => rule.preceedingPunctuation);
181
+ if (punct === void 0) {
196
182
  throw new Error(`Unknown subfield code ${subfield.code}`);
197
183
  }
198
184
  return punct.toUpperCase();
199
185
  }
200
186
  function getExceptions(subfield, rules) {
201
- const [exception] = rules.filter(rule => rule.namePortion === subfield.code).map(rule => parseExceptions(rule.exceptions));
202
- if (exception === undefined) {
187
+ const [exception] = rules.filter((rule) => rule.namePortion === subfield.code).map((rule) => parseExceptions(rule.exceptions));
188
+ if (exception === void 0) {
203
189
  throw new Error(`Unknown subfield code ${subfield.code}`);
204
190
  }
205
191
  return exception;
206
192
  }
207
193
  function parseExceptions(expectionsString) {
208
- const exceptionRules = expectionsString.split('\n');
194
+ const exceptionRules = expectionsString.split("\n");
209
195
  const exceptionFuncs = [];
210
- exceptionRules.forEach(exceptionRule => {
196
+ exceptionRules.forEach((exceptionRule) => {
211
197
  const match = /- (.*) if preceded by (.*)/u.exec(exceptionRule);
212
198
  if (match) {
213
199
  const [, type, preceededCode] = match;
214
200
  const normalizedType = type.trim().toUpperCase().trim();
215
- const normalizedCode = preceededCode.replace(/\$/ug, '').trim();
201
+ const normalizedCode = preceededCode.replace(/\$/ug, "").trim();
216
202
  exceptionFuncs.push(ifPrecededByException(normalizedCode, normalizedType));
217
203
  }
218
204
  });
219
205
  return exceptionFuncs;
220
206
  }
221
207
  function ifPrecededByException(code, type) {
222
- return preceedingSubfield => {
208
+ return (preceedingSubfield) => {
223
209
  if (code === preceedingSubfield.code) {
224
210
  debug(`Adding ${type} to ${preceedingSubfield.code}`);
225
- if (type === 'SEMICOLON' && !/;$/u.test(preceedingSubfield.value)) {
211
+ if (type === "SEMICOLON" && !/;$/u.test(preceedingSubfield.value)) {
226
212
  const nextValue = `${preceedingSubfield.value} ;`;
227
213
  debug(`Updated subfield ${preceedingSubfield.code} from '${preceedingSubfield.value}' to '${nextValue}'`);
228
214
  preceedingSubfield.value = nextValue;
229
215
  }
230
- if (type === 'COLON' && !/:$/u.test(preceedingSubfield.value)) {
216
+ if (type === "COLON" && !/:$/u.test(preceedingSubfield.value)) {
231
217
  const nextValue = `${preceedingSubfield.value} :`;
232
218
  debug(`Updated subfield ${preceedingSubfield.code} from '${preceedingSubfield.value}' to '${nextValue}'`);
233
219
  preceedingSubfield.value = nextValue;
@@ -238,18 +224,16 @@ function _default() {
238
224
  };
239
225
  }
240
226
  function validate(record) {
241
- return {
242
- valid: record.fields.every(validateField(record.leader[6]))
243
- };
227
+ return { valid: record.fields.every(validateField(record.leader[6])) };
244
228
  }
245
229
  function fix(record) {
246
- record.fields.map(field => punctuateField(field, record.leader[6]));
230
+ record.fields.map((field) => punctuateField(field, record.leader[6]));
247
231
  return true;
248
232
  }
249
233
  return {
250
- description: 'Fixes punctuation of fields',
234
+ description: "Fixes punctuation of fields",
251
235
  validate,
252
236
  fix
253
237
  };
254
238
  }
255
- //# sourceMappingURL=index.js.map
239
+ //# sourceMappingURL=index.js.map
@@ -1 +1,7 @@
1
- {"version":3,"file":"index.js","names":["_marcRecord","require","_debug","_interopRequireDefault","_rules","e","__esModule","default","debug","createDebug","cloneDeep","field","r","MarcRecord","appendField","get","tag","_default","readPunctuationRulesFromJSON","recordType","json","getRules","rules","filter","row","selector","map","namePortion","description","portion","preceedingPunctuation","exceptions","RegExp","replace","trim","autRules","bibRules","fieldToString","subfields","ind1","ind2","subfield","code","value","join","validateField","element","testField","JSON","stringify","punctuated","punctuateField","isEqual","rulesForField","getRulesForField","length","currentPortion","preceedingField","inNamePortion","sub","getPortion","forEach","includes","addSubfieldPunctuation","addNamePortionPunctuation","rule","test","undefined","toUpperCase","preceedingSubfield","subfieldContainsPunctuation","nextValue","currentSubfield","punctType","getPrecedingPunctuation","exceptionsFunctions","getExceptions","isExceptionCase","some","fn","endsInPunctuation","slice","punct","Error","exception","parseExceptions","expectionsString","exceptionRules","split","exceptionFuncs","exceptionRule","match","exec","type","preceededCode","normalizedType","normalizedCode","push","ifPrecededByException","validate","record","valid","fields","every","leader","fix"],"sources":["../../src/punctuation/index.js"],"sourcesContent":["import {MarcRecord} from '@natlibfi/marc-record';\nimport createDebug from 'debug';\nimport {autRules, bibRules} from './rules';\n\nconst debug = createDebug('@natlibfi/marc-record-validator-melinda/punctuation:dev');\n\nfunction cloneDeep(field) {\n const r = new MarcRecord();\n r.appendField(field);\n return r.get(field.tag)?.[0];\n}\n\nexport default function () {\n function readPunctuationRulesFromJSON(recordType) {\n const json = getRules(recordType);\n const rules = json.filter(row => row.selector !== '').map(row => {\n const {selector, namePortion, description, portion, preceedingPunctuation, exceptions} = row;\n return {\n selector: new RegExp(selector.replace(/X/ug, '.'), 'u'),\n namePortion: namePortion.replace(/\\$/ug, '').trim(),\n description, portion, preceedingPunctuation, exceptions\n };\n });\n\n return rules;\n }\n\n function getRules(recordType) {\n if (recordType === 'z') {\n return autRules;\n }\n\n return bibRules;\n }\n\n function fieldToString(field) {\n if (field && field.subfields) {\n const ind1 = field.ind1 || ' ';\n const ind2 = field.ind2 || ' ';\n const subfields = field.subfields.map(subfield => `‡${subfield.code}${subfield.value}`).join('');\n return `${field.tag} ${ind1}${ind2} ${subfields}`;\n }\n\n return `${field.tag} ${field.value}`;\n }\n\n function validateField(recordType = 'a') {\n return function (element) {\n const testField = cloneDeep(element);\n debug(`Original field: ${JSON.stringify(element)}`);\n const punctuated = punctuateField(testField, recordType);\n debug(`Punctuation result: ${JSON.stringify(punctuated)}`);\n if (!punctuated) {\n debug('No punctuation result -> true');\n return true;\n }\n\n if (MarcRecord.isEqual(punctuated, element)) {\n debug(`Original field (element): ${JSON.stringify(element)}`);\n debug('Punctuation result equals original field');\n return true;\n }\n\n return false;\n };\n }\n\n function punctuateField(field, recordType) {\n const rules = readPunctuationRulesFromJSON(recordType);\n debug(`Handling field ${field.tag}`);\n debug(`Field contents: ${fieldToString(field)}`);\n const rulesForField = getRulesForField(field.tag, rules);\n if (rulesForField.length === 0) {\n debug(`No matching rules for field ${field.tag}`);\n return;\n }\n\n let currentPortion;\n let preceedingField;\n let inNamePortion = true;\n\n debug(`Field subfields: ${field.subfields.map(sub => sub.code)}`);\n debug(`Field portions: ${field.subfields.map(sub => getPortion(sub, rulesForField))}`);\n\n field.subfields.forEach(subfield => {\n debug(`Handling subfield ${subfield.code}`);\n let portion = getPortion(subfield, rulesForField);\n\n if (portion === false) {\n return;\n }\n\n if (portion === 'CF' || portion === 'NC') {\n return;\n }\n\n if (inNamePortion && portion.includes('T', 'S')) {\n debug(`Portion changed to ${portion}. Not in name portion anymore`);\n inNamePortion = false;\n }\n\n if (inNamePortion && portion === 'NT') {\n portion = 'N';\n }\n\n if (!inNamePortion && portion === 'NT') {\n portion = 'T';\n }\n\n debug(`Current portion is ${portion}.`);\n\n if (currentPortion) {\n if (currentPortion === portion) {\n debug(`Current stayed as ${portion}. Adding punctuation for subfield.`);\n addSubfieldPunctuation(preceedingField, subfield, rulesForField);\n } else {\n debug(`Current portion changed to ${portion}.`);\n if (portion !== 'S') {\n debug('Adding punctuation for portion.');\n addNamePortionPunctuation(preceedingField);\n }\n }\n }\n\n currentPortion = portion;\n preceedingField = subfield;\n });\n\n if (recordType !== 'z') {\n addNamePortionPunctuation(preceedingField);\n }\n\n debug(`After punctuation: ${fieldToString(field)}`);\n\n return field;\n }\n\n function getRulesForField(tag, rules) {\n return rules.filter(rule => rule.selector.test(tag));\n }\n\n function getPortion(subfield, rules) {\n debug(`Looking for namePortion for ${subfield.code}`);\n const [portion] = rules.filter(rule => rule.namePortion === subfield.code).map(rule => rule.portion);\n\n if (portion === undefined) {\n return false;\n }\n\n return portion.toUpperCase();\n }\n\n function addNamePortionPunctuation(preceedingSubfield) {\n const subfieldContainsPunctuation = (/[?\")\\].\\-!,]$/u).test(preceedingSubfield.value);\n if (!subfieldContainsPunctuation) {\n const nextValue = `${preceedingSubfield.value}.`;\n debug(`Updated subfield ${preceedingSubfield.code} from '${preceedingSubfield.value}' to '${nextValue}'`);\n preceedingSubfield.value = nextValue;\n }\n }\n\n function addSubfieldPunctuation(preceedingSubfield, currentSubfield, rules) {\n const punctType = getPrecedingPunctuation(currentSubfield, rules);\n const exceptionsFunctions = getExceptions(currentSubfield, rules);\n\n const isExceptionCase = exceptionsFunctions.some(fn => fn(preceedingSubfield));\n\n if (isExceptionCase) {\n return;\n }\n\n const endsInPunctuation = (/[?\")\\]\\-!,]$/u).test(preceedingSubfield.value);\n debug(`addSubfieldPunctuation -- punctType: ${punctType} endsInPunctuation: ${endsInPunctuation}`);\n\n if (!endsInPunctuation) {\n if (punctType === 'PERIOD' && !(/\\.$/u).test(preceedingSubfield.value)) {\n const nextValue = `${preceedingSubfield.value}.`;\n debug(`Updated subfield ${preceedingSubfield.code} from '${preceedingSubfield.value}' to '${nextValue}'`);\n preceedingSubfield.value = nextValue;\n }\n }\n\n if (punctType === 'COMMA') {\n if (!(/,$/u).test(preceedingSubfield.value)) {\n if (!(/^[[(]/u).test(currentSubfield.value)) {\n const nextValue = `${preceedingSubfield.value},`;\n debug(`Updated subfield ${preceedingSubfield.code} from '${preceedingSubfield.value}' to '${nextValue}'`);\n preceedingSubfield.value = nextValue;\n }\n }\n }\n\n if (punctType === 'COND_COMMA') {\n if (!(/[-,]$/u).test(preceedingSubfield.value)) {\n const nextValue = `${preceedingSubfield.value},`;\n debug(`Updated subfield ${preceedingSubfield.code} from '${preceedingSubfield.value}' to '${nextValue}'`);\n preceedingSubfield.value = nextValue;\n }\n }\n\n if (punctType === 'SPACECOLON') {\n if (!(/:$/u).test(preceedingSubfield.value)) {\n const nextValue = `${preceedingSubfield.value} :`;\n debug(`Updated subfield ${preceedingSubfield.code} from '${preceedingSubfield.value}' to '${nextValue}'`);\n preceedingSubfield.value = nextValue;\n }\n if ((/[^ ]:$/u).test(preceedingSubfield.value)) {\n const nextValue = `${preceedingSubfield.value.slice(0, -1)} :`;\n debug(`Updated subfield ${preceedingSubfield.code} from '${preceedingSubfield.value}' to '${nextValue}'`);\n preceedingSubfield.value = nextValue;\n }\n\n }\n\n debug('addSubfieldPunctuation -- end');\n }\n\n function getPrecedingPunctuation(subfield, rules) {\n const [punct] = rules.filter(rule => rule.namePortion === subfield.code).map(rule => rule.preceedingPunctuation);\n\n if (punct === undefined) {\n throw new Error(`Unknown subfield code ${subfield.code}`);\n }\n\n return punct.toUpperCase();\n }\n\n function getExceptions(subfield, rules) {\n const [exception] = rules.filter(rule => rule.namePortion === subfield.code).map(rule => parseExceptions(rule.exceptions));\n\n if (exception === undefined) {\n throw new Error(`Unknown subfield code ${subfield.code}`);\n }\n\n return exception;\n }\n\n function parseExceptions(expectionsString) {\n const exceptionRules = expectionsString.split('\\n');\n const exceptionFuncs = [];\n\n exceptionRules.forEach(exceptionRule => {\n const match = (/- (.*) if preceded by (.*)/u).exec(exceptionRule);\n if (match) {\n const [, type, preceededCode] = match;\n const normalizedType = type.trim().toUpperCase().trim();\n const normalizedCode = preceededCode.replace(/\\$/ug, '').trim();\n exceptionFuncs.push(ifPrecededByException(normalizedCode, normalizedType));\n }\n });\n\n return exceptionFuncs;\n }\n\n function ifPrecededByException(code, type) {\n return preceedingSubfield => {\n if (code === preceedingSubfield.code) {\n debug(`Adding ${type} to ${preceedingSubfield.code}`);\n if (type === 'SEMICOLON' && !(/;$/u).test(preceedingSubfield.value)) {\n const nextValue = `${preceedingSubfield.value} ;`;\n debug(`Updated subfield ${preceedingSubfield.code} from '${preceedingSubfield.value}' to '${nextValue}'`);\n preceedingSubfield.value = nextValue;\n }\n\n if (type === 'COLON' && !(/:$/u).test(preceedingSubfield.value)) {\n const nextValue = `${preceedingSubfield.value} :`;\n debug(`Updated subfield ${preceedingSubfield.code} from '${preceedingSubfield.value}' to '${nextValue}'`);\n preceedingSubfield.value = nextValue;\n }\n\n return true;\n }\n\n return false;\n };\n }\n\n function validate(record) {\n return {valid: record.fields.every(validateField(record.leader[6]))};\n }\n\n function fix(record) {\n record.fields.map(field => punctuateField(field, record.leader[6]));\n return true;\n }\n\n return {\n description: 'Fixes punctuation of fields',\n validate,\n fix\n };\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/punctuation/index.js"],
4
+ "sourcesContent": ["import {MarcRecord} from '@natlibfi/marc-record';\nimport createDebug from 'debug';\nimport {autRules, bibRules} from './rules/index.js';\n\nconst debug = createDebug('@natlibfi/marc-record-validator-melinda/punctuation:dev');\n\nfunction cloneDeep(field) {\n const r = new MarcRecord();\n r.appendField(field);\n return r.get(field.tag)?.[0];\n}\n\nexport default function () {\n function readPunctuationRulesFromJSON(recordType) {\n const json = getRules(recordType);\n const rules = json.filter(row => row.selector !== '').map(row => {\n const {selector, namePortion, description, portion, preceedingPunctuation, exceptions} = row;\n return {\n selector: new RegExp(selector.replace(/X/ug, '.'), 'u'),\n namePortion: namePortion.replace(/\\$/ug, '').trim(),\n description, portion, preceedingPunctuation, exceptions\n };\n });\n\n return rules;\n }\n\n function getRules(recordType) {\n if (recordType === 'z') {\n return autRules;\n }\n\n return bibRules;\n }\n\n function fieldToString(field) {\n if (field && field.subfields) {\n const ind1 = field.ind1 || ' ';\n const ind2 = field.ind2 || ' ';\n const subfields = field.subfields.map(subfield => `\u2021${subfield.code}${subfield.value}`).join('');\n return `${field.tag} ${ind1}${ind2} ${subfields}`;\n }\n\n return `${field.tag} ${field.value}`;\n }\n\n function validateField(recordType = 'a') {\n return function (element) {\n const testField = cloneDeep(element);\n debug(`Original field: ${JSON.stringify(element)}`);\n const punctuated = punctuateField(testField, recordType);\n debug(`Punctuation result: ${JSON.stringify(punctuated)}`);\n if (!punctuated) {\n debug('No punctuation result -> true');\n return true;\n }\n\n if (MarcRecord.isEqual(punctuated, element)) {\n debug(`Original field (element): ${JSON.stringify(element)}`);\n debug('Punctuation result equals original field');\n return true;\n }\n\n return false;\n };\n }\n\n function punctuateField(field, recordType) {\n const rules = readPunctuationRulesFromJSON(recordType);\n debug(`Handling field ${field.tag}`);\n debug(`Field contents: ${fieldToString(field)}`);\n const rulesForField = getRulesForField(field.tag, rules);\n if (rulesForField.length === 0) {\n debug(`No matching rules for field ${field.tag}`);\n return;\n }\n\n let currentPortion;\n let preceedingField;\n let inNamePortion = true;\n\n debug(`Field subfields: ${field.subfields.map(sub => sub.code)}`);\n debug(`Field portions: ${field.subfields.map(sub => getPortion(sub, rulesForField))}`);\n\n field.subfields.forEach(subfield => {\n debug(`Handling subfield ${subfield.code}`);\n let portion = getPortion(subfield, rulesForField);\n\n if (portion === false) {\n return;\n }\n\n if (portion === 'CF' || portion === 'NC') {\n return;\n }\n\n if (inNamePortion && portion.includes('T', 'S')) {\n debug(`Portion changed to ${portion}. Not in name portion anymore`);\n inNamePortion = false;\n }\n\n if (inNamePortion && portion === 'NT') {\n portion = 'N';\n }\n\n if (!inNamePortion && portion === 'NT') {\n portion = 'T';\n }\n\n debug(`Current portion is ${portion}.`);\n\n if (currentPortion) {\n if (currentPortion === portion) {\n debug(`Current stayed as ${portion}. Adding punctuation for subfield.`);\n addSubfieldPunctuation(preceedingField, subfield, rulesForField);\n } else {\n debug(`Current portion changed to ${portion}.`);\n if (portion !== 'S') {\n debug('Adding punctuation for portion.');\n addNamePortionPunctuation(preceedingField);\n }\n }\n }\n\n currentPortion = portion;\n preceedingField = subfield;\n });\n\n if (recordType !== 'z') {\n addNamePortionPunctuation(preceedingField);\n }\n\n debug(`After punctuation: ${fieldToString(field)}`);\n\n return field;\n }\n\n function getRulesForField(tag, rules) {\n return rules.filter(rule => rule.selector.test(tag));\n }\n\n function getPortion(subfield, rules) {\n debug(`Looking for namePortion for ${subfield.code}`);\n const [portion] = rules.filter(rule => rule.namePortion === subfield.code).map(rule => rule.portion);\n\n if (portion === undefined) {\n return false;\n }\n\n return portion.toUpperCase();\n }\n\n function addNamePortionPunctuation(preceedingSubfield) {\n const subfieldContainsPunctuation = (/[?\")\\].\\-!,]$/u).test(preceedingSubfield.value);\n if (!subfieldContainsPunctuation) {\n const nextValue = `${preceedingSubfield.value}.`;\n debug(`Updated subfield ${preceedingSubfield.code} from '${preceedingSubfield.value}' to '${nextValue}'`);\n preceedingSubfield.value = nextValue;\n }\n }\n\n function addSubfieldPunctuation(preceedingSubfield, currentSubfield, rules) {\n const punctType = getPrecedingPunctuation(currentSubfield, rules);\n const exceptionsFunctions = getExceptions(currentSubfield, rules);\n\n const isExceptionCase = exceptionsFunctions.some(fn => fn(preceedingSubfield));\n\n if (isExceptionCase) {\n return;\n }\n\n const endsInPunctuation = (/[?\")\\]\\-!,]$/u).test(preceedingSubfield.value);\n debug(`addSubfieldPunctuation -- punctType: ${punctType} endsInPunctuation: ${endsInPunctuation}`);\n\n if (!endsInPunctuation) {\n if (punctType === 'PERIOD' && !(/\\.$/u).test(preceedingSubfield.value)) {\n const nextValue = `${preceedingSubfield.value}.`;\n debug(`Updated subfield ${preceedingSubfield.code} from '${preceedingSubfield.value}' to '${nextValue}'`);\n preceedingSubfield.value = nextValue;\n }\n }\n\n if (punctType === 'COMMA') {\n if (!(/,$/u).test(preceedingSubfield.value)) {\n if (!(/^[[(]/u).test(currentSubfield.value)) {\n const nextValue = `${preceedingSubfield.value},`;\n debug(`Updated subfield ${preceedingSubfield.code} from '${preceedingSubfield.value}' to '${nextValue}'`);\n preceedingSubfield.value = nextValue;\n }\n }\n }\n\n if (punctType === 'COND_COMMA') {\n if (!(/[-,]$/u).test(preceedingSubfield.value)) {\n const nextValue = `${preceedingSubfield.value},`;\n debug(`Updated subfield ${preceedingSubfield.code} from '${preceedingSubfield.value}' to '${nextValue}'`);\n preceedingSubfield.value = nextValue;\n }\n }\n\n if (punctType === 'SPACECOLON') {\n if (!(/:$/u).test(preceedingSubfield.value)) {\n const nextValue = `${preceedingSubfield.value} :`;\n debug(`Updated subfield ${preceedingSubfield.code} from '${preceedingSubfield.value}' to '${nextValue}'`);\n preceedingSubfield.value = nextValue;\n }\n if ((/[^ ]:$/u).test(preceedingSubfield.value)) {\n const nextValue = `${preceedingSubfield.value.slice(0, -1)} :`;\n debug(`Updated subfield ${preceedingSubfield.code} from '${preceedingSubfield.value}' to '${nextValue}'`);\n preceedingSubfield.value = nextValue;\n }\n\n }\n\n debug('addSubfieldPunctuation -- end');\n }\n\n function getPrecedingPunctuation(subfield, rules) {\n const [punct] = rules.filter(rule => rule.namePortion === subfield.code).map(rule => rule.preceedingPunctuation);\n\n if (punct === undefined) {\n throw new Error(`Unknown subfield code ${subfield.code}`);\n }\n\n return punct.toUpperCase();\n }\n\n function getExceptions(subfield, rules) {\n const [exception] = rules.filter(rule => rule.namePortion === subfield.code).map(rule => parseExceptions(rule.exceptions));\n\n if (exception === undefined) {\n throw new Error(`Unknown subfield code ${subfield.code}`);\n }\n\n return exception;\n }\n\n function parseExceptions(expectionsString) {\n const exceptionRules = expectionsString.split('\\n');\n const exceptionFuncs = [];\n\n exceptionRules.forEach(exceptionRule => {\n const match = (/- (.*) if preceded by (.*)/u).exec(exceptionRule);\n if (match) {\n const [, type, preceededCode] = match;\n const normalizedType = type.trim().toUpperCase().trim();\n const normalizedCode = preceededCode.replace(/\\$/ug, '').trim();\n exceptionFuncs.push(ifPrecededByException(normalizedCode, normalizedType));\n }\n });\n\n return exceptionFuncs;\n }\n\n function ifPrecededByException(code, type) {\n return preceedingSubfield => {\n if (code === preceedingSubfield.code) {\n debug(`Adding ${type} to ${preceedingSubfield.code}`);\n if (type === 'SEMICOLON' && !(/;$/u).test(preceedingSubfield.value)) {\n const nextValue = `${preceedingSubfield.value} ;`;\n debug(`Updated subfield ${preceedingSubfield.code} from '${preceedingSubfield.value}' to '${nextValue}'`);\n preceedingSubfield.value = nextValue;\n }\n\n if (type === 'COLON' && !(/:$/u).test(preceedingSubfield.value)) {\n const nextValue = `${preceedingSubfield.value} :`;\n debug(`Updated subfield ${preceedingSubfield.code} from '${preceedingSubfield.value}' to '${nextValue}'`);\n preceedingSubfield.value = nextValue;\n }\n\n return true;\n }\n\n return false;\n };\n }\n\n function validate(record) {\n return {valid: record.fields.every(validateField(record.leader[6]))};\n }\n\n function fix(record) {\n record.fields.map(field => punctuateField(field, record.leader[6]));\n return true;\n }\n\n return {\n description: 'Fixes punctuation of fields',\n validate,\n fix\n };\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }