@natlibfi/marc-record-validators-melinda 3.2.0 → 3.3.14-alpha.3

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 (593) hide show
  1. package/.github/CODEOWNERS +2 -0
  2. package/.github/dependabot.yml +40 -0
  3. package/.github/workflows/melinda-node-tests.yml +61 -0
  4. package/LICENSE.txt +21 -661
  5. package/README.md +4 -5
  6. package/dist/access-rights.js +94 -0
  7. package/dist/access-rights.js.map +1 -0
  8. package/dist/access-rights.spec.js +150 -0
  9. package/dist/access-rights.spec.js.map +1 -0
  10. package/dist/double-commas.js +17 -27
  11. package/dist/double-commas.js.map +1 -1
  12. package/dist/double-commas.spec.js +72 -27
  13. package/dist/double-commas.spec.js.map +1 -1
  14. package/dist/duplicates-ind1.js +47 -27
  15. package/dist/duplicates-ind1.js.map +1 -1
  16. package/dist/duplicates-ind1.spec.js +44 -27
  17. package/dist/duplicates-ind1.spec.js.map +1 -1
  18. package/dist/empty-fields.js +79 -29
  19. package/dist/empty-fields.js.map +1 -1
  20. package/dist/empty-fields.spec.js +113 -27
  21. package/dist/empty-fields.spec.js.map +1 -1
  22. package/dist/ending-punctuation-conf.js +772 -129
  23. package/dist/ending-punctuation-conf.js.map +1 -1
  24. package/dist/ending-punctuation.js +291 -72
  25. package/dist/ending-punctuation.js.map +1 -1
  26. package/dist/ending-punctuation.spec.js +2638 -118
  27. package/dist/ending-punctuation.spec.js.map +1 -1
  28. package/dist/ending-whitespace.js +58 -0
  29. package/dist/ending-whitespace.js.map +1 -0
  30. package/dist/ending-whitespace.spec.js +42 -0
  31. package/dist/ending-whitespace.spec.js.map +1 -0
  32. package/dist/field-521-fix.js +96 -0
  33. package/dist/field-521-fix.js.map +1 -0
  34. package/dist/field-521-fix.spec.js +51 -0
  35. package/dist/field-521-fix.spec.js.map +1 -0
  36. package/dist/field-exclusion.js +214 -63
  37. package/dist/field-exclusion.js.map +1 -1
  38. package/dist/field-exclusion.spec.js +1057 -31
  39. package/dist/field-exclusion.spec.js.map +1 -1
  40. package/dist/field-structure.js +249 -78
  41. package/dist/field-structure.js.map +1 -1
  42. package/dist/field-structure.spec.js +534 -31
  43. package/dist/field-structure.spec.js.map +1 -1
  44. package/dist/fields-present.js +31 -27
  45. package/dist/fields-present.js.map +1 -1
  46. package/dist/fields-present.spec.js +120 -27
  47. package/dist/fields-present.spec.js.map +1 -1
  48. package/dist/fixed-fields.js +72 -27
  49. package/dist/fixed-fields.js.map +1 -1
  50. package/dist/fixed-fields.spec.js +139 -27
  51. package/dist/fixed-fields.spec.js.map +1 -1
  52. package/dist/identical-fields.js +42 -28
  53. package/dist/identical-fields.js.map +1 -1
  54. package/dist/identical-fields.spec.js +98 -27
  55. package/dist/identical-fields.spec.js.map +1 -1
  56. package/dist/index.js +202 -27
  57. package/dist/index.js.map +1 -1
  58. package/dist/indicator-fixes.js +191 -0
  59. package/dist/indicator-fixes.js.map +1 -0
  60. package/dist/indicator-fixes.spec.js +51 -0
  61. package/dist/indicator-fixes.spec.js.map +1 -0
  62. package/dist/isbn-issn.js +266 -27
  63. package/dist/isbn-issn.js.map +1 -1
  64. package/dist/isbn-issn.spec.js +594 -27
  65. package/dist/isbn-issn.spec.js.map +1 -1
  66. package/dist/item-language.js +171 -27
  67. package/dist/item-language.js.map +1 -1
  68. package/dist/item-language.spec.js +305 -27
  69. package/dist/item-language.spec.js.map +1 -1
  70. package/dist/mergeField500Lisapainokset.js +155 -0
  71. package/dist/mergeField500Lisapainokset.js.map +1 -0
  72. package/dist/mergeField500Lisapainokset.spec.js +51 -0
  73. package/dist/mergeField500Lisapainokset.spec.js.map +1 -0
  74. package/dist/mergeRelatorTermFields.js +140 -0
  75. package/dist/mergeRelatorTermFields.js.map +1 -0
  76. package/dist/mergeRelatorTermFields.spec.js +51 -0
  77. package/dist/mergeRelatorTermFields.spec.js.map +1 -0
  78. package/dist/multiple-subfield-0.js +120 -0
  79. package/dist/multiple-subfield-0.js.map +1 -0
  80. package/dist/multiple-subfield-0.spec.js +51 -0
  81. package/dist/multiple-subfield-0.spec.js.map +1 -0
  82. package/dist/non-breaking-space.js +61 -0
  83. package/dist/non-breaking-space.js.map +1 -0
  84. package/dist/non-breaking-space.spec.js +42 -0
  85. package/dist/non-breaking-space.spec.js.map +1 -0
  86. package/dist/normalize-identifiers.js +210 -0
  87. package/dist/normalize-identifiers.js.map +1 -0
  88. package/dist/normalize-identifiers.spec.js +51 -0
  89. package/dist/normalize-identifiers.spec.js.map +1 -0
  90. package/dist/normalize-utf8-diacritics.js +140 -0
  91. package/dist/normalize-utf8-diacritics.js.map +1 -0
  92. package/dist/normalize-utf8-diacritics.spec.js +51 -0
  93. package/dist/normalize-utf8-diacritics.spec.js.map +1 -0
  94. package/dist/punctuation/index.js +281 -0
  95. package/dist/punctuation/index.js.map +1 -0
  96. package/dist/punctuation/rules/aut.js +332 -0
  97. package/dist/punctuation/rules/aut.js.map +1 -0
  98. package/dist/punctuation/rules/bib.js +374 -0
  99. package/dist/punctuation/rules/bib.js.map +1 -0
  100. package/dist/punctuation/rules/index.js +21 -0
  101. package/dist/punctuation/rules/index.js.map +1 -0
  102. package/dist/punctuation.spec.js +51 -0
  103. package/dist/punctuation.spec.js.map +1 -0
  104. package/dist/punctuation2.js +726 -0
  105. package/dist/punctuation2.js.map +1 -0
  106. package/dist/punctuation2.spec.js +51 -0
  107. package/dist/punctuation2.spec.js.map +1 -0
  108. package/dist/reindexSubfield6OccurenceNumbers.js +199 -0
  109. package/dist/reindexSubfield6OccurenceNumbers.js.map +1 -0
  110. package/dist/reindexSubfield6OccurenceNumbers.spec.js +51 -0
  111. package/dist/reindexSubfield6OccurenceNumbers.spec.js.map +1 -0
  112. package/dist/removeDuplicateDataFields.js +405 -0
  113. package/dist/removeDuplicateDataFields.js.map +1 -0
  114. package/dist/removeDuplicateDataFields.spec.js +51 -0
  115. package/dist/removeDuplicateDataFields.spec.js.map +1 -0
  116. package/dist/removeInferiorDataFields.js +245 -0
  117. package/dist/removeInferiorDataFields.js.map +1 -0
  118. package/dist/removeInferiorDataFields.spec.js +51 -0
  119. package/dist/removeInferiorDataFields.spec.js.map +1 -0
  120. package/dist/resolvable-ext-references-melinda.js +112 -31
  121. package/dist/resolvable-ext-references-melinda.js.map +1 -1
  122. package/dist/resolvable-ext-references-melinda.spec.js +166 -27
  123. package/dist/resolvable-ext-references-melinda.spec.js.map +1 -1
  124. package/dist/resolveOrphanedSubfield6s.js +116 -0
  125. package/dist/resolveOrphanedSubfield6s.js.map +1 -0
  126. package/dist/resolveOrphanedSubfield6s.spec.js +51 -0
  127. package/dist/resolveOrphanedSubfield6s.spec.js.map +1 -0
  128. package/dist/sanitize-vocabulary-source-codes.js +93 -0
  129. package/dist/sanitize-vocabulary-source-codes.js.map +1 -0
  130. package/dist/sanitize-vocabulary-source-codes.spec.js +51 -0
  131. package/dist/sanitize-vocabulary-source-codes.spec.js.map +1 -0
  132. package/dist/sort-tags.js +53 -27
  133. package/dist/sort-tags.js.map +1 -1
  134. package/dist/sort-tags.spec.js +206 -27
  135. package/dist/sort-tags.spec.js.map +1 -1
  136. package/dist/sortRelatorTerms.js +135 -0
  137. package/dist/sortRelatorTerms.js.map +1 -0
  138. package/dist/sortRelatorTerms.spec.js +51 -0
  139. package/dist/sortRelatorTerms.spec.js.map +1 -0
  140. package/dist/sortSubfields.js +279 -0
  141. package/dist/sortSubfields.js.map +1 -0
  142. package/dist/sortSubfields.spec.js +51 -0
  143. package/dist/sortSubfields.spec.js.map +1 -0
  144. package/dist/stripPunctuation.js +49 -0
  145. package/dist/stripPunctuation.js.map +1 -0
  146. package/dist/stripPunctuation.spec.js +51 -0
  147. package/dist/stripPunctuation.spec.js.map +1 -0
  148. package/dist/subfield-exclusion.js +174 -57
  149. package/dist/subfield-exclusion.js.map +1 -1
  150. package/dist/subfield-exclusion.spec.js +521 -31
  151. package/dist/subfield-exclusion.spec.js.map +1 -1
  152. package/dist/subfield6Utils.js +457 -0
  153. package/dist/subfield6Utils.js.map +1 -0
  154. package/dist/subfield8Utils.js +99 -0
  155. package/dist/subfield8Utils.js.map +1 -0
  156. package/dist/typeOfDate-008.js +48 -0
  157. package/dist/typeOfDate-008.js.map +1 -0
  158. package/dist/typeOfDate-008.spec.js +47 -0
  159. package/dist/typeOfDate-008.spec.js.map +1 -0
  160. package/dist/unicode-decomposition.js +139 -30
  161. package/dist/unicode-decomposition.js.map +1 -1
  162. package/dist/unicode-decomposition.spec.js +90 -27
  163. package/dist/unicode-decomposition.spec.js.map +1 -1
  164. package/dist/update-field-540.js +119 -0
  165. package/dist/update-field-540.js.map +1 -0
  166. package/dist/update-field-540.spec.js +51 -0
  167. package/dist/update-field-540.spec.js.map +1 -0
  168. package/dist/urn.js +185 -0
  169. package/dist/urn.js.map +1 -0
  170. package/dist/urn.spec.js +238 -0
  171. package/dist/urn.spec.js.map +1 -0
  172. package/dist/utils.js +58 -0
  173. package/dist/utils.js.map +1 -0
  174. package/package.json +114 -124
  175. package/src/access-rights.js +84 -0
  176. package/src/access-rights.spec.js +126 -0
  177. package/src/double-commas.js +12 -49
  178. package/src/double-commas.spec.js +50 -82
  179. package/src/duplicates-ind1.js +34 -74
  180. package/src/duplicates-ind1.spec.js +39 -117
  181. package/src/empty-fields.js +62 -74
  182. package/src/empty-fields.spec.js +134 -207
  183. package/src/ending-punctuation-conf.js +679 -644
  184. package/src/ending-punctuation.js +260 -250
  185. package/src/ending-punctuation.spec.js +2545 -2322
  186. package/src/ending-whitespace.js +40 -0
  187. package/src/ending-whitespace.spec.js +44 -0
  188. package/src/field-521-fix.js +92 -0
  189. package/src/field-521-fix.spec.js +52 -0
  190. package/src/field-exclusion.js +197 -215
  191. package/src/field-exclusion.spec.js +883 -481
  192. package/src/field-structure.js +213 -271
  193. package/src/field-structure.spec.js +597 -474
  194. package/src/fields-present.js +19 -49
  195. package/src/fields-present.spec.js +90 -91
  196. package/src/fixed-fields.js +61 -94
  197. package/src/fixed-fields.spec.js +81 -125
  198. package/src/identical-fields.js +29 -48
  199. package/src/identical-fields.spec.js +114 -146
  200. package/src/index.js +41 -46
  201. package/src/indicator-fixes.js +211 -0
  202. package/src/indicator-fixes.spec.js +52 -0
  203. package/src/isbn-issn.js +254 -106
  204. package/src/isbn-issn.spec.js +399 -172
  205. package/src/item-language.js +158 -195
  206. package/src/item-language.spec.js +314 -306
  207. package/src/mergeField500Lisapainokset.js +153 -0
  208. package/src/mergeField500Lisapainokset.spec.js +52 -0
  209. package/src/mergeRelatorTermFields.js +143 -0
  210. package/src/mergeRelatorTermFields.spec.js +52 -0
  211. package/src/multiple-subfield-0.js +129 -0
  212. package/src/multiple-subfield-0.spec.js +52 -0
  213. package/src/non-breaking-space.js +49 -0
  214. package/src/non-breaking-space.spec.js +44 -0
  215. package/src/normalize-identifiers.js +197 -0
  216. package/src/normalize-identifiers.spec.js +52 -0
  217. package/src/normalize-utf8-diacritics.js +141 -0
  218. package/src/normalize-utf8-diacritics.spec.js +52 -0
  219. package/src/punctuation/index.js +292 -0
  220. package/src/punctuation/rules/aut.js +372 -0
  221. package/src/punctuation/rules/bib.js +420 -0
  222. package/src/punctuation/rules/index.js +7 -0
  223. package/src/punctuation.spec.js +52 -0
  224. package/src/punctuation2.js +441 -0
  225. package/src/punctuation2.spec.js +52 -0
  226. package/src/reindexSubfield6OccurenceNumbers.js +210 -0
  227. package/src/reindexSubfield6OccurenceNumbers.spec.js +52 -0
  228. package/src/removeDuplicateDataFields.js +447 -0
  229. package/src/removeDuplicateDataFields.spec.js +52 -0
  230. package/src/removeInferiorDataFields.js +259 -0
  231. package/src/removeInferiorDataFields.spec.js +52 -0
  232. package/src/resolvable-ext-references-melinda.js +89 -122
  233. package/src/resolvable-ext-references-melinda.spec.js +168 -198
  234. package/src/resolveOrphanedSubfield6s.js +115 -0
  235. package/src/resolveOrphanedSubfield6s.spec.js +52 -0
  236. package/src/sanitize-vocabulary-source-codes.js +99 -0
  237. package/src/sanitize-vocabulary-source-codes.spec.js +52 -0
  238. package/src/sort-tags.js +34 -60
  239. package/src/sort-tags.spec.js +256 -290
  240. package/src/sortRelatorTerms.js +142 -0
  241. package/src/sortRelatorTerms.spec.js +52 -0
  242. package/src/sortSubfields.js +176 -0
  243. package/src/sortSubfields.spec.js +52 -0
  244. package/src/stripPunctuation.js +42 -0
  245. package/src/stripPunctuation.spec.js +52 -0
  246. package/src/subfield-exclusion.js +157 -180
  247. package/src/subfield-exclusion.spec.js +507 -453
  248. package/src/subfield6Utils.js +485 -0
  249. package/src/subfield8Utils.js +102 -0
  250. package/src/typeOfDate-008.js +40 -0
  251. package/src/typeOfDate-008.spec.js +47 -0
  252. package/src/unicode-decomposition.js +130 -145
  253. package/src/unicode-decomposition.spec.js +89 -115
  254. package/src/update-field-540.js +99 -0
  255. package/src/update-field-540.spec.js +52 -0
  256. package/src/urn.js +164 -0
  257. package/src/urn.spec.js +231 -0
  258. package/src/utils.js +52 -0
  259. package/test-fixtures/duplicates-ind1/01/expectedResult.json +4 -0
  260. package/test-fixtures/duplicates-ind1/01/metadata.json +4 -0
  261. package/test-fixtures/duplicates-ind1/01/record.json +16 -0
  262. package/test-fixtures/duplicates-ind1/02/expectedResult.json +6 -0
  263. package/test-fixtures/duplicates-ind1/02/metadata.json +4 -0
  264. package/test-fixtures/duplicates-ind1/02/record.json +16 -0
  265. package/test-fixtures/duplicates-ind1/03/expectedResult.json +13 -0
  266. package/test-fixtures/duplicates-ind1/03/metadata.json +6 -0
  267. package/test-fixtures/duplicates-ind1/03/record.json +16 -0
  268. package/test-fixtures/ending-whitespace/01/expectedResult.json +4 -0
  269. package/test-fixtures/ending-whitespace/01/metadata.json +6 -0
  270. package/test-fixtures/ending-whitespace/01/record.json +15 -0
  271. package/test-fixtures/ending-whitespace/02/expectedResult.json +4 -0
  272. package/test-fixtures/ending-whitespace/02/metadata.json +6 -0
  273. package/test-fixtures/ending-whitespace/02/record.json +15 -0
  274. package/test-fixtures/ending-whitespace/03/expectedResult.json +17 -0
  275. package/test-fixtures/ending-whitespace/03/metadata.json +6 -0
  276. package/test-fixtures/ending-whitespace/03/record.json +15 -0
  277. package/test-fixtures/ending-whitespace/04/expectedResult.json +10 -0
  278. package/test-fixtures/ending-whitespace/04/metadata.json +6 -0
  279. package/test-fixtures/ending-whitespace/04/record.json +8 -0
  280. package/test-fixtures/fix521/01/expectedResult.json +6 -0
  281. package/test-fixtures/fix521/01/metadata.json +5 -0
  282. package/test-fixtures/fix521/01/record.json +13 -0
  283. package/test-fixtures/fix521/02/expectedResult.json +15 -0
  284. package/test-fixtures/fix521/02/metadata.json +5 -0
  285. package/test-fixtures/fix521/02/record.json +13 -0
  286. package/test-fixtures/fix521/03/expectedResult.json +5 -0
  287. package/test-fixtures/fix521/03/metadata.json +5 -0
  288. package/test-fixtures/fix521/03/record.json +13 -0
  289. package/test-fixtures/indicator-fixes/01/expectedResult.json +9 -0
  290. package/test-fixtures/indicator-fixes/01/metadata.json +5 -0
  291. package/test-fixtures/indicator-fixes/01/record.json +64 -0
  292. package/test-fixtures/indicator-fixes/02/expectedResult.json +66 -0
  293. package/test-fixtures/indicator-fixes/02/metadata.json +5 -0
  294. package/test-fixtures/indicator-fixes/02/record.json +64 -0
  295. package/test-fixtures/indicator-fixes/03/expectedResult.json +55 -0
  296. package/test-fixtures/indicator-fixes/03/metadata.json +5 -0
  297. package/test-fixtures/indicator-fixes/03/record.json +54 -0
  298. package/test-fixtures/indicator-fixes/04/expectedResult.json +66 -0
  299. package/test-fixtures/indicator-fixes/04/metadata.json +5 -0
  300. package/test-fixtures/indicator-fixes/04/record.json +65 -0
  301. package/test-fixtures/indicator-fixes/05/expectedResult.json +66 -0
  302. package/test-fixtures/indicator-fixes/05/metadata.json +5 -0
  303. package/test-fixtures/indicator-fixes/05/record.json +65 -0
  304. package/test-fixtures/indicator-fixes/06/expectedResult.json +75 -0
  305. package/test-fixtures/indicator-fixes/06/metadata.json +5 -0
  306. package/test-fixtures/indicator-fixes/06/record.json +74 -0
  307. package/test-fixtures/lisapainokset/fixer/01/expectedResult.json +37 -0
  308. package/test-fixtures/lisapainokset/fixer/01/metadata.json +6 -0
  309. package/test-fixtures/lisapainokset/fixer/01/record.json +61 -0
  310. package/test-fixtures/lisapainokset/fixer/02/expectedResult.json +44 -0
  311. package/test-fixtures/lisapainokset/fixer/02/metadata.json +6 -0
  312. package/test-fixtures/lisapainokset/fixer/02/record.json +45 -0
  313. package/test-fixtures/lisapainokset/fixer/03/expectedResult.json +21 -0
  314. package/test-fixtures/lisapainokset/fixer/03/metadata.json +6 -0
  315. package/test-fixtures/lisapainokset/fixer/03/record.json +45 -0
  316. package/test-fixtures/lisapainokset/validator/01/expectedResult.json +7 -0
  317. package/test-fixtures/lisapainokset/validator/01/metadata.json +6 -0
  318. package/test-fixtures/lisapainokset/validator/01/record.json +45 -0
  319. package/test-fixtures/lisapainokset/validator/02/expectedResult.json +6 -0
  320. package/test-fixtures/lisapainokset/validator/02/metadata.json +6 -0
  321. package/test-fixtures/lisapainokset/validator/02/record.json +61 -0
  322. package/test-fixtures/lisapainokset/validator/03/expectedResult.json +4 -0
  323. package/test-fixtures/lisapainokset/validator/03/metadata.json +6 -0
  324. package/test-fixtures/lisapainokset/validator/03/record.json +37 -0
  325. package/test-fixtures/mergeRelatorTermFields/fixer/01/expectedResult.json +14 -0
  326. package/test-fixtures/mergeRelatorTermFields/fixer/01/metadata.json +6 -0
  327. package/test-fixtures/mergeRelatorTermFields/fixer/01/record.json +16 -0
  328. package/test-fixtures/mergeRelatorTermFields/fixer/02/expectedResult.json +17 -0
  329. package/test-fixtures/mergeRelatorTermFields/fixer/02/metadata.json +6 -0
  330. package/test-fixtures/mergeRelatorTermFields/fixer/02/record.json +23 -0
  331. package/test-fixtures/mergeRelatorTermFields/validator/01/expectedResult.json +6 -0
  332. package/test-fixtures/mergeRelatorTermFields/validator/01/metadata.json +6 -0
  333. package/test-fixtures/mergeRelatorTermFields/validator/01/record.json +16 -0
  334. package/test-fixtures/mergeRelatorTermFields/validator/02/expectedResult.json +4 -0
  335. package/test-fixtures/mergeRelatorTermFields/validator/02/metadata.json +6 -0
  336. package/test-fixtures/mergeRelatorTermFields/validator/02/record.json +16 -0
  337. package/test-fixtures/non-breaking-space/01/expectedResult.json +4 -0
  338. package/test-fixtures/non-breaking-space/01/metadata.json +6 -0
  339. package/test-fixtures/non-breaking-space/01/record.json +15 -0
  340. package/test-fixtures/non-breaking-space/02/expectedResult.json +4 -0
  341. package/test-fixtures/non-breaking-space/02/metadata.json +6 -0
  342. package/test-fixtures/non-breaking-space/02/record.json +15 -0
  343. package/test-fixtures/non-breaking-space/03/expectedResult.json +17 -0
  344. package/test-fixtures/non-breaking-space/03/metadata.json +6 -0
  345. package/test-fixtures/non-breaking-space/03/record.json +15 -0
  346. package/test-fixtures/non-breaking-space/04/expectedResult.json +21 -0
  347. package/test-fixtures/non-breaking-space/04/metadata.json +6 -0
  348. package/test-fixtures/non-breaking-space/04/record.json +19 -0
  349. package/test-fixtures/normalize-identifiers/01/expectedResult.json +8 -0
  350. package/test-fixtures/normalize-identifiers/01/metadata.json +5 -0
  351. package/test-fixtures/normalize-identifiers/01/record.json +81 -0
  352. package/test-fixtures/normalize-identifiers/02/expectedResult.json +92 -0
  353. package/test-fixtures/normalize-identifiers/02/metadata.json +5 -0
  354. package/test-fixtures/normalize-identifiers/02/record.json +92 -0
  355. package/test-fixtures/normalize-identifiers/03/expectedResult.json +63 -0
  356. package/test-fixtures/normalize-identifiers/03/metadata.json +5 -0
  357. package/test-fixtures/normalize-identifiers/03/record.json +61 -0
  358. package/test-fixtures/normalize-identifiers/04/expectedResult.json +79 -0
  359. package/test-fixtures/normalize-identifiers/04/metadata.json +5 -0
  360. package/test-fixtures/normalize-identifiers/04/record.json +77 -0
  361. package/test-fixtures/normalize-utf8-diacritics/01/expectedResult.json +7 -0
  362. package/test-fixtures/normalize-utf8-diacritics/01/metadata.json +5 -0
  363. package/test-fixtures/normalize-utf8-diacritics/01/record.json +39 -0
  364. package/test-fixtures/normalize-utf8-diacritics/02/expectedResult.json +41 -0
  365. package/test-fixtures/normalize-utf8-diacritics/02/metadata.json +5 -0
  366. package/test-fixtures/normalize-utf8-diacritics/02/record.json +39 -0
  367. package/test-fixtures/normalize-utf8-diacritics/03/expectedResult.json +5 -0
  368. package/test-fixtures/normalize-utf8-diacritics/03/metadata.json +5 -0
  369. package/test-fixtures/normalize-utf8-diacritics/03/record.json +37 -0
  370. package/test-fixtures/normalize-utf8-diacritics/04/expectedResult.json +41 -0
  371. package/test-fixtures/normalize-utf8-diacritics/04/metadata.json +5 -0
  372. package/test-fixtures/normalize-utf8-diacritics/04/record.json +39 -0
  373. package/test-fixtures/normalize-utf8-diacritics/05/expectedResult.json +41 -0
  374. package/test-fixtures/normalize-utf8-diacritics/05/metadata.json +5 -0
  375. package/test-fixtures/normalize-utf8-diacritics/05/record.json +41 -0
  376. package/test-fixtures/punctuation/01/expectedResult.json +3 -0
  377. package/test-fixtures/punctuation/01/metadata.json +4 -0
  378. package/test-fixtures/punctuation/01/record.json +18 -0
  379. package/test-fixtures/punctuation/02/expectedResult.json +3 -0
  380. package/test-fixtures/punctuation/02/metadata.json +4 -0
  381. package/test-fixtures/punctuation/02/record.json +18 -0
  382. package/test-fixtures/punctuation/03/expectedResult.json +21 -0
  383. package/test-fixtures/punctuation/03/metadata.json +5 -0
  384. package/test-fixtures/punctuation/03/record.json +19 -0
  385. package/test-fixtures/punctuation/04/expectedResult.json +21 -0
  386. package/test-fixtures/punctuation/04/metadata.json +5 -0
  387. package/test-fixtures/punctuation/04/record.json +19 -0
  388. package/test-fixtures/punctuation/05/expectedResult.json +44 -0
  389. package/test-fixtures/punctuation/05/metadata.json +5 -0
  390. package/test-fixtures/punctuation/05/record.json +42 -0
  391. package/test-fixtures/punctuation2/01/expectedResult.json +12 -0
  392. package/test-fixtures/punctuation2/01/metadata.json +6 -0
  393. package/test-fixtures/punctuation2/01/record.json +37 -0
  394. package/test-fixtures/punctuation2/02/expectedResult.json +4 -0
  395. package/test-fixtures/punctuation2/02/metadata.json +6 -0
  396. package/test-fixtures/punctuation2/02/record.json +14 -0
  397. package/test-fixtures/punctuation2/04/expectedResult.json +7 -0
  398. package/test-fixtures/punctuation2/04/metadata.json +6 -0
  399. package/test-fixtures/punctuation2/04/record.json +22 -0
  400. package/test-fixtures/punctuation2/05/expectedResult.json +6 -0
  401. package/test-fixtures/punctuation2/05/metadata.json +6 -0
  402. package/test-fixtures/punctuation2/05/record.json +12 -0
  403. package/test-fixtures/punctuation2/98/expectedResult.json +45 -0
  404. package/test-fixtures/punctuation2/98/metadata.json +6 -0
  405. package/test-fixtures/punctuation2/98/record.json +43 -0
  406. package/test-fixtures/punctuation2/99/expectedResult.json +15 -0
  407. package/test-fixtures/punctuation2/99/metadata.json +6 -0
  408. package/test-fixtures/punctuation2/99/record.json +14 -0
  409. package/test-fixtures/reindex-sf6-occurence-numbers/f01/expectedResult.json +35 -0
  410. package/test-fixtures/reindex-sf6-occurence-numbers/f01/metadata.json +6 -0
  411. package/test-fixtures/reindex-sf6-occurence-numbers/f01/record.json +34 -0
  412. package/test-fixtures/reindex-sf6-occurence-numbers/f02/expectedResult.json +53 -0
  413. package/test-fixtures/reindex-sf6-occurence-numbers/f02/metadata.json +6 -0
  414. package/test-fixtures/reindex-sf6-occurence-numbers/f02/record.json +51 -0
  415. package/test-fixtures/reindex-sf6-occurence-numbers/f03/expectedResult.json +46 -0
  416. package/test-fixtures/reindex-sf6-occurence-numbers/f03/metadata.json +7 -0
  417. package/test-fixtures/reindex-sf6-occurence-numbers/f03/record.json +44 -0
  418. package/test-fixtures/reindex-sf6-occurence-numbers/v01/expectedResult.json +6 -0
  419. package/test-fixtures/reindex-sf6-occurence-numbers/v01/metadata.json +5 -0
  420. package/test-fixtures/reindex-sf6-occurence-numbers/v01/record.json +31 -0
  421. package/test-fixtures/reindex-sf6-occurence-numbers/v02/expectedResult.json +6 -0
  422. package/test-fixtures/reindex-sf6-occurence-numbers/v02/metadata.json +6 -0
  423. package/test-fixtures/reindex-sf6-occurence-numbers/v02/record.json +38 -0
  424. package/test-fixtures/reindex-sf6-occurence-numbers/v03/expectedResult.json +6 -0
  425. package/test-fixtures/reindex-sf6-occurence-numbers/v03/metadata.json +6 -0
  426. package/test-fixtures/reindex-sf6-occurence-numbers/v03/record.json +30 -0
  427. package/test-fixtures/remove-duplicate-datafields/f01/expectedResult.json +35 -0
  428. package/test-fixtures/remove-duplicate-datafields/f01/metadata.json +6 -0
  429. package/test-fixtures/remove-duplicate-datafields/f01/record.json +34 -0
  430. package/test-fixtures/remove-duplicate-datafields/f03/expectedResult.json +20 -0
  431. package/test-fixtures/remove-duplicate-datafields/f03/metadata.json +6 -0
  432. package/test-fixtures/remove-duplicate-datafields/f03/record.json +33 -0
  433. package/test-fixtures/remove-duplicate-datafields/f03b/expectedResult.json +20 -0
  434. package/test-fixtures/remove-duplicate-datafields/f03b/metadata.json +6 -0
  435. package/test-fixtures/remove-duplicate-datafields/f03b/record.json +35 -0
  436. package/test-fixtures/remove-duplicate-datafields/f03c/expectedResult.json +25 -0
  437. package/test-fixtures/remove-duplicate-datafields/f03c/metadata.json +6 -0
  438. package/test-fixtures/remove-duplicate-datafields/f03c/record.json +43 -0
  439. package/test-fixtures/remove-duplicate-datafields/f04/expectedResult.json +31 -0
  440. package/test-fixtures/remove-duplicate-datafields/f04/metadata.json +6 -0
  441. package/test-fixtures/remove-duplicate-datafields/f04/record.json +41 -0
  442. package/test-fixtures/remove-duplicate-datafields/f05/expectedResult.json +23 -0
  443. package/test-fixtures/remove-duplicate-datafields/f05/metadata.json +6 -0
  444. package/test-fixtures/remove-duplicate-datafields/f05/record.json +29 -0
  445. package/test-fixtures/remove-duplicate-datafields/f06/expectedResult.json +24 -0
  446. package/test-fixtures/remove-duplicate-datafields/f06/metadata.json +6 -0
  447. package/test-fixtures/remove-duplicate-datafields/f06/record.json +41 -0
  448. package/test-fixtures/remove-duplicate-datafields/f07/expectedResult.json +15 -0
  449. package/test-fixtures/remove-duplicate-datafields/f07/metadata.json +6 -0
  450. package/test-fixtures/remove-duplicate-datafields/f07/record.json +21 -0
  451. package/test-fixtures/remove-duplicate-datafields/f08/expectedResult.json +21 -0
  452. package/test-fixtures/remove-duplicate-datafields/f08/metadata.json +6 -0
  453. package/test-fixtures/remove-duplicate-datafields/f08/record.json +33 -0
  454. package/test-fixtures/remove-duplicate-datafields/f09/expectedResult.json +6 -0
  455. package/test-fixtures/remove-duplicate-datafields/f09/metadata.json +6 -0
  456. package/test-fixtures/remove-duplicate-datafields/f09/record.json +9 -0
  457. package/test-fixtures/remove-duplicate-datafields/f10/expectedResult.json +15 -0
  458. package/test-fixtures/remove-duplicate-datafields/f10/metadata.json +6 -0
  459. package/test-fixtures/remove-duplicate-datafields/f10/record.json +24 -0
  460. package/test-fixtures/remove-duplicate-datafields/f11/expectedResult.json +30 -0
  461. package/test-fixtures/remove-duplicate-datafields/f11/metadata.json +6 -0
  462. package/test-fixtures/remove-duplicate-datafields/f11/record.json +53 -0
  463. package/test-fixtures/remove-duplicate-datafields/v01/expectedResult.json +6 -0
  464. package/test-fixtures/remove-duplicate-datafields/v01/metadata.json +6 -0
  465. package/test-fixtures/remove-duplicate-datafields/v01/record.json +31 -0
  466. package/test-fixtures/remove-duplicate-datafields/v02/expectedResult.json +10 -0
  467. package/test-fixtures/remove-duplicate-datafields/v02/metadata.json +6 -0
  468. package/test-fixtures/remove-duplicate-datafields/v02/record.json +45 -0
  469. package/test-fixtures/remove-duplicate-datafields/v03/expectedResult.json +6 -0
  470. package/test-fixtures/remove-duplicate-datafields/v03/metadata.json +7 -0
  471. package/test-fixtures/remove-duplicate-datafields/v03/record.json +37 -0
  472. package/test-fixtures/remove-duplicate-datafields/v04/expectedResult.json +8 -0
  473. package/test-fixtures/remove-duplicate-datafields/v04/metadata.json +6 -0
  474. package/test-fixtures/remove-duplicate-datafields/v04/record.json +41 -0
  475. package/test-fixtures/remove-inferior-datafields/f01/expectedResult.json +21 -0
  476. package/test-fixtures/remove-inferior-datafields/f01/metadata.json +6 -0
  477. package/test-fixtures/remove-inferior-datafields/f01/record.json +31 -0
  478. package/test-fixtures/remove-inferior-datafields/f03/expectedResult.json +16 -0
  479. package/test-fixtures/remove-inferior-datafields/f03/metadata.json +6 -0
  480. package/test-fixtures/remove-inferior-datafields/f03/record.json +27 -0
  481. package/test-fixtures/remove-inferior-datafields/f04/expectedResult.json +31 -0
  482. package/test-fixtures/remove-inferior-datafields/f04/metadata.json +6 -0
  483. package/test-fixtures/remove-inferior-datafields/f04/record.json +38 -0
  484. package/test-fixtures/remove-inferior-datafields/f05/expectedResult.json +34 -0
  485. package/test-fixtures/remove-inferior-datafields/f05/metadata.json +6 -0
  486. package/test-fixtures/remove-inferior-datafields/f05/record.json +41 -0
  487. package/test-fixtures/remove-inferior-datafields/f06/expectedResult.json +16 -0
  488. package/test-fixtures/remove-inferior-datafields/f06/metadata.json +6 -0
  489. package/test-fixtures/remove-inferior-datafields/f06/record.json +20 -0
  490. package/test-fixtures/remove-inferior-datafields/v01/expectedResult.json +6 -0
  491. package/test-fixtures/remove-inferior-datafields/v01/metadata.json +6 -0
  492. package/test-fixtures/remove-inferior-datafields/v01/record.json +31 -0
  493. package/test-fixtures/remove-inferior-datafields/v02/expectedResult.json +6 -0
  494. package/test-fixtures/remove-inferior-datafields/v02/metadata.json +6 -0
  495. package/test-fixtures/remove-inferior-datafields/v02/record.json +21 -0
  496. package/test-fixtures/remove-orphanded-sf6s/f01/expectedResult.json +35 -0
  497. package/test-fixtures/remove-orphanded-sf6s/f01/metadata.json +6 -0
  498. package/test-fixtures/remove-orphanded-sf6s/f01/record.json +34 -0
  499. package/test-fixtures/remove-orphanded-sf6s/f02/expectedResult.json +40 -0
  500. package/test-fixtures/remove-orphanded-sf6s/f02/metadata.json +6 -0
  501. package/test-fixtures/remove-orphanded-sf6s/f02/record.json +43 -0
  502. package/test-fixtures/remove-orphanded-sf6s/v01/expectedResult.json +6 -0
  503. package/test-fixtures/remove-orphanded-sf6s/v01/metadata.json +6 -0
  504. package/test-fixtures/remove-orphanded-sf6s/v01/record.json +31 -0
  505. package/test-fixtures/remove-orphanded-sf6s/v02/expectedResult.json +6 -0
  506. package/test-fixtures/remove-orphanded-sf6s/v02/metadata.json +6 -0
  507. package/test-fixtures/remove-orphanded-sf6s/v02/record.json +31 -0
  508. package/test-fixtures/resolvable-ext-references-melinda.js +0 -27
  509. package/test-fixtures/sanitize-vocabulary-source-codes/f01/expectedResult.json +32 -0
  510. package/test-fixtures/sanitize-vocabulary-source-codes/f01/metadata.json +6 -0
  511. package/test-fixtures/sanitize-vocabulary-source-codes/f01/record.json +32 -0
  512. package/test-fixtures/sanitize-vocabulary-source-codes/f02/expectedResult.json +24 -0
  513. package/test-fixtures/sanitize-vocabulary-source-codes/f02/metadata.json +6 -0
  514. package/test-fixtures/sanitize-vocabulary-source-codes/f02/record.json +24 -0
  515. package/test-fixtures/sanitize-vocabulary-source-codes/v01/expectedResult.json +12 -0
  516. package/test-fixtures/sanitize-vocabulary-source-codes/v01/metadata.json +6 -0
  517. package/test-fixtures/sanitize-vocabulary-source-codes/v01/record.json +24 -0
  518. package/test-fixtures/sort-relator-terms/f01/expectedResult.json +23 -0
  519. package/test-fixtures/sort-relator-terms/f01/metadata.json +6 -0
  520. package/test-fixtures/sort-relator-terms/f01/record.json +22 -0
  521. package/test-fixtures/sort-relator-terms/f02/expectedResult.json +26 -0
  522. package/test-fixtures/sort-relator-terms/f02/metadata.json +6 -0
  523. package/test-fixtures/sort-relator-terms/f02/record.json +22 -0
  524. package/test-fixtures/sort-relator-terms/v01/expectedResult.json +5 -0
  525. package/test-fixtures/sort-relator-terms/v01/metadata.json +6 -0
  526. package/test-fixtures/sort-relator-terms/v01/record.json +22 -0
  527. package/test-fixtures/sort-relator-terms/v02/expectedResult.json +6 -0
  528. package/test-fixtures/sort-relator-terms/v02/metadata.json +6 -0
  529. package/test-fixtures/sort-relator-terms/v02/record.json +14 -0
  530. package/test-fixtures/sort-subfields/f01/expectedResult.json +24 -0
  531. package/test-fixtures/sort-subfields/f01/metadata.json +6 -0
  532. package/test-fixtures/sort-subfields/f01/record.json +20 -0
  533. package/test-fixtures/sort-subfields/v01/expectedResult.json +5 -0
  534. package/test-fixtures/sort-subfields/v01/metadata.json +6 -0
  535. package/test-fixtures/sort-subfields/v01/record.json +24 -0
  536. package/test-fixtures/sort-subfields/v02/expectedResult.json +6 -0
  537. package/test-fixtures/sort-subfields/v02/metadata.json +6 -0
  538. package/test-fixtures/sort-subfields/v02/record.json +8 -0
  539. package/test-fixtures/strip-punctuation/01/expectedResult.json +12 -0
  540. package/test-fixtures/strip-punctuation/01/metadata.json +6 -0
  541. package/test-fixtures/strip-punctuation/01/record.json +37 -0
  542. package/test-fixtures/strip-punctuation/02/expectedResult.json +4 -0
  543. package/test-fixtures/strip-punctuation/02/metadata.json +6 -0
  544. package/test-fixtures/strip-punctuation/02/record.json +14 -0
  545. package/test-fixtures/strip-punctuation/04/expectedResult.json +6 -0
  546. package/test-fixtures/strip-punctuation/04/metadata.json +6 -0
  547. package/test-fixtures/strip-punctuation/04/record.json +22 -0
  548. package/test-fixtures/strip-punctuation/05/expectedResult.json +6 -0
  549. package/test-fixtures/strip-punctuation/05/metadata.json +6 -0
  550. package/test-fixtures/strip-punctuation/05/record.json +12 -0
  551. package/test-fixtures/strip-punctuation/98/expectedResult.json +44 -0
  552. package/test-fixtures/strip-punctuation/98/metadata.json +6 -0
  553. package/test-fixtures/strip-punctuation/98/record.json +45 -0
  554. package/test-fixtures/strip-punctuation/99/expectedResult.json +16 -0
  555. package/test-fixtures/strip-punctuation/99/metadata.json +6 -0
  556. package/test-fixtures/strip-punctuation/99/record.json +16 -0
  557. package/test-fixtures/subfield0/f01/expectedResult.json +25 -0
  558. package/test-fixtures/subfield0/f01/metadata.json +6 -0
  559. package/test-fixtures/subfield0/f01/record.json +23 -0
  560. package/test-fixtures/subfield0/f02/expectedResult.json +35 -0
  561. package/test-fixtures/subfield0/f02/metadata.json +6 -0
  562. package/test-fixtures/subfield0/f02/record.json +41 -0
  563. package/test-fixtures/subfield0/f03/expectedResult.json +21 -0
  564. package/test-fixtures/subfield0/f03/metadata.json +7 -0
  565. package/test-fixtures/subfield0/f03/record.json +24 -0
  566. package/test-fixtures/subfield0/v01/expectedResult.json +4 -0
  567. package/test-fixtures/subfield0/v01/metadata.json +6 -0
  568. package/test-fixtures/subfield0/v01/record.json +23 -0
  569. package/test-fixtures/subfield0/v02/expectedResult.json +9 -0
  570. package/test-fixtures/subfield0/v02/metadata.json +6 -0
  571. package/test-fixtures/subfield0/v02/record.json +38 -0
  572. package/test-fixtures/typeOfDate-008/01/expectedResult.json +3 -0
  573. package/test-fixtures/typeOfDate-008/01/metadata.json +4 -0
  574. package/test-fixtures/typeOfDate-008/01/record.json +14 -0
  575. package/test-fixtures/typeOfDate-008/02/expectedResult.json +4 -0
  576. package/test-fixtures/typeOfDate-008/02/metadata.json +4 -0
  577. package/test-fixtures/typeOfDate-008/02/record.json +14 -0
  578. package/test-fixtures/typeOfDate-008/03/expectedResult.json +14 -0
  579. package/test-fixtures/typeOfDate-008/03/metadata.json +5 -0
  580. package/test-fixtures/typeOfDate-008/03/record.json +14 -0
  581. package/test-fixtures/typeOfDate-008/04/expectedResult.json +14 -0
  582. package/test-fixtures/typeOfDate-008/04/metadata.json +5 -0
  583. package/test-fixtures/typeOfDate-008/04/record.json +14 -0
  584. package/test-fixtures/typeOfDate-008/05/expectedResult.json +14 -0
  585. package/test-fixtures/typeOfDate-008/05/metadata.json +5 -0
  586. package/test-fixtures/typeOfDate-008/05/record.json +14 -0
  587. package/test-fixtures/update-field-540/f01/expectedResult.json +23 -0
  588. package/test-fixtures/update-field-540/f01/metadata.json +6 -0
  589. package/test-fixtures/update-field-540/f01/record.json +23 -0
  590. package/test-fixtures/update-field-540/v01/expectedResult.json +7 -0
  591. package/test-fixtures/update-field-540/v01/metadata.json +6 -0
  592. package/test-fixtures/update-field-540/v01/record.json +23 -0
  593. package/.travis.yml +0 -10
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/isbn-issn.spec.js"],"names":["describe","it","validator","to","be","an","that","has","any","keys","description","a","validate","record","MarcRecord","fields","tag","ind1","ind2","subfields","code","value","result","eql","valid","messages","fix"],"mappings":"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","file":"isbn-issn.spec.js","sourcesContent":["/**\n *\n * @licstart The following is the entire license notice for the JavaScript code in this file.\n *\n * MARC record validators used in Melinda\n *\n * Copyright (C) 2014-2018 University Of Helsinki (The National Library Of Finland)\n *\n * This file is part of marc-record-validators-melinda\n *\n * marc-record-validators-melinda program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * marc-record-validators-melinda is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n * @licend The above is the entire license notice\n * for the JavaScript code in this file.\n *\n */\n\n/* eslint-disable no-undef, max-nested-callbacks, no-unused-expressions */\n\n'use strict';\n\nimport {expect} from 'chai';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from '../src/isbn-issn';\n\ndescribe('isbn-issn', () => {\n\tit('Creates a validator', async () => {\n\t\tconst validator = await validatorFactory();\n\n\t\texpect(validator)\n\t\t\t.to.be.an('object')\n\t\t\t.that.has.any.keys('description', 'validate');\n\n\t\texpect(validator.description).to.be.a('string');\n\t\texpect(validator.validate).to.be.a('function');\n\t});\n\n\tdescribe('#validate', () => {\n\t\tit('Finds the record valid', async () => {\n\t\t\tconst validator = await validatorFactory();\n\t\t\tconst record = new MarcRecord({\n\t\t\t\tfields: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttag: '020',\n\t\t\t\t\t\tind1: ' ',\n\t\t\t\t\t\tind2: ' ',\n\t\t\t\t\t\tsubfields: [{code: 'a', value: '978-951-9155-47-0'}]\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttag: '022',\n\t\t\t\t\t\tind1: ' ',\n\t\t\t\t\t\tind2: ' ',\n\t\t\t\t\t\tsubfields: [{code: 'a', value: '0355-0893'}]\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t});\n\t\t\tconst result = await validator.validate(record);\n\n\t\t\texpect(result).to.eql({valid: true});\n\t\t});\n\n\t\tit('Finds the record invalid', async () => {\n\t\t\tconst validator = await validatorFactory();\n\t\t\tconst record = new MarcRecord({\n\t\t\t\tfields: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttag: '020',\n\t\t\t\t\t\tind1: ' ',\n\t\t\t\t\t\tind2: ' ',\n\t\t\t\t\t\tsubfields: [{code: 'a', value: 'foo'}]\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttag: '022',\n\t\t\t\t\t\tind1: ' ',\n\t\t\t\t\t\tind2: ' ',\n\t\t\t\t\t\tsubfields: [{code: 'a', value: 'bar'}]\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t});\n\t\t\tconst result = await validator.validate(record);\n\n\t\t\texpect(result).to.eql({valid: false, messages: [\n\t\t\t\t'ISBN foo is not valid',\n\t\t\t\t'ISSN bar is not valid'\n\t\t\t]});\n\t\t});\n\n\t\tit('Finds the record invalid (ISSN in \\'l\\'-subfield)', async () => {\n\t\t\tconst validator = await validatorFactory();\n\t\t\tconst record = new MarcRecord({\n\t\t\t\tfields: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttag: '020',\n\t\t\t\t\t\tind1: ' ',\n\t\t\t\t\t\tind2: ' ',\n\t\t\t\t\t\tsubfields: [{code: 'a', value: 'foo'}]\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttag: '022',\n\t\t\t\t\t\tind1: ' ',\n\t\t\t\t\t\tind2: ' ',\n\t\t\t\t\t\tsubfields: [{code: 'l', value: 'bar'}]\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t});\n\t\t\tconst result = await validator.validate(record);\n\n\t\t\texpect(result).to.eql({valid: false, messages: [\n\t\t\t\t'ISBN foo is not valid',\n\t\t\t\t'ISSN bar is not valid'\n\t\t\t]});\n\t\t});\n\t});\n\n\tdescribe('#fix', () => {\n\t\tit('Moves invalid ISBN to z-subfield', async () => {\n\t\t\tconst validator = await validatorFactory();\n\t\t\tconst record = new MarcRecord({\n\t\t\t\tfields: [{tag: '020', ind1: ' ', ind2: ' ',\n\t\t\t\t\tsubfields: [{code: 'a', value: 'foo'}]\n\t\t\t\t}]\n\t\t\t});\n\n\t\t\tawait validator.fix(record);\n\n\t\t\texpect(record.fields).to.eql([{\n\t\t\t\ttag: '020', ind1: ' ', ind2: ' ', subfields: [\n\t\t\t\t\t{code: 'z', value: 'foo'}\n\t\t\t\t]\n\t\t\t}]);\n\t\t});\n\n\t\tit('Moves invalid ISSN to y-subfield', async () => {\n\t\t\tconst validator = await validatorFactory();\n\t\t\tconst record = new MarcRecord({\n\t\t\t\tfields: [{tag: '022', ind1: ' ', ind2: ' ',\n\t\t\t\t\tsubfields: [{code: 'a', value: 'foo'}]\n\t\t\t\t}]\n\t\t\t});\n\n\t\t\tawait validator.fix(record);\n\n\t\t\texpect(record.fields).to.eql([{\n\t\t\t\ttag: '022', ind1: ' ', ind2: ' ', subfields: [\n\t\t\t\t\t{code: 'y', value: 'foo'}\n\t\t\t\t]\n\t\t\t}]);\n\t\t});\n\n\t\tit('Moves invalid ISSN to y-subfield (Origin l-subfield)', async () => {\n\t\t\tconst validator = await validatorFactory();\n\t\t\tconst record = new MarcRecord({\n\t\t\t\tfields: [{tag: '022', ind1: ' ', ind2: ' ',\n\t\t\t\t\tsubfields: [{code: 'l', value: 'foo'}]\n\t\t\t\t}]\n\t\t\t});\n\n\t\t\tawait validator.fix(record);\n\n\t\t\texpect(record.fields).to.eql([{\n\t\t\t\ttag: '022', ind1: ' ', ind2: ' ', subfields: [\n\t\t\t\t\t{code: 'y', value: 'foo'}\n\t\t\t\t]\n\t\t\t}]);\n\t\t});\n\t});\n});\n"]}
1
+ {"version":3,"file":"isbn-issn.spec.js","names":["_chai","require","_marcRecord","_isbnIssn","_interopRequireDefault","obj","__esModule","default","describe","it","validator","validatorFactory","expect","to","be","an","that","has","any","keys","description","a","validate","hyphenateISBN","record","MarcRecord","fields","tag","ind1","ind2","subfields","code","value","result","eql","valid","messages","skip","handleInvalid","fix"],"sources":["../src/isbn-issn.spec.js"],"sourcesContent":["import {expect} from 'chai';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from '../src/isbn-issn';\n\ndescribe('isbn-issn', () => {\n it('Creates a validator', async () => {\n const validator = await validatorFactory();\n\n expect(validator)\n .to.be.an('object')\n .that.has.any.keys('description', 'validate');\n\n expect(validator.description).to.be.a('string');\n expect(validator.validate).to.be.a('function');\n });\n\n describe('#validate', () => {\n it('Finds the record valid', async () => {\n const validator = await validatorFactory({hyphenateISBN: true});\n const record = new MarcRecord({\n fields: [\n {\n tag: '020',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: '978-600-377-017-1'}]\n },\n {\n tag: '020',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: '90-6831-372-X'}]\n },\n {tag: '020', ind1: ' ', ind2: ' ', subfields: [{code: 'z', value: '978-600-377-017-1'}]},\n {\n tag: '022',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: '0355-0893'}]\n }\n ]\n });\n const result = await validator.validate(record);\n\n expect(result).to.eql({valid: true});\n });\n\n it('Finds the record invalid', async () => {\n const validator = await validatorFactory();\n const record = new MarcRecord({\n fields: [\n {\n tag: '020',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'foo'}]\n },\n {\n tag: '020',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: '90-68-31-372-X'}] // contains an extra hyphen\n },\n {\n tag: '022',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'bar'}]\n }\n ]\n });\n const result = await validator.validate(record);\n\n expect(result).to.eql({\n valid: false, messages: [\n 'ISBN (foo) is not valid',\n 'ISSN (bar) is not valid'\n ]\n });\n });\n\n it('020 field without $a and $z is ok in this context (= no invalid ISBNs)', async () => {\n const validator = await validatorFactory();\n const record = new MarcRecord({\n fields: [\n {\n tag: '020',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'q', value: 'nidottu'}]\n }\n ]\n });\n const result = await validator.validate(record);\n\n expect(result).to.eql({\n valid: true\n });\n });\n\n it('Finds the invalid 022 field', async () => {\n const validator = await validatorFactory();\n const record = new MarcRecord({\n fields: [\n {\n tag: '022',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'z', value: '0000-0000'}]\n }\n ]\n });\n const result = await validator.validate(record);\n\n expect(result).to.eql({\n valid: false, messages: ['ISSN (undefined) is not valid']\n });\n });\n\n it('Finds the record invalid (reason: multiword)', async () => {\n const validator = await validatorFactory();\n const record = new MarcRecord({\n fields: [\n {\n tag: '020',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: '978-600-377-017-1 (nid.)'}]\n }\n ]\n });\n const result = await validator.validate(record);\n\n expect(result).to.eql({valid: false, messages: ['ISBN (978-600-377-017-1 (nid.)) is not valid']});\n });\n\n it('Finds the record invalid (ISSN in \\'l\\'-subfield)', async () => {\n const validator = await validatorFactory();\n const record = new MarcRecord({\n fields: [\n {\n tag: '020',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'foo'}]\n },\n {\n tag: '022',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'l', value: 'bar'}]\n }\n ]\n });\n const result = await validator.validate(record);\n\n expect(result).to.eql({\n valid: false, messages: [\n 'ISBN (foo) is not valid',\n 'ISSN (bar) is not valid'\n ]\n });\n });\n\n it('Finds the record invalid (valid ISBN without hyphens)', async () => {\n const validator = await validatorFactory({hyphenateISBN: true});\n const record = new MarcRecord({\n fields: [\n {\n tag: '020',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: '9789519155470'}]\n },\n {\n tag: '020',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: '9068-31-372-X'}] // legal digits, but bad hyphenation\n },\n {\n tag: '020',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: '386006004X'}]\n }\n ]\n });\n const result = await validator.validate(record);\n\n expect(result).to.eql({valid: false, messages: [\n 'ISBN (9789519155470) is not valid',\n 'ISBN (9068-31-372-X) is not valid',\n 'ISBN (386006004X) is not valid'\n ]});\n });\n\n it.skip('Finds the record invalid (Missing ISBN)');\n it.skip('Finds the record invalid (Missing ISSN)');\n });\n\n describe('#fix', () => {\n it('Moves invalid ISBN to z-subfield', async () => {\n const validator = await validatorFactory({handleInvalid: true});\n const record = new MarcRecord({\n fields: [\n {\n tag: '020', ind1: ' ', ind2: ' ',\n subfields: [{code: 'a', value: 'foo'}]\n },\n {\n tag: '020', ind1: ' ', ind2: ' ',\n subfields: [{code: 'a', value: 'crappy val'}]\n },\n {tag: '020', ind1: ' ', ind2: ' ', subfields: [{code: 'a', value: '97895234216609'}]},\n // Just a sanity check due to earlier issues:\n {tag: '020', ind1: ' ', ind2: ' ', subfields: [{code: 'z', value: '97895234216609'}]}\n ]\n });\n\n await validator.fix(record);\n\n expect(record.fields).to.eql([\n {tag: '020', ind1: ' ', ind2: ' ', subfields: [{code: 'z', value: 'foo'}]},\n {tag: '020', ind1: ' ', ind2: ' ', subfields: [{code: 'z', value: 'crappy val'}]},\n {tag: '020', ind1: ' ', ind2: ' ', subfields: [{code: 'z', value: '97895234216609'}]},\n {tag: '020', ind1: ' ', ind2: ' ', subfields: [{code: 'z', value: '97895234216609'}]}\n ]);\n });\n\n it('Moves invalid ISSN to y-subfield', async () => {\n const validator = await validatorFactory({handleInvalid: true});\n const record = new MarcRecord({\n fields: [\n {\n tag: '022', ind1: ' ', ind2: ' ',\n subfields: [{code: 'a', value: 'foo'}]\n }\n ]\n });\n\n await validator.fix(record);\n\n expect(record.fields).to.eql([\n {\n tag: '022', ind1: ' ', ind2: ' ', subfields: [{code: 'y', value: 'foo'}]\n }\n ]);\n });\n\n it('Moves invalid ISSN to y-subfield (Origin l-subfield)', async () => {\n const validator = await validatorFactory({handleInvalid: true});\n const record = new MarcRecord({\n fields: [\n {\n tag: '022', ind1: ' ', ind2: ' ',\n subfields: [{code: 'l', value: 'foo'}]\n }\n ]\n });\n\n await validator.fix(record);\n\n expect(record.fields).to.eql([\n {\n tag: '022', ind1: ' ', ind2: ' ', subfields: [{code: 'y', value: 'foo'}]\n }\n ]);\n });\n\n it('Trims spaces from value (No hyphenate)', async () => {\n const validator = await validatorFactory();\n const record = new MarcRecord({\n fields: [\n {\n tag: '020',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: ' 9786003770171'}]\n },\n {\n tag: '020',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: '9786003770171 (nidottu)'}]\n }\n ]\n });\n await validator.fix(record);\n\n expect(record.fields).to.eql([\n // NB! Initial space does not need to be removed. It's crap, but not this fixer's crap.\n {tag: '020', ind1: ' ', ind2: ' ', subfields: [{code: 'a', value: ' 9786003770171'}]},\n {tag: '020', ind1: ' ', ind2: ' ', subfields: [{code: 'a', value: '9786003770171'}, {code: 'q', value: '(nidottu)'}]}\n ]);\n });\n\n it('Trims spaces and hyphenates value', async () => {\n const validator = await validatorFactory({hyphenateISBN: true});\n const record = new MarcRecord({\n fields: [\n {\n tag: '020',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {code: 'a', value: '9786003770171 (nid.)'},\n {code: 'z', value: '9786003770171 (nid.)'},\n {code: 'z', value: 'foo bar'}\n ]\n }\n ]\n });\n await validator.fix(record);\n\n expect(record.fields).to.eql([\n {\n tag: '020',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {code: 'a', value: '978-600-377-017-1'},\n {code: 'z', value: '978-600-377-017-1'},\n {code: 'z', value: 'foo bar'},\n // NB! Technically $q should come before $z subfields, but this is good enough.\n {code: 'q', value: '(nid.)'}\n ]\n }\n ]);\n });\n\n it('No relevant data', async () => {\n const validator = await validatorFactory({hyphenateISBN: true});\n const record = new MarcRecord({\n fields: [\n {\n tag: '005',\n value: 'whatever'\n },\n {\n tag: '020',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'q', value: 'sidottu'}]\n },\n {\n tag: '024',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: ' 9786003770171'}]\n }\n ]\n });\n await validator.fix(record);\n\n expect(record.fields).to.eql([\n {tag: '005', value: 'whatever'},\n {tag: '020', ind1: ' ', ind2: ' ', subfields: [{code: 'q', value: 'sidottu'}]},\n {tag: '024', ind1: ' ', ind2: ' ', subfields: [{code: 'a', value: ' 9786003770171'}]}\n ]);\n });\n\n it('Add hyphens to ISBN', async () => {\n const validator = await validatorFactory({hyphenateISBN: true});\n const record = new MarcRecord({\n fields: [\n {\n tag: '020', ind1: ' ', ind2: ' ',\n subfields: [{code: 'a', value: '9789916605325'}]\n },\n {\n tag: '020', ind1: ' ', ind2: ' ',\n subfields: [{code: 'a', value: '917153086X'}]\n },\n {\n tag: '020',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: '9068-31-372-X'}] // legal digits, but bad hyphenation\n },\n {\n tag: '020', ind1: ' ', ind2: ' ',\n subfields: [{code: 'a', value: '386006004X (nid.)'}]\n },\n {\n tag: '020', ind1: ' ', ind2: ' ',\n subfields: [{code: 'z', value: '9789916605325'}]\n },\n {tag: '020', ind1: ' ', ind2: ' ', subfields: [{code: 'z', value: '9789916605325 (sid.)'}]}\n ]\n });\n\n await validator.fix(record);\n\n expect(record.fields).to.eql([\n {tag: '020', ind1: ' ', ind2: ' ', subfields: [{code: 'a', value: '978-9916-605-32-5'}]},\n {tag: '020', ind1: ' ', ind2: ' ', subfields: [{code: 'a', value: '91-7153-086-X'}]},\n {tag: '020', ind1: ' ', ind2: ' ', subfields: [{code: 'a', value: '90-6831-372-X'}]}, // corrected hyphens\n {tag: '020', ind1: ' ', ind2: ' ', subfields: [{code: 'a', value: '3-86006-004-X'}, {code: 'q', value: '(nid.)'}]},\n {tag: '020', ind1: ' ', ind2: ' ', subfields: [{code: 'z', value: '978-9916-605-32-5'}]},\n {tag: '020', ind1: ' ', ind2: ' ', subfields: [{code: 'z', value: '978-9916-605-32-5'}]}\n ]);\n });\n });\n});\n"],"mappings":"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"}
@@ -1,28 +1,172 @@
1
- /**
2
- *
3
- * @licstart The following is the entire license notice for the JavaScript code in this file.
4
- *
5
- * MARC record validators used in Melinda
6
- *
7
- * Copyright (C) 2014-2018 University Of Helsinki (The National Library Of Finland)
8
- *
9
- * This file is part of marc-record-validators-melinda
10
- *
11
- * marc-record-validators-melinda program is free software: you can redistribute it and/or modify
12
- * it under the terms of the GNU Affero General Public License as
13
- * published by the Free Software Foundation, either version 3 of the
14
- * License, or (at your option) any later version.
15
- *
16
- * marc-record-validators-melinda is distributed in the hope that it will be useful,
17
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
18
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
- * GNU Affero General Public License for more details.
20
- *
21
- * You should have received a copy of the GNU Affero General Public License
22
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
23
- *
24
- * @licend The above is the entire license notice
25
- * for the JavaScript code in this file.
26
- *
27
- *//* eslint-disable require-await */'use strict';Object.defineProperty(exports,'__esModule',{value:true});var _es6Promisify=require('es6-promisify');var _cld=require('cld');var _langs=require('langs');var _langs2=_interopRequireDefault(_langs);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}function _asyncToGenerator(fn){return function(){var gen=fn.apply(this,arguments);return new Promise(function(resolve,reject){function step(key,arg){try{var info=gen[key](arg);var value=info.value}catch(error){reject(error);return}if(info.done){resolve(value)}else{return Promise.resolve(value).then(function(value){step('next',value)},function(err){step('throw',err)})}}return step('next')})}}exports.default=(()=>{var _ref=_asyncToGenerator(function*(tagPattern,treshold=90){let validate=(()=>{var _ref2=_asyncToGenerator(function*(record){const results=yield checkLanguage(record);if(results.failed){return{valid:Boolean(results.currentCode),messages:['Language detection failed']}}/* istanbul ignore if: Unreliable text is hard to find */if(results.notReliable){return{valid:Boolean(results.currentCode),messages:['Language detection was not reliable']}}if(results.detected){if(results.detected!==results.currentCode){return{valid:false,messages:[`Item language code is invalid. Correct language code: ${results.detected}`]}}return{valid:true}}if(results.suggested){return{valid:Boolean(results.currentCode),messages:[`Item language code is invalid. Current code: '${results.currentCode}', suggestions: ${results.suggested.join()}`]}}});return function validate(_x2){return _ref2.apply(this,arguments)}})();let fix=(()=>{var _ref3=_asyncToGenerator(function*(record){const results=yield checkLanguage(record);/* istanbul ignore if: Unreliable text is hard to find */if(results.notReliable&&!results.currentCode){return}if(results.suggested&&results.currentCode){return}if(results.failed&&!results.currentCode){return}if(results.detected&&results.detected!==results.currentCode){const f008=record.get(/^008$/).shift();if(f008){const start=f008.value.slice(0,35);const end=f008.value.slice(38);f008.value=`${start}${results.detected}${end}`}const f041=record.get(/^041$/).shift();if(f041){const subfield=f041.subfields.find(function(sf){return sf.code==='a'});if(subfield){subfield.value=results.detected}else{f041.subfields.push({code:'a',value:results.detected});f041.subfields.sort(function(a,b){if(a.code<b.code){return-1}if(a.code>b.code){return 1}return 0})}}else{record.insertField({tag:'041',ind1:' ',ind2:' ',subfields:[{code:'a',value:results.detected}]})}}});return function fix(_x3){return _ref3.apply(this,arguments)}})();let checkLanguage=(()=>{var _ref4=_asyncToGenerator(function*(record){const text=getText(record);const langCode=getLanguageCode(record);if(text.length===0){return{failed:true,currentCode:langCode}}try{const results=yield detect(text);if(results.reliable){const detectedLang=results.languages.find(function(l){return l.percent>=treshold});if(detectedLang){return{detected:get2TLangCode(detectedLang.code),currentCode:langCode}}return{currentCode:langCode,suggested:results.languages.map(function(l){return get2TLangCode(l.code)})}}return{notReliable:true,currentCode:langCode}}catch(err){if(/^Failed to identify language$/.test(err.message)){return{failed:true,currentCode:langCode}}throw err instanceof Error?err:new Error(err.message)}function getText(record){return record.get(tagPattern).reduce((acc,field)=>{const fieldText=field.subfields.find(sf=>sf.code==='a').value;return`${acc}${fieldText}`},'')}function getLanguageCode(record){const f008=record.get(/^008$/).shift();if(f008){const code=f008.value.slice(35,38);if(/^[^ |^]+$/.test(code)&&code!=='zzzx'){return code}}const f041=record.get(/^041$/).shift();if(f041){const code=f041.subfields.find(sf=>sf.code==='a').value;return code}}function get2TLangCode(code){return _langs2.default.where('1',code)['2T']}});return function checkLanguage(_x4){return _ref4.apply(this,arguments)}})();const detect=(0,_es6Promisify.promisify)(_cld.detect);if(tagPattern instanceof RegExp){return{description:'Handles invalid/missing item language code',validate,fix}}throw new Error('No tagPattern provided')});return function(_x){return _ref.apply(this,arguments)}})();
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = _default;
7
+ var _cld3Asm = require("cld3-asm");
8
+ var _langs = _interopRequireDefault(require("langs"));
9
+ var _debug = _interopRequireDefault(require("debug"));
10
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
+ async function _default(tagPattern, treshold = 0.9) {
12
+ const debug = (0, _debug.default)('@natlibfi/marc-record-validators-melinda/item-language');
13
+ const cldFactory = await (0, _cld3Asm.loadModule)();
14
+ if (tagPattern instanceof RegExp) {
15
+ return {
16
+ description: 'Handles invalid/missing item language code',
17
+ validate,
18
+ fix
19
+ };
20
+ }
21
+ throw new Error('No tagPattern provided');
22
+ async function validate(record) {
23
+ const results = await checkLanguage(record);
24
+ if (results.failed) {
25
+ return {
26
+ valid: Boolean(results.currentCode),
27
+ messages: ['Language detection failed']
28
+ };
29
+ }
30
+ if (results.detected) {
31
+ if (results.detected !== results.currentCode) {
32
+ return {
33
+ valid: false,
34
+ messages: [`Item language code is invalid. Correct language code: ${results.detected}`]
35
+ };
36
+ }
37
+ return {
38
+ valid: true
39
+ };
40
+ }
41
+ if (results.suggested) {
42
+ return {
43
+ valid: Boolean(results.currentCode),
44
+ messages: [`Item language code is invalid. Current code: ${results.currentCode}, suggestions: ${results.suggested.join()}`]
45
+ };
46
+ }
47
+ }
48
+ async function fix(record) {
49
+ const results = await checkLanguage(record);
50
+ if (results.suggested && results.currentCode) {
51
+ return;
52
+ }
53
+ if (results.failed && !results.currentCode) {
54
+ return;
55
+ }
56
+ if (results.detected && results.detected !== results.currentCode) {
57
+ const f008 = record.get(/^008$/u).shift(); // eslint-disable-line functional/immutable-data
58
+
59
+ if (f008) {
60
+ // eslint-disable-line functional/no-conditional-statements
61
+ const start = f008.value.slice(0, 35);
62
+ const end = f008.value.slice(38);
63
+ f008.value = `${start}${results.detected}${end}`; // eslint-disable-line functional/immutable-data
64
+ }
65
+
66
+ const f041 = record.get(/^041$/u).shift(); // eslint-disable-line functional/immutable-data
67
+
68
+ if (f041) {
69
+ const subfield = f041.subfields.find(sf => sf.code === 'a');
70
+ if (subfield) {
71
+ // eslint-disable-line functional/no-conditional-statements
72
+ subfield.value = results.detected; // eslint-disable-line functional/immutable-data
73
+ } else {
74
+ // eslint-disable-line functional/no-conditional-statements
75
+ f041.subfields.push({
76
+ code: 'a',
77
+ value: results.detected
78
+ }); // eslint-disable-line functional/immutable-data
79
+ f041.subfields.sort((a, b) => {
80
+ // eslint-disable-line functional/immutable-data
81
+ if (a.code < b.code) {
82
+ return -1;
83
+ }
84
+ if (a.code > b.code) {
85
+ return 1;
86
+ }
87
+ return 0;
88
+ });
89
+ }
90
+ } else {
91
+ // eslint-disable-line functional/no-conditional-statements
92
+ record.insertField({
93
+ tag: '041',
94
+ ind1: ' ',
95
+ ind2: ' ',
96
+ subfields: [{
97
+ code: 'a',
98
+ value: results.detected
99
+ }]
100
+ });
101
+ }
102
+ }
103
+ }
104
+ async function checkLanguage(record) {
105
+ const text = getText(record);
106
+ const langCode = getLanguageCode(record);
107
+ const Identifier = cldFactory.create();
108
+ if (text.length === 0) {
109
+ Identifier.dispose();
110
+ return {
111
+ failed: true,
112
+ currentCode: langCode
113
+ };
114
+ }
115
+ try {
116
+ const results = await Identifier.findLanguage(text);
117
+ Identifier.dispose();
118
+ if (results.is_reliable) {
119
+ if (results.probability >= treshold) {
120
+ return {
121
+ detected: get2TLangCode(results.language),
122
+ currentCode: langCode
123
+ };
124
+ }
125
+ return {
126
+ currentCode: langCode,
127
+ suggested: [get2TLangCode(results.language)]
128
+ };
129
+ }
130
+ return {
131
+ failed: true,
132
+ currentCode: langCode
133
+ };
134
+ } catch (err) {
135
+ /* istanbul ignore next: How to cause errors? */
136
+ try {
137
+ Identifier.dispose();
138
+ } catch (err2) {
139
+ debug(`Got error disposing identifier: ${err2 instanceof Error ? err2.stack : err2}`);
140
+ }
141
+
142
+ /* istanbul ignore next: How to cause errors? */
143
+ throw err instanceof Error ? err : new Error(err.message);
144
+ }
145
+ function getText(record) {
146
+ return record.get(tagPattern).reduce((acc, field) => {
147
+ const fieldText = field.subfields.find(sf => sf.code === 'a').value;
148
+ return `${acc}${fieldText}`;
149
+ }, '');
150
+ }
151
+ function getLanguageCode(record) {
152
+ const f008 = record.get(/^008$/u).shift(); // eslint-disable-line functional/immutable-data
153
+
154
+ if (f008) {
155
+ const code = f008.value.slice(35, 38);
156
+ if (/^[a-z][a-z][a-z]$/u.test(code) && code !== 'zxx') {
157
+ return code;
158
+ }
159
+ }
160
+ const f041 = record.get(/^041$/u).shift(); // eslint-disable-line functional/immutable-data
161
+
162
+ if (f041) {
163
+ const code = f041.subfields.find(sf => sf.code === 'a').value;
164
+ return code;
165
+ }
166
+ }
167
+ function get2TLangCode(code) {
168
+ return _langs.default.where('1', code)['2T'];
169
+ }
170
+ }
171
+ }
28
172
  //# sourceMappingURL=item-language.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/item-language.js"],"names":["tagPattern","treshold","record","results","checkLanguage","failed","valid","Boolean","currentCode","messages","notReliable","detected","suggested","join","validate","f008","get","shift","start","value","slice","end","f041","subfield","subfields","find","sf","code","push","sort","a","b","insertField","tag","ind1","ind2","fix","text","getText","langCode","getLanguageCode","length","detect","reliable","detectedLang","languages","l","percent","get2TLangCode","map","err","test","message","Error","reduce","acc","field","fieldText","LanguageCodes","where","detectAsync","RegExp","description"],"mappings":"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","file":"item-language.js","sourcesContent":["/**\n*\n* @licstart The following is the entire license notice for the JavaScript code in this file.\n*\n* MARC record validators used in Melinda\n*\n* Copyright (C) 2014-2018 University Of Helsinki (The National Library Of Finland)\n*\n* This file is part of marc-record-validators-melinda\n*\n* marc-record-validators-melinda program is free software: you can redistribute it and/or modify\n* it under the terms of the GNU Affero General Public License as\n* published by the Free Software Foundation, either version 3 of the\n* License, or (at your option) any later version.\n*\n* marc-record-validators-melinda is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n* GNU Affero General Public License for more details.\n*\n* You should have received a copy of the GNU Affero General Public License\n* along with this program. If not, see <http://www.gnu.org/licenses/>.\n*\n* @licend The above is the entire license notice\n* for the JavaScript code in this file.\n*\n*/\n\n/* eslint-disable require-await */\n'use strict';\n\nimport {promisify} from 'es6-promisify';\nimport {detect as detectAsync} from 'cld';\nimport LanguageCodes from 'langs';\n\nexport default async function (tagPattern, treshold = 90) {\n\tconst detect = promisify(detectAsync);\n\n\tif (tagPattern instanceof RegExp) {\n\t\treturn {\n\t\t\tdescription:\n 'Handles invalid/missing item language code',\n\t\t\tvalidate,\n\t\t\tfix\n\t\t};\n\t}\n\tthrow new Error('No tagPattern provided');\n\n\tasync function validate(record) {\n\t\tconst results = await checkLanguage(record);\n\n\t\tif (results.failed) {\n\t\t\treturn {valid: Boolean(results.currentCode), messages: [\n\t\t\t\t'Language detection failed'\n\t\t\t]};\n\t\t}\n\n\t\t/* istanbul ignore if: Unreliable text is hard to find */\n\t\tif (results.notReliable) {\n\t\t\treturn {valid: Boolean(results.currentCode), messages: [\n\t\t\t\t'Language detection was not reliable'\n\t\t\t]};\n\t\t}\n\n\t\tif (results.detected) {\n\t\t\tif (results.detected !== results.currentCode) {\n\t\t\t\treturn {valid: false, messages: [\n\t\t\t\t\t`Item language code is invalid. Correct language code: ${results.detected}`\n\t\t\t\t]};\n\t\t\t}\n\t\t\treturn {valid: true};\n\t\t}\n\n\t\tif (results.suggested) {\n\t\t\treturn {valid: Boolean(results.currentCode), messages: [\n\t\t\t\t`Item language code is invalid. Current code: '${results.currentCode}', suggestions: ${results.suggested.join()}`\n\t\t\t]};\n\t\t}\n\t}\n\n\tasync function fix(record) {\n\t\tconst results = await checkLanguage(record);\n\n\t\t/* istanbul ignore if: Unreliable text is hard to find */\n\t\tif (results.notReliable && !results.currentCode) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (results.suggested && results.currentCode) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (results.failed && !results.currentCode) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (results.detected && results.detected !== results.currentCode) {\n\t\t\tconst f008 = record.get(/^008$/).shift();\n\n\t\t\tif (f008) {\n\t\t\t\tconst start = f008.value.slice(0, 35);\n\t\t\t\tconst end = f008.value.slice(38);\n\t\t\t\tf008.value = `${start}${results.detected}${end}`;\n\t\t\t}\n\n\t\t\tconst f041 = record.get(/^041$/).shift();\n\n\t\t\tif (f041) {\n\t\t\t\tconst subfield = f041.subfields.find(sf => sf.code === 'a');\n\n\t\t\t\tif (subfield) {\n\t\t\t\t\tsubfield.value = results.detected;\n\t\t\t\t} else {\n\t\t\t\t\tf041.subfields.push({code: 'a', value: results.detected});\n\t\t\t\t\tf041.subfields.sort((a, b) => {\n\t\t\t\t\t\tif (a.code < b.code) {\n\t\t\t\t\t\t\treturn -1;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (a.code > b.code) {\n\t\t\t\t\t\t\treturn 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\trecord.insertField({tag: '041', ind1: ' ', ind2: ' ', subfields: [{\n\t\t\t\t\tcode: 'a',\n\t\t\t\t\tvalue: results.detected\n\t\t\t\t}]});\n\t\t\t}\n\t\t}\n\t}\n\n\tasync function checkLanguage(record) {\n\t\tconst text = getText(record);\n\t\tconst langCode = getLanguageCode(record);\n\n\t\tif (text.length === 0) {\n\t\t\treturn {failed: true, currentCode: langCode};\n\t\t}\n\n\t\ttry {\n\t\t\tconst results = await detect(text);\n\n\t\t\tif (results.reliable) {\n\t\t\t\tconst detectedLang = results.languages.find(l => l.percent >= treshold);\n\n\t\t\t\tif (detectedLang) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdetected: get2TLangCode(detectedLang.code),\n\t\t\t\t\t\tcurrentCode: langCode\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tcurrentCode: langCode,\n\t\t\t\t\tsuggested: results.languages.map(l => get2TLangCode(l.code))\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn {notReliable: true, currentCode: langCode};\n\t\t} catch (err) {\n\t\t\tif (/^Failed to identify language$/.test(err.message)) {\n\t\t\t\treturn {failed: true, currentCode: langCode};\n\t\t\t}\n\n\t\t\tthrow err instanceof Error ? err : new Error(err.message);\n\t\t}\n\n\t\tfunction getText(record) {\n\t\t\treturn record.get(tagPattern).reduce((acc, field) => {\n\t\t\t\tconst fieldText = field.subfields.find(sf => sf.code === 'a').value;\n\t\t\t\treturn `${acc}${fieldText}`;\n\t\t\t}, '');\n\t\t}\n\n\t\tfunction getLanguageCode(record) {\n\t\t\tconst f008 = record.get(/^008$/).shift();\n\n\t\t\tif (f008) {\n\t\t\t\tconst code = f008.value.slice(35, 38);\n\t\t\t\tif (/^[^ |^]+$/.test(code) && code !== 'zzzx') {\n\t\t\t\t\treturn code;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst f041 = record.get(/^041$/).shift();\n\n\t\t\tif (f041) {\n\t\t\t\tconst code = f041.subfields.find(sf => sf.code === 'a').value;\n\t\t\t\treturn code;\n\t\t\t}\n\t\t}\n\n\t\tfunction get2TLangCode(code) {\n\t\t\treturn LanguageCodes.where('1', code)['2T'];\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"file":"item-language.js","names":["_cld3Asm","require","_langs","_interopRequireDefault","_debug","obj","__esModule","default","_default","tagPattern","treshold","debug","createDebugLogger","cldFactory","loadCLD","RegExp","description","validate","fix","Error","record","results","checkLanguage","failed","valid","Boolean","currentCode","messages","detected","suggested","join","f008","get","shift","start","value","slice","end","f041","subfield","subfields","find","sf","code","push","sort","a","b","insertField","tag","ind1","ind2","text","getText","langCode","getLanguageCode","Identifier","create","length","dispose","findLanguage","is_reliable","probability","get2TLangCode","language","err","err2","stack","message","reduce","acc","field","fieldText","test","LanguageCodes","where"],"sources":["../src/item-language.js"],"sourcesContent":["import {loadModule as loadCLD} from 'cld3-asm';\nimport LanguageCodes from 'langs';\nimport createDebugLogger from 'debug';\n\nexport default async function (tagPattern, treshold = 0.9) {\n const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/item-language');\n const cldFactory = await loadCLD();\n\n if (tagPattern instanceof RegExp) {\n return {\n description:\n 'Handles invalid/missing item language code',\n validate,\n fix\n };\n }\n\n throw new Error('No tagPattern provided');\n\n async function validate(record) {\n const results = await checkLanguage(record);\n\n if (results.failed) {\n return {valid: Boolean(results.currentCode), messages: ['Language detection failed']};\n }\n\n if (results.detected) {\n if (results.detected !== results.currentCode) {\n return {valid: false, messages: [`Item language code is invalid. Correct language code: ${results.detected}`]};\n }\n\n return {valid: true};\n }\n\n if (results.suggested) {\n return {valid: Boolean(results.currentCode), messages: [`Item language code is invalid. Current code: ${results.currentCode}, suggestions: ${results.suggested.join()}`]};\n }\n }\n\n async function fix(record) {\n const results = await checkLanguage(record);\n\n if (results.suggested && results.currentCode) {\n return;\n }\n\n if (results.failed && !results.currentCode) {\n return;\n }\n\n if (results.detected && results.detected !== results.currentCode) {\n const f008 = record.get(/^008$/u).shift(); // eslint-disable-line functional/immutable-data\n\n if (f008) { // eslint-disable-line functional/no-conditional-statements\n const start = f008.value.slice(0, 35);\n const end = f008.value.slice(38);\n f008.value = `${start}${results.detected}${end}`; // eslint-disable-line functional/immutable-data\n }\n\n const f041 = record.get(/^041$/u).shift(); // eslint-disable-line functional/immutable-data\n\n if (f041) {\n const subfield = f041.subfields.find(sf => sf.code === 'a');\n\n if (subfield) { // eslint-disable-line functional/no-conditional-statements\n subfield.value = results.detected; // eslint-disable-line functional/immutable-data\n } else { // eslint-disable-line functional/no-conditional-statements\n f041.subfields.push({code: 'a', value: results.detected}); // eslint-disable-line functional/immutable-data\n f041.subfields.sort((a, b) => { // eslint-disable-line functional/immutable-data\n if (a.code < b.code) {\n return -1;\n }\n\n if (a.code > b.code) {\n return 1;\n }\n\n return 0;\n });\n }\n } else { // eslint-disable-line functional/no-conditional-statements\n record.insertField({tag: '041', ind1: ' ', ind2: ' ', subfields: [\n {\n code: 'a',\n value: results.detected\n }\n ]});\n }\n }\n }\n\n async function checkLanguage(record) {\n const text = getText(record);\n const langCode = getLanguageCode(record);\n\n const Identifier = cldFactory.create();\n\n if (text.length === 0) {\n Identifier.dispose();\n return {failed: true, currentCode: langCode};\n }\n\n try {\n const results = await Identifier.findLanguage(text);\n Identifier.dispose();\n\n if (results.is_reliable) {\n if (results.probability >= treshold) {\n return {\n detected: get2TLangCode(results.language),\n currentCode: langCode\n };\n }\n\n return {\n currentCode: langCode,\n suggested: [get2TLangCode(results.language)]\n };\n }\n\n return {failed: true, currentCode: langCode};\n } catch (err) {\n /* istanbul ignore next: How to cause errors? */\n try {\n Identifier.dispose();\n } catch (err2) {\n debug(`Got error disposing identifier: ${err2 instanceof Error ? err2.stack : err2}`);\n }\n\n /* istanbul ignore next: How to cause errors? */\n throw err instanceof Error ? err : new Error(err.message);\n }\n\n function getText(record) {\n return record.get(tagPattern).reduce((acc, field) => {\n const fieldText = field.subfields.find(sf => sf.code === 'a').value;\n return `${acc}${fieldText}`;\n }, '');\n }\n\n function getLanguageCode(record) {\n const f008 = record.get(/^008$/u).shift(); // eslint-disable-line functional/immutable-data\n\n if (f008) {\n const code = f008.value.slice(35, 38);\n if ((/^[a-z][a-z][a-z]$/u).test(code) && code !== 'zxx') {\n return code;\n }\n }\n\n const f041 = record.get(/^041$/u).shift(); // eslint-disable-line functional/immutable-data\n\n if (f041) {\n const code = f041.subfields.find(sf => sf.code === 'a').value;\n return code;\n }\n }\n\n function get2TLangCode(code) {\n return LanguageCodes.where('1', code)['2T'];\n }\n }\n}\n"],"mappings":"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"}