@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
@@ -0,0 +1,94 @@
1
+ import assert from "node:assert";
2
+ import { MarcRecord } from "@natlibfi/marc-record";
3
+ import validatorFactory from "../src/unicode-decomposition.js";
4
+ import { describe, it } from "node:test";
5
+ describe("unicode-decomposition", () => {
6
+ it("Creates a validator", async () => {
7
+ const validator = await validatorFactory();
8
+ assert.equal(typeof validator, "object");
9
+ assert.equal(typeof validator.description, "string");
10
+ assert.equal(typeof validator.validate, "function");
11
+ });
12
+ describe("#validate", () => {
13
+ it("Finds the record valid", async () => {
14
+ const validator = await validatorFactory();
15
+ const record = new MarcRecord({
16
+ fields: [
17
+ {
18
+ tag: "245",
19
+ subfields: [
20
+ {
21
+ code: "a",
22
+ value: "F\xF6\xF6, B\xE4r"
23
+ }
24
+ ]
25
+ }
26
+ ]
27
+ });
28
+ const result = await validator.validate(record);
29
+ assert.deepEqual(result, { valid: true, messages: [] });
30
+ });
31
+ it("Finds the record invalid", async () => {
32
+ const validator = await validatorFactory();
33
+ const record = new MarcRecord({
34
+ fields: [
35
+ {
36
+ tag: "001",
37
+ ind1: " ",
38
+ ind2: "0",
39
+ subfields: [
40
+ {
41
+ code: "a",
42
+ value: "F\xF6o\u0308, Ba\u0308r"
43
+ }
44
+ ]
45
+ }
46
+ ]
47
+ });
48
+ const result = await validator.validate(record);
49
+ assert.deepEqual(result, { valid: false, messages: ["The following subfields are not properly decomposed: a"] });
50
+ });
51
+ describe("#fix", () => {
52
+ it("Should fix the record", async () => {
53
+ const validator = await validatorFactory();
54
+ const record = new MarcRecord({
55
+ fields: [
56
+ {
57
+ tag: "245",
58
+ subfields: [
59
+ {
60
+ code: "a",
61
+ value: "F\xF6o\u0308, Ba\u0308r"
62
+ },
63
+ {
64
+ code: "b",
65
+ value: "== Fubar"
66
+ }
67
+ ]
68
+ }
69
+ ]
70
+ });
71
+ const recordOriginal = record.toObject();
72
+ const fieldModified = {
73
+ tag: "245",
74
+ ind1: " ",
75
+ ind2: " ",
76
+ subfields: [
77
+ {
78
+ code: "a",
79
+ value: "F\xF6\xF6, B\xE4r"
80
+ },
81
+ {
82
+ code: "b",
83
+ value: "== Fubar"
84
+ }
85
+ ]
86
+ };
87
+ await validator.fix(record);
88
+ assert.notDeepEqual(recordOriginal, record);
89
+ assert.deepEqual(record.fields, [fieldModified]);
90
+ });
91
+ });
92
+ });
93
+ });
94
+ //# sourceMappingURL=unicode-decomposition.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/unicode-decomposition.test.js"],
4
+ "sourcesContent": ["import assert from 'node:assert';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from '../src/unicode-decomposition.js';\nimport {describe, it} from 'node:test';\n\ndescribe('unicode-decomposition', () => {\n it('Creates a validator', async () => {\n const validator = await validatorFactory();\n\n assert.equal(typeof validator, 'object');\n assert.equal(typeof validator.description, 'string');\n assert.equal(typeof validator.validate, 'function');\n });\n\n describe('#validate', () => {\n it('Finds the record valid', async () => {\n const validator = await validatorFactory();\n const record = new MarcRecord({\n fields: [\n {\n tag: '245',\n subfields: [\n {\n code: 'a',\n value: 'F\u00F6\u00F6, B\u00E4r'\n }\n ]\n }\n ]\n });\n const result = await validator.validate(record);\n assert.deepEqual(result, {valid: true, messages: []});\n });\n\n it('Finds the record invalid', async () => {\n const validator = await validatorFactory();\n const record = new MarcRecord({\n fields: [\n {\n tag: '001',\n ind1: ' ',\n ind2: '0',\n subfields: [\n {\n code: 'a',\n value: 'F\u00F6o\u0308, Ba\u0308r'\n }\n ]\n }\n ]\n });\n const result = await validator.validate(record);\n\n assert.deepEqual(result, {valid: false, messages: ['The following subfields are not properly decomposed: a']});\n });\n\n describe('#fix', () => {\n it('Should fix the record', async () => {\n const validator = await validatorFactory();\n\n const record = new MarcRecord({\n fields: [\n {\n tag: '245',\n subfields: [\n {\n code: 'a',\n value: 'F\u00F6o\u0308, Ba\u0308r'\n },\n {\n code: 'b',\n value: '== Fubar'\n }\n ]\n }\n ]\n });\n\n const recordOriginal = record.toObject();\n const fieldModified = {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'F\u00F6\u00F6, B\u00E4r'\n },\n {\n code: 'b',\n value: '== Fubar'\n }\n ]\n };\n await validator.fix(record);\n\n assert.notDeepEqual(recordOriginal, record);\n assert.deepEqual(record.fields, [fieldModified]);\n });\n });\n });\n});\n"],
5
+ "mappings": "AAAA,OAAO,YAAY;AACnB,SAAQ,kBAAiB;AACzB,OAAO,sBAAsB;AAC7B,SAAQ,UAAU,UAAS;AAE3B,SAAS,yBAAyB,MAAM;AACtC,KAAG,uBAAuB,YAAY;AACpC,UAAM,YAAY,MAAM,iBAAiB;AAEzC,WAAO,MAAM,OAAO,WAAW,QAAQ;AACvC,WAAO,MAAM,OAAO,UAAU,aAAa,QAAQ;AACnD,WAAO,MAAM,OAAO,UAAU,UAAU,UAAU;AAAA,EACpD,CAAC;AAED,WAAS,aAAa,MAAM;AAC1B,OAAG,0BAA0B,YAAY;AACvC,YAAM,YAAY,MAAM,iBAAiB;AACzC,YAAM,SAAS,IAAI,WAAW;AAAA,QAC5B,QAAQ;AAAA,UACN;AAAA,YACE,KAAK;AAAA,YACL,WAAW;AAAA,cACT;AAAA,gBACE,MAAM;AAAA,gBACN,OAAO;AAAA,cACT;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AACD,YAAM,SAAS,MAAM,UAAU,SAAS,MAAM;AAC9C,aAAO,UAAU,QAAQ,EAAC,OAAO,MAAM,UAAU,CAAC,EAAC,CAAC;AAAA,IACtD,CAAC;AAED,OAAG,4BAA4B,YAAY;AACzC,YAAM,YAAY,MAAM,iBAAiB;AACzC,YAAM,SAAS,IAAI,WAAW;AAAA,QAC5B,QAAQ;AAAA,UACN;AAAA,YACE,KAAK;AAAA,YACL,MAAM;AAAA,YACN,MAAM;AAAA,YACN,WAAW;AAAA,cACT;AAAA,gBACE,MAAM;AAAA,gBACN,OAAO;AAAA,cACT;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AACD,YAAM,SAAS,MAAM,UAAU,SAAS,MAAM;AAE9C,aAAO,UAAU,QAAQ,EAAC,OAAO,OAAO,UAAU,CAAC,wDAAwD,EAAC,CAAC;AAAA,IAC/G,CAAC;AAED,aAAS,QAAQ,MAAM;AACrB,SAAG,yBAAyB,YAAY;AACtC,cAAM,YAAY,MAAM,iBAAiB;AAEzC,cAAM,SAAS,IAAI,WAAW;AAAA,UAC5B,QAAQ;AAAA,YACN;AAAA,cACE,KAAK;AAAA,cACL,WAAW;AAAA,gBACT;AAAA,kBACE,MAAM;AAAA,kBACN,OAAO;AAAA,gBACT;AAAA,gBACA;AAAA,kBACE,MAAM;AAAA,kBACN,OAAO;AAAA,gBACT;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF,CAAC;AAED,cAAM,iBAAiB,OAAO,SAAS;AACvC,cAAM,gBAAgB;AAAA,UACpB,KAAK;AAAA,UACL,MAAM;AAAA,UACN,MAAM;AAAA,UACN,WAAW;AAAA,YACT;AAAA,cACE,MAAM;AAAA,cACN,OAAO;AAAA,YACT;AAAA,YACA;AAAA,cACE,MAAM;AAAA,cACN,OAAO;AAAA,YACT;AAAA,UACF;AAAA,QACF;AACA,cAAM,UAAU,IAAI,MAAM;AAE1B,eAAO,aAAa,gBAAgB,MAAM;AAC1C,eAAO,UAAU,OAAO,QAAQ,CAAC,aAAa,CAAC;AAAA,MACjD,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AACH,CAAC;",
6
+ "names": []
7
+ }
@@ -1,118 +1,73 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = _default;
7
- var _utils = require("./utils");
8
- //import createDebugLogger from 'debug';
9
-
10
- //const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/update-field-540');
11
-
12
- // Author(s): Nicholas Volk
13
- function _default() {
1
+ import { fieldToString } from "./utils.js";
2
+ export default function() {
14
3
  return {
15
- description: 'Validator for field 540 (modernization as per MELKEHITYS-2431)',
4
+ description: "Validator for field 540 (modernization as per MELKEHITYS-2431)",
16
5
  validate,
17
6
  fix
18
7
  };
19
8
  function fix(record) {
20
9
  const fixedFields = getFieldsThatUseOldFormat(record, true);
21
- const fixedFieldsAsStrings = fixedFields.map(f => (0, _utils.fieldToString)(f));
22
- return {
23
- message: [],
24
- fix: fixedFieldsAsStrings,
25
- valid: true
26
- };
10
+ const fixedFieldsAsStrings = fixedFields.map((f) => fieldToString(f));
11
+ return { message: [], fix: fixedFieldsAsStrings, valid: true };
27
12
  }
28
13
  function validate(record) {
29
14
  const yeOldeFields = getFieldsThatUseOldFormat(record, false);
30
15
  if (yeOldeFields.length === 0) {
31
- return {
32
- 'message': [],
33
- 'valid': true
34
- };
16
+ return { "message": [], "valid": true };
35
17
  }
36
- const messages = yeOldeFields.map(f => (0, _utils.fieldToString)(f));
37
- return {
38
- 'message': messages,
39
- 'valid': false
40
- };
18
+ const messages = yeOldeFields.map((f) => fieldToString(f));
19
+ return { "message": messages, "valid": false };
41
20
  }
42
21
  }
43
- const licences = [{
44
- 'license': 'CC BY 4.0',
45
- 'url': 'https://creativecommons.org/licenses/by/4.0/deed.fi'
46
- }, {
47
- 'license': 'CC BY-NC 4.0',
48
- 'url': 'https://creativecommons.org/licenses/by-nc/4.0/deed.fi'
49
- }, {
50
- 'license': 'CC BY-NC-ND 4.0',
51
- 'url': 'https://creativecommons.org/licenses/by-nc-nd/4.0/deed.fi'
52
- }, {
53
- 'license': 'CC BY-NC-SA 4.0',
54
- 'url': 'https://creativecommons.org/licenses/by-nc-sa/4.0/deed.fi'
55
- }, {
56
- 'license': 'CC BY-ND 4.0',
57
- 'url': 'https://creativecommons.org/licenses/by-nd/4.0/deed.fi'
58
- }, {
59
- 'license': 'CC BY-SA 4.0',
60
- 'url': 'https://creativecommons.org/licenses/by-sa/4.0/deed.fi'
61
- }, {
62
- 'license': 'CC0 1.0',
63
- 'url': 'https://creativecommons.org/publicdomain/zero/1.0/deed.fi'
64
- },
65
- // not seen/unused
66
- {
67
- 'license': 'Public domain',
68
- 'url': 'https://creativecommons.org/publicdomain/mark/1.0/deed.fi'
69
- }];
22
+ const licences = [
23
+ { "license": "CC BY 4.0", "url": "https://creativecommons.org/licenses/by/4.0/deed.fi" },
24
+ { "license": "CC BY-NC 4.0", "url": "https://creativecommons.org/licenses/by-nc/4.0/deed.fi" },
25
+ { "license": "CC BY-NC-ND 4.0", "url": "https://creativecommons.org/licenses/by-nc-nd/4.0/deed.fi" },
26
+ { "license": "CC BY-NC-SA 4.0", "url": "https://creativecommons.org/licenses/by-nc-sa/4.0/deed.fi" },
27
+ { "license": "CC BY-ND 4.0", "url": "https://creativecommons.org/licenses/by-nd/4.0/deed.fi" },
28
+ { "license": "CC BY-SA 4.0", "url": "https://creativecommons.org/licenses/by-sa/4.0/deed.fi" },
29
+ { "license": "CC0 1.0", "url": "https://creativecommons.org/publicdomain/zero/1.0/deed.fi" },
30
+ // not seen/unused
31
+ { "license": "Public domain", "url": "https://creativecommons.org/publicdomain/mark/1.0/deed.fi" }
32
+ ];
70
33
  function findSubfieldIndex(field, subfield) {
71
34
  subfield.nvtmp = 1;
72
- const index = field.subfields.findIndex(sf => sf.nvtmp === 1);
35
+ const index = field.subfields.findIndex((sf) => sf.nvtmp === 1);
73
36
  delete subfield.nvtmp;
74
37
  return index;
75
38
  }
76
39
  function validLicenseInSubfieldC(subfieldC, license) {
77
- if (subfieldC.code !== 'c') {
40
+ if (subfieldC.code !== "c") {
78
41
  return false;
79
42
  }
80
- //nvdebug(`Compare ${subfieldC.value} vs ${license.license}`);
81
43
  return license.license === subfieldC.value;
82
44
  }
83
45
  function validUrlInSubfieldU(subfieldU, license) {
84
- if (subfieldU.code !== 'u') {
46
+ if (subfieldU.code !== "u") {
85
47
  return false;
86
48
  }
87
- //nvdebug(`Compare ${subfieldU.value} vs ${license.url}`);
88
49
  return license.url === subfieldU.value;
89
50
  }
90
51
  function fixC(field, subfieldC) {
91
- // MELINDA-2431_
92
- subfieldC.code = 'f';
52
+ subfieldC.code = "f";
93
53
  const index = findSubfieldIndex(field, subfieldC);
94
- field.subfields.splice(index + 1, 0, {
95
- 'code': '2',
96
- 'value': 'cc'
97
- });
54
+ field.subfields.splice(index + 1, 0, { "code": "2", "value": "cc" });
98
55
  }
99
56
  function fieldHasOldCcLicense(field, fix) {
100
- if (field.tag !== '540') {
57
+ if (field.tag !== "540") {
101
58
  return false;
102
59
  }
103
- //nvdebug(`NORM 540: ${fieldToString(field)}`);
104
- const validLicense = licences.find(license => field.subfields.some(sf => validLicenseInSubfieldC(sf, license)) && field.subfields.some(sf => validUrlInSubfieldU(sf, license)));
60
+ const validLicense = licences.find((license) => field.subfields.some((sf) => validLicenseInSubfieldC(sf, license)) && field.subfields.some((sf) => validUrlInSubfieldU(sf, license)));
105
61
  if (!validLicense) {
106
62
  return false;
107
63
  }
108
- //nvdebug(` Found valid license`);
109
64
  if (fix) {
110
- const subfieldsC = field.subfields.filter(sf => validLicenseInSubfieldC(sf, validLicense));
111
- subfieldsC.forEach(c => fixC(field, c)); // eslint-disable-line array-callback-return
65
+ const subfieldsC = field.subfields.filter((sf) => validLicenseInSubfieldC(sf, validLicense));
66
+ subfieldsC.forEach((c) => fixC(field, c));
112
67
  }
113
68
  return true;
114
69
  }
115
70
  function getFieldsThatUseOldFormat(record, fix) {
116
- return record.fields.filter(f => fieldHasOldCcLicense(f, fix));
71
+ return record.fields.filter((f) => fieldHasOldCcLicense(f, fix));
117
72
  }
118
- //# sourceMappingURL=update-field-540.js.map
73
+ //# sourceMappingURL=update-field-540.js.map
@@ -1 +1,7 @@
1
- {"version":3,"file":"update-field-540.js","names":["_utils","require","_default","description","validate","fix","record","fixedFields","getFieldsThatUseOldFormat","fixedFieldsAsStrings","map","f","fieldToString","message","valid","yeOldeFields","length","messages","licences","findSubfieldIndex","field","subfield","nvtmp","index","subfields","findIndex","sf","validLicenseInSubfieldC","subfieldC","license","code","value","validUrlInSubfieldU","subfieldU","url","fixC","splice","fieldHasOldCcLicense","tag","validLicense","find","some","subfieldsC","filter","forEach","c","fields"],"sources":["../src/update-field-540.js"],"sourcesContent":["//import createDebugLogger from 'debug';\nimport {fieldToString} from './utils';\n\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/update-field-540');\n\n// Author(s): Nicholas Volk\nexport default function () {\n\n return {\n description: 'Validator for field 540 (modernization as per MELKEHITYS-2431)',\n validate, fix\n };\n\n function fix(record) {\n const fixedFields = getFieldsThatUseOldFormat(record, true);\n\n const fixedFieldsAsStrings = fixedFields.map(f => fieldToString(f));\n\n return {message: [], fix: fixedFieldsAsStrings, valid: true};\n }\n\n function validate(record) {\n const yeOldeFields = getFieldsThatUseOldFormat(record, false);\n if (yeOldeFields.length === 0) {\n return {'message': [], 'valid': true};\n }\n const messages = yeOldeFields.map(f => fieldToString(f));\n\n return {'message': messages, 'valid': false};\n }\n\n}\n\n\nconst licences = [\n {'license': 'CC BY 4.0', 'url': 'https://creativecommons.org/licenses/by/4.0/deed.fi'},\n {'license': 'CC BY-NC 4.0', 'url': 'https://creativecommons.org/licenses/by-nc/4.0/deed.fi'},\n {'license': 'CC BY-NC-ND 4.0', 'url': 'https://creativecommons.org/licenses/by-nc-nd/4.0/deed.fi'},\n {'license': 'CC BY-NC-SA 4.0', 'url': 'https://creativecommons.org/licenses/by-nc-sa/4.0/deed.fi'},\n {'license': 'CC BY-ND 4.0', 'url': 'https://creativecommons.org/licenses/by-nd/4.0/deed.fi'},\n {'license': 'CC BY-SA 4.0', 'url': 'https://creativecommons.org/licenses/by-sa/4.0/deed.fi'},\n {'license': 'CC0 1.0', 'url': 'https://creativecommons.org/publicdomain/zero/1.0/deed.fi'}, // not seen/unused\n {'license': 'Public domain', 'url': 'https://creativecommons.org/publicdomain/mark/1.0/deed.fi'}\n];\n\nfunction findSubfieldIndex(field, subfield) {\n subfield.nvtmp = 1;\n const index = field.subfields.findIndex(sf => sf.nvtmp === 1);\n delete subfield.nvtmp;\n return index;\n}\n\nfunction validLicenseInSubfieldC(subfieldC, license) {\n if (subfieldC.code !== 'c') {\n return false;\n }\n //nvdebug(`Compare ${subfieldC.value} vs ${license.license}`);\n return license.license === subfieldC.value;\n}\n\nfunction validUrlInSubfieldU(subfieldU, license) {\n if (subfieldU.code !== 'u') {\n return false;\n }\n //nvdebug(`Compare ${subfieldU.value} vs ${license.url}`);\n return license.url === subfieldU.value;\n}\n\n\nfunction fixC(field, subfieldC) {\n // MELINDA-2431_\n subfieldC.code = 'f';\n const index = findSubfieldIndex(field, subfieldC);\n field.subfields.splice(index + 1, 0, {'code': '2', 'value': 'cc'});\n}\n\nfunction fieldHasOldCcLicense(field, fix) {\n if (field.tag !== '540') {\n return false;\n }\n //nvdebug(`NORM 540: ${fieldToString(field)}`);\n const validLicense = licences.find(license => field.subfields.some(sf => validLicenseInSubfieldC(sf, license)) && field.subfields.some(sf => validUrlInSubfieldU(sf, license)));\n if (!validLicense) {\n return false;\n }\n //nvdebug(` Found valid license`);\n if (fix) {\n const subfieldsC = field.subfields.filter(sf => validLicenseInSubfieldC(sf, validLicense));\n subfieldsC.forEach(c => fixC(field, c)); // eslint-disable-line array-callback-return\n }\n\n return true;\n}\n\n\nfunction getFieldsThatUseOldFormat(record, fix) {\n return record.fields.filter(f => fieldHasOldCcLicense(f, fix));\n}\n\n"],"mappings":";;;;;;AACA,IAAAA,MAAA,GAAAC,OAAA;AADA;;AAGA;;AAEA;AACe,SAAAC,SAAA,EAAY;EAEzB,OAAO;IACLC,WAAW,EAAE,gEAAgE;IAC7EC,QAAQ;IAAEC;EACZ,CAAC;EAED,SAASA,GAAGA,CAACC,MAAM,EAAE;IACnB,MAAMC,WAAW,GAAGC,yBAAyB,CAACF,MAAM,EAAE,IAAI,CAAC;IAE3D,MAAMG,oBAAoB,GAAGF,WAAW,CAACG,GAAG,CAACC,CAAC,IAAI,IAAAC,oBAAa,EAACD,CAAC,CAAC,CAAC;IAEnE,OAAO;MAACE,OAAO,EAAE,EAAE;MAAER,GAAG,EAAEI,oBAAoB;MAAEK,KAAK,EAAE;IAAI,CAAC;EAC9D;EAEA,SAASV,QAAQA,CAACE,MAAM,EAAE;IACxB,MAAMS,YAAY,GAAGP,yBAAyB,CAACF,MAAM,EAAE,KAAK,CAAC;IAC7D,IAAIS,YAAY,CAACC,MAAM,KAAK,CAAC,EAAE;MAC7B,OAAO;QAAC,SAAS,EAAE,EAAE;QAAE,OAAO,EAAE;MAAI,CAAC;IACvC;IACA,MAAMC,QAAQ,GAAGF,YAAY,CAACL,GAAG,CAACC,CAAC,IAAI,IAAAC,oBAAa,EAACD,CAAC,CAAC,CAAC;IAExD,OAAO;MAAC,SAAS,EAAEM,QAAQ;MAAE,OAAO,EAAE;IAAK,CAAC;EAC9C;AAEF;AAGA,MAAMC,QAAQ,GAAG,CACf;EAAC,SAAS,EAAE,WAAW;EAAE,KAAK,EAAE;AAAqD,CAAC,EACtF;EAAC,SAAS,EAAE,cAAc;EAAE,KAAK,EAAE;AAAwD,CAAC,EAC5F;EAAC,SAAS,EAAE,iBAAiB;EAAE,KAAK,EAAE;AAA2D,CAAC,EAClG;EAAC,SAAS,EAAE,iBAAiB;EAAE,KAAK,EAAE;AAA2D,CAAC,EAClG;EAAC,SAAS,EAAE,cAAc;EAAE,KAAK,EAAE;AAAwD,CAAC,EAC5F;EAAC,SAAS,EAAE,cAAc;EAAE,KAAK,EAAE;AAAwD,CAAC,EAC5F;EAAC,SAAS,EAAE,SAAS;EAAE,KAAK,EAAE;AAA2D,CAAC;AAAE;AAC5F;EAAC,SAAS,EAAE,eAAe;EAAE,KAAK,EAAE;AAA2D,CAAC,CACjG;AAED,SAASC,iBAAiBA,CAACC,KAAK,EAAEC,QAAQ,EAAE;EAC1CA,QAAQ,CAACC,KAAK,GAAG,CAAC;EAClB,MAAMC,KAAK,GAAGH,KAAK,CAACI,SAAS,CAACC,SAAS,CAACC,EAAE,IAAIA,EAAE,CAACJ,KAAK,KAAK,CAAC,CAAC;EAC7D,OAAOD,QAAQ,CAACC,KAAK;EACrB,OAAOC,KAAK;AACd;AAEA,SAASI,uBAAuBA,CAACC,SAAS,EAAEC,OAAO,EAAE;EACnD,IAAID,SAAS,CAACE,IAAI,KAAK,GAAG,EAAE;IAC1B,OAAO,KAAK;EACd;EACA;EACA,OAAOD,OAAO,CAACA,OAAO,KAAKD,SAAS,CAACG,KAAK;AAC5C;AAEA,SAASC,mBAAmBA,CAACC,SAAS,EAAEJ,OAAO,EAAE;EAC/C,IAAII,SAAS,CAACH,IAAI,KAAK,GAAG,EAAE;IAC1B,OAAO,KAAK;EACd;EACA;EACA,OAAOD,OAAO,CAACK,GAAG,KAAKD,SAAS,CAACF,KAAK;AACxC;AAGA,SAASI,IAAIA,CAACf,KAAK,EAAEQ,SAAS,EAAE;EAC9B;EACAA,SAAS,CAACE,IAAI,GAAG,GAAG;EACpB,MAAMP,KAAK,GAAGJ,iBAAiB,CAACC,KAAK,EAAEQ,SAAS,CAAC;EACjDR,KAAK,CAACI,SAAS,CAACY,MAAM,CAACb,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE;IAAC,MAAM,EAAE,GAAG;IAAE,OAAO,EAAE;EAAI,CAAC,CAAC;AACpE;AAEA,SAASc,oBAAoBA,CAACjB,KAAK,EAAEf,GAAG,EAAE;EACxC,IAAIe,KAAK,CAACkB,GAAG,KAAK,KAAK,EAAE;IACvB,OAAO,KAAK;EACd;EACA;EACA,MAAMC,YAAY,GAAGrB,QAAQ,CAACsB,IAAI,CAACX,OAAO,IAAIT,KAAK,CAACI,SAAS,CAACiB,IAAI,CAACf,EAAE,IAAIC,uBAAuB,CAACD,EAAE,EAAEG,OAAO,CAAC,CAAC,IAAIT,KAAK,CAACI,SAAS,CAACiB,IAAI,CAACf,EAAE,IAAIM,mBAAmB,CAACN,EAAE,EAAEG,OAAO,CAAC,CAAC,CAAC;EAC/K,IAAI,CAACU,YAAY,EAAE;IACjB,OAAO,KAAK;EACd;EACA;EACA,IAAIlC,GAAG,EAAE;IACP,MAAMqC,UAAU,GAAGtB,KAAK,CAACI,SAAS,CAACmB,MAAM,CAACjB,EAAE,IAAIC,uBAAuB,CAACD,EAAE,EAAEa,YAAY,CAAC,CAAC;IAC1FG,UAAU,CAACE,OAAO,CAACC,CAAC,IAAIV,IAAI,CAACf,KAAK,EAAEyB,CAAC,CAAC,CAAC,CAAC,CAAC;EAC3C;EAEA,OAAO,IAAI;AACb;AAGA,SAASrC,yBAAyBA,CAACF,MAAM,EAAED,GAAG,EAAE;EAC9C,OAAOC,MAAM,CAACwC,MAAM,CAACH,MAAM,CAAChC,CAAC,IAAI0B,oBAAoB,CAAC1B,CAAC,EAAEN,GAAG,CAAC,CAAC;AAChE","ignoreList":[]}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/update-field-540.js"],
4
+ "sourcesContent": ["//import createDebugLogger from 'debug';\nimport {fieldToString} from './utils.js';\n\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/update-field-540');\n\n// Author(s): Nicholas Volk\nexport default function () {\n\n return {\n description: 'Validator for field 540 (modernization as per MELKEHITYS-2431)',\n validate, fix\n };\n\n function fix(record) {\n const fixedFields = getFieldsThatUseOldFormat(record, true);\n\n const fixedFieldsAsStrings = fixedFields.map(f => fieldToString(f));\n\n return {message: [], fix: fixedFieldsAsStrings, valid: true};\n }\n\n function validate(record) {\n const yeOldeFields = getFieldsThatUseOldFormat(record, false);\n if (yeOldeFields.length === 0) {\n return {'message': [], 'valid': true};\n }\n const messages = yeOldeFields.map(f => fieldToString(f));\n\n return {'message': messages, 'valid': false};\n }\n\n}\n\n\nconst licences = [\n {'license': 'CC BY 4.0', 'url': 'https://creativecommons.org/licenses/by/4.0/deed.fi'},\n {'license': 'CC BY-NC 4.0', 'url': 'https://creativecommons.org/licenses/by-nc/4.0/deed.fi'},\n {'license': 'CC BY-NC-ND 4.0', 'url': 'https://creativecommons.org/licenses/by-nc-nd/4.0/deed.fi'},\n {'license': 'CC BY-NC-SA 4.0', 'url': 'https://creativecommons.org/licenses/by-nc-sa/4.0/deed.fi'},\n {'license': 'CC BY-ND 4.0', 'url': 'https://creativecommons.org/licenses/by-nd/4.0/deed.fi'},\n {'license': 'CC BY-SA 4.0', 'url': 'https://creativecommons.org/licenses/by-sa/4.0/deed.fi'},\n {'license': 'CC0 1.0', 'url': 'https://creativecommons.org/publicdomain/zero/1.0/deed.fi'}, // not seen/unused\n {'license': 'Public domain', 'url': 'https://creativecommons.org/publicdomain/mark/1.0/deed.fi'}\n];\n\nfunction findSubfieldIndex(field, subfield) {\n subfield.nvtmp = 1;\n const index = field.subfields.findIndex(sf => sf.nvtmp === 1);\n delete subfield.nvtmp;\n return index;\n}\n\nfunction validLicenseInSubfieldC(subfieldC, license) {\n if (subfieldC.code !== 'c') {\n return false;\n }\n //nvdebug(`Compare ${subfieldC.value} vs ${license.license}`);\n return license.license === subfieldC.value;\n}\n\nfunction validUrlInSubfieldU(subfieldU, license) {\n if (subfieldU.code !== 'u') {\n return false;\n }\n //nvdebug(`Compare ${subfieldU.value} vs ${license.url}`);\n return license.url === subfieldU.value;\n}\n\n\nfunction fixC(field, subfieldC) {\n // MELINDA-2431_\n subfieldC.code = 'f';\n const index = findSubfieldIndex(field, subfieldC);\n field.subfields.splice(index + 1, 0, {'code': '2', 'value': 'cc'});\n}\n\nfunction fieldHasOldCcLicense(field, fix) {\n if (field.tag !== '540') {\n return false;\n }\n //nvdebug(`NORM 540: ${fieldToString(field)}`);\n const validLicense = licences.find(license => field.subfields.some(sf => validLicenseInSubfieldC(sf, license)) && field.subfields.some(sf => validUrlInSubfieldU(sf, license)));\n if (!validLicense) {\n return false;\n }\n //nvdebug(` Found valid license`);\n if (fix) {\n const subfieldsC = field.subfields.filter(sf => validLicenseInSubfieldC(sf, validLicense));\n subfieldsC.forEach(c => fixC(field, c));\n }\n\n return true;\n}\n\n\nfunction getFieldsThatUseOldFormat(record, fix) {\n return record.fields.filter(f => fieldHasOldCcLicense(f, fix));\n}\n\n"],
5
+ "mappings": "AACA,SAAQ,qBAAoB;AAK5B,0BAA2B;AAEzB,SAAO;AAAA,IACL,aAAa;AAAA,IACb;AAAA,IAAU;AAAA,EACZ;AAEA,WAAS,IAAI,QAAQ;AACnB,UAAM,cAAc,0BAA0B,QAAQ,IAAI;AAE1D,UAAM,uBAAuB,YAAY,IAAI,OAAK,cAAc,CAAC,CAAC;AAElE,WAAO,EAAC,SAAS,CAAC,GAAG,KAAK,sBAAsB,OAAO,KAAI;AAAA,EAC7D;AAEA,WAAS,SAAS,QAAQ;AACxB,UAAM,eAAe,0BAA0B,QAAQ,KAAK;AAC5D,QAAI,aAAa,WAAW,GAAG;AAC7B,aAAO,EAAC,WAAW,CAAC,GAAG,SAAS,KAAI;AAAA,IACtC;AACA,UAAM,WAAW,aAAa,IAAI,OAAK,cAAc,CAAC,CAAC;AAEvD,WAAO,EAAC,WAAW,UAAU,SAAS,MAAK;AAAA,EAC7C;AAEF;AAGA,MAAM,WAAW;AAAA,EACf,EAAC,WAAW,aAAa,OAAO,sDAAqD;AAAA,EACrF,EAAC,WAAW,gBAAgB,OAAO,yDAAwD;AAAA,EAC3F,EAAC,WAAW,mBAAmB,OAAO,4DAA2D;AAAA,EACjG,EAAC,WAAW,mBAAmB,OAAO,4DAA2D;AAAA,EACjG,EAAC,WAAW,gBAAgB,OAAO,yDAAwD;AAAA,EAC3F,EAAC,WAAW,gBAAgB,OAAO,yDAAwD;AAAA,EAC3F,EAAC,WAAW,WAAW,OAAO,4DAA2D;AAAA;AAAA,EACzF,EAAC,WAAW,iBAAiB,OAAO,4DAA2D;AACjG;AAEA,SAAS,kBAAkB,OAAO,UAAU;AAC1C,WAAS,QAAQ;AACjB,QAAM,QAAQ,MAAM,UAAU,UAAU,QAAM,GAAG,UAAU,CAAC;AAC5D,SAAO,SAAS;AAChB,SAAO;AACT;AAEA,SAAS,wBAAwB,WAAW,SAAS;AACnD,MAAI,UAAU,SAAS,KAAK;AAC1B,WAAO;AAAA,EACT;AAEA,SAAO,QAAQ,YAAY,UAAU;AACvC;AAEA,SAAS,oBAAoB,WAAW,SAAS;AAC/C,MAAI,UAAU,SAAS,KAAK;AAC1B,WAAO;AAAA,EACT;AAEA,SAAO,QAAQ,QAAQ,UAAU;AACnC;AAGA,SAAS,KAAK,OAAO,WAAW;AAE9B,YAAU,OAAO;AACjB,QAAM,QAAQ,kBAAkB,OAAO,SAAS;AAChD,QAAM,UAAU,OAAO,QAAQ,GAAG,GAAG,EAAC,QAAQ,KAAK,SAAS,KAAI,CAAC;AACnE;AAEA,SAAS,qBAAqB,OAAO,KAAK;AACxC,MAAI,MAAM,QAAQ,OAAO;AACvB,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,SAAS,KAAK,aAAW,MAAM,UAAU,KAAK,QAAM,wBAAwB,IAAI,OAAO,CAAC,KAAK,MAAM,UAAU,KAAK,QAAM,oBAAoB,IAAI,OAAO,CAAC,CAAC;AAC9K,MAAI,CAAC,cAAc;AACjB,WAAO;AAAA,EACT;AAEA,MAAI,KAAK;AACP,UAAM,aAAa,MAAM,UAAU,OAAO,QAAM,wBAAwB,IAAI,YAAY,CAAC;AACzF,eAAW,QAAQ,OAAK,KAAK,OAAO,CAAC,CAAC;AAAA,EACxC;AAEA,SAAO;AACT;AAGA,SAAS,0BAA0B,QAAQ,KAAK;AAC9C,SAAO,OAAO,OAAO,OAAO,OAAK,qBAAqB,GAAG,GAAG,CAAC;AAC/D;",
6
+ "names": []
7
+ }
@@ -0,0 +1,44 @@
1
+ import assert from "node:assert";
2
+ import { MarcRecord } from "@natlibfi/marc-record";
3
+ import validatorFactory from "../src/update-field-540.js";
4
+ import { READERS } from "@natlibfi/fixura";
5
+ import generateTests from "@natlibfi/fixugen";
6
+ import createDebugLogger from "debug";
7
+ generateTests({
8
+ callback,
9
+ path: [import.meta.dirname, "..", "test-fixtures", "update-field-540"],
10
+ useMetadataFile: true,
11
+ recurse: false,
12
+ fixura: {
13
+ reader: READERS.JSON
14
+ },
15
+ hooks: {
16
+ before: async () => {
17
+ testValidatorFactory();
18
+ }
19
+ }
20
+ });
21
+ const debug = createDebugLogger("@natlibfi/marc-record-validators-melinda/update-field-540:test");
22
+ async function testValidatorFactory() {
23
+ const validator = await validatorFactory();
24
+ assert(validator).to.be.an("object").that.has.any.keys("description", "validate");
25
+ assert(validator.description).to.be.a("string");
26
+ assert(validator.validate).to.be.a("function");
27
+ }
28
+ async function callback({ getFixture, enabled = true, fix = false }) {
29
+ if (enabled === false) {
30
+ debug("TEST SKIPPED!");
31
+ return;
32
+ }
33
+ const validator = await validatorFactory();
34
+ const record = new MarcRecord(getFixture("record.json"));
35
+ const expectedResult = getFixture("expectedResult.json");
36
+ if (!fix) {
37
+ const result = await validator.validate(record);
38
+ assert.deepEqual(result, expectedResult);
39
+ return;
40
+ }
41
+ await validator.fix(record);
42
+ assert.deepEqual(record, expectedResult);
43
+ }
44
+ //# sourceMappingURL=update-field-540.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/update-field-540.test.js"],
4
+ "sourcesContent": ["import assert from 'node:assert';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from '../src/update-field-540.js';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\nimport createDebugLogger from 'debug';\n\ngenerateTests({\n callback,\n path: [import.meta.dirname, '..', 'test-fixtures', 'update-field-540'],\n useMetadataFile: true,\n recurse: false,\n fixura: {\n reader: READERS.JSON\n },\n hooks: {\n before: async () => {\n testValidatorFactory();\n }\n }\n});\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/update-field-540:test');\n\nasync function testValidatorFactory() {\n const validator = await validatorFactory();\n\n assert(validator)\n .to.be.an('object')\n .that.has.any.keys('description', 'validate');\n\n assert(validator.description).to.be.a('string');\n assert(validator.validate).to.be.a('function');\n}\n\nasync function callback({getFixture, enabled = true, fix = false}) {\n if (enabled === false) {\n debug('TEST SKIPPED!');\n return;\n }\n\n const validator = await validatorFactory();\n const record = new MarcRecord(getFixture('record.json'));\n const expectedResult = getFixture('expectedResult.json');\n // console.log(expectedResult); // eslint-disable-line\n\n if (!fix) {\n const result = await validator.validate(record);\n assert.deepEqual(result, expectedResult);\n return;\n }\n\n await validator.fix(record);\n assert.deepEqual(record, expectedResult);\n}\n"],
5
+ "mappings": "AAAA,OAAO,YAAY;AACnB,SAAQ,kBAAiB;AACzB,OAAO,sBAAsB;AAC7B,SAAQ,eAAc;AACtB,OAAO,mBAAmB;AAC1B,OAAO,uBAAuB;AAE9B,cAAc;AAAA,EACZ;AAAA,EACA,MAAM,CAAC,YAAY,SAAS,MAAM,iBAAiB,kBAAkB;AAAA,EACrE,iBAAiB;AAAA,EACjB,SAAS;AAAA,EACT,QAAQ;AAAA,IACN,QAAQ,QAAQ;AAAA,EAClB;AAAA,EACA,OAAO;AAAA,IACL,QAAQ,YAAY;AAClB,2BAAqB;AAAA,IACvB;AAAA,EACF;AACF,CAAC;AAED,MAAM,QAAQ,kBAAkB,gEAAgE;AAEhG,eAAe,uBAAuB;AACpC,QAAM,YAAY,MAAM,iBAAiB;AAEzC,SAAO,SAAS,EACb,GAAG,GAAG,GAAG,QAAQ,EACjB,KAAK,IAAI,IAAI,KAAK,eAAe,UAAU;AAE9C,SAAO,UAAU,WAAW,EAAE,GAAG,GAAG,EAAE,QAAQ;AAC9C,SAAO,UAAU,QAAQ,EAAE,GAAG,GAAG,EAAE,UAAU;AAC/C;AAEA,eAAe,SAAS,EAAC,YAAY,UAAU,MAAM,MAAM,MAAK,GAAG;AACjE,MAAI,YAAY,OAAO;AACrB,UAAM,eAAe;AACrB;AAAA,EACF;AAEA,QAAM,YAAY,MAAM,iBAAiB;AACzC,QAAM,SAAS,IAAI,WAAW,WAAW,aAAa,CAAC;AACvD,QAAM,iBAAiB,WAAW,qBAAqB;AAGvD,MAAI,CAAC,KAAK;AACR,UAAM,SAAS,MAAM,UAAU,SAAS,MAAM;AAC9C,WAAO,UAAU,QAAQ,cAAc;AACvC;AAAA,EACF;AAEA,QAAM,UAAU,IAAI,MAAM;AAC1B,SAAO,UAAU,QAAQ,cAAc;AACzC;",
6
+ "names": []
7
+ }
package/dist/urn.js CHANGED
@@ -1,38 +1,20 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = _default;
7
- var _nodeFetch = _interopRequireDefault(require("node-fetch"));
8
- var _utils = require("./utils");
9
- var _debug = _interopRequireDefault(require("debug"));
10
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
11
- const URN_GENERATOR_URL = 'https://generator.urn.fi/cgi-bin/urn_generator.cgi?type=nbn';
12
- function _default(isLegalDeposit = false, useMelindaTemp = true) {
13
- const debug = (0, _debug.default)('@natlibfi/marc-record-validators-melinda:urn');
14
- const debugData = debug.extend('data');
15
-
16
- //console.log(`IS LEGAL DEPOSIT? ${isLegalDeposit ? 'YES' : 'NO'}`); // eslint-disable-line no-console
17
-
18
- // We should check that the f856 with URN has second indicator '0' (Resource), ' ' (No information provided) or '8' (No display constant generated)
19
- // - if second indicator is '1' (Version of resource) or '2' (Related resource) the URN in f856 is not correct for the resource described in the record
20
-
21
- // This checks only the existence of URNs from the Finnish urn.fi -resolver
22
-
1
+ import { isElectronicMaterial } from "./utils.js";
2
+ import createDebugLogger from "debug";
3
+ const URN_GENERATOR_URL = "https://generator.urn.fi/cgi-bin/urn_generator.cgi?type=nbn";
4
+ export default function(isLegalDeposit = false, useMelindaTemp = true) {
5
+ const debug = createDebugLogger("@natlibfi/marc-record-validators-melinda:urn");
6
+ const debugData = debug.extend("data");
23
7
  function hasLegalDepositURN(field) {
24
- if (field.tag !== '856' || ['1', '2', '3', '4'].includes(field.ind2)) {
8
+ if (field.tag !== "856" || ["1", "2", "3", "4"].includes(field.ind2)) {
25
9
  return false;
26
10
  }
27
-
28
- // First attempt to fix MET-573. However, does useMelindaTemp come into play as well?
29
- if (isLegalDeposit && !field.subfields.some(sf => sf.code === '5' && sf.value === 'FI-Vapaa')) {
11
+ if (isLegalDeposit && !field.subfields.some((sf) => sf.code === "5" && sf.value === "FI-Vapaa")) {
30
12
  return false;
31
13
  }
32
- return field.subfields.some(sf => sf.code === 'u' && /^https?:\/\/urn\.fi/u.test(sf.value));
14
+ return field.subfields.some((sf) => sf.code === "u" && /^https?:\/\/urn\.fi/u.test(sf.value));
33
15
  }
34
16
  return {
35
- description: 'Adds URN for record, to 856-field (if not existing). If isLegalDeposit is active, adds legal deposit subfields to the f856s with URN.',
17
+ description: "Adds URN for record, to 856-field (if not existing). If isLegalDeposit is active, adds legal deposit subfields to the f856s with URN.",
36
18
  validate,
37
19
  fix
38
20
  };
@@ -41,135 +23,87 @@ function _default(isLegalDeposit = false, useMelindaTemp = true) {
41
23
  debugData(`f856sUrn: ${JSON.stringify(f856sUrn)}`);
42
24
  const ldSubfields = isLegalDeposit ? createLDSubfields() : [];
43
25
  debugData(`IsLegalDeposit: ${isLegalDeposit}, LegalDepositSubfields: ${JSON.stringify(ldSubfields)}`);
44
-
45
- // We add the URN even if we're not getting the legalDeposit - where does this URN resolve?
46
- // We probably should not do these additions
47
-
48
26
  if (f856sUrn.length === 0) {
49
- const {
50
- code,
51
- value,
52
- generated
53
- } = await createURNSubfield(record);
27
+ const { code, value, generated } = await createURNSubfield(record);
54
28
  if (generated && useMelindaTemp) {
55
- const tempSubField = {
56
- code: '9',
57
- value: 'MELINDA<TEMP>'
58
- };
29
+ const tempSubField = { code: "9", value: "MELINDA<TEMP>" };
59
30
  record.insertField({
60
- tag: '856',
61
- ind1: '4',
62
- ind2: '0',
63
- subfields: [{
64
- code,
65
- value
66
- }, ...ldSubfields, tempSubField]
31
+ tag: "856",
32
+ ind1: "4",
33
+ ind2: "0",
34
+ subfields: [{ code, value }, ...ldSubfields, tempSubField]
67
35
  });
68
36
  return true;
69
37
  }
70
38
  record.insertField({
71
- tag: '856',
72
- ind1: '4',
73
- ind2: '0',
74
- subfields: [{
75
- code,
76
- value
77
- }, ...ldSubfields]
39
+ tag: "856",
40
+ ind1: "4",
41
+ ind2: "0",
42
+ subfields: [{ code, value }, ...ldSubfields]
78
43
  });
79
44
  return true;
80
45
  }
81
46
  if (isLegalDeposit) {
82
- // We add here legal deposit information to all URN-f856s - we probably should not do this
83
- // We should add extra f856 URN / URNs for legal deposits that already have a open (non-legal-deposit) URN
84
- // How do we decide which URN to use as a template if there are several URNs
85
- // We should check for existence of a legal deposit URN anyways
86
-
87
- f856sUrn.forEach(f => {
88
- // Change phrase from old to new if field with old phrase is found
89
- if (f.subfields.some(sf => hasOld856LdPhrase(sf))) {
90
- f.subfields.find(sf => hasOld856LdPhrase(sf)).value = 'Käytettävissä vapaakappaletyöasemilla';
47
+ f856sUrn.forEach((f) => {
48
+ if (f.subfields.some((sf) => hasOld856LdPhrase(sf))) {
49
+ f.subfields.find((sf) => hasOld856LdPhrase(sf)).value = "K\xE4ytett\xE4viss\xE4 vapaakappalety\xF6asemilla";
91
50
  }
92
-
93
- // Create subfields if necessary
94
- ldSubfields.forEach(ldsf => {
95
- if (!f.subfields.some(sf => sf.code === ldsf.code && sf.value === ldsf.value && !hasOld856LdPhrase(sf))) {
51
+ ldSubfields.forEach((ldsf) => {
52
+ if (!f.subfields.some((sf) => sf.code === ldsf.code && sf.value === ldsf.value && !hasOld856LdPhrase(sf))) {
96
53
  f.subfields.push(ldsf);
97
54
  }
98
55
  });
99
56
  });
100
57
  }
101
58
  return true;
102
-
103
- // We should check existence of URN in f024 i1: '7' $2 urn/URN for this too
104
-
105
59
  async function createURNSubfield(rec) {
106
- // isbn is picked from the last 020 $a in the record
107
- // what should we do in case of several 020 $a:s
108
60
  const isbn = rec.fields.reduce((acc, f) => {
109
- if (f.tag === '020') {
110
- const a = f.subfields.find(sf => sf.code === 'a');
111
- return a ? a.value : undefined;
61
+ if (f.tag === "020") {
62
+ const a = f.subfields.find((sf) => sf.code === "a");
63
+ return a ? a.value : void 0;
112
64
  }
113
65
  return acc;
114
- }, undefined);
66
+ }, void 0);
115
67
  debugData(`isbns: ${isbn}`);
116
- const {
117
- generated,
118
- value
119
- } = await createURN(isbn);
120
- return {
121
- code: 'u',
122
- value,
123
- generated
124
- };
125
- async function createURN(isbn = false) {
126
- if (isbn) {
127
- return {
128
- generated: false,
129
- value: `https://urn.fi/URN:ISBN:${isbn}`
130
- };
68
+ const { generated, value } = await createURN(isbn);
69
+ return { code: "u", value, generated };
70
+ async function createURN(isbn2 = false) {
71
+ if (isbn2) {
72
+ return { generated: false, value: `https://urn.fi/URN:ISBN:${isbn2}` };
131
73
  }
132
- const response = await (0, _nodeFetch.default)(URN_GENERATOR_URL);
74
+ const response = await fetch(URN_GENERATOR_URL);
133
75
  const body = await response.text();
134
-
135
- // If we generated URN we could also add it to the 024
136
- // generated 024 should also have $9 MELINDA<TEMP>
137
- return {
138
- generated: true,
139
- value: `https://urn.fi/${body}`
140
- };
76
+ return { generated: true, value: `https://urn.fi/${body}` };
141
77
  }
142
78
  }
143
- function hasOld856LdPhrase({
144
- code,
145
- value
146
- }) {
147
- if (code === 'z' && value === 'Käytettävissä vapaakappalekirjastoissa') {
79
+ function hasOld856LdPhrase({ code, value }) {
80
+ if (code === "z" && value === "K\xE4ytett\xE4viss\xE4 vapaakappalekirjastoissa") {
148
81
  return true;
149
82
  }
150
83
  return false;
151
84
  }
152
85
  }
153
-
154
- // Later when the new subfields that have f506/f540 -type contents, we should add also them here
155
86
  function createLDSubfields() {
156
- return [{
157
- code: 'z',
158
- value: 'Käytettävissä vapaakappaletyöasemilla'
159
- }, {
160
- code: '5',
161
- value: 'FI-Vapaa'
162
- }];
87
+ return [
88
+ {
89
+ code: "z",
90
+ value: "K\xE4ytett\xE4viss\xE4 vapaakappalety\xF6asemilla"
91
+ },
92
+ {
93
+ code: "5",
94
+ value: "FI-Vapaa"
95
+ }
96
+ ];
163
97
  }
164
98
  function fieldHasLDSubfields(field, ldSubfields) {
165
- if (ldSubfields.every(ldsf => field.subfields.some(sf => sf.code === ldsf.code && sf.value === ldsf.value))) {
99
+ if (ldSubfields.every((ldsf) => field.subfields.some((sf) => sf.code === ldsf.code && sf.value === ldsf.value))) {
166
100
  return true;
167
101
  }
168
102
  }
169
103
  function validateLD(f856sUrn) {
170
104
  debug(`Validating the existence of legal deposit subfields`);
171
105
  const ldSubfields = createLDSubfields();
172
- const f856sUrnWithLdSubfields = f856sUrn.filter(field => fieldHasLDSubfields(field, ldSubfields));
106
+ const f856sUrnWithLdSubfields = f856sUrn.filter((field) => fieldHasLDSubfields(field, ldSubfields));
173
107
  if (f856sUrnWithLdSubfields.length > 0) {
174
108
  debug(`Record has ${f856sUrnWithLdSubfields.length} URN fields with all necessary legal deposit subfields`);
175
109
  debugData(`f856sUrnWithLdSubfields: ${JSON.stringify(f856sUrnWithLdSubfields)}`);
@@ -178,12 +112,9 @@ function _default(isLegalDeposit = false, useMelindaTemp = true) {
178
112
  return false;
179
113
  }
180
114
  function validate(record) {
181
- // if not electronic skip this validator
182
- if (!(0, _utils.isElectronicMaterial)(record)) {
115
+ if (!isElectronicMaterial(record)) {
183
116
  debug(`Record is not electronic - no need to validate legal deposit URNs`);
184
- return {
185
- valid: true
186
- };
117
+ return { valid: true };
187
118
  }
188
119
  const f856sUrn = record.fields.filter(hasLegalDepositURN);
189
120
  if (f856sUrn.length > 0) {
@@ -191,15 +122,11 @@ function _default(isLegalDeposit = false, useMelindaTemp = true) {
191
122
  debugData(`f856sUrn: ${JSON.stringify(f856sUrn)}`);
192
123
  if (!isLegalDeposit || validateLD(f856sUrn)) {
193
124
  debug(`Record is valid`);
194
- return {
195
- valid: true
196
- };
125
+ return { valid: true };
197
126
  }
198
127
  }
199
128
  debug(`No (valid) URN fields - Record is not valid`);
200
- return {
201
- valid: false
202
- };
129
+ return { valid: false };
203
130
  }
204
131
  }
205
- //# sourceMappingURL=urn.js.map
132
+ //# sourceMappingURL=urn.js.map