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

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 (546) 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/index.js +58 -58
  338. package/src/indicator-fixes.js +3 -3
  339. package/src/{indicator-fixes.spec.js → indicator-fixes.test.js} +9 -12
  340. package/src/isbn-issn.js +1 -1
  341. package/src/{isbn-issn.spec.js → isbn-issn.test.js} +20 -22
  342. package/src/{item-language.spec.js → item-language.test.js} +21 -22
  343. package/src/merge-fields/controlSubfields.js +1 -1
  344. package/src/merge-fields/counterpartField.js +8 -9
  345. package/src/merge-fields/index.js +1 -1
  346. package/src/merge-fields/mergableIndicator.js +1 -1
  347. package/src/merge-fields/mergeField.js +6 -6
  348. package/src/merge-fields/mergeIndicator.js +1 -1
  349. package/src/merge-fields/mergeOrAddPostprocess.js +4 -4
  350. package/src/merge-fields/mergeOrAddSubfield.js +2 -2
  351. package/src/merge-fields/mergeSubfield.js +4 -4
  352. package/src/merge-fields/removeDuplicateSubfields.js +2 -2
  353. package/src/{merge-fields.spec.js → merge-fields.test.js} +12 -13
  354. package/src/{mergeField500Lisapainokset.spec.js → mergeField500Lisapainokset.test.js} +12 -13
  355. package/src/mergeRelatorTermFields.js +5 -7
  356. package/src/{mergeRelatorTermFields.spec.js → mergeRelatorTermFields.test.js} +12 -13
  357. package/src/modernize-502.js +1 -1
  358. package/src/{modernize-502.spec.js → modernize-502.test.js} +12 -13
  359. package/src/multiple-subfield-0.js +3 -3
  360. package/src/{multiple-subfield-0.spec.js → multiple-subfield-0.test.js} +13 -13
  361. package/src/{non-breaking-space.spec.js → non-breaking-space.test.js} +12 -13
  362. package/src/normalize-dashes.js +2 -2
  363. package/src/{normalize-dashes.spec.js → normalize-dashes.test.js} +12 -13
  364. package/src/normalize-identifiers.js +1 -1
  365. package/src/{normalize-identifiers.spec.js → normalize-identifiers.test.js} +12 -13
  366. package/src/normalize-qualifying-information.js +2 -2
  367. package/src/{normalize-qualifying-information.spec.js → normalize-qualifying-information.test.js} +12 -13
  368. package/src/normalize-utf8-diacritics.js +2 -2
  369. package/src/{normalize-utf8-diacritics.spec.js → normalize-utf8-diacritics.test.js} +13 -13
  370. package/src/normalizeFieldForComparison.js +6 -6
  371. package/src/normalizeSubfieldValueForComparison.js +1 -1
  372. package/src/prepublicationUtils.js +4 -4
  373. package/src/punctuation/index.js +1 -1
  374. package/src/punctuation/rules/index.js +2 -2
  375. package/src/{punctuation.spec.js → punctuation.test.js} +12 -13
  376. package/src/punctuation2.js +4 -4
  377. package/src/{punctuation2.spec.js → punctuation2.test.js} +12 -13
  378. package/src/reindexSubfield6OccurenceNumbers.js +5 -7
  379. package/src/{reindexSubfield6OccurenceNumbers.spec.js → reindexSubfield6OccurenceNumbers.test.js} +12 -13
  380. package/src/removeDuplicateDataFields.js +11 -19
  381. package/src/{removeDuplicateDataFields.spec.js → removeDuplicateDataFields.test.js} +12 -13
  382. package/src/removeInferiorDataFields.js +11 -11
  383. package/src/{removeInferiorDataFields.spec.js → removeInferiorDataFields.test.js} +13 -13
  384. package/src/resolvable-ext-references-melinda.js +1 -1
  385. package/src/{resolvable-ext-references-melinda.spec.js → resolvable-ext-references-melinda.test.js} +42 -27
  386. package/src/resolveOrphanedSubfield6s.js +5 -5
  387. package/src/{resolveOrphanedSubfield6s.spec.js → resolveOrphanedSubfield6s.test.js} +13 -13
  388. package/src/sanitize-vocabulary-source-codes.js +4 -4
  389. package/src/{sanitize-vocabulary-source-codes.spec.js → sanitize-vocabulary-source-codes.test.js} +16 -14
  390. package/src/{sort-tags.spec.js → sort-tags.test.js} +9 -11
  391. package/src/sortFields.js +4 -4
  392. package/src/{sortFields.spec.js → sortFields.test.js} +12 -13
  393. package/src/sortRelatorTerms.js +3 -3
  394. package/src/{sortRelatorTerms.spec.js → sortRelatorTerms.test.js} +13 -13
  395. package/src/sortSubfields.js +1 -1
  396. package/src/{sortSubfields.spec.js → sortSubfields.test.js} +13 -13
  397. package/src/stripPunctuation.js +3 -3
  398. package/src/{stripPunctuation.spec.js → stripPunctuation.test.js} +13 -13
  399. package/src/subfield-exclusion.js +1 -1
  400. package/src/{subfield-exclusion.spec.js → subfield-exclusion.test.js} +45 -36
  401. package/src/subfield6Utils.js +6 -10
  402. package/src/subfield8Utils.js +4 -4
  403. package/src/subfieldValueNormalizations.js +3 -3
  404. package/src/{subfieldValueNormalizations.spec.js → subfieldValueNormalizations.test.js} +18 -14
  405. package/src/sync-007-and-300.js +2 -2
  406. package/src/{sync-007-and-300.spec.js → sync-007-and-300.test.js} +13 -13
  407. package/src/translate-terms.js +3 -3
  408. package/src/{translate-terms.spec.js → translate-terms.test.js} +13 -13
  409. package/src/{typeOfDate-008.spec.js → typeOfDate-008.test.js} +12 -13
  410. package/src/{unicode-decomposition.spec.js → unicode-decomposition.test.js} +10 -16
  411. package/src/update-field-540.js +2 -2
  412. package/src/{update-field-540.spec.js → update-field-540.test.js} +13 -10
  413. package/src/urn.js +2 -2
  414. package/src/{urn.spec.js → urn.test.js} +12 -13
  415. package/src/utils.js +3 -3
  416. package/test-fixtures/field-505-separators/03/expectedResult.json +3 -1
  417. package/test-fixtures/field-505-separators/03/record.json +3 -0
  418. package/test-fixtures/normalize-subfield-value/01/metadata.json +4 -1
  419. package/test-fixtures/normalize-subfield-value/01/record.json +3 -0
  420. package/test-fixtures/normalize-subfield-value/02/expectedResult.json +3 -1
  421. package/test-fixtures/normalize-subfield-value/02/metadata.json +2 -1
  422. package/test-fixtures/normalize-subfield-value/02/record.json +3 -0
  423. package/test-fixtures/sanitize-vocabulary-source-codes/f03/expectedResult.json +3 -1
  424. package/test-fixtures/sanitize-vocabulary-source-codes/f04/expectedResult.json +3 -1
  425. package/test-fixtures/sanitize-vocabulary-source-codes/v04/metadata.json +1 -4
  426. package/test-fixtures/sanitize-vocabulary-source-codes/v04/record.json +1 -1
  427. package/dist/access-rights.spec.js +0 -195
  428. package/dist/access-rights.spec.js.map +0 -1
  429. package/dist/addMissingField041.spec.js +0 -45
  430. package/dist/addMissingField041.spec.js.map +0 -1
  431. package/dist/addMissingField336.spec.js +0 -45
  432. package/dist/addMissingField336.spec.js.map +0 -1
  433. package/dist/addMissingField337.spec.js +0 -43
  434. package/dist/addMissingField337.spec.js.map +0 -1
  435. package/dist/addMissingField338.spec.js +0 -45
  436. package/dist/addMissingField338.spec.js.map +0 -1
  437. package/dist/cyrillux-usemarcon-replacement.spec.js +0 -45
  438. package/dist/cyrillux-usemarcon-replacement.spec.js.map +0 -1
  439. package/dist/cyrillux.spec.js +0 -46
  440. package/dist/cyrillux.spec.js.map +0 -1
  441. package/dist/disambiguateSeriesStatements.spec.js +0 -51
  442. package/dist/disambiguateSeriesStatements.spec.js.map +0 -1
  443. package/dist/double-commas.spec.js +0 -73
  444. package/dist/double-commas.spec.js.map +0 -1
  445. package/dist/duplicates-ind1.spec.js +0 -45
  446. package/dist/duplicates-ind1.spec.js.map +0 -1
  447. package/dist/empty-fields.spec.js +0 -118
  448. package/dist/empty-fields.spec.js.map +0 -1
  449. package/dist/ending-punctuation.spec.js +0 -2654
  450. package/dist/ending-punctuation.spec.js.map +0 -1
  451. package/dist/ending-whitespace.spec.js +0 -42
  452. package/dist/ending-whitespace.spec.js.map +0 -1
  453. package/dist/field-008-18-34-character-groups.spec.js +0 -51
  454. package/dist/field-008-18-34-character-groups.spec.js.map +0 -1
  455. package/dist/field-505-separators.spec.js +0 -51
  456. package/dist/field-505-separators.spec.js.map +0 -1
  457. package/dist/field-521-fix.spec.js +0 -51
  458. package/dist/field-521-fix.spec.js.map +0 -1
  459. package/dist/field-exclusion.spec.js +0 -1054
  460. package/dist/field-exclusion.spec.js.map +0 -1
  461. package/dist/field-structure.spec.js +0 -535
  462. package/dist/field-structure.spec.js.map +0 -1
  463. package/dist/fields-present.spec.js +0 -121
  464. package/dist/fields-present.spec.js.map +0 -1
  465. package/dist/fix-33X.spec.js +0 -45
  466. package/dist/fix-33X.spec.js.map +0 -1
  467. package/dist/fix-country-codes.spec.js +0 -51
  468. package/dist/fix-country-codes.spec.js.map +0 -1
  469. package/dist/fix-language-codes.spec.js +0 -44
  470. package/dist/fix-language-codes.spec.js.map +0 -1
  471. package/dist/fixRelatorTerms.spec.js +0 -51
  472. package/dist/fixRelatorTerms.spec.js.map +0 -1
  473. package/dist/fixed-fields.spec.js +0 -140
  474. package/dist/fixed-fields.spec.js.map +0 -1
  475. package/dist/identical-fields.spec.js +0 -99
  476. package/dist/identical-fields.spec.js.map +0 -1
  477. package/dist/indicator-fixes.spec.js +0 -51
  478. package/dist/indicator-fixes.spec.js.map +0 -1
  479. package/dist/isbn-issn.spec.js +0 -595
  480. package/dist/isbn-issn.spec.js.map +0 -1
  481. package/dist/item-language.spec.js +0 -306
  482. package/dist/item-language.spec.js.map +0 -1
  483. package/dist/melindaCustomMergeFields.json +0 -5120
  484. package/dist/merge-fields.spec.js +0 -51
  485. package/dist/merge-fields.spec.js.map +0 -1
  486. package/dist/mergeField500Lisapainokset.spec.js +0 -51
  487. package/dist/mergeField500Lisapainokset.spec.js.map +0 -1
  488. package/dist/mergeRelatorTermFields.spec.js +0 -51
  489. package/dist/mergeRelatorTermFields.spec.js.map +0 -1
  490. package/dist/modernize-502.spec.js +0 -49
  491. package/dist/modernize-502.spec.js.map +0 -1
  492. package/dist/multiple-subfield-0.spec.js +0 -51
  493. package/dist/multiple-subfield-0.spec.js.map +0 -1
  494. package/dist/non-breaking-space.spec.js +0 -42
  495. package/dist/non-breaking-space.spec.js.map +0 -1
  496. package/dist/normalize-dashes.spec.js +0 -51
  497. package/dist/normalize-dashes.spec.js.map +0 -1
  498. package/dist/normalize-identifiers.spec.js +0 -51
  499. package/dist/normalize-identifiers.spec.js.map +0 -1
  500. package/dist/normalize-qualifying-information.spec.js +0 -51
  501. package/dist/normalize-qualifying-information.spec.js.map +0 -1
  502. package/dist/normalize-utf8-diacritics.spec.js +0 -51
  503. package/dist/normalize-utf8-diacritics.spec.js.map +0 -1
  504. package/dist/punctuation.spec.js +0 -51
  505. package/dist/punctuation.spec.js.map +0 -1
  506. package/dist/punctuation2.spec.js +0 -51
  507. package/dist/punctuation2.spec.js.map +0 -1
  508. package/dist/reindexSubfield6OccurenceNumbers.spec.js +0 -51
  509. package/dist/reindexSubfield6OccurenceNumbers.spec.js.map +0 -1
  510. package/dist/removeDuplicateDataFields.spec.js +0 -51
  511. package/dist/removeDuplicateDataFields.spec.js.map +0 -1
  512. package/dist/removeInferiorDataFields.spec.js +0 -51
  513. package/dist/removeInferiorDataFields.spec.js.map +0 -1
  514. package/dist/resolvable-ext-references-melinda.spec.js +0 -166
  515. package/dist/resolvable-ext-references-melinda.spec.js.map +0 -1
  516. package/dist/resolveOrphanedSubfield6s.spec.js +0 -51
  517. package/dist/resolveOrphanedSubfield6s.spec.js.map +0 -1
  518. package/dist/sanitize-vocabulary-source-codes.spec.js +0 -51
  519. package/dist/sanitize-vocabulary-source-codes.spec.js.map +0 -1
  520. package/dist/sort-tags.spec.js +0 -207
  521. package/dist/sort-tags.spec.js.map +0 -1
  522. package/dist/sortFields.spec.js +0 -51
  523. package/dist/sortFields.spec.js.map +0 -1
  524. package/dist/sortRelatorTerms.spec.js +0 -51
  525. package/dist/sortRelatorTerms.spec.js.map +0 -1
  526. package/dist/sortSubfields.spec.js +0 -52
  527. package/dist/sortSubfields.spec.js.map +0 -1
  528. package/dist/stripPunctuation.spec.js +0 -51
  529. package/dist/stripPunctuation.spec.js.map +0 -1
  530. package/dist/subfield-exclusion.spec.js +0 -523
  531. package/dist/subfield-exclusion.spec.js.map +0 -1
  532. package/dist/subfieldValueNormalizations.spec.js +0 -51
  533. package/dist/subfieldValueNormalizations.spec.js.map +0 -1
  534. package/dist/sync-007-and-300.spec.js +0 -51
  535. package/dist/sync-007-and-300.spec.js.map +0 -1
  536. package/dist/translate-terms.spec.js +0 -51
  537. package/dist/translate-terms.spec.js.map +0 -1
  538. package/dist/typeOfDate-008.spec.js +0 -47
  539. package/dist/typeOfDate-008.spec.js.map +0 -1
  540. package/dist/unicode-decomposition.spec.js +0 -91
  541. package/dist/unicode-decomposition.spec.js.map +0 -1
  542. package/dist/update-field-540.spec.js +0 -51
  543. package/dist/update-field-540.spec.js.map +0 -1
  544. package/dist/urn.spec.js +0 -52
  545. package/dist/urn.spec.js.map +0 -1
  546. package/src/cyrillux-usemarcon-replacement.spec.js +0 -47
@@ -0,0 +1,44 @@
1
+ import assert from "node:assert";
2
+ import { MarcRecord } from "@natlibfi/marc-record";
3
+ import validatorFactory from "./merge-fields/index.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", "merge-fields"],
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/merge-fields:test");
22
+ async function testValidatorFactory() {
23
+ const validator = await validatorFactory();
24
+ assert.equal(typeof validator, "object");
25
+ assert.equal(typeof validator.description, "string");
26
+ assert.equal(typeof validator.validate, "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 record = new MarcRecord(getFixture("record.json"));
35
+ const expectedResult = getFixture("expectedResult.json");
36
+ if (!fix) {
37
+ const result = await validator.validate(record);
38
+ assert.deepEqual(result, expectedResult);
39
+ return;
40
+ }
41
+ await validator.fix(record);
42
+ assert.deepEqual(record, expectedResult);
43
+ }
44
+ //# sourceMappingURL=merge-fields.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/merge-fields.test.js"],
4
+ "sourcesContent": ["import assert from 'node:assert';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './merge-fields/index.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', 'merge-fields'],\n useMetadataFile: true,\n recurse: false,\n fixura: {\n reader: READERS.JSON\n },\n hooks: {\n before: async () => {\n testValidatorFactory();\n }\n }\n});\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/merge-fields:test');\n\nasync function testValidatorFactory() {\n const validator = await validatorFactory();\n\n assert.equal(typeof validator, 'object');\n assert.equal(typeof validator.description, 'string');\n assert.equal(typeof validator.validate, 'function');\n}\n\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 const record = new MarcRecord(getFixture('record.json'));\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,cAAc;AAAA,EACjE,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;AACD,MAAM,QAAQ,kBAAkB,4DAA4D;AAE5F,eAAe,uBAAuB;AACpC,QAAM,YAAY,MAAM,iBAAiB;AAEzC,SAAO,MAAM,OAAO,WAAW,QAAQ;AACvC,SAAO,MAAM,OAAO,UAAU,aAAa,QAAQ;AACnD,SAAO,MAAM,OAAO,UAAU,UAAU,UAAU;AACpD;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;AACzC,QAAM,SAAS,IAAI,WAAW,WAAW,aAAa,CAAC;AACvD,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
+ }
@@ -1,71 +1,46 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = _default;
7
- exports.mergeLisapainokset = mergeLisapainokset;
8
- function _default() {
1
+ export default function() {
9
2
  return {
10
- description: 'Merge 500 $a Lisäpainokset fields',
3
+ description: "Merge 500 $a Lis\xE4painokset fields",
11
4
  validate,
12
5
  fix
13
6
  };
14
7
  function fix(record) {
15
- const res = {
16
- message: [],
17
- fix: [],
18
- valid: true
19
- };
8
+ const res = { message: [], fix: [], valid: true };
20
9
  mergeLisapainokset(record);
21
10
  return res;
22
11
  }
23
12
  function validate(record) {
24
13
  const relevantFields = getRelevantFields(record);
25
14
  if (relevantFields.length < 2) {
26
- return {
27
- message: [],
28
- 'valid': true
29
- }; // No action required
15
+ return { message: [], "valid": true };
30
16
  }
31
17
  const printData = extractAllPrintData(relevantFields);
32
18
  if (printData.length === 0) {
33
- return {
34
- message: ['There are issues, but the fixer can not fix them!'],
35
- 'valid': false
36
- }; // No action required
19
+ return { message: ["There are issues, but the fixer can not fix them!"], "valid": false };
37
20
  }
38
- return {
39
- message: [`Fixer can merge ${relevantFields.length} 500 $a Lisäpainokset fields into one`],
40
- 'valid': false
41
- };
21
+ return { message: [`Fixer can merge ${relevantFields.length} 500 $a Lis\xE4painokset fields into one`], "valid": false };
42
22
  }
43
23
  }
44
24
  function getRelevantFields(record) {
45
- return record.fields.filter(field => validLisapainosField(field));
25
+ return record.fields.filter((field) => validLisapainosField(field));
46
26
  }
47
27
  function validLisapainosField(field) {
48
- // We are only interested in field 500 with a lone $a subfield.
49
- // Especially $9 FENNI<KEEP> should not be merged!
50
- if (field.tag !== '500' || field.subfields.length !== 1 || field.subfields[0].code !== 'a') {
28
+ if (field.tag !== "500" || field.subfields.length !== 1 || field.subfields[0].code !== "a") {
51
29
  return false;
52
30
  }
53
31
  return field.subfields[0].value.match(/^(?:Lisäpainokset|Lisäpainos): (?:[1-9][0-9]*\. (?:p\.|painos|uppl\.) [0-9]+\.)(?: - [1-9][0-9]*\. (?:p\.|painos|uppl\.) \[?[0-9]+\]?\.)*$/u);
54
32
  }
55
33
  function fieldToPrintsString(field) {
56
- // Could this just be something on the lines of s/^\S+ // ?
57
- return field.subfields[0].value.replace(/^(?:Lisäpainokset|Lisäpainos): /u, '').replace(/\.$/u, '');
34
+ return field.subfields[0].value.replace(/^(?:Lisäpainokset|Lisäpainos): /u, "").replace(/\.$/u, "");
58
35
  }
59
- const printPreference = ['painos', 'p.', 'upplaga', 'uppl.'];
36
+ const printPreference = ["painos", "p.", "upplaga", "uppl."];
60
37
  function getPrintPreference(value) {
61
- return printPreference.findIndex(pp => pp === value);
38
+ return printPreference.findIndex((pp) => pp === value);
62
39
  }
63
40
  function mergePrintData(value1, value2) {
64
- const [index1, print1, year1] = value1.split(' ');
65
- const [index2, print2, year2] = value2.split(' ');
66
- const betterIndex = index1 ? index1 : index2; // just to cheat eslint...
67
-
68
- // merge print1 and print2
41
+ const [index1, print1, year1] = value1.split(" ");
42
+ const [index2, print2, year2] = value2.split(" ");
43
+ const betterIndex = index1 ? index1 : index2;
69
44
  const betterPrint = getBetterPrint(print1, print2);
70
45
  if (!betterPrint) {
71
46
  return null;
@@ -84,12 +59,12 @@ function mergePrintData(value1, value2) {
84
59
  }
85
60
  return null;
86
61
  }
87
- function getBetterPrint(print1, print2) {
88
- if (print1 === print2) {
89
- return print1;
62
+ function getBetterPrint(print12, print22) {
63
+ if (print12 === print22) {
64
+ return print12;
90
65
  }
91
- const i1 = getPrintPreference(print1);
92
- const i2 = getPrintPreference(print2);
66
+ const i1 = getPrintPreference(print12);
67
+ const i2 = getPrintPreference(print22);
93
68
  if (i1 === -1 || i2 === -1) {
94
69
  return null;
95
70
  }
@@ -100,23 +75,20 @@ function mergePrintData(value1, value2) {
100
75
  }
101
76
  }
102
77
  function extractAllPrintData(relevantFields) {
103
- /* eslint-disable */
104
- // Gather data about 500 $a Lisäpainokset.*
105
78
  let allPrintData = [];
106
79
  let i;
107
80
  let j;
108
81
  for (i = 0; i < relevantFields.length; i++) {
109
82
  const value = fieldToPrintsString(relevantFields[i]);
110
- const fieldsPrintData = value.split('. - ');
83
+ const fieldsPrintData = value.split(". - ");
111
84
  for (j = 0; j < fieldsPrintData.length; j++) {
112
85
  let currPrintData = fieldsPrintData[j];
113
- // Example value: "2. p. 2020"
114
- const [printIndex] = currPrintData.split('.');
115
- if (allPrintData[printIndex] !== undefined) {
86
+ const [printIndex] = currPrintData.split(".");
87
+ if (allPrintData[printIndex] !== void 0) {
116
88
  if (allPrintData[printIndex] !== currPrintData) {
117
89
  const mergedPrintData = mergePrintData(allPrintData[printIndex], currPrintData);
118
90
  if (!mergedPrintData) {
119
- return []; // reason for for-loops: exit function from within nested loops
91
+ return [];
120
92
  }
121
93
  currPrintData = mergedPrintData;
122
94
  }
@@ -125,9 +97,9 @@ function extractAllPrintData(relevantFields) {
125
97
  }
126
98
  }
127
99
  ;
128
- return allPrintData.filter(p => p !== undefined);
100
+ return allPrintData.filter((p) => p !== void 0);
129
101
  }
130
- function mergeLisapainokset(record) {
102
+ export function mergeLisapainokset(record) {
131
103
  const relevantFields = getRelevantFields(record);
132
104
  if (relevantFields.length < 2) {
133
105
  return;
@@ -136,9 +108,8 @@ function mergeLisapainokset(record) {
136
108
  if (collapsedArray.length === 0) {
137
109
  return;
138
110
  }
139
- const content = "Lisäpainokset: " + collapsedArray.join('. - ') + ".";
140
- relevantFields[0].subfields[0].value = content; // Keep the place
141
-
111
+ const content = "Lis\xE4painokset: " + collapsedArray.join(". - ") + ".";
112
+ relevantFields[0].subfields[0].value = content;
142
113
  relevantFields.forEach((field, index) => {
143
114
  if (index > 0) {
144
115
  record.removeField(field);
@@ -146,4 +117,4 @@ function mergeLisapainokset(record) {
146
117
  }
147
118
  });
148
119
  }
149
- //# sourceMappingURL=mergeField500Lisapainokset.js.map
120
+ //# sourceMappingURL=mergeField500Lisapainokset.js.map
@@ -1 +1,7 @@
1
- {"version":3,"file":"mergeField500Lisapainokset.js","names":["_default","description","validate","fix","record","res","message","valid","mergeLisapainokset","relevantFields","getRelevantFields","length","printData","extractAllPrintData","fields","filter","field","validLisapainosField","tag","subfields","code","value","match","fieldToPrintsString","replace","printPreference","getPrintPreference","findIndex","pp","mergePrintData","value1","value2","index1","print1","year1","split","index2","print2","year2","betterIndex","betterPrint","getBetterPrint","betterYear","getBetterYear","y1","y2","i1","i2","allPrintData","i","j","fieldsPrintData","currPrintData","printIndex","undefined","mergedPrintData","p","collapsedArray","content","join","forEach","index","removeField"],"sources":["../src/mergeField500Lisapainokset.js"],"sourcesContent":["export default function () {\n\n return {\n description: 'Merge 500 $a Lisäpainokset fields',\n validate, fix\n };\n\n function fix(record) {\n const res = {message: [], fix: [], valid: true};\n mergeLisapainokset(record);\n return res;\n }\n\n function validate(record) {\n const relevantFields = getRelevantFields(record);\n if (relevantFields.length < 2) {\n return {message: [], 'valid': true}; // No action required\n }\n\n const printData = extractAllPrintData(relevantFields);\n if (printData.length === 0) {\n return {message: ['There are issues, but the fixer can not fix them!'], 'valid': false}; // No action required\n }\n\n return {message: [`Fixer can merge ${relevantFields.length} 500 $a Lisäpainokset fields into one`], 'valid': false};\n }\n}\n\n\nfunction getRelevantFields(record) {\n return record.fields.filter(field => validLisapainosField(field));\n}\n\nfunction validLisapainosField(field) {\n // We are only interested in field 500 with a lone $a subfield.\n // Especially $9 FENNI<KEEP> should not be merged!\n if (field.tag !== '500' || field.subfields.length !== 1 || field.subfields[0].code !== 'a') {\n return false;\n }\n return field.subfields[0].value.match(/^(?:Lisäpainokset|Lisäpainos): (?:[1-9][0-9]*\\. (?:p\\.|painos|uppl\\.) [0-9]+\\.)(?: - [1-9][0-9]*\\. (?:p\\.|painos|uppl\\.) \\[?[0-9]+\\]?\\.)*$/u);\n}\n\nfunction fieldToPrintsString(field) {\n // Could this just be something on the lines of s/^\\S+ // ?\n return field.subfields[0].value.replace(/^(?:Lisäpainokset|Lisäpainos): /u, '').replace(/\\.$/u, '');\n}\n\nconst printPreference = ['painos', 'p.', 'upplaga', 'uppl.'];\nfunction getPrintPreference(value) {\n return printPreference.findIndex(pp => pp === value);\n}\n\nfunction mergePrintData(value1, value2) {\n const [index1, print1, year1] = value1.split(' ');\n const [index2, print2, year2] = value2.split(' ');\n\n const betterIndex = index1 ? index1 : index2; // just to cheat eslint...\n\n // merge print1 and print2\n const betterPrint = getBetterPrint(print1, print2);\n if (!betterPrint) {\n return null;\n }\n\n const betterYear = getBetterYear(year1, year2);\n if (!betterYear) {\n return null;\n }\n\n return `${betterIndex} ${betterPrint} ${betterYear}`;\n\n function getBetterYear(y1, y2) {\n if (y1 === y2 || y2 === `[${y1}]`) {\n return y1;\n }\n if (y1 === `[${y2}]`) {\n return y2;\n }\n return null;\n }\n\n function getBetterPrint(print1, print2) {\n if (print1 === print2) {\n return print1;\n }\n\n const i1 = getPrintPreference(print1);\n const i2 = getPrintPreference(print2);\n if (i1 === -1 || i2 === -1) {\n return null;\n }\n if (i1 <= i2) {\n return printPreference[i1];\n }\n return printPreference[i2];\n }\n\n}\n\n\nfunction extractAllPrintData(relevantFields) {\n /* eslint-disable */\n // Gather data about 500 $a Lisäpainokset.*\n let allPrintData = [];\n let i;\n let j;\n for (i=0; i < relevantFields.length; i++) {\n const value = fieldToPrintsString(relevantFields[i]);\n const fieldsPrintData = value.split('. - ');\n for (j=0; j < fieldsPrintData.length; j++) {\n let currPrintData = fieldsPrintData[j];\n // Example value: \"2. p. 2020\"\n const [ printIndex ] = currPrintData.split('.');\n if (allPrintData[printIndex] !== undefined) {\n if (allPrintData[printIndex] !== currPrintData ) {\n const mergedPrintData = mergePrintData(allPrintData[printIndex], currPrintData);\n if (!mergedPrintData) {\n return []; // reason for for-loops: exit function from within nested loops\n }\n currPrintData = mergedPrintData;\n }\n }\n allPrintData[printIndex] = currPrintData;\n }\n };\n return allPrintData.filter(p => p !== undefined);\n}\n\n\nexport function mergeLisapainokset(record) {\n const relevantFields = getRelevantFields(record);\n if (relevantFields.length < 2) {\n return;\n }\n\n const collapsedArray = extractAllPrintData(relevantFields);\n if (collapsedArray.length === 0) {\n return;\n }\n\n const content = \"Lisäpainokset: \" + collapsedArray.join('. - ') + \".\";\n\n relevantFields[0].subfields[0].value = content; // Keep the place\n\n relevantFields.forEach((field, index) => {\n if (index > 0) {\n record.removeField(field);\n return;\n }\n });\n}\n"],"mappings":";;;;;;;AAAe,SAAAA,SAAA,EAAY;EAEzB,OAAO;IACLC,WAAW,EAAE,mCAAmC;IAChDC,QAAQ;IAAEC;EACZ,CAAC;EAED,SAASA,GAAGA,CAACC,MAAM,EAAE;IACnB,MAAMC,GAAG,GAAG;MAACC,OAAO,EAAE,EAAE;MAAEH,GAAG,EAAE,EAAE;MAAEI,KAAK,EAAE;IAAI,CAAC;IAC/CC,kBAAkB,CAACJ,MAAM,CAAC;IAC1B,OAAOC,GAAG;EACZ;EAEA,SAASH,QAAQA,CAACE,MAAM,EAAE;IACxB,MAAMK,cAAc,GAAGC,iBAAiB,CAACN,MAAM,CAAC;IAChD,IAAIK,cAAc,CAACE,MAAM,GAAG,CAAC,EAAE;MAC7B,OAAO;QAACL,OAAO,EAAE,EAAE;QAAE,OAAO,EAAE;MAAI,CAAC,CAAC,CAAC;IACvC;IAEA,MAAMM,SAAS,GAAGC,mBAAmB,CAACJ,cAAc,CAAC;IACrD,IAAIG,SAAS,CAACD,MAAM,KAAK,CAAC,EAAE;MAC1B,OAAO;QAACL,OAAO,EAAE,CAAC,mDAAmD,CAAC;QAAE,OAAO,EAAE;MAAK,CAAC,CAAC,CAAC;IAC3F;IAEA,OAAO;MAACA,OAAO,EAAE,CAAC,mBAAmBG,cAAc,CAACE,MAAM,uCAAuC,CAAC;MAAE,OAAO,EAAE;IAAK,CAAC;EACrH;AACF;AAGA,SAASD,iBAAiBA,CAACN,MAAM,EAAE;EACjC,OAAOA,MAAM,CAACU,MAAM,CAACC,MAAM,CAACC,KAAK,IAAIC,oBAAoB,CAACD,KAAK,CAAC,CAAC;AACnE;AAEA,SAASC,oBAAoBA,CAACD,KAAK,EAAE;EACnC;EACA;EACA,IAAIA,KAAK,CAACE,GAAG,KAAK,KAAK,IAAIF,KAAK,CAACG,SAAS,CAACR,MAAM,KAAK,CAAC,IAAIK,KAAK,CAACG,SAAS,CAAC,CAAC,CAAC,CAACC,IAAI,KAAK,GAAG,EAAE;IAC1F,OAAO,KAAK;EACd;EACA,OAAOJ,KAAK,CAACG,SAAS,CAAC,CAAC,CAAC,CAACE,KAAK,CAACC,KAAK,CAAC,6IAA6I,CAAC;AACtL;AAEA,SAASC,mBAAmBA,CAACP,KAAK,EAAE;EAClC;EACA,OAAOA,KAAK,CAACG,SAAS,CAAC,CAAC,CAAC,CAACE,KAAK,CAACG,OAAO,CAAC,kCAAkC,EAAE,EAAE,CAAC,CAACA,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;AACrG;AAEA,MAAMC,eAAe,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC;AAC5D,SAASC,kBAAkBA,CAACL,KAAK,EAAE;EACjC,OAAOI,eAAe,CAACE,SAAS,CAACC,EAAE,IAAIA,EAAE,KAAKP,KAAK,CAAC;AACtD;AAEA,SAASQ,cAAcA,CAACC,MAAM,EAAEC,MAAM,EAAE;EACtC,MAAM,CAACC,MAAM,EAAEC,MAAM,EAAEC,KAAK,CAAC,GAAGJ,MAAM,CAACK,KAAK,CAAC,GAAG,CAAC;EACjD,MAAM,CAACC,MAAM,EAAEC,MAAM,EAAEC,KAAK,CAAC,GAAGP,MAAM,CAACI,KAAK,CAAC,GAAG,CAAC;EAEjD,MAAMI,WAAW,GAAGP,MAAM,GAAGA,MAAM,GAAGI,MAAM,CAAC,CAAC;;EAE9C;EACA,MAAMI,WAAW,GAAGC,cAAc,CAACR,MAAM,EAAEI,MAAM,CAAC;EAClD,IAAI,CAACG,WAAW,EAAE;IAChB,OAAO,IAAI;EACb;EAEA,MAAME,UAAU,GAAGC,aAAa,CAACT,KAAK,EAAEI,KAAK,CAAC;EAC9C,IAAI,CAACI,UAAU,EAAE;IACf,OAAO,IAAI;EACb;EAEA,OAAO,GAAGH,WAAW,IAAIC,WAAW,IAAIE,UAAU,EAAE;EAEpD,SAASC,aAAaA,CAACC,EAAE,EAAEC,EAAE,EAAE;IAC7B,IAAID,EAAE,KAAKC,EAAE,IAAIA,EAAE,KAAK,IAAID,EAAE,GAAG,EAAE;MACjC,OAAOA,EAAE;IACX;IACA,IAAIA,EAAE,KAAK,IAAIC,EAAE,GAAG,EAAE;MACpB,OAAOA,EAAE;IACX;IACA,OAAO,IAAI;EACb;EAEA,SAASJ,cAAcA,CAACR,MAAM,EAAEI,MAAM,EAAE;IACtC,IAAIJ,MAAM,KAAKI,MAAM,EAAE;MACrB,OAAOJ,MAAM;IACf;IAEA,MAAMa,EAAE,GAAGpB,kBAAkB,CAACO,MAAM,CAAC;IACrC,MAAMc,EAAE,GAAGrB,kBAAkB,CAACW,MAAM,CAAC;IACrC,IAAIS,EAAE,KAAK,CAAC,CAAC,IAAIC,EAAE,KAAK,CAAC,CAAC,EAAE;MAC1B,OAAO,IAAI;IACb;IACA,IAAID,EAAE,IAAIC,EAAE,EAAE;MACZ,OAAOtB,eAAe,CAACqB,EAAE,CAAC;IAC5B;IACA,OAAOrB,eAAe,CAACsB,EAAE,CAAC;EAC5B;AAEF;AAGA,SAASlC,mBAAmBA,CAACJ,cAAc,EAAE;EAC3C;EACA;EACA,IAAIuC,YAAY,GAAG,EAAE;EACrB,IAAIC,CAAC;EACL,IAAIC,CAAC;EACL,KAAKD,CAAC,GAAC,CAAC,EAAEA,CAAC,GAAGxC,cAAc,CAACE,MAAM,EAAEsC,CAAC,EAAE,EAAE;IACxC,MAAM5B,KAAK,GAAGE,mBAAmB,CAACd,cAAc,CAACwC,CAAC,CAAC,CAAC;IACpD,MAAME,eAAe,GAAG9B,KAAK,CAACc,KAAK,CAAC,MAAM,CAAC;IAC3C,KAAKe,CAAC,GAAC,CAAC,EAAEA,CAAC,GAAGC,eAAe,CAACxC,MAAM,EAAEuC,CAAC,EAAE,EAAE;MACzC,IAAIE,aAAa,GAAGD,eAAe,CAACD,CAAC,CAAC;MACtC;MACA,MAAM,CAAEG,UAAU,CAAE,GAAGD,aAAa,CAACjB,KAAK,CAAC,GAAG,CAAC;MAC/C,IAAIa,YAAY,CAACK,UAAU,CAAC,KAAKC,SAAS,EAAE;QAC1C,IAAIN,YAAY,CAACK,UAAU,CAAC,KAAKD,aAAa,EAAG;UAC/C,MAAMG,eAAe,GAAG1B,cAAc,CAACmB,YAAY,CAACK,UAAU,CAAC,EAAED,aAAa,CAAC;UAC/E,IAAI,CAACG,eAAe,EAAE;YACpB,OAAO,EAAE,CAAC,CAAC;UACb;UACAH,aAAa,GAAGG,eAAe;QACjC;MACF;MACAP,YAAY,CAACK,UAAU,CAAC,GAAGD,aAAa;IAC1C;EACF;EAAC;EACD,OAAOJ,YAAY,CAACjC,MAAM,CAACyC,CAAC,IAAIA,CAAC,KAAKF,SAAS,CAAC;AAClD;AAGO,SAAS9C,kBAAkBA,CAACJ,MAAM,EAAE;EACzC,MAAMK,cAAc,GAAGC,iBAAiB,CAACN,MAAM,CAAC;EAChD,IAAIK,cAAc,CAACE,MAAM,GAAG,CAAC,EAAE;IAC7B;EACF;EAEA,MAAM8C,cAAc,GAAG5C,mBAAmB,CAACJ,cAAc,CAAC;EAC1D,IAAIgD,cAAc,CAAC9C,MAAM,KAAK,CAAC,EAAE;IAC/B;EACF;EAEA,MAAM+C,OAAO,GAAG,iBAAiB,GAAGD,cAAc,CAACE,IAAI,CAAC,MAAM,CAAC,GAAG,GAAG;EAErElD,cAAc,CAAC,CAAC,CAAC,CAACU,SAAS,CAAC,CAAC,CAAC,CAACE,KAAK,GAAGqC,OAAO,CAAC,CAAC;;EAEhDjD,cAAc,CAACmD,OAAO,CAAC,CAAC5C,KAAK,EAAE6C,KAAK,KAAK;IACvC,IAAIA,KAAK,GAAG,CAAC,EAAE;MACbzD,MAAM,CAAC0D,WAAW,CAAC9C,KAAK,CAAC;MACzB;IACF;EACF,CAAC,CAAC;AACJ","ignoreList":[]}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/mergeField500Lisapainokset.js"],
4
+ "sourcesContent": ["export default function () {\n\n return {\n description: 'Merge 500 $a Lis\u00E4painokset fields',\n validate, fix\n };\n\n function fix(record) {\n const res = {message: [], fix: [], valid: true};\n mergeLisapainokset(record);\n return res;\n }\n\n function validate(record) {\n const relevantFields = getRelevantFields(record);\n if (relevantFields.length < 2) {\n return {message: [], 'valid': true}; // No action required\n }\n\n const printData = extractAllPrintData(relevantFields);\n if (printData.length === 0) {\n return {message: ['There are issues, but the fixer can not fix them!'], 'valid': false}; // No action required\n }\n\n return {message: [`Fixer can merge ${relevantFields.length} 500 $a Lis\u00E4painokset fields into one`], 'valid': false};\n }\n}\n\n\nfunction getRelevantFields(record) {\n return record.fields.filter(field => validLisapainosField(field));\n}\n\nfunction validLisapainosField(field) {\n // We are only interested in field 500 with a lone $a subfield.\n // Especially $9 FENNI<KEEP> should not be merged!\n if (field.tag !== '500' || field.subfields.length !== 1 || field.subfields[0].code !== 'a') {\n return false;\n }\n return field.subfields[0].value.match(/^(?:Lis\u00E4painokset|Lis\u00E4painos): (?:[1-9][0-9]*\\. (?:p\\.|painos|uppl\\.) [0-9]+\\.)(?: - [1-9][0-9]*\\. (?:p\\.|painos|uppl\\.) \\[?[0-9]+\\]?\\.)*$/u);\n}\n\nfunction fieldToPrintsString(field) {\n // Could this just be something on the lines of s/^\\S+ // ?\n return field.subfields[0].value.replace(/^(?:Lis\u00E4painokset|Lis\u00E4painos): /u, '').replace(/\\.$/u, '');\n}\n\nconst printPreference = ['painos', 'p.', 'upplaga', 'uppl.'];\nfunction getPrintPreference(value) {\n return printPreference.findIndex(pp => pp === value);\n}\n\nfunction mergePrintData(value1, value2) {\n const [index1, print1, year1] = value1.split(' ');\n const [index2, print2, year2] = value2.split(' ');\n\n const betterIndex = index1 ? index1 : index2; // just to cheat eslint...\n\n // merge print1 and print2\n const betterPrint = getBetterPrint(print1, print2);\n if (!betterPrint) {\n return null;\n }\n\n const betterYear = getBetterYear(year1, year2);\n if (!betterYear) {\n return null;\n }\n\n return `${betterIndex} ${betterPrint} ${betterYear}`;\n\n function getBetterYear(y1, y2) {\n if (y1 === y2 || y2 === `[${y1}]`) {\n return y1;\n }\n if (y1 === `[${y2}]`) {\n return y2;\n }\n return null;\n }\n\n function getBetterPrint(print1, print2) {\n if (print1 === print2) {\n return print1;\n }\n\n const i1 = getPrintPreference(print1);\n const i2 = getPrintPreference(print2);\n if (i1 === -1 || i2 === -1) {\n return null;\n }\n if (i1 <= i2) {\n return printPreference[i1];\n }\n return printPreference[i2];\n }\n\n}\n\n\nfunction extractAllPrintData(relevantFields) {\n /* eslint-disable */\n // Gather data about 500 $a Lis\u00E4painokset.*\n let allPrintData = [];\n let i;\n let j;\n for (i=0; i < relevantFields.length; i++) {\n const value = fieldToPrintsString(relevantFields[i]);\n const fieldsPrintData = value.split('. - ');\n for (j=0; j < fieldsPrintData.length; j++) {\n let currPrintData = fieldsPrintData[j];\n // Example value: \"2. p. 2020\"\n const [ printIndex ] = currPrintData.split('.');\n if (allPrintData[printIndex] !== undefined) {\n if (allPrintData[printIndex] !== currPrintData ) {\n const mergedPrintData = mergePrintData(allPrintData[printIndex], currPrintData);\n if (!mergedPrintData) {\n return []; // reason for for-loops: exit function from within nested loops\n }\n currPrintData = mergedPrintData;\n }\n }\n allPrintData[printIndex] = currPrintData;\n }\n };\n return allPrintData.filter(p => p !== undefined);\n}\n\n\nexport function mergeLisapainokset(record) {\n const relevantFields = getRelevantFields(record);\n if (relevantFields.length < 2) {\n return;\n }\n\n const collapsedArray = extractAllPrintData(relevantFields);\n if (collapsedArray.length === 0) {\n return;\n }\n\n const content = \"Lis\u00E4painokset: \" + collapsedArray.join('. - ') + \".\";\n\n relevantFields[0].subfields[0].value = content; // Keep the place\n\n relevantFields.forEach((field, index) => {\n if (index > 0) {\n record.removeField(field);\n return;\n }\n });\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["print1", "print2"]
7
+ }
@@ -0,0 +1,44 @@
1
+ import assert from "node:assert";
2
+ import { MarcRecord } from "@natlibfi/marc-record";
3
+ import validatorFactory from "./mergeField500Lisapainokset.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", "lisapainokset"],
10
+ useMetadataFile: true,
11
+ recurse: true,
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/mergeField500Lisapainokset:test");
22
+ async function testValidatorFactory() {
23
+ const validator = await validatorFactory();
24
+ assert.equal(typeof validator, "object");
25
+ assert.equal(typeof validator.description, "string");
26
+ assert.equal(typeof validator.validate, "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 record = new MarcRecord(getFixture("record.json"));
35
+ const expectedResult = getFixture("expectedResult.json");
36
+ if (!fix) {
37
+ const result = await validator.validate(record);
38
+ assert.deepEqual(result, expectedResult);
39
+ return;
40
+ }
41
+ await validator.fix(record);
42
+ assert.deepEqual(record, expectedResult);
43
+ }
44
+ //# sourceMappingURL=mergeField500Lisapainokset.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/mergeField500Lisapainokset.test.js"],
4
+ "sourcesContent": ["import assert from 'node:assert';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './mergeField500Lisapainokset.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', 'lisapainokset'],\n useMetadataFile: true,\n recurse: true,\n fixura: {\n reader: READERS.JSON\n },\n hooks: {\n before: async () => {\n testValidatorFactory();\n }\n }\n});\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/mergeField500Lisapainokset:test');\n\nasync function testValidatorFactory() {\n const validator = await validatorFactory();\n\n assert.equal(typeof validator, 'object');\n assert.equal(typeof validator.description, 'string');\n assert.equal(typeof validator.validate, 'function');\n}\n\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 const record = new MarcRecord(getFixture('record.json'));\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,eAAe;AAAA,EAClE,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;AACD,MAAM,QAAQ,kBAAkB,0EAA0E;AAE1G,eAAe,uBAAuB;AACpC,QAAM,YAAY,MAAM,iBAAiB;AAEzC,SAAO,MAAM,OAAO,WAAW,QAAQ;AACvC,SAAO,MAAM,OAAO,UAAU,aAAa,QAAQ;AACnD,SAAO,MAAM,OAAO,UAAU,UAAU,UAAU;AACpD;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;AACzC,QAAM,SAAS,IAAI,WAAW,WAAW,aAAa,CAAC;AACvD,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
+ }
@@ -1,130 +1,94 @@
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 _punctuation = require("./punctuation2");
9
- var _utils = require("./utils");
10
- var _sortSubfields = require("./sortSubfields");
11
- var _sortRelatorTerms = require("./sortRelatorTerms");
12
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
13
- // Merge author/agent fields
14
- //
15
- // Rationale: Same author can appear in one 1XX and multiple 7XX fields having only different $e subfields.
16
- // These fields can be merged (and $e-subfields can then be sorted)...
17
- //
18
- // Author(s): Nicholas Volk
19
-
20
- //import createDebugLogger from 'debug';
21
- /*
22
- //const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:mergeRelatorTermFields');
23
- //const debugData = debug.extend('data');
24
- */
25
-
26
- function _default() {
1
+ import clone from "clone";
2
+ import { fieldFixPunctuation, fieldStripPunctuation } from "./punctuation2.js";
3
+ import { fieldToString, nvdebug } from "./utils.js";
4
+ import { sortAdjacentSubfields } from "./sortSubfields.js";
5
+ import { sortAdjacentRelatorTerms, tagToRelatorTermSubfieldCode } from "./sortRelatorTerms.js";
6
+ export default function() {
27
7
  return {
28
- description: 'Merge author fields that only differ in $e relator terms',
8
+ description: "Merge author fields that only differ in $e relator terms",
29
9
  validate,
30
10
  fix
31
11
  };
32
12
  function fix(record) {
33
13
  const msg = mergeRelatorTermFields(record, true);
34
- const res = {
35
- message: msg,
36
- fix: msg,
37
- valid: true
38
- };
14
+ const res = { message: msg, fix: msg, valid: true };
39
15
  return res;
40
16
  }
41
17
  function validate(record) {
42
18
  const msg = mergeRelatorTermFields(record, false);
43
- const res = {
44
- message: msg
45
- };
19
+ const res = { message: msg };
46
20
  res.valid = !(res.message.length >= 1);
47
21
  return res;
48
22
  }
49
23
  }
50
24
  function createNormalizedClone(field) {
51
- const clonedField = (0, _clone.default)(field);
52
- // Normalize
53
- (0, _punctuation.fieldStripPunctuation)(clonedField);
25
+ const clonedField = clone(field);
26
+ fieldStripPunctuation(clonedField);
54
27
  return clonedField;
55
28
  }
56
29
  function createNormalizedCloneWithoutRelatorTerms(field) {
57
30
  const clonedField = createNormalizedClone(field);
58
- // Remove relator terms $e subfi:
59
- clonedField.subfields = clonedField.subfields.filter(sf => sf.code !== 'e');
31
+ clonedField.subfields = clonedField.subfields.filter((sf) => sf.code !== "e");
60
32
  return clonedField;
61
33
  }
62
34
  function getRelatorTermStrings(relatorTermSubfieldCode, field) {
63
- return field.subfields.filter(sf => sf.code === relatorTermSubfieldCode).map(sf => sf.value);
35
+ return field.subfields.filter((sf) => sf.code === relatorTermSubfieldCode).map((sf) => sf.value);
64
36
  }
65
37
  function extractAddableRelatorTerms(fromField, toField) {
66
- const relatorTermSubfieldCode = (0, _sortRelatorTerms.tagToRelatorTermSubfieldCode)(fromField.tag);
38
+ const relatorTermSubfieldCode = tagToRelatorTermSubfieldCode(fromField.tag);
67
39
  const normalizedFromFieldRelatorTerms = getRelatorTermStrings(relatorTermSubfieldCode, fromField);
68
40
  if (normalizedFromFieldRelatorTerms.length === 0) {
69
41
  return [];
70
42
  }
71
- // Remove values that already exist:
72
43
  const normalizedToFieldRelatorTerms = getRelatorTermStrings(relatorTermSubfieldCode, toField);
73
- return normalizedFromFieldRelatorTerms.filter(str => !normalizedToFieldRelatorTerms.includes(str));
44
+ return normalizedFromFieldRelatorTerms.filter((str) => !normalizedToFieldRelatorTerms.includes(str));
74
45
  }
75
46
  function copyRelatorSubfields(fromField, toField) {
76
- const relatorTermSubfieldCode = (0, _sortRelatorTerms.tagToRelatorTermSubfieldCode)(fromField.tag);
47
+ const relatorTermSubfieldCode = tagToRelatorTermSubfieldCode(fromField.tag);
77
48
  const newRelatorTerms = extractAddableRelatorTerms(fromField, toField);
78
- newRelatorTerms.forEach(term => toField.subfields.push({
79
- code: relatorTermSubfieldCode,
80
- value: term
81
- })); // eslint-disable-line array-callback-return
49
+ newRelatorTerms.forEach((term) => toField.subfields.push({ code: relatorTermSubfieldCode, value: term }));
82
50
  }
83
51
  function mergeRelatorTermFields(record, fix = false) {
84
- /* eslint-disable */
85
- // NV: 111/711, 751 and 752 where so rare that I did not add them here. Can't remember why I skipped 6XX and 8XX...
86
- let fields = record.get('(?:[17][01]0|720)');
52
+ let fields = record.get("(?:[17][01]0|720)");
87
53
  let result = [];
88
- const comparisonFieldsAsString = fields.map(f => (0, _utils.fieldToString)(createNormalizedCloneWithoutRelatorTerms(f)));
89
- (0, _utils.nvdebug)(`mergeRelatorTermFields(): ${fields.length} cand field(s) found`);
54
+ const comparisonFieldsAsString = fields.map((f) => fieldToString(createNormalizedCloneWithoutRelatorTerms(f)));
55
+ nvdebug(`mergeRelatorTermFields(): ${fields.length} cand field(s) found`);
90
56
  for (let i = 0; i < fields.length - 1; i++) {
91
57
  let currField = fields[i];
92
58
  if (currField.deleted) {
93
59
  continue;
94
60
  }
95
- (0, _utils.nvdebug)(`RT: Trying to pair ${comparisonFieldsAsString[i]}/${i}`);
61
+ nvdebug(`RT: Trying to pair ${comparisonFieldsAsString[i]}/${i}`);
96
62
  for (let j = i + 1; j < fields.length; j++) {
97
- (0, _utils.nvdebug)(` Compare with ${comparisonFieldsAsString[j]}/${j}`);
63
+ nvdebug(` Compare with ${comparisonFieldsAsString[j]}/${j}`);
98
64
  let mergableField = fields[j];
99
- // Skip 1/7 from 1XX/7XX for similarity check:
100
65
  if (comparisonFieldsAsString[i].substring(1) !== comparisonFieldsAsString[j].substring(1)) {
101
- (0, _utils.nvdebug)(" NOT PAIR");
66
+ nvdebug(" NOT PAIR");
102
67
  continue;
103
68
  }
104
69
  if (mergableField.deleted) {
105
- (0, _utils.nvdebug)(" DELETED");
70
+ nvdebug(" DELETED");
106
71
  continue;
107
72
  }
108
- const str = `MERGE RELATOR TERM FIELD: ${(0, _utils.fieldToString)(mergableField)}`;
109
- (0, _utils.nvdebug)(str);
73
+ const str = `MERGE RELATOR TERM FIELD: ${fieldToString(mergableField)}`;
74
+ nvdebug(str);
110
75
  if (!result.includes(str)) {
111
76
  result.push(str);
112
77
  }
113
78
  if (fix) {
114
79
  mergableField.deleted = 1;
115
80
  copyRelatorSubfields(mergableField, currField);
116
- (0, _punctuation.fieldFixPunctuation)(currField);
117
- (0, _sortSubfields.sortAdjacentSubfields)(currField); // Put the added $e subfield to proper places.
118
- (0, _sortRelatorTerms.sortAdjacentRelatorTerms)(currField); // Sort $e subfields with each other
119
- (0, _punctuation.fieldFixPunctuation)(currField);
81
+ fieldFixPunctuation(currField);
82
+ sortAdjacentSubfields(currField);
83
+ sortAdjacentRelatorTerms(currField);
84
+ fieldFixPunctuation(currField);
120
85
  }
121
86
  }
122
87
  }
123
88
  if (!fix) {
124
- fields.forEach(f => delete f.deleted);
89
+ fields.forEach((f) => delete f.deleted);
125
90
  }
126
- record.fields = record.fields.filter(f => !f.deleted);
127
- /* eslint-enable */
91
+ record.fields = record.fields.filter((f) => !f.deleted);
128
92
  return result;
129
93
  }
130
- //# sourceMappingURL=mergeRelatorTermFields.js.map
94
+ //# sourceMappingURL=mergeRelatorTermFields.js.map
@@ -1 +1,7 @@
1
- {"version":3,"file":"mergeRelatorTermFields.js","names":["_clone","_interopRequireDefault","require","_punctuation","_utils","_sortSubfields","_sortRelatorTerms","e","__esModule","default","_default","description","validate","fix","record","msg","mergeRelatorTermFields","res","message","valid","length","createNormalizedClone","field","clonedField","clone","fieldStripPunctuation","createNormalizedCloneWithoutRelatorTerms","subfields","filter","sf","code","getRelatorTermStrings","relatorTermSubfieldCode","map","value","extractAddableRelatorTerms","fromField","toField","tagToRelatorTermSubfieldCode","tag","normalizedFromFieldRelatorTerms","normalizedToFieldRelatorTerms","str","includes","copyRelatorSubfields","newRelatorTerms","forEach","term","push","fields","get","result","comparisonFieldsAsString","f","fieldToString","nvdebug","i","currField","deleted","j","mergableField","substring","fieldFixPunctuation","sortAdjacentSubfields","sortAdjacentRelatorTerms"],"sources":["../src/mergeRelatorTermFields.js"],"sourcesContent":["// Merge author/agent fields\n//\n// Rationale: Same author can appear in one 1XX and multiple 7XX fields having only different $e subfields.\n// These fields can be merged (and $e-subfields can then be sorted)...\n//\n// Author(s): Nicholas Volk\n\n\nimport clone from 'clone';\nimport {fieldFixPunctuation, fieldStripPunctuation} from './punctuation2';\nimport {fieldToString, nvdebug} from './utils';\nimport {sortAdjacentSubfields} from './sortSubfields';\nimport {sortAdjacentRelatorTerms, tagToRelatorTermSubfieldCode} from './sortRelatorTerms';\n//import createDebugLogger from 'debug';\n/*\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:mergeRelatorTermFields');\n//const debugData = debug.extend('data');\n*/\n\nexport default function () {\n\n return {\n description: 'Merge author fields that only differ in $e relator terms',\n validate, fix\n };\n\n function fix(record) {\n const msg = mergeRelatorTermFields(record, true);\n const res = {message: msg, fix: msg, valid: true};\n return res;\n }\n\n function validate(record) {\n const msg = mergeRelatorTermFields(record, false);\n const res = {message: msg};\n\n res.valid = !(res.message.length >= 1);\n return res;\n }\n}\n\nfunction createNormalizedClone(field) {\n const clonedField = clone(field);\n // Normalize\n fieldStripPunctuation(clonedField);\n return clonedField;\n}\n\nfunction createNormalizedCloneWithoutRelatorTerms(field) {\n const clonedField = createNormalizedClone(field);\n // Remove relator terms $e subfi:\n clonedField.subfields = clonedField.subfields.filter(sf => sf.code !== 'e');\n return clonedField;\n}\n\nfunction getRelatorTermStrings(relatorTermSubfieldCode, field) {\n return field.subfields.filter(sf => sf.code === relatorTermSubfieldCode).map(sf => sf.value);\n\n}\n\nfunction extractAddableRelatorTerms(fromField, toField) {\n const relatorTermSubfieldCode = tagToRelatorTermSubfieldCode(fromField.tag);\n const normalizedFromFieldRelatorTerms = getRelatorTermStrings(relatorTermSubfieldCode, fromField);\n if (normalizedFromFieldRelatorTerms.length === 0) {\n return [];\n }\n // Remove values that already exist:\n const normalizedToFieldRelatorTerms = getRelatorTermStrings(relatorTermSubfieldCode, toField);\n return normalizedFromFieldRelatorTerms.filter(str => !normalizedToFieldRelatorTerms.includes(str));\n}\n\n\nfunction copyRelatorSubfields(fromField, toField) {\n const relatorTermSubfieldCode = tagToRelatorTermSubfieldCode(fromField.tag);\n const newRelatorTerms = extractAddableRelatorTerms(fromField, toField);\n\n newRelatorTerms.forEach(term => toField.subfields.push({code: relatorTermSubfieldCode, value: term})); // eslint-disable-line array-callback-return\n\n}\n\nfunction mergeRelatorTermFields(record, fix = false) {\n /* eslint-disable */\n // NV: 111/711, 751 and 752 where so rare that I did not add them here. Can't remember why I skipped 6XX and 8XX...\n let fields = record.get('(?:[17][01]0|720)'); \n let result = [];\n const comparisonFieldsAsString = fields.map(f => fieldToString(createNormalizedCloneWithoutRelatorTerms(f)));\n\n nvdebug(`mergeRelatorTermFields(): ${fields.length} cand field(s) found`);\n for(let i=0; i < fields.length-1; i++) {\n let currField = fields[i];\n if (currField.deleted) {\n continue;\n }\n nvdebug(`RT: Trying to pair ${comparisonFieldsAsString[i]}/${i}`);\n for (let j=i+1; j < fields.length; j++) {\n nvdebug(` Compare with ${comparisonFieldsAsString[j]}/${j}`);\n let mergableField = fields[j];\n // Skip 1/7 from 1XX/7XX for similarity check:\n if ( comparisonFieldsAsString[i].substring(1) !== comparisonFieldsAsString[j].substring(1)) {\n nvdebug(\" NOT PAIR\");\n continue;\n }\n if (mergableField.deleted) {\n nvdebug(\" DELETED\");\n continue;\n }\n const str = `MERGE RELATOR TERM FIELD: ${fieldToString(mergableField)}`;\n nvdebug(str);\n\n if(!result.includes(str)) {\n result.push(str)\n }\n\n if (fix) {\n mergableField.deleted = 1;\n copyRelatorSubfields(mergableField, currField);\n fieldFixPunctuation(currField);\n sortAdjacentSubfields(currField); // Put the added $e subfield to proper places.\n sortAdjacentRelatorTerms(currField); // Sort $e subfields with each other\n fieldFixPunctuation(currField);\n\n }\n }\n }\n\n if(!fix) {\n fields.forEach(f => delete f.deleted);\n }\n\n record.fields = record.fields.filter(f => !f.deleted);\n /* eslint-enable */\n return result;\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/mergeRelatorTermFields.js"],
4
+ "sourcesContent": ["// Merge author/agent fields\n//\n// Rationale: Same author can appear in one 1XX and multiple 7XX fields having only different $e subfields.\n// These fields can be merged (and $e-subfields can then be sorted)...\n//\n// Author(s): Nicholas Volk\n\n\nimport clone from 'clone';\nimport {fieldFixPunctuation, fieldStripPunctuation} from './punctuation2.js';\nimport {fieldToString, nvdebug} from './utils.js';\nimport {sortAdjacentSubfields} from './sortSubfields.js';\nimport {sortAdjacentRelatorTerms, tagToRelatorTermSubfieldCode} from './sortRelatorTerms.js';\n//import createDebugLogger from 'debug';\n/*\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:mergeRelatorTermFields');\n//const debugData = debug.extend('data');\n*/\n\nexport default function () {\n\n return {\n description: 'Merge author fields that only differ in $e relator terms',\n validate, fix\n };\n\n function fix(record) {\n const msg = mergeRelatorTermFields(record, true);\n const res = {message: msg, fix: msg, valid: true};\n return res;\n }\n\n function validate(record) {\n const msg = mergeRelatorTermFields(record, false);\n const res = {message: msg};\n\n res.valid = !(res.message.length >= 1);\n return res;\n }\n}\n\nfunction createNormalizedClone(field) {\n const clonedField = clone(field);\n // Normalize\n fieldStripPunctuation(clonedField);\n return clonedField;\n}\n\nfunction createNormalizedCloneWithoutRelatorTerms(field) {\n const clonedField = createNormalizedClone(field);\n // Remove relator terms $e subfi:\n clonedField.subfields = clonedField.subfields.filter(sf => sf.code !== 'e');\n return clonedField;\n}\n\nfunction getRelatorTermStrings(relatorTermSubfieldCode, field) {\n return field.subfields.filter(sf => sf.code === relatorTermSubfieldCode).map(sf => sf.value);\n\n}\n\nfunction extractAddableRelatorTerms(fromField, toField) {\n const relatorTermSubfieldCode = tagToRelatorTermSubfieldCode(fromField.tag);\n const normalizedFromFieldRelatorTerms = getRelatorTermStrings(relatorTermSubfieldCode, fromField);\n if (normalizedFromFieldRelatorTerms.length === 0) {\n return [];\n }\n // Remove values that already exist:\n const normalizedToFieldRelatorTerms = getRelatorTermStrings(relatorTermSubfieldCode, toField);\n return normalizedFromFieldRelatorTerms.filter(str => !normalizedToFieldRelatorTerms.includes(str));\n}\n\n\nfunction copyRelatorSubfields(fromField, toField) {\n const relatorTermSubfieldCode = tagToRelatorTermSubfieldCode(fromField.tag);\n const newRelatorTerms = extractAddableRelatorTerms(fromField, toField);\n\n newRelatorTerms.forEach(term => toField.subfields.push({code: relatorTermSubfieldCode, value: term}));\n\n}\n\nfunction mergeRelatorTermFields(record, fix = false) {\n // NV: 111/711, 751 and 752 where so rare that I did not add them here. Can't remember why I skipped 6XX and 8XX...\n let fields = record.get('(?:[17][01]0|720)'); \n let result = [];\n const comparisonFieldsAsString = fields.map(f => fieldToString(createNormalizedCloneWithoutRelatorTerms(f)));\n\n nvdebug(`mergeRelatorTermFields(): ${fields.length} cand field(s) found`);\n for(let i=0; i < fields.length-1; i++) {\n let currField = fields[i];\n if (currField.deleted) {\n continue;\n }\n nvdebug(`RT: Trying to pair ${comparisonFieldsAsString[i]}/${i}`);\n for (let j=i+1; j < fields.length; j++) {\n nvdebug(` Compare with ${comparisonFieldsAsString[j]}/${j}`);\n let mergableField = fields[j];\n // Skip 1/7 from 1XX/7XX for similarity check:\n if ( comparisonFieldsAsString[i].substring(1) !== comparisonFieldsAsString[j].substring(1)) {\n nvdebug(\" NOT PAIR\");\n continue;\n }\n if (mergableField.deleted) {\n nvdebug(\" DELETED\");\n continue;\n }\n const str = `MERGE RELATOR TERM FIELD: ${fieldToString(mergableField)}`;\n nvdebug(str);\n\n if(!result.includes(str)) {\n result.push(str)\n }\n\n if (fix) {\n mergableField.deleted = 1;\n copyRelatorSubfields(mergableField, currField);\n fieldFixPunctuation(currField);\n sortAdjacentSubfields(currField); // Put the added $e subfield to proper places.\n sortAdjacentRelatorTerms(currField); // Sort $e subfields with each other\n fieldFixPunctuation(currField);\n\n }\n }\n }\n\n if(!fix) {\n fields.forEach(f => delete f.deleted);\n }\n\n record.fields = record.fields.filter(f => !f.deleted);\n return result;\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,44 @@
1
+ import assert from "node:assert";
2
+ import { MarcRecord } from "@natlibfi/marc-record";
3
+ import validatorFactory from "./mergeRelatorTermFields.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", "mergeRelatorTermFields"],
10
+ useMetadataFile: true,
11
+ recurse: true,
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/mergeRelatorTermFields:test");
22
+ async function testValidatorFactory() {
23
+ const validator = await validatorFactory();
24
+ assert.equal(typeof validator, "object");
25
+ assert.equal(typeof validator.description, "string");
26
+ assert.equal(typeof validator.validate, "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 record = new MarcRecord(getFixture("record.json"));
35
+ const expectedResult = getFixture("expectedResult.json");
36
+ if (!fix) {
37
+ const result = await validator.validate(record);
38
+ assert.deepEqual(result, expectedResult);
39
+ return;
40
+ }
41
+ await validator.fix(record);
42
+ assert.deepEqual(record, expectedResult);
43
+ }
44
+ //# sourceMappingURL=mergeRelatorTermFields.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/mergeRelatorTermFields.test.js"],
4
+ "sourcesContent": ["import assert from 'node:assert';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './mergeRelatorTermFields.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', 'mergeRelatorTermFields'],\n useMetadataFile: true,\n recurse: true,\n fixura: {\n reader: READERS.JSON\n },\n hooks: {\n before: async () => {\n testValidatorFactory();\n }\n }\n});\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/mergeRelatorTermFields:test');\n\nasync function testValidatorFactory() {\n const validator = await validatorFactory();\n\n assert.equal(typeof validator, 'object');\n assert.equal(typeof validator.description, 'string');\n assert.equal(typeof validator.validate, 'function');\n}\n\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 const record = new MarcRecord(getFixture('record.json'));\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,wBAAwB;AAAA,EAC3E,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;AACD,MAAM,QAAQ,kBAAkB,sEAAsE;AAEtG,eAAe,uBAAuB;AACpC,QAAM,YAAY,MAAM,iBAAiB;AAEzC,SAAO,MAAM,OAAO,WAAW,QAAQ;AACvC,SAAO,MAAM,OAAO,UAAU,aAAa,QAAQ;AACnD,SAAO,MAAM,OAAO,UAAU,UAAU,UAAU;AACpD;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;AACzC,QAAM,SAAS,IAAI,WAAW,WAAW,aAAa,CAAC;AACvD,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
+ }