@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
@@ -4,6 +4,10 @@ name: Melinda-node-tests
4
4
 
5
5
  on: push
6
6
 
7
+ permissions:
8
+ id-token: write # Required for OIDC
9
+ contents: read
10
+
7
11
  jobs:
8
12
  build-node-versions:
9
13
  name: Node version matrix
@@ -11,14 +15,14 @@ jobs:
11
15
 
12
16
  strategy:
13
17
  matrix:
14
- node-version: [20.x, 22.x, 24.x]
18
+ node-version: [22.x, 24.x]
15
19
  # See supported Node.js release schedule at https://nodejs.org/en/about/releases/
16
20
 
17
21
  steps:
18
22
  - name: Checkout the code
19
- uses: actions/checkout@v4
23
+ uses: actions/checkout@v5
20
24
  - name: Use Node.js ${{ matrix.node-version }}
21
- uses: actions/setup-node@v3
25
+ uses: actions/setup-node@v6
22
26
  with:
23
27
  node-version: ${{ matrix.node-version }}
24
28
  cache: 'npm'
@@ -32,30 +36,51 @@ jobs:
32
36
  njsscan:
33
37
  name: Njsscan-check
34
38
  runs-on: ubuntu-latest
35
- container: docker://node:18
39
+ container: node:22
36
40
 
37
41
  steps:
38
42
  - name: Checkout the code
39
- uses: actions/checkout@v4
43
+ uses: actions/checkout@v5
40
44
  - name: nodejsscan scan
41
45
  id: njsscan
42
46
  uses: ajinabraham/njsscan-action@master
43
47
  with:
44
48
  args: '.'
45
49
 
50
+ license-scan:
51
+ name: License compliance check
52
+ runs-on: ubuntu-latest
53
+ container: node:22
54
+
55
+ steps:
56
+ - uses: actions/checkout@v5
57
+ - uses: mikaelvesavuori/license-compliance-action@v1
58
+ with:
59
+ exclude_pattern: /^@natlibfi/
60
+
46
61
  publish-to-npm:
47
62
  runs-on: ubuntu-latest
63
+ container: node:22
48
64
  needs: [build-node-versions, njsscan]
49
65
  if: contains(github.ref, 'refs/tags/')
50
66
 
51
67
  steps:
52
- - uses: actions/checkout@v4
68
+ - uses: actions/checkout@v5
53
69
  # Setup .npmrc file to publish to npm
54
- - uses: actions/setup-node@v3
70
+ - name: Prepare node for publish
71
+ uses: actions/setup-node@v6
55
72
  with:
56
- node-version: '18.x'
73
+ node-version: '22.x'
57
74
  registry-url: 'https://registry.npmjs.org'
58
- - run: npm i
59
- - run: npm publish
60
- env:
61
- NODE_AUTH_TOKEN: ${{ secrets.MARC_RECORD_VALIDATORS_MELINDA_NPM_TOKEN }}
75
+ - name: Update npm
76
+ run: npm install -g npm@latest
77
+ - name: Clean install
78
+ run: npm ci
79
+ # Publish stable release with --tag latest
80
+ - name: Publish stable release
81
+ if: ${{!contains(github.ref, '-alpha')}}
82
+ run: npm publish --tag=latest
83
+ # Publish pre-release without --tag latest
84
+ - name: Publish pre-release
85
+ if: contains(github.ref, '-alpha')
86
+ run: npm publish --tag=next
@@ -1,112 +1,84 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = _default;
7
- var _utils = require("./utils");
8
- function _default(isViolaRecord = false) {
9
- const sf506 = [{
10
- code: 'a',
11
- value: /aineisto on käytettävissä vapaakappaletyöasemilla/ui
12
- }];
13
- const sf506old = [{
14
- code: 'a',
15
- value: /aineisto on käytettävissä vapaakappalekirjastoissa/ui
16
- }];
17
- const sf540 = [{
18
- code: 'c',
19
- value: /laki kulttuuriaineistojen tallettamisesta ja säilyttämisestä/ui
20
- }];
1
+ import { isElectronicMaterial } from "./utils.js";
2
+ export default function(isViolaRecord = false) {
3
+ const sf506 = [{ code: "a", value: /aineisto on käytettävissä vapaakappaletyöasemilla/ui }];
4
+ const sf506old = [{ code: "a", value: /aineisto on käytettävissä vapaakappalekirjastoissa/ui }];
5
+ const sf540 = [{ code: "c", value: /laki kulttuuriaineistojen tallettamisesta ja säilyttämisestä/ui }];
21
6
  function fix(record) {
22
- // If printed do nothing
23
-
24
- // If material is electronic add theis if missing
25
- if (!hasTag(record, '506', sf506) && !hasTag(record, '506', sf506old)) {
26
- const subfield9 = isViolaRecord ? [{
27
- code: '9',
28
- value: 'VIOLA<KEEP>'
29
- }] : [{
30
- code: '9',
31
- value: 'FENNI<KEEP>'
32
- }];
33
- const staticSubfields = [{
34
- code: 'a',
35
- value: 'Aineisto on käytettävissä vapaakappaletyöasemilla.'
36
- }, {
37
- code: 'f',
38
- value: 'Online access with authorization'
39
- }, {
40
- code: '2',
41
- value: 'star'
42
- }, {
43
- code: '5',
44
- value: 'FI-Vapaa'
45
- }];
7
+ if (!hasTag(record, "506", sf506) && !hasTag(record, "506", sf506old)) {
8
+ const subfield9 = isViolaRecord ? [{ code: "9", value: "VIOLA<KEEP>" }] : [{ code: "9", value: "FENNI<KEEP>" }];
9
+ const staticSubfields = [
10
+ {
11
+ code: "a",
12
+ value: "Aineisto on k\xE4ytett\xE4viss\xE4 vapaakappalety\xF6asemilla."
13
+ },
14
+ {
15
+ code: "f",
16
+ value: "Online access with authorization"
17
+ },
18
+ {
19
+ code: "2",
20
+ value: "star"
21
+ },
22
+ {
23
+ code: "5",
24
+ value: "FI-Vapaa"
25
+ }
26
+ ];
46
27
  record.insertField({
47
- tag: '506',
48
- ind1: '1',
28
+ tag: "506",
29
+ ind1: "1",
49
30
  subfields: staticSubfields.concat(subfield9)
50
31
  });
51
32
  }
52
-
53
- // Change phrase from old to new if field with old phrase is found
54
- if (!hasTag(record, '506', sf506) && hasTag(record, '506', sf506old)) {
55
- record.fields.find(f => f.tag === '506' && sf506old.every(({
56
- code,
57
- value
58
- }) => f.subfields.some(sf => sf.code === code && value.test(sf.value)))).subfields.find(sf => sf506old.every(({
59
- code,
60
- value
61
- }) => sf.code === code && value.test(sf.value))).value = 'Aineisto on käytettävissä vapaakappaletyöasemilla.';
33
+ if (!hasTag(record, "506", sf506) && hasTag(record, "506", sf506old)) {
34
+ record.fields.find((f) => f.tag === "506" && sf506old.every(({ code, value }) => f.subfields.some((sf) => sf.code === code && value.test(sf.value)))).subfields.find((sf) => sf506old.every(({ code, value }) => sf.code === code && value.test(sf.value))).value = "Aineisto on k\xE4ytett\xE4viss\xE4 vapaakappalety\xF6asemilla.";
62
35
  }
63
- if (!hasTag(record, '540', sf540) && !isViolaRecord) {
36
+ if (!hasTag(record, "540", sf540) && !isViolaRecord) {
64
37
  record.insertField({
65
- tag: '540',
66
- subfields: [{
67
- code: 'a',
68
- value: 'Aineisto on käytettävissä tutkimus- ja muihin tarkoituksiin;'
69
- }, {
70
- code: 'b',
71
- value: 'Kansalliskirjasto;'
72
- }, {
73
- code: 'c',
74
- value: 'Laki kulttuuriaineistojen tallettamisesta ja säilyttämisestä'
75
- }, {
76
- code: 'u',
77
- value: 'http://www.finlex.fi/fi/laki/ajantasa/2007/20071433'
78
- }, {
79
- code: '5',
80
- value: 'FI-Vapaa'
81
- }, {
82
- code: '9',
83
- value: 'FENNI<KEEP>'
84
- }]
38
+ tag: "540",
39
+ subfields: [
40
+ {
41
+ code: "a",
42
+ value: "Aineisto on k\xE4ytett\xE4viss\xE4 tutkimus- ja muihin tarkoituksiin;"
43
+ },
44
+ {
45
+ code: "b",
46
+ value: "Kansalliskirjasto;"
47
+ },
48
+ {
49
+ code: "c",
50
+ value: "Laki kulttuuriaineistojen tallettamisesta ja s\xE4ilytt\xE4misest\xE4"
51
+ },
52
+ {
53
+ code: "u",
54
+ value: "http://www.finlex.fi/fi/laki/ajantasa/2007/20071433"
55
+ },
56
+ {
57
+ code: "5",
58
+ value: "FI-Vapaa"
59
+ },
60
+ {
61
+ code: "9",
62
+ value: "FENNI<KEEP>"
63
+ }
64
+ ]
85
65
  });
86
66
  }
87
67
  return true;
88
68
  }
89
69
  function validate(record) {
90
- // if not electronic skip this validator
91
- if (!(0, _utils.isElectronicMaterial)(record)) {
92
- return {
93
- valid: true
94
- };
70
+ if (!isElectronicMaterial(record)) {
71
+ return { valid: true };
95
72
  }
96
- return {
97
- valid: hasTag(record, '506', sf506) && (hasTag(record, '540', sf540) || isViolaRecord)
98
- };
73
+ return { valid: hasTag(record, "506", sf506) && (hasTag(record, "540", sf540) || isViolaRecord) };
99
74
  }
100
75
  return {
101
- description: 'Adds access rights fields for a record (if not existing)',
76
+ description: "Adds access rights fields for a record (if not existing)",
102
77
  validate,
103
78
  fix
104
79
  };
105
80
  function hasTag(rec, tag, sfcv) {
106
- return rec.fields.some(f => f.tag === tag && sfcv.every(({
107
- code,
108
- value
109
- }) => f.subfields.some(sf => sf.code === code && value.test(sf.value))));
81
+ return rec.fields.some((f) => f.tag === tag && sfcv.every(({ code, value }) => f.subfields.some((sf) => sf.code === code && value.test(sf.value))));
110
82
  }
111
83
  }
112
- //# sourceMappingURL=access-rights.js.map
84
+ //# sourceMappingURL=access-rights.js.map
@@ -1 +1,7 @@
1
- {"version":3,"file":"access-rights.js","names":["_utils","require","_default","isViolaRecord","sf506","code","value","sf506old","sf540","fix","record","hasTag","subfield9","staticSubfields","insertField","tag","ind1","subfields","concat","fields","find","f","every","some","sf","test","validate","isElectronicMaterial","valid","description","rec","sfcv"],"sources":["../src/access-rights.js"],"sourcesContent":["import {isElectronicMaterial} from './utils';\n\nexport default function (isViolaRecord = false) {\n const sf506 = [{code: 'a', value: /aineisto on käytettävissä vapaakappaletyöasemilla/ui}];\n const sf506old = [{code: 'a', value: /aineisto on käytettävissä vapaakappalekirjastoissa/ui}];\n const sf540 = [{code: 'c', value: /laki kulttuuriaineistojen tallettamisesta ja säilyttämisestä/ui}];\n\n function fix(record) {\n // If printed do nothing\n\n // If material is electronic add theis if missing\n if (!hasTag(record, '506', sf506) && !hasTag(record, '506', sf506old)) {\n const subfield9 = isViolaRecord ? [{code: '9', value: 'VIOLA<KEEP>'}] : [{code: '9', value: 'FENNI<KEEP>'}];\n const staticSubfields = [\n {\n code: 'a',\n value: 'Aineisto on käytettävissä vapaakappaletyöasemilla.'\n }, {\n code: 'f',\n value: 'Online access with authorization'\n }, {\n code: '2',\n value: 'star'\n }, {\n code: '5',\n value: 'FI-Vapaa'\n }\n ];\n\n record.insertField({\n tag: '506',\n ind1: '1',\n subfields: staticSubfields.concat(subfield9)\n });\n }\n\n // Change phrase from old to new if field with old phrase is found\n if (!hasTag(record, '506', sf506) && hasTag(record, '506', sf506old)) {\n record.fields\n .find(f => f.tag === '506' && sf506old.every(({code, value}) => f.subfields.some(sf => sf.code === code && value.test(sf.value))))\n .subfields.find(sf => sf506old.every(({code, value}) => sf.code === code && value.test(sf.value)))\n .value = 'Aineisto on käytettävissä vapaakappaletyöasemilla.';\n }\n\n if (!hasTag(record, '540', sf540) && !isViolaRecord) {\n record.insertField({\n tag: '540',\n subfields: [\n {\n code: 'a',\n value: 'Aineisto on käytettävissä tutkimus- ja muihin tarkoituksiin;'\n }, {\n code: 'b',\n value: 'Kansalliskirjasto;'\n }, {\n code: 'c',\n value: 'Laki kulttuuriaineistojen tallettamisesta ja säilyttämisestä'\n }, {\n code: 'u',\n value: 'http://www.finlex.fi/fi/laki/ajantasa/2007/20071433'\n }, {\n code: '5',\n value: 'FI-Vapaa'\n }, {\n code: '9',\n value: 'FENNI<KEEP>'\n }\n ]\n });\n }\n\n return true;\n }\n\n function validate(record) {\n // if not electronic skip this validator\n if (!isElectronicMaterial(record)) {\n return {valid: true};\n }\n\n return {valid: hasTag(record, '506', sf506) && (hasTag(record, '540', sf540) || isViolaRecord)};\n }\n\n return {\n description: 'Adds access rights fields for a record (if not existing)',\n validate,\n fix\n };\n\n function hasTag(rec, tag, sfcv) {\n return rec.fields.some(f => f.tag === tag && sfcv.every(({code, value}) => f.subfields.some(sf => sf.code === code && value.test(sf.value))));\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/access-rights.js"],
4
+ "sourcesContent": ["import {isElectronicMaterial} from './utils.js';\n\nexport default function (isViolaRecord = false) {\n const sf506 = [{code: 'a', value: /aineisto on k\u00E4ytett\u00E4viss\u00E4 vapaakappalety\u00F6asemilla/ui}];\n const sf506old = [{code: 'a', value: /aineisto on k\u00E4ytett\u00E4viss\u00E4 vapaakappalekirjastoissa/ui}];\n const sf540 = [{code: 'c', value: /laki kulttuuriaineistojen tallettamisesta ja s\u00E4ilytt\u00E4misest\u00E4/ui}];\n\n function fix(record) {\n // If printed do nothing\n\n // If material is electronic add theis if missing\n if (!hasTag(record, '506', sf506) && !hasTag(record, '506', sf506old)) {\n const subfield9 = isViolaRecord ? [{code: '9', value: 'VIOLA<KEEP>'}] : [{code: '9', value: 'FENNI<KEEP>'}];\n const staticSubfields = [\n {\n code: 'a',\n value: 'Aineisto on k\u00E4ytett\u00E4viss\u00E4 vapaakappalety\u00F6asemilla.'\n }, {\n code: 'f',\n value: 'Online access with authorization'\n }, {\n code: '2',\n value: 'star'\n }, {\n code: '5',\n value: 'FI-Vapaa'\n }\n ];\n\n record.insertField({\n tag: '506',\n ind1: '1',\n subfields: staticSubfields.concat(subfield9)\n });\n }\n\n // Change phrase from old to new if field with old phrase is found\n if (!hasTag(record, '506', sf506) && hasTag(record, '506', sf506old)) {\n record.fields\n .find(f => f.tag === '506' && sf506old.every(({code, value}) => f.subfields.some(sf => sf.code === code && value.test(sf.value))))\n .subfields.find(sf => sf506old.every(({code, value}) => sf.code === code && value.test(sf.value)))\n .value = 'Aineisto on k\u00E4ytett\u00E4viss\u00E4 vapaakappalety\u00F6asemilla.';\n }\n\n if (!hasTag(record, '540', sf540) && !isViolaRecord) {\n record.insertField({\n tag: '540',\n subfields: [\n {\n code: 'a',\n value: 'Aineisto on k\u00E4ytett\u00E4viss\u00E4 tutkimus- ja muihin tarkoituksiin;'\n }, {\n code: 'b',\n value: 'Kansalliskirjasto;'\n }, {\n code: 'c',\n value: 'Laki kulttuuriaineistojen tallettamisesta ja s\u00E4ilytt\u00E4misest\u00E4'\n }, {\n code: 'u',\n value: 'http://www.finlex.fi/fi/laki/ajantasa/2007/20071433'\n }, {\n code: '5',\n value: 'FI-Vapaa'\n }, {\n code: '9',\n value: 'FENNI<KEEP>'\n }\n ]\n });\n }\n\n return true;\n }\n\n function validate(record) {\n // if not electronic skip this validator\n if (!isElectronicMaterial(record)) {\n return {valid: true};\n }\n\n return {valid: hasTag(record, '506', sf506) && (hasTag(record, '540', sf540) || isViolaRecord)};\n }\n\n return {\n description: 'Adds access rights fields for a record (if not existing)',\n validate,\n fix\n };\n\n function hasTag(rec, tag, sfcv) {\n return rec.fields.some(f => f.tag === tag && sfcv.every(({code, value}) => f.subfields.some(sf => sf.code === code && value.test(sf.value))));\n }\n}\n"],
5
+ "mappings": "AAAA,SAAQ,4BAA2B;AAEnC,wBAAyB,gBAAgB,OAAO;AAC9C,QAAM,QAAQ,CAAC,EAAC,MAAM,KAAK,OAAO,sDAAqD,CAAC;AACxF,QAAM,WAAW,CAAC,EAAC,MAAM,KAAK,OAAO,uDAAsD,CAAC;AAC5F,QAAM,QAAQ,CAAC,EAAC,MAAM,KAAK,OAAO,iEAAgE,CAAC;AAEnG,WAAS,IAAI,QAAQ;AAInB,QAAI,CAAC,OAAO,QAAQ,OAAO,KAAK,KAAK,CAAC,OAAO,QAAQ,OAAO,QAAQ,GAAG;AACrE,YAAM,YAAY,gBAAgB,CAAC,EAAC,MAAM,KAAK,OAAO,cAAa,CAAC,IAAI,CAAC,EAAC,MAAM,KAAK,OAAO,cAAa,CAAC;AAC1G,YAAM,kBAAkB;AAAA,QACtB;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,QACT;AAAA,QAAG;AAAA,UACD,MAAM;AAAA,UACN,OAAO;AAAA,QACT;AAAA,QAAG;AAAA,UACD,MAAM;AAAA,UACN,OAAO;AAAA,QACT;AAAA,QAAG;AAAA,UACD,MAAM;AAAA,UACN,OAAO;AAAA,QACT;AAAA,MACF;AAEA,aAAO,YAAY;AAAA,QACjB,KAAK;AAAA,QACL,MAAM;AAAA,QACN,WAAW,gBAAgB,OAAO,SAAS;AAAA,MAC7C,CAAC;AAAA,IACH;AAGA,QAAI,CAAC,OAAO,QAAQ,OAAO,KAAK,KAAK,OAAO,QAAQ,OAAO,QAAQ,GAAG;AACpE,aAAO,OACJ,KAAK,OAAK,EAAE,QAAQ,SAAS,SAAS,MAAM,CAAC,EAAC,MAAM,MAAK,MAAM,EAAE,UAAU,KAAK,QAAM,GAAG,SAAS,QAAQ,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,EAChI,UAAU,KAAK,QAAM,SAAS,MAAM,CAAC,EAAC,MAAM,MAAK,MAAM,GAAG,SAAS,QAAQ,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,EAChG,QAAQ;AAAA,IACb;AAEA,QAAI,CAAC,OAAO,QAAQ,OAAO,KAAK,KAAK,CAAC,eAAe;AACnD,aAAO,YAAY;AAAA,QACjB,KAAK;AAAA,QACL,WAAW;AAAA,UACT;AAAA,YACE,MAAM;AAAA,YACN,OAAO;AAAA,UACT;AAAA,UAAG;AAAA,YACD,MAAM;AAAA,YACN,OAAO;AAAA,UACT;AAAA,UAAG;AAAA,YACD,MAAM;AAAA,YACN,OAAO;AAAA,UACT;AAAA,UAAG;AAAA,YACD,MAAM;AAAA,YACN,OAAO;AAAA,UACT;AAAA,UAAG;AAAA,YACD,MAAM;AAAA,YACN,OAAO;AAAA,UACT;AAAA,UAAG;AAAA,YACD,MAAM;AAAA,YACN,OAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,SAAS,QAAQ;AAExB,QAAI,CAAC,qBAAqB,MAAM,GAAG;AACjC,aAAO,EAAC,OAAO,KAAI;AAAA,IACrB;AAEA,WAAO,EAAC,OAAO,OAAO,QAAQ,OAAO,KAAK,MAAM,OAAO,QAAQ,OAAO,KAAK,KAAK,eAAc;AAAA,EAChG;AAEA,SAAO;AAAA,IACL,aAAa;AAAA,IACb;AAAA,IACA;AAAA,EACF;AAEA,WAAS,OAAO,KAAK,KAAK,MAAM;AAC9B,WAAO,IAAI,OAAO,KAAK,OAAK,EAAE,QAAQ,OAAO,KAAK,MAAM,CAAC,EAAC,MAAM,MAAK,MAAM,EAAE,UAAU,KAAK,QAAM,GAAG,SAAS,QAAQ,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC;AAAA,EAC9I;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,137 @@
1
+ import assert from "node:assert";
2
+ import { describe, it } from "node:test";
3
+ import { MarcRecord } from "@natlibfi/marc-record";
4
+ import validatorFactory from "./access-rights.js";
5
+ describe("access-rights", async () => {
6
+ const f337 = {
7
+ tag: "337",
8
+ ind1: " ",
9
+ ind2: " ",
10
+ subfields: [
11
+ { code: "b", value: "c" },
12
+ { code: "2", value: "rdamedia" }
13
+ ]
14
+ };
15
+ const f337nonElectronic = {
16
+ tag: "337",
17
+ ind1: " ",
18
+ ind2: " ",
19
+ subfields: [
20
+ { code: "a", value: "k\xE4ytett\xE4viss\xE4 ilman laitetta" },
21
+ { code: "b", value: "n" },
22
+ { code: "2", value: "rdamedia" }
23
+ ]
24
+ };
25
+ const ldf5061old = {
26
+ tag: "506",
27
+ ind1: "1",
28
+ ind2: " ",
29
+ subfields: [
30
+ { code: "a", value: "Aineisto on k\xE4ytett\xE4viss\xE4 vapaakappalekirjastoissa." },
31
+ { code: "f", value: "Online access with authorization" },
32
+ { code: "2", value: "star" },
33
+ { code: "5", value: "FI-Vapaa" },
34
+ { code: "9", value: "FENNI<KEEP>" }
35
+ ]
36
+ };
37
+ const ldf5061new = {
38
+ tag: "506",
39
+ ind1: "1",
40
+ ind2: " ",
41
+ subfields: [
42
+ { code: "a", value: "Aineisto on k\xE4ytett\xE4viss\xE4 vapaakappalety\xF6asemilla." },
43
+ { code: "f", value: "Online access with authorization" },
44
+ { code: "2", value: "star" },
45
+ { code: "5", value: "FI-Vapaa" },
46
+ { code: "9", value: "FENNI<KEEP>" }
47
+ ]
48
+ };
49
+ const ldf540 = {
50
+ tag: "540",
51
+ ind1: " ",
52
+ ind2: " ",
53
+ subfields: [
54
+ { code: "a", value: "Aineisto on k\xE4ytett\xE4viss\xE4 tutkimus- ja muihin tarkoituksiin;" },
55
+ { code: "b", value: "Kansalliskirjasto;" },
56
+ { code: "c", value: "Laki kulttuuriaineistojen tallettamisesta ja s\xE4ilytt\xE4misest\xE4" },
57
+ { code: "u", value: "http://www.finlex.fi/fi/laki/ajantasa/2007/20071433" },
58
+ { code: "5", value: "FI-Vapaa" },
59
+ { code: "9", value: "FENNI<KEEP>" }
60
+ ]
61
+ };
62
+ const f5060 = {
63
+ tag: "506",
64
+ ind1: "0",
65
+ ind2: " ",
66
+ subfields: [
67
+ { code: "a", value: "Aineisto on vapaasti saatavissa." },
68
+ { code: "f", value: "Unrestricted online access" },
69
+ { code: "2", value: "star" },
70
+ { code: "9", value: "FENNI<KEEP>" }
71
+ ]
72
+ };
73
+ const f540 = {
74
+ tag: "540",
75
+ ind1: " ",
76
+ ind2: " ",
77
+ subfields: [{ code: "c", value: "This publication is copyrighted. You may download, display and print it for Your own personal use. Commercial use is prohibited." }]
78
+ };
79
+ it("Creates a validator", async () => {
80
+ const validator = await validatorFactory();
81
+ assert.equal(typeof validator, "object");
82
+ assert.equal(typeof validator.description, "string");
83
+ assert.equal(typeof validator.validate, "function");
84
+ });
85
+ const test = await (async () => {
86
+ const validator = await validatorFactory();
87
+ return {
88
+ validate: async (valid, ...recfields) => {
89
+ const result = await validator.validate(new MarcRecord({ fields: recfields }));
90
+ assert.deepEqual(result, { valid });
91
+ },
92
+ fix: async (recfields, resfields) => {
93
+ const record = new MarcRecord({ fields: recfields });
94
+ await validator.fix(record);
95
+ assert.deepEqual(record.fields, resfields);
96
+ }
97
+ };
98
+ })();
99
+ describe("#validate", () => {
100
+ it("Finds the record valid; fields 5061 and 540 are missing but its ok since record is not electronic", async () => {
101
+ await test.validate(true, f337nonElectronic);
102
+ });
103
+ it("Finds the record valid; Legal deposit fields 5061 and 540", async () => {
104
+ await test.validate(true, f337, ldf5061new, ldf540);
105
+ });
106
+ it("Finds the record invalid; Old phrase in 5061", async () => {
107
+ await test.validate(false, f337, ldf5061old, ldf540);
108
+ });
109
+ it("Finds the record invalid; Missing 5061", async () => {
110
+ await test.validate(false, f337, f5060, ldf540);
111
+ });
112
+ it("Finds the record invalid; Missing 540", async () => {
113
+ await test.validate(false, f337, ldf5061new, f540);
114
+ });
115
+ it("Finds the record invalid; Missing 5061 and 540", async () => {
116
+ await test.validate(false, f337, f5060, f540);
117
+ });
118
+ });
119
+ describe("#fix", () => {
120
+ it("Legal deposit fields 5061 and 540; Nothing to add", async () => {
121
+ await test.fix([ldf5061new, ldf540], [ldf5061new, ldf540]);
122
+ });
123
+ it("Old phrase in 5061; Overwritten with new phrase", async () => {
124
+ await test.fix([ldf5061old, ldf540], [ldf5061new, ldf540]);
125
+ });
126
+ it("540 but missing 5061; Adds 5061", async () => {
127
+ await test.fix([f5060, ldf540], [f5060, ldf5061new, ldf540]);
128
+ });
129
+ it("5061 but missing 540; Adds 540", async () => {
130
+ await test.fix([ldf5061new, f540], [ldf5061new, f540, ldf540]);
131
+ });
132
+ it("Both, 5061 and 540, missing; Adds 5061 and 540", async () => {
133
+ await test.fix([f5060, f540], [f5060, ldf5061new, f540, ldf540]);
134
+ });
135
+ });
136
+ });
137
+ //# sourceMappingURL=access-rights.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/access-rights.test.js"],
4
+ "sourcesContent": ["import assert from 'node:assert';\nimport {describe, it} from 'node:test';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './access-rights.js';\n\n\ndescribe('access-rights', async () => {\n // Fields\n const f337 = {\n tag: '337',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {code: 'b', value: 'c'},\n {code: '2', value: 'rdamedia'}\n ]\n };\n\n const f337nonElectronic = {\n tag: '337',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {code: 'a', value: 'k\u00E4ytett\u00E4viss\u00E4 ilman laitetta'},\n {code: 'b', value: 'n'},\n {code: '2', value: 'rdamedia'}\n ]\n };\n\n const ldf5061old = {\n tag: '506',\n ind1: '1',\n ind2: ' ',\n subfields: [\n {code: 'a', value: 'Aineisto on k\u00E4ytett\u00E4viss\u00E4 vapaakappalekirjastoissa.'},\n {code: 'f', value: 'Online access with authorization'},\n {code: '2', value: 'star'},\n {code: '5', value: 'FI-Vapaa'},\n {code: '9', value: 'FENNI<KEEP>'}\n ]\n };\n\n const ldf5061new = {\n tag: '506',\n ind1: '1',\n ind2: ' ',\n subfields: [\n {code: 'a', value: 'Aineisto on k\u00E4ytett\u00E4viss\u00E4 vapaakappalety\u00F6asemilla.'},\n {code: 'f', value: 'Online access with authorization'},\n {code: '2', value: 'star'},\n {code: '5', value: 'FI-Vapaa'},\n {code: '9', value: 'FENNI<KEEP>'}\n ]\n };\n\n\n const ldf540 = {\n tag: '540',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {code: 'a', value: 'Aineisto on k\u00E4ytett\u00E4viss\u00E4 tutkimus- ja muihin tarkoituksiin;'},\n {code: 'b', value: 'Kansalliskirjasto;'},\n {code: 'c', value: 'Laki kulttuuriaineistojen tallettamisesta ja s\u00E4ilytt\u00E4misest\u00E4'},\n {code: 'u', value: 'http://www.finlex.fi/fi/laki/ajantasa/2007/20071433'},\n {code: '5', value: 'FI-Vapaa'},\n {code: '9', value: 'FENNI<KEEP>'}\n ]\n };\n\n const f5060 = {\n tag: '506',\n ind1: '0',\n ind2: ' ',\n subfields: [\n {code: 'a', value: 'Aineisto on vapaasti saatavissa.'},\n {code: 'f', value: 'Unrestricted online access'},\n {code: '2', value: 'star'},\n {code: '9', value: 'FENNI<KEEP>'}\n ]\n };\n\n const f540 = {\n tag: '540',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'c', value: 'This publication is copyrighted. You may download, display and print it for Your own personal use. Commercial use is prohibited.'}]\n };\n\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 // Tests\n const test = await (async () => {\n const validator = await validatorFactory();\n return {\n validate: async (valid, ...recfields) => {\n const result = await validator.validate(new MarcRecord({fields: recfields}));\n assert.deepEqual(result, {valid});\n },\n\n fix: async (recfields, resfields) => {\n const record = new MarcRecord({fields: recfields});\n await validator.fix(record);\n assert.deepEqual(record.fields, resfields);\n }\n };\n })();\n\n describe('#validate', () => {\n it('Finds the record valid; fields 5061 and 540 are missing but its ok since record is not electronic', async () => {\n await test.validate(true, f337nonElectronic);\n });\n\n it('Finds the record valid; Legal deposit fields 5061 and 540', async () => {\n await test.validate(true, f337, ldf5061new, ldf540);\n });\n\n it('Finds the record invalid; Old phrase in 5061', async () => {\n await test.validate(false, f337, ldf5061old, ldf540);\n });\n\n it('Finds the record invalid; Missing 5061', async () => {\n await test.validate(false, f337, f5060, ldf540);\n });\n\n it('Finds the record invalid; Missing 540', async () => {\n await test.validate(false, f337, ldf5061new, f540);\n });\n\n it('Finds the record invalid; Missing 5061 and 540', async () => {\n await test.validate(false, f337, f5060, f540);\n });\n });\n\n describe('#fix', () => {\n it('Legal deposit fields 5061 and 540; Nothing to add', async () => {\n await test.fix([ldf5061new, ldf540], [ldf5061new, ldf540]);\n });\n\n it('Old phrase in 5061; Overwritten with new phrase', async () => {\n await test.fix([ldf5061old, ldf540], [ldf5061new, ldf540]);\n });\n\n it('540 but missing 5061; Adds 5061', async () => {\n await test.fix([f5060, ldf540], [f5060, ldf5061new, ldf540]);\n });\n\n it('5061 but missing 540; Adds 540', async () => {\n await test.fix([ldf5061new, f540], [ldf5061new, f540, ldf540]);\n });\n\n it('Both, 5061 and 540, missing; Adds 5061 and 540', async () => {\n await test.fix([f5060, f540], [f5060, ldf5061new, f540, ldf540]);\n });\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -1,40 +1,27 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = _default;
7
- exports.getLanguageCode = getLanguageCode;
8
- var _utils = require("./utils");
9
- //import createDebugLogger from 'debug';
10
-
11
- const description = 'Add missing 041 field based on 008/35-37';
12
-
13
- // const multimediaRegexp = /multimedia/ui;
14
-
15
- function _default() {
1
+ import { fieldToString, nvdebug } from "./utils.js";
2
+ const description = "Add missing 041 field based on 008/35-37";
3
+ export default function() {
16
4
  return {
17
5
  description,
18
6
  validate,
19
7
  fix
20
8
  };
21
- function isRealLanguageCode(languageCode = '|||') {
22
- (0, _utils.nvdebug)(`Language code 008/35-37: ${languageCode}`);
23
- if (!languageCode.match(/^[a-z]{3}$/u) || ['mul', 'und', 'zxx'].includes(languageCode)) {
9
+ function isRealLanguageCode(languageCode = "|||") {
10
+ nvdebug(`Language code 008/35-37: ${languageCode}`);
11
+ if (!languageCode.match(/^[a-z]{3}$/u) || ["mul", "und", "zxx"].includes(languageCode)) {
24
12
  return false;
25
13
  }
26
- // Assume that value is valid:
27
14
  return true;
28
15
  }
29
16
  function determineSubfieldCode(record) {
30
17
  const typeOfRecord = record.getTypeOfRecord(record);
31
- if (typeOfRecord === 'i' || typeOfRecord === 'j') {
32
- return 'd';
18
+ if (typeOfRecord === "i" || typeOfRecord === "j") {
19
+ return "d";
33
20
  }
34
- return 'a';
21
+ return "a";
35
22
  }
36
23
  function generateContent(record) {
37
- const languageCodeFields = record.get('041');
24
+ const languageCodeFields = record.get("041");
38
25
  if (languageCodeFields.length > 0) {
39
26
  return null;
40
27
  }
@@ -43,25 +30,12 @@ function _default() {
43
30
  return null;
44
31
  }
45
32
  const subfieldCode = determineSubfieldCode(record);
46
- // NB! Usemarcon-bookwhere had IND1=0...
47
- return {
48
- tag: '041',
49
- ind1: ' ',
50
- ind2: ' ',
51
- subfields: [{
52
- code: subfieldCode,
53
- value: languageCode
54
- }]
55
- };
33
+ return { tag: "041", ind1: " ", ind2: " ", subfields: [{ code: subfieldCode, value: languageCode }] };
56
34
  }
57
35
  function fix(record) {
58
- (0, _utils.nvdebug)(`FIX ${description}...`);
36
+ nvdebug(`FIX ${description}...`);
59
37
  const data = generateContent(record);
60
- const res = {
61
- message: [],
62
- fix: [],
63
- valid: true
64
- };
38
+ const res = { message: [], fix: [], valid: true };
65
39
  if (data) {
66
40
  record.insertField(data);
67
41
  return res;
@@ -69,26 +43,20 @@ function _default() {
69
43
  return res;
70
44
  }
71
45
  function validate(record) {
72
- (0, _utils.nvdebug)(`VALIDATE ${description}...`);
46
+ nvdebug(`VALIDATE ${description}...`);
73
47
  const data = generateContent(record);
74
48
  if (!data) {
75
- return {
76
- message: [],
77
- valid: true
78
- };
49
+ return { message: [], valid: true };
79
50
  }
80
- const msg = `${description}: '${(0, _utils.fieldToString)(data)}'`;
81
- return {
82
- message: [msg],
83
- valid: false
84
- };
51
+ const msg = `${description}: '${fieldToString(data)}'`;
52
+ return { message: [msg], valid: false };
85
53
  }
86
54
  }
87
- function getLanguageCode(record) {
88
- const [f008] = record.get('008');
55
+ export function getLanguageCode(record) {
56
+ const [f008] = record.get("008");
89
57
  if (f008 && f008.value.length === 40) {
90
58
  return f008.value.substring(35, 38);
91
59
  }
92
- return '|||';
60
+ return "|||";
93
61
  }
94
- //# sourceMappingURL=addMissingField041.js.map
62
+ //# sourceMappingURL=addMissingField041.js.map
@@ -1 +1,7 @@
1
- {"version":3,"file":"addMissingField041.js","names":["_utils","require","description","_default","validate","fix","isRealLanguageCode","languageCode","nvdebug","match","includes","determineSubfieldCode","record","typeOfRecord","getTypeOfRecord","generateContent","languageCodeFields","get","length","getLanguageCode","subfieldCode","tag","ind1","ind2","subfields","code","value","data","res","message","valid","insertField","msg","fieldToString","f008","substring"],"sources":["../src/addMissingField041.js"],"sourcesContent":["//import createDebugLogger from 'debug';\nimport {fieldToString, nvdebug} from './utils';\n\nconst description = 'Add missing 041 field based on 008/35-37';\n\n// const multimediaRegexp = /multimedia/ui;\n\nexport default function () {\n\n return {\n description, validate, fix\n };\n\n function isRealLanguageCode(languageCode = '|||') {\n nvdebug(`Language code 008/35-37: ${languageCode}`);\n if (!languageCode.match(/^[a-z]{3}$/u) || ['mul', 'und', 'zxx'].includes(languageCode)) {\n return false;\n }\n // Assume that value is valid:\n return true;\n }\n\n function determineSubfieldCode(record) {\n const typeOfRecord = record.getTypeOfRecord(record);\n if (typeOfRecord === 'i' || typeOfRecord === 'j') {\n return 'd';\n }\n return 'a';\n }\n\n function generateContent(record) {\n const languageCodeFields = record.get('041');\n if (languageCodeFields.length > 0) {\n return null;\n }\n const languageCode = getLanguageCode(record);\n if (!isRealLanguageCode(languageCode)) {\n return null;\n }\n const subfieldCode = determineSubfieldCode(record);\n // NB! Usemarcon-bookwhere had IND1=0...\n return {tag: '041', ind1: ' ', ind2: ' ', subfields: [{code: subfieldCode, value: languageCode}]};\n }\n\n function fix(record) {\n nvdebug(`FIX ${description}...`);\n const data = generateContent(record);\n const res = {message: [], fix: [], valid: true};\n if (data) {\n record.insertField(data);\n return res;\n }\n return res;\n }\n\n function validate(record) {\n nvdebug(`VALIDATE ${description}...`);\n const data = generateContent(record);\n if (!data) {\n return {message: [], valid: true};\n }\n const msg = `${description}: '${fieldToString(data)}'`;\n return {message: [msg], valid: false};\n }\n}\n\nexport function getLanguageCode(record) {\n const [f008] = record.get('008');\n if (f008 && f008.value.length === 40) {\n return f008.value.substring(35, 38);\n }\n return '|||';\n}\n"],"mappings":";;;;;;;AACA,IAAAA,MAAA,GAAAC,OAAA;AADA;;AAGA,MAAMC,WAAW,GAAG,0CAA0C;;AAE9D;;AAEe,SAAAC,SAAA,EAAY;EAEzB,OAAO;IACLD,WAAW;IAAEE,QAAQ;IAAEC;EACzB,CAAC;EAED,SAASC,kBAAkBA,CAACC,YAAY,GAAG,KAAK,EAAE;IAChD,IAAAC,cAAO,EAAC,4BAA4BD,YAAY,EAAE,CAAC;IACnD,IAAI,CAACA,YAAY,CAACE,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAACC,QAAQ,CAACH,YAAY,CAAC,EAAE;MACtF,OAAO,KAAK;IACd;IACA;IACA,OAAO,IAAI;EACb;EAEA,SAASI,qBAAqBA,CAACC,MAAM,EAAE;IACrC,MAAMC,YAAY,GAAGD,MAAM,CAACE,eAAe,CAACF,MAAM,CAAC;IACnD,IAAIC,YAAY,KAAK,GAAG,IAAIA,YAAY,KAAK,GAAG,EAAE;MAChD,OAAO,GAAG;IACZ;IACA,OAAO,GAAG;EACZ;EAEA,SAASE,eAAeA,CAACH,MAAM,EAAE;IAC/B,MAAMI,kBAAkB,GAAGJ,MAAM,CAACK,GAAG,CAAC,KAAK,CAAC;IAC5C,IAAID,kBAAkB,CAACE,MAAM,GAAG,CAAC,EAAE;MACjC,OAAO,IAAI;IACb;IACA,MAAMX,YAAY,GAAGY,eAAe,CAACP,MAAM,CAAC;IAC5C,IAAI,CAACN,kBAAkB,CAACC,YAAY,CAAC,EAAE;MACrC,OAAO,IAAI;IACb;IACA,MAAMa,YAAY,GAAGT,qBAAqB,CAACC,MAAM,CAAC;IAClD;IACA,OAAO;MAACS,GAAG,EAAE,KAAK;MAAEC,IAAI,EAAE,GAAG;MAAEC,IAAI,EAAE,GAAG;MAAEC,SAAS,EAAE,CAAC;QAACC,IAAI,EAAEL,YAAY;QAAEM,KAAK,EAAEnB;MAAY,CAAC;IAAC,CAAC;EACnG;EAEA,SAASF,GAAGA,CAACO,MAAM,EAAE;IACnB,IAAAJ,cAAO,EAAC,OAAON,WAAW,KAAK,CAAC;IAChC,MAAMyB,IAAI,GAAGZ,eAAe,CAACH,MAAM,CAAC;IACpC,MAAMgB,GAAG,GAAG;MAACC,OAAO,EAAE,EAAE;MAAExB,GAAG,EAAE,EAAE;MAAEyB,KAAK,EAAE;IAAI,CAAC;IAC/C,IAAIH,IAAI,EAAE;MACRf,MAAM,CAACmB,WAAW,CAACJ,IAAI,CAAC;MACxB,OAAOC,GAAG;IACZ;IACA,OAAOA,GAAG;EACZ;EAEA,SAASxB,QAAQA,CAACQ,MAAM,EAAE;IACxB,IAAAJ,cAAO,EAAC,YAAYN,WAAW,KAAK,CAAC;IACrC,MAAMyB,IAAI,GAAGZ,eAAe,CAACH,MAAM,CAAC;IACpC,IAAI,CAACe,IAAI,EAAE;MACT,OAAO;QAACE,OAAO,EAAE,EAAE;QAAEC,KAAK,EAAE;MAAI,CAAC;IACnC;IACA,MAAME,GAAG,GAAG,GAAG9B,WAAW,MAAM,IAAA+B,oBAAa,EAACN,IAAI,CAAC,GAAG;IACtD,OAAO;MAACE,OAAO,EAAE,CAACG,GAAG,CAAC;MAAEF,KAAK,EAAE;IAAK,CAAC;EACvC;AACF;AAEO,SAASX,eAAeA,CAACP,MAAM,EAAE;EACtC,MAAM,CAACsB,IAAI,CAAC,GAAGtB,MAAM,CAACK,GAAG,CAAC,KAAK,CAAC;EAChC,IAAIiB,IAAI,IAAIA,IAAI,CAACR,KAAK,CAACR,MAAM,KAAK,EAAE,EAAE;IACpC,OAAOgB,IAAI,CAACR,KAAK,CAACS,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC;EACrC;EACA,OAAO,KAAK;AACd","ignoreList":[]}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/addMissingField041.js"],
4
+ "sourcesContent": ["//import createDebugLogger from 'debug';\nimport {fieldToString, nvdebug} from './utils.js';\n\nconst description = 'Add missing 041 field based on 008/35-37';\n\n// const multimediaRegexp = /multimedia/ui;\n\nexport default function () {\n\n return {\n description, validate, fix\n };\n\n function isRealLanguageCode(languageCode = '|||') {\n nvdebug(`Language code 008/35-37: ${languageCode}`);\n if (!languageCode.match(/^[a-z]{3}$/u) || ['mul', 'und', 'zxx'].includes(languageCode)) {\n return false;\n }\n // Assume that value is valid:\n return true;\n }\n\n function determineSubfieldCode(record) {\n const typeOfRecord = record.getTypeOfRecord(record);\n if (typeOfRecord === 'i' || typeOfRecord === 'j') {\n return 'd';\n }\n return 'a';\n }\n\n function generateContent(record) {\n const languageCodeFields = record.get('041');\n if (languageCodeFields.length > 0) {\n return null;\n }\n const languageCode = getLanguageCode(record);\n if (!isRealLanguageCode(languageCode)) {\n return null;\n }\n const subfieldCode = determineSubfieldCode(record);\n // NB! Usemarcon-bookwhere had IND1=0...\n return {tag: '041', ind1: ' ', ind2: ' ', subfields: [{code: subfieldCode, value: languageCode}]};\n }\n\n function fix(record) {\n nvdebug(`FIX ${description}...`);\n const data = generateContent(record);\n const res = {message: [], fix: [], valid: true};\n if (data) {\n record.insertField(data);\n return res;\n }\n return res;\n }\n\n function validate(record) {\n nvdebug(`VALIDATE ${description}...`);\n const data = generateContent(record);\n if (!data) {\n return {message: [], valid: true};\n }\n const msg = `${description}: '${fieldToString(data)}'`;\n return {message: [msg], valid: false};\n }\n}\n\nexport function getLanguageCode(record) {\n const [f008] = record.get('008');\n if (f008 && f008.value.length === 40) {\n return f008.value.substring(35, 38);\n }\n return '|||';\n}\n"],
5
+ "mappings": "AACA,SAAQ,eAAe,eAAc;AAErC,MAAM,cAAc;AAIpB,0BAA2B;AAEzB,SAAO;AAAA,IACL;AAAA,IAAa;AAAA,IAAU;AAAA,EACzB;AAEA,WAAS,mBAAmB,eAAe,OAAO;AAChD,YAAQ,4BAA4B,YAAY,EAAE;AAClD,QAAI,CAAC,aAAa,MAAM,aAAa,KAAK,CAAC,OAAO,OAAO,KAAK,EAAE,SAAS,YAAY,GAAG;AACtF,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,sBAAsB,QAAQ;AACrC,UAAM,eAAe,OAAO,gBAAgB,MAAM;AAClD,QAAI,iBAAiB,OAAO,iBAAiB,KAAK;AAChD,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAEA,WAAS,gBAAgB,QAAQ;AAC/B,UAAM,qBAAqB,OAAO,IAAI,KAAK;AAC3C,QAAI,mBAAmB,SAAS,GAAG;AACjC,aAAO;AAAA,IACT;AACA,UAAM,eAAe,gBAAgB,MAAM;AAC3C,QAAI,CAAC,mBAAmB,YAAY,GAAG;AACrC,aAAO;AAAA,IACT;AACA,UAAM,eAAe,sBAAsB,MAAM;AAEjD,WAAO,EAAC,KAAK,OAAO,MAAM,KAAK,MAAM,KAAK,WAAW,CAAC,EAAC,MAAM,cAAc,OAAO,aAAY,CAAC,EAAC;AAAA,EAClG;AAEA,WAAS,IAAI,QAAQ;AACnB,YAAQ,OAAO,WAAW,KAAK;AAC/B,UAAM,OAAO,gBAAgB,MAAM;AACnC,UAAM,MAAM,EAAC,SAAS,CAAC,GAAG,KAAK,CAAC,GAAG,OAAO,KAAI;AAC9C,QAAI,MAAM;AACR,aAAO,YAAY,IAAI;AACvB,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAEA,WAAS,SAAS,QAAQ;AACxB,YAAQ,YAAY,WAAW,KAAK;AACpC,UAAM,OAAO,gBAAgB,MAAM;AACnC,QAAI,CAAC,MAAM;AACT,aAAO,EAAC,SAAS,CAAC,GAAG,OAAO,KAAI;AAAA,IAClC;AACA,UAAM,MAAM,GAAG,WAAW,MAAM,cAAc,IAAI,CAAC;AACnD,WAAO,EAAC,SAAS,CAAC,GAAG,GAAG,OAAO,MAAK;AAAA,EACtC;AACF;AAEO,gBAAS,gBAAgB,QAAQ;AACtC,QAAM,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK;AAC/B,MAAI,QAAQ,KAAK,MAAM,WAAW,IAAI;AACpC,WAAO,KAAK,MAAM,UAAU,IAAI,EAAE;AAAA,EACpC;AACA,SAAO;AACT;",
6
+ "names": []
7
+ }
@@ -0,0 +1,39 @@
1
+ import assert from "node:assert";
2
+ import { MarcRecord } from "@natlibfi/marc-record";
3
+ import validatorFactory from "./addMissingField041.js";
4
+ import { READERS } from "@natlibfi/fixura";
5
+ import generateTests from "@natlibfi/fixugen";
6
+ generateTests({
7
+ callback,
8
+ path: [import.meta.dirname, "..", "test-fixtures", "addMissingField041"],
9
+ useMetadataFile: true,
10
+ recurse: false,
11
+ fixura: {
12
+ reader: READERS.JSON
13
+ },
14
+ hooks: {
15
+ before: async () => {
16
+ testValidatorFactory();
17
+ }
18
+ }
19
+ });
20
+ async function testValidatorFactory() {
21
+ const validator = await validatorFactory();
22
+ assert.equal(typeof validator, "object");
23
+ assert.equal(typeof validator.description, "string");
24
+ assert.equal(typeof validator.validate, "function");
25
+ assert.equal(typeof validator.fix, "function");
26
+ }
27
+ async function callback({ getFixture, fix = false }) {
28
+ const validator = await validatorFactory();
29
+ const record = new MarcRecord(getFixture("record.json"));
30
+ const expectedResult = getFixture("expectedResult.json");
31
+ if (!fix) {
32
+ const result = await validator.validate(record);
33
+ assert.deepEqual(result, expectedResult);
34
+ return;
35
+ }
36
+ await validator.fix(record);
37
+ assert.deepEqual(record, expectedResult);
38
+ }
39
+ //# sourceMappingURL=addMissingField041.test.js.map