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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (546) hide show
  1. package/.github/workflows/melinda-node-tests.yml +1 -1
  2. package/dist/access-rights.js +63 -91
  3. package/dist/access-rights.js.map +7 -1
  4. package/dist/access-rights.test.js +137 -0
  5. package/dist/access-rights.test.js.map +7 -0
  6. package/dist/addMissingField041.js +21 -53
  7. package/dist/addMissingField041.js.map +7 -1
  8. package/dist/addMissingField041.test.js +39 -0
  9. package/dist/addMissingField041.test.js.map +7 -0
  10. package/dist/addMissingField336.js +99 -191
  11. package/dist/addMissingField336.js.map +7 -1
  12. package/dist/addMissingField336.test.js +39 -0
  13. package/dist/addMissingField336.test.js.map +7 -0
  14. package/dist/addMissingField337.js +63 -132
  15. package/dist/addMissingField337.js.map +7 -1
  16. package/dist/addMissingField337.test.js +39 -0
  17. package/dist/addMissingField337.test.js.map +7 -0
  18. package/dist/addMissingField338.js +147 -253
  19. package/dist/addMissingField338.js.map +7 -1
  20. package/dist/addMissingField338.test.js +39 -0
  21. package/dist/addMissingField338.test.js.map +7 -0
  22. package/dist/cyrillux-usemarcon-replacement.js +119 -272
  23. package/dist/cyrillux-usemarcon-replacement.js.map +7 -1
  24. package/dist/cyrillux-usemarcon-replacement.test.js +46 -0
  25. package/dist/cyrillux-usemarcon-replacement.test.js.map +7 -0
  26. package/dist/cyrillux.js +119 -223
  27. package/dist/cyrillux.js.map +7 -1
  28. package/dist/cyrillux.test.js +39 -0
  29. package/dist/cyrillux.test.js.map +7 -0
  30. package/dist/disambiguateSeriesStatements.js +40 -81
  31. package/dist/disambiguateSeriesStatements.js.map +7 -1
  32. package/dist/disambiguateSeriesStatements.test.js +44 -0
  33. package/dist/disambiguateSeriesStatements.test.js.map +7 -0
  34. package/dist/double-commas.js +7 -14
  35. package/dist/double-commas.js.map +7 -1
  36. package/dist/double-commas.test.js +48 -0
  37. package/dist/double-commas.test.js.map +7 -0
  38. package/dist/duplicates-ind1.js +10 -31
  39. package/dist/duplicates-ind1.js.map +7 -1
  40. package/dist/duplicates-ind1.test.js +40 -0
  41. package/dist/duplicates-ind1.test.js.map +7 -0
  42. package/dist/empty-fields.js +10 -22
  43. package/dist/empty-fields.js.map +7 -1
  44. package/dist/empty-fields.test.js +129 -0
  45. package/dist/empty-fields.test.js.map +7 -0
  46. package/dist/ending-punctuation-conf.js +871 -769
  47. package/dist/ending-punctuation-conf.js.map +7 -1
  48. package/dist/ending-punctuation.js +84 -167
  49. package/dist/ending-punctuation.js.map +7 -1
  50. package/dist/ending-punctuation.test.js +2290 -0
  51. package/dist/ending-punctuation.test.js.map +7 -0
  52. package/dist/ending-whitespace.js +10 -35
  53. package/dist/ending-whitespace.js.map +7 -1
  54. package/dist/ending-whitespace.test.js +38 -0
  55. package/dist/ending-whitespace.test.js.map +7 -0
  56. package/dist/field-008-18-34-character-groups.js +40 -125
  57. package/dist/field-008-18-34-character-groups.js.map +7 -1
  58. package/dist/field-008-18-34-character-groups.test.js +45 -0
  59. package/dist/field-008-18-34-character-groups.test.js.map +7 -0
  60. package/dist/field-505-separators.js +19 -39
  61. package/dist/field-505-separators.js.map +7 -1
  62. package/dist/field-505-separators.test.js +45 -0
  63. package/dist/field-505-separators.test.js.map +7 -0
  64. package/dist/field-521-fix.js +19 -47
  65. package/dist/field-521-fix.js.map +7 -1
  66. package/dist/field-521-fix.test.js +44 -0
  67. package/dist/field-521-fix.test.js.map +7 -0
  68. package/dist/field-exclusion.js +37 -91
  69. package/dist/field-exclusion.js.map +7 -1
  70. package/dist/field-exclusion.test.js +821 -0
  71. package/dist/field-exclusion.test.js.map +7 -0
  72. package/dist/field-structure.js +52 -104
  73. package/dist/field-structure.js.map +7 -1
  74. package/dist/field-structure.test.js +587 -0
  75. package/dist/field-structure.test.js.map +7 -0
  76. package/dist/field33XUtils.js +119 -503
  77. package/dist/field33XUtils.js.map +7 -1
  78. package/dist/fields-present.js +11 -23
  79. package/dist/fields-present.js.map +7 -1
  80. package/dist/fields-present.test.js +95 -0
  81. package/dist/fields-present.test.js.map +7 -0
  82. package/dist/fix-33X.js +393 -431
  83. package/dist/fix-33X.js.map +7 -1
  84. package/dist/fix-33X.test.js +39 -0
  85. package/dist/fix-33X.test.js.map +7 -0
  86. package/dist/fix-country-codes.js +20 -50
  87. package/dist/fix-country-codes.js.map +7 -1
  88. package/dist/fix-country-codes.test.js +44 -0
  89. package/dist/fix-country-codes.test.js.map +7 -0
  90. package/dist/fix-language-codes.js +23 -53
  91. package/dist/fix-language-codes.js.map +7 -1
  92. package/dist/fix-language-codes.test.js +38 -0
  93. package/dist/fix-language-codes.test.js.map +7 -0
  94. package/dist/fixRelatorTerms.js +82 -209
  95. package/dist/fixRelatorTerms.js.map +7 -1
  96. package/dist/fixRelatorTerms.test.js +44 -0
  97. package/dist/fixRelatorTerms.test.js.map +7 -0
  98. package/dist/fixed-fields.js +21 -30
  99. package/dist/fixed-fields.js.map +7 -1
  100. package/dist/fixed-fields.test.js +87 -0
  101. package/dist/fixed-fields.test.js.map +7 -0
  102. package/dist/identical-fields.js +8 -24
  103. package/dist/identical-fields.js.map +7 -1
  104. package/dist/identical-fields.test.js +119 -0
  105. package/dist/identical-fields.test.js.map +7 -0
  106. package/dist/index.js +119 -413
  107. package/dist/index.js.map +7 -1
  108. package/dist/indicator-fixes.js +57 -95
  109. package/dist/indicator-fixes.js.map +7 -1
  110. package/dist/indicator-fixes.test.js +42 -0
  111. package/dist/indicator-fixes.test.js.map +7 -0
  112. package/dist/isbn-issn.js +66 -126
  113. package/dist/isbn-issn.js.map +7 -1
  114. package/dist/isbn-issn.test.js +398 -0
  115. package/dist/isbn-issn.test.js.map +7 -0
  116. package/dist/item-language.js +32 -65
  117. package/dist/item-language.js.map +7 -1
  118. package/dist/item-language.test.js +322 -0
  119. package/dist/item-language.test.js.map +7 -0
  120. package/dist/melindaCustomMergeFields.js +5182 -11233
  121. package/dist/melindaCustomMergeFields.js.map +7 -1
  122. package/dist/merge-fields/controlSubfields.js +75 -142
  123. package/dist/merge-fields/controlSubfields.js.map +7 -1
  124. package/dist/merge-fields/counterpartField.js +182 -379
  125. package/dist/merge-fields/counterpartField.js.map +7 -1
  126. package/dist/merge-fields/index.js +15 -49
  127. package/dist/merge-fields/index.js.map +7 -1
  128. package/dist/merge-fields/mergableIndicator.js +18 -51
  129. package/dist/merge-fields/mergableIndicator.js.map +7 -1
  130. package/dist/merge-fields/mergableTag.js +78 -30
  131. package/dist/merge-fields/mergableTag.js.map +7 -1
  132. package/dist/merge-fields/mergeConfig.js +66 -171
  133. package/dist/merge-fields/mergeConfig.js.map +7 -1
  134. package/dist/merge-fields/mergeConstraints.js +323 -1214
  135. package/dist/merge-fields/mergeConstraints.js.map +7 -1
  136. package/dist/merge-fields/mergeField.js +47 -111
  137. package/dist/merge-fields/mergeField.js.map +7 -1
  138. package/dist/merge-fields/mergeIndicator.js +64 -118
  139. package/dist/merge-fields/mergeIndicator.js.map +7 -1
  140. package/dist/merge-fields/mergeOrAddPostprocess.js +14 -38
  141. package/dist/merge-fields/mergeOrAddPostprocess.js.map +7 -1
  142. package/dist/merge-fields/mergeOrAddSubfield.js +62 -104
  143. package/dist/merge-fields/mergeOrAddSubfield.js.map +7 -1
  144. package/dist/merge-fields/mergeSubfield.js +47 -95
  145. package/dist/merge-fields/mergeSubfield.js.map +7 -1
  146. package/dist/merge-fields/removeDuplicateSubfields.js +18 -31
  147. package/dist/merge-fields/removeDuplicateSubfields.js.map +7 -1
  148. package/dist/merge-fields/worldKnowledge.js +15 -40
  149. package/dist/merge-fields/worldKnowledge.js.map +7 -1
  150. package/dist/merge-fields.test.js +44 -0
  151. package/dist/merge-fields.test.js.map +7 -0
  152. package/dist/mergeField500Lisapainokset.js +28 -57
  153. package/dist/mergeField500Lisapainokset.js.map +7 -1
  154. package/dist/mergeField500Lisapainokset.test.js +44 -0
  155. package/dist/mergeField500Lisapainokset.test.js.map +7 -0
  156. package/dist/mergeRelatorTermFields.js +33 -69
  157. package/dist/mergeRelatorTermFields.js.map +7 -1
  158. package/dist/mergeRelatorTermFields.test.js +44 -0
  159. package/dist/mergeRelatorTermFields.test.js.map +7 -0
  160. package/dist/modernize-502.js +23 -55
  161. package/dist/modernize-502.js.map +7 -1
  162. package/dist/modernize-502.test.js +38 -0
  163. package/dist/modernize-502.test.js.map +7 -0
  164. package/dist/multiple-subfield-0.js +23 -48
  165. package/dist/multiple-subfield-0.js.map +7 -1
  166. package/dist/multiple-subfield-0.test.js +44 -0
  167. package/dist/multiple-subfield-0.test.js.map +7 -0
  168. package/dist/non-breaking-space.js +11 -32
  169. package/dist/non-breaking-space.js.map +7 -1
  170. package/dist/non-breaking-space.test.js +38 -0
  171. package/dist/non-breaking-space.test.js.map +7 -0
  172. package/dist/normalize-dashes.js +18 -37
  173. package/dist/normalize-dashes.js.map +7 -1
  174. package/dist/normalize-dashes.test.js +44 -0
  175. package/dist/normalize-dashes.test.js.map +7 -0
  176. package/dist/normalize-identifiers.js +54 -140
  177. package/dist/normalize-identifiers.js.map +7 -1
  178. package/dist/normalize-identifiers.test.js +44 -0
  179. package/dist/normalize-identifiers.test.js.map +7 -0
  180. package/dist/normalize-qualifying-information.js +23 -48
  181. package/dist/normalize-qualifying-information.js.map +7 -1
  182. package/dist/normalize-qualifying-information.test.js +44 -0
  183. package/dist/normalize-qualifying-information.test.js.map +7 -0
  184. package/dist/normalize-utf8-diacritics.js +19 -105
  185. package/dist/normalize-utf8-diacritics.js.map +7 -1
  186. package/dist/normalize-utf8-diacritics.test.js +44 -0
  187. package/dist/normalize-utf8-diacritics.test.js.map +7 -0
  188. package/dist/normalizeFieldForComparison.js +67 -158
  189. package/dist/normalizeFieldForComparison.js.map +7 -1
  190. package/dist/normalizeSubfieldValueForComparison.js +37 -77
  191. package/dist/normalizeSubfieldValueForComparison.js.map +7 -1
  192. package/dist/prepublicationUtils.js +58 -111
  193. package/dist/prepublicationUtils.js.map +7 -1
  194. package/dist/punctuation/index.js +56 -72
  195. package/dist/punctuation/index.js.map +7 -1
  196. package/dist/punctuation/rules/aut.js +372 -331
  197. package/dist/punctuation/rules/aut.js.map +7 -1
  198. package/dist/punctuation/rules/bib.js +420 -373
  199. package/dist/punctuation/rules/bib.js.map +7 -1
  200. package/dist/punctuation/rules/index.js +7 -21
  201. package/dist/punctuation/rules/index.js.map +7 -1
  202. package/dist/punctuation.test.js +44 -0
  203. package/dist/punctuation.test.js.map +7 -0
  204. package/dist/punctuation2.js +251 -800
  205. package/dist/punctuation2.js.map +7 -1
  206. package/dist/punctuation2.test.js +44 -0
  207. package/dist/punctuation2.test.js.map +7 -0
  208. package/dist/reindexSubfield6OccurenceNumbers.js +61 -96
  209. package/dist/reindexSubfield6OccurenceNumbers.js.map +7 -1
  210. package/dist/reindexSubfield6OccurenceNumbers.test.js +44 -0
  211. package/dist/reindexSubfield6OccurenceNumbers.test.js.map +7 -0
  212. package/dist/removeDuplicateDataFields.js +102 -202
  213. package/dist/removeDuplicateDataFields.js.map +7 -1
  214. package/dist/removeDuplicateDataFields.test.js +44 -0
  215. package/dist/removeDuplicateDataFields.test.js.map +7 -0
  216. package/dist/removeInferiorDataFields.js +103 -227
  217. package/dist/removeInferiorDataFields.js.map +7 -1
  218. package/dist/removeInferiorDataFields.test.js +44 -0
  219. package/dist/removeInferiorDataFields.test.js.map +7 -0
  220. package/dist/resolvable-ext-references-melinda.js +25 -60
  221. package/dist/resolvable-ext-references-melinda.js.map +7 -1
  222. package/dist/resolvable-ext-references-melinda.test.js +160 -0
  223. package/dist/resolvable-ext-references-melinda.test.js.map +7 -0
  224. package/dist/resolveOrphanedSubfield6s.js +33 -64
  225. package/dist/resolveOrphanedSubfield6s.js.map +7 -1
  226. package/dist/resolveOrphanedSubfield6s.test.js +44 -0
  227. package/dist/resolveOrphanedSubfield6s.test.js.map +7 -0
  228. package/dist/sanitize-vocabulary-source-codes.js +27 -55
  229. package/dist/sanitize-vocabulary-source-codes.js.map +7 -1
  230. package/dist/sanitize-vocabulary-source-codes.test.js +45 -0
  231. package/dist/sanitize-vocabulary-source-codes.test.js.map +7 -0
  232. package/dist/sort-tags.js +13 -25
  233. package/dist/sort-tags.js.map +7 -1
  234. package/dist/sort-tags.test.js +261 -0
  235. package/dist/sort-tags.test.js.map +7 -0
  236. package/dist/sortFields.js +152 -222
  237. package/dist/sortFields.js.map +7 -1
  238. package/dist/sortFields.test.js +44 -0
  239. package/dist/sortFields.test.js.map +7 -0
  240. package/dist/sortRelatorTerms.js +30 -68
  241. package/dist/sortRelatorTerms.js.map +7 -1
  242. package/dist/sortRelatorTerms.test.js +44 -0
  243. package/dist/sortRelatorTerms.test.js.map +7 -0
  244. package/dist/sortSubfields.js +102 -255
  245. package/dist/sortSubfields.js.map +7 -1
  246. package/dist/sortSubfields.test.js +44 -0
  247. package/dist/sortSubfields.test.js.map +7 -0
  248. package/dist/stripPunctuation.js +13 -36
  249. package/dist/stripPunctuation.js.map +7 -1
  250. package/dist/stripPunctuation.test.js +44 -0
  251. package/dist/stripPunctuation.test.js.map +7 -0
  252. package/dist/subfield-exclusion.js +28 -75
  253. package/dist/subfield-exclusion.js.map +7 -1
  254. package/dist/subfield-exclusion.test.js +471 -0
  255. package/dist/subfield-exclusion.test.js.map +7 -0
  256. package/dist/subfield6Utils.js +107 -269
  257. package/dist/subfield6Utils.js.map +7 -1
  258. package/dist/subfield8Utils.js +26 -50
  259. package/dist/subfield8Utils.js.map +7 -1
  260. package/dist/subfieldValueNormalizations.js +40 -74
  261. package/dist/subfieldValueNormalizations.js.map +7 -1
  262. package/dist/subfieldValueNormalizations.test.js +45 -0
  263. package/dist/subfieldValueNormalizations.test.js.map +7 -0
  264. package/dist/sync-007-and-300.js +22 -53
  265. package/dist/sync-007-and-300.js.map +7 -1
  266. package/dist/sync-007-and-300.test.js +44 -0
  267. package/dist/sync-007-and-300.test.js.map +7 -0
  268. package/dist/translate-terms.js +67 -155
  269. package/dist/translate-terms.js.map +7 -1
  270. package/dist/translate-terms.test.js +44 -0
  271. package/dist/translate-terms.test.js.map +7 -0
  272. package/dist/typeOfDate-008.js +10 -25
  273. package/dist/typeOfDate-008.js.map +7 -1
  274. package/dist/typeOfDate-008.test.js +40 -0
  275. package/dist/typeOfDate-008.test.js.map +7 -0
  276. package/dist/unicode-decomposition.js +94 -107
  277. package/dist/unicode-decomposition.js.map +7 -1
  278. package/dist/unicode-decomposition.test.js +94 -0
  279. package/dist/unicode-decomposition.test.js.map +7 -0
  280. package/dist/update-field-540.js +30 -75
  281. package/dist/update-field-540.js.map +7 -1
  282. package/dist/update-field-540.test.js +44 -0
  283. package/dist/update-field-540.test.js.map +7 -0
  284. package/dist/urn.js +55 -128
  285. package/dist/urn.js.map +7 -1
  286. package/dist/urn.test.js +44 -0
  287. package/dist/urn.test.js.map +7 -0
  288. package/dist/utils.js +72 -126
  289. package/dist/utils.js.map +7 -1
  290. package/eslint.config.mjs +1 -2
  291. package/package.json +21 -93
  292. package/src/access-rights.js +1 -1
  293. package/src/{access-rights.spec.js → access-rights.test.js} +9 -10
  294. package/src/addMissingField041.js +1 -1
  295. package/src/{addMissingField336.spec.js → addMissingField041.test.js} +13 -14
  296. package/src/addMissingField336.js +3 -3
  297. package/src/{addMissingField041.spec.js → addMissingField336.test.js} +13 -14
  298. package/src/addMissingField337.js +2 -2
  299. package/src/{addMissingField337.spec.js → addMissingField337.test.js} +13 -14
  300. package/src/addMissingField338.js +2 -2
  301. package/src/{addMissingField338.spec.js → addMissingField338.test.js} +13 -14
  302. package/src/cyrillux-usemarcon-replacement.js +18 -18
  303. package/src/cyrillux-usemarcon-replacement.test.js +55 -0
  304. package/src/cyrillux.js +19 -12
  305. package/src/{cyrillux.spec.js → cyrillux.test.js} +13 -14
  306. package/src/disambiguateSeriesStatements.js +2 -2
  307. package/src/{disambiguateSeriesStatements.spec.js → disambiguateSeriesStatements.test.js} +12 -13
  308. package/src/double-commas.js +1 -1
  309. package/src/{double-commas.spec.js → double-commas.test.js} +9 -11
  310. package/src/duplicates-ind1.js +1 -1
  311. package/src/{duplicates-ind1.spec.js → duplicates-ind1.test.js} +12 -13
  312. package/src/{empty-fields.spec.js → empty-fields.test.js} +11 -13
  313. package/src/ending-punctuation.js +1 -1
  314. package/src/{ending-punctuation.spec.js → ending-punctuation.test.js} +172 -173
  315. package/src/{ending-whitespace.spec.js → ending-whitespace.test.js} +12 -13
  316. package/src/field-008-18-34-character-groups.js +2 -2
  317. package/src/{field-008-18-34-character-groups.spec.js → field-008-18-34-character-groups.test.js} +13 -13
  318. package/src/field-505-separators.js +3 -3
  319. package/src/{field-505-separators.spec.js → field-505-separators.test.js} +16 -14
  320. package/src/field-521-fix.js +2 -2
  321. package/src/{field-521-fix.spec.js → field-521-fix.test.js} +12 -13
  322. package/src/field-exclusion.js +1 -1
  323. package/src/{field-exclusion.spec.js → field-exclusion.test.js} +60 -57
  324. package/src/{field-structure.spec.js → field-structure.test.js} +29 -29
  325. package/src/{fields-present.spec.js → fields-present.test.js} +12 -15
  326. package/src/fix-33X.js +4 -4
  327. package/src/{fix-33X.spec.js → fix-33X.test.js} +13 -14
  328. package/src/fix-country-codes.js +1 -1
  329. package/src/{fix-country-codes.spec.js → fix-country-codes.test.js} +12 -13
  330. package/src/fix-language-codes.js +5 -5
  331. package/src/{fix-language-codes.spec.js → fix-language-codes.test.js} +12 -13
  332. package/src/fixRelatorTerms.js +5 -5
  333. package/src/{fixRelatorTerms.spec.js → fixRelatorTerms.test.js} +13 -13
  334. package/src/{fixed-fields.spec.js → fixed-fields.test.js} +11 -14
  335. package/src/identical-fields.js +1 -1
  336. package/src/{identical-fields.spec.js → identical-fields.test.js} +9 -11
  337. package/src/index.js +58 -58
  338. package/src/indicator-fixes.js +3 -3
  339. package/src/{indicator-fixes.spec.js → indicator-fixes.test.js} +9 -12
  340. package/src/isbn-issn.js +1 -1
  341. package/src/{isbn-issn.spec.js → isbn-issn.test.js} +20 -22
  342. package/src/{item-language.spec.js → item-language.test.js} +21 -22
  343. package/src/merge-fields/controlSubfields.js +1 -1
  344. package/src/merge-fields/counterpartField.js +8 -9
  345. package/src/merge-fields/index.js +1 -1
  346. package/src/merge-fields/mergableIndicator.js +1 -1
  347. package/src/merge-fields/mergeField.js +6 -6
  348. package/src/merge-fields/mergeIndicator.js +1 -1
  349. package/src/merge-fields/mergeOrAddPostprocess.js +4 -4
  350. package/src/merge-fields/mergeOrAddSubfield.js +2 -2
  351. package/src/merge-fields/mergeSubfield.js +4 -4
  352. package/src/merge-fields/removeDuplicateSubfields.js +2 -2
  353. package/src/{merge-fields.spec.js → merge-fields.test.js} +12 -13
  354. package/src/{mergeField500Lisapainokset.spec.js → mergeField500Lisapainokset.test.js} +12 -13
  355. package/src/mergeRelatorTermFields.js +5 -7
  356. package/src/{mergeRelatorTermFields.spec.js → mergeRelatorTermFields.test.js} +12 -13
  357. package/src/modernize-502.js +1 -1
  358. package/src/{modernize-502.spec.js → modernize-502.test.js} +12 -13
  359. package/src/multiple-subfield-0.js +3 -3
  360. package/src/{multiple-subfield-0.spec.js → multiple-subfield-0.test.js} +13 -13
  361. package/src/{non-breaking-space.spec.js → non-breaking-space.test.js} +12 -13
  362. package/src/normalize-dashes.js +2 -2
  363. package/src/{normalize-dashes.spec.js → normalize-dashes.test.js} +12 -13
  364. package/src/normalize-identifiers.js +1 -1
  365. package/src/{normalize-identifiers.spec.js → normalize-identifiers.test.js} +12 -13
  366. package/src/normalize-qualifying-information.js +2 -2
  367. package/src/{normalize-qualifying-information.spec.js → normalize-qualifying-information.test.js} +12 -13
  368. package/src/normalize-utf8-diacritics.js +2 -2
  369. package/src/{normalize-utf8-diacritics.spec.js → normalize-utf8-diacritics.test.js} +13 -13
  370. package/src/normalizeFieldForComparison.js +6 -6
  371. package/src/normalizeSubfieldValueForComparison.js +1 -1
  372. package/src/prepublicationUtils.js +4 -4
  373. package/src/punctuation/index.js +1 -1
  374. package/src/punctuation/rules/index.js +2 -2
  375. package/src/{punctuation.spec.js → punctuation.test.js} +12 -13
  376. package/src/punctuation2.js +4 -4
  377. package/src/{punctuation2.spec.js → punctuation2.test.js} +12 -13
  378. package/src/reindexSubfield6OccurenceNumbers.js +5 -7
  379. package/src/{reindexSubfield6OccurenceNumbers.spec.js → reindexSubfield6OccurenceNumbers.test.js} +12 -13
  380. package/src/removeDuplicateDataFields.js +11 -19
  381. package/src/{removeDuplicateDataFields.spec.js → removeDuplicateDataFields.test.js} +12 -13
  382. package/src/removeInferiorDataFields.js +11 -11
  383. package/src/{removeInferiorDataFields.spec.js → removeInferiorDataFields.test.js} +13 -13
  384. package/src/resolvable-ext-references-melinda.js +1 -1
  385. package/src/{resolvable-ext-references-melinda.spec.js → resolvable-ext-references-melinda.test.js} +42 -27
  386. package/src/resolveOrphanedSubfield6s.js +5 -5
  387. package/src/{resolveOrphanedSubfield6s.spec.js → resolveOrphanedSubfield6s.test.js} +13 -13
  388. package/src/sanitize-vocabulary-source-codes.js +4 -4
  389. package/src/{sanitize-vocabulary-source-codes.spec.js → sanitize-vocabulary-source-codes.test.js} +16 -14
  390. package/src/{sort-tags.spec.js → sort-tags.test.js} +9 -11
  391. package/src/sortFields.js +4 -4
  392. package/src/{sortFields.spec.js → sortFields.test.js} +12 -13
  393. package/src/sortRelatorTerms.js +3 -3
  394. package/src/{sortRelatorTerms.spec.js → sortRelatorTerms.test.js} +13 -13
  395. package/src/sortSubfields.js +1 -1
  396. package/src/{sortSubfields.spec.js → sortSubfields.test.js} +13 -13
  397. package/src/stripPunctuation.js +3 -3
  398. package/src/{stripPunctuation.spec.js → stripPunctuation.test.js} +13 -13
  399. package/src/subfield-exclusion.js +1 -1
  400. package/src/{subfield-exclusion.spec.js → subfield-exclusion.test.js} +45 -36
  401. package/src/subfield6Utils.js +6 -10
  402. package/src/subfield8Utils.js +4 -4
  403. package/src/subfieldValueNormalizations.js +3 -3
  404. package/src/{subfieldValueNormalizations.spec.js → subfieldValueNormalizations.test.js} +18 -14
  405. package/src/sync-007-and-300.js +2 -2
  406. package/src/{sync-007-and-300.spec.js → sync-007-and-300.test.js} +13 -13
  407. package/src/translate-terms.js +3 -3
  408. package/src/{translate-terms.spec.js → translate-terms.test.js} +13 -13
  409. package/src/{typeOfDate-008.spec.js → typeOfDate-008.test.js} +12 -13
  410. package/src/{unicode-decomposition.spec.js → unicode-decomposition.test.js} +10 -16
  411. package/src/update-field-540.js +2 -2
  412. package/src/{update-field-540.spec.js → update-field-540.test.js} +13 -10
  413. package/src/urn.js +2 -2
  414. package/src/{urn.spec.js → urn.test.js} +12 -13
  415. package/src/utils.js +3 -3
  416. package/test-fixtures/field-505-separators/03/expectedResult.json +3 -1
  417. package/test-fixtures/field-505-separators/03/record.json +3 -0
  418. package/test-fixtures/normalize-subfield-value/01/metadata.json +4 -1
  419. package/test-fixtures/normalize-subfield-value/01/record.json +3 -0
  420. package/test-fixtures/normalize-subfield-value/02/expectedResult.json +3 -1
  421. package/test-fixtures/normalize-subfield-value/02/metadata.json +2 -1
  422. package/test-fixtures/normalize-subfield-value/02/record.json +3 -0
  423. package/test-fixtures/sanitize-vocabulary-source-codes/f03/expectedResult.json +3 -1
  424. package/test-fixtures/sanitize-vocabulary-source-codes/f04/expectedResult.json +3 -1
  425. package/test-fixtures/sanitize-vocabulary-source-codes/v04/metadata.json +1 -4
  426. package/test-fixtures/sanitize-vocabulary-source-codes/v04/record.json +1 -1
  427. package/dist/access-rights.spec.js +0 -195
  428. package/dist/access-rights.spec.js.map +0 -1
  429. package/dist/addMissingField041.spec.js +0 -45
  430. package/dist/addMissingField041.spec.js.map +0 -1
  431. package/dist/addMissingField336.spec.js +0 -45
  432. package/dist/addMissingField336.spec.js.map +0 -1
  433. package/dist/addMissingField337.spec.js +0 -43
  434. package/dist/addMissingField337.spec.js.map +0 -1
  435. package/dist/addMissingField338.spec.js +0 -45
  436. package/dist/addMissingField338.spec.js.map +0 -1
  437. package/dist/cyrillux-usemarcon-replacement.spec.js +0 -45
  438. package/dist/cyrillux-usemarcon-replacement.spec.js.map +0 -1
  439. package/dist/cyrillux.spec.js +0 -46
  440. package/dist/cyrillux.spec.js.map +0 -1
  441. package/dist/disambiguateSeriesStatements.spec.js +0 -51
  442. package/dist/disambiguateSeriesStatements.spec.js.map +0 -1
  443. package/dist/double-commas.spec.js +0 -73
  444. package/dist/double-commas.spec.js.map +0 -1
  445. package/dist/duplicates-ind1.spec.js +0 -45
  446. package/dist/duplicates-ind1.spec.js.map +0 -1
  447. package/dist/empty-fields.spec.js +0 -118
  448. package/dist/empty-fields.spec.js.map +0 -1
  449. package/dist/ending-punctuation.spec.js +0 -2654
  450. package/dist/ending-punctuation.spec.js.map +0 -1
  451. package/dist/ending-whitespace.spec.js +0 -42
  452. package/dist/ending-whitespace.spec.js.map +0 -1
  453. package/dist/field-008-18-34-character-groups.spec.js +0 -51
  454. package/dist/field-008-18-34-character-groups.spec.js.map +0 -1
  455. package/dist/field-505-separators.spec.js +0 -51
  456. package/dist/field-505-separators.spec.js.map +0 -1
  457. package/dist/field-521-fix.spec.js +0 -51
  458. package/dist/field-521-fix.spec.js.map +0 -1
  459. package/dist/field-exclusion.spec.js +0 -1054
  460. package/dist/field-exclusion.spec.js.map +0 -1
  461. package/dist/field-structure.spec.js +0 -535
  462. package/dist/field-structure.spec.js.map +0 -1
  463. package/dist/fields-present.spec.js +0 -121
  464. package/dist/fields-present.spec.js.map +0 -1
  465. package/dist/fix-33X.spec.js +0 -45
  466. package/dist/fix-33X.spec.js.map +0 -1
  467. package/dist/fix-country-codes.spec.js +0 -51
  468. package/dist/fix-country-codes.spec.js.map +0 -1
  469. package/dist/fix-language-codes.spec.js +0 -44
  470. package/dist/fix-language-codes.spec.js.map +0 -1
  471. package/dist/fixRelatorTerms.spec.js +0 -51
  472. package/dist/fixRelatorTerms.spec.js.map +0 -1
  473. package/dist/fixed-fields.spec.js +0 -140
  474. package/dist/fixed-fields.spec.js.map +0 -1
  475. package/dist/identical-fields.spec.js +0 -99
  476. package/dist/identical-fields.spec.js.map +0 -1
  477. package/dist/indicator-fixes.spec.js +0 -51
  478. package/dist/indicator-fixes.spec.js.map +0 -1
  479. package/dist/isbn-issn.spec.js +0 -595
  480. package/dist/isbn-issn.spec.js.map +0 -1
  481. package/dist/item-language.spec.js +0 -306
  482. package/dist/item-language.spec.js.map +0 -1
  483. package/dist/melindaCustomMergeFields.json +0 -5120
  484. package/dist/merge-fields.spec.js +0 -51
  485. package/dist/merge-fields.spec.js.map +0 -1
  486. package/dist/mergeField500Lisapainokset.spec.js +0 -51
  487. package/dist/mergeField500Lisapainokset.spec.js.map +0 -1
  488. package/dist/mergeRelatorTermFields.spec.js +0 -51
  489. package/dist/mergeRelatorTermFields.spec.js.map +0 -1
  490. package/dist/modernize-502.spec.js +0 -49
  491. package/dist/modernize-502.spec.js.map +0 -1
  492. package/dist/multiple-subfield-0.spec.js +0 -51
  493. package/dist/multiple-subfield-0.spec.js.map +0 -1
  494. package/dist/non-breaking-space.spec.js +0 -42
  495. package/dist/non-breaking-space.spec.js.map +0 -1
  496. package/dist/normalize-dashes.spec.js +0 -51
  497. package/dist/normalize-dashes.spec.js.map +0 -1
  498. package/dist/normalize-identifiers.spec.js +0 -51
  499. package/dist/normalize-identifiers.spec.js.map +0 -1
  500. package/dist/normalize-qualifying-information.spec.js +0 -51
  501. package/dist/normalize-qualifying-information.spec.js.map +0 -1
  502. package/dist/normalize-utf8-diacritics.spec.js +0 -51
  503. package/dist/normalize-utf8-diacritics.spec.js.map +0 -1
  504. package/dist/punctuation.spec.js +0 -51
  505. package/dist/punctuation.spec.js.map +0 -1
  506. package/dist/punctuation2.spec.js +0 -51
  507. package/dist/punctuation2.spec.js.map +0 -1
  508. package/dist/reindexSubfield6OccurenceNumbers.spec.js +0 -51
  509. package/dist/reindexSubfield6OccurenceNumbers.spec.js.map +0 -1
  510. package/dist/removeDuplicateDataFields.spec.js +0 -51
  511. package/dist/removeDuplicateDataFields.spec.js.map +0 -1
  512. package/dist/removeInferiorDataFields.spec.js +0 -51
  513. package/dist/removeInferiorDataFields.spec.js.map +0 -1
  514. package/dist/resolvable-ext-references-melinda.spec.js +0 -166
  515. package/dist/resolvable-ext-references-melinda.spec.js.map +0 -1
  516. package/dist/resolveOrphanedSubfield6s.spec.js +0 -51
  517. package/dist/resolveOrphanedSubfield6s.spec.js.map +0 -1
  518. package/dist/sanitize-vocabulary-source-codes.spec.js +0 -51
  519. package/dist/sanitize-vocabulary-source-codes.spec.js.map +0 -1
  520. package/dist/sort-tags.spec.js +0 -207
  521. package/dist/sort-tags.spec.js.map +0 -1
  522. package/dist/sortFields.spec.js +0 -51
  523. package/dist/sortFields.spec.js.map +0 -1
  524. package/dist/sortRelatorTerms.spec.js +0 -51
  525. package/dist/sortRelatorTerms.spec.js.map +0 -1
  526. package/dist/sortSubfields.spec.js +0 -52
  527. package/dist/sortSubfields.spec.js.map +0 -1
  528. package/dist/stripPunctuation.spec.js +0 -51
  529. package/dist/stripPunctuation.spec.js.map +0 -1
  530. package/dist/subfield-exclusion.spec.js +0 -523
  531. package/dist/subfield-exclusion.spec.js.map +0 -1
  532. package/dist/subfieldValueNormalizations.spec.js +0 -51
  533. package/dist/subfieldValueNormalizations.spec.js.map +0 -1
  534. package/dist/sync-007-and-300.spec.js +0 -51
  535. package/dist/sync-007-and-300.spec.js.map +0 -1
  536. package/dist/translate-terms.spec.js +0 -51
  537. package/dist/translate-terms.spec.js.map +0 -1
  538. package/dist/typeOfDate-008.spec.js +0 -47
  539. package/dist/typeOfDate-008.spec.js.map +0 -1
  540. package/dist/unicode-decomposition.spec.js +0 -91
  541. package/dist/unicode-decomposition.spec.js.map +0 -1
  542. package/dist/update-field-540.spec.js +0 -51
  543. package/dist/update-field-540.spec.js.map +0 -1
  544. package/dist/urn.spec.js +0 -52
  545. package/dist/urn.spec.js.map +0 -1
  546. package/src/cyrillux-usemarcon-replacement.spec.js +0 -47
@@ -0,0 +1,587 @@
1
+ import assert from "node:assert";
2
+ import { describe, it } from "node:test";
3
+ import { MarcRecord } from "@natlibfi/marc-record";
4
+ import validatorFactory from "../src/field-structure.js";
5
+ describe("field-structure", () => {
6
+ it("Creates a validator", async () => {
7
+ const config = [
8
+ {
9
+ tag: /^035$/u,
10
+ ind1: /^0$/u,
11
+ ind2: /^1$/u
12
+ },
13
+ {
14
+ tag: /^100$/u,
15
+ subfields: {
16
+ a: { maxOccurrence: 1 }
17
+ }
18
+ }
19
+ ];
20
+ const validator = await validatorFactory(config);
21
+ assert.equal(typeof validator, "object");
22
+ assert.equal(typeof validator.description, "string");
23
+ assert.equal(typeof validator.validate, "function");
24
+ });
25
+ describe("#configuration", () => {
26
+ it("Throws an error when config array not provided", () => {
27
+ try {
28
+ validatorFactory();
29
+ } catch (error) {
30
+ assert.equal(error instanceof Error, true);
31
+ assert.equal(error.message, "Configuration array not provided");
32
+ }
33
+ });
34
+ it("Throws an error when config array has unidentified field", () => {
35
+ const config = [
36
+ {
37
+ leader: /^035$/u,
38
+ tags: /^035$/u
39
+ }
40
+ ];
41
+ try {
42
+ validatorFactory(config);
43
+ } catch (error) {
44
+ assert.equal(error instanceof Error, true);
45
+ assert.equal(error.message, "Configuration not valid - unidentified value: tags");
46
+ }
47
+ });
48
+ it("Throws an error when config array has field with incorrect data type", () => {
49
+ const config = [
50
+ {
51
+ leader: /^035$/u,
52
+ tag: 35
53
+ }
54
+ ];
55
+ try {
56
+ validatorFactory(config);
57
+ } catch (error) {
58
+ assert.equal(error instanceof Error, true);
59
+ assert.equal(error.message, "Configuration not valid - invalid data type for: tag");
60
+ }
61
+ });
62
+ it("Throws an error when config array has excluded element", () => {
63
+ const config = [
64
+ {
65
+ leader: /^035$/u,
66
+ tag: /^035$/u
67
+ }
68
+ ];
69
+ try {
70
+ validatorFactory(config);
71
+ } catch (error) {
72
+ assert.equal(error instanceof Error, true);
73
+ assert.equal(error.message, "Configuration not valid - excluded element");
74
+ }
75
+ });
76
+ it("Throws an error when config subfields not object", () => {
77
+ const config = [
78
+ {
79
+ tag: /^001$/u,
80
+ valuePattern: /\d+/u
81
+ },
82
+ {
83
+ tag: /^245$/u,
84
+ strict: true,
85
+ subfields: "This should be Object"
86
+ }
87
+ ];
88
+ try {
89
+ validatorFactory(config);
90
+ } catch (error) {
91
+ assert.equal(error instanceof Error, true);
92
+ assert.equal(error.message, "Configuration not valid - subfields not object");
93
+ }
94
+ });
95
+ });
96
+ it("Should find the record valid because no fields match the config", async () => {
97
+ const config = [
98
+ {
99
+ tag: /^FOO$/u,
100
+ valuePattern: /bar/u
101
+ }
102
+ ];
103
+ const record = new MarcRecord({
104
+ leader: "",
105
+ fields: [
106
+ {
107
+ tag: "001",
108
+ value: "123456"
109
+ }
110
+ ]
111
+ });
112
+ const validator = await validatorFactory(config);
113
+ const result = await validator.validate(record);
114
+ assert.deepEqual(result, { valid: true });
115
+ });
116
+ describe("#validate: Indicators and subfields", () => {
117
+ const config = [
118
+ {
119
+ tag: /^035$/u,
120
+ ind1: /^0$/u,
121
+ ind2: /^1$/u
122
+ },
123
+ {
124
+ tag: /^100$/u,
125
+ subfields: {
126
+ a: { maxOccurrence: 1 }
127
+ }
128
+ }
129
+ ];
130
+ const recordValid = new MarcRecord({
131
+ leader: "",
132
+ fields: [
133
+ {
134
+ tag: "001",
135
+ value: "123456"
136
+ },
137
+ {
138
+ tag: "035",
139
+ ind1: "0",
140
+ ind2: "1",
141
+ subfields: [
142
+ {
143
+ code: "a",
144
+ value: "foo"
145
+ }
146
+ ]
147
+ },
148
+ {
149
+ tag: "100",
150
+ ind1: " ",
151
+ ind2: " ",
152
+ subfields: [
153
+ {
154
+ code: "a",
155
+ value: "bar"
156
+ },
157
+ {
158
+ code: "b",
159
+ value: "fubar"
160
+ }
161
+ ]
162
+ }
163
+ ]
164
+ });
165
+ const recordInvalidMany = new MarcRecord({
166
+ leader: "",
167
+ fields: [
168
+ {
169
+ tag: "001",
170
+ value: "123456"
171
+ },
172
+ {
173
+ tag: "035",
174
+ ind1: "1",
175
+ ind2: "1",
176
+ subfields: [
177
+ {
178
+ code: "a",
179
+ value: "foo"
180
+ }
181
+ ]
182
+ },
183
+ {
184
+ tag: "100",
185
+ ind1: " ",
186
+ ind2: " ",
187
+ subfields: [
188
+ {
189
+ code: "a",
190
+ value: "bar"
191
+ },
192
+ {
193
+ code: "b",
194
+ value: "fubar"
195
+ },
196
+ {
197
+ code: "a",
198
+ value: "barfoo"
199
+ }
200
+ ]
201
+ }
202
+ ]
203
+ });
204
+ it("Finds the record valid", async () => {
205
+ const validator = await validatorFactory(config);
206
+ const result = await validator.validate(recordValid);
207
+ assert.deepEqual(result, { valid: true });
208
+ });
209
+ it("Finds the record invalid: Too many subfields", async () => {
210
+ const validator = await validatorFactory(config);
211
+ const result = await validator.validate(recordInvalidMany);
212
+ assert.deepEqual(result, { valid: false });
213
+ });
214
+ });
215
+ describe("#validate: Patterns and mandatory & strict subfields", () => {
216
+ const config = [
217
+ {
218
+ tag: /^001$/u,
219
+ valuePattern: /\d+/u
220
+ },
221
+ {
222
+ tag: /^245$/u,
223
+ strict: true,
224
+ subfields: {
225
+ a: { required: true, maxOccurrence: 1, pattern: /\w+/u },
226
+ b: { maxOccurrence: 1, pattern: /\w+/u }
227
+ }
228
+ }
229
+ ];
230
+ const recordValid = new MarcRecord({
231
+ leader: "",
232
+ fields: [
233
+ {
234
+ tag: "001",
235
+ value: "123456"
236
+ },
237
+ {
238
+ tag: "100",
239
+ ind1: " ",
240
+ ind2: " ",
241
+ subfields: [
242
+ {
243
+ code: "a",
244
+ value: "bar"
245
+ }
246
+ ]
247
+ },
248
+ {
249
+ tag: "245",
250
+ ind1: " ",
251
+ ind2: " ",
252
+ subfields: [
253
+ {
254
+ code: "a",
255
+ value: "foo"
256
+ },
257
+ {
258
+ code: "b",
259
+ value: "bar"
260
+ }
261
+ ]
262
+ }
263
+ ]
264
+ });
265
+ const recordInvalidExtra = new MarcRecord({
266
+ leader: "",
267
+ fields: [
268
+ {
269
+ tag: "001",
270
+ value: "123456a"
271
+ },
272
+ {
273
+ tag: "100",
274
+ ind1: " ",
275
+ ind2: " ",
276
+ subfields: [
277
+ {
278
+ code: "a",
279
+ value: "bar"
280
+ }
281
+ ]
282
+ },
283
+ {
284
+ tag: "245",
285
+ ind1: " ",
286
+ ind2: " ",
287
+ subfields: [
288
+ {
289
+ code: "a",
290
+ value: "foo"
291
+ },
292
+ {
293
+ code: "b",
294
+ value: "bar"
295
+ },
296
+ {
297
+ code: "c",
298
+ value: "fubar"
299
+ }
300
+ ]
301
+ }
302
+ ]
303
+ });
304
+ const recordInvalidTooMany = new MarcRecord({
305
+ leader: "",
306
+ fields: [
307
+ {
308
+ tag: "001",
309
+ value: "123456a"
310
+ },
311
+ {
312
+ tag: "100",
313
+ ind1: " ",
314
+ ind2: " ",
315
+ subfields: [
316
+ {
317
+ code: "a",
318
+ value: "bar"
319
+ }
320
+ ]
321
+ },
322
+ {
323
+ tag: "245",
324
+ ind1: " ",
325
+ ind2: " ",
326
+ subfields: [
327
+ {
328
+ code: "a",
329
+ value: "foo"
330
+ },
331
+ {
332
+ code: "b",
333
+ value: "bar"
334
+ },
335
+ {
336
+ code: "a",
337
+ value: "fubar"
338
+ }
339
+ ]
340
+ }
341
+ ]
342
+ });
343
+ const recordInvalidRegExp = new MarcRecord({
344
+ leader: "",
345
+ fields: [
346
+ {
347
+ tag: "001",
348
+ value: "123456a"
349
+ },
350
+ {
351
+ tag: "100",
352
+ ind1: " ",
353
+ ind2: " ",
354
+ subfields: [
355
+ {
356
+ code: "a",
357
+ value: "bar"
358
+ }
359
+ ]
360
+ },
361
+ {
362
+ tag: "245",
363
+ ind1: " ",
364
+ ind2: " ",
365
+ subfields: [
366
+ {
367
+ code: "a",
368
+ value: "\xE4\xE4"
369
+ },
370
+ {
371
+ code: "b",
372
+ value: "bar"
373
+ }
374
+ ]
375
+ }
376
+ ]
377
+ });
378
+ const recordInvalidMissing = new MarcRecord({
379
+ leader: "",
380
+ fields: [
381
+ {
382
+ tag: "100",
383
+ ind1: " ",
384
+ ind2: " ",
385
+ subfields: [
386
+ {
387
+ code: "a",
388
+ value: "bar"
389
+ }
390
+ ]
391
+ },
392
+ {
393
+ tag: "245",
394
+ ind1: " ",
395
+ ind2: " ",
396
+ subfields: [
397
+ {
398
+ code: "a",
399
+ value: "\xE4\xE4"
400
+ },
401
+ {
402
+ code: "b",
403
+ value: "bar"
404
+ }
405
+ ]
406
+ }
407
+ ]
408
+ });
409
+ const recordInvalidMissingSubfield = new MarcRecord({
410
+ leader: "",
411
+ fields: [
412
+ {
413
+ tag: "001",
414
+ value: "123456"
415
+ },
416
+ {
417
+ tag: "100",
418
+ ind1: " ",
419
+ ind2: " ",
420
+ subfields: [
421
+ {
422
+ code: "a",
423
+ value: "bar"
424
+ }
425
+ ]
426
+ },
427
+ {
428
+ tag: "245",
429
+ ind1: " ",
430
+ ind2: " ",
431
+ subfields: [
432
+ {
433
+ code: "b",
434
+ value: "bar"
435
+ }
436
+ ]
437
+ }
438
+ ]
439
+ });
440
+ it("Finds the record valid", async () => {
441
+ const validator = await validatorFactory(config);
442
+ const result = await validator.validate(recordValid);
443
+ assert.deepEqual(result, { valid: true });
444
+ });
445
+ it("Finds the record invalid: Extra field in strict", async () => {
446
+ const validator = await validatorFactory(config);
447
+ const result = await validator.validate(recordInvalidExtra);
448
+ assert.deepEqual(result, { valid: false });
449
+ });
450
+ it("Finds the record invalid: Too many occurances", async () => {
451
+ const validator = await validatorFactory(config);
452
+ const result = await validator.validate(recordInvalidTooMany);
453
+ assert.deepEqual(result, { valid: false });
454
+ });
455
+ it("Finds the record invalid: Invalid RegExp", async () => {
456
+ const validator = await validatorFactory(config);
457
+ const result = await validator.validate(recordInvalidRegExp);
458
+ assert.deepEqual(result, { valid: false });
459
+ });
460
+ it("Finds the record invalid: Missing field", async () => {
461
+ const validator = await validatorFactory(config);
462
+ const result = await validator.validate(recordInvalidMissing);
463
+ assert.deepEqual(result, { valid: false });
464
+ });
465
+ it("Finds the record invalid: Missing subfield", async () => {
466
+ const validator = await validatorFactory(config);
467
+ const result = await validator.validate(recordInvalidMissingSubfield);
468
+ assert.deepEqual(result, { valid: false });
469
+ });
470
+ });
471
+ describe("#validate: Dependencies", () => {
472
+ const config = [
473
+ {
474
+ leader: /^.{6}s/u,
475
+ dependencies: [
476
+ {
477
+ tag: /^773$/u,
478
+ subfields: { 7: /^nnas$/u }
479
+ }
480
+ ]
481
+ }
482
+ ];
483
+ const recordValid = new MarcRecord({
484
+ leader: "63ab75sfoo122myhgh",
485
+ fields: [
486
+ {
487
+ tag: "001",
488
+ value: "123456"
489
+ },
490
+ {
491
+ tag: "245",
492
+ ind1: " ",
493
+ ind2: " ",
494
+ subfields: [
495
+ {
496
+ code: "a",
497
+ value: "foo"
498
+ }
499
+ ]
500
+ },
501
+ {
502
+ tag: "773",
503
+ ind1: " ",
504
+ ind2: " ",
505
+ subfields: [
506
+ {
507
+ code: "7",
508
+ value: "nnas"
509
+ },
510
+ {
511
+ code: "w",
512
+ value: "789101112"
513
+ }
514
+ ]
515
+ }
516
+ ]
517
+ });
518
+ const recordInvalid = new MarcRecord({
519
+ leader: "63ab75afoo122myhgh",
520
+ fields: [
521
+ {
522
+ tag: "001",
523
+ value: "123456"
524
+ },
525
+ {
526
+ tag: "245",
527
+ ind1: " ",
528
+ ind2: " ",
529
+ subfields: [
530
+ {
531
+ code: "a",
532
+ value: "foo"
533
+ }
534
+ ]
535
+ },
536
+ {
537
+ tag: "773",
538
+ ind1: " ",
539
+ ind2: " ",
540
+ subfields: [
541
+ {
542
+ code: "7",
543
+ value: "nnas"
544
+ },
545
+ {
546
+ code: "w",
547
+ value: "789101112"
548
+ }
549
+ ]
550
+ }
551
+ ]
552
+ });
553
+ it("Finds the record valid", async () => {
554
+ const validator = await validatorFactory(config);
555
+ const result = await validator.validate(recordValid);
556
+ assert.deepEqual(result, { valid: true });
557
+ });
558
+ it("Finds the record invalid", async () => {
559
+ const validator = await validatorFactory(config);
560
+ const result = await validator.validate(recordInvalid);
561
+ assert.deepEqual(result, { valid: false });
562
+ });
563
+ it("Find the record valid (Dependency on leader)", async () => {
564
+ const validator = await validatorFactory([{ tag: /^007$/u, dependencies: [{ leader: /^.{6}[at]/u }] }]);
565
+ const result = await validator.validate(new MarcRecord({
566
+ leader: "00000ccm^a22003372i^4500",
567
+ fields: [
568
+ { tag: "001", value: "123456" },
569
+ { tag: "245", value: "foobar" }
570
+ ]
571
+ }));
572
+ assert.deepEqual(result, { valid: true });
573
+ });
574
+ it("Find the record invalid (Dependency on leader)", async () => {
575
+ const validator = await validatorFactory([{ tag: /^007$/u, dependencies: [{ leader: /^.{6}[at]/u }] }]);
576
+ const result = await validator.validate(new MarcRecord({
577
+ leader: "00000cam^a22003372i^4500",
578
+ fields: [
579
+ { tag: "001", value: "123456" },
580
+ { tag: "245", value: "foobar" }
581
+ ]
582
+ }));
583
+ assert.deepEqual(result, { valid: false });
584
+ });
585
+ });
586
+ });
587
+ //# sourceMappingURL=field-structure.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/field-structure.test.js"],
4
+ "sourcesContent": ["import assert from 'node:assert';\nimport {describe, it} from 'node:test';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from '../src/field-structure.js';\n\n\n// Factory validation\ndescribe('field-structure', () => {\n it('Creates a validator', async () => {\n const config = [\n {\n tag: /^035$/u,\n ind1: /^0$/u,\n ind2: /^1$/u\n }, {\n tag: /^100$/u,\n subfields: {\n a: {maxOccurrence: 1}\n }\n }\n ];\n\n const validator = await validatorFactory(config);\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('#configuration', () => {\n it('Throws an error when config array not provided', () => {\n try {\n validatorFactory();\n } catch (error) {\n assert.equal(error instanceof Error, true);\n assert.equal(error.message, 'Configuration array not provided');\n }\n });\n\n it('Throws an error when config array has unidentified field', () => {\n const config = [\n {\n leader: /^035$/u,\n tags: /^035$/u\n }\n ];\n\n try {\n validatorFactory(config);\n } catch (error) {\n assert.equal(error instanceof Error, true);\n assert.equal(error.message, 'Configuration not valid - unidentified value: tags');\n }\n });\n\n it('Throws an error when config array has field with incorrect data type', () => {\n const config = [\n {\n leader: /^035$/u,\n tag: 35\n }\n ];\n\n try {\n validatorFactory(config);\n } catch (error) {\n assert.equal(error instanceof Error, true);\n assert.equal(error.message, 'Configuration not valid - invalid data type for: tag');\n }\n });\n\n it('Throws an error when config array has excluded element', () => {\n const config = [\n {\n leader: /^035$/u,\n tag: /^035$/u\n }\n ];\n\n try {\n validatorFactory(config);\n } catch (error) {\n assert.equal(error instanceof Error, true);\n assert.equal(error.message, 'Configuration not valid - excluded element');\n }\n });\n\n it('Throws an error when config subfields not object', () => {\n const config = [\n {\n tag: /^001$/u,\n valuePattern: /\\d+/u\n }, {\n tag: /^245$/u,\n strict: true,\n subfields: 'This should be Object'\n }\n ];\n\n try {\n validatorFactory(config);\n } catch (error) {\n assert.equal(error instanceof Error, true);\n assert.equal(error.message, 'Configuration not valid - subfields not object');\n }\n });\n });\n\n it('Should find the record valid because no fields match the config', async () => {\n const config = [\n {\n tag: /^FOO$/u,\n valuePattern: /bar/u\n }\n ];\n\n const record = new MarcRecord({\n leader: '',\n fields: [\n {\n tag: '001',\n value: '123456'\n }\n ]\n });\n\n const validator = await validatorFactory(config);\n const result = await validator.validate(record);\n\n assert.deepEqual(result, {valid: true});\n });\n\n // Indicators and subfields validation\n describe('#validate: Indicators and subfields', () => {\n const config = [\n {\n tag: /^035$/u,\n ind1: /^0$/u,\n ind2: /^1$/u\n }, {\n tag: /^100$/u,\n subfields: {\n a: {maxOccurrence: 1}\n }\n }\n ];\n\n const recordValid = new MarcRecord({\n leader: '',\n fields: [\n {\n tag: '001',\n value: '123456'\n }, {\n tag: '035',\n ind1: '0',\n ind2: '1',\n subfields: [\n {\n code: 'a',\n value: 'foo'\n }\n ]\n }, {\n tag: '100',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'bar'\n }, {\n code: 'b',\n value: 'fubar'\n }\n ]\n }\n ]\n });\n\n const recordInvalidMany = new MarcRecord({\n leader: '',\n fields: [\n {\n tag: '001',\n value: '123456'\n }, {\n tag: '035',\n ind1: '1',\n ind2: '1',\n subfields: [\n {\n code: 'a',\n value: 'foo'\n }\n ]\n }, {\n tag: '100',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'bar'\n }, {\n code: 'b',\n value: 'fubar'\n }, {\n code: 'a',\n value: 'barfoo'\n }\n ]\n }\n ]\n });\n\n it('Finds the record valid', async () => {\n const validator = await validatorFactory(config);\n const result = await validator.validate(recordValid);\n\n assert.deepEqual(result, {valid: true});\n });\n\n it('Finds the record invalid: Too many subfields', async () => {\n const validator = await validatorFactory(config);\n const result = await validator.validate(recordInvalidMany);\n\n assert.deepEqual(result, {valid: false});\n });\n });\n\n // Patterns and mandatory & strict subfields\n describe('#validate: Patterns and mandatory & strict subfields', () => {\n const config = [\n {\n tag: /^001$/u,\n valuePattern: /\\d+/u\n }, {\n tag: /^245$/u,\n strict: true,\n subfields: {\n a: {required: true, maxOccurrence: 1, pattern: /\\w+/u},\n b: {maxOccurrence: 1, pattern: /\\w+/u}\n }\n }\n ];\n\n const recordValid = new MarcRecord({\n leader: '',\n fields: [\n {\n tag: '001',\n value: '123456'\n }, {\n tag: '100',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'bar'\n }\n ]\n }, {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'foo'\n }, {\n code: 'b',\n value: 'bar'\n }\n ]\n }\n ]\n });\n\n const recordInvalidExtra = new MarcRecord({\n leader: '',\n fields: [\n {\n tag: '001',\n value: '123456a'\n }, {\n tag: '100',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'bar'\n }\n ]\n }, {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'foo'\n }, {\n code: 'b',\n value: 'bar'\n }, {\n code: 'c',\n value: 'fubar'\n }\n ]\n }\n ]\n });\n\n const recordInvalidTooMany = new MarcRecord({\n leader: '',\n fields: [\n {\n tag: '001',\n value: '123456a'\n }, {\n tag: '100',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'bar'\n }\n ]\n }, {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'foo'\n }, {\n code: 'b',\n value: 'bar'\n }, {\n code: 'a',\n value: 'fubar'\n }\n ]\n }\n ]\n });\n\n const recordInvalidRegExp = new MarcRecord({\n leader: '',\n fields: [\n {\n tag: '001',\n value: '123456a'\n }, {\n tag: '100',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'bar'\n }\n ]\n }, {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: '\u00E4\u00E4'\n }, {\n code: 'b',\n value: 'bar'\n }\n ]\n }\n ]\n });\n\n const recordInvalidMissing = new MarcRecord({\n leader: '',\n fields: [\n {\n tag: '100',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'bar'\n }\n ]\n }, {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: '\u00E4\u00E4'\n }, {\n code: 'b',\n value: 'bar'\n }\n ]\n }\n ]\n });\n\n const recordInvalidMissingSubfield = new MarcRecord({\n leader: '',\n fields: [\n {\n tag: '001',\n value: '123456'\n }, {\n tag: '100',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'bar'\n }\n ]\n }, {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'b',\n value: 'bar'\n }\n ]\n }\n ]\n });\n\n it('Finds the record valid', async () => {\n const validator = await validatorFactory(config);\n const result = await validator.validate(recordValid);\n\n assert.deepEqual(result, {valid: true});\n });\n\n it('Finds the record invalid: Extra field in strict', async () => {\n const validator = await validatorFactory(config);\n const result = await validator.validate(recordInvalidExtra);\n\n assert.deepEqual(result, {valid: false});\n });\n\n it('Finds the record invalid: Too many occurances', async () => {\n const validator = await validatorFactory(config);\n const result = await validator.validate(recordInvalidTooMany);\n\n assert.deepEqual(result, {valid: false});\n });\n\n it('Finds the record invalid: Invalid RegExp', async () => {\n const validator = await validatorFactory(config);\n const result = await validator.validate(recordInvalidRegExp);\n\n assert.deepEqual(result, {valid: false});\n });\n\n it('Finds the record invalid: Missing field', async () => {\n const validator = await validatorFactory(config);\n const result = await validator.validate(recordInvalidMissing);\n\n assert.deepEqual(result, {valid: false});\n });\n it('Finds the record invalid: Missing subfield', async () => {\n const validator = await validatorFactory(config);\n const result = await validator.validate(recordInvalidMissingSubfield);\n\n assert.deepEqual(result, {valid: false});\n });\n });\n\n // Dependencies\n describe('#validate: Dependencies', () => {\n const config = [\n {\n leader: /^.{6}s/u,\n dependencies: [\n {\n tag: /^773$/u,\n subfields: {7: /^nnas$/u}\n }\n ]\n }\n ];\n\n const recordValid = new MarcRecord({\n leader: '63ab75sfoo122myhgh',\n fields: [\n {\n tag: '001',\n value: '123456'\n }, {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'foo'\n }\n ]\n }, {\n tag: '773',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: '7',\n value: 'nnas'\n }, {\n code: 'w',\n value: '789101112'\n }\n ]\n }\n ]\n });\n\n const recordInvalid = new MarcRecord({\n leader: '63ab75afoo122myhgh',\n fields: [\n {\n tag: '001',\n value: '123456'\n }, {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'foo'\n }\n ]\n }, {\n tag: '773',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: '7',\n value: 'nnas'\n }, {\n code: 'w',\n value: '789101112'\n }\n ]\n }\n ]\n });\n\n it('Finds the record valid', async () => {\n const validator = await validatorFactory(config);\n const result = await validator.validate(recordValid);\n\n assert.deepEqual(result, {valid: true});\n });\n\n it('Finds the record invalid', async () => {\n const validator = await validatorFactory(config);\n const result = await validator.validate(recordInvalid);\n\n assert.deepEqual(result, {valid: false});\n });\n\n it('Find the record valid (Dependency on leader)', async () => {\n const validator = await validatorFactory([{tag: /^007$/u, dependencies: [{leader: /^.{6}[at]/u}]}]);\n const result = await validator.validate(new MarcRecord({\n leader: '00000ccm^a22003372i^4500',\n fields: [\n {tag: '001', value: '123456'},\n {tag: '245', value: 'foobar'}\n ]\n }));\n\n assert.deepEqual(result, {valid: true});\n });\n\n it('Find the record invalid (Dependency on leader)', async () => {\n const validator = await validatorFactory([{tag: /^007$/u, dependencies: [{leader: /^.{6}[at]/u}]}]);\n const result = await validator.validate(new MarcRecord({\n leader: '00000cam^a22003372i^4500',\n fields: [\n {tag: '001', value: '123456'},\n {tag: '245', value: 'foobar'}\n ]\n }));\n\n assert.deepEqual(result, {valid: false});\n });\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }