@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
@@ -1 +1,7 @@
1
- {"version":3,"file":"subfield6Utils.js","names":["_debug","_interopRequireDefault","require","_subfield8Utils","_utils","e","__esModule","default","debug","createDebugLogger","debugDev","extend","sf6Regexp","isValidSubfield6","subfield","code","value","match","subfield6GetTag","substring","undefined","subfield6GetOccurrenceNumber","replace","subfield6GetOccurrenceNumberAsInteger","index","result","parseInt","subfield6ResetOccurrenceNumber","occurrenceNumber","occurrenceNumberAsString","intToOccurrenceNumberString","newValue","subfield6GetTail","subfield6HasWantedTagAndOccurrenceNumber","tagAndOccurrenceNumber","key","nvdebug","fieldGetUnambiguousTag","field","tags","subfields","filter","sf","length","fieldGetUnambiguousOccurrenceNumber","occurrenceNumbers","fieldHasOccurrenceNumber","some","fieldResetOccurrenceNumber","newOccurrenceNumber","oldOccurrenceNumber","forEach","innerReset","currOccurrenceNumber","i","fieldGetMaxSubfield6OccurrenceNumberAsInteger","sf6s","vals","map","Math","max","fieldHasWantedTagAndOccurrenceNumber","fieldHasValidSubfield6","isSubfield6Pair","otherField","tagsArePairable6","tag","fieldIndex","otherFieldIndex","tag1","tag2","subfieldSevenToOneOccurrenceNumber","fieldSevenToOneOccurrenceNumber","fieldGetOccurrenceNumberPairs","candFields","pairs","fieldToString","pairedField","fieldGetOccurrenceNumbers","subfieldExtractOccurrenceNumber","includes","push","fieldsGetOccurrenceNumbers","fields","f","fieldProcessOccurrenceNumbers","newOccurrenceNumbers","is7XX","normalizeEntryTag","subfieldToNormalizedString","targetLinkingNumber","normalizeOccurrenceNumber","normalizeEntryTagBoolean","isValidSubfield8","currLinkingNumber","getSubfield8LinkingNumber","normVal","subfieldToString","fieldToNormalizedString","ind1","ind2","formatAndNormalizeSubfields","join","guessTargetLinkingNumber","defaultTargetLinkingNumber","linkingNumbers","fieldsGetAllSubfield8LinkingNumbers","fieldsToNormalizedString","strings","sort","getFirstField","record","fieldsAsStrings","findIndex","isRelevantSubfield6Chain","non880","every","fieldHasSubfield","fieldIsFirstFieldInChain","chain","firstField","getAllLinkedSubfield6Fields","get6s","moreFields","add8s","isFirstLinkedSubfield6Field","fieldsToString","recordGetSubfield6ChainHeads","recordGetMaxSubfield6OccurrenceNumberAsInteger","candidateFields","sixes","relevantFields","o","resetSubfield6Tag"],"sources":["../src/subfield6Utils.js"],"sourcesContent":["import createDebugLogger from 'debug';\n// const debug = createDebugLogger('@natlibfi/marc-record-validator-melinda/subfield6Utils');\n\nimport {add8s, fieldsGetAllSubfield8LinkingNumbers, getSubfield8LinkingNumber, isValidSubfield8} from './subfield8Utils';\nimport {fieldHasSubfield, fieldToString, fieldsToString, nvdebug, subfieldToString} from './utils';\n\nconst debug = createDebugLogger('@natlibfi/melinda-marc-record-merge-reducers:subfield6Utils');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\n// NB! Subfield 6 is non-repeatable and it should always comes first!\n// NB! Index size should always be 2 (preceding 0 required for 01..09) However, support for 100+ was added on 2023-02-27.\n// NB! Index value '00' are left as they are (is not paired/indexed/whatever.\nconst sf6Regexp = /^[0-9][0-9][0-9]-(?:[0-9][0-9]|[1-9][0-9]+)(?:[^0-9].*)?$/u;\n\nexport function isValidSubfield6(subfield) {\n if (subfield.code !== '6') {\n return false;\n }\n return subfield.value.match(sf6Regexp);\n}\n\nexport function subfield6GetTag(subfield) {\n if (isValidSubfield6(subfield)) {\n return subfield.value.substring(0, 3);\n }\n return undefined;\n}\n\nexport function subfield6GetOccurrenceNumber(subfield) {\n if (isValidSubfield6(subfield)) {\n // Skip \"TAG-\" prefix. 2023-02-20: removed 2-digit requirement from here...\n return subfield.value.substring(4).replace(/\\D.*$/u, '');\n }\n return undefined;\n}\n\nexport function subfield6GetOccurrenceNumberAsInteger(subfield) {\n const index = subfield6GetOccurrenceNumber(subfield);\n if (index === undefined || index === '00') {\n return 0;\n }\n const result = parseInt(index, 10);\n //nvdebug(`SF6: ${subfield.value} => ${index} => ${result}`, debug);\n return result;\n}\n\nexport function subfield6ResetOccurrenceNumber(subfield, occurrenceNumber) {\n if (!isValidSubfield6(subfield)) {\n return;\n }\n const occurrenceNumberAsString = typeof occurrenceNumber === 'number' ? intToOccurrenceNumberString(occurrenceNumber) : occurrenceNumber;\n\n const newValue = subfield.value.substring(0, 4) + occurrenceNumberAsString + subfield6GetTail(subfield);\n //nvdebug(`Set subfield $6 value from ${subfieldToString(subfield)} to ${newValue}`);\n subfield.value = newValue;\n}\n\n\nfunction subfield6GetTail(subfield) {\n if (isValidSubfield6(subfield)) {\n // Skip \"TAG-\" prefix. 2023-02-20: removed 2-digit requirement from here...\n return subfield.value.replace(/^\\d+-\\d+/u, '');\n }\n return '';\n}\n\nexport function subfield6HasWantedTagAndOccurrenceNumber(subfield, tagAndOccurrenceNumber) {\n if (subfield.code !== '6') {\n return false;\n }\n // We could also use generic code and go getTag()+'-'+getIndex() instead of regexp...\n const key = subfield.value.replace(/^([0-9][0-9][0-9]-[0-9][0-9]+).*$/u, '$1');\n nvdebug(` Compare '${key}' vs '${tagAndOccurrenceNumber}'`);\n return key === tagAndOccurrenceNumber;\n}\n\n// <= SUBFIELD, FIELD =>\n\nexport function fieldGetUnambiguousTag(field) {\n const tags = field.subfields.filter(sf => subfield6GetTag(sf));\n if (tags.length === 1) {\n return subfield6GetTag(tags[0]);\n }\n return undefined;\n}\n\nexport function fieldGetUnambiguousOccurrenceNumber(field) {\n const occurrenceNumbers = field.subfields.filter(sf => subfield6GetOccurrenceNumber(sf));\n if (occurrenceNumbers.length === 1) {\n return subfield6GetOccurrenceNumber(occurrenceNumbers[0]);\n }\n return undefined;\n}\n\nexport function fieldHasOccurrenceNumber(field, occurrenceNumber) {\n //nvdebug(`${occurrenceNumber} vs ${fieldToString(field)}`);\n return field.subfields && field.subfields.some(sf => subfield6GetOccurrenceNumber(sf) === occurrenceNumber);\n}\n\nexport function fieldResetOccurrenceNumber(field, newOccurrenceNumber, oldOccurrenceNumber = undefined) {\n field.subfields.forEach(subfield => innerReset(subfield)); // eslint-disable-line array-callback-return\n\n function innerReset(subfield) {\n // (Optional) Check that this is really the occurrence number we wan't to reseot\n if (oldOccurrenceNumber !== undefined) {\n const currOccurrenceNumber = subfield6GetOccurrenceNumber(subfield);\n if (currOccurrenceNumber !== oldOccurrenceNumber) {\n return;\n }\n }\n subfield6ResetOccurrenceNumber(subfield, newOccurrenceNumber);\n }\n}\n\nexport function intToOccurrenceNumberString(i) {\n return i < 10 ? `0${i}` : `${i}`;\n}\n\nexport function fieldGetMaxSubfield6OccurrenceNumberAsInteger(field) {\n // used by reducer!\n //nvdebug(`Checking subfields $6 from ${JSON.stringify(field)}`);\n const sf6s = field.subfields ? field.subfields.filter(subfield => isValidSubfield6(subfield)) : [];\n if (sf6s.length === 0) {\n return 0;\n }\n // There should always be one, but here we check every subfield.\n //nvdebug(`Got ${field.subfields} $6-subfield(s) from ${JSON.stringify(field)}`, debug);\n const vals = sf6s.map(sf => subfield6GetOccurrenceNumberAsInteger(sf));\n return Math.max(...vals);\n}\n\nexport function fieldHasWantedTagAndOccurrenceNumber(field, tagAndOccurrenceNumber) {\n return field.subfields && field.subfields.some(sf => subfield6HasWantedTagAndOccurrenceNumber(sf, tagAndOccurrenceNumber));\n}\n\n\n/*\nexport function getFieldsWithGivenOccurrenceNumberSubfield6(record, occurrenceNumberAsString) {\n const record.fields.filter(field => field\n\n function fieldHasIndex(field, index) {\n if (!field.subfields) {\n return false;\n }\n return field.subfields.find(sf => isValidSubfield6(sf) && subfieldGetOccurrenceNumber6(sf) === index);\n }\n}\n*/\n\n\nexport function fieldHasValidSubfield6(field) {\n return field.subfields && field.subfields.some(sf => isValidSubfield6(sf));\n}\n\nexport function isSubfield6Pair(field, otherField) {\n // No need to log this:\n //nvdebug(`LOOK for $6-pair:\\n ${fieldToString(field)}\\n ${fieldToString(otherField)}`);\n if (!fieldHasValidSubfield6(field) || !fieldHasValidSubfield6(otherField)) {\n return false;\n }\n\n if (!tagsArePairable6(field.tag, otherField.tag)) {\n //nvdebug(` FAILED. REASON: TAGS NOT PAIRABLE!`);\n return false;\n }\n\n\n const fieldIndex = fieldGetUnambiguousOccurrenceNumber(field);\n if (fieldIndex === undefined || fieldIndex === '00') {\n //nvdebug(` FAILED. REASON: NO INDEX FOUND`);\n return false;\n }\n\n const otherFieldIndex = fieldGetUnambiguousOccurrenceNumber(otherField);\n\n\n if (fieldIndex !== otherFieldIndex) {\n //nvdebug(` FAILURE: INDEXES: ${fieldIndex} vs ${otherFieldIndex}`);\n return false;\n }\n\n if (fieldGetUnambiguousTag(field) !== otherField.tag || field.tag !== fieldGetUnambiguousTag(otherField)) {\n //nvdebug(` FAILURE: TAG vs $6 TAG`);\n return false;\n }\n return true;\n\n function tagsArePairable6(tag1, tag2) {\n // How to do XOR operation in one line? Well, this is probably more readable...\n if (tag1 === '880' && tag2 === '880') {\n return false;\n }\n if (tag1 !== '880' && tag2 !== '880') {\n return false;\n }\n return true;\n }\n}\n\n\nfunction subfieldSevenToOneOccurrenceNumber(subfield) {\n if (subfield.code !== '6' || subfield.value.substring(0, 1) !== '7') {\n return;\n }\n subfield.value = `1${subfield.value.substring(1)}`;\n}\n\nexport function fieldSevenToOneOccurrenceNumber(field) {\n if (field.tag !== '880') {\n return;\n }\n field.subfields.forEach(sf => subfieldSevenToOneOccurrenceNumber(sf)); // eslint-disable-line array-callback-return\n}\n\n\nexport function fieldGetOccurrenceNumberPairs(field, candFields) {\n // NB! TAG!=880 returns 880 fields, TAG==880 returns non-880 field\n //nvdebug(` Trying to finds pair for ${fieldToString(field)} in ${candFields.length} fields`);\n const pairs = candFields.filter(otherField => isSubfield6Pair(field, otherField));\n if (pairs.length === 0) {\n nvdebug(`NO PAIRS FOUND FOR '${fieldToString(field)}'`);\n return pairs;\n }\n nvdebug(`${pairs.length} PAIR(S) FOUND FOR '${fieldToString(field)}'`);\n pairs.forEach(pairedField => nvdebug(` '${fieldToString(pairedField)}'`)); // eslint-disable-line array-callback-return\n return pairs;\n}\n\nexport function fieldGetOccurrenceNumbers(field) {\n /* eslint-disable */\n let occurrenceNumbers = [];\n field.subfields?.forEach(sf => subfieldExtractOccurrenceNumber(sf));\n\n function subfieldExtractOccurrenceNumber(sf) {\n if (!isValidSubfield6(sf)) {\n return;\n }\n const occurrenceNumber = subfield6GetOccurrenceNumber(sf);\n if (occurrenceNumber === '00' || occurrenceNumbers.includes(occurrenceNumber)) {\n return;\n }\n occurrenceNumbers.push(occurrenceNumber);\n }\n /* eslint-enable */\n return occurrenceNumbers;\n}\n\nexport function fieldsGetOccurrenceNumbers(fields) {\n /* eslint-disable */\n let occurrenceNumbers = [];\n\n fields.forEach(f => fieldProcessOccurrenceNumbers(f));\n\n function fieldProcessOccurrenceNumbers(f) {\n const newOccurrenceNumbers = fieldGetOccurrenceNumbers(f);\n newOccurrenceNumbers.forEach(occurrenceNumber => {\n if (!occurrenceNumbers.includes(occurrenceNumber)) {\n occurrenceNumbers.push(occurrenceNumber);\n }\n\n });\n }\n /* eslint-enable */\n return occurrenceNumbers;\n}\n\n/*\nexport function fieldGetSubfield6Pair(field, record) {\n const pairedFields = record.fields.filter(otherField => isSubfield6Pair(field, otherField));\n if (pairedFields.length !== 1) {\n return undefined;\n }\n // NB! It is theoretically possible to have multiple pairable 880 fields (one for each encoding)\n nvdebug(`fieldGetSubfield6Pair(): ${fieldToString(field)} => ${fieldToString(pairedFields[0])}`);\n return pairedFields[0];\n}\n*/\n\n/*\nexport function pairAndStringify6(field, record) {\n const pair6 = fieldGetSubfield6Pair(field, record);\n if (!pair6) {\n return fieldToNormalizedString(field);\n }\n return fieldsToNormalizedString([field, pair6]);\n}\n*/\n\n// Frequencly list for $6 subfields in 1XX/7XX fields:\n// 231115 100\n// 183832 700\n// 28773 710\n// 2047 711\n// 661 110\n// 341 111\n// 284 130\n// 63 730\n// Thus there's a real risk of ending up with, say, identical 100 vs 700 chains.\n// Semi-hackily support 1XX/7XX-version: 7XX can be deleted if corresponding 1XX exists:\n\nexport function is7XX(tag) {\n return ['700', '710', '711', '730'].includes(tag);\n}\n\n\nfunction normalizeEntryTag(tag) {\n if (tag.match(/^[17](?:00|10|11|30)$/u)) {\n return `X${tag.substring(1)}`;\n }\n return tag;\n}\n\nfunction subfieldToNormalizedString(sf, tag, targetLinkingNumber = 0, normalizeOccurrenceNumber = false, normalizeEntryTagBoolean = false) {\n // targetLinkingNumber refers to $8.\n // normalizeEntryTagBoolean refers to 1XX/7XX tag values in subfield $6 value.\n if (isValidSubfield6(sf)) { // && targetLinkingNumber === 0) {\n // 1XX/7XX (entry tag) normalization:\n const tag2 = normalizeEntryTagBoolean ? normalizeEntryTag(tag) : tag;\n\n const occurrenceNumber = normalizeOccurrenceNumber ? 'XX' : subfield6GetOccurrenceNumber(sf);\n // If we are normalizing a $8 chain, don't normalize $6 occurrence number!\n // Replace $6 occurrence number with XX:\n return ` ‡${sf.code} ${tag2}-${occurrenceNumber}${subfield6GetTail(sf)}`;\n }\n\n if (isValidSubfield8(sf)) {\n const currLinkingNumber = getSubfield8LinkingNumber(sf); //getSubfield8Index(sf);\n if (targetLinkingNumber > 0 && currLinkingNumber === targetLinkingNumber) {\n // For $8 we should only XX the index we are looking at...\n const normVal = sf.value.replace(/^[0-9]+/u, 'XX');\n return ` ‡${sf.code} ${normVal}`;\n }\n return ''; // Other $8 subfields are meaningless in this context\n }\n return ` ${subfieldToString(sf)}`; // `‡${sf.code} ${sf.value}`;\n}\n\nexport function fieldToNormalizedString(field, targetLinkingNumber = 0, normalizeOccurrenceNumber = false, normalizeEntryTagBoolean = false) {\n if ('subfields' in field) {\n const tag2 = normalizeEntryTagBoolean ? normalizeEntryTag(field.tag) : field.tag;\n return `${tag2} ${field.ind1}${field.ind2}${formatAndNormalizeSubfields(field)}`;\n }\n return `${field.tag} ${field.value}`;\n\n function formatAndNormalizeSubfields(field) {\n return field.subfields.map(sf => subfieldToNormalizedString(sf, field.tag, targetLinkingNumber, normalizeOccurrenceNumber, normalizeEntryTagBoolean)).join('');\n }\n\n}\n\n\nfunction guessTargetLinkingNumber(fields, defaultTargetLinkingNumber) {\n if (defaultTargetLinkingNumber !== 0) {\n return defaultTargetLinkingNumber;\n }\n const linkingNumbers = fieldsGetAllSubfield8LinkingNumbers(fields);\n return linkingNumbers.length === 1 ? linkingNumbers[0] : 0;\n}\n\nexport function fieldsToNormalizedString(fields, defaultTargetLinkingNumber = 0, normalizeOccurrenceNumber = false, normalizeEntryTag = false) {\n const targetLinkingNumber = guessTargetLinkingNumber(fields, defaultTargetLinkingNumber);\n\n nvdebug(`fieldsToNormalizedString: OCC: ${normalizeOccurrenceNumber}`);\n const strings = fields.map(field => fieldToNormalizedString(field, targetLinkingNumber, normalizeOccurrenceNumber, normalizeEntryTag));\n strings.sort();\n return strings.join('\\t__SEPARATOR__\\t');\n}\n\n\n/*\n\nexport function removeField6IfNeeded(field, record, fieldsAsString) {\n const pairField = fieldGetSubfield6Pair(field, record);\n const asString = pairField ? fieldsToNormalizedString([field, pairField]) : fieldToNormalizedString(field);\n nvdebug(`SOURCE: ${asString} -- REALITY: ${fieldToString(field)}`);\n const tmp = pairField ? fieldToString(pairField) : 'HUTI';\n nvdebug(`PAIR: ${tmp}`);\n nvdebug(`BASE:\\n ${fieldsAsString.join('\\n ')}`);\n if (!fieldsAsString.includes(asString)) {\n return;\n }\n nvdebug(`Duplicate $6 removal: ${fieldToString(field)}`);\n record.removeField(field);\n\n if (pairField === undefined) {\n return;\n }\n nvdebug(`Duplicate $6 removal (pair): ${fieldToString(pairField)}`);\n record.removeField(pairField);\n}\n*/\n\nfunction getFirstField(record, fields) {\n const fieldsAsStrings = fields.map(field => fieldToString(field));\n //record.fields.forEach((field, i) => nvdebug(`${i}:\\t${fieldToString(field)}`));\n //nvdebug(`getFirstField: ${fieldsAsStrings.join('\\t')}`);\n const i = record.fields.findIndex(field => fieldsAsStrings.includes(fieldToString(field)));\n if (i > -1) {\n const field = record.fields[i];\n //nvdebug(`1st F: ${i + 1}/${record.fields.length} ${fieldToString(field)}`);\n return field;\n }\n return undefined;\n}\n\nfunction isRelevantSubfield6Chain(fields) {\n if (fields.length < 2) { // 1 non-880-field and 1+ 880 fields\n return false;\n }\n const non880 = fields.filter(f => f.tag !== '880');\n if (non880.length !== 1) {\n return false;\n }\n\n const linkingNumbers = fieldsGetAllSubfield8LinkingNumbers(fields);\n if (linkingNumbers.length !== 0) {\n return false;\n }\n\n return fields.every(f => fieldHasSubfield(f, '6'));\n}\n\nexport function fieldIsFirstFieldInChain(field, chain, record) {\n // Interpretation of first: position of field in record (however, we might have a duplicate field. See tests...)\n const firstField = getFirstField(record, chain);\n if (firstField) {\n return fieldToString(field) === fieldToString(firstField);\n }\n return false;\n\n}\n\n\nexport function getAllLinkedSubfield6Fields(field, record) {\n const fields = get6s(field, record);\n const moreFields = add8s(fields, record);\n\n // Currently we don't handle fields with more than one $6 and/or $8 subfield.\n if (moreFields.length > fields.length) {\n return []; // Don't fix!\n }\n return moreFields;\n}\n\nexport function isFirstLinkedSubfield6Field(field, record) {\n if (!field.subfields) { // Is not a datafield\n return false;\n }\n const chain = getAllLinkedSubfield6Fields(field, record);\n if (!isRelevantSubfield6Chain(chain)) {\n nvdebug(`Rejected 6: ${fieldsToString(chain)}`);\n return false;\n }\n\n return fieldIsFirstFieldInChain(field, chain, record);\n}\n\nexport function recordGetSubfield6ChainHeads(record) {\n return record.fields.filter(field => isFirstLinkedSubfield6Field(field, record));\n}\n\nexport function recordGetMaxSubfield6OccurrenceNumberAsInteger(record) {\n if (record.fields.length === 0) {\n return 0;\n }\n // Should we cache the value here?\n const vals = record.fields.map((field) => fieldGetMaxSubfield6OccurrenceNumberAsInteger(field));\n return Math.max(...vals);\n}\n\nexport function get6s(field, candidateFields) { // NB! Convert field to fields!!!\n // Get all fields with given occurrence number\n const sixes = field.subfields.filter(sf => isValidSubfield6(sf));\n\n if (sixes.length === 0) {\n return [field];\n }\n nvdebug(`SIXES: ${sixes.length}`);\n const occurrenceNumbers = sixes.map(sf => subfield6GetOccurrenceNumber(sf)).filter(value => value !== undefined && value !== '00');\n nvdebug(occurrenceNumbers.join(' -- '));\n\n const relevantFields = candidateFields.filter(f => occurrenceNumbers.some(o => fieldHasOccurrenceNumber(f, o)));\n nvdebug(`${fieldToString(field)}: $6-RELFIELDS FOUND: ${relevantFields.length}...`);\n relevantFields.forEach(f => nvdebug(fieldToString(f))); // eslint-disable-line array-callback-return\n return relevantFields;\n}\n\nexport function resetSubfield6Tag(subfield, tag) {\n if (!isValidSubfield6(subfield)) {\n return;\n }\n // NB! mainly for 1XX<->7XX transfers\n const newValue = `${tag}-${subfield.value.substring(4)}`;\n nvdebug(`Set subfield $6 value from ${subfieldToString(subfield)} to ${newValue}`, debugDev);\n subfield.value = newValue;\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/subfield6Utils.js"],
4
+ "sourcesContent": ["import createDebugLogger from 'debug';\n// const debug = createDebugLogger('@natlibfi/marc-record-validator-melinda/subfield6Utils');\n\nimport {add8s, fieldsGetAllSubfield8LinkingNumbers, getSubfield8LinkingNumber, isValidSubfield8} from './subfield8Utils.js';\nimport {fieldHasSubfield, fieldToString, fieldsToString, nvdebug, subfieldToString} from './utils.js';\n\nconst debug = createDebugLogger('@natlibfi/melinda-marc-record-merge-reducers:subfield6Utils');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\n// NB! Subfield 6 is non-repeatable and it should always comes first!\n// NB! Index size should always be 2 (preceding 0 required for 01..09) However, support for 100+ was added on 2023-02-27.\n// NB! Index value '00' are left as they are (is not paired/indexed/whatever.\nconst sf6Regexp = /^[0-9][0-9][0-9]-(?:[0-9][0-9]|[1-9][0-9]+)(?:[^0-9].*)?$/u;\n\nexport function isValidSubfield6(subfield) {\n if (subfield.code !== '6') {\n return false;\n }\n return subfield.value.match(sf6Regexp);\n}\n\nexport function subfield6GetTag(subfield) {\n if (isValidSubfield6(subfield)) {\n return subfield.value.substring(0, 3);\n }\n return undefined;\n}\n\nexport function subfield6GetOccurrenceNumber(subfield) {\n if (isValidSubfield6(subfield)) {\n // Skip \"TAG-\" prefix. 2023-02-20: removed 2-digit requirement from here...\n return subfield.value.substring(4).replace(/\\D.*$/u, '');\n }\n return undefined;\n}\n\nexport function subfield6GetOccurrenceNumberAsInteger(subfield) {\n const index = subfield6GetOccurrenceNumber(subfield);\n if (index === undefined || index === '00') {\n return 0;\n }\n const result = parseInt(index, 10);\n //nvdebug(`SF6: ${subfield.value} => ${index} => ${result}`, debug);\n return result;\n}\n\nexport function subfield6ResetOccurrenceNumber(subfield, occurrenceNumber) {\n if (!isValidSubfield6(subfield)) {\n return;\n }\n const occurrenceNumberAsString = typeof occurrenceNumber === 'number' ? intToOccurrenceNumberString(occurrenceNumber) : occurrenceNumber;\n\n const newValue = subfield.value.substring(0, 4) + occurrenceNumberAsString + subfield6GetTail(subfield);\n //nvdebug(`Set subfield $6 value from ${subfieldToString(subfield)} to ${newValue}`);\n subfield.value = newValue;\n}\n\n\nfunction subfield6GetTail(subfield) {\n if (isValidSubfield6(subfield)) {\n // Skip \"TAG-\" prefix. 2023-02-20: removed 2-digit requirement from here...\n return subfield.value.replace(/^\\d+-\\d+/u, '');\n }\n return '';\n}\n\nexport function subfield6HasWantedTagAndOccurrenceNumber(subfield, tagAndOccurrenceNumber) {\n if (subfield.code !== '6') {\n return false;\n }\n // We could also use generic code and go getTag()+'-'+getIndex() instead of regexp...\n const key = subfield.value.replace(/^([0-9][0-9][0-9]-[0-9][0-9]+).*$/u, '$1');\n nvdebug(` Compare '${key}' vs '${tagAndOccurrenceNumber}'`);\n return key === tagAndOccurrenceNumber;\n}\n\n// <= SUBFIELD, FIELD =>\n\nexport function fieldGetUnambiguousTag(field) {\n const tags = field.subfields.filter(sf => subfield6GetTag(sf));\n if (tags.length === 1) {\n return subfield6GetTag(tags[0]);\n }\n return undefined;\n}\n\nexport function fieldGetUnambiguousOccurrenceNumber(field) {\n const occurrenceNumbers = field.subfields.filter(sf => subfield6GetOccurrenceNumber(sf));\n if (occurrenceNumbers.length === 1) {\n return subfield6GetOccurrenceNumber(occurrenceNumbers[0]);\n }\n return undefined;\n}\n\nexport function fieldHasOccurrenceNumber(field, occurrenceNumber) {\n //nvdebug(`${occurrenceNumber} vs ${fieldToString(field)}`);\n return field.subfields && field.subfields.some(sf => subfield6GetOccurrenceNumber(sf) === occurrenceNumber);\n}\n\nexport function fieldResetOccurrenceNumber(field, newOccurrenceNumber, oldOccurrenceNumber = undefined) {\n field.subfields.forEach(subfield => innerReset(subfield));\n\n function innerReset(subfield) {\n // (Optional) Check that this is really the occurrence number we wan't to reseot\n if (oldOccurrenceNumber !== undefined) {\n const currOccurrenceNumber = subfield6GetOccurrenceNumber(subfield);\n if (currOccurrenceNumber !== oldOccurrenceNumber) {\n return;\n }\n }\n subfield6ResetOccurrenceNumber(subfield, newOccurrenceNumber);\n }\n}\n\nexport function intToOccurrenceNumberString(i) {\n return i < 10 ? `0${i}` : `${i}`;\n}\n\nexport function fieldGetMaxSubfield6OccurrenceNumberAsInteger(field) {\n // used by reducer!\n //nvdebug(`Checking subfields $6 from ${JSON.stringify(field)}`);\n const sf6s = field.subfields ? field.subfields.filter(subfield => isValidSubfield6(subfield)) : [];\n if (sf6s.length === 0) {\n return 0;\n }\n // There should always be one, but here we check every subfield.\n //nvdebug(`Got ${field.subfields} $6-subfield(s) from ${JSON.stringify(field)}`, debug);\n const vals = sf6s.map(sf => subfield6GetOccurrenceNumberAsInteger(sf));\n return Math.max(...vals);\n}\n\nexport function fieldHasWantedTagAndOccurrenceNumber(field, tagAndOccurrenceNumber) {\n return field.subfields && field.subfields.some(sf => subfield6HasWantedTagAndOccurrenceNumber(sf, tagAndOccurrenceNumber));\n}\n\n\n/*\nexport function getFieldsWithGivenOccurrenceNumberSubfield6(record, occurrenceNumberAsString) {\n const record.fields.filter(field => field\n\n function fieldHasIndex(field, index) {\n if (!field.subfields) {\n return false;\n }\n return field.subfields.find(sf => isValidSubfield6(sf) && subfieldGetOccurrenceNumber6(sf) === index);\n }\n}\n*/\n\n\nexport function fieldHasValidSubfield6(field) {\n return field.subfields && field.subfields.some(sf => isValidSubfield6(sf));\n}\n\nexport function isSubfield6Pair(field, otherField) {\n // No need to log this:\n //nvdebug(`LOOK for $6-pair:\\n ${fieldToString(field)}\\n ${fieldToString(otherField)}`);\n if (!fieldHasValidSubfield6(field) || !fieldHasValidSubfield6(otherField)) {\n return false;\n }\n\n if (!tagsArePairable6(field.tag, otherField.tag)) {\n //nvdebug(` FAILED. REASON: TAGS NOT PAIRABLE!`);\n return false;\n }\n\n\n const fieldIndex = fieldGetUnambiguousOccurrenceNumber(field);\n if (fieldIndex === undefined || fieldIndex === '00') {\n //nvdebug(` FAILED. REASON: NO INDEX FOUND`);\n return false;\n }\n\n const otherFieldIndex = fieldGetUnambiguousOccurrenceNumber(otherField);\n\n\n if (fieldIndex !== otherFieldIndex) {\n //nvdebug(` FAILURE: INDEXES: ${fieldIndex} vs ${otherFieldIndex}`);\n return false;\n }\n\n if (fieldGetUnambiguousTag(field) !== otherField.tag || field.tag !== fieldGetUnambiguousTag(otherField)) {\n //nvdebug(` FAILURE: TAG vs $6 TAG`);\n return false;\n }\n return true;\n\n function tagsArePairable6(tag1, tag2) {\n // How to do XOR operation in one line? Well, this is probably more readable...\n if (tag1 === '880' && tag2 === '880') {\n return false;\n }\n if (tag1 !== '880' && tag2 !== '880') {\n return false;\n }\n return true;\n }\n}\n\n\nfunction subfieldSevenToOneOccurrenceNumber(subfield) {\n if (subfield.code !== '6' || subfield.value.substring(0, 1) !== '7') {\n return;\n }\n subfield.value = `1${subfield.value.substring(1)}`;\n}\n\nexport function fieldSevenToOneOccurrenceNumber(field) {\n if (field.tag !== '880') {\n return;\n }\n field.subfields.forEach(sf => subfieldSevenToOneOccurrenceNumber(sf));\n}\n\n\nexport function fieldGetOccurrenceNumberPairs(field, candFields) {\n // NB! TAG!=880 returns 880 fields, TAG==880 returns non-880 field\n //nvdebug(` Trying to finds pair for ${fieldToString(field)} in ${candFields.length} fields`);\n const pairs = candFields.filter(otherField => isSubfield6Pair(field, otherField));\n if (pairs.length === 0) {\n nvdebug(`NO PAIRS FOUND FOR '${fieldToString(field)}'`);\n return pairs;\n }\n nvdebug(`${pairs.length} PAIR(S) FOUND FOR '${fieldToString(field)}'`);\n pairs.forEach(pairedField => nvdebug(` '${fieldToString(pairedField)}'`));\n return pairs;\n}\n\nexport function fieldGetOccurrenceNumbers(field) {\n let occurrenceNumbers = [];\n field.subfields?.forEach(sf => subfieldExtractOccurrenceNumber(sf));\n\n function subfieldExtractOccurrenceNumber(sf) {\n if (!isValidSubfield6(sf)) {\n return;\n }\n const occurrenceNumber = subfield6GetOccurrenceNumber(sf);\n if (occurrenceNumber === '00' || occurrenceNumbers.includes(occurrenceNumber)) {\n return;\n }\n occurrenceNumbers.push(occurrenceNumber);\n }\n return occurrenceNumbers;\n}\n\nexport function fieldsGetOccurrenceNumbers(fields) {\n let occurrenceNumbers = [];\n\n fields.forEach(f => fieldProcessOccurrenceNumbers(f));\n\n function fieldProcessOccurrenceNumbers(f) {\n const newOccurrenceNumbers = fieldGetOccurrenceNumbers(f);\n newOccurrenceNumbers.forEach(occurrenceNumber => {\n if (!occurrenceNumbers.includes(occurrenceNumber)) {\n occurrenceNumbers.push(occurrenceNumber);\n }\n\n });\n }\n return occurrenceNumbers;\n}\n\n/*\nexport function fieldGetSubfield6Pair(field, record) {\n const pairedFields = record.fields.filter(otherField => isSubfield6Pair(field, otherField));\n if (pairedFields.length !== 1) {\n return undefined;\n }\n // NB! It is theoretically possible to have multiple pairable 880 fields (one for each encoding)\n nvdebug(`fieldGetSubfield6Pair(): ${fieldToString(field)} => ${fieldToString(pairedFields[0])}`);\n return pairedFields[0];\n}\n*/\n\n/*\nexport function pairAndStringify6(field, record) {\n const pair6 = fieldGetSubfield6Pair(field, record);\n if (!pair6) {\n return fieldToNormalizedString(field);\n }\n return fieldsToNormalizedString([field, pair6]);\n}\n*/\n\n// Frequencly list for $6 subfields in 1XX/7XX fields:\n// 231115 100\n// 183832 700\n// 28773 710\n// 2047 711\n// 661 110\n// 341 111\n// 284 130\n// 63 730\n// Thus there's a real risk of ending up with, say, identical 100 vs 700 chains.\n// Semi-hackily support 1XX/7XX-version: 7XX can be deleted if corresponding 1XX exists:\n\nexport function is7XX(tag) {\n return ['700', '710', '711', '730'].includes(tag);\n}\n\n\nfunction normalizeEntryTag(tag) {\n if (tag.match(/^[17](?:00|10|11|30)$/u)) {\n return `X${tag.substring(1)}`;\n }\n return tag;\n}\n\nfunction subfieldToNormalizedString(sf, tag, targetLinkingNumber = 0, normalizeOccurrenceNumber = false, normalizeEntryTagBoolean = false) {\n // targetLinkingNumber refers to $8.\n // normalizeEntryTagBoolean refers to 1XX/7XX tag values in subfield $6 value.\n if (isValidSubfield6(sf)) { // && targetLinkingNumber === 0) {\n // 1XX/7XX (entry tag) normalization:\n const tag2 = normalizeEntryTagBoolean ? normalizeEntryTag(tag) : tag;\n\n const occurrenceNumber = normalizeOccurrenceNumber ? 'XX' : subfield6GetOccurrenceNumber(sf);\n // If we are normalizing a $8 chain, don't normalize $6 occurrence number!\n // Replace $6 occurrence number with XX:\n return ` \u2021${sf.code} ${tag2}-${occurrenceNumber}${subfield6GetTail(sf)}`;\n }\n\n if (isValidSubfield8(sf)) {\n const currLinkingNumber = getSubfield8LinkingNumber(sf); //getSubfield8Index(sf);\n if (targetLinkingNumber > 0 && currLinkingNumber === targetLinkingNumber) {\n // For $8 we should only XX the index we are looking at...\n const normVal = sf.value.replace(/^[0-9]+/u, 'XX');\n return ` \u2021${sf.code} ${normVal}`;\n }\n return ''; // Other $8 subfields are meaningless in this context\n }\n return ` ${subfieldToString(sf)}`; // `\u2021${sf.code} ${sf.value}`;\n}\n\nexport function fieldToNormalizedString(field, targetLinkingNumber = 0, normalizeOccurrenceNumber = false, normalizeEntryTagBoolean = false) {\n if ('subfields' in field) {\n const tag2 = normalizeEntryTagBoolean ? normalizeEntryTag(field.tag) : field.tag;\n return `${tag2} ${field.ind1}${field.ind2}${formatAndNormalizeSubfields(field)}`;\n }\n return `${field.tag} ${field.value}`;\n\n function formatAndNormalizeSubfields(field) {\n return field.subfields.map(sf => subfieldToNormalizedString(sf, field.tag, targetLinkingNumber, normalizeOccurrenceNumber, normalizeEntryTagBoolean)).join('');\n }\n\n}\n\n\nfunction guessTargetLinkingNumber(fields, defaultTargetLinkingNumber) {\n if (defaultTargetLinkingNumber !== 0) {\n return defaultTargetLinkingNumber;\n }\n const linkingNumbers = fieldsGetAllSubfield8LinkingNumbers(fields);\n return linkingNumbers.length === 1 ? linkingNumbers[0] : 0;\n}\n\nexport function fieldsToNormalizedString(fields, defaultTargetLinkingNumber = 0, normalizeOccurrenceNumber = false, normalizeEntryTag = false) {\n const targetLinkingNumber = guessTargetLinkingNumber(fields, defaultTargetLinkingNumber);\n\n nvdebug(`fieldsToNormalizedString: OCC: ${normalizeOccurrenceNumber}`);\n const strings = fields.map(field => fieldToNormalizedString(field, targetLinkingNumber, normalizeOccurrenceNumber, normalizeEntryTag));\n strings.sort();\n return strings.join('\\t__SEPARATOR__\\t');\n}\n\n\n/*\n\nexport function removeField6IfNeeded(field, record, fieldsAsString) {\n const pairField = fieldGetSubfield6Pair(field, record);\n const asString = pairField ? fieldsToNormalizedString([field, pairField]) : fieldToNormalizedString(field);\n nvdebug(`SOURCE: ${asString} -- REALITY: ${fieldToString(field)}`);\n const tmp = pairField ? fieldToString(pairField) : 'HUTI';\n nvdebug(`PAIR: ${tmp}`);\n nvdebug(`BASE:\\n ${fieldsAsString.join('\\n ')}`);\n if (!fieldsAsString.includes(asString)) {\n return;\n }\n nvdebug(`Duplicate $6 removal: ${fieldToString(field)}`);\n record.removeField(field);\n\n if (pairField === undefined) {\n return;\n }\n nvdebug(`Duplicate $6 removal (pair): ${fieldToString(pairField)}`);\n record.removeField(pairField);\n}\n*/\n\nfunction getFirstField(record, fields) {\n const fieldsAsStrings = fields.map(field => fieldToString(field));\n //record.fields.forEach((field, i) => nvdebug(`${i}:\\t${fieldToString(field)}`));\n //nvdebug(`getFirstField: ${fieldsAsStrings.join('\\t')}`);\n const i = record.fields.findIndex(field => fieldsAsStrings.includes(fieldToString(field)));\n if (i > -1) {\n const field = record.fields[i];\n //nvdebug(`1st F: ${i + 1}/${record.fields.length} ${fieldToString(field)}`);\n return field;\n }\n return undefined;\n}\n\nfunction isRelevantSubfield6Chain(fields) {\n if (fields.length < 2) { // 1 non-880-field and 1+ 880 fields\n return false;\n }\n const non880 = fields.filter(f => f.tag !== '880');\n if (non880.length !== 1) {\n return false;\n }\n\n const linkingNumbers = fieldsGetAllSubfield8LinkingNumbers(fields);\n if (linkingNumbers.length !== 0) {\n return false;\n }\n\n return fields.every(f => fieldHasSubfield(f, '6'));\n}\n\nexport function fieldIsFirstFieldInChain(field, chain, record) {\n // Interpretation of first: position of field in record (however, we might have a duplicate field. See tests...)\n const firstField = getFirstField(record, chain);\n if (firstField) {\n return fieldToString(field) === fieldToString(firstField);\n }\n return false;\n\n}\n\n\nexport function getAllLinkedSubfield6Fields(field, record) {\n const fields = get6s(field, record);\n const moreFields = add8s(fields, record);\n\n // Currently we don't handle fields with more than one $6 and/or $8 subfield.\n if (moreFields.length > fields.length) {\n return []; // Don't fix!\n }\n return moreFields;\n}\n\nexport function isFirstLinkedSubfield6Field(field, record) {\n if (!field.subfields) { // Is not a datafield\n return false;\n }\n const chain = getAllLinkedSubfield6Fields(field, record);\n if (!isRelevantSubfield6Chain(chain)) {\n nvdebug(`Rejected 6: ${fieldsToString(chain)}`);\n return false;\n }\n\n return fieldIsFirstFieldInChain(field, chain, record);\n}\n\nexport function recordGetSubfield6ChainHeads(record) {\n return record.fields.filter(field => isFirstLinkedSubfield6Field(field, record));\n}\n\nexport function recordGetMaxSubfield6OccurrenceNumberAsInteger(record) {\n if (record.fields.length === 0) {\n return 0;\n }\n // Should we cache the value here?\n const vals = record.fields.map((field) => fieldGetMaxSubfield6OccurrenceNumberAsInteger(field));\n return Math.max(...vals);\n}\n\nexport function get6s(field, candidateFields) { // NB! Convert field to fields!!!\n // Get all fields with given occurrence number\n const sixes = field.subfields.filter(sf => isValidSubfield6(sf));\n\n if (sixes.length === 0) {\n return [field];\n }\n nvdebug(`SIXES: ${sixes.length}`);\n const occurrenceNumbers = sixes.map(sf => subfield6GetOccurrenceNumber(sf)).filter(value => value !== undefined && value !== '00');\n nvdebug(occurrenceNumbers.join(' -- '));\n\n const relevantFields = candidateFields.filter(f => occurrenceNumbers.some(o => fieldHasOccurrenceNumber(f, o)));\n nvdebug(`${fieldToString(field)}: $6-RELFIELDS FOUND: ${relevantFields.length}...`);\n relevantFields.forEach(f => nvdebug(fieldToString(f)));\n return relevantFields;\n}\n\nexport function resetSubfield6Tag(subfield, tag) {\n if (!isValidSubfield6(subfield)) {\n return;\n }\n // NB! mainly for 1XX<->7XX transfers\n const newValue = `${tag}-${subfield.value.substring(4)}`;\n nvdebug(`Set subfield $6 value from ${subfieldToString(subfield)} to ${newValue}`, debugDev);\n subfield.value = newValue;\n}\n"],
5
+ "mappings": "AAAA,OAAO,uBAAuB;AAG9B,SAAQ,OAAO,qCAAqC,2BAA2B,wBAAuB;AACtG,SAAQ,kBAAkB,eAAe,gBAAgB,SAAS,wBAAuB;AAEzF,MAAM,QAAQ,kBAAkB,6DAA6D;AAE7F,MAAM,WAAW,MAAM,OAAO,KAAK;AAKnC,MAAM,YAAY;AAEX,gBAAS,iBAAiB,UAAU;AACzC,MAAI,SAAS,SAAS,KAAK;AACzB,WAAO;AAAA,EACT;AACA,SAAO,SAAS,MAAM,MAAM,SAAS;AACvC;AAEO,gBAAS,gBAAgB,UAAU;AACxC,MAAI,iBAAiB,QAAQ,GAAG;AAC9B,WAAO,SAAS,MAAM,UAAU,GAAG,CAAC;AAAA,EACtC;AACA,SAAO;AACT;AAEO,gBAAS,6BAA6B,UAAU;AACrD,MAAI,iBAAiB,QAAQ,GAAG;AAE9B,WAAO,SAAS,MAAM,UAAU,CAAC,EAAE,QAAQ,UAAU,EAAE;AAAA,EACzD;AACA,SAAO;AACT;AAEO,gBAAS,sCAAsC,UAAU;AAC9D,QAAM,QAAQ,6BAA6B,QAAQ;AACnD,MAAI,UAAU,UAAa,UAAU,MAAM;AACzC,WAAO;AAAA,EACT;AACA,QAAM,SAAS,SAAS,OAAO,EAAE;AAEjC,SAAO;AACT;AAEO,gBAAS,+BAA+B,UAAU,kBAAkB;AACzE,MAAI,CAAC,iBAAiB,QAAQ,GAAG;AAC/B;AAAA,EACF;AACA,QAAM,2BAA2B,OAAO,qBAAqB,WAAW,4BAA4B,gBAAgB,IAAI;AAExH,QAAM,WAAW,SAAS,MAAM,UAAU,GAAG,CAAC,IAAI,2BAA2B,iBAAiB,QAAQ;AAEtG,WAAS,QAAQ;AACnB;AAGA,SAAS,iBAAiB,UAAU;AAClC,MAAI,iBAAiB,QAAQ,GAAG;AAE9B,WAAO,SAAS,MAAM,QAAQ,aAAa,EAAE;AAAA,EAC/C;AACA,SAAO;AACT;AAEO,gBAAS,yCAAyC,UAAU,wBAAwB;AACzF,MAAI,SAAS,SAAS,KAAK;AACzB,WAAO;AAAA,EACT;AAEA,QAAM,MAAM,SAAS,MAAM,QAAQ,sCAAsC,IAAI;AAC7E,UAAQ,aAAa,GAAG,SAAS,sBAAsB,GAAG;AAC1D,SAAO,QAAQ;AACjB;AAIO,gBAAS,uBAAuB,OAAO;AAC5C,QAAM,OAAO,MAAM,UAAU,OAAO,QAAM,gBAAgB,EAAE,CAAC;AAC7D,MAAI,KAAK,WAAW,GAAG;AACrB,WAAO,gBAAgB,KAAK,CAAC,CAAC;AAAA,EAChC;AACA,SAAO;AACT;AAEO,gBAAS,oCAAoC,OAAO;AACzD,QAAM,oBAAoB,MAAM,UAAU,OAAO,QAAM,6BAA6B,EAAE,CAAC;AACvF,MAAI,kBAAkB,WAAW,GAAG;AAClC,WAAO,6BAA6B,kBAAkB,CAAC,CAAC;AAAA,EAC1D;AACA,SAAO;AACT;AAEO,gBAAS,yBAAyB,OAAO,kBAAkB;AAEhE,SAAO,MAAM,aAAa,MAAM,UAAU,KAAK,QAAM,6BAA6B,EAAE,MAAM,gBAAgB;AAC5G;AAEO,gBAAS,2BAA2B,OAAO,qBAAqB,sBAAsB,QAAW;AACtG,QAAM,UAAU,QAAQ,cAAY,WAAW,QAAQ,CAAC;AAExD,WAAS,WAAW,UAAU;AAE5B,QAAI,wBAAwB,QAAW;AACrC,YAAM,uBAAuB,6BAA6B,QAAQ;AAClE,UAAI,yBAAyB,qBAAqB;AAChD;AAAA,MACF;AAAA,IACF;AACA,mCAA+B,UAAU,mBAAmB;AAAA,EAC9D;AACF;AAEO,gBAAS,4BAA4B,GAAG;AAC7C,SAAO,IAAI,KAAK,IAAI,CAAC,KAAK,GAAG,CAAC;AAChC;AAEO,gBAAS,8CAA8C,OAAO;AAGnE,QAAM,OAAO,MAAM,YAAY,MAAM,UAAU,OAAO,cAAY,iBAAiB,QAAQ,CAAC,IAAI,CAAC;AACjG,MAAI,KAAK,WAAW,GAAG;AACrB,WAAO;AAAA,EACT;AAGA,QAAM,OAAO,KAAK,IAAI,QAAM,sCAAsC,EAAE,CAAC;AACrE,SAAO,KAAK,IAAI,GAAG,IAAI;AACzB;AAEO,gBAAS,qCAAqC,OAAO,wBAAwB;AAClF,SAAO,MAAM,aAAa,MAAM,UAAU,KAAK,QAAM,yCAAyC,IAAI,sBAAsB,CAAC;AAC3H;AAiBO,gBAAS,uBAAuB,OAAO;AAC5C,SAAO,MAAM,aAAa,MAAM,UAAU,KAAK,QAAM,iBAAiB,EAAE,CAAC;AAC3E;AAEO,gBAAS,gBAAgB,OAAO,YAAY;AAGjD,MAAI,CAAC,uBAAuB,KAAK,KAAK,CAAC,uBAAuB,UAAU,GAAG;AACzE,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,iBAAiB,MAAM,KAAK,WAAW,GAAG,GAAG;AAEhD,WAAO;AAAA,EACT;AAGA,QAAM,aAAa,oCAAoC,KAAK;AAC5D,MAAI,eAAe,UAAa,eAAe,MAAM;AAEnD,WAAO;AAAA,EACT;AAEA,QAAM,kBAAkB,oCAAoC,UAAU;AAGtE,MAAI,eAAe,iBAAiB;AAElC,WAAO;AAAA,EACT;AAEA,MAAI,uBAAuB,KAAK,MAAM,WAAW,OAAO,MAAM,QAAQ,uBAAuB,UAAU,GAAG;AAExG,WAAO;AAAA,EACT;AACA,SAAO;AAEP,WAAS,iBAAiB,MAAM,MAAM;AAEpC,QAAI,SAAS,SAAS,SAAS,OAAO;AACpC,aAAO;AAAA,IACT;AACA,QAAI,SAAS,SAAS,SAAS,OAAO;AACpC,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AACF;AAGA,SAAS,mCAAmC,UAAU;AACpD,MAAI,SAAS,SAAS,OAAO,SAAS,MAAM,UAAU,GAAG,CAAC,MAAM,KAAK;AACnE;AAAA,EACF;AACA,WAAS,QAAQ,IAAI,SAAS,MAAM,UAAU,CAAC,CAAC;AAClD;AAEO,gBAAS,gCAAgC,OAAO;AACrD,MAAI,MAAM,QAAQ,OAAO;AACvB;AAAA,EACF;AACA,QAAM,UAAU,QAAQ,QAAM,mCAAmC,EAAE,CAAC;AACtE;AAGO,gBAAS,8BAA8B,OAAO,YAAY;AAG/D,QAAM,QAAQ,WAAW,OAAO,gBAAc,gBAAgB,OAAO,UAAU,CAAC;AAChF,MAAI,MAAM,WAAW,GAAG;AACtB,YAAQ,uBAAuB,cAAc,KAAK,CAAC,GAAG;AACtD,WAAO;AAAA,EACT;AACA,UAAQ,GAAG,MAAM,MAAM,uBAAuB,cAAc,KAAK,CAAC,GAAG;AACrE,QAAM,QAAQ,iBAAe,QAAQ,MAAM,cAAc,WAAW,CAAC,GAAG,CAAC;AACzE,SAAO;AACT;AAEO,gBAAS,0BAA0B,OAAO;AAC/C,MAAI,oBAAoB,CAAC;AACzB,QAAM,WAAW,QAAQ,QAAM,gCAAgC,EAAE,CAAC;AAElE,WAAS,gCAAgC,IAAI;AAC3C,QAAI,CAAC,iBAAiB,EAAE,GAAG;AACzB;AAAA,IACF;AACA,UAAM,mBAAmB,6BAA6B,EAAE;AACxD,QAAI,qBAAqB,QAAQ,kBAAkB,SAAS,gBAAgB,GAAG;AAC7E;AAAA,IACF;AACA,sBAAkB,KAAK,gBAAgB;AAAA,EACzC;AACA,SAAO;AACT;AAEO,gBAAS,2BAA2B,QAAQ;AACjD,MAAI,oBAAoB,CAAC;AAEzB,SAAO,QAAQ,OAAK,8BAA8B,CAAC,CAAC;AAEpD,WAAS,8BAA8B,GAAG;AACxC,UAAM,uBAAuB,0BAA0B,CAAC;AACxD,yBAAqB,QAAQ,sBAAoB;AAC/C,UAAI,CAAC,kBAAkB,SAAS,gBAAgB,GAAG;AACjD,0BAAkB,KAAK,gBAAgB;AAAA,MACzC;AAAA,IAEF,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAoCO,gBAAS,MAAM,KAAK;AACzB,SAAO,CAAC,OAAO,OAAO,OAAO,KAAK,EAAE,SAAS,GAAG;AAClD;AAGA,SAAS,kBAAkB,KAAK;AAC9B,MAAI,IAAI,MAAM,wBAAwB,GAAG;AACvC,WAAO,IAAI,IAAI,UAAU,CAAC,CAAC;AAAA,EAC7B;AACA,SAAO;AACT;AAEA,SAAS,2BAA2B,IAAI,KAAK,sBAAsB,GAAG,4BAA4B,OAAO,2BAA2B,OAAO;AAGzI,MAAI,iBAAiB,EAAE,GAAG;AAExB,UAAM,OAAO,2BAA2B,kBAAkB,GAAG,IAAI;AAEjE,UAAM,mBAAmB,4BAA4B,OAAO,6BAA6B,EAAE;AAG3F,WAAO,UAAK,GAAG,IAAI,IAAI,IAAI,IAAI,gBAAgB,GAAG,iBAAiB,EAAE,CAAC;AAAA,EACxE;AAEA,MAAI,iBAAiB,EAAE,GAAG;AACxB,UAAM,oBAAoB,0BAA0B,EAAE;AACtD,QAAI,sBAAsB,KAAK,sBAAsB,qBAAqB;AAExE,YAAM,UAAU,GAAG,MAAM,QAAQ,YAAY,IAAI;AACjD,aAAO,UAAK,GAAG,IAAI,IAAI,OAAO;AAAA,IAChC;AACA,WAAO;AAAA,EACT;AACA,SAAO,IAAI,iBAAiB,EAAE,CAAC;AACjC;AAEO,gBAAS,wBAAwB,OAAO,sBAAsB,GAAG,4BAA4B,OAAO,2BAA2B,OAAO;AAC3I,MAAI,eAAe,OAAO;AACxB,UAAM,OAAO,2BAA2B,kBAAkB,MAAM,GAAG,IAAI,MAAM;AAC7E,WAAO,GAAG,IAAI,IAAI,MAAM,IAAI,GAAG,MAAM,IAAI,GAAG,4BAA4B,KAAK,CAAC;AAAA,EAChF;AACA,SAAO,GAAG,MAAM,GAAG,OAAO,MAAM,KAAK;AAErC,WAAS,4BAA4BA,QAAO;AAC1C,WAAOA,OAAM,UAAU,IAAI,QAAM,2BAA2B,IAAIA,OAAM,KAAK,qBAAqB,2BAA2B,wBAAwB,CAAC,EAAE,KAAK,EAAE;AAAA,EAC/J;AAEF;AAGA,SAAS,yBAAyB,QAAQ,4BAA4B;AACpE,MAAI,+BAA+B,GAAG;AACpC,WAAO;AAAA,EACT;AACA,QAAM,iBAAiB,oCAAoC,MAAM;AACjE,SAAO,eAAe,WAAW,IAAI,eAAe,CAAC,IAAI;AAC3D;AAEO,gBAAS,yBAAyB,QAAQ,6BAA6B,GAAG,4BAA4B,OAAOC,qBAAoB,OAAO;AAC7I,QAAM,sBAAsB,yBAAyB,QAAQ,0BAA0B;AAEvF,UAAQ,kCAAkC,yBAAyB,EAAE;AACrE,QAAM,UAAU,OAAO,IAAI,WAAS,wBAAwB,OAAO,qBAAqB,2BAA2BA,kBAAiB,CAAC;AACrI,UAAQ,KAAK;AACb,SAAO,QAAQ,KAAK,iBAAmB;AACzC;AA0BA,SAAS,cAAc,QAAQ,QAAQ;AACrC,QAAM,kBAAkB,OAAO,IAAI,WAAS,cAAc,KAAK,CAAC;AAGhE,QAAM,IAAI,OAAO,OAAO,UAAU,WAAS,gBAAgB,SAAS,cAAc,KAAK,CAAC,CAAC;AACzF,MAAI,IAAI,IAAI;AACV,UAAM,QAAQ,OAAO,OAAO,CAAC;AAE7B,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,yBAAyB,QAAQ;AACxC,MAAI,OAAO,SAAS,GAAG;AACrB,WAAO;AAAA,EACT;AACA,QAAM,SAAS,OAAO,OAAO,OAAK,EAAE,QAAQ,KAAK;AACjD,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO;AAAA,EACT;AAEA,QAAM,iBAAiB,oCAAoC,MAAM;AACjE,MAAI,eAAe,WAAW,GAAG;AAC/B,WAAO;AAAA,EACT;AAEA,SAAO,OAAO,MAAM,OAAK,iBAAiB,GAAG,GAAG,CAAC;AACnD;AAEO,gBAAS,yBAAyB,OAAO,OAAO,QAAQ;AAE7D,QAAM,aAAa,cAAc,QAAQ,KAAK;AAC9C,MAAI,YAAY;AACd,WAAO,cAAc,KAAK,MAAM,cAAc,UAAU;AAAA,EAC1D;AACA,SAAO;AAET;AAGO,gBAAS,4BAA4B,OAAO,QAAQ;AACzD,QAAM,SAAS,MAAM,OAAO,MAAM;AAClC,QAAM,aAAa,MAAM,QAAQ,MAAM;AAGvC,MAAI,WAAW,SAAS,OAAO,QAAQ;AACrC,WAAO,CAAC;AAAA,EACV;AACA,SAAO;AACT;AAEO,gBAAS,4BAA4B,OAAO,QAAQ;AACzD,MAAI,CAAC,MAAM,WAAW;AACpB,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,4BAA4B,OAAO,MAAM;AACvD,MAAI,CAAC,yBAAyB,KAAK,GAAG;AACpC,YAAQ,eAAe,eAAe,KAAK,CAAC,EAAE;AAC9C,WAAO;AAAA,EACT;AAEA,SAAO,yBAAyB,OAAO,OAAO,MAAM;AACtD;AAEO,gBAAS,6BAA6B,QAAQ;AACnD,SAAO,OAAO,OAAO,OAAO,WAAS,4BAA4B,OAAO,MAAM,CAAC;AACjF;AAEO,gBAAS,+CAA+C,QAAQ;AACrE,MAAI,OAAO,OAAO,WAAW,GAAG;AAC9B,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,OAAO,OAAO,IAAI,CAAC,UAAU,8CAA8C,KAAK,CAAC;AAC9F,SAAO,KAAK,IAAI,GAAG,IAAI;AACzB;AAEO,gBAAS,MAAM,OAAO,iBAAiB;AAE5C,QAAM,QAAQ,MAAM,UAAU,OAAO,QAAM,iBAAiB,EAAE,CAAC;AAE/D,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO,CAAC,KAAK;AAAA,EACf;AACA,UAAQ,UAAU,MAAM,MAAM,EAAE;AAChC,QAAM,oBAAoB,MAAM,IAAI,QAAM,6BAA6B,EAAE,CAAC,EAAE,OAAO,WAAS,UAAU,UAAa,UAAU,IAAI;AACjI,UAAQ,kBAAkB,KAAK,MAAM,CAAC;AAEtC,QAAM,iBAAiB,gBAAgB,OAAO,OAAK,kBAAkB,KAAK,OAAK,yBAAyB,GAAG,CAAC,CAAC,CAAC;AAC9G,UAAQ,GAAG,cAAc,KAAK,CAAC,yBAAyB,eAAe,MAAM,KAAK;AAClF,iBAAe,QAAQ,OAAK,QAAQ,cAAc,CAAC,CAAC,CAAC;AACrD,SAAO;AACT;AAEO,gBAAS,kBAAkB,UAAU,KAAK;AAC/C,MAAI,CAAC,iBAAiB,QAAQ,GAAG;AAC/B;AAAA,EACF;AAEA,QAAM,WAAW,GAAG,GAAG,IAAI,SAAS,MAAM,UAAU,CAAC,CAAC;AACtD,UAAQ,8BAA8B,iBAAiB,QAAQ,CAAC,OAAO,QAAQ,IAAI,QAAQ;AAC3F,WAAS,QAAQ;AACnB;",
6
+ "names": ["field", "normalizeEntryTag"]
7
+ }
@@ -1,97 +1,73 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.add8s = add8s;
7
- exports.fieldHasLinkingNumber = fieldHasLinkingNumber;
8
- exports.fieldHasValidSubfield8 = fieldHasValidSubfield8;
9
- exports.fieldsGetAllSubfield8LinkingNumbers = fieldsGetAllSubfield8LinkingNumbers;
10
- exports.getSubfield8LinkingNumber = getSubfield8LinkingNumber;
11
- exports.getSubfield8Value = getSubfield8Value;
12
- exports.isValidSubfield8 = isValidSubfield8;
13
- exports.recordGetAllSubfield8LinkingNumbers = recordGetAllSubfield8LinkingNumbers;
14
- exports.recordGetFieldsWithSubfield8LinkingNumber = recordGetFieldsWithSubfield8LinkingNumber;
15
- var _utils = require("./utils");
16
- // import createDebugLogger from 'debug';
17
- // const debug = createDebugLogger('@natlibfi/marc-record-validator-melinda/subfield8Utils');
18
-
1
+ import { fieldToString, nvdebug } from "./utils.js";
19
2
  const sf8Regexp = /^([1-9][0-9]*)(?:\.[0-9]+)?(?:\\[acprux])?$/u;
20
- function isValidSubfield8(subfield) {
21
- if (subfield.code !== '8') {
3
+ export function isValidSubfield8(subfield) {
4
+ if (subfield.code !== "8") {
22
5
  return false;
23
6
  }
24
-
25
- //nvdebug(` IS VALID $8? '${subfieldToString(subfield)}'`);
26
7
  const match = subfield.value.match(sf8Regexp);
27
- //nvdebug(` IS VALID $8? '${subfieldToString(subfield)}' vs ${match.length}}`);
28
8
  return match && match.length > 0;
29
9
  }
30
- function getSubfield8Value(subfield) {
10
+ export function getSubfield8Value(subfield) {
31
11
  if (!isValidSubfield8(subfield)) {
32
- return undefined;
12
+ return void 0;
33
13
  }
34
14
  return subfield.value;
35
15
  }
36
- function getSubfield8LinkingNumber(subfield) {
16
+ export function getSubfield8LinkingNumber(subfield) {
37
17
  const value = getSubfield8Value(subfield);
38
- if (value === undefined) {
18
+ if (value === void 0) {
39
19
  return 0;
40
20
  }
41
21
  return parseInt(value, 10);
42
22
  }
43
- function fieldHasLinkingNumber(field, linkingNumber) {
23
+ export function fieldHasLinkingNumber(field, linkingNumber) {
44
24
  if (!field.subfields) {
45
25
  return false;
46
26
  }
47
- return field.subfields.some(sf => getSubfield8LinkingNumber(sf) === linkingNumber);
27
+ return field.subfields.some((sf) => getSubfield8LinkingNumber(sf) === linkingNumber);
48
28
  }
49
- function recordGetFieldsWithSubfield8LinkingNumber(record, linkingNumber) {
29
+ export function recordGetFieldsWithSubfield8LinkingNumber(record, linkingNumber) {
50
30
  if (linkingNumber < 1) {
51
31
  return;
52
32
  }
53
- return record.fields.filter(field => fieldHasLinkingNumber(field, linkingNumber));
33
+ return record.fields.filter((field) => fieldHasLinkingNumber(field, linkingNumber));
54
34
  }
55
- function fieldsGetAllSubfield8LinkingNumbers(fields) {
35
+ export function fieldsGetAllSubfield8LinkingNumbers(fields) {
56
36
  let subfield8LinkingNumbers = [];
57
- fields.forEach(field => {
37
+ fields.forEach((field) => {
58
38
  if (!field.subfields) {
59
39
  return;
60
40
  }
61
- field.subfields.forEach(sf => {
41
+ field.subfields.forEach((sf) => {
62
42
  const linkingNumber = getSubfield8LinkingNumber(sf);
63
43
  if (linkingNumber > 0 && !subfield8LinkingNumbers.includes(linkingNumber)) {
64
- (0, _utils.nvdebug)(` LINK8: Add subfield \$8 ${linkingNumber} to seen values list`);
44
+ nvdebug(` LINK8: Add subfield $8 ${linkingNumber} to seen values list`);
65
45
  subfield8LinkingNumbers.push(linkingNumber);
66
46
  }
67
47
  });
68
48
  });
69
49
  return subfield8LinkingNumbers;
70
50
  }
71
- function recordGetAllSubfield8LinkingNumbers(record) {
51
+ export function recordGetAllSubfield8LinkingNumbers(record) {
72
52
  return fieldsGetAllSubfield8LinkingNumbers(record.fields);
73
53
  }
74
- function add8s(fields, record) {
54
+ export function add8s(fields, record) {
75
55
  const linkingNumbers = fieldsGetAllSubfield8LinkingNumbers(fields);
76
56
  if (linkingNumbers.length === 0) {
77
57
  return fields;
78
58
  }
79
- (0, _utils.nvdebug)(`Linking number(s): ${linkingNumbers.join(', ')}`);
80
- linkingNumbers.forEach(number => collectLinkingNumberFields(number)); // eslint-disable-line array-callback-return
81
-
82
- fields.forEach(f => (0, _utils.nvdebug)(`AFTER ADDING 8s: '${(0, _utils.fieldToString)(f)}'`)); // eslint-disable-line array-callback-return
83
-
59
+ nvdebug(`Linking number(s): ${linkingNumbers.join(", ")}`);
60
+ linkingNumbers.forEach((number) => collectLinkingNumberFields(number));
61
+ fields.forEach((f) => nvdebug(`AFTER ADDING 8s: '${fieldToString(f)}'`));
84
62
  return fields;
85
63
  function collectLinkingNumberFields(linkingNumber) {
86
- // Remove existing hits (to avoid field repetition):
87
- fields = fields.filter(f => !fieldHasLinkingNumber(f, linkingNumber));
88
- // Add them and their "sisters" back:
89
- const addableFields = record.fields.filter(f => fieldHasLinkingNumber(f, linkingNumber));
90
- addableFields.forEach(f => (0, _utils.nvdebug)(`(RE-?)ADD ${(0, _utils.fieldToString)(f)}`)); // eslint-disable-line array-callback-return
64
+ fields = fields.filter((f) => !fieldHasLinkingNumber(f, linkingNumber));
65
+ const addableFields = record.fields.filter((f) => fieldHasLinkingNumber(f, linkingNumber));
66
+ addableFields.forEach((f) => nvdebug(`(RE-?)ADD ${fieldToString(f)}`));
91
67
  fields = fields.concat(addableFields);
92
68
  }
93
69
  }
94
- function fieldHasValidSubfield8(field) {
95
- return field.subfields && field.subfields.some(sf => isValidSubfield8(sf));
70
+ export function fieldHasValidSubfield8(field) {
71
+ return field.subfields && field.subfields.some((sf) => isValidSubfield8(sf));
96
72
  }
97
- //# sourceMappingURL=subfield8Utils.js.map
73
+ //# sourceMappingURL=subfield8Utils.js.map
@@ -1 +1,7 @@
1
- {"version":3,"file":"subfield8Utils.js","names":["_utils","require","sf8Regexp","isValidSubfield8","subfield","code","match","value","length","getSubfield8Value","undefined","getSubfield8LinkingNumber","parseInt","fieldHasLinkingNumber","field","linkingNumber","subfields","some","sf","recordGetFieldsWithSubfield8LinkingNumber","record","fields","filter","fieldsGetAllSubfield8LinkingNumbers","subfield8LinkingNumbers","forEach","includes","nvdebug","push","recordGetAllSubfield8LinkingNumbers","add8s","linkingNumbers","join","number","collectLinkingNumberFields","f","fieldToString","addableFields","concat","fieldHasValidSubfield8"],"sources":["../src/subfield8Utils.js"],"sourcesContent":["// import createDebugLogger from 'debug';\n// const debug = createDebugLogger('@natlibfi/marc-record-validator-melinda/subfield8Utils');\n\nimport {fieldToString, nvdebug} from './utils';\n\nconst sf8Regexp = /^([1-9][0-9]*)(?:\\.[0-9]+)?(?:\\\\[acprux])?$/u;\n\nexport function isValidSubfield8(subfield) {\n if (subfield.code !== '8') {\n return false;\n }\n\n //nvdebug(` IS VALID $8? '${subfieldToString(subfield)}'`);\n const match = subfield.value.match(sf8Regexp);\n //nvdebug(` IS VALID $8? '${subfieldToString(subfield)}' vs ${match.length}}`);\n return match && match.length > 0;\n}\n\nexport function getSubfield8Value(subfield) {\n if (!isValidSubfield8(subfield)) {\n return undefined;\n }\n return subfield.value;\n}\n\nexport function getSubfield8LinkingNumber(subfield) {\n const value = getSubfield8Value(subfield);\n if (value === undefined) {\n return 0;\n }\n return parseInt(value, 10);\n}\n\n\nexport function fieldHasLinkingNumber(field, linkingNumber) {\n if (!field.subfields) {\n return false;\n }\n return field.subfields.some(sf => getSubfield8LinkingNumber(sf) === linkingNumber);\n}\n\nexport function recordGetFieldsWithSubfield8LinkingNumber(record, linkingNumber) {\n if (linkingNumber < 1) {\n return;\n }\n return record.fields.filter(field => fieldHasLinkingNumber(field, linkingNumber));\n}\n\n\nexport function fieldsGetAllSubfield8LinkingNumbers(fields) {\n let subfield8LinkingNumbers = [];\n fields.forEach(field => {\n if (!field.subfields) {\n return;\n }\n field.subfields.forEach(sf => {\n const linkingNumber = getSubfield8LinkingNumber(sf);\n if (linkingNumber > 0 && !subfield8LinkingNumbers.includes(linkingNumber)) {\n nvdebug(` LINK8: Add subfield \\$8 ${linkingNumber} to seen values list`);\n subfield8LinkingNumbers.push(linkingNumber);\n }\n });\n });\n\n return subfield8LinkingNumbers;\n}\n\nexport function recordGetAllSubfield8LinkingNumbers(record) {\n return fieldsGetAllSubfield8LinkingNumbers(record.fields);\n}\n\n\nexport function add8s(fields, record) {\n const linkingNumbers = fieldsGetAllSubfield8LinkingNumbers(fields);\n if (linkingNumbers.length === 0) {\n return fields;\n }\n\n nvdebug(`Linking number(s): ${linkingNumbers.join(', ')}`);\n linkingNumbers.forEach(number => collectLinkingNumberFields(number)); // eslint-disable-line array-callback-return\n\n fields.forEach(f => nvdebug(`AFTER ADDING 8s: '${fieldToString(f)}'`)); // eslint-disable-line array-callback-return\n\n return fields;\n\n function collectLinkingNumberFields(linkingNumber) {\n // Remove existing hits (to avoid field repetition):\n fields = fields.filter(f => !fieldHasLinkingNumber(f, linkingNumber));\n // Add them and their \"sisters\" back:\n const addableFields = record.fields.filter(f => fieldHasLinkingNumber(f, linkingNumber));\n addableFields.forEach(f => nvdebug(`(RE-?)ADD ${fieldToString(f)}`)); // eslint-disable-line array-callback-return\n fields = fields.concat(addableFields);\n\n }\n}\n\nexport function fieldHasValidSubfield8(field) {\n return field.subfields && field.subfields.some(sf => isValidSubfield8(sf));\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/subfield8Utils.js"],
4
+ "sourcesContent": ["// import createDebugLogger from 'debug';\n// const debug = createDebugLogger('@natlibfi/marc-record-validator-melinda/subfield8Utils');\n\nimport {fieldToString, nvdebug} from './utils.js';\n\nconst sf8Regexp = /^([1-9][0-9]*)(?:\\.[0-9]+)?(?:\\\\[acprux])?$/u;\n\nexport function isValidSubfield8(subfield) {\n if (subfield.code !== '8') {\n return false;\n }\n\n //nvdebug(` IS VALID $8? '${subfieldToString(subfield)}'`);\n const match = subfield.value.match(sf8Regexp);\n //nvdebug(` IS VALID $8? '${subfieldToString(subfield)}' vs ${match.length}}`);\n return match && match.length > 0;\n}\n\nexport function getSubfield8Value(subfield) {\n if (!isValidSubfield8(subfield)) {\n return undefined;\n }\n return subfield.value;\n}\n\nexport function getSubfield8LinkingNumber(subfield) {\n const value = getSubfield8Value(subfield);\n if (value === undefined) {\n return 0;\n }\n return parseInt(value, 10);\n}\n\n\nexport function fieldHasLinkingNumber(field, linkingNumber) {\n if (!field.subfields) {\n return false;\n }\n return field.subfields.some(sf => getSubfield8LinkingNumber(sf) === linkingNumber);\n}\n\nexport function recordGetFieldsWithSubfield8LinkingNumber(record, linkingNumber) {\n if (linkingNumber < 1) {\n return;\n }\n return record.fields.filter(field => fieldHasLinkingNumber(field, linkingNumber));\n}\n\n\nexport function fieldsGetAllSubfield8LinkingNumbers(fields) {\n let subfield8LinkingNumbers = [];\n fields.forEach(field => {\n if (!field.subfields) {\n return;\n }\n field.subfields.forEach(sf => {\n const linkingNumber = getSubfield8LinkingNumber(sf);\n if (linkingNumber > 0 && !subfield8LinkingNumbers.includes(linkingNumber)) {\n nvdebug(` LINK8: Add subfield \\$8 ${linkingNumber} to seen values list`);\n subfield8LinkingNumbers.push(linkingNumber);\n }\n });\n });\n\n return subfield8LinkingNumbers;\n}\n\nexport function recordGetAllSubfield8LinkingNumbers(record) {\n return fieldsGetAllSubfield8LinkingNumbers(record.fields);\n}\n\n\nexport function add8s(fields, record) {\n const linkingNumbers = fieldsGetAllSubfield8LinkingNumbers(fields);\n if (linkingNumbers.length === 0) {\n return fields;\n }\n\n nvdebug(`Linking number(s): ${linkingNumbers.join(', ')}`);\n linkingNumbers.forEach(number => collectLinkingNumberFields(number));\n\n fields.forEach(f => nvdebug(`AFTER ADDING 8s: '${fieldToString(f)}'`));\n\n return fields;\n\n function collectLinkingNumberFields(linkingNumber) {\n // Remove existing hits (to avoid field repetition):\n fields = fields.filter(f => !fieldHasLinkingNumber(f, linkingNumber));\n // Add them and their \"sisters\" back:\n const addableFields = record.fields.filter(f => fieldHasLinkingNumber(f, linkingNumber));\n addableFields.forEach(f => nvdebug(`(RE-?)ADD ${fieldToString(f)}`));\n fields = fields.concat(addableFields);\n\n }\n}\n\nexport function fieldHasValidSubfield8(field) {\n return field.subfields && field.subfields.some(sf => isValidSubfield8(sf));\n}\n"],
5
+ "mappings": "AAGA,SAAQ,eAAe,eAAc;AAErC,MAAM,YAAY;AAEX,gBAAS,iBAAiB,UAAU;AACzC,MAAI,SAAS,SAAS,KAAK;AACzB,WAAO;AAAA,EACT;AAGA,QAAM,QAAQ,SAAS,MAAM,MAAM,SAAS;AAE5C,SAAO,SAAS,MAAM,SAAS;AACjC;AAEO,gBAAS,kBAAkB,UAAU;AAC1C,MAAI,CAAC,iBAAiB,QAAQ,GAAG;AAC/B,WAAO;AAAA,EACT;AACA,SAAO,SAAS;AAClB;AAEO,gBAAS,0BAA0B,UAAU;AAClD,QAAM,QAAQ,kBAAkB,QAAQ;AACxC,MAAI,UAAU,QAAW;AACvB,WAAO;AAAA,EACT;AACA,SAAO,SAAS,OAAO,EAAE;AAC3B;AAGO,gBAAS,sBAAsB,OAAO,eAAe;AAC1D,MAAI,CAAC,MAAM,WAAW;AACpB,WAAO;AAAA,EACT;AACA,SAAO,MAAM,UAAU,KAAK,QAAM,0BAA0B,EAAE,MAAM,aAAa;AACnF;AAEO,gBAAS,0CAA0C,QAAQ,eAAe;AAC/E,MAAI,gBAAgB,GAAG;AACrB;AAAA,EACF;AACA,SAAO,OAAO,OAAO,OAAO,WAAS,sBAAsB,OAAO,aAAa,CAAC;AAClF;AAGO,gBAAS,oCAAoC,QAAQ;AAC1D,MAAI,0BAA0B,CAAC;AAC/B,SAAO,QAAQ,WAAS;AACtB,QAAI,CAAC,MAAM,WAAW;AACpB;AAAA,IACF;AACA,UAAM,UAAU,QAAQ,QAAM;AAC5B,YAAM,gBAAgB,0BAA0B,EAAE;AAClD,UAAI,gBAAgB,KAAK,CAAC,wBAAwB,SAAS,aAAa,GAAG;AACzE,gBAAQ,2BAA4B,aAAa,sBAAsB;AACvE,gCAAwB,KAAK,aAAa;AAAA,MAC5C;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,SAAO;AACT;AAEO,gBAAS,oCAAoC,QAAQ;AAC1D,SAAO,oCAAoC,OAAO,MAAM;AAC1D;AAGO,gBAAS,MAAM,QAAQ,QAAQ;AACpC,QAAM,iBAAiB,oCAAoC,MAAM;AACjE,MAAI,eAAe,WAAW,GAAG;AAC/B,WAAO;AAAA,EACT;AAEA,UAAQ,sBAAsB,eAAe,KAAK,IAAI,CAAC,EAAE;AACzD,iBAAe,QAAQ,YAAU,2BAA2B,MAAM,CAAC;AAEnE,SAAO,QAAQ,OAAK,QAAQ,qBAAqB,cAAc,CAAC,CAAC,GAAG,CAAC;AAErE,SAAO;AAEP,WAAS,2BAA2B,eAAe;AAEjD,aAAS,OAAO,OAAO,OAAK,CAAC,sBAAsB,GAAG,aAAa,CAAC;AAEpE,UAAM,gBAAgB,OAAO,OAAO,OAAO,OAAK,sBAAsB,GAAG,aAAa,CAAC;AACvF,kBAAc,QAAQ,OAAK,QAAQ,aAAa,cAAc,CAAC,CAAC,EAAE,CAAC;AACnE,aAAS,OAAO,OAAO,aAAa;AAAA,EAEtC;AACF;AAEO,gBAAS,uBAAuB,OAAO;AAC5C,SAAO,MAAM,aAAa,MAAM,UAAU,KAAK,QAAM,iBAAiB,EAAE,CAAC;AAC3E;",
6
+ "names": []
7
+ }
@@ -1,45 +1,25 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = _default;
7
- var _clone = _interopRequireDefault(require("clone"));
8
- var _utils = require("./utils");
9
- var _punctuation = require("./punctuation2");
10
- var _subfield6Utils = require("./subfield6Utils");
11
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
12
- //import createDebugLogger from 'debug';
13
-
14
- // NB! You should probably run punctuation fixes after this validator!
15
-
16
- // Author(s): Nicholas Volk
17
- function _default() {
1
+ import clone from "clone";
2
+ import { fieldHasSubfield, fieldToString, getCatalogingLanguage } from "./utils.js";
3
+ import { fieldFixPunctuation } from "./punctuation2.js";
4
+ import { fieldGetUnambiguousTag } from "./subfield6Utils.js";
5
+ export default function() {
18
6
  return {
19
- description: 'Fix various subfield internal values',
7
+ description: "Fix various subfield internal values",
20
8
  validate,
21
9
  fix
22
10
  };
23
11
  function fix(record) {
24
- const catLang = (0, _utils.getCatalogingLanguage)(record, 'fin');
25
- const res = {
26
- message: [],
27
- fix: [],
28
- valid: true
29
- };
30
- record.fields.forEach(field => {
12
+ const catLang = getCatalogingLanguage(record, "fin");
13
+ const res = { message: [], fix: [], valid: true };
14
+ record.fields.forEach((field) => {
31
15
  normalizeSubfieldValues(field, catLang);
32
16
  });
33
-
34
- // message.valid = !(message.message.length >= 1);
35
17
  return res;
36
18
  }
37
19
  function validate(record) {
38
- const catLang = (0, _utils.getCatalogingLanguage)(record, 'fin');
39
- const res = {
40
- message: []
41
- };
42
- record.fields.forEach(field => {
20
+ const catLang = getCatalogingLanguage(record, "fin");
21
+ const res = { message: [] };
22
+ record.fields.forEach((field) => {
43
23
  validateField(field, res, catLang);
44
24
  });
45
25
  res.valid = !(res.message.length >= 1);
@@ -49,11 +29,10 @@ function _default() {
49
29
  if (!field.subfields) {
50
30
  return;
51
31
  }
52
- const orig = (0, _utils.fieldToString)(field);
53
- const normalizedField = normalizeSubfieldValues((0, _clone.default)(field), catLang);
54
- const mod = (0, _utils.fieldToString)(normalizedField);
32
+ const orig = fieldToString(field);
33
+ const normalizedField = normalizeSubfieldValues(clone(field), catLang);
34
+ const mod = fieldToString(normalizedField);
55
35
  if (orig !== mod) {
56
- // Fail as the input is "broken"/"crap"/sumthing
57
36
  res.message.push(`'${orig}' requires subfield internal mods/normalization`);
58
37
  return;
59
38
  }
@@ -61,81 +40,68 @@ function _default() {
61
40
  }
62
41
  }
63
42
  function handleInitials(value, subfieldCode, field) {
64
- // MRA-267/273
65
- if (field.ind1 === '1' && subfieldCode === 'a' && ['100', '600', '700', '800'].includes(field.tag) && !(0, _utils.fieldHasSubfield)(field, '0')) {
66
- // Fix MRA-267/273 (partial): Handle the most common case(s). (And extend them rules later on if the need arises):
67
- // No longest initial sequence I've seen is six (in a Sri Lankan name).
43
+ if (field.ind1 === "1" && subfieldCode === "a" && ["100", "600", "700", "800"].includes(field.tag) && !fieldHasSubfield(field, "0")) {
68
44
  for (var i = 0; i < 6 && initialsInRow(value); i++) {
69
- // NB: Regexp has ','. Everything before it belongs to the surname. Everything after it is free game.
70
- value = value.replace(/(,.*) ([A-Z]|Å|Ö|Ö)\.([A-Z]|Å|Ö|Ö)/u, '$1 $2. $3');
45
+ value = value.replace(/(,.*) ([A-Z]|Å|Ö|Ö)\.([A-Z]|Å|Ö|Ö)/u, "$1 $2. $3");
71
46
  }
72
47
  }
73
48
  return value;
74
49
  function initialsInRow(str) {
75
- // initial space confirms us that it's an initial
76
50
  return str.match(/ (?:[A-Z]|Å|Ä|Ö)\.(?:[A-Z]|Å|Ä|Ö)/u);
77
51
  }
78
52
  }
79
53
  function getNormalizedValue(subfield, field, catLang) {
80
54
  return handleFikt(uppercaseLanguage(handleMovies(handleInitials(subfield.value, subfield.code, field))));
81
55
  function handleFikt(value) {
82
- if (subfield.code !== 'c' || field.tag !== '600') {
56
+ if (subfield.code !== "c" || field.tag !== "600") {
83
57
  return value;
84
58
  }
85
59
  return wrapFiktiivinenHahmo(expandFikt(value));
86
- function wrapFiktiivinenHahmo(value) {
87
- if (value.includes('(')) {
88
- // Some kind of parentheses already found -> nothing to do here
89
- return value;
60
+ function wrapFiktiivinenHahmo(value2) {
61
+ if (value2.includes("(")) {
62
+ return value2;
90
63
  }
91
- if (value.match(/^(?:fiktiivinen hahmo|fiktiv gestalt|fiktiivinen yhteisö)[,.]?$/u)) {
92
- // Hope that some other module handles punctuation, if needed:
93
- return `(${value.replace(/[.,]$/u, '')})`;
64
+ if (value2.match(/^(?:fiktiivinen hahmo|fiktiv gestalt|fiktiivinen yhteisö)[,.]?$/u)) {
65
+ return `(${value2.replace(/[.,]$/u, "")})`;
94
66
  }
95
- return value;
67
+ return value2;
96
68
  }
97
-
98
- // wrap text around parentheses
99
- function expandFikt(value) {
100
- if (field.ind1 === '3') {
101
- // Not handling "fiktiivinen yhteisö" at the moment
102
- return value;
69
+ function expandFikt(value2) {
70
+ if (field.ind1 === "3") {
71
+ return value2;
103
72
  }
104
- if (value.match(/\bfikt\.?(?:$|[,)])/u) && !value.match(/fikt.*fikt/ui)) {
105
- // NB! Dot '.' in 'fikt.' might also be punctuation as well. Run punctuation2 fixer after this fixer!
106
- if (catLang === 'fin') {
107
- return value.replace(/\bfikt\./u, 'fiktiivinen hahmo');
73
+ if (value2.match(/\bfikt\.?(?:$|[,)])/u) && !value2.match(/fikt.*fikt/ui)) {
74
+ if (catLang === "fin") {
75
+ return value2.replace(/\bfikt\./u, "fiktiivinen hahmo");
108
76
  }
109
- if (catLang === 'swe') {
110
- return value.replace(/\bfikt\./u, 'fiktiv gestalt');
77
+ if (catLang === "swe") {
78
+ return value2.replace(/\bfikt\./u, "fiktiv gestalt");
111
79
  }
112
80
  }
113
- return value;
81
+ return value2;
114
82
  }
115
83
  }
116
84
  function handleMovies(value) {
117
- if (subfield.code === 'a' && ['130', '630', '730'].includes(field.tag)) {
118
- // MRA-614: "(elokuva, 2000)" => "(elokuva : 2000)""
119
- return value.replace(/\((elokuva), (19[0-9][0-9]|20[0-2][0-9])\)/u, '($1 : $2)');
85
+ if (subfield.code === "a" && ["130", "630", "730"].includes(field.tag)) {
86
+ return value.replace(/\((elokuva), (19[0-9][0-9]|20[0-2][0-9])\)/u, "($1 : $2)");
120
87
  }
121
88
  return value;
122
89
  }
123
90
  function uppercaseLanguage(value) {
124
- // Part of MET-549
125
- const relevantTags = ['130', '240', '243', '600', '610', '611', '630', '700', '710', '711', '730', '800', '810', '811', '830'];
126
- if (subfield.code !== 'l') {
91
+ const relevantTags = ["130", "240", "243", "600", "610", "611", "630", "700", "710", "711", "730", "800", "810", "811", "830"];
92
+ if (subfield.code !== "l") {
127
93
  return value;
128
94
  }
129
95
  const targetTag = tagForUppercasing();
130
96
  if (relevantTags.includes(targetTag)) {
131
97
  const newValue = `${value[0].toUpperCase()}${value.slice(1)}`;
132
98
  if (newValue !== value) {
133
- (0, _punctuation.fieldFixPunctuation)(field); // Rather hackily try to fix prev punc on the fly
99
+ fieldFixPunctuation(field);
134
100
  return newValue;
135
101
  }
136
102
  }
137
103
  function tagForUppercasing() {
138
- return field.tag === '880' ? (0, _subfield6Utils.fieldGetUnambiguousTag)(field) : field.tag;
104
+ return field.tag === "880" ? fieldGetUnambiguousTag(field) : field.tag;
139
105
  }
140
106
  return value;
141
107
  }
@@ -152,4 +118,4 @@ function normalizeSubfieldValues(field, catLang) {
152
118
  });
153
119
  return field;
154
120
  }
155
- //# sourceMappingURL=subfieldValueNormalizations.js.map
121
+ //# sourceMappingURL=subfieldValueNormalizations.js.map
@@ -1 +1,7 @@
1
- {"version":3,"file":"subfieldValueNormalizations.js","names":["_clone","_interopRequireDefault","require","_utils","_punctuation","_subfield6Utils","e","__esModule","default","_default","description","validate","fix","record","catLang","getCatalogingLanguage","res","message","valid","fields","forEach","field","normalizeSubfieldValues","validateField","length","subfields","orig","fieldToString","normalizedField","clone","mod","push","handleInitials","value","subfieldCode","ind1","includes","tag","fieldHasSubfield","i","initialsInRow","replace","str","match","getNormalizedValue","subfield","handleFikt","uppercaseLanguage","handleMovies","code","wrapFiktiivinenHahmo","expandFikt","relevantTags","targetTag","tagForUppercasing","newValue","toUpperCase","slice","fieldFixPunctuation","fieldGetUnambiguousTag","index"],"sources":["../src/subfieldValueNormalizations.js"],"sourcesContent":["//import createDebugLogger from 'debug';\nimport clone from 'clone';\nimport {fieldHasSubfield, fieldToString, getCatalogingLanguage} from './utils';\nimport {fieldFixPunctuation} from './punctuation2';\nimport {fieldGetUnambiguousTag} from './subfield6Utils';\n\n// NB! You should probably run punctuation fixes after this validator!\n\n// Author(s): Nicholas Volk\nexport default function () {\n\n return {\n description: 'Fix various subfield internal values',\n validate, fix\n };\n\n function fix(record) {\n const catLang = getCatalogingLanguage(record, 'fin');\n const res = {message: [], fix: [], valid: true};\n\n record.fields.forEach(field => {\n normalizeSubfieldValues(field, catLang);\n });\n\n // message.valid = !(message.message.length >= 1);\n return res;\n }\n\n function validate(record) {\n const catLang = getCatalogingLanguage(record, 'fin');\n const res = {message: []};\n\n record.fields.forEach(field => {\n validateField(field, res, catLang);\n });\n\n res.valid = !(res.message.length >= 1);\n return res;\n }\n\n function validateField(field, res, catLang) {\n if (!field.subfields) {\n return;\n }\n const orig = fieldToString(field);\n\n const normalizedField = normalizeSubfieldValues(clone(field), catLang);\n const mod = fieldToString(normalizedField);\n if (orig !== mod) { // Fail as the input is \"broken\"/\"crap\"/sumthing\n res.message.push(`'${orig}' requires subfield internal mods/normalization`);\n return;\n }\n return;\n }\n}\n\n\nfunction handleInitials(value, subfieldCode, field) {\n // MRA-267/273\n if (field.ind1 === '1' && subfieldCode === 'a' && ['100', '600', '700', '800'].includes(field.tag) && !fieldHasSubfield(field, '0')) {\n // Fix MRA-267/273 (partial): Handle the most common case(s). (And extend them rules later on if the need arises):\n // No longest initial sequence I've seen is six (in a Sri Lankan name).\n for (var i=0; i < 6 && initialsInRow(value); i++) {\n // NB: Regexp has ','. Everything before it belongs to the surname. Everything after it is free game.\n value = value.replace(/(,.*) ([A-Z]|Å|Ö|Ö)\\.([A-Z]|Å|Ö|Ö)/u, '$1 $2. $3');\n }\n }\n\n return value;\n\n function initialsInRow(str) {\n // initial space confirms us that it's an initial\n return str.match(/ (?:[A-Z]|Å|Ä|Ö)\\.(?:[A-Z]|Å|Ä|Ö)/u);\n }\n}\n\nfunction getNormalizedValue(subfield, field, catLang) {\n return handleFikt(uppercaseLanguage(handleMovies(handleInitials(subfield.value, subfield.code, field))));\n\n function handleFikt(value) {\n if (subfield.code !== 'c' || field.tag !== '600') {\n return value;\n }\n\n return wrapFiktiivinenHahmo(expandFikt(value));\n\n function wrapFiktiivinenHahmo(value) {\n if (value.includes('(')) { // Some kind of parentheses already found -> nothing to do here\n return value;\n }\n if (value.match(/^(?:fiktiivinen hahmo|fiktiv gestalt|fiktiivinen yhteisö)[,.]?$/u)) {\n // Hope that some other module handles punctuation, if needed:\n return `(${value.replace(/[.,]$/u, '')})`;\n }\n return value;\n }\n\n // wrap text around parentheses\n function expandFikt(value) {\n if (field.ind1 === '3') { // Not handling \"fiktiivinen yhteisö\" at the moment\n return value;\n }\n\n if (value.match(/\\bfikt\\.?(?:$|[,)])/u) && !value.match(/fikt.*fikt/ui)) {\n // NB! Dot '.' in 'fikt.' might also be punctuation as well. Run punctuation2 fixer after this fixer!\n if (catLang === 'fin') {\n return value.replace(/\\bfikt\\./u, 'fiktiivinen hahmo');\n }\n if (catLang === 'swe') {\n return value.replace(/\\bfikt\\./u, 'fiktiv gestalt');\n }\n }\n return value;\n }\n\n }\n\n function handleMovies(value) {\n if (subfield.code === 'a' && ['130', '630', '730'].includes(field.tag)) {\n // MRA-614: \"(elokuva, 2000)\" => \"(elokuva : 2000)\"\"\n return value.replace(/\\((elokuva), (19[0-9][0-9]|20[0-2][0-9])\\)/u, '($1 : $2)');\n }\n return value;\n }\n\n\n function uppercaseLanguage(value) { // Part of MET-549\n const relevantTags = ['130', '240', '243', '600', '610', '611', '630', '700', '710', '711', '730', '800', '810', '811', '830'];\n\n if (subfield.code !== 'l') {\n return value;\n }\n const targetTag = tagForUppercasing();\n if (relevantTags.includes(targetTag)) {\n const newValue = `${value[0].toUpperCase()}${value.slice(1)}`;\n if (newValue !== value) {\n fieldFixPunctuation(field); // Rather hackily try to fix prev punc on the fly\n return newValue;\n }\n }\n\n function tagForUppercasing() {\n return field.tag === '880' ? fieldGetUnambiguousTag(field) : field.tag;\n }\n\n return value;\n }\n}\n\nfunction normalizeSubfieldValues(field, catLang) {\n if (!field.subfields) {\n return field;\n }\n field.subfields.forEach((subfield, index) => {\n if (!field.subfields[index].value) {\n return;\n }\n field.subfields[index].value = getNormalizedValue(subfield, field, catLang);\n });\n return field;\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/subfieldValueNormalizations.js"],
4
+ "sourcesContent": ["//import createDebugLogger from 'debug';\nimport clone from 'clone';\nimport {fieldHasSubfield, fieldToString, getCatalogingLanguage} from './utils.js';\nimport {fieldFixPunctuation} from './punctuation2.js';\nimport {fieldGetUnambiguousTag} from './subfield6Utils.js';\n\n// NB! You should probably run punctuation fixes after this validator!\n\n// Author(s): Nicholas Volk\nexport default function () {\n\n return {\n description: 'Fix various subfield internal values',\n validate, fix\n };\n\n function fix(record) {\n const catLang = getCatalogingLanguage(record, 'fin');\n const res = {message: [], fix: [], valid: true};\n\n record.fields.forEach(field => {\n normalizeSubfieldValues(field, catLang);\n });\n\n // message.valid = !(message.message.length >= 1);\n return res;\n }\n\n function validate(record) {\n const catLang = getCatalogingLanguage(record, 'fin');\n const res = {message: []};\n\n record.fields.forEach(field => {\n validateField(field, res, catLang);\n });\n\n res.valid = !(res.message.length >= 1);\n return res;\n }\n\n function validateField(field, res, catLang) {\n if (!field.subfields) {\n return;\n }\n const orig = fieldToString(field);\n\n const normalizedField = normalizeSubfieldValues(clone(field), catLang);\n const mod = fieldToString(normalizedField);\n if (orig !== mod) { // Fail as the input is \"broken\"/\"crap\"/sumthing\n res.message.push(`'${orig}' requires subfield internal mods/normalization`);\n return;\n }\n return;\n }\n}\n\n\nfunction handleInitials(value, subfieldCode, field) {\n // MRA-267/273\n if (field.ind1 === '1' && subfieldCode === 'a' && ['100', '600', '700', '800'].includes(field.tag) && !fieldHasSubfield(field, '0')) {\n // Fix MRA-267/273 (partial): Handle the most common case(s). (And extend them rules later on if the need arises):\n // No longest initial sequence I've seen is six (in a Sri Lankan name).\n for (var i=0; i < 6 && initialsInRow(value); i++) {\n // NB: Regexp has ','. Everything before it belongs to the surname. Everything after it is free game.\n value = value.replace(/(,.*) ([A-Z]|\u00C5|\u00D6|\u00D6)\\.([A-Z]|\u00C5|\u00D6|\u00D6)/u, '$1 $2. $3');\n }\n }\n\n return value;\n\n function initialsInRow(str) {\n // initial space confirms us that it's an initial\n return str.match(/ (?:[A-Z]|\u00C5|\u00C4|\u00D6)\\.(?:[A-Z]|\u00C5|\u00C4|\u00D6)/u);\n }\n}\n\nfunction getNormalizedValue(subfield, field, catLang) {\n return handleFikt(uppercaseLanguage(handleMovies(handleInitials(subfield.value, subfield.code, field))));\n\n function handleFikt(value) {\n if (subfield.code !== 'c' || field.tag !== '600') {\n return value;\n }\n\n return wrapFiktiivinenHahmo(expandFikt(value));\n\n function wrapFiktiivinenHahmo(value) {\n if (value.includes('(')) { // Some kind of parentheses already found -> nothing to do here\n return value;\n }\n if (value.match(/^(?:fiktiivinen hahmo|fiktiv gestalt|fiktiivinen yhteis\u00F6)[,.]?$/u)) {\n // Hope that some other module handles punctuation, if needed:\n return `(${value.replace(/[.,]$/u, '')})`;\n }\n return value;\n }\n\n // wrap text around parentheses\n function expandFikt(value) {\n if (field.ind1 === '3') { // Not handling \"fiktiivinen yhteis\u00F6\" at the moment\n return value;\n }\n\n if (value.match(/\\bfikt\\.?(?:$|[,)])/u) && !value.match(/fikt.*fikt/ui)) {\n // NB! Dot '.' in 'fikt.' might also be punctuation as well. Run punctuation2 fixer after this fixer!\n if (catLang === 'fin') {\n return value.replace(/\\bfikt\\./u, 'fiktiivinen hahmo');\n }\n if (catLang === 'swe') {\n return value.replace(/\\bfikt\\./u, 'fiktiv gestalt');\n }\n }\n return value;\n }\n\n }\n\n function handleMovies(value) {\n if (subfield.code === 'a' && ['130', '630', '730'].includes(field.tag)) {\n // MRA-614: \"(elokuva, 2000)\" => \"(elokuva : 2000)\"\"\n return value.replace(/\\((elokuva), (19[0-9][0-9]|20[0-2][0-9])\\)/u, '($1 : $2)');\n }\n return value;\n }\n\n\n function uppercaseLanguage(value) { // Part of MET-549\n const relevantTags = ['130', '240', '243', '600', '610', '611', '630', '700', '710', '711', '730', '800', '810', '811', '830'];\n\n if (subfield.code !== 'l') {\n return value;\n }\n const targetTag = tagForUppercasing();\n if (relevantTags.includes(targetTag)) {\n const newValue = `${value[0].toUpperCase()}${value.slice(1)}`;\n if (newValue !== value) {\n fieldFixPunctuation(field); // Rather hackily try to fix prev punc on the fly\n return newValue;\n }\n }\n\n function tagForUppercasing() {\n return field.tag === '880' ? fieldGetUnambiguousTag(field) : field.tag;\n }\n\n return value;\n }\n}\n\nfunction normalizeSubfieldValues(field, catLang) {\n if (!field.subfields) {\n return field;\n }\n field.subfields.forEach((subfield, index) => {\n if (!field.subfields[index].value) {\n return;\n }\n field.subfields[index].value = getNormalizedValue(subfield, field, catLang);\n });\n return field;\n}\n"],
5
+ "mappings": "AACA,OAAO,WAAW;AAClB,SAAQ,kBAAkB,eAAe,6BAA4B;AACrE,SAAQ,2BAA0B;AAClC,SAAQ,8BAA6B;AAKrC,0BAA2B;AAEzB,SAAO;AAAA,IACL,aAAa;AAAA,IACb;AAAA,IAAU;AAAA,EACZ;AAEA,WAAS,IAAI,QAAQ;AACnB,UAAM,UAAU,sBAAsB,QAAQ,KAAK;AACnD,UAAM,MAAM,EAAC,SAAS,CAAC,GAAG,KAAK,CAAC,GAAG,OAAO,KAAI;AAE9C,WAAO,OAAO,QAAQ,WAAS;AAC7B,8BAAwB,OAAO,OAAO;AAAA,IACxC,CAAC;AAGD,WAAO;AAAA,EACT;AAEA,WAAS,SAAS,QAAQ;AACxB,UAAM,UAAU,sBAAsB,QAAQ,KAAK;AACnD,UAAM,MAAM,EAAC,SAAS,CAAC,EAAC;AAExB,WAAO,OAAO,QAAQ,WAAS;AAC7B,oBAAc,OAAO,KAAK,OAAO;AAAA,IACnC,CAAC;AAED,QAAI,QAAQ,EAAE,IAAI,QAAQ,UAAU;AACpC,WAAO;AAAA,EACT;AAEA,WAAS,cAAc,OAAO,KAAK,SAAS;AAC1C,QAAI,CAAC,MAAM,WAAW;AACpB;AAAA,IACF;AACA,UAAM,OAAO,cAAc,KAAK;AAEhC,UAAM,kBAAkB,wBAAwB,MAAM,KAAK,GAAG,OAAO;AACrE,UAAM,MAAM,cAAc,eAAe;AACzC,QAAI,SAAS,KAAK;AAChB,UAAI,QAAQ,KAAK,IAAI,IAAI,iDAAiD;AAC1E;AAAA,IACF;AACA;AAAA,EACF;AACF;AAGA,SAAS,eAAe,OAAO,cAAc,OAAO;AAElD,MAAI,MAAM,SAAS,OAAO,iBAAiB,OAAO,CAAC,OAAO,OAAO,OAAO,KAAK,EAAE,SAAS,MAAM,GAAG,KAAK,CAAC,iBAAiB,OAAO,GAAG,GAAG;AAGnI,aAAS,IAAE,GAAG,IAAI,KAAK,cAAc,KAAK,GAAG,KAAK;AAEhD,cAAQ,MAAM,QAAQ,uCAAuC,WAAW;AAAA,IAC1E;AAAA,EACF;AAEA,SAAO;AAEP,WAAS,cAAc,KAAK;AAE1B,WAAO,IAAI,MAAM,oCAAoC;AAAA,EACvD;AACF;AAEA,SAAS,mBAAmB,UAAU,OAAO,SAAS;AACpD,SAAO,WAAW,kBAAkB,aAAa,eAAe,SAAS,OAAO,SAAS,MAAM,KAAK,CAAC,CAAC,CAAC;AAEvG,WAAS,WAAW,OAAO;AACzB,QAAI,SAAS,SAAS,OAAO,MAAM,QAAQ,OAAO;AAChD,aAAO;AAAA,IACT;AAEA,WAAO,qBAAqB,WAAW,KAAK,CAAC;AAE7C,aAAS,qBAAqBA,QAAO;AACnC,UAAIA,OAAM,SAAS,GAAG,GAAG;AACvB,eAAOA;AAAA,MACT;AACA,UAAIA,OAAM,MAAM,kEAAkE,GAAG;AAEnF,eAAO,IAAIA,OAAM,QAAQ,UAAU,EAAE,CAAC;AAAA,MACxC;AACA,aAAOA;AAAA,IACT;AAGA,aAAS,WAAWA,QAAO;AACzB,UAAI,MAAM,SAAS,KAAK;AACtB,eAAOA;AAAA,MACT;AAEA,UAAIA,OAAM,MAAM,sBAAsB,KAAK,CAACA,OAAM,MAAM,cAAc,GAAG;AAEvE,YAAI,YAAY,OAAO;AACrB,iBAAOA,OAAM,QAAQ,aAAa,mBAAmB;AAAA,QACvD;AACA,YAAI,YAAY,OAAO;AACrB,iBAAOA,OAAM,QAAQ,aAAa,gBAAgB;AAAA,QACpD;AAAA,MACF;AACA,aAAOA;AAAA,IACT;AAAA,EAEF;AAEA,WAAS,aAAa,OAAO;AAC3B,QAAI,SAAS,SAAS,OAAO,CAAC,OAAO,OAAO,KAAK,EAAE,SAAS,MAAM,GAAG,GAAG;AAEtE,aAAO,MAAM,QAAQ,+CAA+C,WAAW;AAAA,IACjF;AACA,WAAO;AAAA,EACT;AAGA,WAAS,kBAAkB,OAAO;AAChC,UAAM,eAAe,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK;AAE7H,QAAI,SAAS,SAAS,KAAK;AACzB,aAAO;AAAA,IACT;AACA,UAAM,YAAY,kBAAkB;AACpC,QAAI,aAAa,SAAS,SAAS,GAAG;AACpC,YAAM,WAAW,GAAG,MAAM,CAAC,EAAE,YAAY,CAAC,GAAG,MAAM,MAAM,CAAC,CAAC;AAC3D,UAAI,aAAa,OAAO;AACtB,4BAAoB,KAAK;AACzB,eAAO;AAAA,MACT;AAAA,IACF;AAEA,aAAS,oBAAoB;AAC3B,aAAO,MAAM,QAAQ,QAAQ,uBAAuB,KAAK,IAAI,MAAM;AAAA,IACrE;AAEA,WAAO;AAAA,EACT;AACF;AAEA,SAAS,wBAAwB,OAAO,SAAS;AAC/C,MAAI,CAAC,MAAM,WAAW;AACpB,WAAO;AAAA,EACT;AACA,QAAM,UAAU,QAAQ,CAAC,UAAU,UAAU;AAC3C,QAAI,CAAC,MAAM,UAAU,KAAK,EAAE,OAAO;AACjC;AAAA,IACF;AACA,UAAM,UAAU,KAAK,EAAE,QAAQ,mBAAmB,UAAU,OAAO,OAAO;AAAA,EAC5E,CAAC;AACD,SAAO;AACT;",
6
+ "names": ["value"]
7
+ }
@@ -0,0 +1,45 @@
1
+ import assert from "node:assert";
2
+ import { MarcRecord } from "@natlibfi/marc-record";
3
+ import validatorFactory from "./subfieldValueNormalizations.js";
4
+ import { READERS } from "@natlibfi/fixura";
5
+ import generateTests from "@natlibfi/fixugen";
6
+ import createDebugLogger from "debug";
7
+ generateTests({
8
+ callback,
9
+ path: [import.meta.dirname, "..", "test-fixtures", "normalize-subfield-value"],
10
+ useMetadataFile: true,
11
+ recurse: false,
12
+ fixura: {
13
+ reader: READERS.JSON
14
+ },
15
+ hooks: {
16
+ before: async () => {
17
+ testValidatorFactory();
18
+ }
19
+ }
20
+ });
21
+ const debug = createDebugLogger("@natlibfi/marc-record-validators-melinda/subfieldValueNormalizations:test");
22
+ async function testValidatorFactory() {
23
+ const validator = await validatorFactory();
24
+ assert.equal(typeof validator, "object");
25
+ assert.equal(typeof validator, "string");
26
+ assert.equal(typeof validator, "function");
27
+ }
28
+ async function callback({ getFixture, enabled = true, fix = false }) {
29
+ if (enabled === false) {
30
+ debug("TEST SKIPPED!");
31
+ return;
32
+ }
33
+ const validator = await validatorFactory();
34
+ const recordFixture = getFixture("record.json");
35
+ const record = recordFixture._validationOptions ? new MarcRecord(recordFixture, recordFixture._validationOptions) : new MarcRecord(recordFixture);
36
+ const expectedResult = getFixture("expectedResult.json");
37
+ if (!fix) {
38
+ const result = await validator.validate(record);
39
+ assert.deepEqual(result, expectedResult);
40
+ return;
41
+ }
42
+ await validator.fix(record);
43
+ assert.deepEqual(record, expectedResult);
44
+ }
45
+ //# sourceMappingURL=subfieldValueNormalizations.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/subfieldValueNormalizations.test.js"],
4
+ "sourcesContent": ["import assert from 'node:assert';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './subfieldValueNormalizations.js';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\nimport createDebugLogger from 'debug';\n\ngenerateTests({\n callback,\n path: [import.meta.dirname, '..', 'test-fixtures', 'normalize-subfield-value'],\n useMetadataFile: true,\n recurse: false,\n fixura: {\n reader: READERS.JSON\n },\n hooks: {\n before: async () => {\n testValidatorFactory();\n }\n }\n});\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/subfieldValueNormalizations:test');\n\nasync function testValidatorFactory() {\n const validator = await validatorFactory();\n\n assert.equal(typeof validator, 'object');\n assert.equal(typeof validator, 'string');\n assert.equal(typeof validator, 'function');\n}\n\nasync function callback({getFixture, enabled = true, fix = false}) {\n if (enabled === false) {\n debug('TEST SKIPPED!');\n return;\n }\n\n const validator = await validatorFactory();\n\n const recordFixture = getFixture('record.json');\n\n const record = recordFixture._validationOptions ? new MarcRecord(recordFixture, recordFixture._validationOptions) : new MarcRecord(recordFixture);\n //const record = new MarcRecord(recordFixture, {\"subfields\": false}); // works\n const expectedResult = getFixture('expectedResult.json');\n // console.log(expectedResult); // eslint-disable-line\n\n if (!fix) {\n const result = await validator.validate(record);\n assert.deepEqual(result, expectedResult);\n return;\n }\n\n await validator.fix(record);\n assert.deepEqual(record, expectedResult);\n}\n"],
5
+ "mappings": "AAAA,OAAO,YAAY;AACnB,SAAQ,kBAAiB;AACzB,OAAO,sBAAsB;AAC7B,SAAQ,eAAc;AACtB,OAAO,mBAAmB;AAC1B,OAAO,uBAAuB;AAE9B,cAAc;AAAA,EACZ;AAAA,EACA,MAAM,CAAC,YAAY,SAAS,MAAM,iBAAiB,0BAA0B;AAAA,EAC7E,iBAAiB;AAAA,EACjB,SAAS;AAAA,EACT,QAAQ;AAAA,IACN,QAAQ,QAAQ;AAAA,EAClB;AAAA,EACA,OAAO;AAAA,IACL,QAAQ,YAAY;AAClB,2BAAqB;AAAA,IACvB;AAAA,EACF;AACF,CAAC;AAED,MAAM,QAAQ,kBAAkB,2EAA2E;AAE3G,eAAe,uBAAuB;AACpC,QAAM,YAAY,MAAM,iBAAiB;AAEzC,SAAO,MAAM,OAAO,WAAW,QAAQ;AACvC,SAAO,MAAM,OAAO,WAAW,QAAQ;AACvC,SAAO,MAAM,OAAO,WAAW,UAAU;AAC3C;AAEA,eAAe,SAAS,EAAC,YAAY,UAAU,MAAM,MAAM,MAAK,GAAG;AACjE,MAAI,YAAY,OAAO;AACrB,UAAM,eAAe;AACrB;AAAA,EACF;AAEA,QAAM,YAAY,MAAM,iBAAiB;AAEzC,QAAM,gBAAgB,WAAW,aAAa;AAE9C,QAAM,SAAS,cAAc,qBAAqB,IAAI,WAAW,eAAe,cAAc,kBAAkB,IAAI,IAAI,WAAW,aAAa;AAEhJ,QAAM,iBAAiB,WAAW,qBAAqB;AAGvD,MAAI,CAAC,KAAK;AACR,UAAM,SAAS,MAAM,UAAU,SAAS,MAAM;AAC9C,WAAO,UAAU,QAAQ,cAAc;AACvC;AAAA,EACF;AAEA,QAAM,UAAU,IAAI,MAAM;AAC1B,SAAO,UAAU,QAAQ,cAAc;AACzC;",
6
+ "names": []
7
+ }