@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
@@ -1 +1,7 @@
1
- {"version":3,"file":"translate-terms.js","names":["_clone","_interopRequireDefault","require","_debug","_utils","e","__esModule","default","debug","createDebugLogger","defaultTags","swapLanguageCode","changeAbbrHash","termCache","_default","description","validate","fix","record","newFields","getFields","forEach","nf","nvdebug","fieldToString","insertField","newFieldsAsStrings","map","f","message","valid","length","messages","tags","fieldsToAdd","currTag","remainingTags","missingFields","deriveMissingFields","tmp","getPairlessFinnishAndSwedishFields","tag","expectedLex","mapTagToLex","fields","get","finnishFields","filter","isRelevantField","swedishFields","finnishOnly","getMisses","swedishOnly","tagAndFieldAgree","field","lexData","getLexiconAndLanguage","lex","pairlessFields","prefLabels","i","getPrefLabel","pairField","undefined","lexAndLang","twoLetterOtherLang","swapLanguageCodeBetweenLanguages","changeAbbr","lang","prefLabel","find","l","sfA","value","sf0","clone","subfields","sf","code","sf2","newField","ind1","ind2","subfield2","uri","fieldToUri","getTermData","subfieldA","pl","abbr","swaggerQuery","getTermDataFromFinto","headers","uri2","response","fetch","method","ok","json","graph","arr","hit","row","subfield0","id","replace","fieldAsString","match","lexLang","fieldHasSubfield","fieldHasValidSubfield0","fieldList1","fieldList2","hasSubfield0Match","pairFields","some"],"sources":["../src/translate-terms.js"],"sourcesContent":["import clone from 'clone';\nimport createDebugLogger from 'debug';\nimport {fieldHasSubfield, fieldToString, nvdebug} from './utils';\n\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:translate-terms');\nconst defaultTags = ['648', '650', '651', '655'];\n\nconst swapLanguageCode = {'fin': 'swe', 'fi': 'sv', 'sv': 'fi', 'swe': 'fin'};\nconst changeAbbrHash = {'fi': 'fin', 'fin': 'fi', 'sv': 'swe', 'swe': 'sv'};\n\nconst termCache = {};\n\n// Author(s): Nicholas Volk\nexport default function () {\n\n\n return {\n description: 'Translate yso (648, 650, 651) and slm (655) terms (FIN <=> SWE)',\n validate, fix\n };\n\n async function fix(record) {\n const newFields = await getFields(record, defaultTags, []);\n\n newFields.forEach(nf => nvdebug(`Add new field '${fieldToString(nf)}'`, debug)); // eslint-disable-line array-callback-return\n\n newFields.forEach(nf => record.insertField(nf)); // eslint-disable-line array-callback-return\n\n const newFieldsAsStrings = newFields.map(f => fieldToString(f));\n\n\n return {message: [], fix: newFieldsAsStrings, valid: true};\n }\n\n async function validate(record) {\n const newFields = await getFields(record, defaultTags, []);\n if (newFields.length === 0) {\n return {'message': [], 'valid': true};\n }\n const messages = newFields.map(f => fieldToString(f));\n\n return {'message': messages, 'valid': false};\n }\n\n async function getFields(record, tags, fieldsToAdd) {\n const [currTag, ...remainingTags] = tags;\n if (!currTag) {\n return fieldsToAdd;\n }\n const missingFields = await deriveMissingFields(record, currTag);\n\n const tmp = await getFields(record, remainingTags, [...fieldsToAdd, ...missingFields]);\n return tmp;\n }\n\n function getPairlessFinnishAndSwedishFields(record, tag) {\n const expectedLex = mapTagToLex(tag);\n if (!expectedLex) {\n return [];\n }\n const fields = record.get(tag);\n const finnishFields = fields.filter(f => isRelevantField(f, 'fin'));\n const swedishFields = fields.filter(f => isRelevantField(f, 'swe'));\n const finnishOnly = getMisses(finnishFields, swedishFields);\n const swedishOnly = getMisses(swedishFields, finnishFields);\n\n //console.log(` Looking at ${finnishOnly.length} + ${swedishOnly.length} fields`); // eslint-disable-line no-console\n return [...finnishOnly, ...swedishOnly].filter(f => tagAndFieldAgree(f));\n\n function tagAndFieldAgree(field) {\n // Check that tag and $2 value are pairable:\n const lexData = getLexiconAndLanguage(field); // $2 data\n return expectedLex === lexData.lex;\n }\n }\n\n async function deriveMissingFields(record, tag) {\n const pairlessFields = getPairlessFinnishAndSwedishFields(record, tag);\n\n // Dunno how to handle loop+promise combo in our normal coding style. Spent half a day trying... (I reckon it takes like 2 minuts to do this properly...)\n let prefLabels = [];\n for (let i=0; i < pairlessFields.length; i += 1) {\n prefLabels[i] = await getPrefLabel(pairlessFields[i]);\n }\n\n const missingFields = pairlessFields.map((f, i) => pairField(f, prefLabels[i]));\n return missingFields.filter(f => f);\n }\n\n function pairField(field, prefLabels) {\n if (!prefLabels) {\n return undefined;\n }\n //console.log(`pairField() WP 1: ${fieldToString(field)}`); // eslint-disable-line no-console\n const lexAndLang = getLexiconAndLanguage(field);\n //console.log(`pairField() WP 2: ${JSON.stringify(lexAndLang)}`); // eslint-disable-line no-console\n const twoLetterOtherLang = swapLanguageCodeBetweenLanguages(changeAbbr(lexAndLang.lang));\n const prefLabel = prefLabels.find(l => l.lang === twoLetterOtherLang);\n //console.log(`pairField() WP 4: ${JSON.stringify(prefLabel)}`); // eslint-disable-line no-console\n const sfA = {'code': 'a', 'value': prefLabel.value}; // field.subfields.field(sf => sf.code === 'a');\n const sf0 = clone(field.subfields.find(sf => sf.code === '0'));\n const sf2 = {'code': '2', 'value': `${lexAndLang.lex}/${lexAndLang.lang === 'fin' ? 'swe' : 'fin'}`}; // swap fin <=> swe\n const newField = {tag: field.tag, ind1: field.ind1, ind2: field.ind2, subfields: [sfA, sf2, sf0]};\n return newField;\n }\n\n function getLexiconAndLanguage(field) {\n const subfield2 = field.subfields.find(sf => sf.code === '2');\n if (subfield2.value === 'slm/fin') {\n return {'lex': 'slm', 'lang': 'fin'};\n }\n if (subfield2.value === 'slm/swe') {\n return {'lex': 'slm', 'lang': 'swe'};\n }\n if (subfield2.value === 'yso/fin') {\n return {'lex': 'yso', 'lang': 'fin'};\n }\n if (subfield2.value === 'yso/swe') {\n return {'lex': 'yso', 'lang': 'swe'};\n }\n return {};\n }\n\n async function getPrefLabel(field) {\n // Tag vs $2 correlation has already been checked!\n const uri = fieldToUri(field);\n if (!uri) { // $0 is invalid or sumthing\n return undefined;\n }\n const prefLabels = await getTermData(uri);\n if (!prefLabels) { // Sanity check. Miss caused by illegal id etc.\n nvdebug(`No labels found for ${uri}`, debug);\n return undefined;\n }\n const lexData = getLexiconAndLanguage(field); // $2 data\n const lang = changeAbbr(lexData.lang);\n\n\n const subfieldA = field.subfields.find(sf => sf.code === 'a');\n\n const prefLabel = prefLabels.find(pl => pl.lang === lang);\n //console.info(`Compare prefLabel '${prefLabel.value}' AND $a '${subfieldA.value}'`); // eslint-disable-line no-console\n if (prefLabel.value === subfieldA.value) {\n nvdebug(`'${fieldToString(field)}' requires translating`, debug);\n return prefLabels;\n }\n return undefined;\n }\n\n function swapLanguageCodeBetweenLanguages(code) {\n if (swapLanguageCode[code]) {\n return swapLanguageCode[code];\n }\n return code;\n }\n\n function changeAbbr(abbr) {\n if (changeAbbrHash[abbr]) {\n return changeAbbrHash[abbr];\n }\n return abbr;\n }\n\n function swaggerQuery(uri) {\n // This would work for only yso, not yso-paikat etc `https://api.finto.fi/rest/v1/yso/data?format=application%2Fjson&uri=${uri}`;\n return `https://api.finto.fi/rest/v1/data?uri=${uri}&format=application%2Fjson`; // This is simpler, but contains more irrelevant data\n }\n\n async function getTermData(uri) {\n //console.log(`getTermData(${uri})`); // eslint-disable-line no-console\n if (termCache[uri]) { // Don't think current implementation uses the cache any more.\n //console.log(`CACHED ${uri}`); // eslint-disable-line no-console\n return termCache[uri];\n }\n const tmp = await getTermDataFromFinto(uri);\n termCache[uri] = tmp;\n return tmp;\n }\n\n async function getTermDataFromFinto(uri) {\n const headers = {'Accept': 'application/json'};\n const uri2 = swaggerQuery(uri);\n\n const response = await fetch(uri2, {method: 'GET', headers});\n if (!response.ok) {\n return undefined;\n }\n const json = await response.json();\n\n if (!json.graph) {\n return undefined;\n }\n const arr = json.graph;\n const [hit] = arr.filter(row => row.uri === uri);\n //console.log(`NEW JSON: ${JSON.stringify(hit.prefLabel)}`); // eslint-disable-line no-console\n return hit.prefLabel;\n }\n\n\n function fieldToUri(field) {\n const lex = mapTagToLex(field.tag);\n\n const subfield0 = field.subfields.find(sf => sf.code === '0');\n const id = subfield0.value.replace(/^[^0-9]+/u, '');\n if (lex === 'yso') {\n //return `http%3A%2F%2Fwww.yso.fi%2Fonto%2Fyso%2Fp${id}`;\n return `http://www.yso.fi/onto/yso/p${id}`;\n }\n if (lex === 'slm') {\n return `http://urn.fi/URN:NBN:fi:au:slm:s${id}`;\n }\n return undefined;\n }\n\n function isRelevantField(field, lang) {\n const fieldAsString = fieldToString(field);\n\n // We should probably allow an optional $8 as the first subfield.\n if (!fieldAsString.match(/^... #7 ‡a [^‡]+ ‡2 [^‡]+ ‡0 [^‡]+(?: ‡9 [A-Z]+<(?:KEEP|DROP)>)*$/u)) {\n return false;\n }\n const lex = mapTagToLex(field.tag);\n const lexLang = `${lex}/${lang}`;\n if (!fieldHasSubfield(field, '2', lexLang)) {\n return false;\n }\n return fieldHasValidSubfield0(field);\n }\n\n function fieldHasValidSubfield0(field) {\n const lex = mapTagToLex(field.tag);\n const subfield0 = field.subfields.find(sf => sf.code === '0');\n if (lex === 'yso' && subfield0.value.match(/^http:\\/\\/www\\.yso\\.fi\\/onto\\/yso\\/p[0-9]+$/u)) {\n return true;\n }\n if (lex === 'slm' && subfield0.value.match(/^http:\\/\\/urn\\.fi\\/URN:NBN:fi:au:slm:s[0-9]+$/u)) {\n return true;\n }\n return false;\n }\n\n function getMisses(fieldList1, fieldList2) {\n return fieldList1.filter(f => !hasSubfield0Match(f, fieldList2));\n }\n\n function hasSubfield0Match(field, pairFields) {\n const subfield0 = field.subfields.find(sf => sf.code === '0');\n return pairFields.some(f => f.subfields.some(sf => sf.code === '0' && sf.value === subfield0.value));\n }\n\n\n function mapTagToLex(tag) {\n if (tag === '655') {\n return 'slm';\n }\n return 'yso';\n }\n\n\n /*\n function getValidIdentifiers(record, tag, lang) {\n const lex = mapTagToLex(tag);\n const subfield2Value = `${lex}/${lang}`;\n const candFields = record.get(tag).filter(f => f.subfields.some(sf => sf.code === '2' && sf.value === subfield2Value)); // TODO: filter\n return [];\n }\n */\n\n}\n\n"],"mappings":"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","ignoreList":[]}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/translate-terms.js"],
4
+ "sourcesContent": ["import clone from 'clone';\nimport createDebugLogger from 'debug';\nimport {fieldHasSubfield, fieldToString, nvdebug} from './utils.js';\n\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:translate-terms');\nconst defaultTags = ['648', '650', '651', '655'];\n\nconst swapLanguageCode = {'fin': 'swe', 'fi': 'sv', 'sv': 'fi', 'swe': 'fin'};\nconst changeAbbrHash = {'fi': 'fin', 'fin': 'fi', 'sv': 'swe', 'swe': 'sv'};\n\nconst termCache = {};\n\n// Author(s): Nicholas Volk\nexport default function () {\n\n\n return {\n description: 'Translate yso (648, 650, 651) and slm (655) terms (FIN <=> SWE)',\n validate, fix\n };\n\n async function fix(record) {\n const newFields = await getFields(record, defaultTags, []);\n\n newFields.forEach(nf => nvdebug(`Add new field '${fieldToString(nf)}'`, debug));\n\n newFields.forEach(nf => record.insertField(nf));\n\n const newFieldsAsStrings = newFields.map(f => fieldToString(f));\n\n\n return {message: [], fix: newFieldsAsStrings, valid: true};\n }\n\n async function validate(record) {\n const newFields = await getFields(record, defaultTags, []);\n if (newFields.length === 0) {\n return {'message': [], 'valid': true};\n }\n const messages = newFields.map(f => fieldToString(f));\n\n return {'message': messages, 'valid': false};\n }\n\n async function getFields(record, tags, fieldsToAdd) {\n const [currTag, ...remainingTags] = tags;\n if (!currTag) {\n return fieldsToAdd;\n }\n const missingFields = await deriveMissingFields(record, currTag);\n\n const tmp = await getFields(record, remainingTags, [...fieldsToAdd, ...missingFields]);\n return tmp;\n }\n\n function getPairlessFinnishAndSwedishFields(record, tag) {\n const expectedLex = mapTagToLex(tag);\n if (!expectedLex) {\n return [];\n }\n const fields = record.get(tag);\n const finnishFields = fields.filter(f => isRelevantField(f, 'fin'));\n const swedishFields = fields.filter(f => isRelevantField(f, 'swe'));\n const finnishOnly = getMisses(finnishFields, swedishFields);\n const swedishOnly = getMisses(swedishFields, finnishFields);\n\n //console.log(` Looking at ${finnishOnly.length} + ${swedishOnly.length} fields`); // eslint-disable-line no-console\n return [...finnishOnly, ...swedishOnly].filter(f => tagAndFieldAgree(f));\n\n function tagAndFieldAgree(field) {\n // Check that tag and $2 value are pairable:\n const lexData = getLexiconAndLanguage(field); // $2 data\n return expectedLex === lexData.lex;\n }\n }\n\n async function deriveMissingFields(record, tag) {\n const pairlessFields = getPairlessFinnishAndSwedishFields(record, tag);\n\n // Dunno how to handle loop+promise combo in our normal coding style. Spent half a day trying... (I reckon it takes like 2 minuts to do this properly...)\n let prefLabels = [];\n for (let i=0; i < pairlessFields.length; i += 1) {\n prefLabels[i] = await getPrefLabel(pairlessFields[i]);\n }\n\n const missingFields = pairlessFields.map((f, i) => pairField(f, prefLabels[i]));\n return missingFields.filter(f => f);\n }\n\n function pairField(field, prefLabels) {\n if (!prefLabels) {\n return undefined;\n }\n //console.log(`pairField() WP 1: ${fieldToString(field)}`); // eslint-disable-line no-console\n const lexAndLang = getLexiconAndLanguage(field);\n //console.log(`pairField() WP 2: ${JSON.stringify(lexAndLang)}`); // eslint-disable-line no-console\n const twoLetterOtherLang = swapLanguageCodeBetweenLanguages(changeAbbr(lexAndLang.lang));\n const prefLabel = prefLabels.find(l => l.lang === twoLetterOtherLang);\n //console.log(`pairField() WP 4: ${JSON.stringify(prefLabel)}`); // eslint-disable-line no-console\n const sfA = {'code': 'a', 'value': prefLabel.value}; // field.subfields.field(sf => sf.code === 'a');\n const sf0 = clone(field.subfields.find(sf => sf.code === '0'));\n const sf2 = {'code': '2', 'value': `${lexAndLang.lex}/${lexAndLang.lang === 'fin' ? 'swe' : 'fin'}`}; // swap fin <=> swe\n const newField = {tag: field.tag, ind1: field.ind1, ind2: field.ind2, subfields: [sfA, sf2, sf0]};\n return newField;\n }\n\n function getLexiconAndLanguage(field) {\n const subfield2 = field.subfields.find(sf => sf.code === '2');\n if (subfield2.value === 'slm/fin') {\n return {'lex': 'slm', 'lang': 'fin'};\n }\n if (subfield2.value === 'slm/swe') {\n return {'lex': 'slm', 'lang': 'swe'};\n }\n if (subfield2.value === 'yso/fin') {\n return {'lex': 'yso', 'lang': 'fin'};\n }\n if (subfield2.value === 'yso/swe') {\n return {'lex': 'yso', 'lang': 'swe'};\n }\n return {};\n }\n\n async function getPrefLabel(field) {\n // Tag vs $2 correlation has already been checked!\n const uri = fieldToUri(field);\n if (!uri) { // $0 is invalid or sumthing\n return undefined;\n }\n const prefLabels = await getTermData(uri);\n if (!prefLabels) { // Sanity check. Miss caused by illegal id etc.\n nvdebug(`No labels found for ${uri}`, debug);\n return undefined;\n }\n const lexData = getLexiconAndLanguage(field); // $2 data\n const lang = changeAbbr(lexData.lang);\n\n\n const subfieldA = field.subfields.find(sf => sf.code === 'a');\n\n const prefLabel = prefLabels.find(pl => pl.lang === lang);\n //console.info(`Compare prefLabel '${prefLabel.value}' AND $a '${subfieldA.value}'`); // eslint-disable-line no-console\n if (prefLabel.value === subfieldA.value) {\n nvdebug(`'${fieldToString(field)}' requires translating`, debug);\n return prefLabels;\n }\n return undefined;\n }\n\n function swapLanguageCodeBetweenLanguages(code) {\n if (swapLanguageCode[code]) {\n return swapLanguageCode[code];\n }\n return code;\n }\n\n function changeAbbr(abbr) {\n if (changeAbbrHash[abbr]) {\n return changeAbbrHash[abbr];\n }\n return abbr;\n }\n\n function swaggerQuery(uri) {\n // This would work for only yso, not yso-paikat etc `https://api.finto.fi/rest/v1/yso/data?format=application%2Fjson&uri=${uri}`;\n return `https://api.finto.fi/rest/v1/data?uri=${uri}&format=application%2Fjson`; // This is simpler, but contains more irrelevant data\n }\n\n async function getTermData(uri) {\n //console.log(`getTermData(${uri})`); // eslint-disable-line no-console\n if (termCache[uri]) { // Don't think current implementation uses the cache any more.\n //console.log(`CACHED ${uri}`); // eslint-disable-line no-console\n return termCache[uri];\n }\n const tmp = await getTermDataFromFinto(uri);\n termCache[uri] = tmp;\n return tmp;\n }\n\n async function getTermDataFromFinto(uri) {\n const headers = {'Accept': 'application/json'};\n const uri2 = swaggerQuery(uri);\n\n const response = await fetch(uri2, {method: 'GET', headers});\n if (!response.ok) {\n return undefined;\n }\n const json = await response.json();\n\n if (!json.graph) {\n return undefined;\n }\n const arr = json.graph;\n const [hit] = arr.filter(row => row.uri === uri);\n //console.log(`NEW JSON: ${JSON.stringify(hit.prefLabel)}`); // eslint-disable-line no-console\n return hit.prefLabel;\n }\n\n\n function fieldToUri(field) {\n const lex = mapTagToLex(field.tag);\n\n const subfield0 = field.subfields.find(sf => sf.code === '0');\n const id = subfield0.value.replace(/^[^0-9]+/u, '');\n if (lex === 'yso') {\n //return `http%3A%2F%2Fwww.yso.fi%2Fonto%2Fyso%2Fp${id}`;\n return `http://www.yso.fi/onto/yso/p${id}`;\n }\n if (lex === 'slm') {\n return `http://urn.fi/URN:NBN:fi:au:slm:s${id}`;\n }\n return undefined;\n }\n\n function isRelevantField(field, lang) {\n const fieldAsString = fieldToString(field);\n\n // We should probably allow an optional $8 as the first subfield.\n if (!fieldAsString.match(/^... #7 \u2021a [^\u2021]+ \u20212 [^\u2021]+ \u20210 [^\u2021]+(?: \u20219 [A-Z]+<(?:KEEP|DROP)>)*$/u)) {\n return false;\n }\n const lex = mapTagToLex(field.tag);\n const lexLang = `${lex}/${lang}`;\n if (!fieldHasSubfield(field, '2', lexLang)) {\n return false;\n }\n return fieldHasValidSubfield0(field);\n }\n\n function fieldHasValidSubfield0(field) {\n const lex = mapTagToLex(field.tag);\n const subfield0 = field.subfields.find(sf => sf.code === '0');\n if (lex === 'yso' && subfield0.value.match(/^http:\\/\\/www\\.yso\\.fi\\/onto\\/yso\\/p[0-9]+$/u)) {\n return true;\n }\n if (lex === 'slm' && subfield0.value.match(/^http:\\/\\/urn\\.fi\\/URN:NBN:fi:au:slm:s[0-9]+$/u)) {\n return true;\n }\n return false;\n }\n\n function getMisses(fieldList1, fieldList2) {\n return fieldList1.filter(f => !hasSubfield0Match(f, fieldList2));\n }\n\n function hasSubfield0Match(field, pairFields) {\n const subfield0 = field.subfields.find(sf => sf.code === '0');\n return pairFields.some(f => f.subfields.some(sf => sf.code === '0' && sf.value === subfield0.value));\n }\n\n\n function mapTagToLex(tag) {\n if (tag === '655') {\n return 'slm';\n }\n return 'yso';\n }\n\n\n /*\n function getValidIdentifiers(record, tag, lang) {\n const lex = mapTagToLex(tag);\n const subfield2Value = `${lex}/${lang}`;\n const candFields = record.get(tag).filter(f => f.subfields.some(sf => sf.code === '2' && sf.value === subfield2Value)); // TODO: filter\n return [];\n }\n */\n\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 "./translate-terms.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", "translate-terms"],
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/translate-terms: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=translate-terms.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/translate-terms.test.js"],
4
+ "sourcesContent": ["import assert from 'node:assert';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './translate-terms.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', 'translate-terms'],\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/translate-terms: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,iBAAiB;AAAA,EACpE,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,+DAA+D;AAE/F,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,15 +1,8 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = _default;
7
- var _debug = _interopRequireDefault(require("debug"));
8
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
9
- const debug = (0, _debug.default)('@natlibfi/marc-record-validators-melinda/typeOfDate-008');
10
- function _default() {
1
+ import createDebugLogger from "debug";
2
+ const debug = createDebugLogger("@natlibfi/marc-record-validators-melinda/typeOfDate-008");
3
+ export default function() {
11
4
  return {
12
- description: 'Validates 008 06',
5
+ description: "Validates 008 06",
13
6
  validate,
14
7
  fix
15
8
  };
@@ -17,25 +10,17 @@ function _default() {
17
10
  const [f008] = record.get(/008/u);
18
11
  const c06 = f008.value.substring(6, 7);
19
12
  const c1114 = f008.value.substring(11, 15);
20
- // if 008 06 = s, and 11-14 = #### (not year/digits)
21
- if (c06 === 't' && !/[0-9u]{4}/u.test(c1114)) {
22
- debug('is t and not valid 1114');
23
- return {
24
- valid: false,
25
- message: 'Invalid 008 06'
26
- };
13
+ if (c06 === "t" && !/[0-9u]{4}/u.test(c1114)) {
14
+ debug("is t and not valid 1114");
15
+ return { valid: false, message: "Invalid 008 06" };
27
16
  }
28
- return {
29
- valid: true
30
- };
17
+ return { valid: true };
31
18
  }
32
19
  function fix(record) {
33
- // LDR/06=t ja 11-14=####, niin LDR/06 muutetaan s:ksi
34
20
  const [f008] = record.pop(/008/u);
35
21
  const c06 = f008.value.substring(6, 7);
36
22
  const c1114 = f008.value.substring(11, 15);
37
- // if 008 06 = s, and 11-14 = #### (not year/digits)
38
- if (c06 === 't' && !/[0-9u]{4}/u.test(c1114)) {
23
+ if (c06 === "t" && !/[0-9u]{4}/u.test(c1114)) {
39
24
  f008.value = `${f008.value.substring(0, 6)}s${f008.value.substring(7)}`;
40
25
  record.insertField(f008);
41
26
  return true;
@@ -44,4 +29,4 @@ function _default() {
44
29
  return true;
45
30
  }
46
31
  }
47
- //# sourceMappingURL=typeOfDate-008.js.map
32
+ //# sourceMappingURL=typeOfDate-008.js.map
@@ -1 +1,7 @@
1
- {"version":3,"file":"typeOfDate-008.js","names":["_debug","_interopRequireDefault","require","e","__esModule","default","debug","createDebugLogger","_default","description","validate","fix","record","f008","get","c06","value","substring","c1114","test","valid","message","pop","insertField"],"sources":["../src/typeOfDate-008.js"],"sourcesContent":["import createDebugLogger from 'debug';\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/typeOfDate-008');\n\nexport default function () {\n return {\n description: 'Validates 008 06',\n validate,\n fix\n };\n\n function validate(record) {\n const [f008] = record.get(/008/u);\n const c06 = f008.value.substring(6, 7);\n const c1114 = f008.value.substring(11, 15);\n // if 008 06 = s, and 11-14 = #### (not year/digits)\n if (c06 === 't' && !(/[0-9u]{4}/u).test(c1114)) {\n debug('is t and not valid 1114');\n return {valid: false, message: 'Invalid 008 06'};\n }\n\n return {valid: true};\n }\n\n function fix(record) {\n // LDR/06=t ja 11-14=####, niin LDR/06 muutetaan s:ksi\n const [f008] = record.pop(/008/u);\n const c06 = f008.value.substring(6, 7);\n const c1114 = f008.value.substring(11, 15);\n // if 008 06 = s, and 11-14 = #### (not year/digits)\n if (c06 === 't' && !(/[0-9u]{4}/u).test(c1114)) {\n f008.value = `${f008.value.substring(0, 6)}s${f008.value.substring(7)}`;\n record.insertField(f008);\n return true;\n }\n\n record.insertField(f008);\n return true;\n }\n}\n"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AAAsC,SAAAD,uBAAAE,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAEtC,MAAMG,KAAK,GAAG,IAAAC,cAAiB,EAAC,yDAAyD,CAAC;AAE3E,SAAAC,SAAA,EAAY;EACzB,OAAO;IACLC,WAAW,EAAE,kBAAkB;IAC/BC,QAAQ;IACRC;EACF,CAAC;EAED,SAASD,QAAQA,CAACE,MAAM,EAAE;IACxB,MAAM,CAACC,IAAI,CAAC,GAAGD,MAAM,CAACE,GAAG,CAAC,MAAM,CAAC;IACjC,MAAMC,GAAG,GAAGF,IAAI,CAACG,KAAK,CAACC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC;IACtC,MAAMC,KAAK,GAAGL,IAAI,CAACG,KAAK,CAACC,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC;IAC1C;IACA,IAAIF,GAAG,KAAK,GAAG,IAAI,CAAE,YAAY,CAAEI,IAAI,CAACD,KAAK,CAAC,EAAE;MAC9CZ,KAAK,CAAC,yBAAyB,CAAC;MAChC,OAAO;QAACc,KAAK,EAAE,KAAK;QAAEC,OAAO,EAAE;MAAgB,CAAC;IAClD;IAEA,OAAO;MAACD,KAAK,EAAE;IAAI,CAAC;EACtB;EAEA,SAAST,GAAGA,CAACC,MAAM,EAAE;IACnB;IACA,MAAM,CAACC,IAAI,CAAC,GAAGD,MAAM,CAACU,GAAG,CAAC,MAAM,CAAC;IACjC,MAAMP,GAAG,GAAGF,IAAI,CAACG,KAAK,CAACC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC;IACtC,MAAMC,KAAK,GAAGL,IAAI,CAACG,KAAK,CAACC,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC;IAC1C;IACA,IAAIF,GAAG,KAAK,GAAG,IAAI,CAAE,YAAY,CAAEI,IAAI,CAACD,KAAK,CAAC,EAAE;MAC9CL,IAAI,CAACG,KAAK,GAAG,GAAGH,IAAI,CAACG,KAAK,CAACC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,IAAIJ,IAAI,CAACG,KAAK,CAACC,SAAS,CAAC,CAAC,CAAC,EAAE;MACvEL,MAAM,CAACW,WAAW,CAACV,IAAI,CAAC;MACxB,OAAO,IAAI;IACb;IAEAD,MAAM,CAACW,WAAW,CAACV,IAAI,CAAC;IACxB,OAAO,IAAI;EACb;AACF","ignoreList":[]}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/typeOfDate-008.js"],
4
+ "sourcesContent": ["import createDebugLogger from 'debug';\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/typeOfDate-008');\n\nexport default function () {\n return {\n description: 'Validates 008 06',\n validate,\n fix\n };\n\n function validate(record) {\n const [f008] = record.get(/008/u);\n const c06 = f008.value.substring(6, 7);\n const c1114 = f008.value.substring(11, 15);\n // if 008 06 = s, and 11-14 = #### (not year/digits)\n if (c06 === 't' && !(/[0-9u]{4}/u).test(c1114)) {\n debug('is t and not valid 1114');\n return {valid: false, message: 'Invalid 008 06'};\n }\n\n return {valid: true};\n }\n\n function fix(record) {\n // LDR/06=t ja 11-14=####, niin LDR/06 muutetaan s:ksi\n const [f008] = record.pop(/008/u);\n const c06 = f008.value.substring(6, 7);\n const c1114 = f008.value.substring(11, 15);\n // if 008 06 = s, and 11-14 = #### (not year/digits)\n if (c06 === 't' && !(/[0-9u]{4}/u).test(c1114)) {\n f008.value = `${f008.value.substring(0, 6)}s${f008.value.substring(7)}`;\n record.insertField(f008);\n return true;\n }\n\n record.insertField(f008);\n return true;\n }\n}\n"],
5
+ "mappings": "AAAA,OAAO,uBAAuB;AAE9B,MAAM,QAAQ,kBAAkB,yDAAyD;AAEzF,0BAA2B;AACzB,SAAO;AAAA,IACL,aAAa;AAAA,IACb;AAAA,IACA;AAAA,EACF;AAEA,WAAS,SAAS,QAAQ;AACxB,UAAM,CAAC,IAAI,IAAI,OAAO,IAAI,MAAM;AAChC,UAAM,MAAM,KAAK,MAAM,UAAU,GAAG,CAAC;AACrC,UAAM,QAAQ,KAAK,MAAM,UAAU,IAAI,EAAE;AAEzC,QAAI,QAAQ,OAAO,CAAE,aAAc,KAAK,KAAK,GAAG;AAC9C,YAAM,yBAAyB;AAC/B,aAAO,EAAC,OAAO,OAAO,SAAS,iBAAgB;AAAA,IACjD;AAEA,WAAO,EAAC,OAAO,KAAI;AAAA,EACrB;AAEA,WAAS,IAAI,QAAQ;AAEnB,UAAM,CAAC,IAAI,IAAI,OAAO,IAAI,MAAM;AAChC,UAAM,MAAM,KAAK,MAAM,UAAU,GAAG,CAAC;AACrC,UAAM,QAAQ,KAAK,MAAM,UAAU,IAAI,EAAE;AAEzC,QAAI,QAAQ,OAAO,CAAE,aAAc,KAAK,KAAK,GAAG;AAC9C,WAAK,QAAQ,GAAG,KAAK,MAAM,UAAU,GAAG,CAAC,CAAC,IAAI,KAAK,MAAM,UAAU,CAAC,CAAC;AACrE,aAAO,YAAY,IAAI;AACvB,aAAO;AAAA,IACT;AAEA,WAAO,YAAY,IAAI;AACvB,WAAO;AAAA,EACT;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,40 @@
1
+ import assert from "node:assert";
2
+ import { MarcRecord } from "@natlibfi/marc-record";
3
+ import validatorFactory from "./typeOfDate-008.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", "typeOfDate-008"],
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/typeOfDate-008: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, fix = false }) {
29
+ const validator = await validatorFactory();
30
+ const record = new MarcRecord(getFixture("record.json"));
31
+ const expectedResult = getFixture("expectedResult.json");
32
+ if (!fix) {
33
+ const result = await validator.validate(record);
34
+ assert.deepEqual(result, expectedResult);
35
+ return;
36
+ }
37
+ await validator.fix(record);
38
+ assert.deepEqual(record, expectedResult);
39
+ }
40
+ //# sourceMappingURL=typeOfDate-008.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/typeOfDate-008.test.js"],
4
+ "sourcesContent": ["import assert from 'node:assert';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './typeOfDate-008.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', 'typeOfDate-008'],\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/typeOfDate-008:test'); // eslint-disable-line\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;AAC1B,OAAO,uBAAuB;AAE9B,cAAc;AAAA,EACZ;AAAA,EACA,MAAM,CAAC,YAAY,SAAS,MAAM,iBAAiB,gBAAgB;AAAA,EACnE,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,8DAA8D;AAE9F,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,142 +1,129 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.convert = convert;
7
- exports.default = _default;
8
1
  const MAP_CONVERSION = {
9
2
  /**
10
3
  * @internal Normalizations
11
4
  **/
12
- '‐': '-',
13
- '‑': '-',
14
- '‒': '-',
15
- '–': '-',
16
- '—': '-',
17
- '―': '-',
5
+ "\u2010": "-",
6
+ "\u2011": "-",
7
+ "\u2012": "-",
8
+ "\u2013": "-",
9
+ "\u2014": "-",
10
+ "\u2015": "-",
18
11
  /**
19
12
  * @internal Normalizations (MELINDA-4172, MELINDA-4175)
20
13
  **/
21
- 'Ⓒ': '©',
22
- 'Ⓟ': '℗',
14
+ "\u24B8": "\xA9",
15
+ "\u24C5": "\u2117",
23
16
  /**
24
17
  * @internal Precompose å, ä, ö, Å, Ä and Ö
25
18
  **/
26
- å: 'å',
27
- ä: 'ä',
28
- ö: 'ö',
29
- Å: 'Å',
30
- Ä: 'Ä',
31
- Ö: 'Ö',
19
+ a\u030A: "\xE5",
20
+ a\u0308: "\xE4",
21
+ o\u0308: "\xF6",
22
+ A\u030A: "\xC5",
23
+ A\u0308: "\xC4",
24
+ O\u0308: "\xD6",
32
25
  /**
33
26
  * @internal Decompose everything else (list incomplete)
34
27
  **/
35
- á: 'á',
36
- à: 'à',
37
- â: 'â',
38
- ã: 'ã',
39
- ć: 'ć',
40
- č: 'č',
41
- ç: 'ç',
42
- é: 'é',
43
- è: 'è',
44
- ê: 'ê',
45
- ẽ: 'ẽ',
46
- ë: 'ë',
47
- í: 'í',
48
- ì: 'ì',
49
- î: 'î',
50
- ĩ: 'ĩ',
51
- ï: 'ï',
52
- ñ: 'ñ',
53
- ó: 'ó',
54
- ò: 'ò',
55
- ô: 'ô',
56
- õ: 'õ',
57
- ś: 'ś',
58
- š: 'š',
59
- ú: 'ú',
60
- ù: 'ù',
61
- û: 'û',
62
- ü: 'ü',
63
- ũ: 'ũ',
64
- ý: 'ý',
65
- ỳ: 'ỳ',
66
- ŷ: 'ŷ',
67
- ỹ: 'ỹ',
68
- ÿ: 'ÿ',
69
- ž: 'ž',
70
- Á: 'Á',
71
- À: 'À',
72
- Â: 'Â',
73
- Ã: 'Ã',
74
- É: 'É',
75
- È: 'È',
76
- Ê: 'Ê',
77
- Ẽ: 'Ẽ',
78
- Ë: 'Ë',
79
- Í: 'Í',
80
- Ì: 'Ì',
81
- Î: 'Î',
82
- Ĩ: 'Ĩ',
83
- Ï: 'Ï',
84
- Ñ: 'Ñ',
85
- Ó: 'Ó',
86
- Ò: 'Ò',
87
- Ô: 'Ô',
88
- Õ: 'Õ',
89
- Ś: 'Ś',
90
- Ú: 'Ú',
91
- Ù: 'Ù',
92
- Û: 'Û',
93
- Ũ: 'Ũ',
94
- Ü: 'Ü',
95
- Ý: 'Ý',
96
- Ỳ: 'Ỳ',
97
- Ŷ: 'Ŷ',
98
- Ỹ: 'Ỹ',
99
- Ÿ: 'Ÿ'
28
+ \u00E1: "a\u0301",
29
+ \u00E0: "a\u0300",
30
+ \u00E2: "a\u0302",
31
+ \u00E3: "a\u0303",
32
+ \u0107: "c\u0301",
33
+ \u010D: "c\u030C",
34
+ \u00E7: "c\u0327",
35
+ \u00E9: "e\u0301",
36
+ \u00E8: "e\u0300",
37
+ \u00EA: "e\u0302",
38
+ \u1EBD: "e\u0303",
39
+ \u00EB: "e\u0308",
40
+ \u00ED: "i\u0301",
41
+ \u00EC: "i\u0300",
42
+ \u00EE: "i\u0302",
43
+ \u0129: "i\u0303",
44
+ \u00EF: "i\u0308",
45
+ \u00F1: "n\u0303",
46
+ \u00F3: "o\u0301",
47
+ \u00F2: "o\u0300",
48
+ \u00F4: "o\u0302",
49
+ \u00F5: "o\u0303",
50
+ \u015B: "s\u0301",
51
+ \u0161: "s\u030C",
52
+ \u00FA: "u\u0301",
53
+ \u00F9: "u\u0300",
54
+ \u00FB: "u\u0302",
55
+ \u00FC: "u\u0308",
56
+ \u0169: "u\u0303",
57
+ \u00FD: "y\u0301",
58
+ \u1EF3: "y\u0300",
59
+ \u0177: "y\u0302",
60
+ \u1EF9: "y\u0303",
61
+ \u00FF: "y\u0308",
62
+ \u017E: "z\u030C",
63
+ \u00C1: "A\u0301",
64
+ \u00C0: "A\u0300",
65
+ \u00C2: "A\u0302",
66
+ \u00C3: "A\u0303",
67
+ \u00C9: "E\u0301",
68
+ \u00C8: "E\u0300",
69
+ \u00CA: "E\u0302",
70
+ \u1EBC: "E\u0303",
71
+ \u00CB: "E\u0308",
72
+ \u00CD: "I\u0301",
73
+ \u00CC: "I\u0300",
74
+ \u00CE: "I\u0302",
75
+ \u0128: "I\u0303",
76
+ \u00CF: "I\u0308",
77
+ \u00D1: "N\u0303",
78
+ \u00D3: "O\u0301",
79
+ \u00D2: "O\u0300",
80
+ \u00D4: "O\u0302",
81
+ \u00D5: "O\u0303",
82
+ \u015A: "S\u0301",
83
+ \u00DA: "U\u0301",
84
+ \u00D9: "U\u0300",
85
+ \u00DB: "U\u0302",
86
+ \u0168: "U\u0303",
87
+ \u00DC: "U\u0308",
88
+ \u00DD: "Y\u0301",
89
+ \u1EF2: "Y\u0300",
90
+ \u0176: "Y\u0302",
91
+ \u1EF8: "Y\u0303",
92
+ \u0178: "Y\u0308"
100
93
  };
101
- function _default() {
102
- const PATTERN = Object.keys(MAP_CONVERSION).reduce((result, key, index, list) => index === list.length - 1 ? new RegExp(`${result}${key})`, 'u') : `${result}${key}|`, '(');
94
+ export default function() {
95
+ const PATTERN = Object.keys(MAP_CONVERSION).reduce((result, key, index, list) => index === list.length - 1 ? new RegExp(`${result}${key})`, "u") : `${result}${key}|`, "(");
103
96
  return {
104
- description: 'Unicode decomposer',
97
+ description: "Unicode decomposer",
105
98
  validate,
106
99
  fix
107
100
  };
108
101
  function validate(record) {
109
- const codes = getFields(record.fields).map(field => {
110
- if ('subfields' in field) {
111
- return field.subfields.filter(subfield => PATTERN.test(subfield.value)).map(subfield => subfield.code);
102
+ const codes = getFields(record.fields).map((field) => {
103
+ if ("subfields" in field) {
104
+ return field.subfields.filter((subfield) => PATTERN.test(subfield.value)).map((subfield) => subfield.code);
112
105
  }
113
106
  return null;
114
107
  });
115
- return codes.length < 1 ? {
116
- valid: true,
117
- messages: []
118
- } : {
119
- valid: false,
120
- messages: [`The following subfields are not properly decomposed: ${codes.join(', ')}`]
121
- };
108
+ return codes.length < 1 ? { valid: true, messages: [] } : { valid: false, messages: [`The following subfields are not properly decomposed: ${codes.join(", ")}`] };
122
109
  }
123
110
  function fix(record) {
124
- getFields(record.fields).forEach(field => {
125
- field.subfields.filter(subfield => PATTERN.test(subfield.value)).forEach(subfield => {
111
+ getFields(record.fields).forEach((field) => {
112
+ field.subfields.filter((subfield) => PATTERN.test(subfield.value)).forEach((subfield) => {
126
113
  subfield.value = convert(subfield.value);
127
114
  });
128
115
  });
129
116
  }
130
117
  function getFields(fields) {
131
- return fields.filter(field => {
132
- if ('subfields' in field) {
133
- return field.subfields.some(subfield => PATTERN.test(subfield.value));
118
+ return fields.filter((field) => {
119
+ if ("subfields" in field) {
120
+ return field.subfields.some((subfield) => PATTERN.test(subfield.value));
134
121
  }
135
122
  return null;
136
123
  });
137
124
  }
138
125
  }
139
- function convert(value) {
140
- return Object.keys(MAP_CONVERSION).reduce((result, key) => result.includes(key) ? result.replace(new RegExp(key, 'ug'), MAP_CONVERSION[key]) : result, value);
126
+ export function convert(value) {
127
+ return Object.keys(MAP_CONVERSION).reduce((result, key) => result.includes(key) ? result.replace(new RegExp(key, "ug"), MAP_CONVERSION[key]) : result, value);
141
128
  }
142
- //# sourceMappingURL=unicode-decomposition.js.map
129
+ //# sourceMappingURL=unicode-decomposition.js.map
@@ -1 +1,7 @@
1
- {"version":3,"file":"unicode-decomposition.js","names":["MAP_CONVERSION","å","ä","ö","Å","Ä","Ö","á","à","â","ã","ć","č","ç","é","è","ê","ẽ","ë","í","ì","î","ĩ","ï","ñ","ó","ò","ô","õ","ś","š","ú","ù","û","ü","ũ","ý","ỳ","ŷ","ỹ","ÿ","ž","Á","À","Â","Ã","É","È","Ê","Ẽ","Ë","Í","Ì","Î","Ĩ","Ï","Ñ","Ó","Ò","Ô","Õ","Ś","Ú","Ù","Û","Ũ","Ü","Ý","Ỳ","Ŷ","Ỹ","Ÿ","_default","PATTERN","Object","keys","reduce","result","key","index","list","length","RegExp","description","validate","fix","record","codes","getFields","fields","map","field","subfields","filter","subfield","test","value","code","valid","messages","join","forEach","convert","some","includes","replace"],"sources":["../src/unicode-decomposition.js"],"sourcesContent":["const MAP_CONVERSION = {\n\n /**\n * @internal Normalizations\n **/\n '‐': '-',\n '‑': '-',\n '‒': '-',\n '–': '-',\n '—': '-',\n '―': '-',\n\n /**\n * @internal Normalizations (MELINDA-4172, MELINDA-4175)\n **/\n 'Ⓒ': '©',\n 'Ⓟ': '℗',\n\n /**\n * @internal Precompose å, ä, ö, Å, Ä and Ö\n **/\n å: 'å',\n ä: 'ä',\n ö: 'ö',\n Å: 'Å',\n Ä: 'Ä',\n Ö: 'Ö',\n\n /**\n * @internal Decompose everything else (list incomplete)\n **/\n á: 'á',\n à: 'à',\n â: 'â',\n ã: 'ã',\n ć: 'ć',\n č: 'č',\n ç: 'ç',\n é: 'é',\n è: 'è',\n ê: 'ê',\n ẽ: 'ẽ',\n ë: 'ë',\n í: 'í',\n ì: 'ì',\n î: 'î',\n ĩ: 'ĩ',\n ï: 'ï',\n ñ: 'ñ',\n ó: 'ó',\n ò: 'ò',\n ô: 'ô',\n õ: 'õ',\n ś: 'ś',\n š: 'š',\n ú: 'ú',\n ù: 'ù',\n û: 'û',\n ü: 'ü',\n ũ: 'ũ',\n ý: 'ý',\n ỳ: 'ỳ',\n ŷ: 'ŷ',\n ỹ: 'ỹ',\n ÿ: 'ÿ',\n ž: 'ž',\n Á: 'Á',\n À: 'À',\n Â: 'Â',\n Ã: 'Ã',\n É: 'É',\n È: 'È',\n Ê: 'Ê',\n Ẽ: 'Ẽ',\n Ë: 'Ë',\n Í: 'Í',\n Ì: 'Ì',\n Î: 'Î',\n Ĩ: 'Ĩ',\n Ï: 'Ï',\n Ñ: 'Ñ',\n Ó: 'Ó',\n Ò: 'Ò',\n Ô: 'Ô',\n Õ: 'Õ',\n Ś: 'Ś',\n Ú: 'Ú',\n Ù: 'Ù',\n Û: 'Û',\n Ũ: 'Ũ',\n Ü: 'Ü',\n Ý: 'Ý',\n Ỳ: 'Ỳ',\n Ŷ: 'Ŷ',\n Ỹ: 'Ỹ',\n Ÿ: 'Ÿ'\n};\n\nexport default function () {\n const PATTERN = Object.keys(MAP_CONVERSION).reduce((result, key, index, list) => index === list.length - 1 ? new RegExp(`${result}${key})`, 'u') : `${result}${key}|`, '(');\n\n return {\n description: 'Unicode decomposer',\n validate,\n fix\n };\n\n function validate(record) {\n const codes = getFields(record.fields).map(field => {\n if ('subfields' in field) {\n return field.subfields.filter(subfield => PATTERN.test(subfield.value))\n .map(subfield => subfield.code);\n }\n\n return null;\n });\n return codes.length < 1 ? {valid: true, messages: []} : {valid: false, messages: [`The following subfields are not properly decomposed: ${codes.join(', ')}`]};\n }\n\n function fix(record) {\n getFields(record.fields).forEach(field => {\n field.subfields\n .filter(subfield => PATTERN.test(subfield.value))\n .forEach(subfield => {\n subfield.value = convert(subfield.value);\n });\n });\n }\n\n function getFields(fields) {\n return fields.filter(field => {\n if ('subfields' in field) {\n return field.subfields.some(subfield => PATTERN.test(subfield.value));\n }\n\n return null;\n });\n }\n}\n\nexport function convert(value) {\n return Object.keys(MAP_CONVERSION).reduce((result, key) => result.includes(key) ? result.replace(new RegExp(key, 'ug'), MAP_CONVERSION[key]) : result, value);\n}\n\n"],"mappings":"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","ignoreList":[]}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/unicode-decomposition.js"],
4
+ "sourcesContent": ["const MAP_CONVERSION = {\n\n /**\n * @internal Normalizations\n **/\n '\u2010': '-',\n '\u2011': '-',\n '\u2012': '-',\n '\u2013': '-',\n '\u2014': '-',\n '\u2015': '-',\n\n /**\n * @internal Normalizations (MELINDA-4172, MELINDA-4175)\n **/\n '\u24B8': '\u00A9',\n '\u24C5': '\u2117',\n\n /**\n * @internal Precompose \u00E5, \u00E4, \u00F6, \u00C5, \u00C4 and \u00D6\n **/\n a\u030A: '\u00E5',\n a\u0308: '\u00E4',\n o\u0308: '\u00F6',\n A\u030A: '\u00C5',\n A\u0308: '\u00C4',\n O\u0308: '\u00D6',\n\n /**\n * @internal Decompose everything else (list incomplete)\n **/\n \u00E1: 'a\u0301',\n \u00E0: 'a\u0300',\n \u00E2: 'a\u0302',\n \u00E3: 'a\u0303',\n \u0107: 'c\u0301',\n \u010D: 'c\u030C',\n \u00E7: 'c\u0327',\n \u00E9: 'e\u0301',\n \u00E8: 'e\u0300',\n \u00EA: 'e\u0302',\n \u1EBD: 'e\u0303',\n \u00EB: 'e\u0308',\n \u00ED: 'i\u0301',\n \u00EC: 'i\u0300',\n \u00EE: 'i\u0302',\n \u0129: 'i\u0303',\n \u00EF: 'i\u0308',\n \u00F1: 'n\u0303',\n \u00F3: 'o\u0301',\n \u00F2: 'o\u0300',\n \u00F4: 'o\u0302',\n \u00F5: 'o\u0303',\n \u015B: 's\u0301',\n \u0161: 's\u030C',\n \u00FA: 'u\u0301',\n \u00F9: 'u\u0300',\n \u00FB: 'u\u0302',\n \u00FC: 'u\u0308',\n \u0169: 'u\u0303',\n \u00FD: 'y\u0301',\n \u1EF3: 'y\u0300',\n \u0177: 'y\u0302',\n \u1EF9: 'y\u0303',\n \u00FF: 'y\u0308',\n \u017E: 'z\u030C',\n \u00C1: 'A\u0301',\n \u00C0: 'A\u0300',\n \u00C2: 'A\u0302',\n \u00C3: 'A\u0303',\n \u00C9: 'E\u0301',\n \u00C8: 'E\u0300',\n \u00CA: 'E\u0302',\n \u1EBC: 'E\u0303',\n \u00CB: 'E\u0308',\n \u00CD: 'I\u0301',\n \u00CC: 'I\u0300',\n \u00CE: 'I\u0302',\n \u0128: 'I\u0303',\n \u00CF: 'I\u0308',\n \u00D1: 'N\u0303',\n \u00D3: 'O\u0301',\n \u00D2: 'O\u0300',\n \u00D4: 'O\u0302',\n \u00D5: 'O\u0303',\n \u015A: 'S\u0301',\n \u00DA: 'U\u0301',\n \u00D9: 'U\u0300',\n \u00DB: 'U\u0302',\n \u0168: 'U\u0303',\n \u00DC: 'U\u0308',\n \u00DD: 'Y\u0301',\n \u1EF2: 'Y\u0300',\n \u0176: 'Y\u0302',\n \u1EF8: 'Y\u0303',\n \u0178: 'Y\u0308'\n};\n\nexport default function () {\n const PATTERN = Object.keys(MAP_CONVERSION).reduce((result, key, index, list) => index === list.length - 1 ? new RegExp(`${result}${key})`, 'u') : `${result}${key}|`, '(');\n\n return {\n description: 'Unicode decomposer',\n validate,\n fix\n };\n\n function validate(record) {\n const codes = getFields(record.fields).map(field => {\n if ('subfields' in field) {\n return field.subfields.filter(subfield => PATTERN.test(subfield.value))\n .map(subfield => subfield.code);\n }\n\n return null;\n });\n return codes.length < 1 ? {valid: true, messages: []} : {valid: false, messages: [`The following subfields are not properly decomposed: ${codes.join(', ')}`]};\n }\n\n function fix(record) {\n getFields(record.fields).forEach(field => {\n field.subfields\n .filter(subfield => PATTERN.test(subfield.value))\n .forEach(subfield => {\n subfield.value = convert(subfield.value);\n });\n });\n }\n\n function getFields(fields) {\n return fields.filter(field => {\n if ('subfields' in field) {\n return field.subfields.some(subfield => PATTERN.test(subfield.value));\n }\n\n return null;\n });\n }\n}\n\nexport function convert(value) {\n return Object.keys(MAP_CONVERSION).reduce((result, key) => result.includes(key) ? result.replace(new RegExp(key, 'ug'), MAP_CONVERSION[key]) : result, value);\n}\n\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }