@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":"cyrillux-usemarcon-replacement.js","names":["_clone","_interopRequireDefault","require","_marcRecord","_fix33X","_addMissingField","_addMissingField2","_addMissingField3","_addMissingField4","_fixCountryCodes","_fixLanguageCodes","_fixRelatorTerms","_indicatorFixes","_punctuation","_normalizeQualifyingInformation","_sortSubfields","_utils","e","__esModule","default","description","dropTags","_default","fix","validate","record","nvdebug","realFix","res","message","valid","realFixNonAleph","isAlephRecord","leader","substring","fields","filter","f","includes","tag","removeSubfield","subfields","some","sf","code","value","fieldSpecificStuff","field","rest","undefined","removeOwnershipSubfield5","removeFromOldCatalog","translateFieldToFinnish","fixField040","fieldSpecificStuff2","removeSubfieldH","field100eKirjoittaja","fieldHasSubfield","isBK","sortAdjacentSubfields","field260To264s","field410To490And810","field440To490And830","realFixAll1","fixLeader","fixCountryCodes","fixLanguageCodes","recordRemoveValuelessSubfields","f028","forEach","add041","realFixAll2","fixQualifyingInformation","fixRelatorTerms","fix33X","add336","add337","add338","fixIndicators","fixPunctuation","originalString","recordToString","clonedRecord","MarcRecord","subfieldValues","modifiedString","f040","get","subfieldsBE","length","data","ind1","ind2","insertField","fixField040Subfields","push","match","removeFromOldCatalogFromSubfield","subfield","replace","filteredFields","remainingSubfields","field810","clone","field830","createCopyright264Field","getCopyrightYear","string","field260To264Normalization","field260To264Normalization2","createCopyright264Value","c","copyrightYear","copType","returnValue","year","translateSubfieldToFinnish","finnishTranslationsAndMappings","expandFinnishAbbreviations","expandSwedishAbbreviations","expandEnglishAbbreviations"],"sources":["../src/cyrillux-usemarcon-replacement.js"],"sourcesContent":["/*\n* cyrillux-usemarcon-replacement.js -- implement and improve https://github.com/NatLibFi/USEMARCON-Cyrillux/tree/master\n*\n* Author(s): Nicholas Volk <nicholas.volk@helsinki.fi>\n*\n*/\n\nimport clone from 'clone';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport {default as fix33X} from './fix-33X';\nimport {default as add041} from './addMissingField041';\nimport {default as add336} from './addMissingField336';\nimport {default as add337} from './addMissingField337';\nimport {default as add338} from './addMissingField338';\nimport {default as fixCountryCodes} from './fix-country-codes';\nimport {default as fixLanguageCodes} from './fix-language-codes';\nimport {default as fixRelatorTerms} from './fixRelatorTerms';\nimport {default as fixIndicators} from './indicator-fixes';\nimport {default as fixPunctuation} from './punctuation2';\nimport {default as fixQualifyingInformation} from './normalize-qualifying-information';\nimport {sortAdjacentSubfields} from './sortSubfields';\n\n// import createDebugLogger from 'debug';\nimport {fieldHasSubfield, nvdebug, recordRemoveValuelessSubfields, recordToString, removeSubfield} from './utils';\n\n// const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/punctuation2');\n\nconst description = 'Replacement for Cyrillux usemarcon rules';\n\n// Extended original list with 541, 561, 562, 583, 584\n// 017, 044... et al are LL additions from 2019 (via USEMARCON-RDA)\nconst dropTags = ['001', '003', '010', '012', '014', '015', '016', '017', '019', '025', '029', '032', '035', '036', '037', '038', '042', '044', '049', '051', '061', '068', '071', '074', '079', '090', '091', '092', '094', '095', '096', '097', '099', '249', '261', '262', '350', '400', '411', '541', '561', '562', '574', '575', '577', '578', '583', '584', '589', '590', '591', '592', '593', '594', '595', '596', '597', '598', '599', '653', '698', '741', '742', '744', '751', '761', '790', '841', '842', '843', '844', '845', '850', '852', '853', '854', '855', '858', '859', '863', '864', '865', '866', '867', '868', '876', '877', '878', '882', '886', '887', '888', '890', '899'];\n\n\nexport default function () {\n return {\n description, fix, validate\n };\n\n function fix(record) {\n nvdebug(`${description}: fix`);\n realFix(record);\n const res = {message: [], fix: [], valid: true};\n return res;\n }\n\n function realFixNonAleph(record) {\n if (isAlephRecord(record)) {\n return;\n }\n\n // Update LDR/17 to '4'\n record.leader = `${record.leader.substring(0, 17)}4${record.leader.substring(18, 24)}`;\n\n // Remove unwanted fields:\n record.fields = record.fields.filter(f => !dropTags.includes(f.tag));\n\n removeSubfield(record, '020', 'c');\n\n // Remove 084 fields that don't have $2 ykl (based on USEMARCON-RDA/bw_rda_kyril.rul code by LL 2019)\n record.fields = record.fields.filter(f => f.tag !== '084' || f.subfields.some(sf => sf.code === '2' && sf.value === 'ykl'));\n\n fieldSpecificStuff(record.fields);\n\n function fieldSpecificStuff(fields) {\n const [field, ...rest] = fields;\n\n if (field === undefined) {\n return;\n }\n\n removeOwnershipSubfield5(field);\n removeFromOldCatalog(field); // Remove LoC phrase \"[from old catalog]\" from srings\n translateFieldToFinnish(field);\n\n return fieldSpecificStuff(rest);\n }\n\n fixField040(record); // All $b values are changed to 'mul'. As a side effect 33X$b=>$a mappings are in Finnish! Ok in this domain!\n\n fieldSpecificStuff2(record.fields);\n\n function fieldSpecificStuff2(fields) {\n const [field, ...rest] = fields;\n\n if (field === undefined) {\n return;\n }\n\n removeSubfieldH(field); // NB! Do this only after 33X creation, as 245$h might be useful there!\n\n field100eKirjoittaja(field);\n\n function field100eKirjoittaja(f) { // LL 2019 USEMARCON-RDA rule\n if (f.tag === '100' && !fieldHasSubfield(f, 'e') && record.isBK()) {\n f.subfields = [{code: 'e', value: 'kirjoittaja.'}, ...f.subfields];\n sortAdjacentSubfields(f);\n // Punctuation will be done later on...\n return;\n }\n }\n\n field260To264s(field, record);\n\n // NB! 300 (before or after 33X creation?)\n field410To490And810(field, record);\n field440To490And830(field, record);\n // handle505(field); // not applying them usemarcon-cyrillux rules for field 505 as I can't understand their motivation.\n return fieldSpecificStuff2(rest);\n }\n\n }\n\n function realFixAll1(record) {\n fixLeader(record); // Fix defaults, esp. LDR/18=i\n\n fixCountryCodes().fix(record); // 008/15-17\n fixLanguageCodes().fix(record); // 008/35-37 AND 041 (note that all relevant subfield codes are fixed, not just $a)\n\n recordRemoveValuelessSubfields(record);\n\n // Field 028: use $b$a, not $a$b:\n const f028 = record.fields.filter(f => f.tag === '028');\n f028.forEach(f => sortAdjacentSubfields(f)); // eslint-disable-line array-callback-return\n\n add041().fix(record);\n\n }\n\n function realFixAll2(record) {\n fixQualifyingInformation().fix(record); // 015, 020, 024 and 028\n\n // Cyrillux specific code might change 040$b and thus affect these rules:\n fixRelatorTerms().fix(record);\n fix33X().fix(record); // 33X$a => 33X$a$b$2\n add336().fix(record);\n add337().fix(record);\n add338().fix(record);\n\n // The fixer below implements Cyrillux rules such as 245I1 | 245I1 | If (Exists(@100) Or Exists(@110) Or Exists(@111) Or Exists(@130)) Then '1' Else '0' and plenty of other good stuff:\n fixIndicators().fix(record);\n\n fixPunctuation().fix(record);\n }\n\n function realFix(record) {\n realFixAll1(record);\n\n realFixNonAleph(record);\n\n realFixAll2(record);\n\n const res = {message: [], fix: [], valid: true};\n return res;\n }\n\n // Validation is currently done in subparts\n function validate(record) {\n nvdebug(`${description}: validate`);\n const originalString = recordToString(record);\n const clonedRecord = new MarcRecord(record, {subfieldValues: false});\n realFix(clonedRecord);\n const modifiedString = recordToString(clonedRecord);\n\n if (originalString === modifiedString) {\n return {message: [], valid: true};\n }\n\n return {message: ['Record changed'], valid: false}; // Less than descriptive but will do...\n\n }\n}\n\nfunction fixField040(record) {\n const f040 = record.get('040');\n\n const subfieldsBE = [\n {code: 'b', value: 'mul'},\n {code: 'e', value: 'rda'}\n ];\n\n // Add 040 if there isn't one:\n if (f040.length === 0) {\n const data = {tag: '040', ind1: ' ', ind2: ' ', subfields: subfieldsBE};\n\n record.insertField(data);\n return;\n }\n\n f040.forEach(f => fixField040Subfields(f)); // eslint-disable-line array-callback-return\n\n function fixField040Subfields(field) {\n field.subfields = field.subfields.filter(sf => !['b', 'e'].includes(sf.code));\n field.subfields.push(subfieldsBE[0]);\n field.subfields.push(subfieldsBE[1]);\n sortAdjacentSubfields(field); // put $b and $e to their proper places\n }\n\n}\n\nexport function removeFromOldCatalog(field) {\n if (!field.tag.match(/^(?:240|65[0135]|[1678](?:00|10|11|30))$/u)) {\n return;\n }\n // See https://catalog.loc.gov/vwebv/ui/en_US/htdocs/help/faqs.html for motivation\n field.subfields?.forEach(sf => removeFromOldCatalogFromSubfield(sf)); // eslint-disable-line array-callback-return\n\n function removeFromOldCatalogFromSubfield(subfield) {\n if (!subfield.value.includes('[from old catalog]')) {\n return;\n }\n subfield.value = subfield.value.replace(/ *\\[from old catalog\\]/gui, '');\n }\n}\n\nfunction removeSubfieldH(field) {\n if (!field.subfields || !['245', '246', '247', '740', '760', '762', '765', '767', '770', '772', '773', '774', '775', '776', '777', '780', '785', '786', '787', '788'].includes(field.tag)) {\n return;\n }\n\n const filteredFields = field.subfields.filter(sf => sf.code !== 'h');\n if (filteredFields.length > 0) {\n field.subfields = filteredFields;\n return;\n }\n\n}\n\nexport function removeOwnershipSubfield5(field) {\n if (!field.subfields || field.subfields.length === 0) {\n return;\n }\n const remainingSubfields = field.subfields.filter(sf => sf.code !== '5');\n if (remainingSubfields.length === 0) { // sanity check/robustness\n return;\n }\n field.subfields = remainingSubfields;\n}\n\nexport function fixLeader(record) {\n record.leader = `${record.leader.substring(0, 9)}a22${record.leader.substring(12, 18)}i${record.leader.substring(19, 20)}4500`;\n}\n\nfunction field410To490And810(field, record) { // might be generic... if so, move to utils...\n if (field.tag !== '410') {\n return;\n }\n\n const field810 = clone(field);\n\n field.tag = '490';\n field.ind1 = '1';\n field.ind2 = ' ';\n sortAdjacentSubfields(field);\n // 490: Fix punctuation elsewhere. (Note that the current support is lagging...)\n\n\n field810.tag = '810';\n field810.ind2 = ' ';\n // 810: Fix punctuation elsewhere. (Note that the current support is lagging...)\n record.insertField(field810);\n}\n\nfunction field440To490And830(field, record) { // might be generic... if so, move to utils...\n if (field.tag !== '440') {\n return;\n }\n\n const field830 = clone(field);\n\n field.tag = '490';\n field.ind1 = '1';\n field.ind2 = ' ';\n // 490: Fix punctuation elsewhere. (Note that the current support is lagging...)\n field830.tag = '830';\n // 830: Fix punctuation elsewhere. (Note that the current support is lagging...)\n record.insertField(field830);\n}\n\nfunction isAlephRecord(record) {\n // Records that are already in Aleph are not processed as aggressively as genuinely new ones:\n return record.fields.some(field => ['CAT', 'LKR', 'LOW', 'SID'].includes(field.tag));\n}\n\nfunction field260To264s(field, record) { // might be generic... if so, move to utils...\n // As per my quick reading of usemarcon-cyrillux\n if (field.tag !== '260') {\n return;\n }\n\n createCopyright264Field(field);\n\n field.tag = '264';\n field.ind1 = ' ';\n field.ind2 = '1';\n\n // NB! Usemarcon does not handle 260$e$f$g => 264$a$b$c, so I'm not botherin with it either... (However, we could check our merge reducer code...)\n\n function getCopyrightYear(string) {\n if (string.match(/^(?:\\[?[Ccp]|[^0-9]*(?:cop|©|℗))[^0-9]*(?:1[789][0-9][0-9]|20[0-2][0-9])[^0-9]*$/u)) {\n return string.replace(/[^0-9]/ug, '');\n }\n return false;\n }\n\n field.subfields?.forEach(sf => field260To264Normalization(sf)); // eslint-disable-line array-callback-return\n\n function field260To264Normalization(subfield) {\n subfield.value = field260To264Normalization2(subfield);\n }\n\n function createCopyright264Value(field) {\n // Extract/split copyright year to a separate field:\n const [c] = field.subfields.filter(sf => sf.code === 'c');\n if (!c) {\n return undefined;\n }\n const copyrightYear = getCopyrightYear(c.value);\n if (!copyrightYear) {\n return undefined;\n }\n const copType = c.value.match(/(?:^\\[?p|℗)/u) ? '℗' : '©';\n const returnValue = c.value.includes('[') ? `[${copType}${copyrightYear}]` : `${copType}${copyrightYear}`;\n // Moidy the original value:\n c.value = `[${copyrightYear}]`;\n return returnValue;\n }\n\n function createCopyright264Field(field) {\n const c = createCopyright264Value(field);\n if (!c) {\n return undefined;\n }\n const data = {'tag': '264', 'ind1': ' ', 'ind2': '4', 'subfields': [{'code': 'c', 'value': c}]};\n record.insertField(data);\n }\n\n function field260To264Normalization2(subfield) {\n if (subfield.code === 'a') {\n return subfield.value.replace(/\\b[Ss]\\. ?l\\./u, 'Kustannuspaikka tuntematon');\n }\n if (subfield.code === 'b') {\n return subfield.value.replace(/\\b[Ss]\\. ?n\\./u, 'kustantaja tuntematon');\n }\n if (subfield.code === 'c') {\n const year = getCopyrightYear(subfield.value);\n if (year) {\n const c = subfield.value.match(/(?:^p|℗)/u) ? 'p' : 'c';\n if (subfield.value.includes('[')) {\n return `${c}[${year}]`;\n }\n return `${c}${year}`;\n }\n return subfield.value.replace(/\\b[Ss]\\. ?a\\./u, 'julkaisuaika tuntematon');\n }\n return subfield.value;\n }\n\n\n}\n\n/*\nfunction handle505(field) {\n if (field.tag !== '505') {\n return;\n }\n // Don't know how/why usemarcon-cyrillux is so sure about ind1...\n field.ind1 = '0';\n // usemarcon-cyrillux drops irrelevant subfields, so we do the same. However, we have included some control subfields in the kept side:\n const keptSubfields = field.subfields.filter(sf => ['a', 'g', 'r', 't', 'u', '6', '8', '9'].includes(sf.code));\n\n if (keptSubfields.some(sf => ['a', 'g', 'r', 't', 'u'].includes(sf.code))) {\n field.subfields = keptSubfields;\n return;\n }\n}\n*/\n\nfunction translateFieldToFinnish(field) {\n if (!['020', '300'].includes(field.tag)) {\n return;\n }\n field.subfields?.forEach(sf => translateSubfieldToFinnish(sf)); // eslint-disable-line array-callback-return\n\n function translateSubfieldToFinnish(subfield) {\n if (field.tag === '020' && ['a', 'q', 'z'].includes(subfield.code)) {\n subfield.value = finnishTranslationsAndMappings(expandFinnishAbbreviations(expandSwedishAbbreviations(expandEnglishAbbreviations(subfield.value))));\n return;\n }\n if (field.tag === '300') {\n subfield.value = finnishTranslationsAndMappings(expandFinnishAbbreviations(expandSwedishAbbreviations(expandEnglishAbbreviations(subfield.value))));\n return;\n }\n }\n}\n\nfunction expandEnglishAbbreviations(value) {\n return value.replace(/\\bbk\\.\\b/gui, 'book').\n replace(/chiefly col\\./ui, 'chiefly color').\n replace(/col\\. ill\\./ui, 'color illustrations').\n replace(/diagrs\\./ui, 'diagrams').\n replace(/\\bhbk\\.\\b/gui, 'hardcover').replace(/\\bhbk\\b/gui, 'hardcover'). // expand to MTS-compliant form\n replace(/\\b1 hr\\./gui, '1 hour').\n replace(/\\bhr\\./gui, 'hours').\n replace(/\\bill\\./gui, 'illustrated'). // or illustrations (or Swedish \"illustrerad\" or...)\n replace(/\\billus\\./gui, 'illustrated'). // or illustrations\n replace(/incl\\./gui, 'includes').\n replace(/fold\\.? maps/gui, 'folded maps').\n // replace(/\\bmin\\./gu, 'minutes').\n // replace(/\\bmin\\b/gu, 'minutes').\n replace(/\\bp\\.\\b/gui, 'pages').replace(/\\bp\\b/gu, 'pages').\n replace(/\\bpbk\\.\\b/gui, 'paperback').replace(/\\bpbk\\b/gui, 'paperback'). // expand to MTS-compliant form\n replace(/\\bpdf\\b/gui, 'PDF').\n replace(/\\bports\\./gui, 'portraits').\n replace('sd., col.', 'sound, color').\n replace(/ *\\((?:chiefly col\\.|chiefly color|some col[s.])\\)/gui, '').\n replace(/\\b1 hr\\./gui, '1 hour');\n}\n\nfunction expandFinnishAbbreviations(value) {\n return value.replace(/\\bcn\\. /gu, 'noin ').\n // replace(/\\bmin\\./gu, 'minuuttia').\n // replace(/\\bmin\\b/gu, 'minuuttia').\n replace(/\\bnid\\./gu, 'nidottu').replace(/\\bnid\\b/gui, 'nidottu').\n replace(/\\bsid\\./gu, 'sidottu').replace(/\\bsid\\b/gui, 'sidottu').\n replace(/\\bverkkojulk\\.\\b/gu, 'verkkojulkaisu').replace(/\\bverkkojulk\\b/gu, 'verkkojulkaisu').\n replace(/^\\(([^)]+)\\)$/u, '$1');\n // <- removal of brackets above could use a better location\n}\n\nfunction expandSwedishAbbreviations(value) {\n return value.replace(/\\bca\\. /gu, 'circa ').\n replace(/\\bhft\\./gui, 'häftad').replace(/\\bhft\\b/gui, 'häftad');\n // replace(/\\bmin\\./gu, 'minuter').\n // replace(/\\bmin\\b/gu, 'minuter');\n}\n\nfunction finnishTranslationsAndMappings(value) {\n return value.replace('analog', 'analoginen').\n replace('approximately', 'noin').\n replace('audio discs', 'äänilevyä').\n replace('black and white', 'mustavalkoinen').\n replace(/\\bbilaga\\b/gui, 'liite').\n replace(/\\bbilagor\\b/gui, 'liitettä').\n // https://github.com/NatLibFi/USEMARCON-BOOKWHERE-RDA/blob/master/bw_rda_kyril.rul#L365\n replace(/(\\b1\\]?) с\\./gui, '$1 sivu').\n replace(/(\\d\\]?) с\\./gui, '$1 sivua').\n replace(/(\\d) см/gui, '$1 cm').\n\n replace(/\\bcharts\\b/gui, 'kaavioita').\n replace('chiefly color illustrations', 'pääosin värikuvitettu').\n replace('chiefly', 'pääosin').\n replace(/\\bcirca\\b/gui, 'noin').\n replace(/coil[- ]?bound/gui, 'kierreselkä').\n replace('color illustrations', 'värikuvitus').\n replace(/comb[- ]?bound/gui, 'kierreselkä').\n replace(/\\bdigital\\b/gui, 'digitaalinen').\n replace(/\\belectronic book\\b/gui, 'verkkoaineisto').\n replace('(flera nummersviter)', '(useita numerointijaksoja)').\n replace(/\\bfolded sheet\\b/gui, 'taitelehti').\n replace(/\\bfärgillustratione[nr]\\b/gui, 'värikuvitus').\n replace(/\\bhard(?:back|cover)\\b/gui, 'kovakantinen').\n replace(/\\bhours\\b/gui, 'tuntia').\n replace(/\\bi flera nummersviter/gui, 'useina numerointijaksoina').\n replace('illustrated', 'kuvitettu').\n replace(/illustrations?\\b/gui, 'kuvitettu'). // Based on usemacron-bookwhere (NB! usemarcon-cyrillux had kuvitus/kuvitettu)\n replace(/\\binbunden\\b/gui, 'kovakantinen'). // swe\n replace(/\\binsert\\b/gui, 'liite').\n replace(/\\binserts\\b/gui, 'liitteitä').\n replace(/\\bin various pagings/gui, 'useina numerointijaksoina').\n replace('leaves of plates', 'kuvalehteä').\n replace(/\\bljudskiva\\b/gui, 'äänilevy').\n replace(/\\bljudskivor\\b/gui, 'äänilevyä').\n replace(/\\bmap\\b/gui, 'kartta').\n replace(/\\bmaps\\b/gui, 'karttoja'). // or karttaa?\n replace('minutes', 'minuuttia').\n replace('mjuka pärmar', 'pehmeäkantinen').\n replace('online resource', 'verkkoaineisto').\n replace('onlineresurs', 'verkkoaineisto').\n replace('onumrerade', 'numeroimatonta').\n replace('pages of plates', 'kuvalehteä').\n replace(/\\bpages\\b/gui, 'sivua').\n replace(/\\bpaperback\\b/gui, 'pehmeäkantinen'). // MTS alt\n replace(/\\bSeiten\\b/gu, 'sivua').\n replace(/\\bsoftcover\\b/gui, 'pehmeäkantinen'). // MTS pref\n replace('sound, color', 'äänellinen, värillinen').\n replace('sound cassettes', 'äänikasettia').replace('sound cassette', 'äänikasetti').\n replace('sound discs', 'äänilevyä').replace(/sound disc\\b/gui, 'äänilevy').\n replace(/(?:spiral[- ]?bound|spiralrygg)/gui, 'kierreselkä').\n replace('svartvit', 'mustavalkoinen').\n replace('unnumbered', 'numeroimatonta').\n replace('(various pagings)', '(useita numerointijaksoja)').\n replace(/\\bverkkojulkaisu\\b/gui, 'verkkoaineisto').\n replace('videodiscs', 'videolevyä').\n replace('videodisc', 'videolevy').\n replace(/\\b1 hour\\b/gui, '1 tunti');\n\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/cyrillux-usemarcon-replacement.js"],
4
+ "sourcesContent": ["/*\n* cyrillux-usemarcon-replacement.js -- implement and improve https://github.com/NatLibFi/USEMARCON-Cyrillux/tree/master\n*\n* Author(s): Nicholas Volk <nicholas.volk@helsinki.fi>\n*\n*/\n\nimport clone from 'clone';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport {default as fix33X} from './fix-33X.js';\nimport {default as add041} from './addMissingField041.js';\nimport {default as add336} from './addMissingField336.js';\nimport {default as add337} from './addMissingField337.js';\nimport {default as add338} from './addMissingField338.js';\nimport {default as fixCountryCodes} from './fix-country-codes.js';\nimport {default as fixLanguageCodes} from './fix-language-codes.js';\nimport {default as fixRelatorTerms} from './fixRelatorTerms.js';\nimport {default as fixIndicators} from './indicator-fixes.js';\nimport {default as fixPunctuation} from './punctuation2.js';\nimport {default as fixQualifyingInformation} from './normalize-qualifying-information.js';\nimport {sortAdjacentSubfields} from './sortSubfields.js';\n\n// import createDebugLogger from 'debug';\nimport {fieldHasSubfield, nvdebug, recordRemoveValuelessSubfields, recordToString, removeSubfield} from './utils.js';\n\n// const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/punctuation2');\n\nconst description = 'Replacement for Cyrillux usemarcon rules';\n\n// Extended original list with 541, 561, 562, 583, 584\n// 017, 044... et al are LL additions from 2019 (via USEMARCON-RDA)\nconst dropTags = ['001', '003', '010', '012', '014', '015', '016', '017', '019', '025', '029', '032', '035', '036', '037', '038', '042', '044', '049', '051', '061', '068', '071', '074', '079', '090', '091', '092', '094', '095', '096', '097', '099', '249', '261', '262', '350', '400', '411', '541', '561', '562', '574', '575', '577', '578', '583', '584', '589', '590', '591', '592', '593', '594', '595', '596', '597', '598', '599', '653', '698', '741', '742', '744', '751', '761', '790', '841', '842', '843', '844', '845', '850', '852', '853', '854', '855', '858', '859', '863', '864', '865', '866', '867', '868', '876', '877', '878', '882', '886', '887', '888', '890', '899'];\n\n\nexport default function () {\n return {\n description, fix, validate\n };\n\n function fix(record) {\n nvdebug(`${description}: fix`);\n realFix(record);\n const res = {message: [], fix: [], valid: true};\n return res;\n }\n\n function realFixNonAleph(record) {\n if (isAlephRecord(record)) {\n return;\n }\n\n // Update LDR/17 to '4'\n record.leader = `${record.leader.substring(0, 17)}4${record.leader.substring(18, 24)}`;\n\n // Remove unwanted fields:\n record.fields = record.fields.filter(f => !dropTags.includes(f.tag));\n\n removeSubfield(record, '020', 'c');\n\n // Remove 084 fields that don't have $2 ykl (based on USEMARCON-RDA/bw_rda_kyril.rul code by LL 2019)\n record.fields = record.fields.filter(f => f.tag !== '084' || f.subfields.some(sf => sf.code === '2' && sf.value === 'ykl'));\n\n fieldSpecificStuff(record.fields);\n\n function fieldSpecificStuff(fields) {\n const [field, ...rest] = fields;\n\n if (field === undefined) {\n return;\n }\n\n removeOwnershipSubfield5(field);\n removeFromOldCatalog(field); // Remove LoC phrase \"[from old catalog]\" from srings\n translateFieldToFinnish(field);\n\n return fieldSpecificStuff(rest);\n }\n\n fixField040(record); // All $b values are changed to 'mul'. As a side effect 33X$b=>$a mappings are in Finnish! Ok in this domain!\n\n fieldSpecificStuff2(record.fields);\n\n function fieldSpecificStuff2(fields) {\n const [field, ...rest] = fields;\n\n if (field === undefined) {\n return;\n }\n\n removeSubfieldH(field); // NB! Do this only after 33X creation, as 245$h might be useful there!\n\n field100eKirjoittaja(field);\n\n function field100eKirjoittaja(f) { // LL 2019 USEMARCON-RDA rule\n if (f.tag === '100' && !fieldHasSubfield(f, 'e') && record.isBK()) {\n f.subfields = [{code: 'e', value: 'kirjoittaja.'}, ...f.subfields];\n sortAdjacentSubfields(f);\n // Punctuation will be done later on...\n return;\n }\n }\n\n field260To264s(field, record);\n\n // NB! 300 (before or after 33X creation?)\n field410To490And810(field, record);\n field440To490And830(field, record);\n // handle505(field); // not applying them usemarcon-cyrillux rules for field 505 as I can't understand their motivation.\n return fieldSpecificStuff2(rest);\n }\n\n }\n\n function realFixAll1(record) {\n fixLeader(record); // Fix defaults, esp. LDR/18=i\n\n fixCountryCodes().fix(record); // 008/15-17\n fixLanguageCodes().fix(record); // 008/35-37 AND 041 (note that all relevant subfield codes are fixed, not just $a)\n\n recordRemoveValuelessSubfields(record);\n\n // Field 028: use $b$a, not $a$b:\n const f028 = record.fields.filter(f => f.tag === '028');\n f028.forEach(f => sortAdjacentSubfields(f));\n\n add041().fix(record);\n\n }\n\n function realFixAll2(record) {\n fixQualifyingInformation().fix(record); // 015, 020, 024 and 028\n\n // Cyrillux specific code might change 040$b and thus affect these rules:\n fixRelatorTerms().fix(record);\n fix33X().fix(record); // 33X$a => 33X$a$b$2\n add336().fix(record);\n add337().fix(record);\n add338().fix(record);\n\n // The fixer below implements Cyrillux rules such as 245I1 | 245I1 | If (Exists(@100) Or Exists(@110) Or Exists(@111) Or Exists(@130)) Then '1' Else '0' and plenty of other good stuff:\n fixIndicators().fix(record);\n\n fixPunctuation().fix(record);\n }\n\n function realFix(record) {\n realFixAll1(record);\n\n realFixNonAleph(record);\n\n realFixAll2(record);\n\n const res = {message: [], fix: [], valid: true};\n return res;\n }\n\n // Validation is currently done in subparts\n function validate(record) {\n nvdebug(`${description}: validate`);\n const originalString = recordToString(record);\n const clonedRecord = new MarcRecord(record, {subfieldValues: false});\n realFix(clonedRecord);\n const modifiedString = recordToString(clonedRecord);\n\n if (originalString === modifiedString) {\n return {message: [], valid: true};\n }\n\n return {message: ['Record changed'], valid: false}; // Less than descriptive but will do...\n\n }\n}\n\nfunction fixField040(record) {\n const f040 = record.get('040');\n\n const subfieldsBE = [\n {code: 'b', value: 'mul'},\n {code: 'e', value: 'rda'}\n ];\n\n // Add 040 if there isn't one:\n if (f040.length === 0) {\n const data = {tag: '040', ind1: ' ', ind2: ' ', subfields: subfieldsBE};\n\n record.insertField(data);\n return;\n }\n\n f040.forEach(f => fixField040Subfields(f));\n\n function fixField040Subfields(field) {\n field.subfields = field.subfields.filter(sf => !['b', 'e'].includes(sf.code));\n field.subfields.push(subfieldsBE[0]);\n field.subfields.push(subfieldsBE[1]);\n sortAdjacentSubfields(field); // put $b and $e to their proper places\n }\n\n}\n\nexport function removeFromOldCatalog(field) {\n if (!field.tag.match(/^(?:240|65[0135]|[1678](?:00|10|11|30))$/u)) {\n return;\n }\n // See https://catalog.loc.gov/vwebv/ui/en_US/htdocs/help/faqs.html for motivation\n field.subfields?.forEach(sf => removeFromOldCatalogFromSubfield(sf));\n\n function removeFromOldCatalogFromSubfield(subfield) {\n if (!subfield.value.includes('[from old catalog]')) {\n return;\n }\n subfield.value = subfield.value.replace(/ *\\[from old catalog\\]/gui, '');\n }\n}\n\nfunction removeSubfieldH(field) {\n if (!field.subfields || !['245', '246', '247', '740', '760', '762', '765', '767', '770', '772', '773', '774', '775', '776', '777', '780', '785', '786', '787', '788'].includes(field.tag)) {\n return;\n }\n\n const filteredFields = field.subfields.filter(sf => sf.code !== 'h');\n if (filteredFields.length > 0) {\n field.subfields = filteredFields;\n return;\n }\n\n}\n\nexport function removeOwnershipSubfield5(field) {\n if (!field.subfields || field.subfields.length === 0) {\n return;\n }\n const remainingSubfields = field.subfields.filter(sf => sf.code !== '5');\n if (remainingSubfields.length === 0) { // sanity check/robustness\n return;\n }\n field.subfields = remainingSubfields;\n}\n\nexport function fixLeader(record) {\n record.leader = `${record.leader.substring(0, 9)}a22${record.leader.substring(12, 18)}i${record.leader.substring(19, 20)}4500`;\n}\n\nfunction field410To490And810(field, record) { // might be generic... if so, move to utils...\n if (field.tag !== '410') {\n return;\n }\n\n const field810 = clone(field);\n\n field.tag = '490';\n field.ind1 = '1';\n field.ind2 = ' ';\n sortAdjacentSubfields(field);\n // 490: Fix punctuation elsewhere. (Note that the current support is lagging...)\n\n\n field810.tag = '810';\n field810.ind2 = ' ';\n // 810: Fix punctuation elsewhere. (Note that the current support is lagging...)\n record.insertField(field810);\n}\n\nfunction field440To490And830(field, record) { // might be generic... if so, move to utils...\n if (field.tag !== '440') {\n return;\n }\n\n const field830 = clone(field);\n\n field.tag = '490';\n field.ind1 = '1';\n field.ind2 = ' ';\n // 490: Fix punctuation elsewhere. (Note that the current support is lagging...)\n field830.tag = '830';\n // 830: Fix punctuation elsewhere. (Note that the current support is lagging...)\n record.insertField(field830);\n}\n\nfunction isAlephRecord(record) {\n // Records that are already in Aleph are not processed as aggressively as genuinely new ones:\n return record.fields.some(field => ['CAT', 'LKR', 'LOW', 'SID'].includes(field.tag));\n}\n\nfunction field260To264s(field, record) { // might be generic... if so, move to utils...\n // As per my quick reading of usemarcon-cyrillux\n if (field.tag !== '260') {\n return;\n }\n\n createCopyright264Field(field);\n\n field.tag = '264';\n field.ind1 = ' ';\n field.ind2 = '1';\n\n // NB! Usemarcon does not handle 260$e$f$g => 264$a$b$c, so I'm not botherin with it either... (However, we could check our merge reducer code...)\n\n function getCopyrightYear(string) {\n if (string.match(/^(?:\\[?[Ccp]|[^0-9]*(?:cop|\u00A9|\u2117))[^0-9]*(?:1[789][0-9][0-9]|20[0-2][0-9])[^0-9]*$/u)) {\n return string.replace(/[^0-9]/ug, '');\n }\n return false;\n }\n\n field.subfields?.forEach(sf => field260To264Normalization(sf));\n\n function field260To264Normalization(subfield) {\n subfield.value = field260To264Normalization2(subfield);\n }\n\n function createCopyright264Value(field) {\n // Extract/split copyright year to a separate field:\n const [c] = field.subfields.filter(sf => sf.code === 'c');\n if (!c) {\n return undefined;\n }\n const copyrightYear = getCopyrightYear(c.value);\n if (!copyrightYear) {\n return undefined;\n }\n const copType = c.value.match(/(?:^\\[?p|\u2117)/u) ? '\u2117' : '\u00A9';\n const returnValue = c.value.includes('[') ? `[${copType}${copyrightYear}]` : `${copType}${copyrightYear}`;\n // Moidy the original value:\n c.value = `[${copyrightYear}]`;\n return returnValue;\n }\n\n function createCopyright264Field(field) {\n const c = createCopyright264Value(field);\n if (!c) {\n return undefined;\n }\n const data = {'tag': '264', 'ind1': ' ', 'ind2': '4', 'subfields': [{'code': 'c', 'value': c}]};\n record.insertField(data);\n }\n\n function field260To264Normalization2(subfield) {\n if (subfield.code === 'a') {\n return subfield.value.replace(/\\b[Ss]\\. ?l\\./u, 'Kustannuspaikka tuntematon');\n }\n if (subfield.code === 'b') {\n return subfield.value.replace(/\\b[Ss]\\. ?n\\./u, 'kustantaja tuntematon');\n }\n if (subfield.code === 'c') {\n const year = getCopyrightYear(subfield.value);\n if (year) {\n const c = subfield.value.match(/(?:^p|\u2117)/u) ? 'p' : 'c';\n if (subfield.value.includes('[')) {\n return `${c}[${year}]`;\n }\n return `${c}${year}`;\n }\n return subfield.value.replace(/\\b[Ss]\\. ?a\\./u, 'julkaisuaika tuntematon');\n }\n return subfield.value;\n }\n\n\n}\n\n/*\nfunction handle505(field) {\n if (field.tag !== '505') {\n return;\n }\n // Don't know how/why usemarcon-cyrillux is so sure about ind1...\n field.ind1 = '0';\n // usemarcon-cyrillux drops irrelevant subfields, so we do the same. However, we have included some control subfields in the kept side:\n const keptSubfields = field.subfields.filter(sf => ['a', 'g', 'r', 't', 'u', '6', '8', '9'].includes(sf.code));\n\n if (keptSubfields.some(sf => ['a', 'g', 'r', 't', 'u'].includes(sf.code))) {\n field.subfields = keptSubfields;\n return;\n }\n}\n*/\n\nfunction translateFieldToFinnish(field) {\n if (!['020', '300'].includes(field.tag)) {\n return;\n }\n field.subfields?.forEach(sf => translateSubfieldToFinnish(sf));\n\n function translateSubfieldToFinnish(subfield) {\n if (field.tag === '020' && ['a', 'q', 'z'].includes(subfield.code)) {\n subfield.value = finnishTranslationsAndMappings(expandFinnishAbbreviations(expandSwedishAbbreviations(expandEnglishAbbreviations(subfield.value))));\n return;\n }\n if (field.tag === '300') {\n subfield.value = finnishTranslationsAndMappings(expandFinnishAbbreviations(expandSwedishAbbreviations(expandEnglishAbbreviations(subfield.value))));\n return;\n }\n }\n}\n\nfunction expandEnglishAbbreviations(value) {\n return value.replace(/\\bbk\\.\\b/gui, 'book').\n replace(/chiefly col\\./ui, 'chiefly color').\n replace(/col\\. ill\\./ui, 'color illustrations').\n replace(/diagrs\\./ui, 'diagrams').\n replace(/\\bhbk\\.\\b/gui, 'hardcover').replace(/\\bhbk\\b/gui, 'hardcover'). // expand to MTS-compliant form\n replace(/\\b1 hr\\./gui, '1 hour').\n replace(/\\bhr\\./gui, 'hours').\n replace(/\\bill\\./gui, 'illustrated'). // or illustrations (or Swedish \"illustrerad\" or...)\n replace(/\\billus\\./gui, 'illustrated'). // or illustrations\n replace(/incl\\./gui, 'includes').\n replace(/fold\\.? maps/gui, 'folded maps').\n // replace(/\\bmin\\./gu, 'minutes').\n // replace(/\\bmin\\b/gu, 'minutes').\n replace(/\\bp\\.\\b/gui, 'pages').replace(/\\bp\\b/gu, 'pages').\n replace(/\\bpbk\\.\\b/gui, 'paperback').replace(/\\bpbk\\b/gui, 'paperback'). // expand to MTS-compliant form\n replace(/\\bpdf\\b/gui, 'PDF').\n replace(/\\bports\\./gui, 'portraits').\n replace('sd., col.', 'sound, color').\n replace(/ *\\((?:chiefly col\\.|chiefly color|some col[s.])\\)/gui, '').\n replace(/\\b1 hr\\./gui, '1 hour');\n}\n\nfunction expandFinnishAbbreviations(value) {\n return value.replace(/\\bcn\\. /gu, 'noin ').\n // replace(/\\bmin\\./gu, 'minuuttia').\n // replace(/\\bmin\\b/gu, 'minuuttia').\n replace(/\\bnid\\./gu, 'nidottu').replace(/\\bnid\\b/gui, 'nidottu').\n replace(/\\bsid\\./gu, 'sidottu').replace(/\\bsid\\b/gui, 'sidottu').\n replace(/\\bverkkojulk\\.\\b/gu, 'verkkojulkaisu').replace(/\\bverkkojulk\\b/gu, 'verkkojulkaisu').\n replace(/^\\(([^)]+)\\)$/u, '$1');\n // <- removal of brackets above could use a better location\n}\n\nfunction expandSwedishAbbreviations(value) {\n return value.replace(/\\bca\\. /gu, 'circa ').\n replace(/\\bhft\\./gui, 'h\u00E4ftad').replace(/\\bhft\\b/gui, 'h\u00E4ftad');\n // replace(/\\bmin\\./gu, 'minuter').\n // replace(/\\bmin\\b/gu, 'minuter');\n}\n\nfunction finnishTranslationsAndMappings(value) {\n return value.replace('analog', 'analoginen').\n replace('approximately', 'noin').\n replace('audio discs', '\u00E4\u00E4nilevy\u00E4').\n replace('black and white', 'mustavalkoinen').\n replace(/\\bbilaga\\b/gui, 'liite').\n replace(/\\bbilagor\\b/gui, 'liitett\u00E4').\n // https://github.com/NatLibFi/USEMARCON-BOOKWHERE-RDA/blob/master/bw_rda_kyril.rul#L365\n replace(/(\\b1\\]?) \u0441\\./gui, '$1 sivu').\n replace(/(\\d\\]?) \u0441\\./gui, '$1 sivua').\n replace(/(\\d) \u0441\u043C/gui, '$1 cm').\n\n replace(/\\bcharts\\b/gui, 'kaavioita').\n replace('chiefly color illustrations', 'p\u00E4\u00E4osin v\u00E4rikuvitettu').\n replace('chiefly', 'p\u00E4\u00E4osin').\n replace(/\\bcirca\\b/gui, 'noin').\n replace(/coil[- ]?bound/gui, 'kierreselk\u00E4').\n replace('color illustrations', 'v\u00E4rikuvitus').\n replace(/comb[- ]?bound/gui, 'kierreselk\u00E4').\n replace(/\\bdigital\\b/gui, 'digitaalinen').\n replace(/\\belectronic book\\b/gui, 'verkkoaineisto').\n replace('(flera nummersviter)', '(useita numerointijaksoja)').\n replace(/\\bfolded sheet\\b/gui, 'taitelehti').\n replace(/\\bf\u00E4rgillustratione[nr]\\b/gui, 'v\u00E4rikuvitus').\n replace(/\\bhard(?:back|cover)\\b/gui, 'kovakantinen').\n replace(/\\bhours\\b/gui, 'tuntia').\n replace(/\\bi flera nummersviter/gui, 'useina numerointijaksoina').\n replace('illustrated', 'kuvitettu').\n replace(/illustrations?\\b/gui, 'kuvitettu'). // Based on usemacron-bookwhere (NB! usemarcon-cyrillux had kuvitus/kuvitettu)\n replace(/\\binbunden\\b/gui, 'kovakantinen'). // swe\n replace(/\\binsert\\b/gui, 'liite').\n replace(/\\binserts\\b/gui, 'liitteit\u00E4').\n replace(/\\bin various pagings/gui, 'useina numerointijaksoina').\n replace('leaves of plates', 'kuvalehte\u00E4').\n replace(/\\bljudskiva\\b/gui, '\u00E4\u00E4nilevy').\n replace(/\\bljudskivor\\b/gui, '\u00E4\u00E4nilevy\u00E4').\n replace(/\\bmap\\b/gui, 'kartta').\n replace(/\\bmaps\\b/gui, 'karttoja'). // or karttaa?\n replace('minutes', 'minuuttia').\n replace('mjuka p\u00E4rmar', 'pehme\u00E4kantinen').\n replace('online resource', 'verkkoaineisto').\n replace('onlineresurs', 'verkkoaineisto').\n replace('onumrerade', 'numeroimatonta').\n replace('pages of plates', 'kuvalehte\u00E4').\n replace(/\\bpages\\b/gui, 'sivua').\n replace(/\\bpaperback\\b/gui, 'pehme\u00E4kantinen'). // MTS alt\n replace(/\\bSeiten\\b/gu, 'sivua').\n replace(/\\bsoftcover\\b/gui, 'pehme\u00E4kantinen'). // MTS pref\n replace('sound, color', '\u00E4\u00E4nellinen, v\u00E4rillinen').\n replace('sound cassettes', '\u00E4\u00E4nikasettia').replace('sound cassette', '\u00E4\u00E4nikasetti').\n replace('sound discs', '\u00E4\u00E4nilevy\u00E4').replace(/sound disc\\b/gui, '\u00E4\u00E4nilevy').\n replace(/(?:spiral[- ]?bound|spiralrygg)/gui, 'kierreselk\u00E4').\n replace('svartvit', 'mustavalkoinen').\n replace('unnumbered', 'numeroimatonta').\n replace('(various pagings)', '(useita numerointijaksoja)').\n replace(/\\bverkkojulkaisu\\b/gui, 'verkkoaineisto').\n replace('videodiscs', 'videolevy\u00E4').\n replace('videodisc', 'videolevy').\n replace(/\\b1 hour\\b/gui, '1 tunti');\n\n}\n"],
5
+ "mappings": "AAOA,OAAO,WAAW;AAClB,SAAQ,kBAAiB;AACzB,SAAQ,WAAW,cAAa;AAChC,SAAQ,WAAW,cAAa;AAChC,SAAQ,WAAW,cAAa;AAChC,SAAQ,WAAW,cAAa;AAChC,SAAQ,WAAW,cAAa;AAChC,SAAQ,WAAW,uBAAsB;AACzC,SAAQ,WAAW,wBAAuB;AAC1C,SAAQ,WAAW,uBAAsB;AACzC,SAAQ,WAAW,qBAAoB;AACvC,SAAQ,WAAW,sBAAqB;AACxC,SAAQ,WAAW,gCAA+B;AAClD,SAAQ,6BAA4B;AAGpC,SAAQ,kBAAkB,SAAS,gCAAgC,gBAAgB,sBAAqB;AAIxG,MAAM,cAAc;AAIpB,MAAM,WAAW,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK;AAGlqB,0BAA2B;AACzB,SAAO;AAAA,IACL;AAAA,IAAa;AAAA,IAAK;AAAA,EACpB;AAEA,WAAS,IAAI,QAAQ;AACnB,YAAQ,GAAG,WAAW,OAAO;AAC7B,YAAQ,MAAM;AACd,UAAM,MAAM,EAAC,SAAS,CAAC,GAAG,KAAK,CAAC,GAAG,OAAO,KAAI;AAC9C,WAAO;AAAA,EACT;AAEA,WAAS,gBAAgB,QAAQ;AAC/B,QAAI,cAAc,MAAM,GAAG;AACzB;AAAA,IACF;AAGA,WAAO,SAAS,GAAG,OAAO,OAAO,UAAU,GAAG,EAAE,CAAC,IAAI,OAAO,OAAO,UAAU,IAAI,EAAE,CAAC;AAGpF,WAAO,SAAS,OAAO,OAAO,OAAO,OAAK,CAAC,SAAS,SAAS,EAAE,GAAG,CAAC;AAEnE,mBAAe,QAAQ,OAAO,GAAG;AAGjC,WAAO,SAAS,OAAO,OAAO,OAAO,OAAK,EAAE,QAAQ,SAAS,EAAE,UAAU,KAAK,QAAM,GAAG,SAAS,OAAO,GAAG,UAAU,KAAK,CAAC;AAE1H,uBAAmB,OAAO,MAAM;AAEhC,aAAS,mBAAmB,QAAQ;AAClC,YAAM,CAAC,OAAO,GAAG,IAAI,IAAI;AAEzB,UAAI,UAAU,QAAW;AACvB;AAAA,MACF;AAEA,+BAAyB,KAAK;AAC9B,2BAAqB,KAAK;AAC1B,8BAAwB,KAAK;AAE7B,aAAO,mBAAmB,IAAI;AAAA,IAChC;AAEA,gBAAY,MAAM;AAElB,wBAAoB,OAAO,MAAM;AAEjC,aAAS,oBAAoB,QAAQ;AACnC,YAAM,CAAC,OAAO,GAAG,IAAI,IAAI;AAEzB,UAAI,UAAU,QAAW;AACvB;AAAA,MACF;AAEA,sBAAgB,KAAK;AAErB,2BAAqB,KAAK;AAE1B,eAAS,qBAAqB,GAAG;AAC/B,YAAI,EAAE,QAAQ,SAAS,CAAC,iBAAiB,GAAG,GAAG,KAAK,OAAO,KAAK,GAAG;AACjE,YAAE,YAAY,CAAC,EAAC,MAAM,KAAK,OAAO,eAAc,GAAG,GAAG,EAAE,SAAS;AACjE,gCAAsB,CAAC;AAEvB;AAAA,QACF;AAAA,MACF;AAEA,qBAAe,OAAO,MAAM;AAG5B,0BAAoB,OAAO,MAAM;AACjC,0BAAoB,OAAO,MAAM;AAEjC,aAAO,oBAAoB,IAAI;AAAA,IACjC;AAAA,EAEF;AAEA,WAAS,YAAY,QAAQ;AAC3B,cAAU,MAAM;AAEhB,oBAAgB,EAAE,IAAI,MAAM;AAC5B,qBAAiB,EAAE,IAAI,MAAM;AAE7B,mCAA+B,MAAM;AAGrC,UAAM,OAAO,OAAO,OAAO,OAAO,OAAK,EAAE,QAAQ,KAAK;AACtD,SAAK,QAAQ,OAAK,sBAAsB,CAAC,CAAC;AAE1C,WAAO,EAAE,IAAI,MAAM;AAAA,EAErB;AAEA,WAAS,YAAY,QAAQ;AAC3B,6BAAyB,EAAE,IAAI,MAAM;AAGrC,oBAAgB,EAAE,IAAI,MAAM;AAC5B,WAAO,EAAE,IAAI,MAAM;AACnB,WAAO,EAAE,IAAI,MAAM;AACnB,WAAO,EAAE,IAAI,MAAM;AACnB,WAAO,EAAE,IAAI,MAAM;AAGnB,kBAAc,EAAE,IAAI,MAAM;AAE1B,mBAAe,EAAE,IAAI,MAAM;AAAA,EAC7B;AAEA,WAAS,QAAQ,QAAQ;AACvB,gBAAY,MAAM;AAElB,oBAAgB,MAAM;AAEtB,gBAAY,MAAM;AAElB,UAAM,MAAM,EAAC,SAAS,CAAC,GAAG,KAAK,CAAC,GAAG,OAAO,KAAI;AAC9C,WAAO;AAAA,EACT;AAGA,WAAS,SAAS,QAAQ;AACxB,YAAQ,GAAG,WAAW,YAAY;AAClC,UAAM,iBAAiB,eAAe,MAAM;AAC5C,UAAM,eAAe,IAAI,WAAW,QAAQ,EAAC,gBAAgB,MAAK,CAAC;AACnE,YAAQ,YAAY;AACpB,UAAM,iBAAiB,eAAe,YAAY;AAElD,QAAI,mBAAmB,gBAAgB;AACrC,aAAO,EAAC,SAAS,CAAC,GAAG,OAAO,KAAI;AAAA,IAClC;AAEA,WAAO,EAAC,SAAS,CAAC,gBAAgB,GAAG,OAAO,MAAK;AAAA,EAEnD;AACF;AAEA,SAAS,YAAY,QAAQ;AAC3B,QAAM,OAAO,OAAO,IAAI,KAAK;AAE7B,QAAM,cAAc;AAAA,IAClB,EAAC,MAAM,KAAK,OAAO,MAAK;AAAA,IACxB,EAAC,MAAM,KAAK,OAAO,MAAK;AAAA,EAC1B;AAGA,MAAI,KAAK,WAAW,GAAG;AACrB,UAAM,OAAO,EAAC,KAAK,OAAO,MAAM,KAAK,MAAM,KAAK,WAAW,YAAW;AAEtE,WAAO,YAAY,IAAI;AACvB;AAAA,EACF;AAEA,OAAK,QAAQ,OAAK,qBAAqB,CAAC,CAAC;AAEzC,WAAS,qBAAqB,OAAO;AACnC,UAAM,YAAY,MAAM,UAAU,OAAO,QAAM,CAAC,CAAC,KAAK,GAAG,EAAE,SAAS,GAAG,IAAI,CAAC;AAC5E,UAAM,UAAU,KAAK,YAAY,CAAC,CAAC;AACnC,UAAM,UAAU,KAAK,YAAY,CAAC,CAAC;AACnC,0BAAsB,KAAK;AAAA,EAC7B;AAEF;AAEO,gBAAS,qBAAqB,OAAO;AAC1C,MAAI,CAAC,MAAM,IAAI,MAAM,2CAA2C,GAAG;AACjE;AAAA,EACF;AAEA,QAAM,WAAW,QAAQ,QAAM,iCAAiC,EAAE,CAAC;AAEnE,WAAS,iCAAiC,UAAU;AAClD,QAAI,CAAC,SAAS,MAAM,SAAS,oBAAoB,GAAG;AAClD;AAAA,IACF;AACA,aAAS,QAAQ,SAAS,MAAM,QAAQ,6BAA6B,EAAE;AAAA,EACzE;AACF;AAEA,SAAS,gBAAgB,OAAO;AAC9B,MAAI,CAAC,MAAM,aAAa,CAAC,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK,EAAE,SAAS,MAAM,GAAG,GAAG;AACzL;AAAA,EACF;AAEA,QAAM,iBAAiB,MAAM,UAAU,OAAO,QAAM,GAAG,SAAS,GAAG;AACnE,MAAI,eAAe,SAAS,GAAG;AAC7B,UAAM,YAAY;AAClB;AAAA,EACF;AAEF;AAEO,gBAAS,yBAAyB,OAAO;AAC9C,MAAI,CAAC,MAAM,aAAa,MAAM,UAAU,WAAW,GAAG;AACpD;AAAA,EACF;AACA,QAAM,qBAAqB,MAAM,UAAU,OAAO,QAAM,GAAG,SAAS,GAAG;AACvE,MAAI,mBAAmB,WAAW,GAAG;AACnC;AAAA,EACF;AACA,QAAM,YAAY;AACpB;AAEO,gBAAS,UAAU,QAAQ;AAChC,SAAO,SAAS,GAAG,OAAO,OAAO,UAAU,GAAG,CAAC,CAAC,MAAM,OAAO,OAAO,UAAU,IAAI,EAAE,CAAC,IAAI,OAAO,OAAO,UAAU,IAAI,EAAE,CAAC;AAC1H;AAEA,SAAS,oBAAoB,OAAO,QAAQ;AAC1C,MAAI,MAAM,QAAQ,OAAO;AACvB;AAAA,EACF;AAEA,QAAM,WAAW,MAAM,KAAK;AAE5B,QAAM,MAAM;AACZ,QAAM,OAAO;AACb,QAAM,OAAO;AACb,wBAAsB,KAAK;AAI3B,WAAS,MAAM;AACf,WAAS,OAAO;AAEhB,SAAO,YAAY,QAAQ;AAC7B;AAEA,SAAS,oBAAoB,OAAO,QAAQ;AAC1C,MAAI,MAAM,QAAQ,OAAO;AACvB;AAAA,EACF;AAEA,QAAM,WAAW,MAAM,KAAK;AAE5B,QAAM,MAAM;AACZ,QAAM,OAAO;AACb,QAAM,OAAO;AAEb,WAAS,MAAM;AAEf,SAAO,YAAY,QAAQ;AAC7B;AAEA,SAAS,cAAc,QAAQ;AAE7B,SAAO,OAAO,OAAO,KAAK,WAAS,CAAC,OAAO,OAAO,OAAO,KAAK,EAAE,SAAS,MAAM,GAAG,CAAC;AACrF;AAEA,SAAS,eAAe,OAAO,QAAQ;AAErC,MAAI,MAAM,QAAQ,OAAO;AACvB;AAAA,EACF;AAEA,0BAAwB,KAAK;AAE7B,QAAM,MAAM;AACZ,QAAM,OAAO;AACb,QAAM,OAAO;AAIb,WAAS,iBAAiB,QAAQ;AAChC,QAAI,OAAO,MAAM,mFAAmF,GAAG;AACrG,aAAO,OAAO,QAAQ,YAAY,EAAE;AAAA,IACtC;AACA,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,QAAQ,QAAM,2BAA2B,EAAE,CAAC;AAE7D,WAAS,2BAA2B,UAAU;AAC5C,aAAS,QAAQ,4BAA4B,QAAQ;AAAA,EACvD;AAEA,WAAS,wBAAwBA,QAAO;AAEtC,UAAM,CAAC,CAAC,IAAIA,OAAM,UAAU,OAAO,QAAM,GAAG,SAAS,GAAG;AACxD,QAAI,CAAC,GAAG;AACN,aAAO;AAAA,IACT;AACA,UAAM,gBAAgB,iBAAiB,EAAE,KAAK;AAC9C,QAAI,CAAC,eAAe;AAClB,aAAO;AAAA,IACT;AACA,UAAM,UAAU,EAAE,MAAM,MAAM,cAAc,IAAI,WAAM;AACtD,UAAM,cAAc,EAAE,MAAM,SAAS,GAAG,IAAI,IAAI,OAAO,GAAG,aAAa,MAAM,GAAG,OAAO,GAAG,aAAa;AAEvG,MAAE,QAAQ,IAAI,aAAa;AAC3B,WAAO;AAAA,EACT;AAEA,WAAS,wBAAwBA,QAAO;AACtC,UAAM,IAAI,wBAAwBA,MAAK;AACvC,QAAI,CAAC,GAAG;AACN,aAAO;AAAA,IACT;AACA,UAAM,OAAO,EAAC,OAAO,OAAO,QAAQ,KAAK,QAAQ,KAAK,aAAa,CAAC,EAAC,QAAQ,KAAK,SAAS,EAAC,CAAC,EAAC;AAC9F,WAAO,YAAY,IAAI;AAAA,EACzB;AAEA,WAAS,4BAA4B,UAAU;AAC7C,QAAI,SAAS,SAAS,KAAK;AACzB,aAAO,SAAS,MAAM,QAAQ,kBAAkB,4BAA4B;AAAA,IAC9E;AACA,QAAI,SAAS,SAAS,KAAK;AACzB,aAAO,SAAS,MAAM,QAAQ,kBAAkB,uBAAuB;AAAA,IACzE;AACA,QAAI,SAAS,SAAS,KAAK;AACzB,YAAM,OAAO,iBAAiB,SAAS,KAAK;AAC5C,UAAI,MAAM;AACR,cAAM,IAAI,SAAS,MAAM,MAAM,WAAW,IAAI,MAAM;AACpD,YAAI,SAAS,MAAM,SAAS,GAAG,GAAG;AAChC,iBAAO,GAAG,CAAC,IAAI,IAAI;AAAA,QACrB;AACA,eAAO,GAAG,CAAC,GAAG,IAAI;AAAA,MACpB;AACA,aAAO,SAAS,MAAM,QAAQ,kBAAkB,yBAAyB;AAAA,IAC3E;AACA,WAAO,SAAS;AAAA,EAClB;AAGF;AAmBA,SAAS,wBAAwB,OAAO;AACtC,MAAI,CAAC,CAAC,OAAO,KAAK,EAAE,SAAS,MAAM,GAAG,GAAG;AACvC;AAAA,EACF;AACA,QAAM,WAAW,QAAQ,QAAM,2BAA2B,EAAE,CAAC;AAE7D,WAAS,2BAA2B,UAAU;AAC5C,QAAI,MAAM,QAAQ,SAAS,CAAC,KAAK,KAAK,GAAG,EAAE,SAAS,SAAS,IAAI,GAAG;AAClE,eAAS,QAAQ,+BAA+B,2BAA2B,2BAA2B,2BAA2B,SAAS,KAAK,CAAC,CAAC,CAAC;AAClJ;AAAA,IACF;AACA,QAAI,MAAM,QAAQ,OAAO;AACvB,eAAS,QAAQ,+BAA+B,2BAA2B,2BAA2B,2BAA2B,SAAS,KAAK,CAAC,CAAC,CAAC;AAClJ;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,2BAA2B,OAAO;AACzC,SAAO,MAAM,QAAQ,eAAe,MAAM,EACxC,QAAQ,mBAAmB,eAAe,EAC1C,QAAQ,iBAAiB,qBAAqB,EAC9C,QAAQ,cAAc,UAAU,EAChC,QAAQ,gBAAgB,WAAW,EAAE,QAAQ,cAAc,WAAW,EACtE,QAAQ,eAAe,QAAQ,EAC/B,QAAQ,aAAa,OAAO,EAC5B,QAAQ,cAAc,aAAa,EACnC,QAAQ,gBAAgB,aAAa,EACrC,QAAQ,aAAa,UAAU,EAC/B,QAAQ,mBAAmB,aAAa,EAGxC,QAAQ,cAAc,OAAO,EAAE,QAAQ,WAAW,OAAO,EACzD,QAAQ,gBAAgB,WAAW,EAAE,QAAQ,cAAc,WAAW,EACtE,QAAQ,cAAc,KAAK,EAC3B,QAAQ,gBAAgB,WAAW,EACnC,QAAQ,aAAa,cAAc,EACnC,QAAQ,yDAAyD,EAAE,EACnE,QAAQ,eAAe,QAAQ;AACnC;AAEA,SAAS,2BAA2B,OAAO;AACzC,SAAO,MAAM,QAAQ,aAAa,OAAO,EAGvC,QAAQ,aAAa,SAAS,EAAE,QAAQ,cAAc,SAAS,EAC/D,QAAQ,aAAa,SAAS,EAAE,QAAQ,cAAc,SAAS,EAC/D,QAAQ,sBAAsB,gBAAgB,EAAE,QAAQ,oBAAoB,gBAAgB,EAC5F,QAAQ,kBAAkB,IAAI;AAElC;AAEA,SAAS,2BAA2B,OAAO;AACzC,SAAO,MAAM,QAAQ,aAAa,QAAQ,EACxC,QAAQ,cAAc,WAAQ,EAAE,QAAQ,cAAc,WAAQ;AAGlE;AAEA,SAAS,+BAA+B,OAAO;AAC7C,SAAO,MAAM,QAAQ,UAAU,YAAY,EACzC,QAAQ,iBAAiB,MAAM,EAC/B,QAAQ,eAAe,oBAAW,EAClC,QAAQ,mBAAmB,gBAAgB,EAC3C,QAAQ,iBAAiB,OAAO,EAChC,QAAQ,kBAAkB,aAAU,EAEpC,QAAQ,mBAAmB,SAAS,EACpC,QAAQ,kBAAkB,UAAU,EACpC,QAAQ,cAAc,OAAO,EAE7B,QAAQ,iBAAiB,WAAW,EACpC,QAAQ,+BAA+B,gCAAuB,EAC9D,QAAQ,WAAW,eAAS,EAC5B,QAAQ,gBAAgB,MAAM,EAC9B,QAAQ,qBAAqB,gBAAa,EAC1C,QAAQ,uBAAuB,gBAAa,EAC5C,QAAQ,qBAAqB,gBAAa,EAC1C,QAAQ,kBAAkB,cAAc,EACxC,QAAQ,0BAA0B,gBAAgB,EAClD,QAAQ,wBAAwB,4BAA4B,EAC5D,QAAQ,uBAAuB,YAAY,EAC3C,QAAQ,gCAAgC,gBAAa,EACrD,QAAQ,6BAA6B,cAAc,EACnD,QAAQ,gBAAgB,QAAQ,EAChC,QAAQ,6BAA6B,2BAA2B,EAChE,QAAQ,eAAe,WAAW,EAClC,QAAQ,uBAAuB,WAAW,EAC1C,QAAQ,mBAAmB,cAAc,EACzC,QAAQ,iBAAiB,OAAO,EAChC,QAAQ,kBAAkB,cAAW,EACrC,QAAQ,2BAA2B,2BAA2B,EAC9D,QAAQ,oBAAoB,eAAY,EACxC,QAAQ,oBAAoB,gBAAU,EACtC,QAAQ,qBAAqB,oBAAW,EACxC,QAAQ,cAAc,QAAQ,EAC9B,QAAQ,eAAe,UAAU,EACjC,QAAQ,WAAW,WAAW,EAC9B,QAAQ,mBAAgB,mBAAgB,EACxC,QAAQ,mBAAmB,gBAAgB,EAC3C,QAAQ,gBAAgB,gBAAgB,EACxC,QAAQ,cAAc,gBAAgB,EACtC,QAAQ,mBAAmB,eAAY,EACvC,QAAQ,gBAAgB,OAAO,EAC/B,QAAQ,oBAAoB,mBAAgB,EAC5C,QAAQ,gBAAgB,OAAO,EAC/B,QAAQ,oBAAoB,mBAAgB,EAC5C,QAAQ,gBAAgB,iCAAwB,EAChD,QAAQ,mBAAmB,oBAAc,EAAE,QAAQ,kBAAkB,mBAAa,EAClF,QAAQ,eAAe,oBAAW,EAAE,QAAQ,mBAAmB,gBAAU,EACzE,QAAQ,sCAAsC,gBAAa,EAC3D,QAAQ,YAAY,gBAAgB,EACpC,QAAQ,cAAc,gBAAgB,EACtC,QAAQ,qBAAqB,4BAA4B,EACzD,QAAQ,yBAAyB,gBAAgB,EACjD,QAAQ,cAAc,eAAY,EAClC,QAAQ,aAAa,WAAW,EAChC,QAAQ,iBAAiB,SAAS;AAEtC;",
6
+ "names": ["field"]
7
+ }
@@ -0,0 +1,46 @@
1
+ import assert from "node:assert";
2
+ import { after, before } from "node:test";
3
+ import { MarcRecord } from "@natlibfi/marc-record";
4
+ import validatorFactory from "./cyrillux-usemarcon-replacement.js";
5
+ import { READERS } from "@natlibfi/fixura";
6
+ import generateTests from "@natlibfi/fixugen";
7
+ before(() => {
8
+ MarcRecord.setValidationOptions({ subfields: false, subfieldValues: false });
9
+ });
10
+ after(() => {
11
+ MarcRecord.setValidationOptions({});
12
+ });
13
+ generateTests({
14
+ callback,
15
+ path: [import.meta.dirname, "..", "test-fixtures", "cyrillux-usemarcon-replacement"],
16
+ useMetadataFile: true,
17
+ recurse: false,
18
+ fixura: {
19
+ reader: READERS.JSON
20
+ },
21
+ hooks: {
22
+ before: async () => {
23
+ testValidatorFactory();
24
+ }
25
+ }
26
+ });
27
+ async function testValidatorFactory() {
28
+ const validator = await validatorFactory();
29
+ assert.equal(typeof validator, "object");
30
+ assert.equal(typeof validator.description, "string");
31
+ assert.equal(typeof validator.validate, "function");
32
+ assert.equal(typeof validator.fix, "function");
33
+ }
34
+ async function callback({ getFixture, fix = false }) {
35
+ const validator = await validatorFactory();
36
+ const record = new MarcRecord(getFixture("record.json"));
37
+ const expectedResult = getFixture("expectedResult.json");
38
+ if (!fix) {
39
+ const result = await validator.validate(record);
40
+ assert.deepEqual(result, expectedResult);
41
+ return;
42
+ }
43
+ await validator.fix(record);
44
+ assert.deepEqual(record, expectedResult);
45
+ }
46
+ //# sourceMappingURL=cyrillux-usemarcon-replacement.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/cyrillux-usemarcon-replacement.test.js"],
4
+ "sourcesContent": ["import assert from 'node:assert';\nimport {after, before} from 'node:test';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './cyrillux-usemarcon-replacement.js';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\n\nbefore(() => {\n MarcRecord.setValidationOptions({subfields: false, subfieldValues: false});\n});\n\nafter(() => {\n MarcRecord.setValidationOptions({});\n});\n\ngenerateTests({\n callback,\n path: [import.meta.dirname, '..', 'test-fixtures', 'cyrillux-usemarcon-replacement'],\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\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 assert.equal(typeof validator.fix, '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,OAAO,cAAa;AAC5B,SAAQ,kBAAiB;AACzB,OAAO,sBAAsB;AAC7B,SAAQ,eAAc;AACtB,OAAO,mBAAmB;AAE1B,OAAO,MAAM;AACX,aAAW,qBAAqB,EAAC,WAAW,OAAO,gBAAgB,MAAK,CAAC;AAC3E,CAAC;AAED,MAAM,MAAM;AACV,aAAW,qBAAqB,CAAC,CAAC;AACpC,CAAC;AAED,cAAc;AAAA,EACZ;AAAA,EACA,MAAM,CAAC,YAAY,SAAS,MAAM,iBAAiB,gCAAgC;AAAA,EACnF,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;AAGD,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;AAClD,SAAO,MAAM,OAAO,UAAU,KAAK,UAAU;AAC/C;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
+ }