@natlibfi/marc-record-validators-melinda 11.6.7-alpha.1 → 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
package/dist/isbn-issn.js CHANGED
@@ -1,27 +1,16 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
- var _isbn = _interopRequireDefault(require("isbn3"));
8
- var _issnVerify = _interopRequireDefault(require("@natlibfi/issn-verify"));
9
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
10
- // handleInvalid: move invalid 020$a to 020$z, and invalid 022$a to 022$y
11
- var _default = ({
12
- hyphenateISBN = false,
13
- handleInvalid = false
14
- } = {}) => {
1
+ import ISBN from "isbn3";
2
+ import validateISSN from "@natlibfi/issn-verify";
3
+ export default ({ hyphenateISBN = false, handleInvalid = false } = {}) => {
15
4
  return {
16
5
  validate,
17
6
  fix,
18
- description: 'Validates ISBN and ISSN values'
7
+ description: "Validates ISBN and ISSN values"
19
8
  };
20
9
  function stringHasSpace(str) {
21
- return str.indexOf(' ') > -1;
10
+ return str.indexOf(" ") > -1;
22
11
  }
23
12
  function trimSpaces(value) {
24
- return value.replace(/^\s+/u, '').replace(/\s+$/u, '').replace(/\s+/gu, ' ');
13
+ return value.replace(/^\s+/u, "").replace(/\s+$/u, "").replace(/\s+/gu, " ");
25
14
  }
26
15
  function isMultiWord(inputString) {
27
16
  const trimmedString = trimSpaces(inputString);
@@ -29,86 +18,77 @@ var _default = ({
29
18
  }
30
19
  function getFirstWord(inputString) {
31
20
  const trimmedString = trimSpaces(inputString);
32
- const arr = trimmedString.split(' ');
21
+ const arr = trimmedString.split(" ");
33
22
  return arr[0];
34
23
  }
35
24
  function invalidISBN(isbn) {
36
25
  const isbnOnly = getFirstWord(isbn);
37
- const auditedIsbn = _isbn.default.audit(isbnOnly);
26
+ const auditedIsbn = ISBN.audit(isbnOnly);
38
27
  return !auditedIsbn.validIsbn;
39
28
  }
40
29
  function invalidSubfield(subfield) {
41
- if (subfield.code !== 'a') {
30
+ if (subfield.code !== "a") {
42
31
  return false;
43
32
  }
44
33
  return invalidISBN(subfield.value) || isMultiWord(subfield.value);
45
34
  }
46
35
  function invalidField020(field) {
47
- if (field.subfields && field.subfields.some(sf => invalidSubfield(sf))) {
36
+ if (field.subfields && field.subfields.some((sf) => invalidSubfield(sf))) {
48
37
  return true;
49
38
  }
50
39
  return false;
51
40
  }
52
41
  function subfieldsIsbnRequiresHyphenation(subfield) {
53
- if (!hyphenateISBN || !['a', 'z'].includes(subfield.code)) {
42
+ if (!hyphenateISBN || !["a", "z"].includes(subfield.code)) {
54
43
  return false;
55
44
  }
56
45
  const isbn = getFirstWord(subfield.value);
57
- if (subfield.code === 'a') {
46
+ if (subfield.code === "a") {
58
47
  return requiresHyphenation(isbn);
59
48
  }
60
-
61
- // $z is a bit hacky: hyphenation is required only iff valid and no '-' chars
62
- if (isbn.indexOf('-') > -1) {
49
+ if (isbn.indexOf("-") > -1) {
63
50
  return false;
64
51
  }
65
52
  return !invalidISBN(isbn);
66
- function requiresHyphenation(isbn) {
53
+ function requiresHyphenation(isbn2) {
67
54
  if (!hyphenateISBN) {
68
55
  return false;
69
56
  }
70
- // Handle old notation such as "978-952-396-001-5 (nid.)"
71
- const isbn2 = getFirstWord(isbn);
72
- if (invalidISBN(isbn2)) {
57
+ const isbn22 = getFirstWord(isbn2);
58
+ if (invalidISBN(isbn22)) {
73
59
  return false;
74
60
  }
75
- const parsedIsbn = _isbn.default.parse(isbn2);
76
- // Return true only if existing ISBN is a valid and hyphenated 10 or 13 digit ISBN:
77
- return !(isbn2 === parsedIsbn.isbn10h || isbn2 === parsedIsbn.isbn13h);
61
+ const parsedIsbn = ISBN.parse(isbn22);
62
+ return !(isbn22 === parsedIsbn.isbn10h || isbn22 === parsedIsbn.isbn13h);
78
63
  }
79
64
  }
80
65
  function getRelevantFields(record) {
81
- //return record.get(/^(?:020|022)$/u).filter(field => {
82
- return record.fields.filter(field => {
66
+ return record.fields.filter((field) => {
83
67
  if (!field.subfields) {
84
68
  return false;
85
69
  }
86
- // Check ISBN:
87
- if (field.tag === '020') {
70
+ if (field.tag === "020") {
88
71
  if (invalidField020(field)) {
89
- // checks multiwordness
90
72
  return true;
91
73
  }
92
74
  return fieldsIsbnRequiresHyphenation(field);
93
75
  }
94
-
95
- // Check ISSN:
96
- if (field.tag === '022') {
76
+ if (field.tag === "022") {
97
77
  if (invalidField022(field)) {
98
78
  return true;
99
79
  }
100
- const subfield = field.subfields.find(sf => sf.code === 'a' || sf.code === 'l');
101
- return !(0, _issnVerify.default)(subfield.value);
80
+ const subfield = field.subfields.find((sf) => sf.code === "a" || sf.code === "l");
81
+ return !validateISSN(subfield.value);
102
82
  }
103
83
  return false;
104
84
  });
105
85
  function fieldsIsbnRequiresHyphenation(field) {
106
- return field.subfields && field.subfields.some(sf => subfieldsIsbnRequiresHyphenation(sf));
86
+ return field.subfields && field.subfields.some((sf) => subfieldsIsbnRequiresHyphenation(sf));
107
87
  }
108
88
  function invalidField022(field) {
109
- const subfieldAorL = field.subfields.find(sf => sf.code === 'a' || sf.code === 'l');
110
- if (subfieldAorL === undefined) {
111
- const subfieldY = field.subfields.find(sf => sf.code === 'y');
89
+ const subfieldAorL = field.subfields.find((sf) => sf.code === "a" || sf.code === "l");
90
+ if (subfieldAorL === void 0) {
91
+ const subfieldY = field.subfields.find((sf) => sf.code === "y");
112
92
  if (subfieldY) {
113
93
  return false;
114
94
  }
@@ -120,135 +100,96 @@ var _default = ({
120
100
  function validate(record) {
121
101
  const fields = getRelevantFields(record);
122
102
  if (fields.length === 0) {
123
- return {
124
- valid: true
125
- };
103
+ return { valid: true };
126
104
  }
127
- return fields.map(field => {
128
- if (field.tag === '020') {
129
- const subfieldA = field.subfields.find(sf => sf.code === 'a');
105
+ return fields.map((field) => {
106
+ if (field.tag === "020") {
107
+ const subfieldA = field.subfields.find((sf) => sf.code === "a");
130
108
  if (subfieldA) {
131
- return {
132
- name: 'ISBN',
133
- value: subfieldA.value
134
- };
109
+ return { name: "ISBN", value: subfieldA.value };
135
110
  }
136
- const subfieldZ = field.subfields.find(sf => sf.code === 'z');
111
+ const subfieldZ = field.subfields.find((sf) => sf.code === "z");
137
112
  if (subfieldZ) {
138
- return {
139
- name: 'ISBN (subfield Z)',
140
- value: subfieldZ.value
141
- };
113
+ return { name: "ISBN (subfield Z)", value: subfieldZ.value };
142
114
  }
143
- return {
144
- name: 'ISBN',
145
- value: undefined
146
- };
115
+ return { name: "ISBN", value: void 0 };
147
116
  }
148
- return {
149
- name: 'ISSN',
150
- value: getISSN()
151
- };
117
+ return { name: "ISSN", value: getISSN() };
152
118
  function getISSN() {
153
- const subfieldAorL = field.subfields.find(sf => sf.code === 'a' || sf.code === 'l');
119
+ const subfieldAorL = field.subfields.find((sf) => sf.code === "a" || sf.code === "l");
154
120
  if (subfieldAorL) {
155
121
  return subfieldAorL.value;
156
122
  }
157
- return undefined;
123
+ return void 0;
158
124
  }
159
125
  }).reduce((acc, obj) => {
160
- const {
161
- name,
162
- value
163
- } = obj;
126
+ const { name, value } = obj;
164
127
  const msg = `${name} (${value}) is not valid`;
165
- return {
166
- ...acc,
167
- messages: acc.messages.concat(msg)
168
- };
169
- }, {
170
- valid: false,
171
- messages: []
172
- });
128
+ return { ...acc, messages: acc.messages.concat(msg) };
129
+ }, { valid: false, messages: [] });
173
130
  }
174
131
  function fix(record) {
175
- getRelevantFields(record).forEach(field => {
176
- if (field.tag === '020') {
177
- field.subfields.forEach(subfield => fixField020Subfield(field, subfield)); // eslint-disable-line array-callback-return
132
+ getRelevantFields(record).forEach((field) => {
133
+ if (field.tag === "020") {
134
+ field.subfields.forEach((subfield2) => fixField020Subfield(field, subfield2));
178
135
  return;
179
136
  }
180
- // 022 ISSN:
181
- const subfield = field.subfields.find(sf => sf.code === 'a' || sf.code === 'l');
137
+ const subfield = field.subfields.find((sf) => sf.code === "a" || sf.code === "l");
182
138
  if (subfield && handleInvalid) {
183
- // $a/$l => $y (bit overkill to add $z and remove $a/$l instead of just renaming)
184
- field.subfields.push({
185
- code: 'y',
186
- value: subfield.value
187
- });
139
+ field.subfields.push({ code: "y", value: subfield.value });
188
140
  record.removeSubfield(subfield, field);
189
141
  }
190
142
  });
191
143
  function fixField020Subfield(field, subfield) {
192
- split020A(); // subfield and field are in the scope
144
+ split020A();
193
145
  addHyphens(subfield);
194
- handleInvalidIsbn(field, subfield); // remove 020$a, add 020$z, Do this last, as it uses deletion
146
+ handleInvalidIsbn(field, subfield);
195
147
  return;
196
- function addHyphens(subfield) {
197
- if (!subfieldsIsbnRequiresHyphenation(subfield)) {
148
+ function addHyphens(subfield2) {
149
+ if (!subfieldsIsbnRequiresHyphenation(subfield2)) {
198
150
  return;
199
151
  }
200
- // ISBN is valid but is missing hyphens
201
- const normalizedValue = normalizeIsbnValue(subfield.value);
202
- if (normalizedValue !== undefined) {
203
- subfield.value = normalizedValue;
152
+ const normalizedValue = normalizeIsbnValue(subfield2.value);
153
+ if (normalizedValue !== void 0) {
154
+ subfield2.value = normalizedValue;
204
155
  }
205
156
  }
206
- function handleInvalidIsbn(field, subfield) {
207
- if (subfield.code !== 'a' || !handleInvalid) {
157
+ function handleInvalidIsbn(field2, subfield2) {
158
+ if (subfield2.code !== "a" || !handleInvalid) {
208
159
  return;
209
160
  }
210
- const head = getFirstWord(subfield.value);
161
+ const head = getFirstWord(subfield2.value);
211
162
  if (!invalidISBN(head)) {
212
163
  return;
213
164
  }
214
- // $a => $z (bit overkill to add $z and remove $a instead of just renaming, but too lazy to fix/test thorougly)
215
- field.subfields.push({
216
- code: 'z',
217
- value: subfield.value
218
- });
219
- record.removeSubfield(subfield, field);
165
+ field2.subfields.push({ code: "z", value: subfield2.value });
166
+ record.removeSubfield(subfield2, field2);
220
167
  }
221
168
  function split020A() {
222
- // Move non-initial words from $a to $q:
223
- if (subfield.code !== 'a') {
169
+ if (subfield.code !== "a") {
224
170
  return;
225
171
  }
226
172
  const value = trimSpaces(subfield.value);
227
- const position = value.indexOf(' ');
173
+ const position = value.indexOf(" ");
228
174
  if (position === -1) {
229
175
  return;
230
176
  }
231
177
  const head = getFirstWord(value);
232
178
  if (invalidISBN(head)) {
233
- // Don't split, if first word ain't ISBN
234
179
  return;
235
180
  }
236
181
  const tail = value.substring(position + 1);
237
182
  subfield.value = head;
238
- field.subfields.push({
239
- code: 'q',
240
- value: tail
241
- });
183
+ field.subfields.push({ code: "q", value: tail });
242
184
  }
243
185
  function normalizeIsbnValue(value) {
244
186
  const trimmedValue = getFirstWord(value);
245
- //const trimmedValue = trimISBN(value); // NB! This might lose information that should be stored in $q...
246
- const auditResult = _isbn.default.audit(trimmedValue);
187
+ const auditResult = ISBN.audit(trimmedValue);
247
188
  if (!auditResult.validIsbn) {
248
- return undefined;
189
+ return void 0;
249
190
  }
250
- const numbersOnly = trimmedValue.replace(/[^0-9Xx]+/ug, '');
251
- const parsedIsbn = _isbn.default.parse(trimmedValue);
191
+ const numbersOnly = trimmedValue.replace(/[^0-9Xx]+/ug, "");
192
+ const parsedIsbn = ISBN.parse(trimmedValue);
252
193
  if (hyphenateISBN) {
253
194
  return numbersOnly.length === 10 ? parsedIsbn.isbn10h : parsedIsbn.isbn13h;
254
195
  }
@@ -257,5 +198,4 @@ var _default = ({
257
198
  }
258
199
  }
259
200
  };
260
- exports.default = _default;
261
- //# sourceMappingURL=isbn-issn.js.map
201
+ //# sourceMappingURL=isbn-issn.js.map
@@ -1 +1,7 @@
1
- {"version":3,"file":"isbn-issn.js","names":["_isbn","_interopRequireDefault","require","_issnVerify","e","__esModule","default","_default","hyphenateISBN","handleInvalid","validate","fix","description","stringHasSpace","str","indexOf","trimSpaces","value","replace","isMultiWord","inputString","trimmedString","getFirstWord","arr","split","invalidISBN","isbn","isbnOnly","auditedIsbn","ISBN","audit","validIsbn","invalidSubfield","subfield","code","invalidField020","field","subfields","some","sf","subfieldsIsbnRequiresHyphenation","includes","requiresHyphenation","isbn2","parsedIsbn","parse","isbn10h","isbn13h","getRelevantFields","record","fields","filter","tag","fieldsIsbnRequiresHyphenation","invalidField022","find","validateISSN","subfieldAorL","undefined","subfieldY","length","valid","map","subfieldA","name","subfieldZ","getISSN","reduce","acc","obj","msg","messages","concat","forEach","fixField020Subfield","push","removeSubfield","split020A","addHyphens","handleInvalidIsbn","normalizedValue","normalizeIsbnValue","head","position","tail","substring","trimmedValue","auditResult","numbersOnly","isbn10","isbn13","exports"],"sources":["../src/isbn-issn.js"],"sourcesContent":["import ISBN from 'isbn3';\nimport validateISSN from '@natlibfi/issn-verify';\n\n// handleInvalid: move invalid 020$a to 020$z, and invalid 022$a to 022$y\nexport default ({hyphenateISBN = false, handleInvalid = false} = {}) => {\n return {\n validate, fix,\n description: 'Validates ISBN and ISSN values'\n };\n\n function stringHasSpace(str) {\n return str.indexOf(' ') > -1;\n }\n\n function trimSpaces(value) {\n return value.replace(/^\\s+/u, '').replace(/\\s+$/u, '').replace(/\\s+/gu, ' ');\n }\n\n function isMultiWord(inputString) {\n const trimmedString = trimSpaces(inputString);\n return stringHasSpace(trimmedString);\n }\n\n function getFirstWord(inputString) {\n const trimmedString = trimSpaces(inputString);\n const arr = trimmedString.split(' ');\n return arr[0];\n }\n\n function invalidISBN(isbn) {\n const isbnOnly = getFirstWord(isbn);\n const auditedIsbn = ISBN.audit(isbnOnly);\n return !auditedIsbn.validIsbn;\n }\n\n function invalidSubfield(subfield) {\n if (subfield.code !== 'a') {\n return false;\n }\n return invalidISBN(subfield.value) || isMultiWord(subfield.value);\n }\n\n\n function invalidField020(field) {\n if (field.subfields && field.subfields.some(sf => invalidSubfield(sf))) {\n return true;\n }\n return false;\n }\n\n function subfieldsIsbnRequiresHyphenation(subfield) {\n if (!hyphenateISBN || !['a', 'z'].includes(subfield.code)) {\n return false;\n }\n\n const isbn = getFirstWord(subfield.value);\n if (subfield.code === 'a') {\n return requiresHyphenation(isbn);\n }\n\n // $z is a bit hacky: hyphenation is required only iff valid and no '-' chars\n if (isbn.indexOf('-') > -1) {\n return false;\n }\n return !invalidISBN(isbn);\n\n function requiresHyphenation(isbn) {\n if (!hyphenateISBN) {\n return false;\n }\n // Handle old notation such as \"978-952-396-001-5 (nid.)\"\n const isbn2 = getFirstWord(isbn);\n\n if (invalidISBN(isbn2)) {\n return false;\n }\n\n const parsedIsbn = ISBN.parse(isbn2);\n // Return true only if existing ISBN is a valid and hyphenated 10 or 13 digit ISBN:\n return !(isbn2 === parsedIsbn.isbn10h || isbn2 === parsedIsbn.isbn13h);\n }\n }\n\n function getRelevantFields(record) {\n //return record.get(/^(?:020|022)$/u).filter(field => {\n return record.fields.filter(field => {\n if (!field.subfields) {\n return false;\n }\n // Check ISBN:\n if (field.tag === '020') {\n if (invalidField020(field)) { // checks multiwordness\n return true;\n }\n return fieldsIsbnRequiresHyphenation(field);\n }\n\n // Check ISSN:\n if (field.tag === '022') {\n if (invalidField022(field)) {\n return true;\n }\n\n const subfield = field.subfields.find(sf => sf.code === 'a' || sf.code === 'l');\n\n return !validateISSN(subfield.value);\n }\n return false;\n });\n\n function fieldsIsbnRequiresHyphenation(field) {\n return field.subfields && field.subfields.some(sf => subfieldsIsbnRequiresHyphenation(sf));\n }\n\n function invalidField022(field) {\n const subfieldAorL = field.subfields.find(sf => sf.code === 'a' || sf.code === 'l');\n\n if (subfieldAorL === undefined) {\n const subfieldY = field.subfields.find(sf => sf.code === 'y');\n if (subfieldY) {\n return false;\n }\n\n return true;\n }\n return false;\n }\n }\n\n function validate(record) {\n const fields = getRelevantFields(record);\n\n if (fields.length === 0) {\n return {valid: true};\n }\n\n return fields\n .map(field => {\n if (field.tag === '020') {\n const subfieldA = field.subfields.find(sf => sf.code === 'a');\n if (subfieldA) {\n return {name: 'ISBN', value: subfieldA.value};\n }\n const subfieldZ = field.subfields.find(sf => sf.code === 'z');\n if (subfieldZ) {\n return {name: 'ISBN (subfield Z)', value: subfieldZ.value};\n }\n\n return {name: 'ISBN', value: undefined};\n }\n\n return {name: 'ISSN', value: getISSN()};\n\n function getISSN() {\n const subfieldAorL = field.subfields.find(sf => sf.code === 'a' || sf.code === 'l');\n\n if (subfieldAorL) {\n return subfieldAorL.value;\n }\n\n return undefined;\n }\n })\n .reduce((acc, obj) => {\n const {name, value} = obj;\n const msg = `${name} (${value}) is not valid`;\n\n return {...acc, messages: acc.messages.concat(msg)};\n }, {valid: false, messages: []});\n }\n\n\n function fix(record) {\n getRelevantFields(record).forEach(field => {\n if (field.tag === '020') {\n field.subfields.forEach(subfield => fixField020Subfield(field, subfield)); // eslint-disable-line array-callback-return\n return;\n }\n // 022 ISSN:\n const subfield = field.subfields.find(sf => sf.code === 'a' || sf.code === 'l');\n if (subfield && handleInvalid) {\n // $a/$l => $y (bit overkill to add $z and remove $a/$l instead of just renaming)\n field.subfields.push({code: 'y', value: subfield.value});\n record.removeSubfield(subfield, field);\n }\n });\n\n\n function fixField020Subfield(field, subfield) {\n split020A(); // subfield and field are in the scope\n addHyphens(subfield);\n handleInvalidIsbn(field, subfield); // remove 020$a, add 020$z, Do this last, as it uses deletion\n return;\n\n function addHyphens(subfield) {\n if (!subfieldsIsbnRequiresHyphenation(subfield)) {\n return;\n }\n // ISBN is valid but is missing hyphens\n const normalizedValue = normalizeIsbnValue(subfield.value);\n if (normalizedValue !== undefined) {\n subfield.value = normalizedValue;\n }\n }\n\n function handleInvalidIsbn(field, subfield) {\n if (subfield.code !== 'a' || !handleInvalid) {\n return;\n }\n const head = getFirstWord(subfield.value);\n if (!invalidISBN(head)) {\n return;\n }\n // $a => $z (bit overkill to add $z and remove $a instead of just renaming, but too lazy to fix/test thorougly)\n field.subfields.push({code: 'z', value: subfield.value});\n record.removeSubfield(subfield, field);\n }\n\n function split020A() {\n // Move non-initial words from $a to $q:\n if (subfield.code !== 'a') {\n return;\n }\n const value = trimSpaces(subfield.value);\n const position = value.indexOf(' ');\n if (position === -1) {\n return;\n }\n const head = getFirstWord(value);\n if (invalidISBN(head)) { // Don't split, if first word ain't ISBN\n return;\n }\n const tail = value.substring(position + 1);\n subfield.value = head;\n field.subfields.push({code: 'q', value: tail});\n }\n\n function normalizeIsbnValue(value) {\n const trimmedValue = getFirstWord(value);\n //const trimmedValue = trimISBN(value); // NB! This might lose information that should be stored in $q...\n const auditResult = ISBN.audit(trimmedValue);\n if (!auditResult.validIsbn) {\n return undefined;\n }\n const numbersOnly = trimmedValue.replace(/[^0-9Xx]+/ug, '');\n const parsedIsbn = ISBN.parse(trimmedValue);\n if (hyphenateISBN) {\n return numbersOnly.length === 10 ? parsedIsbn.isbn10h : parsedIsbn.isbn13h;\n }\n return numbersOnly.length === 10 ? parsedIsbn.isbn10 : parsedIsbn.isbn13;\n }\n }\n }\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/isbn-issn.js"],
4
+ "sourcesContent": ["import ISBN from 'isbn3';\nimport validateISSN from '@natlibfi/issn-verify';\n\n// handleInvalid: move invalid 020$a to 020$z, and invalid 022$a to 022$y\nexport default ({hyphenateISBN = false, handleInvalid = false} = {}) => {\n return {\n validate, fix,\n description: 'Validates ISBN and ISSN values'\n };\n\n function stringHasSpace(str) {\n return str.indexOf(' ') > -1;\n }\n\n function trimSpaces(value) {\n return value.replace(/^\\s+/u, '').replace(/\\s+$/u, '').replace(/\\s+/gu, ' ');\n }\n\n function isMultiWord(inputString) {\n const trimmedString = trimSpaces(inputString);\n return stringHasSpace(trimmedString);\n }\n\n function getFirstWord(inputString) {\n const trimmedString = trimSpaces(inputString);\n const arr = trimmedString.split(' ');\n return arr[0];\n }\n\n function invalidISBN(isbn) {\n const isbnOnly = getFirstWord(isbn);\n const auditedIsbn = ISBN.audit(isbnOnly);\n return !auditedIsbn.validIsbn;\n }\n\n function invalidSubfield(subfield) {\n if (subfield.code !== 'a') {\n return false;\n }\n return invalidISBN(subfield.value) || isMultiWord(subfield.value);\n }\n\n\n function invalidField020(field) {\n if (field.subfields && field.subfields.some(sf => invalidSubfield(sf))) {\n return true;\n }\n return false;\n }\n\n function subfieldsIsbnRequiresHyphenation(subfield) {\n if (!hyphenateISBN || !['a', 'z'].includes(subfield.code)) {\n return false;\n }\n\n const isbn = getFirstWord(subfield.value);\n if (subfield.code === 'a') {\n return requiresHyphenation(isbn);\n }\n\n // $z is a bit hacky: hyphenation is required only iff valid and no '-' chars\n if (isbn.indexOf('-') > -1) {\n return false;\n }\n return !invalidISBN(isbn);\n\n function requiresHyphenation(isbn) {\n if (!hyphenateISBN) {\n return false;\n }\n // Handle old notation such as \"978-952-396-001-5 (nid.)\"\n const isbn2 = getFirstWord(isbn);\n\n if (invalidISBN(isbn2)) {\n return false;\n }\n\n const parsedIsbn = ISBN.parse(isbn2);\n // Return true only if existing ISBN is a valid and hyphenated 10 or 13 digit ISBN:\n return !(isbn2 === parsedIsbn.isbn10h || isbn2 === parsedIsbn.isbn13h);\n }\n }\n\n function getRelevantFields(record) {\n //return record.get(/^(?:020|022)$/u).filter(field => {\n return record.fields.filter(field => {\n if (!field.subfields) {\n return false;\n }\n // Check ISBN:\n if (field.tag === '020') {\n if (invalidField020(field)) { // checks multiwordness\n return true;\n }\n return fieldsIsbnRequiresHyphenation(field);\n }\n\n // Check ISSN:\n if (field.tag === '022') {\n if (invalidField022(field)) {\n return true;\n }\n\n const subfield = field.subfields.find(sf => sf.code === 'a' || sf.code === 'l');\n\n return !validateISSN(subfield.value);\n }\n return false;\n });\n\n function fieldsIsbnRequiresHyphenation(field) {\n return field.subfields && field.subfields.some(sf => subfieldsIsbnRequiresHyphenation(sf));\n }\n\n function invalidField022(field) {\n const subfieldAorL = field.subfields.find(sf => sf.code === 'a' || sf.code === 'l');\n\n if (subfieldAorL === undefined) {\n const subfieldY = field.subfields.find(sf => sf.code === 'y');\n if (subfieldY) {\n return false;\n }\n\n return true;\n }\n return false;\n }\n }\n\n function validate(record) {\n const fields = getRelevantFields(record);\n\n if (fields.length === 0) {\n return {valid: true};\n }\n\n return fields\n .map(field => {\n if (field.tag === '020') {\n const subfieldA = field.subfields.find(sf => sf.code === 'a');\n if (subfieldA) {\n return {name: 'ISBN', value: subfieldA.value};\n }\n const subfieldZ = field.subfields.find(sf => sf.code === 'z');\n if (subfieldZ) {\n return {name: 'ISBN (subfield Z)', value: subfieldZ.value};\n }\n\n return {name: 'ISBN', value: undefined};\n }\n\n return {name: 'ISSN', value: getISSN()};\n\n function getISSN() {\n const subfieldAorL = field.subfields.find(sf => sf.code === 'a' || sf.code === 'l');\n\n if (subfieldAorL) {\n return subfieldAorL.value;\n }\n\n return undefined;\n }\n })\n .reduce((acc, obj) => {\n const {name, value} = obj;\n const msg = `${name} (${value}) is not valid`;\n\n return {...acc, messages: acc.messages.concat(msg)};\n }, {valid: false, messages: []});\n }\n\n\n function fix(record) {\n getRelevantFields(record).forEach(field => {\n if (field.tag === '020') {\n field.subfields.forEach(subfield => fixField020Subfield(field, subfield));\n return;\n }\n // 022 ISSN:\n const subfield = field.subfields.find(sf => sf.code === 'a' || sf.code === 'l');\n if (subfield && handleInvalid) {\n // $a/$l => $y (bit overkill to add $z and remove $a/$l instead of just renaming)\n field.subfields.push({code: 'y', value: subfield.value});\n record.removeSubfield(subfield, field);\n }\n });\n\n\n function fixField020Subfield(field, subfield) {\n split020A(); // subfield and field are in the scope\n addHyphens(subfield);\n handleInvalidIsbn(field, subfield); // remove 020$a, add 020$z, Do this last, as it uses deletion\n return;\n\n function addHyphens(subfield) {\n if (!subfieldsIsbnRequiresHyphenation(subfield)) {\n return;\n }\n // ISBN is valid but is missing hyphens\n const normalizedValue = normalizeIsbnValue(subfield.value);\n if (normalizedValue !== undefined) {\n subfield.value = normalizedValue;\n }\n }\n\n function handleInvalidIsbn(field, subfield) {\n if (subfield.code !== 'a' || !handleInvalid) {\n return;\n }\n const head = getFirstWord(subfield.value);\n if (!invalidISBN(head)) {\n return;\n }\n // $a => $z (bit overkill to add $z and remove $a instead of just renaming, but too lazy to fix/test thorougly)\n field.subfields.push({code: 'z', value: subfield.value});\n record.removeSubfield(subfield, field);\n }\n\n function split020A() {\n // Move non-initial words from $a to $q:\n if (subfield.code !== 'a') {\n return;\n }\n const value = trimSpaces(subfield.value);\n const position = value.indexOf(' ');\n if (position === -1) {\n return;\n }\n const head = getFirstWord(value);\n if (invalidISBN(head)) { // Don't split, if first word ain't ISBN\n return;\n }\n const tail = value.substring(position + 1);\n subfield.value = head;\n field.subfields.push({code: 'q', value: tail});\n }\n\n function normalizeIsbnValue(value) {\n const trimmedValue = getFirstWord(value);\n //const trimmedValue = trimISBN(value); // NB! This might lose information that should be stored in $q...\n const auditResult = ISBN.audit(trimmedValue);\n if (!auditResult.validIsbn) {\n return undefined;\n }\n const numbersOnly = trimmedValue.replace(/[^0-9Xx]+/ug, '');\n const parsedIsbn = ISBN.parse(trimmedValue);\n if (hyphenateISBN) {\n return numbersOnly.length === 10 ? parsedIsbn.isbn10h : parsedIsbn.isbn13h;\n }\n return numbersOnly.length === 10 ? parsedIsbn.isbn10 : parsedIsbn.isbn13;\n }\n }\n }\n};\n"],
5
+ "mappings": "AAAA,OAAO,UAAU;AACjB,OAAO,kBAAkB;AAGzB,eAAe,CAAC,EAAC,gBAAgB,OAAO,gBAAgB,MAAK,IAAI,CAAC,MAAM;AACtE,SAAO;AAAA,IACL;AAAA,IAAU;AAAA,IACV,aAAa;AAAA,EACf;AAEA,WAAS,eAAe,KAAK;AAC3B,WAAO,IAAI,QAAQ,GAAG,IAAI;AAAA,EAC5B;AAEA,WAAS,WAAW,OAAO;AACzB,WAAO,MAAM,QAAQ,SAAS,EAAE,EAAE,QAAQ,SAAS,EAAE,EAAE,QAAQ,SAAS,GAAG;AAAA,EAC7E;AAEA,WAAS,YAAY,aAAa;AAChC,UAAM,gBAAgB,WAAW,WAAW;AAC5C,WAAO,eAAe,aAAa;AAAA,EACrC;AAEA,WAAS,aAAa,aAAa;AACjC,UAAM,gBAAgB,WAAW,WAAW;AAC5C,UAAM,MAAM,cAAc,MAAM,GAAG;AACnC,WAAO,IAAI,CAAC;AAAA,EACd;AAEA,WAAS,YAAY,MAAM;AACzB,UAAM,WAAW,aAAa,IAAI;AAClC,UAAM,cAAc,KAAK,MAAM,QAAQ;AACvC,WAAO,CAAC,YAAY;AAAA,EACtB;AAEA,WAAS,gBAAgB,UAAU;AACjC,QAAI,SAAS,SAAS,KAAK;AACzB,aAAO;AAAA,IACT;AACA,WAAO,YAAY,SAAS,KAAK,KAAK,YAAY,SAAS,KAAK;AAAA,EAClE;AAGA,WAAS,gBAAgB,OAAO;AAC9B,QAAI,MAAM,aAAa,MAAM,UAAU,KAAK,QAAM,gBAAgB,EAAE,CAAC,GAAG;AACtE,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAEA,WAAS,iCAAiC,UAAU;AAClD,QAAI,CAAC,iBAAiB,CAAC,CAAC,KAAK,GAAG,EAAE,SAAS,SAAS,IAAI,GAAG;AACzD,aAAO;AAAA,IACT;AAEA,UAAM,OAAO,aAAa,SAAS,KAAK;AACxC,QAAI,SAAS,SAAS,KAAK;AACzB,aAAO,oBAAoB,IAAI;AAAA,IACjC;AAGA,QAAI,KAAK,QAAQ,GAAG,IAAI,IAAI;AAC1B,aAAO;AAAA,IACT;AACA,WAAO,CAAC,YAAY,IAAI;AAExB,aAAS,oBAAoBA,OAAM;AACjC,UAAI,CAAC,eAAe;AAClB,eAAO;AAAA,MACT;AAEA,YAAMC,SAAQ,aAAaD,KAAI;AAE/B,UAAI,YAAYC,MAAK,GAAG;AACtB,eAAO;AAAA,MACT;AAEA,YAAM,aAAa,KAAK,MAAMA,MAAK;AAEnC,aAAO,EAAEA,WAAU,WAAW,WAAWA,WAAU,WAAW;AAAA,IAChE;AAAA,EACF;AAEA,WAAS,kBAAkB,QAAQ;AAEjC,WAAO,OAAO,OAAO,OAAO,WAAS;AACnC,UAAI,CAAC,MAAM,WAAW;AACpB,eAAO;AAAA,MACT;AAEA,UAAI,MAAM,QAAQ,OAAO;AACvB,YAAI,gBAAgB,KAAK,GAAG;AAC1B,iBAAO;AAAA,QACT;AACA,eAAO,8BAA8B,KAAK;AAAA,MAC5C;AAGA,UAAI,MAAM,QAAQ,OAAO;AACvB,YAAI,gBAAgB,KAAK,GAAG;AAC1B,iBAAO;AAAA,QACT;AAEA,cAAM,WAAW,MAAM,UAAU,KAAK,QAAM,GAAG,SAAS,OAAO,GAAG,SAAS,GAAG;AAE9E,eAAO,CAAC,aAAa,SAAS,KAAK;AAAA,MACrC;AACA,aAAO;AAAA,IACT,CAAC;AAED,aAAS,8BAA8B,OAAO;AAC5C,aAAO,MAAM,aAAa,MAAM,UAAU,KAAK,QAAM,iCAAiC,EAAE,CAAC;AAAA,IAC3F;AAEA,aAAS,gBAAgB,OAAO;AAC9B,YAAM,eAAe,MAAM,UAAU,KAAK,QAAM,GAAG,SAAS,OAAO,GAAG,SAAS,GAAG;AAElF,UAAI,iBAAiB,QAAW;AAC9B,cAAM,YAAY,MAAM,UAAU,KAAK,QAAM,GAAG,SAAS,GAAG;AAC5D,YAAI,WAAW;AACb,iBAAO;AAAA,QACT;AAEA,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAEA,WAAS,SAAS,QAAQ;AACxB,UAAM,SAAS,kBAAkB,MAAM;AAEvC,QAAI,OAAO,WAAW,GAAG;AACvB,aAAO,EAAC,OAAO,KAAI;AAAA,IACrB;AAEA,WAAO,OACJ,IAAI,WAAS;AACZ,UAAI,MAAM,QAAQ,OAAO;AACvB,cAAM,YAAY,MAAM,UAAU,KAAK,QAAM,GAAG,SAAS,GAAG;AAC5D,YAAI,WAAW;AACb,iBAAO,EAAC,MAAM,QAAQ,OAAO,UAAU,MAAK;AAAA,QAC9C;AACA,cAAM,YAAY,MAAM,UAAU,KAAK,QAAM,GAAG,SAAS,GAAG;AAC5D,YAAI,WAAW;AACb,iBAAO,EAAC,MAAM,qBAAqB,OAAO,UAAU,MAAK;AAAA,QAC3D;AAEA,eAAO,EAAC,MAAM,QAAQ,OAAO,OAAS;AAAA,MACxC;AAEA,aAAO,EAAC,MAAM,QAAQ,OAAO,QAAQ,EAAC;AAEtC,eAAS,UAAU;AACjB,cAAM,eAAe,MAAM,UAAU,KAAK,QAAM,GAAG,SAAS,OAAO,GAAG,SAAS,GAAG;AAElF,YAAI,cAAc;AAChB,iBAAO,aAAa;AAAA,QACtB;AAEA,eAAO;AAAA,MACT;AAAA,IACF,CAAC,EACA,OAAO,CAAC,KAAK,QAAQ;AACpB,YAAM,EAAC,MAAM,MAAK,IAAI;AACtB,YAAM,MAAM,GAAG,IAAI,KAAK,KAAK;AAE7B,aAAO,EAAC,GAAG,KAAK,UAAU,IAAI,SAAS,OAAO,GAAG,EAAC;AAAA,IACpD,GAAG,EAAC,OAAO,OAAO,UAAU,CAAC,EAAC,CAAC;AAAA,EACnC;AAGA,WAAS,IAAI,QAAQ;AACnB,sBAAkB,MAAM,EAAE,QAAQ,WAAS;AACzC,UAAI,MAAM,QAAQ,OAAO;AACvB,cAAM,UAAU,QAAQ,CAAAC,cAAY,oBAAoB,OAAOA,SAAQ,CAAC;AACxE;AAAA,MACF;AAEA,YAAM,WAAW,MAAM,UAAU,KAAK,QAAM,GAAG,SAAS,OAAO,GAAG,SAAS,GAAG;AAC9E,UAAI,YAAY,eAAe;AAE7B,cAAM,UAAU,KAAK,EAAC,MAAM,KAAK,OAAO,SAAS,MAAK,CAAC;AACvD,eAAO,eAAe,UAAU,KAAK;AAAA,MACvC;AAAA,IACF,CAAC;AAGD,aAAS,oBAAoB,OAAO,UAAU;AAC5C,gBAAU;AACV,iBAAW,QAAQ;AACnB,wBAAkB,OAAO,QAAQ;AACjC;AAEA,eAAS,WAAWA,WAAU;AAC5B,YAAI,CAAC,iCAAiCA,SAAQ,GAAG;AAC/C;AAAA,QACF;AAEA,cAAM,kBAAkB,mBAAmBA,UAAS,KAAK;AACzD,YAAI,oBAAoB,QAAW;AACjC,UAAAA,UAAS,QAAQ;AAAA,QACnB;AAAA,MACF;AAEA,eAAS,kBAAkBC,QAAOD,WAAU;AAC1C,YAAIA,UAAS,SAAS,OAAO,CAAC,eAAe;AAC3C;AAAA,QACF;AACA,cAAM,OAAO,aAAaA,UAAS,KAAK;AACxC,YAAI,CAAC,YAAY,IAAI,GAAG;AACtB;AAAA,QACF;AAEA,QAAAC,OAAM,UAAU,KAAK,EAAC,MAAM,KAAK,OAAOD,UAAS,MAAK,CAAC;AACvD,eAAO,eAAeA,WAAUC,MAAK;AAAA,MACvC;AAEA,eAAS,YAAY;AAEnB,YAAI,SAAS,SAAS,KAAK;AACzB;AAAA,QACF;AACA,cAAM,QAAQ,WAAW,SAAS,KAAK;AACvC,cAAM,WAAW,MAAM,QAAQ,GAAG;AAClC,YAAI,aAAa,IAAI;AACnB;AAAA,QACF;AACA,cAAM,OAAO,aAAa,KAAK;AAC/B,YAAI,YAAY,IAAI,GAAG;AACrB;AAAA,QACF;AACA,cAAM,OAAO,MAAM,UAAU,WAAW,CAAC;AACzC,iBAAS,QAAQ;AACjB,cAAM,UAAU,KAAK,EAAC,MAAM,KAAK,OAAO,KAAI,CAAC;AAAA,MAC/C;AAEA,eAAS,mBAAmB,OAAO;AACjC,cAAM,eAAe,aAAa,KAAK;AAEvC,cAAM,cAAc,KAAK,MAAM,YAAY;AAC3C,YAAI,CAAC,YAAY,WAAW;AAC1B,iBAAO;AAAA,QACT;AACA,cAAM,cAAc,aAAa,QAAQ,eAAe,EAAE;AAC1D,cAAM,aAAa,KAAK,MAAM,YAAY;AAC1C,YAAI,eAAe;AACjB,iBAAO,YAAY,WAAW,KAAK,WAAW,UAAU,WAAW;AAAA,QACrE;AACA,eAAO,YAAY,WAAW,KAAK,WAAW,SAAS,WAAW;AAAA,MACpE;AAAA,IACF;AAAA,EACF;AACF;",
6
+ "names": ["isbn", "isbn2", "subfield", "field"]
7
+ }