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

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 (545) 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/indicator-fixes.js +3 -3
  338. package/src/{indicator-fixes.spec.js → indicator-fixes.test.js} +9 -12
  339. package/src/isbn-issn.js +1 -1
  340. package/src/{isbn-issn.spec.js → isbn-issn.test.js} +20 -22
  341. package/src/{item-language.spec.js → item-language.test.js} +21 -22
  342. package/src/merge-fields/controlSubfields.js +1 -1
  343. package/src/merge-fields/counterpartField.js +8 -9
  344. package/src/merge-fields/index.js +1 -1
  345. package/src/merge-fields/mergableIndicator.js +1 -1
  346. package/src/merge-fields/mergeField.js +6 -6
  347. package/src/merge-fields/mergeIndicator.js +1 -1
  348. package/src/merge-fields/mergeOrAddPostprocess.js +4 -4
  349. package/src/merge-fields/mergeOrAddSubfield.js +2 -2
  350. package/src/merge-fields/mergeSubfield.js +4 -4
  351. package/src/merge-fields/removeDuplicateSubfields.js +2 -2
  352. package/src/{merge-fields.spec.js → merge-fields.test.js} +12 -13
  353. package/src/{mergeField500Lisapainokset.spec.js → mergeField500Lisapainokset.test.js} +12 -13
  354. package/src/mergeRelatorTermFields.js +5 -7
  355. package/src/{mergeRelatorTermFields.spec.js → mergeRelatorTermFields.test.js} +12 -13
  356. package/src/modernize-502.js +1 -1
  357. package/src/{modernize-502.spec.js → modernize-502.test.js} +12 -13
  358. package/src/multiple-subfield-0.js +3 -3
  359. package/src/{multiple-subfield-0.spec.js → multiple-subfield-0.test.js} +13 -13
  360. package/src/{non-breaking-space.spec.js → non-breaking-space.test.js} +12 -13
  361. package/src/normalize-dashes.js +2 -2
  362. package/src/{normalize-dashes.spec.js → normalize-dashes.test.js} +12 -13
  363. package/src/normalize-identifiers.js +1 -1
  364. package/src/{normalize-identifiers.spec.js → normalize-identifiers.test.js} +12 -13
  365. package/src/normalize-qualifying-information.js +2 -2
  366. package/src/{normalize-qualifying-information.spec.js → normalize-qualifying-information.test.js} +12 -13
  367. package/src/normalize-utf8-diacritics.js +2 -2
  368. package/src/{normalize-utf8-diacritics.spec.js → normalize-utf8-diacritics.test.js} +13 -13
  369. package/src/normalizeFieldForComparison.js +6 -6
  370. package/src/normalizeSubfieldValueForComparison.js +1 -1
  371. package/src/prepublicationUtils.js +4 -4
  372. package/src/punctuation/index.js +1 -1
  373. package/src/punctuation/rules/index.js +2 -2
  374. package/src/{punctuation.spec.js → punctuation.test.js} +12 -13
  375. package/src/punctuation2.js +4 -4
  376. package/src/{punctuation2.spec.js → punctuation2.test.js} +12 -13
  377. package/src/reindexSubfield6OccurenceNumbers.js +5 -7
  378. package/src/{reindexSubfield6OccurenceNumbers.spec.js → reindexSubfield6OccurenceNumbers.test.js} +12 -13
  379. package/src/removeDuplicateDataFields.js +11 -19
  380. package/src/{removeDuplicateDataFields.spec.js → removeDuplicateDataFields.test.js} +12 -13
  381. package/src/removeInferiorDataFields.js +11 -11
  382. package/src/{removeInferiorDataFields.spec.js → removeInferiorDataFields.test.js} +13 -13
  383. package/src/resolvable-ext-references-melinda.js +1 -1
  384. package/src/{resolvable-ext-references-melinda.spec.js → resolvable-ext-references-melinda.test.js} +42 -27
  385. package/src/resolveOrphanedSubfield6s.js +5 -5
  386. package/src/{resolveOrphanedSubfield6s.spec.js → resolveOrphanedSubfield6s.test.js} +13 -13
  387. package/src/sanitize-vocabulary-source-codes.js +4 -4
  388. package/src/{sanitize-vocabulary-source-codes.spec.js → sanitize-vocabulary-source-codes.test.js} +16 -14
  389. package/src/{sort-tags.spec.js → sort-tags.test.js} +9 -11
  390. package/src/sortFields.js +4 -4
  391. package/src/{sortFields.spec.js → sortFields.test.js} +12 -13
  392. package/src/sortRelatorTerms.js +3 -3
  393. package/src/{sortRelatorTerms.spec.js → sortRelatorTerms.test.js} +13 -13
  394. package/src/sortSubfields.js +1 -1
  395. package/src/{sortSubfields.spec.js → sortSubfields.test.js} +13 -13
  396. package/src/stripPunctuation.js +3 -3
  397. package/src/{stripPunctuation.spec.js → stripPunctuation.test.js} +13 -13
  398. package/src/subfield-exclusion.js +1 -1
  399. package/src/{subfield-exclusion.spec.js → subfield-exclusion.test.js} +45 -36
  400. package/src/subfield6Utils.js +6 -10
  401. package/src/subfield8Utils.js +4 -4
  402. package/src/subfieldValueNormalizations.js +3 -3
  403. package/src/{subfieldValueNormalizations.spec.js → subfieldValueNormalizations.test.js} +18 -14
  404. package/src/sync-007-and-300.js +2 -2
  405. package/src/{sync-007-and-300.spec.js → sync-007-and-300.test.js} +13 -13
  406. package/src/translate-terms.js +3 -3
  407. package/src/{translate-terms.spec.js → translate-terms.test.js} +13 -13
  408. package/src/{typeOfDate-008.spec.js → typeOfDate-008.test.js} +12 -13
  409. package/src/{unicode-decomposition.spec.js → unicode-decomposition.test.js} +10 -16
  410. package/src/update-field-540.js +2 -2
  411. package/src/{update-field-540.spec.js → update-field-540.test.js} +13 -10
  412. package/src/urn.js +2 -2
  413. package/src/{urn.spec.js → urn.test.js} +12 -13
  414. package/src/utils.js +3 -3
  415. package/test-fixtures/field-505-separators/03/expectedResult.json +3 -1
  416. package/test-fixtures/field-505-separators/03/record.json +3 -0
  417. package/test-fixtures/normalize-subfield-value/01/metadata.json +4 -1
  418. package/test-fixtures/normalize-subfield-value/01/record.json +3 -0
  419. package/test-fixtures/normalize-subfield-value/02/expectedResult.json +3 -1
  420. package/test-fixtures/normalize-subfield-value/02/metadata.json +2 -1
  421. package/test-fixtures/normalize-subfield-value/02/record.json +3 -0
  422. package/test-fixtures/sanitize-vocabulary-source-codes/f03/expectedResult.json +3 -1
  423. package/test-fixtures/sanitize-vocabulary-source-codes/f04/expectedResult.json +3 -1
  424. package/test-fixtures/sanitize-vocabulary-source-codes/v04/metadata.json +1 -4
  425. package/test-fixtures/sanitize-vocabulary-source-codes/v04/record.json +1 -1
  426. package/dist/access-rights.spec.js +0 -195
  427. package/dist/access-rights.spec.js.map +0 -1
  428. package/dist/addMissingField041.spec.js +0 -45
  429. package/dist/addMissingField041.spec.js.map +0 -1
  430. package/dist/addMissingField336.spec.js +0 -45
  431. package/dist/addMissingField336.spec.js.map +0 -1
  432. package/dist/addMissingField337.spec.js +0 -43
  433. package/dist/addMissingField337.spec.js.map +0 -1
  434. package/dist/addMissingField338.spec.js +0 -45
  435. package/dist/addMissingField338.spec.js.map +0 -1
  436. package/dist/cyrillux-usemarcon-replacement.spec.js +0 -45
  437. package/dist/cyrillux-usemarcon-replacement.spec.js.map +0 -1
  438. package/dist/cyrillux.spec.js +0 -46
  439. package/dist/cyrillux.spec.js.map +0 -1
  440. package/dist/disambiguateSeriesStatements.spec.js +0 -51
  441. package/dist/disambiguateSeriesStatements.spec.js.map +0 -1
  442. package/dist/double-commas.spec.js +0 -73
  443. package/dist/double-commas.spec.js.map +0 -1
  444. package/dist/duplicates-ind1.spec.js +0 -45
  445. package/dist/duplicates-ind1.spec.js.map +0 -1
  446. package/dist/empty-fields.spec.js +0 -118
  447. package/dist/empty-fields.spec.js.map +0 -1
  448. package/dist/ending-punctuation.spec.js +0 -2654
  449. package/dist/ending-punctuation.spec.js.map +0 -1
  450. package/dist/ending-whitespace.spec.js +0 -42
  451. package/dist/ending-whitespace.spec.js.map +0 -1
  452. package/dist/field-008-18-34-character-groups.spec.js +0 -51
  453. package/dist/field-008-18-34-character-groups.spec.js.map +0 -1
  454. package/dist/field-505-separators.spec.js +0 -51
  455. package/dist/field-505-separators.spec.js.map +0 -1
  456. package/dist/field-521-fix.spec.js +0 -51
  457. package/dist/field-521-fix.spec.js.map +0 -1
  458. package/dist/field-exclusion.spec.js +0 -1054
  459. package/dist/field-exclusion.spec.js.map +0 -1
  460. package/dist/field-structure.spec.js +0 -535
  461. package/dist/field-structure.spec.js.map +0 -1
  462. package/dist/fields-present.spec.js +0 -121
  463. package/dist/fields-present.spec.js.map +0 -1
  464. package/dist/fix-33X.spec.js +0 -45
  465. package/dist/fix-33X.spec.js.map +0 -1
  466. package/dist/fix-country-codes.spec.js +0 -51
  467. package/dist/fix-country-codes.spec.js.map +0 -1
  468. package/dist/fix-language-codes.spec.js +0 -44
  469. package/dist/fix-language-codes.spec.js.map +0 -1
  470. package/dist/fixRelatorTerms.spec.js +0 -51
  471. package/dist/fixRelatorTerms.spec.js.map +0 -1
  472. package/dist/fixed-fields.spec.js +0 -140
  473. package/dist/fixed-fields.spec.js.map +0 -1
  474. package/dist/identical-fields.spec.js +0 -99
  475. package/dist/identical-fields.spec.js.map +0 -1
  476. package/dist/indicator-fixes.spec.js +0 -51
  477. package/dist/indicator-fixes.spec.js.map +0 -1
  478. package/dist/isbn-issn.spec.js +0 -595
  479. package/dist/isbn-issn.spec.js.map +0 -1
  480. package/dist/item-language.spec.js +0 -306
  481. package/dist/item-language.spec.js.map +0 -1
  482. package/dist/melindaCustomMergeFields.json +0 -5120
  483. package/dist/merge-fields.spec.js +0 -51
  484. package/dist/merge-fields.spec.js.map +0 -1
  485. package/dist/mergeField500Lisapainokset.spec.js +0 -51
  486. package/dist/mergeField500Lisapainokset.spec.js.map +0 -1
  487. package/dist/mergeRelatorTermFields.spec.js +0 -51
  488. package/dist/mergeRelatorTermFields.spec.js.map +0 -1
  489. package/dist/modernize-502.spec.js +0 -49
  490. package/dist/modernize-502.spec.js.map +0 -1
  491. package/dist/multiple-subfield-0.spec.js +0 -51
  492. package/dist/multiple-subfield-0.spec.js.map +0 -1
  493. package/dist/non-breaking-space.spec.js +0 -42
  494. package/dist/non-breaking-space.spec.js.map +0 -1
  495. package/dist/normalize-dashes.spec.js +0 -51
  496. package/dist/normalize-dashes.spec.js.map +0 -1
  497. package/dist/normalize-identifiers.spec.js +0 -51
  498. package/dist/normalize-identifiers.spec.js.map +0 -1
  499. package/dist/normalize-qualifying-information.spec.js +0 -51
  500. package/dist/normalize-qualifying-information.spec.js.map +0 -1
  501. package/dist/normalize-utf8-diacritics.spec.js +0 -51
  502. package/dist/normalize-utf8-diacritics.spec.js.map +0 -1
  503. package/dist/punctuation.spec.js +0 -51
  504. package/dist/punctuation.spec.js.map +0 -1
  505. package/dist/punctuation2.spec.js +0 -51
  506. package/dist/punctuation2.spec.js.map +0 -1
  507. package/dist/reindexSubfield6OccurenceNumbers.spec.js +0 -51
  508. package/dist/reindexSubfield6OccurenceNumbers.spec.js.map +0 -1
  509. package/dist/removeDuplicateDataFields.spec.js +0 -51
  510. package/dist/removeDuplicateDataFields.spec.js.map +0 -1
  511. package/dist/removeInferiorDataFields.spec.js +0 -51
  512. package/dist/removeInferiorDataFields.spec.js.map +0 -1
  513. package/dist/resolvable-ext-references-melinda.spec.js +0 -166
  514. package/dist/resolvable-ext-references-melinda.spec.js.map +0 -1
  515. package/dist/resolveOrphanedSubfield6s.spec.js +0 -51
  516. package/dist/resolveOrphanedSubfield6s.spec.js.map +0 -1
  517. package/dist/sanitize-vocabulary-source-codes.spec.js +0 -51
  518. package/dist/sanitize-vocabulary-source-codes.spec.js.map +0 -1
  519. package/dist/sort-tags.spec.js +0 -207
  520. package/dist/sort-tags.spec.js.map +0 -1
  521. package/dist/sortFields.spec.js +0 -51
  522. package/dist/sortFields.spec.js.map +0 -1
  523. package/dist/sortRelatorTerms.spec.js +0 -51
  524. package/dist/sortRelatorTerms.spec.js.map +0 -1
  525. package/dist/sortSubfields.spec.js +0 -52
  526. package/dist/sortSubfields.spec.js.map +0 -1
  527. package/dist/stripPunctuation.spec.js +0 -51
  528. package/dist/stripPunctuation.spec.js.map +0 -1
  529. package/dist/subfield-exclusion.spec.js +0 -523
  530. package/dist/subfield-exclusion.spec.js.map +0 -1
  531. package/dist/subfieldValueNormalizations.spec.js +0 -51
  532. package/dist/subfieldValueNormalizations.spec.js.map +0 -1
  533. package/dist/sync-007-and-300.spec.js +0 -51
  534. package/dist/sync-007-and-300.spec.js.map +0 -1
  535. package/dist/translate-terms.spec.js +0 -51
  536. package/dist/translate-terms.spec.js.map +0 -1
  537. package/dist/typeOfDate-008.spec.js +0 -47
  538. package/dist/typeOfDate-008.spec.js.map +0 -1
  539. package/dist/unicode-decomposition.spec.js +0 -91
  540. package/dist/unicode-decomposition.spec.js.map +0 -1
  541. package/dist/update-field-540.spec.js +0 -51
  542. package/dist/update-field-540.spec.js.map +0 -1
  543. package/dist/urn.spec.js +0 -52
  544. package/dist/urn.spec.js.map +0 -1
  545. package/src/cyrillux-usemarcon-replacement.spec.js +0 -47
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/field-exclusion.test.js"],
4
+ "sourcesContent": ["import assert from 'node:assert';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from '../src/field-exclusion.js';\nimport {describe, it} from 'node:test';\n\n// Factory validation\ndescribe('field-exclusion', () => {\n describe('#validate: Check configuration validation', () => {\n it('Creates a validator from simple config', async () => {\n const config = [/^500$/u];\n\n const validator = await validatorFactory(config);\n assert.equal(typeof validator, 'object');\n assert.equal(typeof validator.description, 'string');\n assert.equal(typeof validator.validate, 'function');\n });\n\n it('Creates a validator from complex config', async () => {\n const config = [\n {\n tag: /^500$/u,\n subfields: [{code: /9/u, value: /^(?!FENNI<KEEP>).*$/u}]\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\n it('Fails to create a validator from invalid config - tag', async () => {\n const config = [\n {\n tag: '500',\n subfields: [{code: /9/u, value: /^(?!FENNI<KEEP>).*$/u}]\n }\n ];\n\n try {\n await 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('Fails to create a validator from invalid config - msising array', async () => {\n const config = {\n tag: '500',\n subfields: [{code: /9/u, value: /^(?!FENNI<KEEP>).*$/u}]\n };\n\n try {\n await validatorFactory(config);\n } catch (error) {\n assert.equal(error instanceof Error, true);\n assert.equal(error.message, 'Configuration array not provided');\n }\n });\n\n it('Fails to create a validator from invalid config - code', async () => {\n const config = [\n {\n tag: /^500$/u,\n subfields: [{code: 9, value: /^(?!FENNI<KEEP>).*$/u}]\n }\n ];\n\n try {\n await validatorFactory(config);\n } catch (error) {\n assert.equal(error instanceof Error, true);\n assert.equal(error.message, 'Configuration not valid - invalid data type for: code');\n }\n });\n\n it('Fails to create a validator from invalid config - value', async () => {\n const config = [\n {\n tag: /^500$/u,\n subfields: [{code: /9/u, value: 'Fenni'}]\n }\n ];\n\n try {\n await validatorFactory(config);\n } catch (error) {\n assert.equal(error instanceof Error, true);\n assert.equal(error.message, 'Configuration not valid - invalid data type for: value');\n }\n });\n\n it('Fails to create a validator from invalid config - exclusion: value, ind1', async () => {\n const config = [\n {\n tag: /^500$/u,\n value: /^500$/u,\n ind1: /^500$/u,\n subfields: [{code: /9/u, value: /^(?!FENNI<KEEP>).*$/u}]\n }\n ];\n\n try {\n await 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('Fails to create a validator from invalid config - missing mandatory: tag', async () => {\n const config = [\n {\n value: /^500$/u,\n subfields: [{code: /9/u, value: /^(?!FENNI<KEEP>).*$/u}]\n }\n ];\n\n try {\n await validatorFactory(config);\n } catch (error) {\n assert.equal(error instanceof Error, true);\n assert.equal(error.message, 'Configuration not valid - missing mandatory element: tag');\n }\n });\n\n it('Fails to create a validator from invalid config - subfield not object: array', async () => {\n const config = [\n {\n tag: /^500$/u,\n subfields: [\n ['/9/', '/^(?!FENNI<KEEP>).*$/'],\n {value: /^(?!FENNI<KEEP>).*$/u}\n ]\n }\n ];\n\n try {\n await validatorFactory(config);\n } catch (error) {\n assert.equal(error instanceof Error, true);\n assert.equal(error.message, 'Configuration not valid - subfield: /9/,/^(?!FENNI<KEEP>).*$/ not object');\n }\n });\n\n it('Fails to create a validator from invalid config - subfield not object: string', async () => {\n const config = [\n {\n tag: /^500$/u,\n subfields: [\n '/9/',\n '/^(?!FENNI<KEEP>).*$/',\n {value: /^(?!FENNI<KEEP>).*$/u}\n ]\n }\n ];\n\n try {\n await validatorFactory(config);\n } catch (error) {\n assert.equal(error instanceof Error, true);\n assert.equal(error.message, 'Configuration not valid - subfield: /9/ not object');\n }\n });\n\n it('Fails to create a validator from invalid config - missing mandatory: subfield.code', async () => {\n const config = [\n {\n tag: /^500$/u,\n subfields: [\n {code: /9/u, value: /^(?!FENNI<KEEP>).*$/u},\n {value: /^(?!FENNI<KEEP>).*$/u}\n ]\n }\n ];\n\n try {\n await validatorFactory(config);\n } catch (error) {\n assert.equal(error instanceof Error, true);\n assert.equal(error.message, 'Configuration not valid - missing mandatory element: code');\n }\n });\n\n it('Fails to create a validator from invalid config - unidentified field: unidentified', async () => {\n const config = [\n {\n tag: /^500$/u,\n unidentified: /^500$/u,\n subfields: [\n {code: /9/u, value: /^(?!FENNI<KEEP>).*$/u},\n {value: /^(?!FENNI<KEEP>).*$/u}\n ]\n }\n ];\n\n try {\n await validatorFactory(config);\n } catch (error) {\n assert.equal(error instanceof Error, true);\n assert.equal(error.message, 'Configuration not valid - unidentified value: unidentified');\n }\n });\n });\n\n // Simple configuration https://github.com/NatLibFi/marc-record-validators-melinda/issues/45\n describe('#validate: Simple configuration (spec)', () => {\n const config = [\n {\n tag: /^500$/u\n }\n ];\n\n const recordValid = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Fubar'}]\n }\n ]\n });\n\n const recordInvalid = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Fubar'}]\n }, {\n tag: '500',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {code: 'a', value: 'Foo Bar Foo Bar Foo Bar'},\n {code: '9', value: 'ALMA<KEEP>'}\n ]\n }\n ]\n });\n\n const recordInvalidDouble = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Fubar'}]\n }, {\n tag: '500',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {code: 'a', value: 'Foo'},\n {code: '9', value: 'ALMA<KEEP>'}\n ]\n }, {\n tag: '500',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {code: 'a', value: 'Bar'},\n {code: '9', value: 'ALMA<KEEP>'}\n ]\n }\n ]\n });\n\n const recordInvalidFixed = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Fubar'}]\n }\n ]\n });\n\n it('Finds the record valid (spec)', async () => {\n const validator = await validatorFactory(config);\n const {valid, message} = await validator.validate(recordValid);\n assert.deepEqual({valid, message}, {valid: true, message: []});\n });\n\n it('Finds the record invalid (spec)', async () => {\n const validator = await validatorFactory(config);\n const {valid, message} = await validator.validate(recordInvalid);\n assert.deepEqual({valid, message}, {valid: false, message: ['Field $500 should be excluded']});\n });\n\n it('Finds the record invalid - double', async () => {\n const validator = await validatorFactory(config);\n const {valid, message} = await validator.validate(recordInvalidDouble);\n assert.deepEqual({valid, message}, {valid: false, message: ['Field $500 should be excluded', 'Field $500 should be excluded']});\n });\n\n it('Repairs invalid record', async () => {\n const validator = await validatorFactory(config);\n await validator.fix(recordInvalid);\n assert.equal(recordInvalid.equalsTo(recordInvalidFixed), true);\n });\n\n it('Repairs invalid record - double', async () => {\n const validator = await validatorFactory(config);\n await validator.fix(recordInvalidDouble);\n assert.equal(recordInvalidDouble.equalsTo(recordInvalidFixed), true);\n });\n });\n\n // Simple multi tag configuration\n describe('#validate: Simple multi tag configuration (spec)', () => {\n const config = [\n {\n tag: /^(648|650|651|655)$/u\n }\n ];\n\n const recordValid = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Fubar'}]\n }\n ]\n });\n\n const recordInvalid = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Fubar'}]\n }, {\n tag: '648',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {code: 'a', value: 'Foo Bar Foo Bar Foo Bar'},\n {code: '9', value: 'ALMA<KEEP>'}\n ]\n }\n ]\n });\n\n const recordInvalidDouble = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Fubar'}]\n }, {\n tag: '648',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {code: 'a', value: 'Foo'},\n {code: '9', value: 'ALMA<KEEP>'}\n ]\n }, {\n tag: '650',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {code: 'a', value: 'Bar'},\n {code: '9', value: 'ALMA<KEEP>'}\n ]\n }\n ]\n });\n\n const recordInvalidFixed = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Fubar'}]\n }\n ]\n });\n\n it('Finds the record valid (spec)', async () => {\n const validator = await validatorFactory(config);\n const {valid, message} = await validator.validate(recordValid);\n assert.deepEqual({valid, message}, {valid: true, message: []});\n });\n\n it('Finds the record invalid (spec)', async () => {\n const validator = await validatorFactory(config);\n const {valid, message} = await validator.validate(recordInvalid);\n assert.deepEqual({valid, message}, {valid: false, message: ['Field $648 should be excluded']});\n });\n\n it('Finds the record invalid - double', async () => {\n const validator = await validatorFactory(config);\n const {valid, message} = await validator.validate(recordInvalidDouble);\n assert.deepEqual({valid, message}, {valid: false, message: ['Field $648 should be excluded', 'Field $650 should be excluded']});\n });\n\n it('Repairs invalid record', async () => {\n const validator = await validatorFactory(config);\n await validator.fix(recordInvalid);\n assert.equal(recordInvalid.equalsTo(recordInvalidFixed), true);\n });\n\n it('Repairs invalid record - double', async () => {\n const validator = await validatorFactory(config);\n await validator.fix(recordInvalidDouble);\n assert.equal(recordInvalidDouble.equalsTo(recordInvalidFixed), true);\n });\n });\n\n // Simple multi tag configuration\n describe('#validate: Simple multi tag configuration - No object (spec)', () => {\n const config = [/^(648|650|651|655)$/u];\n\n const recordValid = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Fubar'}]\n }\n ]\n });\n\n const recordInvalid = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Fubar'}]\n }, {\n tag: '648',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {code: 'a', value: 'Foo Bar Foo Bar Foo Bar'},\n {code: '9', value: 'ALMA<KEEP>'}\n ]\n }\n ]\n });\n\n const recordInvalidDouble = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Fubar'}]\n }, {\n tag: '648',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {code: 'a', value: 'Foo'},\n {code: '9', value: 'ALMA<KEEP>'}\n ]\n }, {\n tag: '650',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {code: 'a', value: 'Bar'},\n {code: '9', value: 'ALMA<KEEP>'}\n ]\n }\n ]\n });\n\n const recordInvalidFixed = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Fubar'}]\n }\n ]\n });\n\n it('Finds the record valid (spec)', async () => {\n const validator = await validatorFactory(config);\n const {valid, message} = await validator.validate(recordValid);\n assert.deepEqual({valid, message}, {valid: true, message: []});\n });\n\n it('Finds the record invalid (spec)', async () => {\n const validator = await validatorFactory(config);\n const {valid, message} = await validator.validate(recordInvalid);\n assert.deepEqual({valid, message}, {valid: false, message: ['Field $648 should be excluded']});\n });\n\n it('Finds the record invalid - double', async () => {\n const validator = await validatorFactory(config);\n const {valid, message} = await validator.validate(recordInvalidDouble);\n assert.deepEqual({valid, message}, {valid: false, message: ['Field $648 should be excluded', 'Field $650 should be excluded']});\n });\n\n it('Repairs invalid record', async () => {\n const validator = await validatorFactory(config);\n await validator.fix(recordInvalid);\n assert.deepEqual(recordInvalid.equalsTo(recordInvalidFixed), true);\n });\n\n it('Repairs invalid record - double', async () => {\n const validator = await validatorFactory(config);\n await validator.fix(recordInvalidDouble);\n assert.equal(recordInvalidDouble.equalsTo(recordInvalidFixed), true);\n });\n });\n\n\n // Complex configuration https://github.com/NatLibFi/marc-record-validators-melinda/issues/45\n describe('#validate: Complex configuration (spec)', () => {\n const config = [\n {\n tag: /^500$/u,\n subfields: [{code: /9/u, value: /^(?!FENNI<KEEP>).*$/u}]\n }\n ];\n\n const recordValid = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Fubar'}]\n }, {\n tag: '500',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {code: 'a', value: 'Foo Bar Foo Bar Foo Bar'},\n {code: '9', value: 'FENNI<KEEP>'}\n ]\n }\n ]\n });\n\n const recordInvalid = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Fubar'}]\n }, {\n tag: '500',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {code: 'a', value: 'Foo Bar Foo Bar Foo Bar'},\n {code: '9', value: 'ALMA<KEEP>'}\n ]\n }\n ]\n });\n\n const recordInvalidFixed = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Fubar'}]\n }\n ]\n });\n\n it('Finds the record valid (spec)', async () => {\n const validator = await validatorFactory(config);\n const {valid, message} = await validator.validate(recordValid);\n assert.deepEqual({valid, message}, {valid: true, message: []});\n });\n\n it('Finds the record invalid (spec)', async () => {\n const validator = await validatorFactory(config);\n const {valid, message} = await validator.validate(recordInvalid);\n assert.deepEqual({valid, message}, {valid: false, message: ['Field $500 should be excluded']});\n });\n\n it('Repairs invalid record', async () => {\n const validator = await validatorFactory(config);\n await validator.fix(recordInvalid);\n assert.equal(recordInvalid.equalsTo(recordInvalidFixed), true);\n });\n });\n\n // Complex multi tag configuration\n describe('#validate: Complex multi tag configuration (spec)', () => {\n const config = [\n {\n tag: /^(648|650|651|655)$/u,\n subfields: [{code: /^2$/u, value: /^(ysa|musa|allars|cilla)$/u}]\n }\n ];\n\n const recordValid = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Fubar'}]\n }, {\n tag: '650',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {code: 'a', value: 'Foo Bar Foo Bar Foo Bar'},\n {code: '2', value: 'yso'}\n ]\n }\n ]\n });\n\n const recordInvalid = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Fubar'}]\n }, {\n tag: '650',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {code: 'a', value: 'Foo Bar Foo Bar Foo Bar'},\n {code: '2', value: 'ysa'}\n ]\n }\n ]\n });\n\n const recordInvalidMulti = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Fubar'}]\n }, {\n tag: '648',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: '2', value: 'ysa'}]\n }, {\n tag: '650',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: '2', value: 'ysa'}]\n }, {\n tag: '650',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: '2', value: 'ysa'}]\n }, {\n tag: '651',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: '2', value: 'ysa'}]\n }, {\n tag: '655',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: '2', value: 'ysa'}]\n }\n ]\n });\n\n const recordInvalidFixed = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Fubar'}]\n }\n ]\n });\n\n it('Finds the record valid (spec)', async () => {\n const validator = await validatorFactory(config);\n const {valid, message} = await validator.validate(recordValid);\n assert.deepEqual({valid, message}, {valid: true, message: []});\n });\n\n it('Finds the record invalid (spec)', async () => {\n const validator = await validatorFactory(config);\n const {valid, message} = await validator.validate(recordInvalid);\n assert.deepEqual({valid, message}, {valid: false, message: ['Field $650 should be excluded']});\n });\n\n it('Finds the record invalid (spec)', async () => {\n const validator = await validatorFactory(config);\n const {valid, message} = await validator.validate(recordInvalidMulti);\n assert.deepEqual({valid, message}, {valid: false, message: [\n 'Field $648 should be excluded',\n 'Field $650 should be excluded',\n 'Field $650 should be excluded',\n 'Field $651 should be excluded',\n 'Field $655 should be excluded'\n ]});\n });\n\n it('Repairs invalid multi record', async () => {\n const validator = await validatorFactory(config);\n await validator.fix(recordInvalidMulti);\n assert.equal(recordInvalidMulti.equalsTo(recordInvalidFixed), true);\n });\n\n it('Repairs invalid record', async () => {\n const validator = await validatorFactory(config);\n await validator.fix(recordInvalid);\n assert.equal(recordInvalid.equalsTo(recordInvalidFixed), true);\n });\n });\n\n // More special cases to increase coverage\n describe('#validate: Custom configuration', () => {\n const configInd = [\n {\n tag: /^500$/u,\n ind1: /^8$/u,\n ind2: /^4$/u\n }\n ];\n\n const configValue = [\n {\n tag: /^500$/u,\n value: /^8$/u\n }\n ];\n\n const recordValid = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '500',\n ind1: '8',\n ind2: '0',\n subfields: [\n {code: 'a', value: 'Foo Bar Foo Bar Foo Bar'},\n {code: '9', value: 'ALMA<KEEP>'}\n ]\n }\n ]\n });\n\n const recordIndInvalid = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Fubar'}]\n }, {\n tag: '500',\n ind1: '8',\n ind2: '4',\n subfields: [\n {code: 'a', value: 'Foo Bar Foo Bar Foo Bar'},\n {code: '9', value: 'ALMA<KEEP>'}\n ]\n }\n ]\n });\n\n const recordValueInvalid = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Fubar'}]\n }, {\n tag: '500',\n value: '8'\n }\n ]\n });\n\n const recordInvalidFixed = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Fubar'}]\n }\n ]\n });\n\n it('Finds the record valid - Ind1&Ind2', async () => {\n const validator = await validatorFactory(configInd);\n const {valid, message} = await validator.validate(recordValid);\n assert.deepEqual({valid, message}, {valid: true, message: []});\n });\n\n it('Finds the record valid - Value', async () => {\n const validator = await validatorFactory(configValue);\n const {valid, message} = await validator.validate(recordValid);\n assert.deepEqual({valid, message}, {valid: true, message: []});\n });\n\n it('Finds the record invalid - Ind', async () => {\n const validator = await validatorFactory(configInd);\n const {valid, message} = await validator.validate(recordIndInvalid);\n assert.deepEqual({valid, message}, {valid: false, message: ['Field $500 should be excluded']});\n });\n\n it('Finds the record invalid - Value', async () => {\n const validator = await validatorFactory(configValue);\n const {valid, message} = await validator.validate(recordValueInvalid);\n assert.deepEqual({valid, message}, {valid: false, message: ['Field $500 should be excluded']});\n });\n\n it('Repairs invalid record - Ind', async () => {\n const validator = await validatorFactory(configInd);\n await validator.fix(recordIndInvalid);\n assert.equal(recordIndInvalid.equalsTo(recordInvalidFixed), true);\n });\n\n it('Repairs invalid record - Value', async () => {\n const validator = await validatorFactory(configValue);\n await validator.fix(recordValueInvalid);\n assert.equal(recordValueInvalid.equalsTo(recordInvalidFixed), true);\n });\n });\n\n describe('Dependencies', () => {\n it('Finds the record invalid because dependency matches', async () => {\n const config = [\n {\n tag: /^041$/u,\n dependencies: [{leader: /^.{6}a/u}]\n }\n ];\n\n const record = new MarcRecord({\n leader: '00000cam^a22003372i^4500',\n fields: [\n {\n tag: '041',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Fubar'}]\n }\n ]\n });\n\n const validator = await validatorFactory(config);\n const {valid, message} = await validator.validate(record);\n\n assert.deepEqual({valid, message}, {valid: false, message: ['Field $041 should be excluded']});\n });\n });\n});\n"],
5
+ "mappings": "AAAA,OAAO,YAAY;AACnB,SAAQ,kBAAiB;AACzB,OAAO,sBAAsB;AAC7B,SAAQ,UAAU,UAAS;AAG3B,SAAS,mBAAmB,MAAM;AAChC,WAAS,6CAA6C,MAAM;AAC1D,OAAG,0CAA0C,YAAY;AACvD,YAAM,SAAS,CAAC,QAAQ;AAExB,YAAM,YAAY,MAAM,iBAAiB,MAAM;AAC/C,aAAO,MAAM,OAAO,WAAW,QAAQ;AACvC,aAAO,MAAM,OAAO,UAAU,aAAa,QAAQ;AACnD,aAAO,MAAM,OAAO,UAAU,UAAU,UAAU;AAAA,IACpD,CAAC;AAED,OAAG,2CAA2C,YAAY;AACxD,YAAM,SAAS;AAAA,QACb;AAAA,UACE,KAAK;AAAA,UACL,WAAW,CAAC,EAAC,MAAM,MAAM,OAAO,uBAAsB,CAAC;AAAA,QACzD;AAAA,MACF;AAEA,YAAM,YAAY,MAAM,iBAAiB,MAAM;AAE/C,aAAO,MAAM,OAAO,WAAW,QAAQ;AACvC,aAAO,MAAM,OAAO,UAAU,aAAa,QAAQ;AACnD,aAAO,MAAM,OAAO,UAAU,UAAU,UAAU;AAAA,IAEpD,CAAC;AAED,OAAG,yDAAyD,YAAY;AACtE,YAAM,SAAS;AAAA,QACb;AAAA,UACE,KAAK;AAAA,UACL,WAAW,CAAC,EAAC,MAAM,MAAM,OAAO,uBAAsB,CAAC;AAAA,QACzD;AAAA,MACF;AAEA,UAAI;AACF,cAAM,iBAAiB,MAAM;AAAA,MAC/B,SAAS,OAAO;AACd,eAAO,MAAM,iBAAiB,OAAO,IAAI;AACzC,eAAO,MAAM,MAAM,SAAS,sDAAsD;AAAA,MACpF;AAAA,IACF,CAAC;AAED,OAAG,mEAAmE,YAAY;AAChF,YAAM,SAAS;AAAA,QACb,KAAK;AAAA,QACL,WAAW,CAAC,EAAC,MAAM,MAAM,OAAO,uBAAsB,CAAC;AAAA,MACzD;AAEA,UAAI;AACF,cAAM,iBAAiB,MAAM;AAAA,MAC/B,SAAS,OAAO;AACd,eAAO,MAAM,iBAAiB,OAAO,IAAI;AACzC,eAAO,MAAM,MAAM,SAAS,kCAAkC;AAAA,MAChE;AAAA,IACF,CAAC;AAED,OAAG,0DAA0D,YAAY;AACvE,YAAM,SAAS;AAAA,QACb;AAAA,UACE,KAAK;AAAA,UACL,WAAW,CAAC,EAAC,MAAM,GAAG,OAAO,uBAAsB,CAAC;AAAA,QACtD;AAAA,MACF;AAEA,UAAI;AACF,cAAM,iBAAiB,MAAM;AAAA,MAC/B,SAAS,OAAO;AACd,eAAO,MAAM,iBAAiB,OAAO,IAAI;AACzC,eAAO,MAAM,MAAM,SAAS,uDAAuD;AAAA,MACrF;AAAA,IACF,CAAC;AAED,OAAG,2DAA2D,YAAY;AACxE,YAAM,SAAS;AAAA,QACb;AAAA,UACE,KAAK;AAAA,UACL,WAAW,CAAC,EAAC,MAAM,MAAM,OAAO,QAAO,CAAC;AAAA,QAC1C;AAAA,MACF;AAEA,UAAI;AACF,cAAM,iBAAiB,MAAM;AAAA,MAC/B,SAAS,OAAO;AACd,eAAO,MAAM,iBAAiB,OAAO,IAAI;AACzC,eAAO,MAAM,MAAM,SAAS,wDAAwD;AAAA,MACtF;AAAA,IACF,CAAC;AAED,OAAG,4EAA4E,YAAY;AACzF,YAAM,SAAS;AAAA,QACb;AAAA,UACE,KAAK;AAAA,UACL,OAAO;AAAA,UACP,MAAM;AAAA,UACN,WAAW,CAAC,EAAC,MAAM,MAAM,OAAO,uBAAsB,CAAC;AAAA,QACzD;AAAA,MACF;AAEA,UAAI;AACF,cAAM,iBAAiB,MAAM;AAAA,MAC/B,SAAS,OAAO;AACd,eAAO,MAAM,iBAAiB,OAAO,IAAI;AACzC,eAAO,MAAM,MAAM,SAAS,4CAA4C;AAAA,MAC1E;AAAA,IACF,CAAC;AAED,OAAG,4EAA4E,YAAY;AACzF,YAAM,SAAS;AAAA,QACb;AAAA,UACE,OAAO;AAAA,UACP,WAAW,CAAC,EAAC,MAAM,MAAM,OAAO,uBAAsB,CAAC;AAAA,QACzD;AAAA,MACF;AAEA,UAAI;AACF,cAAM,iBAAiB,MAAM;AAAA,MAC/B,SAAS,OAAO;AACd,eAAO,MAAM,iBAAiB,OAAO,IAAI;AACzC,eAAO,MAAM,MAAM,SAAS,0DAA0D;AAAA,MACxF;AAAA,IACF,CAAC;AAED,OAAG,gFAAgF,YAAY;AAC7F,YAAM,SAAS;AAAA,QACb;AAAA,UACE,KAAK;AAAA,UACL,WAAW;AAAA,YACT,CAAC,OAAO,uBAAuB;AAAA,YAC/B,EAAC,OAAO,uBAAsB;AAAA,UAChC;AAAA,QACF;AAAA,MACF;AAEA,UAAI;AACF,cAAM,iBAAiB,MAAM;AAAA,MAC/B,SAAS,OAAO;AACd,eAAO,MAAM,iBAAiB,OAAO,IAAI;AACzC,eAAO,MAAM,MAAM,SAAS,0EAA0E;AAAA,MACxG;AAAA,IACF,CAAC;AAED,OAAG,iFAAiF,YAAY;AAC9F,YAAM,SAAS;AAAA,QACb;AAAA,UACE,KAAK;AAAA,UACL,WAAW;AAAA,YACT;AAAA,YACA;AAAA,YACA,EAAC,OAAO,uBAAsB;AAAA,UAChC;AAAA,QACF;AAAA,MACF;AAEA,UAAI;AACF,cAAM,iBAAiB,MAAM;AAAA,MAC/B,SAAS,OAAO;AACd,eAAO,MAAM,iBAAiB,OAAO,IAAI;AACzC,eAAO,MAAM,MAAM,SAAS,oDAAoD;AAAA,MAClF;AAAA,IACF,CAAC;AAED,OAAG,sFAAsF,YAAY;AACnG,YAAM,SAAS;AAAA,QACb;AAAA,UACE,KAAK;AAAA,UACL,WAAW;AAAA,YACT,EAAC,MAAM,MAAM,OAAO,uBAAsB;AAAA,YAC1C,EAAC,OAAO,uBAAsB;AAAA,UAChC;AAAA,QACF;AAAA,MACF;AAEA,UAAI;AACF,cAAM,iBAAiB,MAAM;AAAA,MAC/B,SAAS,OAAO;AACd,eAAO,MAAM,iBAAiB,OAAO,IAAI;AACzC,eAAO,MAAM,MAAM,SAAS,2DAA2D;AAAA,MACzF;AAAA,IACF,CAAC;AAED,OAAG,sFAAsF,YAAY;AACnG,YAAM,SAAS;AAAA,QACb;AAAA,UACE,KAAK;AAAA,UACL,cAAc;AAAA,UACd,WAAW;AAAA,YACT,EAAC,MAAM,MAAM,OAAO,uBAAsB;AAAA,YAC1C,EAAC,OAAO,uBAAsB;AAAA,UAChC;AAAA,QACF;AAAA,MACF;AAEA,UAAI;AACF,cAAM,iBAAiB,MAAM;AAAA,MAC/B,SAAS,OAAO;AACd,eAAO,MAAM,iBAAiB,OAAO,IAAI;AACzC,eAAO,MAAM,MAAM,SAAS,4DAA4D;AAAA,MAC1F;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAGD,WAAS,0CAA0C,MAAM;AACvD,UAAM,SAAS;AAAA,MACb;AAAA,QACE,KAAK;AAAA,MACP;AAAA,IACF;AAEA,UAAM,cAAc,IAAI,WAAW;AAAA,MACjC,QAAQ;AAAA,MACR,QAAQ;AAAA,QACN;AAAA,UACE,KAAK;AAAA,UACL,MAAM;AAAA,UACN,MAAM;AAAA,UACN,WAAW,CAAC,EAAC,MAAM,KAAK,OAAO,QAAO,CAAC;AAAA,QACzC;AAAA,MACF;AAAA,IACF,CAAC;AAED,UAAM,gBAAgB,IAAI,WAAW;AAAA,MACnC,QAAQ;AAAA,MACR,QAAQ;AAAA,QACN;AAAA,UACE,KAAK;AAAA,UACL,MAAM;AAAA,UACN,MAAM;AAAA,UACN,WAAW,CAAC,EAAC,MAAM,KAAK,OAAO,QAAO,CAAC;AAAA,QACzC;AAAA,QAAG;AAAA,UACD,KAAK;AAAA,UACL,MAAM;AAAA,UACN,MAAM;AAAA,UACN,WAAW;AAAA,YACT,EAAC,MAAM,KAAK,OAAO,0BAAyB;AAAA,YAC5C,EAAC,MAAM,KAAK,OAAO,aAAY;AAAA,UACjC;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAED,UAAM,sBAAsB,IAAI,WAAW;AAAA,MACzC,QAAQ;AAAA,MACR,QAAQ;AAAA,QACN;AAAA,UACE,KAAK;AAAA,UACL,MAAM;AAAA,UACN,MAAM;AAAA,UACN,WAAW,CAAC,EAAC,MAAM,KAAK,OAAO,QAAO,CAAC;AAAA,QACzC;AAAA,QAAG;AAAA,UACD,KAAK;AAAA,UACL,MAAM;AAAA,UACN,MAAM;AAAA,UACN,WAAW;AAAA,YACT,EAAC,MAAM,KAAK,OAAO,MAAK;AAAA,YACxB,EAAC,MAAM,KAAK,OAAO,aAAY;AAAA,UACjC;AAAA,QACF;AAAA,QAAG;AAAA,UACD,KAAK;AAAA,UACL,MAAM;AAAA,UACN,MAAM;AAAA,UACN,WAAW;AAAA,YACT,EAAC,MAAM,KAAK,OAAO,MAAK;AAAA,YACxB,EAAC,MAAM,KAAK,OAAO,aAAY;AAAA,UACjC;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAED,UAAM,qBAAqB,IAAI,WAAW;AAAA,MACxC,QAAQ;AAAA,MACR,QAAQ;AAAA,QACN;AAAA,UACE,KAAK;AAAA,UACL,MAAM;AAAA,UACN,MAAM;AAAA,UACN,WAAW,CAAC,EAAC,MAAM,KAAK,OAAO,QAAO,CAAC;AAAA,QACzC;AAAA,MACF;AAAA,IACF,CAAC;AAED,OAAG,iCAAiC,YAAY;AAC9C,YAAM,YAAY,MAAM,iBAAiB,MAAM;AAC/C,YAAM,EAAC,OAAO,QAAO,IAAI,MAAM,UAAU,SAAS,WAAW;AAC7D,aAAO,UAAU,EAAC,OAAO,QAAO,GAAG,EAAC,OAAO,MAAM,SAAS,CAAC,EAAC,CAAC;AAAA,IAC/D,CAAC;AAED,OAAG,mCAAmC,YAAY;AAChD,YAAM,YAAY,MAAM,iBAAiB,MAAM;AAC/C,YAAM,EAAC,OAAO,QAAO,IAAI,MAAM,UAAU,SAAS,aAAa;AAC/D,aAAO,UAAU,EAAC,OAAO,QAAO,GAAG,EAAC,OAAO,OAAO,SAAS,CAAC,+BAA+B,EAAC,CAAC;AAAA,IAC/F,CAAC;AAED,OAAG,qCAAqC,YAAY;AAClD,YAAM,YAAY,MAAM,iBAAiB,MAAM;AAC/C,YAAM,EAAC,OAAO,QAAO,IAAI,MAAM,UAAU,SAAS,mBAAmB;AACrE,aAAO,UAAU,EAAC,OAAO,QAAO,GAAG,EAAC,OAAO,OAAO,SAAS,CAAC,iCAAiC,+BAA+B,EAAC,CAAC;AAAA,IAChI,CAAC;AAED,OAAG,0BAA0B,YAAY;AACvC,YAAM,YAAY,MAAM,iBAAiB,MAAM;AAC/C,YAAM,UAAU,IAAI,aAAa;AACjC,aAAO,MAAM,cAAc,SAAS,kBAAkB,GAAG,IAAI;AAAA,IAC/D,CAAC;AAED,OAAG,mCAAmC,YAAY;AAChD,YAAM,YAAY,MAAM,iBAAiB,MAAM;AAC/C,YAAM,UAAU,IAAI,mBAAmB;AACvC,aAAO,MAAM,oBAAoB,SAAS,kBAAkB,GAAG,IAAI;AAAA,IACrE,CAAC;AAAA,EACH,CAAC;AAGD,WAAS,oDAAoD,MAAM;AACjE,UAAM,SAAS;AAAA,MACb;AAAA,QACE,KAAK;AAAA,MACP;AAAA,IACF;AAEA,UAAM,cAAc,IAAI,WAAW;AAAA,MACjC,QAAQ;AAAA,MACR,QAAQ;AAAA,QACN;AAAA,UACE,KAAK;AAAA,UACL,MAAM;AAAA,UACN,MAAM;AAAA,UACN,WAAW,CAAC,EAAC,MAAM,KAAK,OAAO,QAAO,CAAC;AAAA,QACzC;AAAA,MACF;AAAA,IACF,CAAC;AAED,UAAM,gBAAgB,IAAI,WAAW;AAAA,MACnC,QAAQ;AAAA,MACR,QAAQ;AAAA,QACN;AAAA,UACE,KAAK;AAAA,UACL,MAAM;AAAA,UACN,MAAM;AAAA,UACN,WAAW,CAAC,EAAC,MAAM,KAAK,OAAO,QAAO,CAAC;AAAA,QACzC;AAAA,QAAG;AAAA,UACD,KAAK;AAAA,UACL,MAAM;AAAA,UACN,MAAM;AAAA,UACN,WAAW;AAAA,YACT,EAAC,MAAM,KAAK,OAAO,0BAAyB;AAAA,YAC5C,EAAC,MAAM,KAAK,OAAO,aAAY;AAAA,UACjC;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAED,UAAM,sBAAsB,IAAI,WAAW;AAAA,MACzC,QAAQ;AAAA,MACR,QAAQ;AAAA,QACN;AAAA,UACE,KAAK;AAAA,UACL,MAAM;AAAA,UACN,MAAM;AAAA,UACN,WAAW,CAAC,EAAC,MAAM,KAAK,OAAO,QAAO,CAAC;AAAA,QACzC;AAAA,QAAG;AAAA,UACD,KAAK;AAAA,UACL,MAAM;AAAA,UACN,MAAM;AAAA,UACN,WAAW;AAAA,YACT,EAAC,MAAM,KAAK,OAAO,MAAK;AAAA,YACxB,EAAC,MAAM,KAAK,OAAO,aAAY;AAAA,UACjC;AAAA,QACF;AAAA,QAAG;AAAA,UACD,KAAK;AAAA,UACL,MAAM;AAAA,UACN,MAAM;AAAA,UACN,WAAW;AAAA,YACT,EAAC,MAAM,KAAK,OAAO,MAAK;AAAA,YACxB,EAAC,MAAM,KAAK,OAAO,aAAY;AAAA,UACjC;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAED,UAAM,qBAAqB,IAAI,WAAW;AAAA,MACxC,QAAQ;AAAA,MACR,QAAQ;AAAA,QACN;AAAA,UACE,KAAK;AAAA,UACL,MAAM;AAAA,UACN,MAAM;AAAA,UACN,WAAW,CAAC,EAAC,MAAM,KAAK,OAAO,QAAO,CAAC;AAAA,QACzC;AAAA,MACF;AAAA,IACF,CAAC;AAED,OAAG,iCAAiC,YAAY;AAC9C,YAAM,YAAY,MAAM,iBAAiB,MAAM;AAC/C,YAAM,EAAC,OAAO,QAAO,IAAI,MAAM,UAAU,SAAS,WAAW;AAC7D,aAAO,UAAU,EAAC,OAAO,QAAO,GAAG,EAAC,OAAO,MAAM,SAAS,CAAC,EAAC,CAAC;AAAA,IAC/D,CAAC;AAED,OAAG,mCAAmC,YAAY;AAChD,YAAM,YAAY,MAAM,iBAAiB,MAAM;AAC/C,YAAM,EAAC,OAAO,QAAO,IAAI,MAAM,UAAU,SAAS,aAAa;AAC/D,aAAO,UAAU,EAAC,OAAO,QAAO,GAAG,EAAC,OAAO,OAAO,SAAS,CAAC,+BAA+B,EAAC,CAAC;AAAA,IAC/F,CAAC;AAED,OAAG,qCAAqC,YAAY;AAClD,YAAM,YAAY,MAAM,iBAAiB,MAAM;AAC/C,YAAM,EAAC,OAAO,QAAO,IAAI,MAAM,UAAU,SAAS,mBAAmB;AACrE,aAAO,UAAU,EAAC,OAAO,QAAO,GAAG,EAAC,OAAO,OAAO,SAAS,CAAC,iCAAiC,+BAA+B,EAAC,CAAC;AAAA,IAChI,CAAC;AAED,OAAG,0BAA0B,YAAY;AACvC,YAAM,YAAY,MAAM,iBAAiB,MAAM;AAC/C,YAAM,UAAU,IAAI,aAAa;AACjC,aAAO,MAAM,cAAc,SAAS,kBAAkB,GAAG,IAAI;AAAA,IAC/D,CAAC;AAED,OAAG,mCAAmC,YAAY;AAChD,YAAM,YAAY,MAAM,iBAAiB,MAAM;AAC/C,YAAM,UAAU,IAAI,mBAAmB;AACvC,aAAO,MAAM,oBAAoB,SAAS,kBAAkB,GAAG,IAAI;AAAA,IACrE,CAAC;AAAA,EACH,CAAC;AAGD,WAAS,gEAAgE,MAAM;AAC7E,UAAM,SAAS,CAAC,sBAAsB;AAEtC,UAAM,cAAc,IAAI,WAAW;AAAA,MACjC,QAAQ;AAAA,MACR,QAAQ;AAAA,QACN;AAAA,UACE,KAAK;AAAA,UACL,MAAM;AAAA,UACN,MAAM;AAAA,UACN,WAAW,CAAC,EAAC,MAAM,KAAK,OAAO,QAAO,CAAC;AAAA,QACzC;AAAA,MACF;AAAA,IACF,CAAC;AAED,UAAM,gBAAgB,IAAI,WAAW;AAAA,MACnC,QAAQ;AAAA,MACR,QAAQ;AAAA,QACN;AAAA,UACE,KAAK;AAAA,UACL,MAAM;AAAA,UACN,MAAM;AAAA,UACN,WAAW,CAAC,EAAC,MAAM,KAAK,OAAO,QAAO,CAAC;AAAA,QACzC;AAAA,QAAG;AAAA,UACD,KAAK;AAAA,UACL,MAAM;AAAA,UACN,MAAM;AAAA,UACN,WAAW;AAAA,YACT,EAAC,MAAM,KAAK,OAAO,0BAAyB;AAAA,YAC5C,EAAC,MAAM,KAAK,OAAO,aAAY;AAAA,UACjC;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAED,UAAM,sBAAsB,IAAI,WAAW;AAAA,MACzC,QAAQ;AAAA,MACR,QAAQ;AAAA,QACN;AAAA,UACE,KAAK;AAAA,UACL,MAAM;AAAA,UACN,MAAM;AAAA,UACN,WAAW,CAAC,EAAC,MAAM,KAAK,OAAO,QAAO,CAAC;AAAA,QACzC;AAAA,QAAG;AAAA,UACD,KAAK;AAAA,UACL,MAAM;AAAA,UACN,MAAM;AAAA,UACN,WAAW;AAAA,YACT,EAAC,MAAM,KAAK,OAAO,MAAK;AAAA,YACxB,EAAC,MAAM,KAAK,OAAO,aAAY;AAAA,UACjC;AAAA,QACF;AAAA,QAAG;AAAA,UACD,KAAK;AAAA,UACL,MAAM;AAAA,UACN,MAAM;AAAA,UACN,WAAW;AAAA,YACT,EAAC,MAAM,KAAK,OAAO,MAAK;AAAA,YACxB,EAAC,MAAM,KAAK,OAAO,aAAY;AAAA,UACjC;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAED,UAAM,qBAAqB,IAAI,WAAW;AAAA,MACxC,QAAQ;AAAA,MACR,QAAQ;AAAA,QACN;AAAA,UACE,KAAK;AAAA,UACL,MAAM;AAAA,UACN,MAAM;AAAA,UACN,WAAW,CAAC,EAAC,MAAM,KAAK,OAAO,QAAO,CAAC;AAAA,QACzC;AAAA,MACF;AAAA,IACF,CAAC;AAED,OAAG,iCAAiC,YAAY;AAC9C,YAAM,YAAY,MAAM,iBAAiB,MAAM;AAC/C,YAAM,EAAC,OAAO,QAAO,IAAI,MAAM,UAAU,SAAS,WAAW;AAC7D,aAAO,UAAU,EAAC,OAAO,QAAO,GAAG,EAAC,OAAO,MAAM,SAAS,CAAC,EAAC,CAAC;AAAA,IAC/D,CAAC;AAED,OAAG,mCAAmC,YAAY;AAChD,YAAM,YAAY,MAAM,iBAAiB,MAAM;AAC/C,YAAM,EAAC,OAAO,QAAO,IAAI,MAAM,UAAU,SAAS,aAAa;AAC/D,aAAO,UAAU,EAAC,OAAO,QAAO,GAAG,EAAC,OAAO,OAAO,SAAS,CAAC,+BAA+B,EAAC,CAAC;AAAA,IAC/F,CAAC;AAED,OAAG,qCAAqC,YAAY;AAClD,YAAM,YAAY,MAAM,iBAAiB,MAAM;AAC/C,YAAM,EAAC,OAAO,QAAO,IAAI,MAAM,UAAU,SAAS,mBAAmB;AACrE,aAAO,UAAU,EAAC,OAAO,QAAO,GAAG,EAAC,OAAO,OAAO,SAAS,CAAC,iCAAiC,+BAA+B,EAAC,CAAC;AAAA,IAChI,CAAC;AAED,OAAG,0BAA0B,YAAY;AACvC,YAAM,YAAY,MAAM,iBAAiB,MAAM;AAC/C,YAAM,UAAU,IAAI,aAAa;AACjC,aAAO,UAAU,cAAc,SAAS,kBAAkB,GAAG,IAAI;AAAA,IACnE,CAAC;AAED,OAAG,mCAAmC,YAAY;AAChD,YAAM,YAAY,MAAM,iBAAiB,MAAM;AAC/C,YAAM,UAAU,IAAI,mBAAmB;AACvC,aAAO,MAAM,oBAAoB,SAAS,kBAAkB,GAAG,IAAI;AAAA,IACrE,CAAC;AAAA,EACH,CAAC;AAID,WAAS,2CAA2C,MAAM;AACxD,UAAM,SAAS;AAAA,MACb;AAAA,QACE,KAAK;AAAA,QACL,WAAW,CAAC,EAAC,MAAM,MAAM,OAAO,uBAAsB,CAAC;AAAA,MACzD;AAAA,IACF;AAEA,UAAM,cAAc,IAAI,WAAW;AAAA,MACjC,QAAQ;AAAA,MACR,QAAQ;AAAA,QACN;AAAA,UACE,KAAK;AAAA,UACL,MAAM;AAAA,UACN,MAAM;AAAA,UACN,WAAW,CAAC,EAAC,MAAM,KAAK,OAAO,QAAO,CAAC;AAAA,QACzC;AAAA,QAAG;AAAA,UACD,KAAK;AAAA,UACL,MAAM;AAAA,UACN,MAAM;AAAA,UACN,WAAW;AAAA,YACT,EAAC,MAAM,KAAK,OAAO,0BAAyB;AAAA,YAC5C,EAAC,MAAM,KAAK,OAAO,cAAa;AAAA,UAClC;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAED,UAAM,gBAAgB,IAAI,WAAW;AAAA,MACnC,QAAQ;AAAA,MACR,QAAQ;AAAA,QACN;AAAA,UACE,KAAK;AAAA,UACL,MAAM;AAAA,UACN,MAAM;AAAA,UACN,WAAW,CAAC,EAAC,MAAM,KAAK,OAAO,QAAO,CAAC;AAAA,QACzC;AAAA,QAAG;AAAA,UACD,KAAK;AAAA,UACL,MAAM;AAAA,UACN,MAAM;AAAA,UACN,WAAW;AAAA,YACT,EAAC,MAAM,KAAK,OAAO,0BAAyB;AAAA,YAC5C,EAAC,MAAM,KAAK,OAAO,aAAY;AAAA,UACjC;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAED,UAAM,qBAAqB,IAAI,WAAW;AAAA,MACxC,QAAQ;AAAA,MACR,QAAQ;AAAA,QACN;AAAA,UACE,KAAK;AAAA,UACL,MAAM;AAAA,UACN,MAAM;AAAA,UACN,WAAW,CAAC,EAAC,MAAM,KAAK,OAAO,QAAO,CAAC;AAAA,QACzC;AAAA,MACF;AAAA,IACF,CAAC;AAED,OAAG,iCAAiC,YAAY;AAC9C,YAAM,YAAY,MAAM,iBAAiB,MAAM;AAC/C,YAAM,EAAC,OAAO,QAAO,IAAI,MAAM,UAAU,SAAS,WAAW;AAC7D,aAAO,UAAU,EAAC,OAAO,QAAO,GAAG,EAAC,OAAO,MAAM,SAAS,CAAC,EAAC,CAAC;AAAA,IAC/D,CAAC;AAED,OAAG,mCAAmC,YAAY;AAChD,YAAM,YAAY,MAAM,iBAAiB,MAAM;AAC/C,YAAM,EAAC,OAAO,QAAO,IAAI,MAAM,UAAU,SAAS,aAAa;AAC/D,aAAO,UAAU,EAAC,OAAO,QAAO,GAAG,EAAC,OAAO,OAAO,SAAS,CAAC,+BAA+B,EAAC,CAAC;AAAA,IAC/F,CAAC;AAED,OAAG,0BAA0B,YAAY;AACvC,YAAM,YAAY,MAAM,iBAAiB,MAAM;AAC/C,YAAM,UAAU,IAAI,aAAa;AACjC,aAAO,MAAM,cAAc,SAAS,kBAAkB,GAAG,IAAI;AAAA,IAC/D,CAAC;AAAA,EACH,CAAC;AAGD,WAAS,qDAAqD,MAAM;AAClE,UAAM,SAAS;AAAA,MACb;AAAA,QACE,KAAK;AAAA,QACL,WAAW,CAAC,EAAC,MAAM,QAAQ,OAAO,6BAA4B,CAAC;AAAA,MACjE;AAAA,IACF;AAEA,UAAM,cAAc,IAAI,WAAW;AAAA,MACjC,QAAQ;AAAA,MACR,QAAQ;AAAA,QACN;AAAA,UACE,KAAK;AAAA,UACL,MAAM;AAAA,UACN,MAAM;AAAA,UACN,WAAW,CAAC,EAAC,MAAM,KAAK,OAAO,QAAO,CAAC;AAAA,QACzC;AAAA,QAAG;AAAA,UACD,KAAK;AAAA,UACL,MAAM;AAAA,UACN,MAAM;AAAA,UACN,WAAW;AAAA,YACT,EAAC,MAAM,KAAK,OAAO,0BAAyB;AAAA,YAC5C,EAAC,MAAM,KAAK,OAAO,MAAK;AAAA,UAC1B;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAED,UAAM,gBAAgB,IAAI,WAAW;AAAA,MACnC,QAAQ;AAAA,MACR,QAAQ;AAAA,QACN;AAAA,UACE,KAAK;AAAA,UACL,MAAM;AAAA,UACN,MAAM;AAAA,UACN,WAAW,CAAC,EAAC,MAAM,KAAK,OAAO,QAAO,CAAC;AAAA,QACzC;AAAA,QAAG;AAAA,UACD,KAAK;AAAA,UACL,MAAM;AAAA,UACN,MAAM;AAAA,UACN,WAAW;AAAA,YACT,EAAC,MAAM,KAAK,OAAO,0BAAyB;AAAA,YAC5C,EAAC,MAAM,KAAK,OAAO,MAAK;AAAA,UAC1B;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAED,UAAM,qBAAqB,IAAI,WAAW;AAAA,MACxC,QAAQ;AAAA,MACR,QAAQ;AAAA,QACN;AAAA,UACE,KAAK;AAAA,UACL,MAAM;AAAA,UACN,MAAM;AAAA,UACN,WAAW,CAAC,EAAC,MAAM,KAAK,OAAO,QAAO,CAAC;AAAA,QACzC;AAAA,QAAG;AAAA,UACD,KAAK;AAAA,UACL,MAAM;AAAA,UACN,MAAM;AAAA,UACN,WAAW,CAAC,EAAC,MAAM,KAAK,OAAO,MAAK,CAAC;AAAA,QACvC;AAAA,QAAG;AAAA,UACD,KAAK;AAAA,UACL,MAAM;AAAA,UACN,MAAM;AAAA,UACN,WAAW,CAAC,EAAC,MAAM,KAAK,OAAO,MAAK,CAAC;AAAA,QACvC;AAAA,QAAG;AAAA,UACD,KAAK;AAAA,UACL,MAAM;AAAA,UACN,MAAM;AAAA,UACN,WAAW,CAAC,EAAC,MAAM,KAAK,OAAO,MAAK,CAAC;AAAA,QACvC;AAAA,QAAG;AAAA,UACD,KAAK;AAAA,UACL,MAAM;AAAA,UACN,MAAM;AAAA,UACN,WAAW,CAAC,EAAC,MAAM,KAAK,OAAO,MAAK,CAAC;AAAA,QACvC;AAAA,QAAG;AAAA,UACD,KAAK;AAAA,UACL,MAAM;AAAA,UACN,MAAM;AAAA,UACN,WAAW,CAAC,EAAC,MAAM,KAAK,OAAO,MAAK,CAAC;AAAA,QACvC;AAAA,MACF;AAAA,IACF,CAAC;AAED,UAAM,qBAAqB,IAAI,WAAW;AAAA,MACxC,QAAQ;AAAA,MACR,QAAQ;AAAA,QACN;AAAA,UACE,KAAK;AAAA,UACL,MAAM;AAAA,UACN,MAAM;AAAA,UACN,WAAW,CAAC,EAAC,MAAM,KAAK,OAAO,QAAO,CAAC;AAAA,QACzC;AAAA,MACF;AAAA,IACF,CAAC;AAED,OAAG,iCAAiC,YAAY;AAC9C,YAAM,YAAY,MAAM,iBAAiB,MAAM;AAC/C,YAAM,EAAC,OAAO,QAAO,IAAI,MAAM,UAAU,SAAS,WAAW;AAC7D,aAAO,UAAU,EAAC,OAAO,QAAO,GAAG,EAAC,OAAO,MAAM,SAAS,CAAC,EAAC,CAAC;AAAA,IAC/D,CAAC;AAED,OAAG,mCAAmC,YAAY;AAChD,YAAM,YAAY,MAAM,iBAAiB,MAAM;AAC/C,YAAM,EAAC,OAAO,QAAO,IAAI,MAAM,UAAU,SAAS,aAAa;AAC/D,aAAO,UAAU,EAAC,OAAO,QAAO,GAAG,EAAC,OAAO,OAAO,SAAS,CAAC,+BAA+B,EAAC,CAAC;AAAA,IAC/F,CAAC;AAED,OAAG,mCAAmC,YAAY;AAChD,YAAM,YAAY,MAAM,iBAAiB,MAAM;AAC/C,YAAM,EAAC,OAAO,QAAO,IAAI,MAAM,UAAU,SAAS,kBAAkB;AACpE,aAAO,UAAU,EAAC,OAAO,QAAO,GAAG,EAAC,OAAO,OAAO,SAAS;AAAA,QACzD;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAC,CAAC;AAAA,IACJ,CAAC;AAED,OAAG,gCAAgC,YAAY;AAC7C,YAAM,YAAY,MAAM,iBAAiB,MAAM;AAC/C,YAAM,UAAU,IAAI,kBAAkB;AACtC,aAAO,MAAM,mBAAmB,SAAS,kBAAkB,GAAG,IAAI;AAAA,IACpE,CAAC;AAED,OAAG,0BAA0B,YAAY;AACvC,YAAM,YAAY,MAAM,iBAAiB,MAAM;AAC/C,YAAM,UAAU,IAAI,aAAa;AACjC,aAAO,MAAM,cAAc,SAAS,kBAAkB,GAAG,IAAI;AAAA,IAC/D,CAAC;AAAA,EACH,CAAC;AAGD,WAAS,mCAAmC,MAAM;AAChD,UAAM,YAAY;AAAA,MAChB;AAAA,QACE,KAAK;AAAA,QACL,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAEA,UAAM,cAAc;AAAA,MAClB;AAAA,QACE,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,IACF;AAEA,UAAM,cAAc,IAAI,WAAW;AAAA,MACjC,QAAQ;AAAA,MACR,QAAQ;AAAA,QACN;AAAA,UACE,KAAK;AAAA,UACL,MAAM;AAAA,UACN,MAAM;AAAA,UACN,WAAW;AAAA,YACT,EAAC,MAAM,KAAK,OAAO,0BAAyB;AAAA,YAC5C,EAAC,MAAM,KAAK,OAAO,aAAY;AAAA,UACjC;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAED,UAAM,mBAAmB,IAAI,WAAW;AAAA,MACtC,QAAQ;AAAA,MACR,QAAQ;AAAA,QACN;AAAA,UACE,KAAK;AAAA,UACL,MAAM;AAAA,UACN,MAAM;AAAA,UACN,WAAW,CAAC,EAAC,MAAM,KAAK,OAAO,QAAO,CAAC;AAAA,QACzC;AAAA,QAAG;AAAA,UACD,KAAK;AAAA,UACL,MAAM;AAAA,UACN,MAAM;AAAA,UACN,WAAW;AAAA,YACT,EAAC,MAAM,KAAK,OAAO,0BAAyB;AAAA,YAC5C,EAAC,MAAM,KAAK,OAAO,aAAY;AAAA,UACjC;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAED,UAAM,qBAAqB,IAAI,WAAW;AAAA,MACxC,QAAQ;AAAA,MACR,QAAQ;AAAA,QACN;AAAA,UACE,KAAK;AAAA,UACL,MAAM;AAAA,UACN,MAAM;AAAA,UACN,WAAW,CAAC,EAAC,MAAM,KAAK,OAAO,QAAO,CAAC;AAAA,QACzC;AAAA,QAAG;AAAA,UACD,KAAK;AAAA,UACL,OAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF,CAAC;AAED,UAAM,qBAAqB,IAAI,WAAW;AAAA,MACxC,QAAQ;AAAA,MACR,QAAQ;AAAA,QACN;AAAA,UACE,KAAK;AAAA,UACL,MAAM;AAAA,UACN,MAAM;AAAA,UACN,WAAW,CAAC,EAAC,MAAM,KAAK,OAAO,QAAO,CAAC;AAAA,QACzC;AAAA,MACF;AAAA,IACF,CAAC;AAED,OAAG,sCAAsC,YAAY;AACnD,YAAM,YAAY,MAAM,iBAAiB,SAAS;AAClD,YAAM,EAAC,OAAO,QAAO,IAAI,MAAM,UAAU,SAAS,WAAW;AAC7D,aAAO,UAAU,EAAC,OAAO,QAAO,GAAG,EAAC,OAAO,MAAM,SAAS,CAAC,EAAC,CAAC;AAAA,IAC/D,CAAC;AAED,OAAG,kCAAkC,YAAY;AAC/C,YAAM,YAAY,MAAM,iBAAiB,WAAW;AACpD,YAAM,EAAC,OAAO,QAAO,IAAI,MAAM,UAAU,SAAS,WAAW;AAC7D,aAAO,UAAU,EAAC,OAAO,QAAO,GAAG,EAAC,OAAO,MAAM,SAAS,CAAC,EAAC,CAAC;AAAA,IAC/D,CAAC;AAED,OAAG,kCAAkC,YAAY;AAC/C,YAAM,YAAY,MAAM,iBAAiB,SAAS;AAClD,YAAM,EAAC,OAAO,QAAO,IAAI,MAAM,UAAU,SAAS,gBAAgB;AAClE,aAAO,UAAU,EAAC,OAAO,QAAO,GAAG,EAAC,OAAO,OAAO,SAAS,CAAC,+BAA+B,EAAC,CAAC;AAAA,IAC/F,CAAC;AAED,OAAG,oCAAoC,YAAY;AACjD,YAAM,YAAY,MAAM,iBAAiB,WAAW;AACpD,YAAM,EAAC,OAAO,QAAO,IAAI,MAAM,UAAU,SAAS,kBAAkB;AACpE,aAAO,UAAU,EAAC,OAAO,QAAO,GAAG,EAAC,OAAO,OAAO,SAAS,CAAC,+BAA+B,EAAC,CAAC;AAAA,IAC/F,CAAC;AAED,OAAG,gCAAgC,YAAY;AAC7C,YAAM,YAAY,MAAM,iBAAiB,SAAS;AAClD,YAAM,UAAU,IAAI,gBAAgB;AACpC,aAAO,MAAM,iBAAiB,SAAS,kBAAkB,GAAG,IAAI;AAAA,IAClE,CAAC;AAED,OAAG,kCAAkC,YAAY;AAC/C,YAAM,YAAY,MAAM,iBAAiB,WAAW;AACpD,YAAM,UAAU,IAAI,kBAAkB;AACtC,aAAO,MAAM,mBAAmB,SAAS,kBAAkB,GAAG,IAAI;AAAA,IACpE,CAAC;AAAA,EACH,CAAC;AAED,WAAS,gBAAgB,MAAM;AAC7B,OAAG,uDAAuD,YAAY;AACpE,YAAM,SAAS;AAAA,QACb;AAAA,UACE,KAAK;AAAA,UACL,cAAc,CAAC,EAAC,QAAQ,UAAS,CAAC;AAAA,QACpC;AAAA,MACF;AAEA,YAAM,SAAS,IAAI,WAAW;AAAA,QAC5B,QAAQ;AAAA,QACR,QAAQ;AAAA,UACN;AAAA,YACE,KAAK;AAAA,YACL,MAAM;AAAA,YACN,MAAM;AAAA,YACN,WAAW,CAAC,EAAC,MAAM,KAAK,OAAO,QAAO,CAAC;AAAA,UACzC;AAAA,QACF;AAAA,MACF,CAAC;AAED,YAAM,YAAY,MAAM,iBAAiB,MAAM;AAC/C,YAAM,EAAC,OAAO,QAAO,IAAI,MAAM,UAAU,SAAS,MAAM;AAExD,aAAO,UAAU,EAAC,OAAO,QAAO,GAAG,EAAC,OAAO,OAAO,SAAS,CAAC,+BAA+B,EAAC,CAAC;AAAA,IAC/F,CAAC;AAAA,EACH,CAAC;AACH,CAAC;",
6
+ "names": []
7
+ }
@@ -1,100 +1,89 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = _default;
7
- // Configuration specification
8
1
  const confSpec = {
9
2
  leader: {
10
3
  // Description: Leader pattern
11
- type: 'RegExp',
12
- excl: ['tag', 'valuePattern', 'subfields', 'ind1', 'ind2']
4
+ type: "RegExp",
5
+ excl: ["tag", "valuePattern", "subfields", "ind1", "ind2"]
13
6
  },
14
7
  tag: {
15
8
  // Description: Field tag pattern
16
- type: 'RegExp',
17
- excl: ['leader']
9
+ type: "RegExp",
10
+ excl: ["leader"]
18
11
  },
19
12
  valuePattern: {
20
13
  // Description: Pattern to which the field's value must match against
21
- type: 'RegExp',
22
- excl: ['leader', 'subfields', 'ind1', 'ind2']
14
+ type: "RegExp",
15
+ excl: ["leader", "subfields", "ind1", "ind2"]
23
16
  },
24
17
  ind1: {
25
18
  // Description: Indicator-specific configuration object
26
- type: 'RegExp',
19
+ type: "RegExp",
27
20
  // Array<Indicator>
28
- excl: ['leader', 'value']
21
+ excl: ["leader", "value"]
29
22
  },
30
23
  ind2: {
31
24
  // Description: Indicator-specific configuration object
32
- type: 'RegExp',
25
+ type: "RegExp",
33
26
  // Array<Indicator>
34
- excl: ['leader', 'value']
27
+ excl: ["leader", "value"]
35
28
  },
36
29
  strict: {
37
30
  // Description: Only the specified subfields are allowed if set to true. Defaults to false.
38
- type: 'boolean',
39
- excl: ['leader', 'valuePattern']
31
+ type: "boolean",
32
+ excl: ["leader", "valuePattern"]
40
33
  },
41
34
  subfields: {
42
35
  // Description: Subfields configuration
43
- type: 'object',
36
+ type: "object",
44
37
  // Object<String, Subfield> (Keys are subfield codes)
45
- contains: ['String', 'subfieldSpec'],
46
- excl: ['leader', 'value']
38
+ contains: ["String", "subfieldSpec"],
39
+ excl: ["leader", "value"]
47
40
  },
48
41
  dependencies: {
49
42
  // Description: Dependencies configuration
50
- type: 'array',
43
+ type: "array",
51
44
  // Array<Dependency>
52
- contains: 'dependencySpec'
45
+ contains: "dependencySpec"
53
46
  }
54
47
  };
55
-
56
- // Subfiled specification
57
48
  const subSpec = {
58
49
  pattern: {
59
50
  // Description: Pattern to which the subfield's value must match against
60
- type: 'RegExp'
51
+ type: "RegExp"
61
52
  },
62
53
  required: {
63
54
  // Description: Whether the subfield is mandatory or not. Defaults to false
64
- type: 'boolean'
55
+ type: "boolean"
65
56
  },
66
57
  maxOccurrence: {
67
58
  // Description: Maximum number of times this subfield can occur. Defaults to unlimited if omitted. The value 0 means that the subfield cannot exist.
68
- type: 'number'
59
+ type: "number"
69
60
  }
70
61
  };
71
-
72
- // Dependency specification
73
62
  const depSpec = {
74
63
  leader: {
75
64
  // Description: Leader pattern
76
- type: 'RegExp',
77
- excl: ['tag', 'valuePattern', 'subfields', 'ind1', 'ind2']
65
+ type: "RegExp",
66
+ excl: ["tag", "valuePattern", "subfields", "ind1", "ind2"]
78
67
  },
79
68
  tag: {
80
69
  // Description: Field tag pattern
81
70
  type: RegExp,
82
- excl: ['leader']
71
+ excl: ["leader"]
83
72
  },
84
73
  ind1: {
85
74
  // Description: Pattern to which the indicator must match against
86
75
  type: RegExp,
87
- excl: ['value', 'leader']
76
+ excl: ["value", "leader"]
88
77
  },
89
78
  ind2: {
90
79
  // Description: Pattern to which the indicator must match against
91
80
  type: RegExp,
92
- excl: ['value', 'leader']
81
+ excl: ["value", "leader"]
93
82
  },
94
83
  valuePattern: {
95
84
  // Description: Pattern to which the field's value must match agains
96
85
  type: RegExp,
97
- excl: ['subfields', 'ind1', 'ind2', 'leader']
86
+ excl: ["subfields", "ind1", "ind2", "leader"]
98
87
  },
99
88
  subfields: {
100
89
  // Description: An object with subfield codes as keys and RegExp patterns as values. The subfield value must this pattern.
@@ -106,59 +95,45 @@ const depSpec = {
106
95
  function forEach(obj, fun) {
107
96
  Object.entries(obj).forEach(fun);
108
97
  }
109
- function _default(config) {
98
+ export default function(config) {
110
99
  if (!Array.isArray(config)) {
111
- throw new TypeError('Configuration array not provided');
100
+ throw new TypeError("Configuration array not provided");
112
101
  }
113
102
  configValid(config);
114
103
  return {
115
- description: 'Check whether the configured fields have valid structure',
116
- validate: record => ({
104
+ description: "Check whether the configured fields have valid structure",
105
+ validate: (record) => ({
117
106
  valid: recordMatchesConfig(record, config, false)
118
107
  })
119
108
  };
120
-
121
- // This checks that configuration is valid
122
- function configValid(config) {
123
- config.forEach(obj => {
124
- const excluded = []; // Validate fields: check that they are valid to confSpec (exists, correct data type), concat excluded elements
125
-
109
+ function configValid(config2) {
110
+ config2.forEach((obj) => {
111
+ const excluded = [];
126
112
  forEach(obj, ([key, val]) => {
127
113
  configMatchesSpec(val, key, confSpec);
128
-
129
- // Concat all excluded elements to array
130
114
  if (confSpec[key].excl) {
131
115
  excluded.push(...confSpec[key].excl);
132
116
  }
133
117
  });
134
-
135
- // Check that no excluded elements are in use
136
118
  forEach(obj, ([key]) => {
137
119
  if (excluded.includes(key)) {
138
- throw new Error('Configuration not valid - excluded element');
120
+ throw new Error("Configuration not valid - excluded element");
139
121
  }
140
122
  });
141
123
  });
142
124
  }
143
-
144
- // Recursive validator
145
125
  function configMatchesSpec(data, key, spec) {
146
- // Field not found in configuration spec
147
126
  if (!spec[key]) {
148
127
  throw new Error(`Configuration not valid - unidentified value: ${key}`);
149
128
  }
150
-
151
- // If configuration type does not match type in configuration spec
152
- if (typeof data !== spec[key].type && spec[key].type === 'RegExp' && !(data instanceof RegExp)) {
129
+ if (typeof data !== spec[key].type && (spec[key].type === "RegExp" && !(data instanceof RegExp))) {
153
130
  throw new Error(`Configuration not valid - invalid data type for: ${key}`);
154
131
  }
155
-
156
- // Check subfields/dependencies recursively
157
- if (key === 'subfields' || key === 'dependencies') {
132
+ if (key === "subfields" || key === "dependencies") {
158
133
  forEach(data, ([, subObj]) => {
159
- if (typeof subObj === 'object') {
134
+ if (typeof subObj === "object") {
160
135
  forEach(subObj, ([subKey, subVal]) => {
161
- configMatchesSpec(subVal, subKey, key === 'subfields' ? subSpec : depSpec);
136
+ configMatchesSpec(subVal, subKey, key === "subfields" ? subSpec : depSpec);
162
137
  });
163
138
  } else {
164
139
  throw new TypeError(`Configuration not valid - ${key} not object`);
@@ -166,15 +141,10 @@ function _default(config) {
166
141
  });
167
142
  }
168
143
  }
169
- /// /////////////////////////////////////////
170
-
171
- /// /////////////////////////////////////////
172
- // This is used to validate record against configuration
173
144
  function recordMatchesConfig(record, conf, dependencies) {
174
- // Parse trough every element of config array
175
- const res = conf.every(confObj => {
145
+ const res = conf.every((confObj) => {
176
146
  if (confObj.dependencies) {
177
- if (confObj.dependencies.every(dependency => recordMatchesConfigElement(record, dependency.tag, dependency, dependencies))) {
147
+ if (confObj.dependencies.every((dependency) => recordMatchesConfigElement(record, dependency.tag, dependency, dependencies))) {
178
148
  return recordMatchesConfigElement(record, confObj.tag, confObj, dependencies);
179
149
  }
180
150
  return true;
@@ -183,65 +153,43 @@ function _default(config) {
183
153
  });
184
154
  return res;
185
155
  }
186
-
187
- // Recursive validation function
188
156
  function recordMatchesConfigElement(record, searchedField, confObj, dependencies) {
189
157
  const foundFields = record.get(searchedField);
190
- // If field has dependencies and fields matching configuration is not found
191
158
  if (foundFields.length === 0 && confObj.dependencies) {
192
159
  return false;
193
160
  }
194
-
195
- // Parse trough record objects matching provided configuration object
196
- // Check that every configuration field exists in record and matches configuration
197
- return foundFields.every(recordSubObj => Object.keys(confObj).every(confField => {
198
- // If configuration field is RegExp, test that record field matches it (valuePattern, leader, tag, ind*)
161
+ return foundFields.every((recordSubObj) => Object.keys(confObj).every((confField) => {
199
162
  if (confObj[confField] instanceof RegExp) {
200
- // 'valuePattern' RegExp in conf spec is used to validate 'value' in marc
201
- if (confField === 'valuePattern') {
163
+ if (confField === "valuePattern") {
202
164
  return confObj[confField].test(recordSubObj.value);
203
165
  }
204
- if (confField === 'leader') {
166
+ if (confField === "leader") {
205
167
  return confObj[confField].test(record.leader);
206
168
  }
207
169
  return confObj[confField].test(recordSubObj[confField]);
208
170
  }
209
-
210
- // Only the specified subfields are allowed if set to true. Defaults to false. (this is checked at subfields)
211
- if (confField === 'strict') {
171
+ if (confField === "strict") {
212
172
  return true;
213
173
  }
214
-
215
- // Check that subfield stuff
216
- if (confField === 'subfields') {
217
- const strict = confObj.strict || false; // Defaults to false
174
+ if (confField === "subfields") {
175
+ const strict = confObj.strict || false;
218
176
  let elementsTotal = 0;
219
177
  const valid = !Object.entries(confObj.subfields).some(([key, val]) => {
220
- const matching = recordSubObj.subfields.filter(({
221
- code
222
- }) => code === key);
223
- elementsTotal += matching.length; // Calculate amount of record objects matching all confObj objects
224
-
178
+ const matching = recordSubObj.subfields.filter(({ code }) => code === key);
179
+ elementsTotal += matching.length;
225
180
  const maxOccurrenceFine = matching.length > val.maxOccurrence;
226
181
  const isRequiredFine = (val.required || dependencies) && matching.length === 0;
227
- const valuePatternFine = val.pattern && !matching.every(field => val.pattern.test(field.value));
182
+ const valuePatternFine = val.pattern && !matching.every((field) => val.pattern.test(field.value));
228
183
  return maxOccurrenceFine || isRequiredFine || valuePatternFine;
229
184
  });
230
-
231
- // Check if there is less valid calculated objects than objects in subfield object => some not matching strict
232
185
  return !(strict && elementsTotal < recordSubObj.subfields.length) && valid;
233
186
  }
234
-
235
- // Recursive check for dependicies
236
- if (confField === 'dependencies') {
187
+ if (confField === "dependencies") {
237
188
  return recordMatchesConfig(record, confObj[confField], true);
238
189
  }
239
-
240
- // This should not be reached as configuration is validated
241
-
242
- console.log('!!! Configuration field not identified: ', recordSubObj[confField], ' | ', typeof recordSubObj[confField]); // eslint-disable-line no-console
190
+ console.log("!!! Configuration field not identified: ", recordSubObj[confField], " | ", typeof recordSubObj[confField]);
243
191
  return false;
244
192
  }));
245
193
  }
246
194
  }
247
- //# sourceMappingURL=field-structure.js.map
195
+ //# sourceMappingURL=field-structure.js.map
@@ -1 +1,7 @@
1
- {"version":3,"file":"field-structure.js","names":["confSpec","leader","type","excl","tag","valuePattern","ind1","ind2","strict","subfields","contains","dependencies","subSpec","pattern","required","maxOccurrence","depSpec","RegExp","Object","forEach","obj","fun","entries","_default","config","Array","isArray","TypeError","configValid","description","validate","record","valid","recordMatchesConfig","excluded","key","val","configMatchesSpec","push","includes","Error","data","spec","subObj","subKey","subVal","conf","res","every","confObj","dependency","recordMatchesConfigElement","searchedField","foundFields","get","length","recordSubObj","keys","confField","test","value","elementsTotal","some","matching","filter","code","maxOccurrenceFine","isRequiredFine","valuePatternFine","field","console","log"],"sources":["../src/field-structure.js"],"sourcesContent":["// Configuration specification\nconst confSpec = {\n leader: { // Description: Leader pattern\n type: 'RegExp',\n excl: ['tag', 'valuePattern', 'subfields', 'ind1', 'ind2']\n },\n tag: { // Description: Field tag pattern\n type: 'RegExp',\n excl: ['leader']\n },\n valuePattern: { // Description: Pattern to which the field's value must match against\n type: 'RegExp',\n excl: ['leader', 'subfields', 'ind1', 'ind2']\n },\n ind1: { // Description: Indicator-specific configuration object\n type: 'RegExp', // Array<Indicator>\n excl: ['leader', 'value']\n },\n ind2: { // Description: Indicator-specific configuration object\n type: 'RegExp', // Array<Indicator>\n excl: ['leader', 'value']\n },\n strict: { // Description: Only the specified subfields are allowed if set to true. Defaults to false.\n type: 'boolean',\n excl: ['leader', 'valuePattern']\n },\n subfields: { // Description: Subfields configuration\n type: 'object', // Object<String, Subfield> (Keys are subfield codes)\n contains: ['String', 'subfieldSpec'],\n excl: ['leader', 'value']\n },\n dependencies: { // Description: Dependencies configuration\n type: 'array', // Array<Dependency>\n contains: 'dependencySpec'\n }\n};\n\n// Subfiled specification\nconst subSpec = {\n pattern: { // Description: Pattern to which the subfield's value must match against\n type: 'RegExp'\n },\n required: { // Description: Whether the subfield is mandatory or not. Defaults to false\n type: 'boolean'\n },\n maxOccurrence: { // Description: Maximum number of times this subfield can occur. Defaults to unlimited if omitted. The value 0 means that the subfield cannot exist.\n type: 'number'\n }\n};\n\n// Dependency specification\nconst depSpec = {\n leader: { // Description: Leader pattern\n type: 'RegExp',\n excl: ['tag', 'valuePattern', 'subfields', 'ind1', 'ind2']\n },\n tag: { // Description: Field tag pattern\n type: RegExp,\n excl: ['leader']\n },\n ind1: { // Description: Pattern to which the indicator must match against\n type: RegExp,\n excl: ['value', 'leader']\n },\n ind2: { // Description: Pattern to which the indicator must match against\n type: RegExp,\n excl: ['value', 'leader']\n },\n valuePattern: { // Description: Pattern to which the field's value must match agains\n type: RegExp,\n excl: ['subfields', 'ind1', 'ind2', 'leader']\n },\n subfields: { // Description: An object with subfield codes as keys and RegExp patterns as values. The subfield value must this pattern.\n type: Object, // [String, RegExp]\n required: false\n }\n};\n\nfunction forEach(obj, fun) {\n Object.entries(obj).forEach(fun);\n}\n\nexport default function (config) {\n if (!Array.isArray(config)) {\n throw new TypeError('Configuration array not provided');\n }\n\n configValid(config);\n\n return {\n description:\n 'Check whether the configured fields have valid structure',\n validate: record => ({\n valid: recordMatchesConfig(record, config, false)\n })\n };\n\n // This checks that configuration is valid\n function configValid(config) {\n config.forEach(obj => {\n const excluded = []; // Validate fields: check that they are valid to confSpec (exists, correct data type), concat excluded elements\n\n forEach(obj, ([key, val]) => {\n configMatchesSpec(val, key, confSpec);\n\n // Concat all excluded elements to array\n if (confSpec[key].excl) {\n excluded.push(...confSpec[key].excl);\n }\n });\n\n // Check that no excluded elements are in use\n forEach(obj, ([key]) => {\n if (excluded.includes(key)) {\n throw new Error('Configuration not valid - excluded element');\n }\n });\n });\n }\n\n // Recursive validator\n function configMatchesSpec(data, key, spec) {\n // Field not found in configuration spec\n if (!spec[key]) {\n throw new Error(`Configuration not valid - unidentified value: ${key}`);\n }\n\n // If configuration type does not match type in configuration spec\n if (typeof data !== spec[key].type &&\n (spec[key].type === 'RegExp' && !(data instanceof RegExp))) {\n throw new Error(`Configuration not valid - invalid data type for: ${key}`);\n }\n\n // Check subfields/dependencies recursively\n if (key === 'subfields' || key === 'dependencies') {\n forEach(data, ([, subObj]) => {\n if (typeof subObj === 'object') {\n forEach(subObj, ([subKey, subVal]) => {\n configMatchesSpec(subVal, subKey, key === 'subfields' ? subSpec : depSpec);\n });\n } else {\n throw new TypeError(`Configuration not valid - ${key} not object`);\n }\n });\n }\n }\n /// /////////////////////////////////////////\n\n /// /////////////////////////////////////////\n // This is used to validate record against configuration\n function recordMatchesConfig(record, conf, dependencies) {\n // Parse trough every element of config array\n const res = conf.every(confObj => {\n if (confObj.dependencies) {\n if (confObj.dependencies.every(dependency => recordMatchesConfigElement(record, dependency.tag, dependency, dependencies))) {\n return recordMatchesConfigElement(record, confObj.tag, confObj, dependencies);\n }\n\n return true;\n }\n\n return recordMatchesConfigElement(record, confObj.tag, confObj, dependencies);\n });\n\n return res;\n }\n\n // Recursive validation function\n function recordMatchesConfigElement(record, searchedField, confObj, dependencies) {\n const foundFields = record.get(searchedField);\n // If field has dependencies and fields matching configuration is not found\n if (foundFields.length === 0 && confObj.dependencies) {\n return false;\n }\n\n // Parse trough record objects matching provided configuration object\n // Check that every configuration field exists in record and matches configuration\n return foundFields.every(recordSubObj => Object.keys(confObj).every(confField => {\n // If configuration field is RegExp, test that record field matches it (valuePattern, leader, tag, ind*)\n if (confObj[confField] instanceof RegExp) {\n // 'valuePattern' RegExp in conf spec is used to validate 'value' in marc\n if (confField === 'valuePattern') {\n return confObj[confField].test(recordSubObj.value);\n }\n\n if (confField === 'leader') {\n return confObj[confField].test(record.leader);\n }\n\n return confObj[confField].test(recordSubObj[confField]);\n }\n\n // Only the specified subfields are allowed if set to true. Defaults to false. (this is checked at subfields)\n if (confField === 'strict') {\n return true;\n }\n\n // Check that subfield stuff\n if (confField === 'subfields') {\n const strict = confObj.strict || false; // Defaults to false\n let elementsTotal = 0;\n const valid = !Object.entries(confObj.subfields).some(([key, val]) => {\n const matching = recordSubObj.subfields.filter(({code}) => code === key);\n elementsTotal += matching.length; // Calculate amount of record objects matching all confObj objects\n\n const maxOccurrenceFine = matching.length > val.maxOccurrence;\n const isRequiredFine = (val.required || dependencies) && matching.length === 0;\n const valuePatternFine = val.pattern && !matching.every(field => val.pattern.test(field.value));\n return maxOccurrenceFine || isRequiredFine || valuePatternFine;\n });\n\n // Check if there is less valid calculated objects than objects in subfield object => some not matching strict\n return !(strict && elementsTotal < recordSubObj.subfields.length) && valid;\n }\n\n // Recursive check for dependicies\n if (confField === 'dependencies') {\n return recordMatchesConfig(record, confObj[confField], true);\n }\n\n // This should not be reached as configuration is validated\n\n console.log('!!! Configuration field not identified: ', recordSubObj[confField], ' | ', typeof recordSubObj[confField]); // eslint-disable-line no-console\n return false;\n }));\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/field-structure.js"],
4
+ "sourcesContent": ["// Configuration specification\nconst confSpec = {\n leader: { // Description: Leader pattern\n type: 'RegExp',\n excl: ['tag', 'valuePattern', 'subfields', 'ind1', 'ind2']\n },\n tag: { // Description: Field tag pattern\n type: 'RegExp',\n excl: ['leader']\n },\n valuePattern: { // Description: Pattern to which the field's value must match against\n type: 'RegExp',\n excl: ['leader', 'subfields', 'ind1', 'ind2']\n },\n ind1: { // Description: Indicator-specific configuration object\n type: 'RegExp', // Array<Indicator>\n excl: ['leader', 'value']\n },\n ind2: { // Description: Indicator-specific configuration object\n type: 'RegExp', // Array<Indicator>\n excl: ['leader', 'value']\n },\n strict: { // Description: Only the specified subfields are allowed if set to true. Defaults to false.\n type: 'boolean',\n excl: ['leader', 'valuePattern']\n },\n subfields: { // Description: Subfields configuration\n type: 'object', // Object<String, Subfield> (Keys are subfield codes)\n contains: ['String', 'subfieldSpec'],\n excl: ['leader', 'value']\n },\n dependencies: { // Description: Dependencies configuration\n type: 'array', // Array<Dependency>\n contains: 'dependencySpec'\n }\n};\n\n// Subfiled specification\nconst subSpec = {\n pattern: { // Description: Pattern to which the subfield's value must match against\n type: 'RegExp'\n },\n required: { // Description: Whether the subfield is mandatory or not. Defaults to false\n type: 'boolean'\n },\n maxOccurrence: { // Description: Maximum number of times this subfield can occur. Defaults to unlimited if omitted. The value 0 means that the subfield cannot exist.\n type: 'number'\n }\n};\n\n// Dependency specification\nconst depSpec = {\n leader: { // Description: Leader pattern\n type: 'RegExp',\n excl: ['tag', 'valuePattern', 'subfields', 'ind1', 'ind2']\n },\n tag: { // Description: Field tag pattern\n type: RegExp,\n excl: ['leader']\n },\n ind1: { // Description: Pattern to which the indicator must match against\n type: RegExp,\n excl: ['value', 'leader']\n },\n ind2: { // Description: Pattern to which the indicator must match against\n type: RegExp,\n excl: ['value', 'leader']\n },\n valuePattern: { // Description: Pattern to which the field's value must match agains\n type: RegExp,\n excl: ['subfields', 'ind1', 'ind2', 'leader']\n },\n subfields: { // Description: An object with subfield codes as keys and RegExp patterns as values. The subfield value must this pattern.\n type: Object, // [String, RegExp]\n required: false\n }\n};\n\nfunction forEach(obj, fun) {\n Object.entries(obj).forEach(fun);\n}\n\nexport default function (config) {\n if (!Array.isArray(config)) {\n throw new TypeError('Configuration array not provided');\n }\n\n configValid(config);\n\n return {\n description:\n 'Check whether the configured fields have valid structure',\n validate: record => ({\n valid: recordMatchesConfig(record, config, false)\n })\n };\n\n // This checks that configuration is valid\n function configValid(config) {\n config.forEach(obj => {\n const excluded = []; // Validate fields: check that they are valid to confSpec (exists, correct data type), concat excluded elements\n\n forEach(obj, ([key, val]) => {\n configMatchesSpec(val, key, confSpec);\n\n // Concat all excluded elements to array\n if (confSpec[key].excl) {\n excluded.push(...confSpec[key].excl);\n }\n });\n\n // Check that no excluded elements are in use\n forEach(obj, ([key]) => {\n if (excluded.includes(key)) {\n throw new Error('Configuration not valid - excluded element');\n }\n });\n });\n }\n\n // Recursive validator\n function configMatchesSpec(data, key, spec) {\n // Field not found in configuration spec\n if (!spec[key]) {\n throw new Error(`Configuration not valid - unidentified value: ${key}`);\n }\n\n // If configuration type does not match type in configuration spec\n if (typeof data !== spec[key].type &&\n (spec[key].type === 'RegExp' && !(data instanceof RegExp))) {\n throw new Error(`Configuration not valid - invalid data type for: ${key}`);\n }\n\n // Check subfields/dependencies recursively\n if (key === 'subfields' || key === 'dependencies') {\n forEach(data, ([, subObj]) => {\n if (typeof subObj === 'object') {\n forEach(subObj, ([subKey, subVal]) => {\n configMatchesSpec(subVal, subKey, key === 'subfields' ? subSpec : depSpec);\n });\n } else {\n throw new TypeError(`Configuration not valid - ${key} not object`);\n }\n });\n }\n }\n /// /////////////////////////////////////////\n\n /// /////////////////////////////////////////\n // This is used to validate record against configuration\n function recordMatchesConfig(record, conf, dependencies) {\n // Parse trough every element of config array\n const res = conf.every(confObj => {\n if (confObj.dependencies) {\n if (confObj.dependencies.every(dependency => recordMatchesConfigElement(record, dependency.tag, dependency, dependencies))) {\n return recordMatchesConfigElement(record, confObj.tag, confObj, dependencies);\n }\n\n return true;\n }\n\n return recordMatchesConfigElement(record, confObj.tag, confObj, dependencies);\n });\n\n return res;\n }\n\n // Recursive validation function\n function recordMatchesConfigElement(record, searchedField, confObj, dependencies) {\n const foundFields = record.get(searchedField);\n // If field has dependencies and fields matching configuration is not found\n if (foundFields.length === 0 && confObj.dependencies) {\n return false;\n }\n\n // Parse trough record objects matching provided configuration object\n // Check that every configuration field exists in record and matches configuration\n return foundFields.every(recordSubObj => Object.keys(confObj).every(confField => {\n // If configuration field is RegExp, test that record field matches it (valuePattern, leader, tag, ind*)\n if (confObj[confField] instanceof RegExp) {\n // 'valuePattern' RegExp in conf spec is used to validate 'value' in marc\n if (confField === 'valuePattern') {\n return confObj[confField].test(recordSubObj.value);\n }\n\n if (confField === 'leader') {\n return confObj[confField].test(record.leader);\n }\n\n return confObj[confField].test(recordSubObj[confField]);\n }\n\n // Only the specified subfields are allowed if set to true. Defaults to false. (this is checked at subfields)\n if (confField === 'strict') {\n return true;\n }\n\n // Check that subfield stuff\n if (confField === 'subfields') {\n const strict = confObj.strict || false; // Defaults to false\n let elementsTotal = 0;\n const valid = !Object.entries(confObj.subfields).some(([key, val]) => {\n const matching = recordSubObj.subfields.filter(({code}) => code === key);\n elementsTotal += matching.length; // Calculate amount of record objects matching all confObj objects\n\n const maxOccurrenceFine = matching.length > val.maxOccurrence;\n const isRequiredFine = (val.required || dependencies) && matching.length === 0;\n const valuePatternFine = val.pattern && !matching.every(field => val.pattern.test(field.value));\n return maxOccurrenceFine || isRequiredFine || valuePatternFine;\n });\n\n // Check if there is less valid calculated objects than objects in subfield object => some not matching strict\n return !(strict && elementsTotal < recordSubObj.subfields.length) && valid;\n }\n\n // Recursive check for dependicies\n if (confField === 'dependencies') {\n return recordMatchesConfig(record, confObj[confField], true);\n }\n\n // This should not be reached as configuration is validated\n\n console.log('!!! Configuration field not identified: ', recordSubObj[confField], ' | ', typeof recordSubObj[confField]); // eslint-disable-line no-console\n return false;\n }));\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["config"]
7
+ }