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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (563) hide show
  1. package/.github/workflows/{melinda-node-tests.yml → melinda-node-tests-and-publish.yml} +37 -12
  2. package/dist/access-rights.js +63 -91
  3. package/dist/access-rights.js.map +7 -1
  4. package/dist/access-rights.test.js +137 -0
  5. package/dist/access-rights.test.js.map +7 -0
  6. package/dist/addMissingField041.js +21 -53
  7. package/dist/addMissingField041.js.map +7 -1
  8. package/dist/addMissingField041.test.js +39 -0
  9. package/dist/addMissingField041.test.js.map +7 -0
  10. package/dist/addMissingField336.js +99 -191
  11. package/dist/addMissingField336.js.map +7 -1
  12. package/dist/addMissingField336.test.js +39 -0
  13. package/dist/addMissingField336.test.js.map +7 -0
  14. package/dist/addMissingField337.js +63 -132
  15. package/dist/addMissingField337.js.map +7 -1
  16. package/dist/addMissingField337.test.js +39 -0
  17. package/dist/addMissingField337.test.js.map +7 -0
  18. package/dist/addMissingField338.js +147 -253
  19. package/dist/addMissingField338.js.map +7 -1
  20. package/dist/addMissingField338.test.js +39 -0
  21. package/dist/addMissingField338.test.js.map +7 -0
  22. package/dist/cyrillux-usemarcon-replacement.js +119 -272
  23. package/dist/cyrillux-usemarcon-replacement.js.map +7 -1
  24. package/dist/cyrillux-usemarcon-replacement.test.js +43 -0
  25. package/dist/cyrillux-usemarcon-replacement.test.js.map +7 -0
  26. package/dist/cyrillux.js +119 -223
  27. package/dist/cyrillux.js.map +7 -1
  28. package/dist/cyrillux.test.js +39 -0
  29. package/dist/cyrillux.test.js.map +7 -0
  30. package/dist/disambiguateSeriesStatements.js +40 -81
  31. package/dist/disambiguateSeriesStatements.js.map +7 -1
  32. package/dist/disambiguateSeriesStatements.test.js +44 -0
  33. package/dist/disambiguateSeriesStatements.test.js.map +7 -0
  34. package/dist/double-commas.js +7 -14
  35. package/dist/double-commas.js.map +7 -1
  36. package/dist/double-commas.test.js +48 -0
  37. package/dist/double-commas.test.js.map +7 -0
  38. package/dist/duplicates-ind1.js +10 -31
  39. package/dist/duplicates-ind1.js.map +7 -1
  40. package/dist/duplicates-ind1.test.js +40 -0
  41. package/dist/duplicates-ind1.test.js.map +7 -0
  42. package/dist/empty-fields.js +10 -22
  43. package/dist/empty-fields.js.map +7 -1
  44. package/dist/empty-fields.test.js +129 -0
  45. package/dist/empty-fields.test.js.map +7 -0
  46. package/dist/ending-punctuation-conf.js +873 -769
  47. package/dist/ending-punctuation-conf.js.map +7 -1
  48. package/dist/ending-punctuation.js +156 -169
  49. package/dist/ending-punctuation.js.map +7 -1
  50. package/dist/ending-punctuation.test.js +2385 -0
  51. package/dist/ending-punctuation.test.js.map +7 -0
  52. package/dist/ending-whitespace.js +10 -35
  53. package/dist/ending-whitespace.js.map +7 -1
  54. package/dist/ending-whitespace.test.js +38 -0
  55. package/dist/ending-whitespace.test.js.map +7 -0
  56. package/dist/field-008-18-34-character-groups.js +40 -125
  57. package/dist/field-008-18-34-character-groups.js.map +7 -1
  58. package/dist/field-008-18-34-character-groups.test.js +45 -0
  59. package/dist/field-008-18-34-character-groups.test.js.map +7 -0
  60. package/dist/field-505-separators.js +19 -39
  61. package/dist/field-505-separators.js.map +7 -1
  62. package/dist/field-505-separators.test.js +45 -0
  63. package/dist/field-505-separators.test.js.map +7 -0
  64. package/dist/field-521-fix.js +19 -47
  65. package/dist/field-521-fix.js.map +7 -1
  66. package/dist/field-521-fix.test.js +44 -0
  67. package/dist/field-521-fix.test.js.map +7 -0
  68. package/dist/field-exclusion.js +37 -91
  69. package/dist/field-exclusion.js.map +7 -1
  70. package/dist/field-exclusion.test.js +821 -0
  71. package/dist/field-exclusion.test.js.map +7 -0
  72. package/dist/field-structure.js +52 -104
  73. package/dist/field-structure.js.map +7 -1
  74. package/dist/field-structure.test.js +587 -0
  75. package/dist/field-structure.test.js.map +7 -0
  76. package/dist/field33XUtils.js +119 -503
  77. package/dist/field33XUtils.js.map +7 -1
  78. package/dist/fields-present.js +11 -23
  79. package/dist/fields-present.js.map +7 -1
  80. package/dist/fields-present.test.js +95 -0
  81. package/dist/fields-present.test.js.map +7 -0
  82. package/dist/fix-33X.js +393 -431
  83. package/dist/fix-33X.js.map +7 -1
  84. package/dist/fix-33X.test.js +39 -0
  85. package/dist/fix-33X.test.js.map +7 -0
  86. package/dist/fix-country-codes.js +20 -50
  87. package/dist/fix-country-codes.js.map +7 -1
  88. package/dist/fix-country-codes.test.js +44 -0
  89. package/dist/fix-country-codes.test.js.map +7 -0
  90. package/dist/fix-language-codes.js +23 -53
  91. package/dist/fix-language-codes.js.map +7 -1
  92. package/dist/fix-language-codes.test.js +38 -0
  93. package/dist/fix-language-codes.test.js.map +7 -0
  94. package/dist/fixRelatorTerms.js +82 -209
  95. package/dist/fixRelatorTerms.js.map +7 -1
  96. package/dist/fixRelatorTerms.test.js +44 -0
  97. package/dist/fixRelatorTerms.test.js.map +7 -0
  98. package/dist/fixed-fields.js +21 -30
  99. package/dist/fixed-fields.js.map +7 -1
  100. package/dist/fixed-fields.test.js +87 -0
  101. package/dist/fixed-fields.test.js.map +7 -0
  102. package/dist/identical-fields.js +8 -24
  103. package/dist/identical-fields.js.map +7 -1
  104. package/dist/identical-fields.test.js +119 -0
  105. package/dist/identical-fields.test.js.map +7 -0
  106. package/dist/index.js +182 -413
  107. package/dist/index.js.map +7 -1
  108. package/dist/indicator-fixes.js +66 -94
  109. package/dist/indicator-fixes.js.map +7 -1
  110. package/dist/indicator-fixes.test.js +42 -0
  111. package/dist/indicator-fixes.test.js.map +7 -0
  112. package/dist/isbn-issn.js +71 -128
  113. package/dist/isbn-issn.js.map +7 -1
  114. package/dist/isbn-issn.test.js +398 -0
  115. package/dist/isbn-issn.test.js.map +7 -0
  116. package/dist/item-language.js +32 -65
  117. package/dist/item-language.js.map +7 -1
  118. package/dist/item-language.test.js +322 -0
  119. package/dist/item-language.test.js.map +7 -0
  120. package/dist/melindaCustomMergeFields.js +5182 -11233
  121. package/dist/melindaCustomMergeFields.js.map +7 -1
  122. package/dist/merge-fields/controlSubfields.js +75 -142
  123. package/dist/merge-fields/controlSubfields.js.map +7 -1
  124. package/dist/merge-fields/counterpartField.js +187 -379
  125. package/dist/merge-fields/counterpartField.js.map +7 -1
  126. package/dist/merge-fields/dataProvenance.js +29 -0
  127. package/dist/merge-fields/dataProvenance.js.map +7 -0
  128. package/dist/merge-fields/index.js +25 -50
  129. package/dist/merge-fields/index.js.map +7 -1
  130. package/dist/merge-fields/mergableIndicator.js +18 -51
  131. package/dist/merge-fields/mergableIndicator.js.map +7 -1
  132. package/dist/merge-fields/mergableTag.js +78 -30
  133. package/dist/merge-fields/mergableTag.js.map +7 -1
  134. package/dist/merge-fields/mergeConfig.js +66 -171
  135. package/dist/merge-fields/mergeConfig.js.map +7 -1
  136. package/dist/merge-fields/mergeConstraints.js +323 -1214
  137. package/dist/merge-fields/mergeConstraints.js.map +7 -1
  138. package/dist/merge-fields/mergeField.js +47 -111
  139. package/dist/merge-fields/mergeField.js.map +7 -1
  140. package/dist/merge-fields/mergeIndicator.js +64 -118
  141. package/dist/merge-fields/mergeIndicator.js.map +7 -1
  142. package/dist/merge-fields/mergeOrAddPostprocess.js +14 -38
  143. package/dist/merge-fields/mergeOrAddPostprocess.js.map +7 -1
  144. package/dist/merge-fields/mergeOrAddSubfield.js +62 -104
  145. package/dist/merge-fields/mergeOrAddSubfield.js.map +7 -1
  146. package/dist/merge-fields/mergeSubfield.js +47 -95
  147. package/dist/merge-fields/mergeSubfield.js.map +7 -1
  148. package/dist/merge-fields/removeDuplicateSubfields.js +18 -31
  149. package/dist/merge-fields/removeDuplicateSubfields.js.map +7 -1
  150. package/dist/merge-fields/worldKnowledge.js +15 -40
  151. package/dist/merge-fields/worldKnowledge.js.map +7 -1
  152. package/dist/merge-fields.test.js +46 -0
  153. package/dist/merge-fields.test.js.map +7 -0
  154. package/dist/mergeField500Lisapainokset.js +27 -56
  155. package/dist/mergeField500Lisapainokset.js.map +7 -1
  156. package/dist/mergeField500Lisapainokset.test.js +44 -0
  157. package/dist/mergeField500Lisapainokset.test.js.map +7 -0
  158. package/dist/mergeRelatorTermFields.js +33 -69
  159. package/dist/mergeRelatorTermFields.js.map +7 -1
  160. package/dist/mergeRelatorTermFields.test.js +44 -0
  161. package/dist/mergeRelatorTermFields.test.js.map +7 -0
  162. package/dist/modernize-502.js +23 -55
  163. package/dist/modernize-502.js.map +7 -1
  164. package/dist/modernize-502.test.js +38 -0
  165. package/dist/modernize-502.test.js.map +7 -0
  166. package/dist/multiple-subfield-0.js +23 -48
  167. package/dist/multiple-subfield-0.js.map +7 -1
  168. package/dist/multiple-subfield-0.test.js +44 -0
  169. package/dist/multiple-subfield-0.test.js.map +7 -0
  170. package/dist/non-breaking-space.js +11 -32
  171. package/dist/non-breaking-space.js.map +7 -1
  172. package/dist/non-breaking-space.test.js +38 -0
  173. package/dist/non-breaking-space.test.js.map +7 -0
  174. package/dist/normalize-dashes.js +18 -37
  175. package/dist/normalize-dashes.js.map +7 -1
  176. package/dist/normalize-dashes.test.js +44 -0
  177. package/dist/normalize-dashes.test.js.map +7 -0
  178. package/dist/normalize-identifiers.js +54 -140
  179. package/dist/normalize-identifiers.js.map +7 -1
  180. package/dist/normalize-identifiers.test.js +44 -0
  181. package/dist/normalize-identifiers.test.js.map +7 -0
  182. package/dist/normalize-qualifying-information.js +23 -48
  183. package/dist/normalize-qualifying-information.js.map +7 -1
  184. package/dist/normalize-qualifying-information.test.js +44 -0
  185. package/dist/normalize-qualifying-information.test.js.map +7 -0
  186. package/dist/normalize-utf8-diacritics.js +19 -105
  187. package/dist/normalize-utf8-diacritics.js.map +7 -1
  188. package/dist/normalize-utf8-diacritics.test.js +44 -0
  189. package/dist/normalize-utf8-diacritics.test.js.map +7 -0
  190. package/dist/normalizeFieldForComparison.js +91 -158
  191. package/dist/normalizeFieldForComparison.js.map +7 -1
  192. package/dist/normalizeSubfieldValueForComparison.js +37 -77
  193. package/dist/normalizeSubfieldValueForComparison.js.map +7 -1
  194. package/dist/prepublicationUtils.js +58 -111
  195. package/dist/prepublicationUtils.js.map +7 -1
  196. package/dist/punctuation/index.js +56 -72
  197. package/dist/punctuation/index.js.map +7 -1
  198. package/dist/punctuation/rules/aut.js +372 -331
  199. package/dist/punctuation/rules/aut.js.map +7 -1
  200. package/dist/punctuation/rules/bib.js +420 -373
  201. package/dist/punctuation/rules/bib.js.map +7 -1
  202. package/dist/punctuation/rules/index.js +7 -21
  203. package/dist/punctuation/rules/index.js.map +7 -1
  204. package/dist/punctuation.test.js +44 -0
  205. package/dist/punctuation.test.js.map +7 -0
  206. package/dist/punctuation2.js +259 -802
  207. package/dist/punctuation2.js.map +7 -1
  208. package/dist/punctuation2.test.js +44 -0
  209. package/dist/punctuation2.test.js.map +7 -0
  210. package/dist/reindexSubfield6OccurenceNumbers.js +61 -96
  211. package/dist/reindexSubfield6OccurenceNumbers.js.map +7 -1
  212. package/dist/reindexSubfield6OccurenceNumbers.test.js +44 -0
  213. package/dist/reindexSubfield6OccurenceNumbers.test.js.map +7 -0
  214. package/dist/removeDuplicateDataFields.js +102 -202
  215. package/dist/removeDuplicateDataFields.js.map +7 -1
  216. package/dist/removeDuplicateDataFields.test.js +44 -0
  217. package/dist/removeDuplicateDataFields.test.js.map +7 -0
  218. package/dist/removeInferiorDataFields.js +104 -227
  219. package/dist/removeInferiorDataFields.js.map +7 -1
  220. package/dist/removeInferiorDataFields.test.js +44 -0
  221. package/dist/removeInferiorDataFields.test.js.map +7 -0
  222. package/dist/resolvable-ext-references-melinda.js +25 -60
  223. package/dist/resolvable-ext-references-melinda.js.map +7 -1
  224. package/dist/resolvable-ext-references-melinda.test.js +160 -0
  225. package/dist/resolvable-ext-references-melinda.test.js.map +7 -0
  226. package/dist/resolveOrphanedSubfield6s.js +32 -63
  227. package/dist/resolveOrphanedSubfield6s.js.map +7 -1
  228. package/dist/resolveOrphanedSubfield6s.test.js +44 -0
  229. package/dist/resolveOrphanedSubfield6s.test.js.map +7 -0
  230. package/dist/sanitize-vocabulary-source-codes.js +27 -55
  231. package/dist/sanitize-vocabulary-source-codes.js.map +7 -1
  232. package/dist/sanitize-vocabulary-source-codes.test.js +45 -0
  233. package/dist/sanitize-vocabulary-source-codes.test.js.map +7 -0
  234. package/dist/sort-tags.js +13 -25
  235. package/dist/sort-tags.js.map +7 -1
  236. package/dist/sort-tags.test.js +261 -0
  237. package/dist/sort-tags.test.js.map +7 -0
  238. package/dist/sortFields.js +152 -222
  239. package/dist/sortFields.js.map +7 -1
  240. package/dist/sortFields.test.js +44 -0
  241. package/dist/sortFields.test.js.map +7 -0
  242. package/dist/sortRelatorTerms.js +30 -68
  243. package/dist/sortRelatorTerms.js.map +7 -1
  244. package/dist/sortRelatorTerms.test.js +44 -0
  245. package/dist/sortRelatorTerms.test.js.map +7 -0
  246. package/dist/sortSubfields.js +102 -255
  247. package/dist/sortSubfields.js.map +7 -1
  248. package/dist/sortSubfields.test.js +44 -0
  249. package/dist/sortSubfields.test.js.map +7 -0
  250. package/dist/stripPunctuation.js +13 -36
  251. package/dist/stripPunctuation.js.map +7 -1
  252. package/dist/stripPunctuation.test.js +44 -0
  253. package/dist/stripPunctuation.test.js.map +7 -0
  254. package/dist/subfield-exclusion.js +28 -75
  255. package/dist/subfield-exclusion.js.map +7 -1
  256. package/dist/subfield-exclusion.test.js +471 -0
  257. package/dist/subfield-exclusion.test.js.map +7 -0
  258. package/dist/subfield6Utils.js +107 -269
  259. package/dist/subfield6Utils.js.map +7 -1
  260. package/dist/subfield8Utils.js +26 -50
  261. package/dist/subfield8Utils.js.map +7 -1
  262. package/dist/subfieldValueNormalizations.js +40 -74
  263. package/dist/subfieldValueNormalizations.js.map +7 -1
  264. package/dist/subfieldValueNormalizations.test.js +45 -0
  265. package/dist/subfieldValueNormalizations.test.js.map +7 -0
  266. package/dist/sync-007-and-300.js +22 -53
  267. package/dist/sync-007-and-300.js.map +7 -1
  268. package/dist/sync-007-and-300.test.js +44 -0
  269. package/dist/sync-007-and-300.test.js.map +7 -0
  270. package/dist/translate-terms.js +67 -155
  271. package/dist/translate-terms.js.map +7 -1
  272. package/dist/translate-terms.test.js +54 -0
  273. package/dist/translate-terms.test.js.map +7 -0
  274. package/dist/typeOfDate-008.js +10 -25
  275. package/dist/typeOfDate-008.js.map +7 -1
  276. package/dist/typeOfDate-008.test.js +40 -0
  277. package/dist/typeOfDate-008.test.js.map +7 -0
  278. package/dist/unicode-decomposition.js +94 -107
  279. package/dist/unicode-decomposition.js.map +7 -1
  280. package/dist/unicode-decomposition.test.js +94 -0
  281. package/dist/unicode-decomposition.test.js.map +7 -0
  282. package/dist/update-field-540.js +30 -75
  283. package/dist/update-field-540.js.map +7 -1
  284. package/dist/update-field-540.test.js +44 -0
  285. package/dist/update-field-540.test.js.map +7 -0
  286. package/dist/urn.js +55 -128
  287. package/dist/urn.js.map +7 -1
  288. package/dist/urn.test.js +44 -0
  289. package/dist/urn.test.js.map +7 -0
  290. package/dist/utils.js +78 -126
  291. package/dist/utils.js.map +7 -1
  292. package/eslint.config.mjs +1 -2
  293. package/package.json +28 -101
  294. package/src/access-rights.js +1 -1
  295. package/src/{access-rights.spec.js → access-rights.test.js} +9 -10
  296. package/src/addMissingField041.js +1 -1
  297. package/src/{addMissingField336.spec.js → addMissingField041.test.js} +13 -14
  298. package/src/addMissingField336.js +3 -3
  299. package/src/{addMissingField041.spec.js → addMissingField336.test.js} +13 -14
  300. package/src/addMissingField337.js +2 -2
  301. package/src/{addMissingField337.spec.js → addMissingField337.test.js} +13 -14
  302. package/src/addMissingField338.js +2 -2
  303. package/src/{addMissingField338.spec.js → addMissingField338.test.js} +13 -14
  304. package/src/cyrillux-usemarcon-replacement.js +18 -18
  305. package/src/{cyrillux-usemarcon-replacement.spec.js → cyrillux-usemarcon-replacement.test.js} +17 -14
  306. package/src/cyrillux.js +19 -12
  307. package/src/{cyrillux.spec.js → cyrillux.test.js} +13 -14
  308. package/src/disambiguateSeriesStatements.js +2 -2
  309. package/src/{disambiguateSeriesStatements.spec.js → disambiguateSeriesStatements.test.js} +12 -13
  310. package/src/double-commas.js +1 -1
  311. package/src/{double-commas.spec.js → double-commas.test.js} +9 -11
  312. package/src/duplicates-ind1.js +1 -1
  313. package/src/{duplicates-ind1.spec.js → duplicates-ind1.test.js} +12 -13
  314. package/src/{empty-fields.spec.js → empty-fields.test.js} +11 -13
  315. package/src/ending-punctuation-conf.js +6 -5
  316. package/src/ending-punctuation.js +115 -24
  317. package/src/{ending-punctuation.spec.js → ending-punctuation.test.js} +357 -275
  318. package/src/{ending-whitespace.spec.js → ending-whitespace.test.js} +12 -13
  319. package/src/field-008-18-34-character-groups.js +2 -2
  320. package/src/{field-008-18-34-character-groups.spec.js → field-008-18-34-character-groups.test.js} +13 -13
  321. package/src/field-505-separators.js +3 -3
  322. package/src/{field-505-separators.spec.js → field-505-separators.test.js} +16 -14
  323. package/src/field-521-fix.js +2 -2
  324. package/src/{field-521-fix.spec.js → field-521-fix.test.js} +12 -13
  325. package/src/field-exclusion.js +1 -1
  326. package/src/{field-exclusion.spec.js → field-exclusion.test.js} +60 -57
  327. package/src/{field-structure.spec.js → field-structure.test.js} +29 -29
  328. package/src/{fields-present.spec.js → fields-present.test.js} +12 -15
  329. package/src/fix-33X.js +4 -4
  330. package/src/{fix-33X.spec.js → fix-33X.test.js} +13 -14
  331. package/src/fix-country-codes.js +1 -1
  332. package/src/{fix-country-codes.spec.js → fix-country-codes.test.js} +12 -13
  333. package/src/fix-language-codes.js +5 -5
  334. package/src/{fix-language-codes.spec.js → fix-language-codes.test.js} +12 -13
  335. package/src/fixRelatorTerms.js +5 -5
  336. package/src/{fixRelatorTerms.spec.js → fixRelatorTerms.test.js} +13 -13
  337. package/src/{fixed-fields.spec.js → fixed-fields.test.js} +11 -14
  338. package/src/identical-fields.js +1 -1
  339. package/src/{identical-fields.spec.js → identical-fields.test.js} +9 -11
  340. package/src/index.js +132 -59
  341. package/src/indicator-fixes.js +17 -4
  342. package/src/{indicator-fixes.spec.js → indicator-fixes.test.js} +9 -12
  343. package/src/isbn-issn.js +12 -7
  344. package/src/{isbn-issn.spec.js → isbn-issn.test.js} +20 -22
  345. package/src/{item-language.spec.js → item-language.test.js} +21 -22
  346. package/src/melindaCustomMergeFields.js +1 -1
  347. package/src/merge-fields/controlSubfields.js +1 -1
  348. package/src/merge-fields/counterpartField.js +14 -9
  349. package/src/merge-fields/dataProvenance.js +41 -0
  350. package/src/merge-fields/index.js +12 -3
  351. package/src/merge-fields/mergableIndicator.js +1 -1
  352. package/src/merge-fields/mergeField.js +8 -8
  353. package/src/merge-fields/mergeIndicator.js +1 -1
  354. package/src/merge-fields/mergeOrAddPostprocess.js +4 -4
  355. package/src/merge-fields/mergeOrAddSubfield.js +2 -2
  356. package/src/merge-fields/mergeSubfield.js +4 -4
  357. package/src/merge-fields/removeDuplicateSubfields.js +2 -2
  358. package/src/{merge-fields.spec.js → merge-fields.test.js} +18 -15
  359. package/src/mergeField500Lisapainokset.js +1 -1
  360. package/src/{mergeField500Lisapainokset.spec.js → mergeField500Lisapainokset.test.js} +12 -13
  361. package/src/mergeRelatorTermFields.js +5 -7
  362. package/src/{mergeRelatorTermFields.spec.js → mergeRelatorTermFields.test.js} +12 -13
  363. package/src/modernize-502.js +1 -1
  364. package/src/{modernize-502.spec.js → modernize-502.test.js} +12 -13
  365. package/src/multiple-subfield-0.js +3 -3
  366. package/src/{multiple-subfield-0.spec.js → multiple-subfield-0.test.js} +13 -13
  367. package/src/{non-breaking-space.spec.js → non-breaking-space.test.js} +12 -13
  368. package/src/normalize-dashes.js +2 -2
  369. package/src/{normalize-dashes.spec.js → normalize-dashes.test.js} +12 -13
  370. package/src/normalize-identifiers.js +1 -1
  371. package/src/{normalize-identifiers.spec.js → normalize-identifiers.test.js} +12 -13
  372. package/src/normalize-qualifying-information.js +2 -2
  373. package/src/{normalize-qualifying-information.spec.js → normalize-qualifying-information.test.js} +12 -13
  374. package/src/normalize-utf8-diacritics.js +2 -2
  375. package/src/{normalize-utf8-diacritics.spec.js → normalize-utf8-diacritics.test.js} +13 -13
  376. package/src/normalizeFieldForComparison.js +32 -6
  377. package/src/normalizeSubfieldValueForComparison.js +1 -1
  378. package/src/prepublicationUtils.js +4 -4
  379. package/src/punctuation/index.js +1 -1
  380. package/src/punctuation/rules/index.js +2 -2
  381. package/src/{punctuation.spec.js → punctuation.test.js} +12 -13
  382. package/src/punctuation2.js +17 -8
  383. package/src/{punctuation2.spec.js → punctuation2.test.js} +12 -13
  384. package/src/reindexSubfield6OccurenceNumbers.js +5 -7
  385. package/src/{reindexSubfield6OccurenceNumbers.spec.js → reindexSubfield6OccurenceNumbers.test.js} +12 -13
  386. package/src/removeDuplicateDataFields.js +11 -19
  387. package/src/{removeDuplicateDataFields.spec.js → removeDuplicateDataFields.test.js} +12 -13
  388. package/src/removeInferiorDataFields.js +15 -12
  389. package/src/{removeInferiorDataFields.spec.js → removeInferiorDataFields.test.js} +13 -13
  390. package/src/resolvable-ext-references-melinda.js +1 -1
  391. package/src/{resolvable-ext-references-melinda.spec.js → resolvable-ext-references-melinda.test.js} +42 -27
  392. package/src/resolveOrphanedSubfield6s.js +6 -6
  393. package/src/{resolveOrphanedSubfield6s.spec.js → resolveOrphanedSubfield6s.test.js} +13 -13
  394. package/src/sanitize-vocabulary-source-codes.js +4 -4
  395. package/src/{sanitize-vocabulary-source-codes.spec.js → sanitize-vocabulary-source-codes.test.js} +16 -14
  396. package/src/{sort-tags.spec.js → sort-tags.test.js} +9 -11
  397. package/src/sortFields.js +4 -4
  398. package/src/{sortFields.spec.js → sortFields.test.js} +12 -13
  399. package/src/sortRelatorTerms.js +3 -3
  400. package/src/{sortRelatorTerms.spec.js → sortRelatorTerms.test.js} +13 -13
  401. package/src/sortSubfields.js +8 -6
  402. package/src/{sortSubfields.spec.js → sortSubfields.test.js} +13 -13
  403. package/src/stripPunctuation.js +3 -3
  404. package/src/{stripPunctuation.spec.js → stripPunctuation.test.js} +13 -13
  405. package/src/subfield-exclusion.js +1 -1
  406. package/src/{subfield-exclusion.spec.js → subfield-exclusion.test.js} +45 -36
  407. package/src/subfield6Utils.js +6 -10
  408. package/src/subfield8Utils.js +4 -4
  409. package/src/subfieldValueNormalizations.js +3 -3
  410. package/src/{subfieldValueNormalizations.spec.js → subfieldValueNormalizations.test.js} +18 -14
  411. package/src/sync-007-and-300.js +2 -2
  412. package/src/{sync-007-and-300.spec.js → sync-007-and-300.test.js} +13 -13
  413. package/src/translate-terms.js +3 -3
  414. package/src/translate-terms.test.js +75 -0
  415. package/src/{typeOfDate-008.spec.js → typeOfDate-008.test.js} +12 -13
  416. package/src/{unicode-decomposition.spec.js → unicode-decomposition.test.js} +10 -16
  417. package/src/update-field-540.js +2 -2
  418. package/src/{update-field-540.spec.js → update-field-540.test.js} +13 -10
  419. package/src/urn.js +2 -2
  420. package/src/{urn.spec.js → urn.test.js} +12 -13
  421. package/src/utils.js +21 -5
  422. package/test-fixtures/field-505-separators/03/expectedResult.json +3 -1
  423. package/test-fixtures/field-505-separators/03/record.json +3 -0
  424. package/test-fixtures/indicator-fixes/10/expectedResult.json +11 -0
  425. package/test-fixtures/indicator-fixes/10/metadata.json +4 -0
  426. package/test-fixtures/indicator-fixes/10/record.json +11 -0
  427. package/test-fixtures/merge-fields/f05/expectedResult.json +24 -0
  428. package/test-fixtures/merge-fields/f05/metadata.json +6 -0
  429. package/test-fixtures/merge-fields/f05/record.json +30 -0
  430. package/test-fixtures/normalize-subfield-value/01/metadata.json +4 -1
  431. package/test-fixtures/normalize-subfield-value/01/record.json +3 -0
  432. package/test-fixtures/normalize-subfield-value/02/expectedResult.json +3 -1
  433. package/test-fixtures/normalize-subfield-value/02/metadata.json +2 -1
  434. package/test-fixtures/normalize-subfield-value/02/record.json +3 -0
  435. package/test-fixtures/remove-inferior-datafields/f16/expectedResult.json +12 -0
  436. package/test-fixtures/remove-inferior-datafields/f16/metadata.json +5 -0
  437. package/test-fixtures/remove-inferior-datafields/f16/record.json +14 -0
  438. package/test-fixtures/sanitize-vocabulary-source-codes/f03/expectedResult.json +3 -1
  439. package/test-fixtures/sanitize-vocabulary-source-codes/f04/expectedResult.json +3 -1
  440. package/test-fixtures/sanitize-vocabulary-source-codes/v04/metadata.json +1 -4
  441. package/test-fixtures/sanitize-vocabulary-source-codes/v04/record.json +1 -1
  442. package/test-fixtures/translate-terms-data.js +42 -0
  443. package/dist/access-rights.spec.js +0 -195
  444. package/dist/access-rights.spec.js.map +0 -1
  445. package/dist/addMissingField041.spec.js +0 -45
  446. package/dist/addMissingField041.spec.js.map +0 -1
  447. package/dist/addMissingField336.spec.js +0 -45
  448. package/dist/addMissingField336.spec.js.map +0 -1
  449. package/dist/addMissingField337.spec.js +0 -43
  450. package/dist/addMissingField337.spec.js.map +0 -1
  451. package/dist/addMissingField338.spec.js +0 -45
  452. package/dist/addMissingField338.spec.js.map +0 -1
  453. package/dist/cyrillux-usemarcon-replacement.spec.js +0 -45
  454. package/dist/cyrillux-usemarcon-replacement.spec.js.map +0 -1
  455. package/dist/cyrillux.spec.js +0 -46
  456. package/dist/cyrillux.spec.js.map +0 -1
  457. package/dist/disambiguateSeriesStatements.spec.js +0 -51
  458. package/dist/disambiguateSeriesStatements.spec.js.map +0 -1
  459. package/dist/double-commas.spec.js +0 -73
  460. package/dist/double-commas.spec.js.map +0 -1
  461. package/dist/duplicates-ind1.spec.js +0 -45
  462. package/dist/duplicates-ind1.spec.js.map +0 -1
  463. package/dist/empty-fields.spec.js +0 -118
  464. package/dist/empty-fields.spec.js.map +0 -1
  465. package/dist/ending-punctuation.spec.js +0 -2654
  466. package/dist/ending-punctuation.spec.js.map +0 -1
  467. package/dist/ending-whitespace.spec.js +0 -42
  468. package/dist/ending-whitespace.spec.js.map +0 -1
  469. package/dist/field-008-18-34-character-groups.spec.js +0 -51
  470. package/dist/field-008-18-34-character-groups.spec.js.map +0 -1
  471. package/dist/field-505-separators.spec.js +0 -51
  472. package/dist/field-505-separators.spec.js.map +0 -1
  473. package/dist/field-521-fix.spec.js +0 -51
  474. package/dist/field-521-fix.spec.js.map +0 -1
  475. package/dist/field-exclusion.spec.js +0 -1054
  476. package/dist/field-exclusion.spec.js.map +0 -1
  477. package/dist/field-structure.spec.js +0 -535
  478. package/dist/field-structure.spec.js.map +0 -1
  479. package/dist/fields-present.spec.js +0 -121
  480. package/dist/fields-present.spec.js.map +0 -1
  481. package/dist/fix-33X.spec.js +0 -45
  482. package/dist/fix-33X.spec.js.map +0 -1
  483. package/dist/fix-country-codes.spec.js +0 -51
  484. package/dist/fix-country-codes.spec.js.map +0 -1
  485. package/dist/fix-language-codes.spec.js +0 -44
  486. package/dist/fix-language-codes.spec.js.map +0 -1
  487. package/dist/fixRelatorTerms.spec.js +0 -51
  488. package/dist/fixRelatorTerms.spec.js.map +0 -1
  489. package/dist/fixed-fields.spec.js +0 -140
  490. package/dist/fixed-fields.spec.js.map +0 -1
  491. package/dist/identical-fields.spec.js +0 -99
  492. package/dist/identical-fields.spec.js.map +0 -1
  493. package/dist/indicator-fixes.spec.js +0 -51
  494. package/dist/indicator-fixes.spec.js.map +0 -1
  495. package/dist/isbn-issn.spec.js +0 -595
  496. package/dist/isbn-issn.spec.js.map +0 -1
  497. package/dist/item-language.spec.js +0 -306
  498. package/dist/item-language.spec.js.map +0 -1
  499. package/dist/melindaCustomMergeFields.json +0 -5120
  500. package/dist/merge-fields.spec.js +0 -51
  501. package/dist/merge-fields.spec.js.map +0 -1
  502. package/dist/mergeField500Lisapainokset.spec.js +0 -51
  503. package/dist/mergeField500Lisapainokset.spec.js.map +0 -1
  504. package/dist/mergeRelatorTermFields.spec.js +0 -51
  505. package/dist/mergeRelatorTermFields.spec.js.map +0 -1
  506. package/dist/modernize-502.spec.js +0 -49
  507. package/dist/modernize-502.spec.js.map +0 -1
  508. package/dist/multiple-subfield-0.spec.js +0 -51
  509. package/dist/multiple-subfield-0.spec.js.map +0 -1
  510. package/dist/non-breaking-space.spec.js +0 -42
  511. package/dist/non-breaking-space.spec.js.map +0 -1
  512. package/dist/normalize-dashes.spec.js +0 -51
  513. package/dist/normalize-dashes.spec.js.map +0 -1
  514. package/dist/normalize-identifiers.spec.js +0 -51
  515. package/dist/normalize-identifiers.spec.js.map +0 -1
  516. package/dist/normalize-qualifying-information.spec.js +0 -51
  517. package/dist/normalize-qualifying-information.spec.js.map +0 -1
  518. package/dist/normalize-utf8-diacritics.spec.js +0 -51
  519. package/dist/normalize-utf8-diacritics.spec.js.map +0 -1
  520. package/dist/punctuation.spec.js +0 -51
  521. package/dist/punctuation.spec.js.map +0 -1
  522. package/dist/punctuation2.spec.js +0 -51
  523. package/dist/punctuation2.spec.js.map +0 -1
  524. package/dist/reindexSubfield6OccurenceNumbers.spec.js +0 -51
  525. package/dist/reindexSubfield6OccurenceNumbers.spec.js.map +0 -1
  526. package/dist/removeDuplicateDataFields.spec.js +0 -51
  527. package/dist/removeDuplicateDataFields.spec.js.map +0 -1
  528. package/dist/removeInferiorDataFields.spec.js +0 -51
  529. package/dist/removeInferiorDataFields.spec.js.map +0 -1
  530. package/dist/resolvable-ext-references-melinda.spec.js +0 -166
  531. package/dist/resolvable-ext-references-melinda.spec.js.map +0 -1
  532. package/dist/resolveOrphanedSubfield6s.spec.js +0 -51
  533. package/dist/resolveOrphanedSubfield6s.spec.js.map +0 -1
  534. package/dist/sanitize-vocabulary-source-codes.spec.js +0 -51
  535. package/dist/sanitize-vocabulary-source-codes.spec.js.map +0 -1
  536. package/dist/sort-tags.spec.js +0 -207
  537. package/dist/sort-tags.spec.js.map +0 -1
  538. package/dist/sortFields.spec.js +0 -51
  539. package/dist/sortFields.spec.js.map +0 -1
  540. package/dist/sortRelatorTerms.spec.js +0 -51
  541. package/dist/sortRelatorTerms.spec.js.map +0 -1
  542. package/dist/sortSubfields.spec.js +0 -52
  543. package/dist/sortSubfields.spec.js.map +0 -1
  544. package/dist/stripPunctuation.spec.js +0 -51
  545. package/dist/stripPunctuation.spec.js.map +0 -1
  546. package/dist/subfield-exclusion.spec.js +0 -523
  547. package/dist/subfield-exclusion.spec.js.map +0 -1
  548. package/dist/subfieldValueNormalizations.spec.js +0 -51
  549. package/dist/subfieldValueNormalizations.spec.js.map +0 -1
  550. package/dist/sync-007-and-300.spec.js +0 -51
  551. package/dist/sync-007-and-300.spec.js.map +0 -1
  552. package/dist/translate-terms.spec.js +0 -51
  553. package/dist/translate-terms.spec.js.map +0 -1
  554. package/dist/typeOfDate-008.spec.js +0 -47
  555. package/dist/typeOfDate-008.spec.js.map +0 -1
  556. package/dist/unicode-decomposition.spec.js +0 -91
  557. package/dist/unicode-decomposition.spec.js.map +0 -1
  558. package/dist/update-field-540.spec.js +0 -51
  559. package/dist/update-field-540.spec.js.map +0 -1
  560. package/dist/urn.spec.js +0 -52
  561. package/dist/urn.spec.js.map +0 -1
  562. package/src/melindaCustomMergeFields.json +0 -5120
  563. package/src/translate-terms.spec.js +0 -52
@@ -1 +1,7 @@
1
- {"version":3,"file":"item-language.js","names":["_cld3Asm","require","_langs","_interopRequireDefault","_debug","e","__esModule","default","_default","tagPattern","treshold","debug","createDebugLogger","cldFactory","loadCLD","RegExp","description","validate","fix","Error","record","results","checkLanguage","failed","valid","Boolean","currentCode","messages","detected","suggested","join","f008","get","shift","start","value","slice","end","f041","subfield","subfields","find","sf","code","push","sort","a","b","insertField","tag","ind1","ind2","text","getText","langCode","getLanguageCode","Identifier","create","length","dispose","findLanguage","is_reliable","probability","get2TLangCode","language","err","err2","stack","message","reduce","acc","field","fieldText","test","LanguageCodes","where"],"sources":["../src/item-language.js"],"sourcesContent":["import {loadModule as loadCLD} from 'cld3-asm';\nimport LanguageCodes from 'langs';\nimport createDebugLogger from 'debug';\n\nexport default async function (tagPattern, treshold = 0.9) {\n const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/item-language');\n const cldFactory = await loadCLD();\n\n if (tagPattern instanceof RegExp) {\n return {\n description:\n 'Handles invalid/missing item language code',\n validate,\n fix\n };\n }\n\n throw new Error('No tagPattern provided');\n\n async function validate(record) {\n const results = await checkLanguage(record);\n\n if (results.failed) {\n return {valid: Boolean(results.currentCode), messages: ['Language detection failed']};\n }\n\n if (results.detected) {\n if (results.detected !== results.currentCode) {\n return {valid: false, messages: [`Item language code is invalid. Correct language code: ${results.detected}`]};\n }\n\n return {valid: true};\n }\n\n if (results.suggested) {\n return {valid: Boolean(results.currentCode), messages: [`Item language code is invalid. Current code: ${results.currentCode}, suggestions: ${results.suggested.join()}`]};\n }\n }\n\n async function fix(record) {\n const results = await checkLanguage(record);\n\n if (results.suggested && results.currentCode) {\n return;\n }\n\n if (results.failed && !results.currentCode) {\n return;\n }\n\n if (results.detected && results.detected !== results.currentCode) {\n const f008 = record.get(/^008$/u).shift();\n\n if (f008) {\n const start = f008.value.slice(0, 35);\n const end = f008.value.slice(38);\n f008.value = `${start}${results.detected}${end}`;\n }\n\n const f041 = record.get(/^041$/u).shift();\n\n if (f041) {\n const subfield = f041.subfields.find(sf => sf.code === 'a');\n\n if (subfield) {\n subfield.value = results.detected;\n } else {\n f041.subfields.push({code: 'a', value: results.detected});\n f041.subfields.sort((a, b) => {\n if (a.code < b.code) {\n return -1;\n }\n\n if (a.code > b.code) {\n return 1;\n }\n\n return 0;\n });\n }\n } else {\n record.insertField({tag: '041', ind1: ' ', ind2: ' ', subfields: [\n {\n code: 'a',\n value: results.detected\n }\n ]});\n }\n }\n }\n\n async function checkLanguage(record) {\n const text = getText(record);\n const langCode = getLanguageCode(record);\n\n const Identifier = cldFactory.create();\n\n if (text.length === 0) {\n Identifier.dispose();\n return {failed: true, currentCode: langCode};\n }\n\n try {\n const results = await Identifier.findLanguage(text);\n Identifier.dispose();\n\n if (results.is_reliable) {\n if (results.probability >= treshold) {\n return {\n detected: get2TLangCode(results.language),\n currentCode: langCode\n };\n }\n\n return {\n currentCode: langCode,\n suggested: [get2TLangCode(results.language)]\n };\n }\n\n return {failed: true, currentCode: langCode};\n } catch (err) {\n /* istanbul ignore next: How to cause errors? */\n try {\n Identifier.dispose();\n } catch (err2) {\n debug(`Got error disposing identifier: ${err2 instanceof Error ? err2.stack : err2}`);\n }\n\n /* istanbul ignore next: How to cause errors? */\n throw err instanceof Error ? err : new Error(err.message);\n }\n\n function getText(record) {\n return record.get(tagPattern).reduce((acc, field) => {\n const fieldText = field.subfields.find(sf => sf.code === 'a').value;\n return `${acc}${fieldText}`;\n }, '');\n }\n\n function getLanguageCode(record) {\n const [f008] = record.get(/^008$/u);\n\n if (f008) {\n const code = f008.value.slice(35, 38);\n if ((/^[a-z][a-z][a-z]$/u).test(code) && code !== 'zxx') {\n return code;\n }\n }\n\n const [f041] = record.get(/^041$/u);\n\n if (f041) {\n const code = f041.subfields.find(sf => sf.code === 'a').value;\n return code;\n }\n }\n\n function get2TLangCode(code) {\n return LanguageCodes.where('1', code)['2T'];\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/item-language.js"],
4
+ "sourcesContent": ["import {loadModule as loadCLD} from 'cld3-asm';\nimport LanguageCodes from 'langs';\nimport createDebugLogger from 'debug';\n\nexport default async function (tagPattern, treshold = 0.9) {\n const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/item-language');\n const cldFactory = await loadCLD();\n\n if (tagPattern instanceof RegExp) {\n return {\n description:\n 'Handles invalid/missing item language code',\n validate,\n fix\n };\n }\n\n throw new Error('No tagPattern provided');\n\n async function validate(record) {\n const results = await checkLanguage(record);\n\n if (results.failed) {\n return {valid: Boolean(results.currentCode), messages: ['Language detection failed']};\n }\n\n if (results.detected) {\n if (results.detected !== results.currentCode) {\n return {valid: false, messages: [`Item language code is invalid. Correct language code: ${results.detected}`]};\n }\n\n return {valid: true};\n }\n\n if (results.suggested) {\n return {valid: Boolean(results.currentCode), messages: [`Item language code is invalid. Current code: ${results.currentCode}, suggestions: ${results.suggested.join()}`]};\n }\n }\n\n async function fix(record) {\n const results = await checkLanguage(record);\n\n if (results.suggested && results.currentCode) {\n return;\n }\n\n if (results.failed && !results.currentCode) {\n return;\n }\n\n if (results.detected && results.detected !== results.currentCode) {\n const f008 = record.get(/^008$/u).shift();\n\n if (f008) {\n const start = f008.value.slice(0, 35);\n const end = f008.value.slice(38);\n f008.value = `${start}${results.detected}${end}`;\n }\n\n const f041 = record.get(/^041$/u).shift();\n\n if (f041) {\n const subfield = f041.subfields.find(sf => sf.code === 'a');\n\n if (subfield) {\n subfield.value = results.detected;\n } else {\n f041.subfields.push({code: 'a', value: results.detected});\n f041.subfields.sort((a, b) => {\n if (a.code < b.code) {\n return -1;\n }\n\n if (a.code > b.code) {\n return 1;\n }\n\n return 0;\n });\n }\n } else {\n record.insertField({tag: '041', ind1: ' ', ind2: ' ', subfields: [\n {\n code: 'a',\n value: results.detected\n }\n ]});\n }\n }\n }\n\n async function checkLanguage(record) {\n const text = getText(record);\n const langCode = getLanguageCode(record);\n\n const Identifier = cldFactory.create();\n\n if (text.length === 0) {\n Identifier.dispose();\n return {failed: true, currentCode: langCode};\n }\n\n try {\n const results = await Identifier.findLanguage(text);\n Identifier.dispose();\n\n if (results.is_reliable) {\n if (results.probability >= treshold) {\n return {\n detected: get2TLangCode(results.language),\n currentCode: langCode\n };\n }\n\n return {\n currentCode: langCode,\n suggested: [get2TLangCode(results.language)]\n };\n }\n\n return {failed: true, currentCode: langCode};\n } catch (err) {\n /* istanbul ignore next: How to cause errors? */\n try {\n Identifier.dispose();\n } catch (err2) {\n debug(`Got error disposing identifier: ${err2 instanceof Error ? err2.stack : err2}`);\n }\n\n /* istanbul ignore next: How to cause errors? */\n throw err instanceof Error ? err : new Error(err.message);\n }\n\n function getText(record) {\n return record.get(tagPattern).reduce((acc, field) => {\n const fieldText = field.subfields.find(sf => sf.code === 'a').value;\n return `${acc}${fieldText}`;\n }, '');\n }\n\n function getLanguageCode(record) {\n const [f008] = record.get(/^008$/u);\n\n if (f008) {\n const code = f008.value.slice(35, 38);\n if ((/^[a-z][a-z][a-z]$/u).test(code) && code !== 'zxx') {\n return code;\n }\n }\n\n const [f041] = record.get(/^041$/u);\n\n if (f041) {\n const code = f041.subfields.find(sf => sf.code === 'a').value;\n return code;\n }\n }\n\n function get2TLangCode(code) {\n return LanguageCodes.where('1', code)['2T'];\n }\n }\n}\n"],
5
+ "mappings": "AAAA,SAAQ,cAAc,eAAc;AACpC,OAAO,mBAAmB;AAC1B,OAAO,uBAAuB;AAE9B,8BAA+B,YAAY,WAAW,KAAK;AACzD,QAAM,QAAQ,kBAAkB,wDAAwD;AACxF,QAAM,aAAa,MAAM,QAAQ;AAEjC,MAAI,sBAAsB,QAAQ;AAChC,WAAO;AAAA,MACL,aACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,IAAI,MAAM,wBAAwB;AAExC,iBAAe,SAAS,QAAQ;AAC9B,UAAM,UAAU,MAAM,cAAc,MAAM;AAE1C,QAAI,QAAQ,QAAQ;AAClB,aAAO,EAAC,OAAO,QAAQ,QAAQ,WAAW,GAAG,UAAU,CAAC,2BAA2B,EAAC;AAAA,IACtF;AAEA,QAAI,QAAQ,UAAU;AACpB,UAAI,QAAQ,aAAa,QAAQ,aAAa;AAC5C,eAAO,EAAC,OAAO,OAAO,UAAU,CAAC,yDAAyD,QAAQ,QAAQ,EAAE,EAAC;AAAA,MAC/G;AAEA,aAAO,EAAC,OAAO,KAAI;AAAA,IACrB;AAEA,QAAI,QAAQ,WAAW;AACrB,aAAO,EAAC,OAAO,QAAQ,QAAQ,WAAW,GAAG,UAAU,CAAC,gDAAgD,QAAQ,WAAW,kBAAkB,QAAQ,UAAU,KAAK,CAAC,EAAE,EAAC;AAAA,IAC1K;AAAA,EACF;AAEA,iBAAe,IAAI,QAAQ;AACzB,UAAM,UAAU,MAAM,cAAc,MAAM;AAE1C,QAAI,QAAQ,aAAa,QAAQ,aAAa;AAC5C;AAAA,IACF;AAEA,QAAI,QAAQ,UAAU,CAAC,QAAQ,aAAa;AAC1C;AAAA,IACF;AAEA,QAAI,QAAQ,YAAY,QAAQ,aAAa,QAAQ,aAAa;AAChE,YAAM,OAAO,OAAO,IAAI,QAAQ,EAAE,MAAM;AAExC,UAAI,MAAM;AACR,cAAM,QAAQ,KAAK,MAAM,MAAM,GAAG,EAAE;AACpC,cAAM,MAAM,KAAK,MAAM,MAAM,EAAE;AAC/B,aAAK,QAAQ,GAAG,KAAK,GAAG,QAAQ,QAAQ,GAAG,GAAG;AAAA,MAChD;AAEA,YAAM,OAAO,OAAO,IAAI,QAAQ,EAAE,MAAM;AAExC,UAAI,MAAM;AACR,cAAM,WAAW,KAAK,UAAU,KAAK,QAAM,GAAG,SAAS,GAAG;AAE1D,YAAI,UAAU;AACZ,mBAAS,QAAQ,QAAQ;AAAA,QAC3B,OAAO;AACL,eAAK,UAAU,KAAK,EAAC,MAAM,KAAK,OAAO,QAAQ,SAAQ,CAAC;AACxD,eAAK,UAAU,KAAK,CAAC,GAAG,MAAM;AAC5B,gBAAI,EAAE,OAAO,EAAE,MAAM;AACnB,qBAAO;AAAA,YACT;AAEA,gBAAI,EAAE,OAAO,EAAE,MAAM;AACnB,qBAAO;AAAA,YACT;AAEA,mBAAO;AAAA,UACT,CAAC;AAAA,QACH;AAAA,MACF,OAAO;AACL,eAAO,YAAY,EAAC,KAAK,OAAO,MAAM,KAAK,MAAM,KAAK,WAAW;AAAA,UAC/D;AAAA,YACE,MAAM;AAAA,YACN,OAAO,QAAQ;AAAA,UACjB;AAAA,QACF,EAAC,CAAC;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AAEA,iBAAe,cAAc,QAAQ;AACnC,UAAM,OAAO,QAAQ,MAAM;AAC3B,UAAM,WAAW,gBAAgB,MAAM;AAEvC,UAAM,aAAa,WAAW,OAAO;AAErC,QAAI,KAAK,WAAW,GAAG;AACrB,iBAAW,QAAQ;AACnB,aAAO,EAAC,QAAQ,MAAM,aAAa,SAAQ;AAAA,IAC7C;AAEA,QAAI;AACF,YAAM,UAAU,MAAM,WAAW,aAAa,IAAI;AAClD,iBAAW,QAAQ;AAEnB,UAAI,QAAQ,aAAa;AACvB,YAAI,QAAQ,eAAe,UAAU;AACnC,iBAAO;AAAA,YACL,UAAU,cAAc,QAAQ,QAAQ;AAAA,YACxC,aAAa;AAAA,UACf;AAAA,QACF;AAEA,eAAO;AAAA,UACL,aAAa;AAAA,UACb,WAAW,CAAC,cAAc,QAAQ,QAAQ,CAAC;AAAA,QAC7C;AAAA,MACF;AAEA,aAAO,EAAC,QAAQ,MAAM,aAAa,SAAQ;AAAA,IAC7C,SAAS,KAAK;AAEZ,UAAI;AACF,mBAAW,QAAQ;AAAA,MACrB,SAAS,MAAM;AACb,cAAM,mCAAmC,gBAAgB,QAAQ,KAAK,QAAQ,IAAI,EAAE;AAAA,MACtF;AAGA,YAAM,eAAe,QAAQ,MAAM,IAAI,MAAM,IAAI,OAAO;AAAA,IAC1D;AAEA,aAAS,QAAQA,SAAQ;AACvB,aAAOA,QAAO,IAAI,UAAU,EAAE,OAAO,CAAC,KAAK,UAAU;AACnD,cAAM,YAAY,MAAM,UAAU,KAAK,QAAM,GAAG,SAAS,GAAG,EAAE;AAC9D,eAAO,GAAG,GAAG,GAAG,SAAS;AAAA,MAC3B,GAAG,EAAE;AAAA,IACP;AAEA,aAAS,gBAAgBA,SAAQ;AAC/B,YAAM,CAAC,IAAI,IAAIA,QAAO,IAAI,QAAQ;AAElC,UAAI,MAAM;AACR,cAAM,OAAO,KAAK,MAAM,MAAM,IAAI,EAAE;AACpC,YAAK,qBAAsB,KAAK,IAAI,KAAK,SAAS,OAAO;AACvD,iBAAO;AAAA,QACT;AAAA,MACF;AAEA,YAAM,CAAC,IAAI,IAAIA,QAAO,IAAI,QAAQ;AAElC,UAAI,MAAM;AACR,cAAM,OAAO,KAAK,UAAU,KAAK,QAAM,GAAG,SAAS,GAAG,EAAE;AACxD,eAAO;AAAA,MACT;AAAA,IACF;AAEA,aAAS,cAAc,MAAM;AAC3B,aAAO,cAAc,MAAM,KAAK,IAAI,EAAE,IAAI;AAAA,IAC5C;AAAA,EACF;AACF;",
6
+ "names": ["record"]
7
+ }
@@ -0,0 +1,322 @@
1
+ import assert from "node:assert";
2
+ import { MarcRecord } from "@natlibfi/marc-record";
3
+ import validatorFactory from "../src/item-language.js";
4
+ import { describe, it } from "node:test";
5
+ describe("item-language", () => {
6
+ it("Creates a validator", async () => {
7
+ const validator = await validatorFactory(/^520$/u);
8
+ assert.equal(typeof validator, "object");
9
+ assert.equal(typeof validator.description, "string");
10
+ assert.equal(typeof validator.validate, "function");
11
+ });
12
+ it("Throws an error when tagPattern is not provided", async () => {
13
+ await assert.rejects(validatorFactory(), (err) => {
14
+ assert.equal(err instanceof Error, true);
15
+ assert.equal(err.message, "No tagPattern provided");
16
+ return true;
17
+ });
18
+ });
19
+ describe("#validate", () => {
20
+ it("Finds the record valid", async () => {
21
+ const validator = await validatorFactory(/^520$/u);
22
+ const record = new MarcRecord({
23
+ fields: [
24
+ {
25
+ tag: "041",
26
+ ind1: " ",
27
+ ind2: " ",
28
+ subfields: [{ code: "a", value: "fin" }]
29
+ },
30
+ {
31
+ tag: "520",
32
+ ind1: " ",
33
+ ind2: "",
34
+ subfields: [
35
+ {
36
+ code: "a",
37
+ value: "Matti Yl\xF6sen Veroparatiisit on kirja siit\xE4, kuinka miljon\xE4\xE4rit ja monikansalliset yritykset ovat 20 vuoden aikana siirt\xE4neet kiihtyv\xE4ll\xE4 tahdilla tulojaan s\xE4\xE4telyn ja verottajan ulottumattomiin korkeiden pankkisalaisuuslakien suojiin. Samoihin keitaisiin, joita my\xF6s kansainv\xE4linen rikollisuus k\xE4ytt\xE4\xE4 rahanpesuun. Suomi on toistaiseksi ollut osa ongelmaa, ei sen ratkaisua.\nKirja sis\xE4lt\xE4\xE4 n\xE4k\xF6kulmia ja kiinnekohtia demokratian, hyvinvointivaltion ja kilpailullisen markkinatalouden kriiseihin. Mukana my\xF6s toimintaehdotuksia, joita Suomen tulee ajaa veroparatiisiongelman ratkaisemiseksi. Veroparatiisit on ajankohtainen tietopaketti veronkierron mekanismeista ja vaikutuksista."
38
+ }
39
+ ]
40
+ }
41
+ ]
42
+ });
43
+ const result = await validator.validate(record);
44
+ assert.deepEqual(result, { valid: true });
45
+ });
46
+ it("Finds the record invalid (Language code is missing and detection failed", async () => {
47
+ const validator = await validatorFactory(/^520$/u);
48
+ const record = new MarcRecord({
49
+ fields: [
50
+ {
51
+ tag: "520",
52
+ ind1: " ",
53
+ ind2: "",
54
+ subfields: [
55
+ {
56
+ code: "a",
57
+ value: "."
58
+ }
59
+ ]
60
+ }
61
+ ]
62
+ });
63
+ const result = await validator.validate(record);
64
+ assert.deepEqual(result, { valid: false, messages: ["Language detection failed"] });
65
+ });
66
+ it("Finds the record invalid (Detected language differs)", async () => {
67
+ const validator = await validatorFactory(/^520$/u);
68
+ const record = new MarcRecord({
69
+ fields: [
70
+ {
71
+ tag: "008",
72
+ value: "151118t20162016fi^a|||^^^^^^^|0|^0|fin|^"
73
+ },
74
+ {
75
+ tag: "041",
76
+ ind1: " ",
77
+ ind2: " ",
78
+ subfields: [{ code: "a", value: "fin" }]
79
+ },
80
+ {
81
+ tag: "520",
82
+ ind1: " ",
83
+ ind2: "",
84
+ subfields: [
85
+ {
86
+ code: "a",
87
+ value: "If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee."
88
+ }
89
+ ]
90
+ }
91
+ ]
92
+ });
93
+ const result = await validator.validate(record);
94
+ assert.deepEqual(result, { valid: false, messages: ["Item language code is invalid. Correct language code: eng"] });
95
+ });
96
+ it("Finds the record invalid (Probability doesn't meet treshold)", async () => {
97
+ const validator = await validatorFactory(/^520$/u, 1);
98
+ const record = new MarcRecord({
99
+ fields: [
100
+ {
101
+ tag: "008",
102
+ value: "151118t20162016fi^a|||^^^^^^^|0|^0|fin|^"
103
+ },
104
+ {
105
+ tag: "041",
106
+ ind1: " ",
107
+ ind2: " ",
108
+ subfields: [{ code: "a", value: "fin" }]
109
+ },
110
+ {
111
+ tag: "520",
112
+ ind1: " ",
113
+ ind2: "",
114
+ subfields: [
115
+ {
116
+ code: "a",
117
+ value: "If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee."
118
+ }
119
+ ]
120
+ }
121
+ ]
122
+ });
123
+ const result = await validator.validate(record);
124
+ assert.deepEqual(result, { valid: true, messages: ["Item language code is invalid. Current code: fin, suggestions: eng"] });
125
+ });
126
+ it("Finds the record invalid (No detectable text)", async () => {
127
+ const validator = await validatorFactory(/^520$/u, 1);
128
+ const record = new MarcRecord({
129
+ fields: [
130
+ {
131
+ tag: "008",
132
+ value: "151118t20162016fi^a|||^^^^^^^|0|^0|fin|^"
133
+ },
134
+ {
135
+ tag: "041",
136
+ ind1: " ",
137
+ ind2: " ",
138
+ subfields: [{ code: "a", value: "fin" }]
139
+ }
140
+ ]
141
+ });
142
+ const result = await validator.validate(record);
143
+ assert.deepEqual(result, { valid: true, messages: ["Language detection failed"] });
144
+ });
145
+ });
146
+ describe("#fix", () => {
147
+ it("Fixes the record", async () => {
148
+ const validator = await validatorFactory(/^520$/u);
149
+ const record = new MarcRecord({
150
+ fields: [
151
+ {
152
+ tag: "008",
153
+ value: "151118t20162016fi^a|||^^^^^^^|0|^0|fin|^"
154
+ },
155
+ {
156
+ tag: "041",
157
+ ind1: " ",
158
+ ind2: " ",
159
+ subfields: [{ code: "a", value: "eng" }]
160
+ },
161
+ {
162
+ tag: "520",
163
+ ind1: " ",
164
+ ind2: " ",
165
+ subfields: [
166
+ {
167
+ code: "a",
168
+ value: "If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee."
169
+ }
170
+ ]
171
+ }
172
+ ]
173
+ });
174
+ await validator.fix(record);
175
+ assert.deepEqual(record.fields, [
176
+ {
177
+ tag: "008",
178
+ value: "151118t20162016fi^a|||^^^^^^^|0|^0|eng|^"
179
+ },
180
+ {
181
+ tag: "041",
182
+ ind1: " ",
183
+ ind2: " ",
184
+ subfields: [{ code: "a", value: "eng" }]
185
+ },
186
+ {
187
+ tag: "520",
188
+ ind1: " ",
189
+ ind2: " ",
190
+ subfields: [
191
+ {
192
+ code: "a",
193
+ value: "If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee."
194
+ }
195
+ ]
196
+ }
197
+ ]);
198
+ });
199
+ it("Fixes the record (Insert missing fields)", async () => {
200
+ const validator = await validatorFactory(/^520$/u);
201
+ const record = new MarcRecord({
202
+ fields: [
203
+ {
204
+ tag: "008",
205
+ value: "151118t20162016fi^a|||^^^^^^^|0|^0|fin|^"
206
+ },
207
+ {
208
+ tag: "520",
209
+ ind1: " ",
210
+ ind2: " ",
211
+ subfields: [
212
+ {
213
+ code: "a",
214
+ value: "If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee."
215
+ }
216
+ ]
217
+ }
218
+ ]
219
+ });
220
+ await validator.fix(record);
221
+ assert.deepEqual(record.fields, [
222
+ {
223
+ tag: "008",
224
+ value: "151118t20162016fi^a|||^^^^^^^|0|^0|eng|^"
225
+ },
226
+ {
227
+ tag: "041",
228
+ ind1: " ",
229
+ ind2: " ",
230
+ subfields: [{ code: "a", value: "eng" }]
231
+ },
232
+ {
233
+ tag: "520",
234
+ ind1: " ",
235
+ ind2: " ",
236
+ subfields: [
237
+ {
238
+ code: "a",
239
+ value: "If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee."
240
+ }
241
+ ]
242
+ }
243
+ ]);
244
+ });
245
+ it("Fixes the record (Insert missing subfields)", async () => {
246
+ const validator = await validatorFactory(/^520$/u);
247
+ const record = new MarcRecord({
248
+ fields: [
249
+ {
250
+ tag: "008",
251
+ value: "151118t20162016fi^a|||^^^^^^^|0|^0|fin|^"
252
+ },
253
+ {
254
+ tag: "041",
255
+ ind1: " ",
256
+ ind2: " ",
257
+ subfields: [{ code: "b", value: "foo" }]
258
+ },
259
+ {
260
+ tag: "520",
261
+ ind1: " ",
262
+ ind2: " ",
263
+ subfields: [
264
+ {
265
+ code: "a",
266
+ value: "If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee."
267
+ }
268
+ ]
269
+ }
270
+ ]
271
+ });
272
+ await validator.fix(record);
273
+ assert.deepEqual(record.fields, [
274
+ {
275
+ tag: "008",
276
+ value: "151118t20162016fi^a|||^^^^^^^|0|^0|eng|^"
277
+ },
278
+ {
279
+ tag: "041",
280
+ ind1: " ",
281
+ ind2: " ",
282
+ subfields: [{ code: "a", value: "eng" }, { code: "b", value: "foo" }]
283
+ },
284
+ {
285
+ tag: "520",
286
+ ind1: " ",
287
+ ind2: " ",
288
+ subfields: [
289
+ {
290
+ code: "a",
291
+ value: "If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee."
292
+ }
293
+ ]
294
+ }
295
+ ]);
296
+ });
297
+ it("Fails to fix the record", async () => {
298
+ const validator = await validatorFactory(/^520$/u);
299
+ const record = new MarcRecord({
300
+ fields: [
301
+ {
302
+ tag: "520",
303
+ ind1: " ",
304
+ ind2: "",
305
+ subfields: [
306
+ {
307
+ code: "a",
308
+ value: "."
309
+ }
310
+ ]
311
+ }
312
+ ]
313
+ });
314
+ try {
315
+ await validator.fix(record);
316
+ } catch (err) {
317
+ assert.equal(err.message, "Language code is missing and detection failed");
318
+ }
319
+ });
320
+ });
321
+ });
322
+ //# sourceMappingURL=item-language.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/item-language.test.js"],
4
+ "sourcesContent": ["import assert from 'node:assert';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from '../src/item-language.js';\nimport {describe, it} from 'node:test';\n\ndescribe('item-language', () => {\n it('Creates a validator', async () => {\n const validator = await validatorFactory(/^520$/u);\n\n assert.equal(typeof validator, 'object');\n assert.equal(typeof validator.description, 'string');\n assert.equal(typeof validator.validate, 'function');\n });\n\n it('Throws an error when tagPattern is not provided', async () => {\n await assert.rejects(validatorFactory(), (err) => {\n assert.equal(err instanceof Error, true);\n assert.equal(err.message, 'No tagPattern provided');\n return true;\n });\n //await assert(validatorFactory()).to.be.rejectedWith(Error, 'No tagPattern provided');\n });\n\n describe('#validate', () => {\n it('Finds the record valid', async () => {\n const validator = await validatorFactory(/^520$/u);\n const record = new MarcRecord({\n fields: [\n {\n tag: '041',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'fin'}]\n },\n {\n tag: '520',\n ind1: ' ',\n ind2: '',\n subfields: [\n {\n code: 'a',\n value: 'Matti Yl\u00F6sen Veroparatiisit on kirja siit\u00E4, kuinka miljon\u00E4\u00E4rit ja monikansalliset yritykset ovat 20 vuoden aikana siirt\u00E4neet kiihtyv\u00E4ll\u00E4 tahdilla tulojaan s\u00E4\u00E4telyn ja verottajan ulottumattomiin korkeiden pankkisalaisuuslakien suojiin. Samoihin keitaisiin, joita my\u00F6s kansainv\u00E4linen rikollisuus k\u00E4ytt\u00E4\u00E4 rahanpesuun. Suomi on toistaiseksi ollut osa ongelmaa, ei sen ratkaisua.\\nKirja sis\u00E4lt\u00E4\u00E4 n\u00E4k\u00F6kulmia ja kiinnekohtia demokratian, hyvinvointivaltion ja kilpailullisen markkinatalouden kriiseihin. Mukana my\u00F6s toimintaehdotuksia, joita Suomen tulee ajaa veroparatiisiongelman ratkaisemiseksi. Veroparatiisit on ajankohtainen tietopaketti veronkierron mekanismeista ja vaikutuksista.'\n }\n ]\n }\n ]\n });\n const result = await validator.validate(record);\n\n assert.deepEqual(result, {valid: true});\n });\n\n it('Finds the record invalid (Language code is missing and detection failed', async () => {\n const validator = await validatorFactory(/^520$/u);\n const record = new MarcRecord({\n fields: [\n {\n tag: '520',\n ind1: ' ',\n ind2: '',\n subfields: [\n {\n code: 'a',\n value: '.'\n }\n ]\n }\n ]\n });\n const result = await validator.validate(record);\n\n assert.deepEqual(result, {valid: false, messages: ['Language detection failed']});\n });\n\n it('Finds the record invalid (Detected language differs)', async () => {\n const validator = await validatorFactory(/^520$/u);\n const record = new MarcRecord({\n fields: [\n {\n tag: '008',\n value: '151118t20162016fi^a|||^^^^^^^|0|^0|fin|^'\n },\n {\n tag: '041',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'fin'}]\n },\n {\n tag: '520',\n ind1: ' ',\n ind2: '',\n subfields: [\n {\n code: 'a',\n value: 'If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.'\n }\n ]\n }\n ]\n });\n const result = await validator.validate(record);\n\n assert.deepEqual(result, {valid: false, messages: ['Item language code is invalid. Correct language code: eng']});\n });\n\n it('Finds the record invalid (Probability doesn\\'t meet treshold)', async () => {\n const validator = await validatorFactory(/^520$/u, 1);\n const record = new MarcRecord({\n fields: [\n {\n tag: '008',\n value: '151118t20162016fi^a|||^^^^^^^|0|^0|fin|^'\n },\n {\n tag: '041',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'fin'}]\n },\n {\n tag: '520',\n ind1: ' ',\n ind2: '',\n subfields: [\n {\n code: 'a',\n value: 'If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.'\n }\n ]\n }\n ]\n });\n const result = await validator.validate(record);\n\n assert.deepEqual(result, {valid: true, messages: ['Item language code is invalid. Current code: fin, suggestions: eng']});\n });\n\n it('Finds the record invalid (No detectable text)', async () => {\n const validator = await validatorFactory(/^520$/u, 1);\n const record = new MarcRecord({\n fields: [\n {\n tag: '008',\n value: '151118t20162016fi^a|||^^^^^^^|0|^0|fin|^'\n },\n {\n tag: '041',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'fin'}]\n }\n ]\n });\n const result = await validator.validate(record);\n\n assert.deepEqual(result, {valid: true, messages: ['Language detection failed']});\n });\n });\n\n describe('#fix', () => {\n it('Fixes the record', async () => {\n const validator = await validatorFactory(/^520$/u);\n const record = new MarcRecord({\n fields: [\n {\n tag: '008',\n value: '151118t20162016fi^a|||^^^^^^^|0|^0|fin|^'\n },\n {\n tag: '041',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'eng'}]\n },\n {\n tag: '520',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.'\n }\n ]\n }\n ]\n });\n await validator.fix(record);\n\n assert.deepEqual(record.fields, [\n {\n tag: '008',\n value: '151118t20162016fi^a|||^^^^^^^|0|^0|eng|^'\n },\n {\n tag: '041',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'eng'}]\n },\n {\n tag: '520',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.'\n }\n ]\n }\n ]);\n });\n\n it('Fixes the record (Insert missing fields)', async () => {\n const validator = await validatorFactory(/^520$/u);\n const record = new MarcRecord({\n fields: [\n {\n tag: '008',\n value: '151118t20162016fi^a|||^^^^^^^|0|^0|fin|^'\n },\n {\n tag: '520',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.'\n }\n ]\n }\n ]\n });\n await validator.fix(record);\n\n assert.deepEqual(record.fields, [\n {\n tag: '008',\n value: '151118t20162016fi^a|||^^^^^^^|0|^0|eng|^'\n },\n {\n tag: '041',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'eng'}]\n },\n {\n tag: '520',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.'\n }\n ]\n }\n ]);\n });\n\n it('Fixes the record (Insert missing subfields)', async () => {\n const validator = await validatorFactory(/^520$/u);\n const record = new MarcRecord({\n fields: [\n {\n tag: '008',\n value: '151118t20162016fi^a|||^^^^^^^|0|^0|fin|^'\n },\n {\n tag: '041',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'b', value: 'foo'}]\n },\n {\n tag: '520',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.'\n }\n ]\n }\n ]\n });\n await validator.fix(record);\n\n assert.deepEqual(record.fields, [\n {\n tag: '008',\n value: '151118t20162016fi^a|||^^^^^^^|0|^0|eng|^'\n },\n {\n tag: '041',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'eng'}, {code: 'b', value: 'foo'}]\n },\n {\n tag: '520',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.'\n }\n ]\n }\n ]);\n });\n\n it('Fails to fix the record', async () => {\n const validator = await validatorFactory(/^520$/u);\n const record = new MarcRecord({\n fields: [\n {\n tag: '520',\n ind1: ' ',\n ind2: '',\n subfields: [\n {\n code: 'a',\n value: '.'\n }\n ]\n }\n ]\n });\n\n try {\n await validator.fix(record);\n } catch (err) {\n assert.equal(err.message, 'Language code is missing and detection failed');\n }\n });\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }