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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (563) hide show
  1. package/.github/workflows/{melinda-node-tests.yml → melinda-node-tests-and-publish.yml} +37 -12
  2. package/dist/access-rights.js +63 -91
  3. package/dist/access-rights.js.map +7 -1
  4. package/dist/access-rights.test.js +137 -0
  5. package/dist/access-rights.test.js.map +7 -0
  6. package/dist/addMissingField041.js +21 -53
  7. package/dist/addMissingField041.js.map +7 -1
  8. package/dist/addMissingField041.test.js +39 -0
  9. package/dist/addMissingField041.test.js.map +7 -0
  10. package/dist/addMissingField336.js +99 -191
  11. package/dist/addMissingField336.js.map +7 -1
  12. package/dist/addMissingField336.test.js +39 -0
  13. package/dist/addMissingField336.test.js.map +7 -0
  14. package/dist/addMissingField337.js +63 -132
  15. package/dist/addMissingField337.js.map +7 -1
  16. package/dist/addMissingField337.test.js +39 -0
  17. package/dist/addMissingField337.test.js.map +7 -0
  18. package/dist/addMissingField338.js +147 -253
  19. package/dist/addMissingField338.js.map +7 -1
  20. package/dist/addMissingField338.test.js +39 -0
  21. package/dist/addMissingField338.test.js.map +7 -0
  22. package/dist/cyrillux-usemarcon-replacement.js +119 -272
  23. package/dist/cyrillux-usemarcon-replacement.js.map +7 -1
  24. package/dist/cyrillux-usemarcon-replacement.test.js +43 -0
  25. package/dist/cyrillux-usemarcon-replacement.test.js.map +7 -0
  26. package/dist/cyrillux.js +119 -223
  27. package/dist/cyrillux.js.map +7 -1
  28. package/dist/cyrillux.test.js +39 -0
  29. package/dist/cyrillux.test.js.map +7 -0
  30. package/dist/disambiguateSeriesStatements.js +40 -81
  31. package/dist/disambiguateSeriesStatements.js.map +7 -1
  32. package/dist/disambiguateSeriesStatements.test.js +44 -0
  33. package/dist/disambiguateSeriesStatements.test.js.map +7 -0
  34. package/dist/double-commas.js +7 -14
  35. package/dist/double-commas.js.map +7 -1
  36. package/dist/double-commas.test.js +48 -0
  37. package/dist/double-commas.test.js.map +7 -0
  38. package/dist/duplicates-ind1.js +10 -31
  39. package/dist/duplicates-ind1.js.map +7 -1
  40. package/dist/duplicates-ind1.test.js +40 -0
  41. package/dist/duplicates-ind1.test.js.map +7 -0
  42. package/dist/empty-fields.js +10 -22
  43. package/dist/empty-fields.js.map +7 -1
  44. package/dist/empty-fields.test.js +129 -0
  45. package/dist/empty-fields.test.js.map +7 -0
  46. package/dist/ending-punctuation-conf.js +873 -769
  47. package/dist/ending-punctuation-conf.js.map +7 -1
  48. package/dist/ending-punctuation.js +156 -169
  49. package/dist/ending-punctuation.js.map +7 -1
  50. package/dist/ending-punctuation.test.js +2385 -0
  51. package/dist/ending-punctuation.test.js.map +7 -0
  52. package/dist/ending-whitespace.js +10 -35
  53. package/dist/ending-whitespace.js.map +7 -1
  54. package/dist/ending-whitespace.test.js +38 -0
  55. package/dist/ending-whitespace.test.js.map +7 -0
  56. package/dist/field-008-18-34-character-groups.js +40 -125
  57. package/dist/field-008-18-34-character-groups.js.map +7 -1
  58. package/dist/field-008-18-34-character-groups.test.js +45 -0
  59. package/dist/field-008-18-34-character-groups.test.js.map +7 -0
  60. package/dist/field-505-separators.js +19 -39
  61. package/dist/field-505-separators.js.map +7 -1
  62. package/dist/field-505-separators.test.js +45 -0
  63. package/dist/field-505-separators.test.js.map +7 -0
  64. package/dist/field-521-fix.js +19 -47
  65. package/dist/field-521-fix.js.map +7 -1
  66. package/dist/field-521-fix.test.js +44 -0
  67. package/dist/field-521-fix.test.js.map +7 -0
  68. package/dist/field-exclusion.js +37 -91
  69. package/dist/field-exclusion.js.map +7 -1
  70. package/dist/field-exclusion.test.js +821 -0
  71. package/dist/field-exclusion.test.js.map +7 -0
  72. package/dist/field-structure.js +52 -104
  73. package/dist/field-structure.js.map +7 -1
  74. package/dist/field-structure.test.js +587 -0
  75. package/dist/field-structure.test.js.map +7 -0
  76. package/dist/field33XUtils.js +119 -503
  77. package/dist/field33XUtils.js.map +7 -1
  78. package/dist/fields-present.js +11 -23
  79. package/dist/fields-present.js.map +7 -1
  80. package/dist/fields-present.test.js +95 -0
  81. package/dist/fields-present.test.js.map +7 -0
  82. package/dist/fix-33X.js +393 -431
  83. package/dist/fix-33X.js.map +7 -1
  84. package/dist/fix-33X.test.js +39 -0
  85. package/dist/fix-33X.test.js.map +7 -0
  86. package/dist/fix-country-codes.js +20 -50
  87. package/dist/fix-country-codes.js.map +7 -1
  88. package/dist/fix-country-codes.test.js +44 -0
  89. package/dist/fix-country-codes.test.js.map +7 -0
  90. package/dist/fix-language-codes.js +23 -53
  91. package/dist/fix-language-codes.js.map +7 -1
  92. package/dist/fix-language-codes.test.js +38 -0
  93. package/dist/fix-language-codes.test.js.map +7 -0
  94. package/dist/fixRelatorTerms.js +82 -209
  95. package/dist/fixRelatorTerms.js.map +7 -1
  96. package/dist/fixRelatorTerms.test.js +44 -0
  97. package/dist/fixRelatorTerms.test.js.map +7 -0
  98. package/dist/fixed-fields.js +21 -30
  99. package/dist/fixed-fields.js.map +7 -1
  100. package/dist/fixed-fields.test.js +87 -0
  101. package/dist/fixed-fields.test.js.map +7 -0
  102. package/dist/identical-fields.js +8 -24
  103. package/dist/identical-fields.js.map +7 -1
  104. package/dist/identical-fields.test.js +119 -0
  105. package/dist/identical-fields.test.js.map +7 -0
  106. package/dist/index.js +182 -413
  107. package/dist/index.js.map +7 -1
  108. package/dist/indicator-fixes.js +66 -94
  109. package/dist/indicator-fixes.js.map +7 -1
  110. package/dist/indicator-fixes.test.js +42 -0
  111. package/dist/indicator-fixes.test.js.map +7 -0
  112. package/dist/isbn-issn.js +71 -128
  113. package/dist/isbn-issn.js.map +7 -1
  114. package/dist/isbn-issn.test.js +398 -0
  115. package/dist/isbn-issn.test.js.map +7 -0
  116. package/dist/item-language.js +32 -65
  117. package/dist/item-language.js.map +7 -1
  118. package/dist/item-language.test.js +322 -0
  119. package/dist/item-language.test.js.map +7 -0
  120. package/dist/melindaCustomMergeFields.js +5182 -11233
  121. package/dist/melindaCustomMergeFields.js.map +7 -1
  122. package/dist/merge-fields/controlSubfields.js +75 -142
  123. package/dist/merge-fields/controlSubfields.js.map +7 -1
  124. package/dist/merge-fields/counterpartField.js +187 -379
  125. package/dist/merge-fields/counterpartField.js.map +7 -1
  126. package/dist/merge-fields/dataProvenance.js +29 -0
  127. package/dist/merge-fields/dataProvenance.js.map +7 -0
  128. package/dist/merge-fields/index.js +25 -50
  129. package/dist/merge-fields/index.js.map +7 -1
  130. package/dist/merge-fields/mergableIndicator.js +18 -51
  131. package/dist/merge-fields/mergableIndicator.js.map +7 -1
  132. package/dist/merge-fields/mergableTag.js +78 -30
  133. package/dist/merge-fields/mergableTag.js.map +7 -1
  134. package/dist/merge-fields/mergeConfig.js +66 -171
  135. package/dist/merge-fields/mergeConfig.js.map +7 -1
  136. package/dist/merge-fields/mergeConstraints.js +323 -1214
  137. package/dist/merge-fields/mergeConstraints.js.map +7 -1
  138. package/dist/merge-fields/mergeField.js +47 -111
  139. package/dist/merge-fields/mergeField.js.map +7 -1
  140. package/dist/merge-fields/mergeIndicator.js +64 -118
  141. package/dist/merge-fields/mergeIndicator.js.map +7 -1
  142. package/dist/merge-fields/mergeOrAddPostprocess.js +14 -38
  143. package/dist/merge-fields/mergeOrAddPostprocess.js.map +7 -1
  144. package/dist/merge-fields/mergeOrAddSubfield.js +62 -104
  145. package/dist/merge-fields/mergeOrAddSubfield.js.map +7 -1
  146. package/dist/merge-fields/mergeSubfield.js +47 -95
  147. package/dist/merge-fields/mergeSubfield.js.map +7 -1
  148. package/dist/merge-fields/removeDuplicateSubfields.js +18 -31
  149. package/dist/merge-fields/removeDuplicateSubfields.js.map +7 -1
  150. package/dist/merge-fields/worldKnowledge.js +15 -40
  151. package/dist/merge-fields/worldKnowledge.js.map +7 -1
  152. package/dist/merge-fields.test.js +46 -0
  153. package/dist/merge-fields.test.js.map +7 -0
  154. package/dist/mergeField500Lisapainokset.js +27 -56
  155. package/dist/mergeField500Lisapainokset.js.map +7 -1
  156. package/dist/mergeField500Lisapainokset.test.js +44 -0
  157. package/dist/mergeField500Lisapainokset.test.js.map +7 -0
  158. package/dist/mergeRelatorTermFields.js +33 -69
  159. package/dist/mergeRelatorTermFields.js.map +7 -1
  160. package/dist/mergeRelatorTermFields.test.js +44 -0
  161. package/dist/mergeRelatorTermFields.test.js.map +7 -0
  162. package/dist/modernize-502.js +23 -55
  163. package/dist/modernize-502.js.map +7 -1
  164. package/dist/modernize-502.test.js +38 -0
  165. package/dist/modernize-502.test.js.map +7 -0
  166. package/dist/multiple-subfield-0.js +23 -48
  167. package/dist/multiple-subfield-0.js.map +7 -1
  168. package/dist/multiple-subfield-0.test.js +44 -0
  169. package/dist/multiple-subfield-0.test.js.map +7 -0
  170. package/dist/non-breaking-space.js +11 -32
  171. package/dist/non-breaking-space.js.map +7 -1
  172. package/dist/non-breaking-space.test.js +38 -0
  173. package/dist/non-breaking-space.test.js.map +7 -0
  174. package/dist/normalize-dashes.js +18 -37
  175. package/dist/normalize-dashes.js.map +7 -1
  176. package/dist/normalize-dashes.test.js +44 -0
  177. package/dist/normalize-dashes.test.js.map +7 -0
  178. package/dist/normalize-identifiers.js +54 -140
  179. package/dist/normalize-identifiers.js.map +7 -1
  180. package/dist/normalize-identifiers.test.js +44 -0
  181. package/dist/normalize-identifiers.test.js.map +7 -0
  182. package/dist/normalize-qualifying-information.js +23 -48
  183. package/dist/normalize-qualifying-information.js.map +7 -1
  184. package/dist/normalize-qualifying-information.test.js +44 -0
  185. package/dist/normalize-qualifying-information.test.js.map +7 -0
  186. package/dist/normalize-utf8-diacritics.js +19 -105
  187. package/dist/normalize-utf8-diacritics.js.map +7 -1
  188. package/dist/normalize-utf8-diacritics.test.js +44 -0
  189. package/dist/normalize-utf8-diacritics.test.js.map +7 -0
  190. package/dist/normalizeFieldForComparison.js +91 -158
  191. package/dist/normalizeFieldForComparison.js.map +7 -1
  192. package/dist/normalizeSubfieldValueForComparison.js +37 -77
  193. package/dist/normalizeSubfieldValueForComparison.js.map +7 -1
  194. package/dist/prepublicationUtils.js +58 -111
  195. package/dist/prepublicationUtils.js.map +7 -1
  196. package/dist/punctuation/index.js +56 -72
  197. package/dist/punctuation/index.js.map +7 -1
  198. package/dist/punctuation/rules/aut.js +372 -331
  199. package/dist/punctuation/rules/aut.js.map +7 -1
  200. package/dist/punctuation/rules/bib.js +420 -373
  201. package/dist/punctuation/rules/bib.js.map +7 -1
  202. package/dist/punctuation/rules/index.js +7 -21
  203. package/dist/punctuation/rules/index.js.map +7 -1
  204. package/dist/punctuation.test.js +44 -0
  205. package/dist/punctuation.test.js.map +7 -0
  206. package/dist/punctuation2.js +259 -802
  207. package/dist/punctuation2.js.map +7 -1
  208. package/dist/punctuation2.test.js +44 -0
  209. package/dist/punctuation2.test.js.map +7 -0
  210. package/dist/reindexSubfield6OccurenceNumbers.js +61 -96
  211. package/dist/reindexSubfield6OccurenceNumbers.js.map +7 -1
  212. package/dist/reindexSubfield6OccurenceNumbers.test.js +44 -0
  213. package/dist/reindexSubfield6OccurenceNumbers.test.js.map +7 -0
  214. package/dist/removeDuplicateDataFields.js +102 -202
  215. package/dist/removeDuplicateDataFields.js.map +7 -1
  216. package/dist/removeDuplicateDataFields.test.js +44 -0
  217. package/dist/removeDuplicateDataFields.test.js.map +7 -0
  218. package/dist/removeInferiorDataFields.js +104 -227
  219. package/dist/removeInferiorDataFields.js.map +7 -1
  220. package/dist/removeInferiorDataFields.test.js +44 -0
  221. package/dist/removeInferiorDataFields.test.js.map +7 -0
  222. package/dist/resolvable-ext-references-melinda.js +25 -60
  223. package/dist/resolvable-ext-references-melinda.js.map +7 -1
  224. package/dist/resolvable-ext-references-melinda.test.js +160 -0
  225. package/dist/resolvable-ext-references-melinda.test.js.map +7 -0
  226. package/dist/resolveOrphanedSubfield6s.js +32 -63
  227. package/dist/resolveOrphanedSubfield6s.js.map +7 -1
  228. package/dist/resolveOrphanedSubfield6s.test.js +44 -0
  229. package/dist/resolveOrphanedSubfield6s.test.js.map +7 -0
  230. package/dist/sanitize-vocabulary-source-codes.js +27 -55
  231. package/dist/sanitize-vocabulary-source-codes.js.map +7 -1
  232. package/dist/sanitize-vocabulary-source-codes.test.js +45 -0
  233. package/dist/sanitize-vocabulary-source-codes.test.js.map +7 -0
  234. package/dist/sort-tags.js +13 -25
  235. package/dist/sort-tags.js.map +7 -1
  236. package/dist/sort-tags.test.js +261 -0
  237. package/dist/sort-tags.test.js.map +7 -0
  238. package/dist/sortFields.js +152 -222
  239. package/dist/sortFields.js.map +7 -1
  240. package/dist/sortFields.test.js +44 -0
  241. package/dist/sortFields.test.js.map +7 -0
  242. package/dist/sortRelatorTerms.js +30 -68
  243. package/dist/sortRelatorTerms.js.map +7 -1
  244. package/dist/sortRelatorTerms.test.js +44 -0
  245. package/dist/sortRelatorTerms.test.js.map +7 -0
  246. package/dist/sortSubfields.js +102 -255
  247. package/dist/sortSubfields.js.map +7 -1
  248. package/dist/sortSubfields.test.js +44 -0
  249. package/dist/sortSubfields.test.js.map +7 -0
  250. package/dist/stripPunctuation.js +13 -36
  251. package/dist/stripPunctuation.js.map +7 -1
  252. package/dist/stripPunctuation.test.js +44 -0
  253. package/dist/stripPunctuation.test.js.map +7 -0
  254. package/dist/subfield-exclusion.js +28 -75
  255. package/dist/subfield-exclusion.js.map +7 -1
  256. package/dist/subfield-exclusion.test.js +471 -0
  257. package/dist/subfield-exclusion.test.js.map +7 -0
  258. package/dist/subfield6Utils.js +107 -269
  259. package/dist/subfield6Utils.js.map +7 -1
  260. package/dist/subfield8Utils.js +26 -50
  261. package/dist/subfield8Utils.js.map +7 -1
  262. package/dist/subfieldValueNormalizations.js +40 -74
  263. package/dist/subfieldValueNormalizations.js.map +7 -1
  264. package/dist/subfieldValueNormalizations.test.js +45 -0
  265. package/dist/subfieldValueNormalizations.test.js.map +7 -0
  266. package/dist/sync-007-and-300.js +22 -53
  267. package/dist/sync-007-and-300.js.map +7 -1
  268. package/dist/sync-007-and-300.test.js +44 -0
  269. package/dist/sync-007-and-300.test.js.map +7 -0
  270. package/dist/translate-terms.js +67 -155
  271. package/dist/translate-terms.js.map +7 -1
  272. package/dist/translate-terms.test.js +54 -0
  273. package/dist/translate-terms.test.js.map +7 -0
  274. package/dist/typeOfDate-008.js +10 -25
  275. package/dist/typeOfDate-008.js.map +7 -1
  276. package/dist/typeOfDate-008.test.js +40 -0
  277. package/dist/typeOfDate-008.test.js.map +7 -0
  278. package/dist/unicode-decomposition.js +94 -107
  279. package/dist/unicode-decomposition.js.map +7 -1
  280. package/dist/unicode-decomposition.test.js +94 -0
  281. package/dist/unicode-decomposition.test.js.map +7 -0
  282. package/dist/update-field-540.js +30 -75
  283. package/dist/update-field-540.js.map +7 -1
  284. package/dist/update-field-540.test.js +44 -0
  285. package/dist/update-field-540.test.js.map +7 -0
  286. package/dist/urn.js +55 -128
  287. package/dist/urn.js.map +7 -1
  288. package/dist/urn.test.js +44 -0
  289. package/dist/urn.test.js.map +7 -0
  290. package/dist/utils.js +78 -126
  291. package/dist/utils.js.map +7 -1
  292. package/eslint.config.mjs +1 -2
  293. package/package.json +28 -101
  294. package/src/access-rights.js +1 -1
  295. package/src/{access-rights.spec.js → access-rights.test.js} +9 -10
  296. package/src/addMissingField041.js +1 -1
  297. package/src/{addMissingField336.spec.js → addMissingField041.test.js} +13 -14
  298. package/src/addMissingField336.js +3 -3
  299. package/src/{addMissingField041.spec.js → addMissingField336.test.js} +13 -14
  300. package/src/addMissingField337.js +2 -2
  301. package/src/{addMissingField337.spec.js → addMissingField337.test.js} +13 -14
  302. package/src/addMissingField338.js +2 -2
  303. package/src/{addMissingField338.spec.js → addMissingField338.test.js} +13 -14
  304. package/src/cyrillux-usemarcon-replacement.js +18 -18
  305. package/src/{cyrillux-usemarcon-replacement.spec.js → cyrillux-usemarcon-replacement.test.js} +17 -14
  306. package/src/cyrillux.js +19 -12
  307. package/src/{cyrillux.spec.js → cyrillux.test.js} +13 -14
  308. package/src/disambiguateSeriesStatements.js +2 -2
  309. package/src/{disambiguateSeriesStatements.spec.js → disambiguateSeriesStatements.test.js} +12 -13
  310. package/src/double-commas.js +1 -1
  311. package/src/{double-commas.spec.js → double-commas.test.js} +9 -11
  312. package/src/duplicates-ind1.js +1 -1
  313. package/src/{duplicates-ind1.spec.js → duplicates-ind1.test.js} +12 -13
  314. package/src/{empty-fields.spec.js → empty-fields.test.js} +11 -13
  315. package/src/ending-punctuation-conf.js +6 -5
  316. package/src/ending-punctuation.js +115 -24
  317. package/src/{ending-punctuation.spec.js → ending-punctuation.test.js} +357 -275
  318. package/src/{ending-whitespace.spec.js → ending-whitespace.test.js} +12 -13
  319. package/src/field-008-18-34-character-groups.js +2 -2
  320. package/src/{field-008-18-34-character-groups.spec.js → field-008-18-34-character-groups.test.js} +13 -13
  321. package/src/field-505-separators.js +3 -3
  322. package/src/{field-505-separators.spec.js → field-505-separators.test.js} +16 -14
  323. package/src/field-521-fix.js +2 -2
  324. package/src/{field-521-fix.spec.js → field-521-fix.test.js} +12 -13
  325. package/src/field-exclusion.js +1 -1
  326. package/src/{field-exclusion.spec.js → field-exclusion.test.js} +60 -57
  327. package/src/{field-structure.spec.js → field-structure.test.js} +29 -29
  328. package/src/{fields-present.spec.js → fields-present.test.js} +12 -15
  329. package/src/fix-33X.js +4 -4
  330. package/src/{fix-33X.spec.js → fix-33X.test.js} +13 -14
  331. package/src/fix-country-codes.js +1 -1
  332. package/src/{fix-country-codes.spec.js → fix-country-codes.test.js} +12 -13
  333. package/src/fix-language-codes.js +5 -5
  334. package/src/{fix-language-codes.spec.js → fix-language-codes.test.js} +12 -13
  335. package/src/fixRelatorTerms.js +5 -5
  336. package/src/{fixRelatorTerms.spec.js → fixRelatorTerms.test.js} +13 -13
  337. package/src/{fixed-fields.spec.js → fixed-fields.test.js} +11 -14
  338. package/src/identical-fields.js +1 -1
  339. package/src/{identical-fields.spec.js → identical-fields.test.js} +9 -11
  340. package/src/index.js +132 -59
  341. package/src/indicator-fixes.js +17 -4
  342. package/src/{indicator-fixes.spec.js → indicator-fixes.test.js} +9 -12
  343. package/src/isbn-issn.js +12 -7
  344. package/src/{isbn-issn.spec.js → isbn-issn.test.js} +20 -22
  345. package/src/{item-language.spec.js → item-language.test.js} +21 -22
  346. package/src/melindaCustomMergeFields.js +1 -1
  347. package/src/merge-fields/controlSubfields.js +1 -1
  348. package/src/merge-fields/counterpartField.js +14 -9
  349. package/src/merge-fields/dataProvenance.js +41 -0
  350. package/src/merge-fields/index.js +12 -3
  351. package/src/merge-fields/mergableIndicator.js +1 -1
  352. package/src/merge-fields/mergeField.js +8 -8
  353. package/src/merge-fields/mergeIndicator.js +1 -1
  354. package/src/merge-fields/mergeOrAddPostprocess.js +4 -4
  355. package/src/merge-fields/mergeOrAddSubfield.js +2 -2
  356. package/src/merge-fields/mergeSubfield.js +4 -4
  357. package/src/merge-fields/removeDuplicateSubfields.js +2 -2
  358. package/src/{merge-fields.spec.js → merge-fields.test.js} +18 -15
  359. package/src/mergeField500Lisapainokset.js +1 -1
  360. package/src/{mergeField500Lisapainokset.spec.js → mergeField500Lisapainokset.test.js} +12 -13
  361. package/src/mergeRelatorTermFields.js +5 -7
  362. package/src/{mergeRelatorTermFields.spec.js → mergeRelatorTermFields.test.js} +12 -13
  363. package/src/modernize-502.js +1 -1
  364. package/src/{modernize-502.spec.js → modernize-502.test.js} +12 -13
  365. package/src/multiple-subfield-0.js +3 -3
  366. package/src/{multiple-subfield-0.spec.js → multiple-subfield-0.test.js} +13 -13
  367. package/src/{non-breaking-space.spec.js → non-breaking-space.test.js} +12 -13
  368. package/src/normalize-dashes.js +2 -2
  369. package/src/{normalize-dashes.spec.js → normalize-dashes.test.js} +12 -13
  370. package/src/normalize-identifiers.js +1 -1
  371. package/src/{normalize-identifiers.spec.js → normalize-identifiers.test.js} +12 -13
  372. package/src/normalize-qualifying-information.js +2 -2
  373. package/src/{normalize-qualifying-information.spec.js → normalize-qualifying-information.test.js} +12 -13
  374. package/src/normalize-utf8-diacritics.js +2 -2
  375. package/src/{normalize-utf8-diacritics.spec.js → normalize-utf8-diacritics.test.js} +13 -13
  376. package/src/normalizeFieldForComparison.js +32 -6
  377. package/src/normalizeSubfieldValueForComparison.js +1 -1
  378. package/src/prepublicationUtils.js +4 -4
  379. package/src/punctuation/index.js +1 -1
  380. package/src/punctuation/rules/index.js +2 -2
  381. package/src/{punctuation.spec.js → punctuation.test.js} +12 -13
  382. package/src/punctuation2.js +17 -8
  383. package/src/{punctuation2.spec.js → punctuation2.test.js} +12 -13
  384. package/src/reindexSubfield6OccurenceNumbers.js +5 -7
  385. package/src/{reindexSubfield6OccurenceNumbers.spec.js → reindexSubfield6OccurenceNumbers.test.js} +12 -13
  386. package/src/removeDuplicateDataFields.js +11 -19
  387. package/src/{removeDuplicateDataFields.spec.js → removeDuplicateDataFields.test.js} +12 -13
  388. package/src/removeInferiorDataFields.js +15 -12
  389. package/src/{removeInferiorDataFields.spec.js → removeInferiorDataFields.test.js} +13 -13
  390. package/src/resolvable-ext-references-melinda.js +1 -1
  391. package/src/{resolvable-ext-references-melinda.spec.js → resolvable-ext-references-melinda.test.js} +42 -27
  392. package/src/resolveOrphanedSubfield6s.js +6 -6
  393. package/src/{resolveOrphanedSubfield6s.spec.js → resolveOrphanedSubfield6s.test.js} +13 -13
  394. package/src/sanitize-vocabulary-source-codes.js +4 -4
  395. package/src/{sanitize-vocabulary-source-codes.spec.js → sanitize-vocabulary-source-codes.test.js} +16 -14
  396. package/src/{sort-tags.spec.js → sort-tags.test.js} +9 -11
  397. package/src/sortFields.js +4 -4
  398. package/src/{sortFields.spec.js → sortFields.test.js} +12 -13
  399. package/src/sortRelatorTerms.js +3 -3
  400. package/src/{sortRelatorTerms.spec.js → sortRelatorTerms.test.js} +13 -13
  401. package/src/sortSubfields.js +8 -6
  402. package/src/{sortSubfields.spec.js → sortSubfields.test.js} +13 -13
  403. package/src/stripPunctuation.js +3 -3
  404. package/src/{stripPunctuation.spec.js → stripPunctuation.test.js} +13 -13
  405. package/src/subfield-exclusion.js +1 -1
  406. package/src/{subfield-exclusion.spec.js → subfield-exclusion.test.js} +45 -36
  407. package/src/subfield6Utils.js +6 -10
  408. package/src/subfield8Utils.js +4 -4
  409. package/src/subfieldValueNormalizations.js +3 -3
  410. package/src/{subfieldValueNormalizations.spec.js → subfieldValueNormalizations.test.js} +18 -14
  411. package/src/sync-007-and-300.js +2 -2
  412. package/src/{sync-007-and-300.spec.js → sync-007-and-300.test.js} +13 -13
  413. package/src/translate-terms.js +3 -3
  414. package/src/translate-terms.test.js +75 -0
  415. package/src/{typeOfDate-008.spec.js → typeOfDate-008.test.js} +12 -13
  416. package/src/{unicode-decomposition.spec.js → unicode-decomposition.test.js} +10 -16
  417. package/src/update-field-540.js +2 -2
  418. package/src/{update-field-540.spec.js → update-field-540.test.js} +13 -10
  419. package/src/urn.js +2 -2
  420. package/src/{urn.spec.js → urn.test.js} +12 -13
  421. package/src/utils.js +21 -5
  422. package/test-fixtures/field-505-separators/03/expectedResult.json +3 -1
  423. package/test-fixtures/field-505-separators/03/record.json +3 -0
  424. package/test-fixtures/indicator-fixes/10/expectedResult.json +11 -0
  425. package/test-fixtures/indicator-fixes/10/metadata.json +4 -0
  426. package/test-fixtures/indicator-fixes/10/record.json +11 -0
  427. package/test-fixtures/merge-fields/f05/expectedResult.json +24 -0
  428. package/test-fixtures/merge-fields/f05/metadata.json +6 -0
  429. package/test-fixtures/merge-fields/f05/record.json +30 -0
  430. package/test-fixtures/normalize-subfield-value/01/metadata.json +4 -1
  431. package/test-fixtures/normalize-subfield-value/01/record.json +3 -0
  432. package/test-fixtures/normalize-subfield-value/02/expectedResult.json +3 -1
  433. package/test-fixtures/normalize-subfield-value/02/metadata.json +2 -1
  434. package/test-fixtures/normalize-subfield-value/02/record.json +3 -0
  435. package/test-fixtures/remove-inferior-datafields/f16/expectedResult.json +12 -0
  436. package/test-fixtures/remove-inferior-datafields/f16/metadata.json +5 -0
  437. package/test-fixtures/remove-inferior-datafields/f16/record.json +14 -0
  438. package/test-fixtures/sanitize-vocabulary-source-codes/f03/expectedResult.json +3 -1
  439. package/test-fixtures/sanitize-vocabulary-source-codes/f04/expectedResult.json +3 -1
  440. package/test-fixtures/sanitize-vocabulary-source-codes/v04/metadata.json +1 -4
  441. package/test-fixtures/sanitize-vocabulary-source-codes/v04/record.json +1 -1
  442. package/test-fixtures/translate-terms-data.js +42 -0
  443. package/dist/access-rights.spec.js +0 -195
  444. package/dist/access-rights.spec.js.map +0 -1
  445. package/dist/addMissingField041.spec.js +0 -45
  446. package/dist/addMissingField041.spec.js.map +0 -1
  447. package/dist/addMissingField336.spec.js +0 -45
  448. package/dist/addMissingField336.spec.js.map +0 -1
  449. package/dist/addMissingField337.spec.js +0 -43
  450. package/dist/addMissingField337.spec.js.map +0 -1
  451. package/dist/addMissingField338.spec.js +0 -45
  452. package/dist/addMissingField338.spec.js.map +0 -1
  453. package/dist/cyrillux-usemarcon-replacement.spec.js +0 -45
  454. package/dist/cyrillux-usemarcon-replacement.spec.js.map +0 -1
  455. package/dist/cyrillux.spec.js +0 -46
  456. package/dist/cyrillux.spec.js.map +0 -1
  457. package/dist/disambiguateSeriesStatements.spec.js +0 -51
  458. package/dist/disambiguateSeriesStatements.spec.js.map +0 -1
  459. package/dist/double-commas.spec.js +0 -73
  460. package/dist/double-commas.spec.js.map +0 -1
  461. package/dist/duplicates-ind1.spec.js +0 -45
  462. package/dist/duplicates-ind1.spec.js.map +0 -1
  463. package/dist/empty-fields.spec.js +0 -118
  464. package/dist/empty-fields.spec.js.map +0 -1
  465. package/dist/ending-punctuation.spec.js +0 -2654
  466. package/dist/ending-punctuation.spec.js.map +0 -1
  467. package/dist/ending-whitespace.spec.js +0 -42
  468. package/dist/ending-whitespace.spec.js.map +0 -1
  469. package/dist/field-008-18-34-character-groups.spec.js +0 -51
  470. package/dist/field-008-18-34-character-groups.spec.js.map +0 -1
  471. package/dist/field-505-separators.spec.js +0 -51
  472. package/dist/field-505-separators.spec.js.map +0 -1
  473. package/dist/field-521-fix.spec.js +0 -51
  474. package/dist/field-521-fix.spec.js.map +0 -1
  475. package/dist/field-exclusion.spec.js +0 -1054
  476. package/dist/field-exclusion.spec.js.map +0 -1
  477. package/dist/field-structure.spec.js +0 -535
  478. package/dist/field-structure.spec.js.map +0 -1
  479. package/dist/fields-present.spec.js +0 -121
  480. package/dist/fields-present.spec.js.map +0 -1
  481. package/dist/fix-33X.spec.js +0 -45
  482. package/dist/fix-33X.spec.js.map +0 -1
  483. package/dist/fix-country-codes.spec.js +0 -51
  484. package/dist/fix-country-codes.spec.js.map +0 -1
  485. package/dist/fix-language-codes.spec.js +0 -44
  486. package/dist/fix-language-codes.spec.js.map +0 -1
  487. package/dist/fixRelatorTerms.spec.js +0 -51
  488. package/dist/fixRelatorTerms.spec.js.map +0 -1
  489. package/dist/fixed-fields.spec.js +0 -140
  490. package/dist/fixed-fields.spec.js.map +0 -1
  491. package/dist/identical-fields.spec.js +0 -99
  492. package/dist/identical-fields.spec.js.map +0 -1
  493. package/dist/indicator-fixes.spec.js +0 -51
  494. package/dist/indicator-fixes.spec.js.map +0 -1
  495. package/dist/isbn-issn.spec.js +0 -595
  496. package/dist/isbn-issn.spec.js.map +0 -1
  497. package/dist/item-language.spec.js +0 -306
  498. package/dist/item-language.spec.js.map +0 -1
  499. package/dist/melindaCustomMergeFields.json +0 -5120
  500. package/dist/merge-fields.spec.js +0 -51
  501. package/dist/merge-fields.spec.js.map +0 -1
  502. package/dist/mergeField500Lisapainokset.spec.js +0 -51
  503. package/dist/mergeField500Lisapainokset.spec.js.map +0 -1
  504. package/dist/mergeRelatorTermFields.spec.js +0 -51
  505. package/dist/mergeRelatorTermFields.spec.js.map +0 -1
  506. package/dist/modernize-502.spec.js +0 -49
  507. package/dist/modernize-502.spec.js.map +0 -1
  508. package/dist/multiple-subfield-0.spec.js +0 -51
  509. package/dist/multiple-subfield-0.spec.js.map +0 -1
  510. package/dist/non-breaking-space.spec.js +0 -42
  511. package/dist/non-breaking-space.spec.js.map +0 -1
  512. package/dist/normalize-dashes.spec.js +0 -51
  513. package/dist/normalize-dashes.spec.js.map +0 -1
  514. package/dist/normalize-identifiers.spec.js +0 -51
  515. package/dist/normalize-identifiers.spec.js.map +0 -1
  516. package/dist/normalize-qualifying-information.spec.js +0 -51
  517. package/dist/normalize-qualifying-information.spec.js.map +0 -1
  518. package/dist/normalize-utf8-diacritics.spec.js +0 -51
  519. package/dist/normalize-utf8-diacritics.spec.js.map +0 -1
  520. package/dist/punctuation.spec.js +0 -51
  521. package/dist/punctuation.spec.js.map +0 -1
  522. package/dist/punctuation2.spec.js +0 -51
  523. package/dist/punctuation2.spec.js.map +0 -1
  524. package/dist/reindexSubfield6OccurenceNumbers.spec.js +0 -51
  525. package/dist/reindexSubfield6OccurenceNumbers.spec.js.map +0 -1
  526. package/dist/removeDuplicateDataFields.spec.js +0 -51
  527. package/dist/removeDuplicateDataFields.spec.js.map +0 -1
  528. package/dist/removeInferiorDataFields.spec.js +0 -51
  529. package/dist/removeInferiorDataFields.spec.js.map +0 -1
  530. package/dist/resolvable-ext-references-melinda.spec.js +0 -166
  531. package/dist/resolvable-ext-references-melinda.spec.js.map +0 -1
  532. package/dist/resolveOrphanedSubfield6s.spec.js +0 -51
  533. package/dist/resolveOrphanedSubfield6s.spec.js.map +0 -1
  534. package/dist/sanitize-vocabulary-source-codes.spec.js +0 -51
  535. package/dist/sanitize-vocabulary-source-codes.spec.js.map +0 -1
  536. package/dist/sort-tags.spec.js +0 -207
  537. package/dist/sort-tags.spec.js.map +0 -1
  538. package/dist/sortFields.spec.js +0 -51
  539. package/dist/sortFields.spec.js.map +0 -1
  540. package/dist/sortRelatorTerms.spec.js +0 -51
  541. package/dist/sortRelatorTerms.spec.js.map +0 -1
  542. package/dist/sortSubfields.spec.js +0 -52
  543. package/dist/sortSubfields.spec.js.map +0 -1
  544. package/dist/stripPunctuation.spec.js +0 -51
  545. package/dist/stripPunctuation.spec.js.map +0 -1
  546. package/dist/subfield-exclusion.spec.js +0 -523
  547. package/dist/subfield-exclusion.spec.js.map +0 -1
  548. package/dist/subfieldValueNormalizations.spec.js +0 -51
  549. package/dist/subfieldValueNormalizations.spec.js.map +0 -1
  550. package/dist/sync-007-and-300.spec.js +0 -51
  551. package/dist/sync-007-and-300.spec.js.map +0 -1
  552. package/dist/translate-terms.spec.js +0 -51
  553. package/dist/translate-terms.spec.js.map +0 -1
  554. package/dist/typeOfDate-008.spec.js +0 -47
  555. package/dist/typeOfDate-008.spec.js.map +0 -1
  556. package/dist/unicode-decomposition.spec.js +0 -91
  557. package/dist/unicode-decomposition.spec.js.map +0 -1
  558. package/dist/update-field-540.spec.js +0 -51
  559. package/dist/update-field-540.spec.js.map +0 -1
  560. package/dist/urn.spec.js +0 -52
  561. package/dist/urn.spec.js.map +0 -1
  562. package/src/melindaCustomMergeFields.json +0 -5120
  563. package/src/translate-terms.spec.js +0 -52
@@ -1,42 +1,21 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = _default;
7
- exports.normalizeField502 = normalizeField502;
8
- var _clone = _interopRequireDefault(require("clone"));
9
- var _utils = require("./utils");
10
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
11
- //import createDebugLogger from 'debug';
12
-
13
- //const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/modernize-502');
14
-
15
- // Author(s): Nicholas Volk
16
- function _default() {
1
+ import clone from "clone";
2
+ import { fieldToString } from "./utils.js";
3
+ export default function() {
17
4
  return {
18
- description: 'Normalizes Finnish national convention 502$a$c$d fields to a 502$a (which is better supported by LoC).',
5
+ description: "Normalizes Finnish national convention 502$a$c$d fields to a 502$a (which is better supported by LoC).",
19
6
  validate,
20
7
  fix
21
8
  };
22
9
  function fix(record) {
23
- const res = {
24
- message: [],
25
- fix: [],
26
- valid: true
27
- };
28
- record.fields.forEach(field => {
10
+ const res = { message: [], fix: [], valid: true };
11
+ record.fields.forEach((field) => {
29
12
  normalizeField502(field);
30
13
  });
31
-
32
- // message.valid = !(message.message.length >= 1);
33
14
  return res;
34
15
  }
35
16
  function validate(record) {
36
- const res = {
37
- message: []
38
- };
39
- record.fields.forEach(field => {
17
+ const res = { message: [] };
18
+ record.fields.forEach((field) => {
40
19
  validateField(field, res);
41
20
  });
42
21
  res.valid = !(res.message.length >= 1);
@@ -46,60 +25,51 @@ function _default() {
46
25
  if (!field.subfields) {
47
26
  return;
48
27
  }
49
- const orig = (0, _utils.fieldToString)(field);
50
- const normalizedField = normalizeField502((0, _clone.default)(field));
51
- const mod = (0, _utils.fieldToString)(normalizedField);
28
+ const orig = fieldToString(field);
29
+ const normalizedField = normalizeField502(clone(field));
30
+ const mod = fieldToString(normalizedField);
52
31
  if (orig !== mod) {
53
- // Fail as the input is "broken"/"crap"/sumthing
54
32
  res.message.push(`Fix '${orig}' => '${mod}'`);
55
33
  return;
56
34
  }
57
35
  return;
58
36
  }
59
37
  }
60
- function normalizeField502(field) {
38
+ export function normalizeField502(field) {
61
39
  if (!field.subfields) {
62
40
  return field;
63
41
  }
64
- const acd = field.subfields.filter(sf => 'acd'.includes(sf.code));
65
- const str = acd.map(sf => sf.code).join('');
66
- // Check that we have relevant subfields and that they are in relevant order (with each other):
67
- if (!['acd', 'ac', 'ad'].includes(str)) {
42
+ const acd = field.subfields.filter((sf) => "acd".includes(sf.code));
43
+ const str = acd.map((sf) => sf.code).join("");
44
+ if (!["acd", "ac", "ad"].includes(str)) {
68
45
  return field;
69
46
  }
70
-
71
- // "a = acd[0]"" is way more readable than "[a] = acd"...
72
47
  const a = acd[0];
73
- const c = acd[1].code === 'c' ? acd[1] : null;
74
- const d = acd[acd.length - 1].code === 'd' ? acd[acd.length - 1] : null;
75
-
76
- //console.log(JSON.stringify(d)); // eslint-disable-line no-console
77
-
48
+ const c = acd[1].code === "c" ? acd[1] : null;
49
+ const d = acd[acd.length - 1].code === "d" ? acd[acd.length - 1] : null;
78
50
  if (!hasValidA() || !hasValidD()) {
79
51
  return field;
80
52
  }
81
53
  const newValue = `${extractA()}--${extractC()}${extractD()}`;
82
54
  a.value = newValue;
83
- field.subfields = field.subfields.filter(sf => !['c', 'd'].includes(sf.code));
55
+ field.subfields = field.subfields.filter((sf) => !["c", "d"].includes(sf.code));
84
56
  return field;
85
57
  function extractA() {
86
- return a.value.replace(/[ ,:]+$/u, '');
58
+ return a.value.replace(/[ ,:]+$/u, "");
87
59
  }
88
60
  function extractC() {
89
61
  if (!c) {
90
- return '';
62
+ return "";
91
63
  }
92
64
  if (c) {
93
- // Here we assume that there was correct punctuation between $c and $d...
94
- return `${c.value}${d ? ' ' : ''}`;
65
+ return `${c.value}${d ? " " : ""}`;
95
66
  }
96
67
  return c.value;
97
68
  }
98
69
  function extractD() {
99
- return d ? d.value : '';
70
+ return d ? d.value : "";
100
71
  }
101
72
  function hasValidA() {
102
- // Belongs to https://finto.fi/mts/fi/page/m91
103
73
  if (a.value.match(/^(?:AMK-opinnäytetyö|Anbalyysiseminaarityö|Artikkeliväitöskirja|Diplomityö|Erikoistyö|Esseeväitöskirja|Kandidaatintutkielma|Laudaturseminaarityö|Laudaturtyö|Lisensiaatintyö|Lopputyö|Monografiaväitöskirja|Opinnäyte|Opinnäytetyö|Pro gradu -tutkielma|Proseminaarityö|Seminaarityö|Väitöskirja|Ylempi AMK-opinnäytetyö)[, :]*$/u) || a.value.match(/^(?:Analysseminariearbete|Artikelavhandling|Diplomarbete|Doktorsavhandling|Essäavhandling|Högre YH-examensarbete|Kandidatavhandling|Laudaturarbete|Laudaturseminariearbete|Licentiatavhandling|Lärdomsprov|Monografiavhandling|Pro gradu-avhandling|Proseminariearbete|Seminariearbete|Slutarbete|Specialarbete|YH-examesarbete)[:, ]*$/u)) {
104
74
  return true;
105
75
  }
@@ -107,11 +77,9 @@ function normalizeField502(field) {
107
77
  }
108
78
  function hasValidD() {
109
79
  if (!d) {
110
- // We can live without $d:
111
80
  return true;
112
81
  }
113
- // Content makes sense:
114
82
  return d.value.match(/^\[?(?:[0-9]{4}|[0-9]{4}-[0-9]{4}|1[89]uu|Vuosien [0-9]{4} ja [0-9]{4} välillä)[\].]{0,2}$/u);
115
83
  }
116
84
  }
117
- //# sourceMappingURL=modernize-502.js.map
85
+ //# sourceMappingURL=modernize-502.js.map
@@ -1 +1,7 @@
1
- {"version":3,"file":"modernize-502.js","names":["_clone","_interopRequireDefault","require","_utils","e","__esModule","default","_default","description","validate","fix","record","res","message","valid","fields","forEach","field","normalizeField502","validateField","length","subfields","orig","fieldToString","normalizedField","clone","mod","push","acd","filter","sf","includes","code","str","map","join","a","c","d","hasValidA","hasValidD","newValue","extractA","extractC","extractD","value","replace","match"],"sources":["../src/modernize-502.js"],"sourcesContent":["//import createDebugLogger from 'debug';\nimport clone from 'clone';\nimport {fieldToString} from './utils';\n\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/modernize-502');\n\n// Author(s): Nicholas Volk\nexport default function () {\n\n return {\n description: 'Normalizes Finnish national convention 502$a$c$d fields to a 502$a (which is better supported by LoC).',\n validate, fix\n };\n\n function fix(record) {\n const res = {message: [], fix: [], valid: true};\n\n record.fields.forEach(field => {\n normalizeField502(field);\n });\n\n // message.valid = !(message.message.length >= 1);\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n record.fields.forEach(field => {\n validateField(field, res);\n });\n\n res.valid = !(res.message.length >= 1);\n return res;\n }\n\n function validateField(field, res) {\n if (!field.subfields) {\n return;\n }\n const orig = fieldToString(field);\n\n const normalizedField = normalizeField502(clone(field));\n const mod = fieldToString(normalizedField);\n if (orig !== mod) { // Fail as the input is \"broken\"/\"crap\"/sumthing\n res.message.push(`Fix '${orig}' => '${mod}'`);\n return;\n }\n return;\n }\n}\n\n\nexport function normalizeField502(field) {\n if (!field.subfields) {\n return field;\n }\n const acd = field.subfields.filter(sf => 'acd'.includes(sf.code));\n const str = acd.map(sf => sf.code).join('');\n // Check that we have relevant subfields and that they are in relevant order (with each other):\n if (!['acd', 'ac', 'ad'].includes(str)) {\n return field;\n }\n\n // \"a = acd[0]\"\" is way more readable than \"[a] = acd\"...\n const a = acd[0];\n const c = acd[1].code === 'c' ? acd[1] : null;\n const d = acd[acd.length - 1].code === 'd' ? acd[acd.length - 1] : null;\n\n //console.log(JSON.stringify(d)); // eslint-disable-line no-console\n\n if (!hasValidA() || !hasValidD()) {\n return field;\n }\n\n const newValue = `${extractA()}--${extractC()}${extractD()}`;\n a.value = newValue;\n field.subfields = field.subfields.filter(sf => !['c', 'd'].includes(sf.code));\n return field;\n\n function extractA() {\n return a.value.replace(/[ ,:]+$/u, '');\n }\n\n function extractC() {\n if (!c) {\n return '';\n }\n if (c) {\n // Here we assume that there was correct punctuation between $c and $d...\n return `${c.value}${d ? ' ' : ''}`;\n }\n return c.value;\n }\n\n function extractD() {\n return d ? d.value : '';\n }\n\n function hasValidA() {\n // Belongs to https://finto.fi/mts/fi/page/m91\n if (a.value.match(/^(?:AMK-opinnäytetyö|Anbalyysiseminaarityö|Artikkeliväitöskirja|Diplomityö|Erikoistyö|Esseeväitöskirja|Kandidaatintutkielma|Laudaturseminaarityö|Laudaturtyö|Lisensiaatintyö|Lopputyö|Monografiaväitöskirja|Opinnäyte|Opinnäytetyö|Pro gradu -tutkielma|Proseminaarityö|Seminaarityö|Väitöskirja|Ylempi AMK-opinnäytetyö)[, :]*$/u) ||\n a.value.match(/^(?:Analysseminariearbete|Artikelavhandling|Diplomarbete|Doktorsavhandling|Essäavhandling|Högre YH-examensarbete|Kandidatavhandling|Laudaturarbete|Laudaturseminariearbete|Licentiatavhandling|Lärdomsprov|Monografiavhandling|Pro gradu-avhandling|Proseminariearbete|Seminariearbete|Slutarbete|Specialarbete|YH-examesarbete)[:, ]*$/u)) {\n return true;\n }\n return false;\n }\n\n\n function hasValidD() {\n if (!d) { // We can live without $d:\n return true;\n }\n // Content makes sense:\n return d.value.match(/^\\[?(?:[0-9]{4}|[0-9]{4}-[0-9]{4}|1[89]uu|Vuosien [0-9]{4} ja [0-9]{4} välillä)[\\].]{0,2}$/u);\n }\n\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/modernize-502.js"],
4
+ "sourcesContent": ["//import createDebugLogger from 'debug';\nimport clone from 'clone';\nimport {fieldToString} from './utils.js';\n\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/modernize-502');\n\n// Author(s): Nicholas Volk\nexport default function () {\n\n return {\n description: 'Normalizes Finnish national convention 502$a$c$d fields to a 502$a (which is better supported by LoC).',\n validate, fix\n };\n\n function fix(record) {\n const res = {message: [], fix: [], valid: true};\n\n record.fields.forEach(field => {\n normalizeField502(field);\n });\n\n // message.valid = !(message.message.length >= 1);\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n record.fields.forEach(field => {\n validateField(field, res);\n });\n\n res.valid = !(res.message.length >= 1);\n return res;\n }\n\n function validateField(field, res) {\n if (!field.subfields) {\n return;\n }\n const orig = fieldToString(field);\n\n const normalizedField = normalizeField502(clone(field));\n const mod = fieldToString(normalizedField);\n if (orig !== mod) { // Fail as the input is \"broken\"/\"crap\"/sumthing\n res.message.push(`Fix '${orig}' => '${mod}'`);\n return;\n }\n return;\n }\n}\n\n\nexport function normalizeField502(field) {\n if (!field.subfields) {\n return field;\n }\n const acd = field.subfields.filter(sf => 'acd'.includes(sf.code));\n const str = acd.map(sf => sf.code).join('');\n // Check that we have relevant subfields and that they are in relevant order (with each other):\n if (!['acd', 'ac', 'ad'].includes(str)) {\n return field;\n }\n\n // \"a = acd[0]\"\" is way more readable than \"[a] = acd\"...\n const a = acd[0];\n const c = acd[1].code === 'c' ? acd[1] : null;\n const d = acd[acd.length - 1].code === 'd' ? acd[acd.length - 1] : null;\n\n //console.log(JSON.stringify(d)); // eslint-disable-line no-console\n\n if (!hasValidA() || !hasValidD()) {\n return field;\n }\n\n const newValue = `${extractA()}--${extractC()}${extractD()}`;\n a.value = newValue;\n field.subfields = field.subfields.filter(sf => !['c', 'd'].includes(sf.code));\n return field;\n\n function extractA() {\n return a.value.replace(/[ ,:]+$/u, '');\n }\n\n function extractC() {\n if (!c) {\n return '';\n }\n if (c) {\n // Here we assume that there was correct punctuation between $c and $d...\n return `${c.value}${d ? ' ' : ''}`;\n }\n return c.value;\n }\n\n function extractD() {\n return d ? d.value : '';\n }\n\n function hasValidA() {\n // Belongs to https://finto.fi/mts/fi/page/m91\n if (a.value.match(/^(?:AMK-opinn\u00E4ytety\u00F6|Anbalyysiseminaarity\u00F6|Artikkeliv\u00E4it\u00F6skirja|Diplomity\u00F6|Erikoisty\u00F6|Esseev\u00E4it\u00F6skirja|Kandidaatintutkielma|Laudaturseminaarity\u00F6|Laudaturty\u00F6|Lisensiaatinty\u00F6|Lopputy\u00F6|Monografiav\u00E4it\u00F6skirja|Opinn\u00E4yte|Opinn\u00E4ytety\u00F6|Pro gradu -tutkielma|Proseminaarity\u00F6|Seminaarity\u00F6|V\u00E4it\u00F6skirja|Ylempi AMK-opinn\u00E4ytety\u00F6)[, :]*$/u) ||\n a.value.match(/^(?:Analysseminariearbete|Artikelavhandling|Diplomarbete|Doktorsavhandling|Ess\u00E4avhandling|H\u00F6gre YH-examensarbete|Kandidatavhandling|Laudaturarbete|Laudaturseminariearbete|Licentiatavhandling|L\u00E4rdomsprov|Monografiavhandling|Pro gradu-avhandling|Proseminariearbete|Seminariearbete|Slutarbete|Specialarbete|YH-examesarbete)[:, ]*$/u)) {\n return true;\n }\n return false;\n }\n\n\n function hasValidD() {\n if (!d) { // We can live without $d:\n return true;\n }\n // Content makes sense:\n return d.value.match(/^\\[?(?:[0-9]{4}|[0-9]{4}-[0-9]{4}|1[89]uu|Vuosien [0-9]{4} ja [0-9]{4} v\u00E4lill\u00E4)[\\].]{0,2}$/u);\n }\n\n}\n"],
5
+ "mappings": "AACA,OAAO,WAAW;AAClB,SAAQ,qBAAoB;AAK5B,0BAA2B;AAEzB,SAAO;AAAA,IACL,aAAa;AAAA,IACb;AAAA,IAAU;AAAA,EACZ;AAEA,WAAS,IAAI,QAAQ;AACnB,UAAM,MAAM,EAAC,SAAS,CAAC,GAAG,KAAK,CAAC,GAAG,OAAO,KAAI;AAE9C,WAAO,OAAO,QAAQ,WAAS;AAC7B,wBAAkB,KAAK;AAAA,IACzB,CAAC;AAGD,WAAO;AAAA,EACT;AAEA,WAAS,SAAS,QAAQ;AACxB,UAAM,MAAM,EAAC,SAAS,CAAC,EAAC;AAExB,WAAO,OAAO,QAAQ,WAAS;AAC7B,oBAAc,OAAO,GAAG;AAAA,IAC1B,CAAC;AAED,QAAI,QAAQ,EAAE,IAAI,QAAQ,UAAU;AACpC,WAAO;AAAA,EACT;AAEA,WAAS,cAAc,OAAO,KAAK;AACjC,QAAI,CAAC,MAAM,WAAW;AACpB;AAAA,IACF;AACA,UAAM,OAAO,cAAc,KAAK;AAEhC,UAAM,kBAAkB,kBAAkB,MAAM,KAAK,CAAC;AACtD,UAAM,MAAM,cAAc,eAAe;AACzC,QAAI,SAAS,KAAK;AAChB,UAAI,QAAQ,KAAK,QAAQ,IAAI,SAAS,GAAG,GAAG;AAC5C;AAAA,IACF;AACA;AAAA,EACF;AACF;AAGO,gBAAS,kBAAkB,OAAO;AACvC,MAAI,CAAC,MAAM,WAAW;AACpB,WAAO;AAAA,EACT;AACA,QAAM,MAAM,MAAM,UAAU,OAAO,QAAM,MAAM,SAAS,GAAG,IAAI,CAAC;AAChE,QAAM,MAAM,IAAI,IAAI,QAAM,GAAG,IAAI,EAAE,KAAK,EAAE;AAE1C,MAAI,CAAC,CAAC,OAAO,MAAM,IAAI,EAAE,SAAS,GAAG,GAAG;AACtC,WAAO;AAAA,EACT;AAGA,QAAM,IAAI,IAAI,CAAC;AACf,QAAM,IAAI,IAAI,CAAC,EAAE,SAAS,MAAM,IAAI,CAAC,IAAI;AACzC,QAAM,IAAI,IAAI,IAAI,SAAS,CAAC,EAAE,SAAS,MAAM,IAAI,IAAI,SAAS,CAAC,IAAI;AAInE,MAAI,CAAC,UAAU,KAAK,CAAC,UAAU,GAAG;AAChC,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,GAAG,SAAS,CAAC,KAAK,SAAS,CAAC,GAAG,SAAS,CAAC;AAC1D,IAAE,QAAQ;AACV,QAAM,YAAY,MAAM,UAAU,OAAO,QAAM,CAAC,CAAC,KAAK,GAAG,EAAE,SAAS,GAAG,IAAI,CAAC;AAC5E,SAAO;AAEP,WAAS,WAAW;AAClB,WAAO,EAAE,MAAM,QAAQ,YAAY,EAAE;AAAA,EACvC;AAEA,WAAS,WAAW;AAClB,QAAI,CAAC,GAAG;AACN,aAAO;AAAA,IACT;AACA,QAAI,GAAG;AAEL,aAAO,GAAG,EAAE,KAAK,GAAG,IAAI,MAAM,EAAE;AAAA,IAClC;AACA,WAAO,EAAE;AAAA,EACX;AAEA,WAAS,WAAW;AAClB,WAAO,IAAI,EAAE,QAAQ;AAAA,EACvB;AAEA,WAAS,YAAY;AAEnB,QAAI,EAAE,MAAM,MAAM,mUAAmU,KACjV,EAAE,MAAM,MAAM,0UAA0U,GAAG;AAC7V,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAGA,WAAS,YAAY;AACnB,QAAI,CAAC,GAAG;AACN,aAAO;AAAA,IACT;AAEA,WAAO,EAAE,MAAM,MAAM,6FAA6F;AAAA,EACpH;AAEF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,38 @@
1
+ import assert from "node:assert";
2
+ import { MarcRecord } from "@natlibfi/marc-record";
3
+ import validatorFactory from "./modernize-502.js";
4
+ import { READERS } from "@natlibfi/fixura";
5
+ import generateTests from "@natlibfi/fixugen";
6
+ generateTests({
7
+ callback,
8
+ path: [import.meta.dirname, "..", "test-fixtures", "modernize-502"],
9
+ useMetadataFile: true,
10
+ recurse: false,
11
+ fixura: {
12
+ reader: READERS.JSON
13
+ },
14
+ hooks: {
15
+ before: async () => {
16
+ testValidatorFactory();
17
+ }
18
+ }
19
+ });
20
+ async function testValidatorFactory() {
21
+ const validator = await validatorFactory();
22
+ assert.equal(typeof validator, "object");
23
+ assert.equal(typeof validator.description, "string");
24
+ assert.equal(typeof validator.validate, "function");
25
+ }
26
+ async function callback({ getFixture, fix = false }) {
27
+ const validator = await validatorFactory();
28
+ const record = new MarcRecord(getFixture("record.json"));
29
+ const expectedResult = getFixture("expectedResult.json");
30
+ if (!fix) {
31
+ const result = await validator.validate(record);
32
+ assert.deepEqual(result, expectedResult);
33
+ return;
34
+ }
35
+ await validator.fix(record);
36
+ assert.deepEqual(record, expectedResult);
37
+ }
38
+ //# sourceMappingURL=modernize-502.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/modernize-502.test.js"],
4
+ "sourcesContent": ["import assert from 'node:assert';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './modernize-502.js';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\n//import createDebugLogger from 'debug';\n\ngenerateTests({\n callback,\n path: [import.meta.dirname, '..', 'test-fixtures', 'modernize-502'],\n useMetadataFile: true,\n recurse: false,\n fixura: {\n reader: READERS.JSON\n },\n hooks: {\n before: async () => {\n testValidatorFactory();\n }\n }\n});\n\n// const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/modernize-502: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, fix = false}) {\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;AAG1B,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;AAID,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,MAAM,MAAK,GAAG;AACjD,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,70 +1,49 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = _default;
7
- var _utils = require("./utils");
8
- // import createDebugLogger from 'debug';
9
- // import clone from 'clone';
10
- // const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:multiple-subfield-0');
11
-
12
- const asteriNamePrefixes = ['(FI-ASTERI-N)', '(FIN11)', 'http://urn.fi/URN:NBN:fi:au:finaf:', 'https://urn.fi/URN:NBN:fi:au:finaf:'];
13
- function _default() {
1
+ import { fieldHasSubfield, fieldToString } from "./utils.js";
2
+ const asteriNamePrefixes = ["(FI-ASTERI-N)", "(FIN11)", "http://urn.fi/URN:NBN:fi:au:finaf:", "https://urn.fi/URN:NBN:fi:au:finaf:"];
3
+ export default function() {
14
4
  return {
15
- description: 'If Asteri subfield $0 is found, remove non-Asteri $0 subfields',
5
+ description: "If Asteri subfield $0 is found, remove non-Asteri $0 subfields",
16
6
  validate,
17
7
  fix
18
8
  };
19
9
  function fix(record) {
20
10
  function fixField(field) {
21
11
  const removableSubfields = fieldGetDeletableSubfields(field);
22
- removableSubfields.forEach(sf => record.removeSubfield(sf, field)); // eslint-disable-line array-callback-return
12
+ removableSubfields.forEach((sf) => record.removeSubfield(sf, field));
23
13
  }
24
- const res = {
25
- message: [],
26
- fix: [],
27
- valid: true
28
- };
14
+ const res = { message: [], fix: [], valid: true };
29
15
  const relevantFields = getRelevantFields(record);
30
- relevantFields.forEach(field => fixField(field)); // eslint-disable-line array-callback-return
31
-
32
- // message.valid = !(message.message.length >= 1);
16
+ relevantFields.forEach((field) => fixField(field));
33
17
  return res;
34
18
  }
35
19
  function validate(record) {
36
20
  function validateField(field) {
37
21
  const relevantSubfields = fieldGetDeletableSubfields(field);
38
22
  if (relevantSubfields.length === 0) {
39
- return 'TROUBLE';
23
+ return "TROUBLE";
40
24
  }
41
- return `Field '${(0, _utils.fieldToString)(field)}' contains deletable $0 subfield(s): ${relevantSubfields.map(sf => sf.value).join(', ')}`;
25
+ return `Field '${fieldToString(field)}' contains deletable $0 subfield(s): ${relevantSubfields.map((sf) => sf.value).join(", ")}`;
42
26
  }
43
27
  const relevantFields = getRelevantFields(record);
44
- const messages = relevantFields.map(field => validateField(field));
45
- const res = {
46
- message: messages
47
- };
28
+ const messages = relevantFields.map((field) => validateField(field));
29
+ const res = { message: messages };
48
30
  res.valid = !(res.message.length >= 1);
49
31
  return res;
50
32
  }
51
33
  function fieldGetSubfields(field, code) {
52
- return field.subfields.filter(sf => sf.code === code);
34
+ return field.subfields.filter((sf) => sf.code === code);
53
35
  }
54
36
  function isDeletableNamePartID(value) {
55
- // List here $0s that always refer to name part, and to never to title part
56
37
  if (value.match(/(?:isni|orcid)/ui)) {
57
38
  return true;
58
39
  }
59
40
  return false;
60
41
  }
61
42
  function isAsteriNameId(value) {
62
- // This is true if have a valid Asteri entry (nine digits etc)
63
43
  const nineDigitTail = value.slice(-9);
64
44
  if (!/^[0-9]{9}$/u.test(nineDigitTail)) {
65
45
  return false;
66
46
  }
67
- // Normalize prefix:
68
47
  const currPrefix = value.slice(0, -9);
69
48
  if (asteriNamePrefixes.includes(currPrefix)) {
70
49
  return true;
@@ -75,35 +54,31 @@ function _default() {
75
54
  if (isAsteriNameId(value)) {
76
55
  return true;
77
56
  }
78
- const prefixes = ['(FIN', '(FI-'];
79
- if (prefixes.some(prefix => value.startsWith(prefix))) {
57
+ const prefixes = ["(FIN", "(FI-"];
58
+ if (prefixes.some((prefix) => value.startsWith(prefix))) {
80
59
  return true;
81
60
  }
82
61
  return false;
83
62
  }
84
63
  function fieldHasTitlePart(field) {
85
- if (['600', '610', '700', '710', '800', '810'].includes(field.tag)) {
86
- if ((0, _utils.fieldHasSubfield)(field, 't')) {
64
+ if (["600", "610", "700", "710", "800", "810"].includes(field.tag)) {
65
+ if (fieldHasSubfield(field, "t")) {
87
66
  return true;
88
67
  }
89
68
  }
90
69
  return false;
91
70
  }
92
71
  function fieldGetDeletableSubfields(field) {
93
- const subfield0s = fieldGetSubfields(field, '0');
72
+ const subfield0s = fieldGetSubfields(field, "0");
94
73
  if (subfield0s.length < 2) {
95
- return []; // We have nothing to delete
74
+ return [];
96
75
  }
97
-
98
- // Field must contain non-Asteri subfields and Asteri subfiels.
99
- const nonAsteriNameSubfields = subfield0s.filter(sf => !isAsteriNameId(sf.value));
76
+ const nonAsteriNameSubfields = subfield0s.filter((sf) => !isAsteriNameId(sf.value));
100
77
  if (nonAsteriNameSubfields.length === 0 || nonAsteriNameSubfields.length === subfield0s.length) {
101
78
  return [];
102
79
  }
103
- const suspiciousSubfields = nonAsteriNameSubfields.filter(sf => !neverDropThisID(sf.value));
104
-
105
- // Field has deletable name part $0s:
106
- const otherKnownNamePartIdentifiers = suspiciousSubfields.filter(sf => isDeletableNamePartID(sf.value));
80
+ const suspiciousSubfields = nonAsteriNameSubfields.filter((sf) => !neverDropThisID(sf.value));
81
+ const otherKnownNamePartIdentifiers = suspiciousSubfields.filter((sf) => isDeletableNamePartID(sf.value));
107
82
  if (fieldHasTitlePart(field)) {
108
83
  return otherKnownNamePartIdentifiers;
109
84
  }
@@ -114,7 +89,7 @@ function _default() {
114
89
  return subfields.length > 0;
115
90
  }
116
91
  function getRelevantFields(record) {
117
- return record.fields.filter(field => field.subfields && fieldIsRelevant(field));
92
+ return record.fields.filter((field) => field.subfields && fieldIsRelevant(field));
118
93
  }
119
94
  }
120
- //# sourceMappingURL=multiple-subfield-0.js.map
95
+ //# sourceMappingURL=multiple-subfield-0.js.map
@@ -1 +1,7 @@
1
- {"version":3,"file":"multiple-subfield-0.js","names":["_utils","require","asteriNamePrefixes","_default","description","validate","fix","record","fixField","field","removableSubfields","fieldGetDeletableSubfields","forEach","sf","removeSubfield","res","message","valid","relevantFields","getRelevantFields","validateField","relevantSubfields","length","fieldToString","map","value","join","messages","fieldGetSubfields","code","subfields","filter","isDeletableNamePartID","match","isAsteriNameId","nineDigitTail","slice","test","currPrefix","includes","neverDropThisID","prefixes","some","prefix","startsWith","fieldHasTitlePart","tag","fieldHasSubfield","subfield0s","nonAsteriNameSubfields","suspiciousSubfields","otherKnownNamePartIdentifiers","fieldIsRelevant","fields"],"sources":["../src/multiple-subfield-0.js"],"sourcesContent":["// import createDebugLogger from 'debug';\n// import clone from 'clone';\n// const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:multiple-subfield-0');\n\nimport {fieldHasSubfield, fieldToString} from './utils';\n\nconst asteriNamePrefixes = ['(FI-ASTERI-N)', '(FIN11)', 'http://urn.fi/URN:NBN:fi:au:finaf:', 'https://urn.fi/URN:NBN:fi:au:finaf:'];\n\nexport default function () {\n\n return {\n description: 'If Asteri subfield $0 is found, remove non-Asteri $0 subfields',\n validate, fix\n };\n\n function fix(record) {\n function fixField(field) {\n const removableSubfields = fieldGetDeletableSubfields(field);\n removableSubfields.forEach(sf => record.removeSubfield(sf, field)); // eslint-disable-line array-callback-return\n }\n\n const res = {message: [], fix: [], valid: true};\n\n const relevantFields = getRelevantFields(record);\n\n relevantFields.forEach(field => fixField(field)); // eslint-disable-line array-callback-return\n\n // message.valid = !(message.message.length >= 1);\n return res;\n }\n\n function validate(record) {\n function validateField(field) {\n const relevantSubfields = fieldGetDeletableSubfields(field);\n if (relevantSubfields.length === 0) {\n return 'TROUBLE';\n }\n return `Field '${fieldToString(field)}' contains deletable $0 subfield(s): ${relevantSubfields.map(sf => sf.value).join(', ')}`;\n }\n const relevantFields = getRelevantFields(record);\n const messages = relevantFields.map(field => validateField(field));\n const res = {message: messages};\n res.valid = !(res.message.length >= 1);\n return res;\n }\n\n function fieldGetSubfields(field, code) {\n return field.subfields.filter(sf => sf.code === code);\n }\n\n function isDeletableNamePartID(value) {\n // List here $0s that always refer to name part, and to never to title part\n if (value.match(/(?:isni|orcid)/ui)) {\n return true;\n }\n return false;\n }\n\n function isAsteriNameId(value) { // This is true if have a valid Asteri entry (nine digits etc)\n const nineDigitTail = value.slice(-9);\n if (!(/^[0-9]{9}$/u).test(nineDigitTail)) {\n return false;\n }\n // Normalize prefix:\n const currPrefix = value.slice(0, -9);\n\n if (asteriNamePrefixes.includes(currPrefix)) {\n return true;\n }\n return false;\n }\n\n function neverDropThisID(value) {\n if (isAsteriNameId(value)) {\n return true;\n }\n\n const prefixes = ['(FIN', '(FI-'];\n if (prefixes.some(prefix => value.startsWith(prefix))) {\n return true;\n }\n\n return false;\n }\n\n\n function fieldHasTitlePart(field) {\n if (['600', '610', '700', '710', '800', '810'].includes(field.tag)) {\n if (fieldHasSubfield(field, 't')) {\n return true;\n }\n }\n return false;\n }\n\n function fieldGetDeletableSubfields(field) {\n const subfield0s = fieldGetSubfields(field, '0');\n\n if (subfield0s.length < 2) {\n return []; // We have nothing to delete\n }\n\n // Field must contain non-Asteri subfields and Asteri subfiels.\n const nonAsteriNameSubfields = subfield0s.filter(sf => !isAsteriNameId(sf.value));\n if (nonAsteriNameSubfields.length === 0 || nonAsteriNameSubfields.length === subfield0s.length) {\n return [];\n }\n\n const suspiciousSubfields = nonAsteriNameSubfields.filter(sf => !neverDropThisID(sf.value));\n\n // Field has deletable name part $0s:\n const otherKnownNamePartIdentifiers = suspiciousSubfields.filter(sf => isDeletableNamePartID(sf.value));\n\n if (fieldHasTitlePart(field)) {\n return otherKnownNamePartIdentifiers;\n }\n\n return suspiciousSubfields;\n }\n\n function fieldIsRelevant(field) {\n const subfields = fieldGetDeletableSubfields(field);\n return subfields.length > 0;\n }\n\n function getRelevantFields(record) {\n return record.fields.filter(field => field.subfields && fieldIsRelevant(field));\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/multiple-subfield-0.js"],
4
+ "sourcesContent": ["// import createDebugLogger from 'debug';\n// import clone from 'clone';\n// const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:multiple-subfield-0');\n\nimport {fieldHasSubfield, fieldToString} from './utils.js';\n\nconst asteriNamePrefixes = ['(FI-ASTERI-N)', '(FIN11)', 'http://urn.fi/URN:NBN:fi:au:finaf:', 'https://urn.fi/URN:NBN:fi:au:finaf:'];\n\nexport default function () {\n\n return {\n description: 'If Asteri subfield $0 is found, remove non-Asteri $0 subfields',\n validate, fix\n };\n\n function fix(record) {\n function fixField(field) {\n const removableSubfields = fieldGetDeletableSubfields(field);\n removableSubfields.forEach(sf => record.removeSubfield(sf, field));\n }\n\n const res = {message: [], fix: [], valid: true};\n\n const relevantFields = getRelevantFields(record);\n\n relevantFields.forEach(field => fixField(field));\n\n // message.valid = !(message.message.length >= 1);\n return res;\n }\n\n function validate(record) {\n function validateField(field) {\n const relevantSubfields = fieldGetDeletableSubfields(field);\n if (relevantSubfields.length === 0) {\n return 'TROUBLE';\n }\n return `Field '${fieldToString(field)}' contains deletable $0 subfield(s): ${relevantSubfields.map(sf => sf.value).join(', ')}`;\n }\n const relevantFields = getRelevantFields(record);\n const messages = relevantFields.map(field => validateField(field));\n const res = {message: messages};\n res.valid = !(res.message.length >= 1);\n return res;\n }\n\n function fieldGetSubfields(field, code) {\n return field.subfields.filter(sf => sf.code === code);\n }\n\n function isDeletableNamePartID(value) {\n // List here $0s that always refer to name part, and to never to title part\n if (value.match(/(?:isni|orcid)/ui)) {\n return true;\n }\n return false;\n }\n\n function isAsteriNameId(value) { // This is true if have a valid Asteri entry (nine digits etc)\n const nineDigitTail = value.slice(-9);\n if (!(/^[0-9]{9}$/u).test(nineDigitTail)) {\n return false;\n }\n // Normalize prefix:\n const currPrefix = value.slice(0, -9);\n\n if (asteriNamePrefixes.includes(currPrefix)) {\n return true;\n }\n return false;\n }\n\n function neverDropThisID(value) {\n if (isAsteriNameId(value)) {\n return true;\n }\n\n const prefixes = ['(FIN', '(FI-'];\n if (prefixes.some(prefix => value.startsWith(prefix))) {\n return true;\n }\n\n return false;\n }\n\n\n function fieldHasTitlePart(field) {\n if (['600', '610', '700', '710', '800', '810'].includes(field.tag)) {\n if (fieldHasSubfield(field, 't')) {\n return true;\n }\n }\n return false;\n }\n\n function fieldGetDeletableSubfields(field) {\n const subfield0s = fieldGetSubfields(field, '0');\n\n if (subfield0s.length < 2) {\n return []; // We have nothing to delete\n }\n\n // Field must contain non-Asteri subfields and Asteri subfiels.\n const nonAsteriNameSubfields = subfield0s.filter(sf => !isAsteriNameId(sf.value));\n if (nonAsteriNameSubfields.length === 0 || nonAsteriNameSubfields.length === subfield0s.length) {\n return [];\n }\n\n const suspiciousSubfields = nonAsteriNameSubfields.filter(sf => !neverDropThisID(sf.value));\n\n // Field has deletable name part $0s:\n const otherKnownNamePartIdentifiers = suspiciousSubfields.filter(sf => isDeletableNamePartID(sf.value));\n\n if (fieldHasTitlePart(field)) {\n return otherKnownNamePartIdentifiers;\n }\n\n return suspiciousSubfields;\n }\n\n function fieldIsRelevant(field) {\n const subfields = fieldGetDeletableSubfields(field);\n return subfields.length > 0;\n }\n\n function getRelevantFields(record) {\n return record.fields.filter(field => field.subfields && fieldIsRelevant(field));\n }\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 "./multiple-subfield-0.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", "subfield0"],
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/multiple-subfield-0: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=multiple-subfield-0.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/multiple-subfield-0.test.js"],
4
+ "sourcesContent": ["import assert from 'node:assert';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './multiple-subfield-0.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', 'subfield0'],\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/multiple-subfield-0: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,WAAW;AAAA,EAC9D,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,mEAAmE;AAEnG,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,33 +1,14 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = _default;
7
- /**
8
- * Provides interface to validate and fix record fields, which include subfields that contain no-breaking space character
9
- * @returns {Object} Object containing interfaces required by marc-record-validators-melinda package
10
- */
11
- function _default() {
1
+ export default function() {
12
2
  return {
13
- description: 'Handles subfields that contains non-breaking space character',
3
+ description: "Handles subfields that contains non-breaking space character",
14
4
  validate,
15
5
  fix
16
6
  };
17
7
  function validate(record) {
18
- const nonValidFields = record.fields.filter(field => collectNonValidFields(field));
8
+ const nonValidFields = record.fields.filter((field) => collectNonValidFields(field));
19
9
  const valid = nonValidFields.length === 0;
20
- const messages = nonValidFields.flatMap(({
21
- tag,
22
- subfields
23
- }) => subfields.map(sf => `Field ${tag} subfield $${sf.code} contains non-breaking space character(s)`));
24
- return valid ? {
25
- valid,
26
- messages: []
27
- } : {
28
- valid,
29
- messages
30
- };
10
+ const messages = nonValidFields.flatMap(({ tag, subfields }) => subfields.map((sf) => `Field ${tag} subfield $${sf.code} contains non-breaking space character(s)`));
11
+ return valid ? { valid, messages: [] } : { valid, messages };
31
12
  function collectNonValidFields(field) {
32
13
  if (field.value) {
33
14
  return /\u00A0/u.test(field.value);
@@ -36,22 +17,20 @@ function _default() {
36
17
  }
37
18
  }
38
19
  function fix(record) {
39
- record.fields.forEach(field => {
20
+ record.fields.forEach((field) => {
40
21
  if (field.value) {
41
- field.value = field.value.replaceAll(/\u00A0/gu, ' ');
22
+ field.value = field.value.replaceAll(/\u00A0/gu, " ");
42
23
  return;
43
24
  }
44
- field.subfields.forEach(subfield => {
25
+ field.subfields.forEach((subfield) => {
45
26
  if (valueContainsNonBreakingSpace(subfield)) {
46
- subfield.value = subfield.value.replaceAll(/\u00A0/gu, ' ');
27
+ subfield.value = subfield.value.replaceAll(/\u00A0/gu, " ");
47
28
  }
48
29
  });
49
30
  });
50
31
  }
51
- function valueContainsNonBreakingSpace({
52
- value
53
- }) {
32
+ function valueContainsNonBreakingSpace({ value }) {
54
33
  return /\u00A0/u.test(value);
55
34
  }
56
35
  }
57
- //# sourceMappingURL=non-breaking-space.js.map
36
+ //# sourceMappingURL=non-breaking-space.js.map
@@ -1 +1,7 @@
1
- {"version":3,"file":"non-breaking-space.js","names":["_default","description","validate","fix","record","nonValidFields","fields","filter","field","collectNonValidFields","valid","length","messages","flatMap","tag","subfields","map","sf","code","value","test","valueContainsNonBreakingSpace","forEach","replaceAll","subfield"],"sources":["../src/non-breaking-space.js"],"sourcesContent":["/**\n * Provides interface to validate and fix record fields, which include subfields that contain no-breaking space character\n * @returns {Object} Object containing interfaces required by marc-record-validators-melinda package\n */\nexport default function () {\n return {\n description: 'Handles subfields that contains non-breaking space character',\n validate,\n fix\n };\n\n function validate(record) {\n const nonValidFields = record.fields.filter((field) => collectNonValidFields(field));\n\n const valid = nonValidFields.length === 0;\n const messages = nonValidFields.flatMap(({tag, subfields}) => subfields.map(sf => `Field ${tag} subfield $${sf.code} contains non-breaking space character(s)`));\n\n return valid ? {valid, messages: []} : {valid, messages};\n\n function collectNonValidFields(field) {\n if (field.value) {\n return (/\\u00A0/u).test(field.value);\n }\n\n return field.subfields.filter(valueContainsNonBreakingSpace).length > 0;\n }\n }\n\n function fix(record) {\n record.fields.forEach((field) => {\n if (field.value) {\n field.value = field.value.replaceAll(/\\u00A0/gu, ' ');\n return;\n }\n\n field.subfields.forEach(subfield => {\n if (valueContainsNonBreakingSpace(subfield)) {\n subfield.value = subfield.value.replaceAll(/\\u00A0/gu, ' ');\n }\n });\n });\n }\n\n function valueContainsNonBreakingSpace({value}) {\n return (/\\u00A0/u).test(value);\n }\n}\n"],"mappings":";;;;;;AAAA;AACA;AACA;AACA;AACe,SAAAA,SAAA,EAAY;EACzB,OAAO;IACLC,WAAW,EAAE,8DAA8D;IAC3EC,QAAQ;IACRC;EACF,CAAC;EAED,SAASD,QAAQA,CAACE,MAAM,EAAE;IACxB,MAAMC,cAAc,GAAGD,MAAM,CAACE,MAAM,CAACC,MAAM,CAAEC,KAAK,IAAKC,qBAAqB,CAACD,KAAK,CAAC,CAAC;IAEpF,MAAME,KAAK,GAAGL,cAAc,CAACM,MAAM,KAAK,CAAC;IACzC,MAAMC,QAAQ,GAAGP,cAAc,CAACQ,OAAO,CAAC,CAAC;MAACC,GAAG;MAAEC;IAAS,CAAC,KAAKA,SAAS,CAACC,GAAG,CAACC,EAAE,IAAI,SAASH,GAAG,cAAcG,EAAE,CAACC,IAAI,2CAA2C,CAAC,CAAC;IAEhK,OAAOR,KAAK,GAAG;MAACA,KAAK;MAAEE,QAAQ,EAAE;IAAE,CAAC,GAAG;MAACF,KAAK;MAAEE;IAAQ,CAAC;IAExD,SAASH,qBAAqBA,CAACD,KAAK,EAAE;MACpC,IAAIA,KAAK,CAACW,KAAK,EAAE;QACf,OAAQ,SAAS,CAAEC,IAAI,CAACZ,KAAK,CAACW,KAAK,CAAC;MACtC;MAEA,OAAOX,KAAK,CAACO,SAAS,CAACR,MAAM,CAACc,6BAA6B,CAAC,CAACV,MAAM,GAAG,CAAC;IACzE;EACF;EAEA,SAASR,GAAGA,CAACC,MAAM,EAAE;IACnBA,MAAM,CAACE,MAAM,CAACgB,OAAO,CAAEd,KAAK,IAAK;MAC/B,IAAIA,KAAK,CAACW,KAAK,EAAE;QACfX,KAAK,CAACW,KAAK,GAAGX,KAAK,CAACW,KAAK,CAACI,UAAU,CAAC,UAAU,EAAE,GAAG,CAAC;QACrD;MACF;MAEAf,KAAK,CAACO,SAAS,CAACO,OAAO,CAACE,QAAQ,IAAI;QAClC,IAAIH,6BAA6B,CAACG,QAAQ,CAAC,EAAE;UAC3CA,QAAQ,CAACL,KAAK,GAAGK,QAAQ,CAACL,KAAK,CAACI,UAAU,CAAC,UAAU,EAAE,GAAG,CAAC;QAC7D;MACF,CAAC,CAAC;IACJ,CAAC,CAAC;EACJ;EAEA,SAASF,6BAA6BA,CAAC;IAACF;EAAK,CAAC,EAAE;IAC9C,OAAQ,SAAS,CAAEC,IAAI,CAACD,KAAK,CAAC;EAChC;AACF","ignoreList":[]}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/non-breaking-space.js"],
4
+ "sourcesContent": ["/**\n * Provides interface to validate and fix record fields, which include subfields that contain no-breaking space character\n * @returns {Object} Object containing interfaces required by marc-record-validators-melinda package\n */\nexport default function () {\n return {\n description: 'Handles subfields that contains non-breaking space character',\n validate,\n fix\n };\n\n function validate(record) {\n const nonValidFields = record.fields.filter((field) => collectNonValidFields(field));\n\n const valid = nonValidFields.length === 0;\n const messages = nonValidFields.flatMap(({tag, subfields}) => subfields.map(sf => `Field ${tag} subfield $${sf.code} contains non-breaking space character(s)`));\n\n return valid ? {valid, messages: []} : {valid, messages};\n\n function collectNonValidFields(field) {\n if (field.value) {\n return (/\\u00A0/u).test(field.value);\n }\n\n return field.subfields.filter(valueContainsNonBreakingSpace).length > 0;\n }\n }\n\n function fix(record) {\n record.fields.forEach((field) => {\n if (field.value) {\n field.value = field.value.replaceAll(/\\u00A0/gu, ' ');\n return;\n }\n\n field.subfields.forEach(subfield => {\n if (valueContainsNonBreakingSpace(subfield)) {\n subfield.value = subfield.value.replaceAll(/\\u00A0/gu, ' ');\n }\n });\n });\n }\n\n function valueContainsNonBreakingSpace({value}) {\n return (/\\u00A0/u).test(value);\n }\n}\n"],
5
+ "mappings": "AAIA,0BAA2B;AACzB,SAAO;AAAA,IACL,aAAa;AAAA,IACb;AAAA,IACA;AAAA,EACF;AAEA,WAAS,SAAS,QAAQ;AACxB,UAAM,iBAAiB,OAAO,OAAO,OAAO,CAAC,UAAU,sBAAsB,KAAK,CAAC;AAEnF,UAAM,QAAQ,eAAe,WAAW;AACxC,UAAM,WAAW,eAAe,QAAQ,CAAC,EAAC,KAAK,UAAS,MAAM,UAAU,IAAI,QAAM,SAAS,GAAG,cAAc,GAAG,IAAI,2CAA2C,CAAC;AAE/J,WAAO,QAAQ,EAAC,OAAO,UAAU,CAAC,EAAC,IAAI,EAAC,OAAO,SAAQ;AAEvD,aAAS,sBAAsB,OAAO;AACpC,UAAI,MAAM,OAAO;AACf,eAAQ,UAAW,KAAK,MAAM,KAAK;AAAA,MACrC;AAEA,aAAO,MAAM,UAAU,OAAO,6BAA6B,EAAE,SAAS;AAAA,IACxE;AAAA,EACF;AAEA,WAAS,IAAI,QAAQ;AACnB,WAAO,OAAO,QAAQ,CAAC,UAAU;AAC/B,UAAI,MAAM,OAAO;AACf,cAAM,QAAQ,MAAM,MAAM,WAAW,YAAY,GAAG;AACpD;AAAA,MACF;AAEA,YAAM,UAAU,QAAQ,cAAY;AAClC,YAAI,8BAA8B,QAAQ,GAAG;AAC3C,mBAAS,QAAQ,SAAS,MAAM,WAAW,YAAY,GAAG;AAAA,QAC5D;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAEA,WAAS,8BAA8B,EAAC,MAAK,GAAG;AAC9C,WAAQ,UAAW,KAAK,KAAK;AAAA,EAC/B;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,38 @@
1
+ import assert from "node:assert";
2
+ import { MarcRecord } from "@natlibfi/marc-record";
3
+ import validatorFactory from "./non-breaking-space.js";
4
+ import { READERS } from "@natlibfi/fixura";
5
+ import generateTests from "@natlibfi/fixugen";
6
+ generateTests({
7
+ callback,
8
+ path: [import.meta.dirname, "..", "test-fixtures", "non-breaking-space"],
9
+ useMetadataFile: true,
10
+ recurse: false,
11
+ fixura: {
12
+ reader: READERS.JSON
13
+ },
14
+ hooks: {
15
+ before: async () => {
16
+ testValidatorFactory();
17
+ }
18
+ }
19
+ });
20
+ async function testValidatorFactory() {
21
+ const validator = await validatorFactory();
22
+ assert.equal(validator, "object");
23
+ assert.equal(validator.description, "string");
24
+ assert.equal(validator.validate, "function");
25
+ }
26
+ async function callback({ getFixture, fix = false }) {
27
+ const validator = await validatorFactory();
28
+ const record = new MarcRecord(getFixture("record.json"));
29
+ const expectedResult = getFixture("expectedResult.json");
30
+ if (!fix) {
31
+ const result = await validator.validate(record);
32
+ assert.deepEqual(result, expectedResult);
33
+ return;
34
+ }
35
+ await validator.fix(record);
36
+ assert.deepEqual(record, expectedResult);
37
+ }
38
+ //# sourceMappingURL=non-breaking-space.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/non-breaking-space.test.js"],
4
+ "sourcesContent": ["import assert from 'node:assert';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './non-breaking-space.js';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\n\ngenerateTests({\n callback,\n path: [import.meta.dirname, '..', 'test-fixtures', 'non-breaking-space'],\n useMetadataFile: true,\n recurse: false,\n fixura: {\n reader: READERS.JSON\n },\n hooks: {\n before: async () => {\n testValidatorFactory();\n }\n }\n});\n\nasync function testValidatorFactory() {\n const validator = await validatorFactory();\n\n assert.equal(validator, 'object');\n assert.equal(validator.description, 'string');\n assert.equal(validator.validate, 'function');\n}\n\nasync function callback({getFixture, fix = false}) {\n const validator = await validatorFactory();\n const record = new MarcRecord(getFixture('record.json'));\n const expectedResult = getFixture('expectedResult.json');\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;AAE1B,cAAc;AAAA,EACZ;AAAA,EACA,MAAM,CAAC,YAAY,SAAS,MAAM,iBAAiB,oBAAoB;AAAA,EACvE,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,eAAe,uBAAuB;AACpC,QAAM,YAAY,MAAM,iBAAiB;AAEzC,SAAO,MAAM,WAAW,QAAQ;AAChC,SAAO,MAAM,UAAU,aAAa,QAAQ;AAC5C,SAAO,MAAM,UAAU,UAAU,UAAU;AAC7C;AAEA,eAAe,SAAS,EAAC,YAAY,MAAM,MAAK,GAAG;AACjD,QAAM,YAAY,MAAM,iBAAiB;AACzC,QAAM,SAAS,IAAI,WAAW,WAAW,aAAa,CAAC;AACvD,QAAM,iBAAiB,WAAW,qBAAqB;AAEvD,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
+ }