@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,28 +1,91 @@
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 no-undef, max-nested-callbacks, no-unused-expressions */'use strict';var _chai=require('chai');var _chai2=_interopRequireDefault(_chai);var _chaiAsPromised=require('chai-as-promised');var _chaiAsPromised2=_interopRequireDefault(_chaiAsPromised);var _marcRecord=require('@natlibfi/marc-record');var _unicodeDecomposition=require('../src/unicode-decomposition');var _unicodeDecomposition2=_interopRequireDefault(_unicodeDecomposition);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')})}}const{expect}=_chai2.default;_chai2.default.use(_chaiAsPromised2.default);describe('unicode-decomposition',()=>{it('Creates a validator',_asyncToGenerator(function*(){const validator=yield(0,_unicodeDecomposition2.default)();expect(validator).to.be.an('object').that.has.any.keys('description','validate');expect(validator.description).to.be.a('string');expect(validator.validate).to.be.a('function')}));describe('#validate',()=>{it('Finds the record valid',_asyncToGenerator(function*(){const validator=yield(0,_unicodeDecomposition2.default)();const record=new _marcRecord.MarcRecord({fields:[{tag:'245',subfields:[{code:'a',value:'F\xF6\xF6, B\xE4r'}]}]});const result=yield validator.validate(record);expect(result).to.eql({valid:true,messages:[]})}));it('Finds the record invalid',_asyncToGenerator(function*(){const validator=yield(0,_unicodeDecomposition2.default)();const record=new _marcRecord.MarcRecord({fields:[{tag:'001',ind1:' ',ind2:'0',subfields:[{code:'a',value:'F\xF6o\u0308, Ba\u0308r'}]}]});const result=yield validator.validate(record);expect(result).to.eql({valid:false,messages:['The following subfields are not properly decomposed: a']})}));describe('#fix',()=>{it('Should fix the record',_asyncToGenerator(function*(){const validator=yield(0,_unicodeDecomposition2.default)();const record=new _marcRecord.MarcRecord({fields:[{tag:'245',subfields:[{code:'a',value:'F\xF6o\u0308, Ba\u0308r'},{code:'b',value:'== Fubar'}]}]});const recordOriginal=record.toObject();const fieldModified={tag:'245',ind1:' ',ind2:' ',subfields:[{code:'a',value:'F\xF6\xF6, B\xE4r'},{code:'b',value:'== Fubar'}]};yield validator.fix(record);expect(recordOriginal).to.not.eql(record);expect(record.fields).to.eql([fieldModified])}))})})});
1
+ "use strict";
2
+
3
+ var _chai = _interopRequireDefault(require("chai"));
4
+ var _chaiAsPromised = _interopRequireDefault(require("chai-as-promised"));
5
+ var _marcRecord = require("@natlibfi/marc-record");
6
+ var _unicodeDecomposition = _interopRequireDefault(require("../src/unicode-decomposition"));
7
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
8
+ const {
9
+ expect
10
+ } = _chai.default;
11
+ _chai.default.use(_chaiAsPromised.default);
12
+ describe('unicode-decomposition', () => {
13
+ it('Creates a validator', async () => {
14
+ const validator = await (0, _unicodeDecomposition.default)();
15
+ expect(validator).to.be.an('object').that.has.any.keys('description', 'validate');
16
+ expect(validator.description).to.be.a('string');
17
+ expect(validator.validate).to.be.a('function');
18
+ });
19
+ describe('#validate', () => {
20
+ it('Finds the record valid', async () => {
21
+ const validator = await (0, _unicodeDecomposition.default)();
22
+ const record = new _marcRecord.MarcRecord({
23
+ fields: [{
24
+ tag: '245',
25
+ subfields: [{
26
+ code: 'a',
27
+ value: 'Föö, Bär'
28
+ }]
29
+ }]
30
+ });
31
+ const result = await validator.validate(record);
32
+ expect(result).to.eql({
33
+ valid: true,
34
+ messages: []
35
+ });
36
+ });
37
+ it('Finds the record invalid', async () => {
38
+ const validator = await (0, _unicodeDecomposition.default)();
39
+ const record = new _marcRecord.MarcRecord({
40
+ fields: [{
41
+ tag: '001',
42
+ ind1: ' ',
43
+ ind2: '0',
44
+ subfields: [{
45
+ code: 'a',
46
+ value: 'Föö, Bär'
47
+ }]
48
+ }]
49
+ });
50
+ const result = await validator.validate(record);
51
+ expect(result).to.eql({
52
+ valid: false,
53
+ messages: ['The following subfields are not properly decomposed: a']
54
+ });
55
+ });
56
+ describe('#fix', () => {
57
+ it('Should fix the record', async () => {
58
+ const validator = await (0, _unicodeDecomposition.default)();
59
+ const record = new _marcRecord.MarcRecord({
60
+ fields: [{
61
+ tag: '245',
62
+ subfields: [{
63
+ code: 'a',
64
+ value: 'Föö, Bär'
65
+ }, {
66
+ code: 'b',
67
+ value: '== Fubar'
68
+ }]
69
+ }]
70
+ });
71
+ const recordOriginal = record.toObject();
72
+ const fieldModified = {
73
+ tag: '245',
74
+ ind1: ' ',
75
+ ind2: ' ',
76
+ subfields: [{
77
+ code: 'a',
78
+ value: 'Föö, Bär'
79
+ }, {
80
+ code: 'b',
81
+ value: '== Fubar'
82
+ }]
83
+ };
84
+ await validator.fix(record);
85
+ expect(recordOriginal).to.not.eql(record);
86
+ expect(record.fields).to.eql([fieldModified]);
87
+ });
88
+ });
89
+ });
90
+ });
28
91
  //# sourceMappingURL=unicode-decomposition.spec.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/unicode-decomposition.spec.js"],"names":["expect","chai","use","chaiAsPromised","describe","it","validator","to","be","an","that","has","any","keys","description","a","validate","record","MarcRecord","fields","tag","subfields","code","value","result","eql","valid","messages","ind1","ind2","recordOriginal","toObject","fieldModified","fix","not"],"mappings":"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","file":"unicode-decomposition.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 chai from 'chai';\nimport chaiAsPromised from 'chai-as-promised';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from '../src/unicode-decomposition';\n\nconst {expect} = chai;\nchai.use(chaiAsPromised);\n\ndescribe('unicode-decomposition', () => {\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: '245',\n\t\t\t\t\t\tsubfields: [{\n\t\t\t\t\t\t\tcode: 'a',\n\t\t\t\t\t\t\tvalue: 'Föö, Bär'\n\t\t\t\t\t\t}]\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\t\t\texpect(result).to.eql({valid: true, messages: []});\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: '001',\n\t\t\t\t\t\tind1: ' ',\n\t\t\t\t\t\tind2: '0',\n\t\t\t\t\t\tsubfields: [{\n\t\t\t\t\t\t\tcode: 'a',\n\t\t\t\t\t\t\tvalue: 'Föö, Bär'\n\t\t\t\t\t\t}]\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: ['The following subfields are not properly decomposed: a']});\n\t\t});\n\n\t\tdescribe('#fix', () => {\n\t\t\tit('Should fix the record', async () => {\n\t\t\t\tconst validator = await validatorFactory();\n\n\t\t\t\tconst record = new MarcRecord({\n\t\t\t\t\tfields: [{\n\t\t\t\t\t\ttag: '245',\n\t\t\t\t\t\tsubfields: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcode: 'a',\n\t\t\t\t\t\t\t\tvalue: 'Föö, Bär'\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcode: 'b',\n\t\t\t\t\t\t\t\tvalue: '== Fubar'\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t]\n\t\t\t\t\t}]\n\t\t\t\t});\n\n\t\t\t\tconst recordOriginal = record.toObject();\n\t\t\t\tconst fieldModified = {\n\t\t\t\t\ttag: '245',\n\t\t\t\t\tind1: ' ',\n\t\t\t\t\tind2: ' ',\n\t\t\t\t\tsubfields: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcode: 'a',\n\t\t\t\t\t\t\tvalue: 'Föö, Bär'\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcode: 'b',\n\t\t\t\t\t\t\tvalue: '== Fubar'\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t};\n\t\t\t\tawait validator.fix(record);\n\n\t\t\t\texpect(recordOriginal).to.not.eql(record);\n\t\t\t\texpect(record.fields).to.eql([fieldModified]);\n\t\t\t});\n\t\t});\n\t});\n});\n"]}
1
+ {"version":3,"file":"unicode-decomposition.spec.js","names":["_chai","_interopRequireDefault","require","_chaiAsPromised","_marcRecord","_unicodeDecomposition","obj","__esModule","default","expect","chai","use","chaiAsPromised","describe","it","validator","validatorFactory","to","be","an","that","has","any","keys","description","a","validate","record","MarcRecord","fields","tag","subfields","code","value","result","eql","valid","messages","ind1","ind2","recordOriginal","toObject","fieldModified","fix","not"],"sources":["../src/unicode-decomposition.spec.js"],"sourcesContent":["import chai from 'chai';\nimport chaiAsPromised from 'chai-as-promised';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from '../src/unicode-decomposition';\n\nconst {expect} = chai;\nchai.use(chaiAsPromised);\n\ndescribe('unicode-decomposition', () => {\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();\n const record = new MarcRecord({\n fields: [\n {\n tag: '245',\n subfields: [\n {\n code: 'a',\n value: 'Föö, Bär'\n }\n ]\n }\n ]\n });\n const result = await validator.validate(record);\n expect(result).to.eql({valid: true, messages: []});\n });\n\n it('Finds the record invalid', async () => {\n const validator = await validatorFactory();\n const record = new MarcRecord({\n fields: [\n {\n tag: '001',\n ind1: ' ',\n ind2: '0',\n subfields: [\n {\n code: 'a',\n value: 'Föö, Bär'\n }\n ]\n }\n ]\n });\n const result = await validator.validate(record);\n\n expect(result).to.eql({valid: false, messages: ['The following subfields are not properly decomposed: a']});\n });\n\n describe('#fix', () => {\n it('Should fix the record', async () => {\n const validator = await validatorFactory();\n\n const record = new MarcRecord({\n fields: [\n {\n tag: '245',\n subfields: [\n {\n code: 'a',\n value: 'Föö, Bär'\n },\n {\n code: 'b',\n value: '== Fubar'\n }\n ]\n }\n ]\n });\n\n const recordOriginal = record.toObject();\n const fieldModified = {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'Föö, Bär'\n },\n {\n code: 'b',\n value: '== Fubar'\n }\n ]\n };\n await validator.fix(record);\n\n expect(recordOriginal).to.not.eql(record);\n expect(record.fields).to.eql([fieldModified]);\n });\n });\n });\n});\n"],"mappings":"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"}
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = _default;
7
+ var _utils = require("./utils");
8
+ //import createDebugLogger from 'debug';
9
+
10
+ //const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/update-field-540');
11
+ // Author(s): Nicholas Volk
12
+ function _default() {
13
+ return {
14
+ description: 'Validator for field 540 (modernization as per MELKEHITYS-2431)',
15
+ validate,
16
+ fix
17
+ };
18
+ function fix(record) {
19
+ const fixedFields = getFieldsThatUseOldFormat(record, true);
20
+ const fixedFieldsAsStrings = fixedFields.map(f => (0, _utils.fieldToString)(f));
21
+ return {
22
+ message: [],
23
+ fix: fixedFieldsAsStrings,
24
+ valid: true
25
+ };
26
+ }
27
+ function validate(record) {
28
+ const yeOldeFields = getFieldsThatUseOldFormat(record, false);
29
+ if (yeOldeFields.length === 0) {
30
+ return {
31
+ 'message': [],
32
+ 'valid': true
33
+ };
34
+ }
35
+ const messages = yeOldeFields.map(f => (0, _utils.fieldToString)(f));
36
+ return {
37
+ 'message': messages,
38
+ 'valid': false
39
+ };
40
+ }
41
+ }
42
+ const licences = [{
43
+ 'license': 'CC BY 4.0',
44
+ 'url': 'https://creativecommons.org/licenses/by/4.0/deed.fi'
45
+ }, {
46
+ 'license': 'CC BY-NC 4.0',
47
+ 'url': 'https://creativecommons.org/licenses/by-nc/4.0/deed.fi'
48
+ }, {
49
+ 'license': 'CC BY-NC-ND 4.0',
50
+ 'url': 'https://creativecommons.org/licenses/by-nc-nd/4.0/deed.fi'
51
+ }, {
52
+ 'license': 'CC BY-NC-SA 4.0',
53
+ 'url': 'https://creativecommons.org/licenses/by-nc-sa/4.0/deed.fi'
54
+ }, {
55
+ 'license': 'CC BY-ND 4.0',
56
+ 'url': 'https://creativecommons.org/licenses/by-nd/4.0/deed.fi'
57
+ }, {
58
+ 'license': 'CC BY-SA 4.0',
59
+ 'url': 'https://creativecommons.org/licenses/by-sa/4.0/deed.fi'
60
+ }, {
61
+ 'license': 'CC0 1.0',
62
+ 'url': 'https://creativecommons.org/publicdomain/zero/1.0/deed.fi'
63
+ },
64
+ // not seen/unused
65
+ {
66
+ 'license': 'Public domain',
67
+ 'url': 'https://creativecommons.org/publicdomain/mark/1.0/deed.fi'
68
+ }];
69
+ function findSubfieldIndex(field, subfield) {
70
+ subfield.nvtmp = 1; // eslint-disable-line functional/immutable-data
71
+ const index = field.subfields.findIndex(sf => sf.nvtmp === 1);
72
+ delete subfield.nvtmp; // eslint-disable-line functional/immutable-data
73
+ return index;
74
+ }
75
+ function validLicenseInSubfieldC(subfieldC, license) {
76
+ if (subfieldC.code !== 'c') {
77
+ return false;
78
+ }
79
+ //nvdebug(`Compare ${subfieldC.value} vs ${license.license}`);
80
+ return license.license === subfieldC.value;
81
+ }
82
+ function validUrlInSubfieldU(subfieldU, license) {
83
+ if (subfieldU.code !== 'u') {
84
+ return false;
85
+ }
86
+ //nvdebug(`Compare ${subfieldU.value} vs ${license.url}`);
87
+ return license.url === subfieldU.value;
88
+ }
89
+ function fixC(field, subfieldC) {
90
+ // MELINDA-2431_
91
+ subfieldC.code = 'f'; // eslint-disable-line functional/immutable-data
92
+ const index = findSubfieldIndex(field, subfieldC);
93
+ field.subfields.splice(index + 1, 0, {
94
+ 'code': '2',
95
+ 'value': 'cc'
96
+ }); // eslint-disable-line functional/immutable-data
97
+ }
98
+
99
+ function fieldHasOldCcLicense(field, fix) {
100
+ if (field.tag !== '540') {
101
+ return false;
102
+ }
103
+ //nvdebug(`NORM 540: ${fieldToString(field)}`);
104
+ const validLicense = licences.find(license => field.subfields.some(sf => validLicenseInSubfieldC(sf, license)) && field.subfields.some(sf => validUrlInSubfieldU(sf, license)));
105
+ if (!validLicense) {
106
+ return false;
107
+ }
108
+ //nvdebug(` Found valid license`);
109
+ if (fix) {
110
+ // eslint-disable-line functional/no-conditional-statements
111
+ const subfieldsC = field.subfields.filter(sf => validLicenseInSubfieldC(sf, validLicense));
112
+ subfieldsC.forEach(c => fixC(field, c));
113
+ }
114
+ return true;
115
+ }
116
+ function getFieldsThatUseOldFormat(record, fix) {
117
+ return record.fields.filter(f => fieldHasOldCcLicense(f, fix));
118
+ }
119
+ //# sourceMappingURL=update-field-540.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-field-540.js","names":["_utils","require","_default","description","validate","fix","record","fixedFields","getFieldsThatUseOldFormat","fixedFieldsAsStrings","map","f","fieldToString","message","valid","yeOldeFields","length","messages","licences","findSubfieldIndex","field","subfield","nvtmp","index","subfields","findIndex","sf","validLicenseInSubfieldC","subfieldC","license","code","value","validUrlInSubfieldU","subfieldU","url","fixC","splice","fieldHasOldCcLicense","tag","validLicense","find","some","subfieldsC","filter","forEach","c","fields"],"sources":["../src/update-field-540.js"],"sourcesContent":["//import createDebugLogger from 'debug';\nimport {fieldToString} from './utils';\n\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/update-field-540');\n\n// Author(s): Nicholas Volk\nexport default function () {\n\n return {\n description: 'Validator for field 540 (modernization as per MELKEHITYS-2431)',\n validate, fix\n };\n\n function fix(record) {\n const fixedFields = getFieldsThatUseOldFormat(record, true);\n\n const fixedFieldsAsStrings = fixedFields.map(f => fieldToString(f));\n\n return {message: [], fix: fixedFieldsAsStrings, valid: true};\n }\n\n function validate(record) {\n const yeOldeFields = getFieldsThatUseOldFormat(record, false);\n if (yeOldeFields.length === 0) {\n return {'message': [], 'valid': true};\n }\n const messages = yeOldeFields.map(f => fieldToString(f));\n\n return {'message': messages, 'valid': false};\n }\n\n}\n\n\nconst licences = [\n {'license': 'CC BY 4.0', 'url': 'https://creativecommons.org/licenses/by/4.0/deed.fi'},\n {'license': 'CC BY-NC 4.0', 'url': 'https://creativecommons.org/licenses/by-nc/4.0/deed.fi'},\n {'license': 'CC BY-NC-ND 4.0', 'url': 'https://creativecommons.org/licenses/by-nc-nd/4.0/deed.fi'},\n {'license': 'CC BY-NC-SA 4.0', 'url': 'https://creativecommons.org/licenses/by-nc-sa/4.0/deed.fi'},\n {'license': 'CC BY-ND 4.0', 'url': 'https://creativecommons.org/licenses/by-nd/4.0/deed.fi'},\n {'license': 'CC BY-SA 4.0', 'url': 'https://creativecommons.org/licenses/by-sa/4.0/deed.fi'},\n {'license': 'CC0 1.0', 'url': 'https://creativecommons.org/publicdomain/zero/1.0/deed.fi'}, // not seen/unused\n {'license': 'Public domain', 'url': 'https://creativecommons.org/publicdomain/mark/1.0/deed.fi'}\n];\n\nfunction findSubfieldIndex(field, subfield) {\n subfield.nvtmp = 1; // eslint-disable-line functional/immutable-data\n const index = field.subfields.findIndex(sf => sf.nvtmp === 1);\n delete subfield.nvtmp; // eslint-disable-line functional/immutable-data\n return index;\n}\n\nfunction validLicenseInSubfieldC(subfieldC, license) {\n if (subfieldC.code !== 'c') {\n return false;\n }\n //nvdebug(`Compare ${subfieldC.value} vs ${license.license}`);\n return license.license === subfieldC.value;\n}\n\nfunction validUrlInSubfieldU(subfieldU, license) {\n if (subfieldU.code !== 'u') {\n return false;\n }\n //nvdebug(`Compare ${subfieldU.value} vs ${license.url}`);\n return license.url === subfieldU.value;\n}\n\n\nfunction fixC(field, subfieldC) {\n // MELINDA-2431_\n subfieldC.code = 'f'; // eslint-disable-line functional/immutable-data\n const index = findSubfieldIndex(field, subfieldC);\n field.subfields.splice(index + 1, 0, {'code': '2', 'value': 'cc'}); // eslint-disable-line functional/immutable-data\n}\n\nfunction fieldHasOldCcLicense(field, fix) {\n if (field.tag !== '540') {\n return false;\n }\n //nvdebug(`NORM 540: ${fieldToString(field)}`);\n const validLicense = licences.find(license => field.subfields.some(sf => validLicenseInSubfieldC(sf, license)) && field.subfields.some(sf => validUrlInSubfieldU(sf, license)));\n if (!validLicense) {\n return false;\n }\n //nvdebug(` Found valid license`);\n if (fix) { // eslint-disable-line functional/no-conditional-statements\n const subfieldsC = field.subfields.filter(sf => validLicenseInSubfieldC(sf, validLicense));\n subfieldsC.forEach(c => fixC(field, c));\n }\n\n return true;\n}\n\n\nfunction getFieldsThatUseOldFormat(record, fix) {\n return record.fields.filter(f => fieldHasOldCcLicense(f, fix));\n}\n\n"],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+
3
+ var _chai = require("chai");
4
+ var _marcRecord = require("@natlibfi/marc-record");
5
+ var _updateField = _interopRequireDefault(require("./update-field-540"));
6
+ var _fixura = require("@natlibfi/fixura");
7
+ var _fixugen = _interopRequireDefault(require("@natlibfi/fixugen"));
8
+ var _debug = _interopRequireDefault(require("debug"));
9
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
10
+ (0, _fixugen.default)({
11
+ callback,
12
+ path: [__dirname, '..', 'test-fixtures', 'update-field-540'],
13
+ useMetadataFile: true,
14
+ recurse: false,
15
+ fixura: {
16
+ reader: _fixura.READERS.JSON
17
+ },
18
+ mocha: {
19
+ before: () => testValidatorFactory()
20
+ }
21
+ });
22
+ const debug = (0, _debug.default)('@natlibfi/marc-record-validators-melinda/update-field-540:test');
23
+ async function testValidatorFactory() {
24
+ const validator = await (0, _updateField.default)();
25
+ (0, _chai.expect)(validator).to.be.an('object').that.has.any.keys('description', 'validate');
26
+ (0, _chai.expect)(validator.description).to.be.a('string');
27
+ (0, _chai.expect)(validator.validate).to.be.a('function');
28
+ }
29
+ async function callback({
30
+ getFixture,
31
+ enabled = true,
32
+ fix = false
33
+ }) {
34
+ if (enabled === false) {
35
+ debug('TEST SKIPPED!');
36
+ return;
37
+ }
38
+ const validator = await (0, _updateField.default)();
39
+ const record = new _marcRecord.MarcRecord(getFixture('record.json'));
40
+ const expectedResult = getFixture('expectedResult.json');
41
+ // console.log(expectedResult); // eslint-disable-line
42
+
43
+ if (!fix) {
44
+ const result = await validator.validate(record);
45
+ (0, _chai.expect)(result).to.eql(expectedResult);
46
+ return;
47
+ }
48
+ await validator.fix(record);
49
+ (0, _chai.expect)(record).to.eql(expectedResult);
50
+ }
51
+ //# sourceMappingURL=update-field-540.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-field-540.spec.js","names":["_chai","require","_marcRecord","_updateField","_interopRequireDefault","_fixura","_fixugen","_debug","obj","__esModule","default","generateTests","callback","path","__dirname","useMetadataFile","recurse","fixura","reader","READERS","JSON","mocha","before","testValidatorFactory","debug","createDebugLogger","validator","validatorFactory","expect","to","be","an","that","has","any","keys","description","a","validate","getFixture","enabled","fix","record","MarcRecord","expectedResult","result","eql"],"sources":["../src/update-field-540.spec.js"],"sourcesContent":["import {expect} from 'chai';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './update-field-540';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\nimport createDebugLogger from 'debug';\n\ngenerateTests({\n callback,\n path: [__dirname, '..', 'test-fixtures', 'update-field-540'],\n useMetadataFile: true,\n recurse: false,\n fixura: {\n reader: READERS.JSON\n },\n mocha: {\n before: () => testValidatorFactory()\n }\n});\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/update-field-540:test');\n\nasync function testValidatorFactory() {\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\nasync function callback({getFixture, enabled = true, fix = false}) {\n if (enabled === false) {\n debug('TEST SKIPPED!');\n return;\n }\n\n const validator = await validatorFactory();\n const record = new MarcRecord(getFixture('record.json'));\n const expectedResult = getFixture('expectedResult.json');\n // console.log(expectedResult); // eslint-disable-line\n\n if (!fix) {\n const result = await validator.validate(record);\n expect(result).to.eql(expectedResult);\n return;\n }\n\n await validator.fix(record);\n expect(record).to.eql(expectedResult);\n}\n"],"mappings":";;AAAA,IAAAA,KAAA,GAAAC,OAAA;AACA,IAAAC,WAAA,GAAAD,OAAA;AACA,IAAAE,YAAA,GAAAC,sBAAA,CAAAH,OAAA;AACA,IAAAI,OAAA,GAAAJ,OAAA;AACA,IAAAK,QAAA,GAAAF,sBAAA,CAAAH,OAAA;AACA,IAAAM,MAAA,GAAAH,sBAAA,CAAAH,OAAA;AAAsC,SAAAG,uBAAAI,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAEtC,IAAAG,gBAAa,EAAC;EACZC,QAAQ;EACRC,IAAI,EAAE,CAACC,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE,kBAAkB,CAAC;EAC5DC,eAAe,EAAE,IAAI;EACrBC,OAAO,EAAE,KAAK;EACdC,MAAM,EAAE;IACNC,MAAM,EAAEC,eAAO,CAACC;EAClB,CAAC;EACDC,KAAK,EAAE;IACLC,MAAM,EAAEA,CAAA,KAAMC,oBAAoB,CAAC;EACrC;AACF,CAAC,CAAC;AACF,MAAMC,KAAK,GAAG,IAAAC,cAAiB,EAAC,gEAAgE,CAAC;AAEjG,eAAeF,oBAAoBA,CAAA,EAAG;EACpC,MAAMG,SAAS,GAAG,MAAM,IAAAC,oBAAgB,EAAC,CAAC;EAE1C,IAAAC,YAAM,EAACF,SAAS,CAAC,CACdG,EAAE,CAACC,EAAE,CAACC,EAAE,CAAC,QAAQ,CAAC,CAClBC,IAAI,CAACC,GAAG,CAACC,GAAG,CAACC,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC;EAE/C,IAAAP,YAAM,EAACF,SAAS,CAACU,WAAW,CAAC,CAACP,EAAE,CAACC,EAAE,CAACO,CAAC,CAAC,QAAQ,CAAC;EAC/C,IAAAT,YAAM,EAACF,SAAS,CAACY,QAAQ,CAAC,CAACT,EAAE,CAACC,EAAE,CAACO,CAAC,CAAC,UAAU,CAAC;AAChD;AAEA,eAAezB,QAAQA,CAAC;EAAC2B,UAAU;EAAEC,OAAO,GAAG,IAAI;EAAEC,GAAG,GAAG;AAAK,CAAC,EAAE;EACjE,IAAID,OAAO,KAAK,KAAK,EAAE;IACrBhB,KAAK,CAAC,eAAe,CAAC;IACtB;EACF;EAEA,MAAME,SAAS,GAAG,MAAM,IAAAC,oBAAgB,EAAC,CAAC;EAC1C,MAAMe,MAAM,GAAG,IAAIC,sBAAU,CAACJ,UAAU,CAAC,aAAa,CAAC,CAAC;EACxD,MAAMK,cAAc,GAAGL,UAAU,CAAC,qBAAqB,CAAC;EACxD;;EAEA,IAAI,CAACE,GAAG,EAAE;IACR,MAAMI,MAAM,GAAG,MAAMnB,SAAS,CAACY,QAAQ,CAACI,MAAM,CAAC;IAC/C,IAAAd,YAAM,EAACiB,MAAM,CAAC,CAAChB,EAAE,CAACiB,GAAG,CAACF,cAAc,CAAC;IACrC;EACF;EAEA,MAAMlB,SAAS,CAACe,GAAG,CAACC,MAAM,CAAC;EAC3B,IAAAd,YAAM,EAACc,MAAM,CAAC,CAACb,EAAE,CAACiB,GAAG,CAACF,cAAc,CAAC;AACvC"}
package/dist/urn.js ADDED
@@ -0,0 +1,185 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = _default;
7
+ var _nodeFetch = _interopRequireDefault(require("node-fetch"));
8
+ var _utils = require("./utils");
9
+ var _debug = _interopRequireDefault(require("debug"));
10
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
+ const URN_GENERATOR_URL = 'http://generator.urn.fi/cgi-bin/urn_generator.cgi?type=nbn';
12
+ function _default(isLegalDeposit = false, useMelindaTemp = true) {
13
+ const debug = (0, _debug.default)('@natlibfi/marc-record-validators-melinda:urn');
14
+ const debugData = debug.extend('data');
15
+
16
+ // We should check that the f856 with URN has second indicator '0' (Resource), ' ' (No information provided) or '8' (No display constant generated)
17
+ // - if second indicator is '1' (Version of resource) or '2' (Related resource) the URN in f856 is not correct for the resource described in the record
18
+
19
+ // This checks only the existence of URNs from the Finnish urn.fi -resolver
20
+
21
+ const hasURN = f => f.tag === '856' && f.subfields.some(({
22
+ code,
23
+ value
24
+ }) => code === 'u' && /urn.fi/u.test(value));
25
+ return {
26
+ description: 'Adds URN for record, to 856-field (if not existing). If isLegalDeposit is active, adds legal deposit subfields to the f856s with URN.',
27
+ validate,
28
+ fix
29
+ };
30
+ async function fix(record) {
31
+ const f856sUrn = record.fields.filter(hasURN);
32
+ debugData(`f856sUrn: ${JSON.stringify(f856sUrn)}`);
33
+ const ldSubfields = isLegalDeposit ? createLDSubfields() : [];
34
+ debugData(`IsLegalDeposit: ${isLegalDeposit}, LegalDepositSubfields: ${JSON.stringify(ldSubfields)}`);
35
+
36
+ // We add the URN even if we're not getting the legalDeposit - where does this URN resolve?
37
+ // We probably should not do these additions
38
+
39
+ if (f856sUrn.length === 0) {
40
+ // eslint-disable-line functional/no-conditional-statements
41
+ const {
42
+ code,
43
+ value,
44
+ generated
45
+ } = await createURNSubfield(record);
46
+ if (generated && useMelindaTemp) {
47
+ const tempSubField = {
48
+ code: '9',
49
+ value: 'MELINDA<TEMP>'
50
+ };
51
+ record.insertField({
52
+ tag: '856',
53
+ ind1: '4',
54
+ ind2: '0',
55
+ subfields: [{
56
+ code,
57
+ value
58
+ }, ...ldSubfields, tempSubField]
59
+ });
60
+ return true;
61
+ }
62
+ record.insertField({
63
+ tag: '856',
64
+ ind1: '4',
65
+ ind2: '0',
66
+ subfields: [{
67
+ code,
68
+ value
69
+ }, ...ldSubfields]
70
+ });
71
+ return true;
72
+ } else if (isLegalDeposit) {
73
+ // eslint-disable-line functional/no-conditional-statements
74
+
75
+ // We add here legal deposit information to all URN-f856s - we probably should not do this
76
+ // We should add extra f856 URN / URNs for legal deposits that already have a open (non-legal-deposit) URN
77
+ // How do we decide which URN to use as a template if there are several URNs
78
+ // We should check for existence of a legal deposit URN anyways
79
+
80
+ f856sUrn.forEach(f => {
81
+ ldSubfields.forEach(ldsf => {
82
+ if (!f.subfields.some(sf => sf.code === ldsf.code && sf.value === ldsf.value)) {
83
+ // eslint-disable-line functional/no-conditional-statements
84
+ f.subfields.push(ldsf); // eslint-disable-line functional/immutable-data
85
+ }
86
+ });
87
+ });
88
+ }
89
+
90
+ return true;
91
+
92
+ // We should check existence of URN in f024 i1: '7' $2 urn/URN for this too
93
+
94
+ async function createURNSubfield(rec) {
95
+ // isbn is picked from the last 020 $a in the record
96
+ // what should we do in case of several 020 $a:s
97
+ const isbn = rec.fields.reduce((acc, f) => {
98
+ if (f.tag === '020') {
99
+ const a = f.subfields.find(sf => sf.code === 'a');
100
+ return a ? a.value : undefined;
101
+ }
102
+ return acc;
103
+ }, undefined);
104
+ debugData(`isbns: ${isbn}`);
105
+ const {
106
+ generated,
107
+ value
108
+ } = await createURN(isbn);
109
+ return {
110
+ code: 'u',
111
+ value,
112
+ generated
113
+ };
114
+ async function createURN(isbn = false) {
115
+ if (isbn) {
116
+ return {
117
+ generated: false,
118
+ value: `http://urn.fi/URN:ISBN:${isbn}`
119
+ };
120
+ }
121
+ const response = await (0, _nodeFetch.default)(URN_GENERATOR_URL);
122
+ const body = await response.text();
123
+
124
+ // If we generated URN we could also add it to the 024
125
+ // generated 024 should also have $9 MELINDA<TEMP>
126
+ return {
127
+ generated: true,
128
+ value: `http://urn.fi/${body}`
129
+ };
130
+ }
131
+ }
132
+ }
133
+
134
+ // Later when the new subfields that have f506/f540 -type contents, we should add also them here
135
+ function createLDSubfields() {
136
+ return [{
137
+ code: 'z',
138
+ value: 'Käytettävissä vapaakappalekirjastoissa'
139
+ }, {
140
+ code: '5',
141
+ value: 'FI-Vapaa'
142
+ }];
143
+ }
144
+ function fieldHasLDSubfields(field, ldSubfields) {
145
+ if (ldSubfields.every(ldsf => field.subfields.some(sf => sf.code === ldsf.code && sf.value === ldsf.value))) {
146
+ return true;
147
+ }
148
+ }
149
+ function validateLD(f856sUrn) {
150
+ debug(`Validating the existence of legal deposit subfields`);
151
+ const ldSubfields = createLDSubfields();
152
+ const f856sUrnWithLdSubfields = f856sUrn.filter(field => fieldHasLDSubfields(field, ldSubfields));
153
+ if (f856sUrnWithLdSubfields.length > 0) {
154
+ debug(`Record has ${f856sUrnWithLdSubfields.length} URN fields with all necessary legal deposit subfields`);
155
+ debugData(`f856sUrnWithLdSubfields: ${JSON.stringify(f856sUrnWithLdSubfields)}`);
156
+ return true;
157
+ }
158
+ return false;
159
+ }
160
+ function validate(record) {
161
+ // if not electronic skip this validator
162
+ if (!(0, _utils.isElectronicMaterial)(record)) {
163
+ debug(`Record is not electronic - no need to validate legal deposit URNs`);
164
+ return {
165
+ valid: true
166
+ };
167
+ }
168
+ const f856sUrn = record.fields.filter(hasURN);
169
+ if (f856sUrn.length > 0) {
170
+ debug(`Record has ${f856sUrn.length} URN fields`);
171
+ debugData(`f856sUrn: ${JSON.stringify(f856sUrn)}`);
172
+ if (!isLegalDeposit || validateLD(f856sUrn)) {
173
+ debug(`Record is valid`);
174
+ return {
175
+ valid: true
176
+ };
177
+ }
178
+ }
179
+ debug(`No (valid) URN fields - Record is not valid`);
180
+ return {
181
+ valid: false
182
+ };
183
+ }
184
+ }
185
+ //# sourceMappingURL=urn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"urn.js","names":["_nodeFetch","_interopRequireDefault","require","_utils","_debug","obj","__esModule","default","URN_GENERATOR_URL","_default","isLegalDeposit","useMelindaTemp","debug","createDebugLogger","debugData","extend","hasURN","f","tag","subfields","some","code","value","test","description","validate","fix","record","f856sUrn","fields","filter","JSON","stringify","ldSubfields","createLDSubfields","length","generated","createURNSubfield","tempSubField","insertField","ind1","ind2","forEach","ldsf","sf","push","rec","isbn","reduce","acc","a","find","undefined","createURN","response","fetch","body","text","fieldHasLDSubfields","field","every","validateLD","f856sUrnWithLdSubfields","isElectronicMaterial","valid"],"sources":["../src/urn.js"],"sourcesContent":["import fetch from 'node-fetch';\nimport {isElectronicMaterial} from './utils';\nimport createDebugLogger from 'debug';\n\nconst URN_GENERATOR_URL = 'http://generator.urn.fi/cgi-bin/urn_generator.cgi?type=nbn';\n\nexport default function (isLegalDeposit = false, useMelindaTemp = true) {\n const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:urn');\n const debugData = debug.extend('data');\n\n // We should check that the f856 with URN has second indicator '0' (Resource), ' ' (No information provided) or '8' (No display constant generated)\n // - if second indicator is '1' (Version of resource) or '2' (Related resource) the URN in f856 is not correct for the resource described in the record\n\n // This checks only the existence of URNs from the Finnish urn.fi -resolver\n\n const hasURN = f => f.tag === '856' && f.subfields.some(({code, value}) => code === 'u' && (/urn.fi/u).test(value));\n\n return {\n description: 'Adds URN for record, to 856-field (if not existing). If isLegalDeposit is active, adds legal deposit subfields to the f856s with URN.',\n validate,\n fix\n };\n\n async function fix(record) {\n const f856sUrn = record.fields.filter(hasURN);\n debugData(`f856sUrn: ${JSON.stringify(f856sUrn)}`);\n\n const ldSubfields = isLegalDeposit ? createLDSubfields() : [];\n debugData(`IsLegalDeposit: ${isLegalDeposit}, LegalDepositSubfields: ${JSON.stringify(ldSubfields)}`);\n\n // We add the URN even if we're not getting the legalDeposit - where does this URN resolve?\n // We probably should not do these additions\n\n if (f856sUrn.length === 0) { // eslint-disable-line functional/no-conditional-statements\n const {code, value, generated} = await createURNSubfield(record);\n\n if (generated && useMelindaTemp) {\n const tempSubField = {code: '9', value: 'MELINDA<TEMP>'};\n\n record.insertField({\n tag: '856',\n ind1: '4',\n ind2: '0',\n subfields: [{code, value}, ...ldSubfields, tempSubField]\n });\n\n return true;\n }\n\n record.insertField({\n tag: '856',\n ind1: '4',\n ind2: '0',\n subfields: [{code, value}, ...ldSubfields]\n });\n\n return true;\n } else if (isLegalDeposit) { // eslint-disable-line functional/no-conditional-statements\n\n // We add here legal deposit information to all URN-f856s - we probably should not do this\n // We should add extra f856 URN / URNs for legal deposits that already have a open (non-legal-deposit) URN\n // How do we decide which URN to use as a template if there are several URNs\n // We should check for existence of a legal deposit URN anyways\n\n f856sUrn.forEach(f => {\n ldSubfields.forEach(ldsf => {\n if (!f.subfields.some(sf => sf.code === ldsf.code && sf.value === ldsf.value)) { // eslint-disable-line functional/no-conditional-statements\n f.subfields.push(ldsf); // eslint-disable-line functional/immutable-data\n }\n });\n });\n }\n\n return true;\n\n // We should check existence of URN in f024 i1: '7' $2 urn/URN for this too\n\n async function createURNSubfield(rec) {\n // isbn is picked from the last 020 $a in the record\n // what should we do in case of several 020 $a:s\n const isbn = rec.fields.reduce((acc, f) => {\n if (f.tag === '020') {\n const a = f.subfields.find(sf => sf.code === 'a');\n return a ? a.value : undefined;\n }\n\n return acc;\n }, undefined);\n\n debugData(`isbns: ${isbn}`);\n\n const {generated, value} = await createURN(isbn);\n return {code: 'u', value, generated};\n\n async function createURN(isbn = false) {\n if (isbn) {\n return {generated: false, value: `http://urn.fi/URN:ISBN:${isbn}`};\n }\n\n const response = await fetch(URN_GENERATOR_URL);\n const body = await response.text();\n\n // If we generated URN we could also add it to the 024\n // generated 024 should also have $9 MELINDA<TEMP>\n return {generated: true, value: `http://urn.fi/${body}`};\n }\n }\n\n }\n\n // Later when the new subfields that have f506/f540 -type contents, we should add also them here\n function createLDSubfields() {\n return [\n {\n code: 'z',\n value: 'Käytettävissä vapaakappalekirjastoissa'\n },\n {\n code: '5',\n value: 'FI-Vapaa'\n }\n ];\n }\n\n function fieldHasLDSubfields(field, ldSubfields) {\n if (ldSubfields.every(ldsf => field.subfields.some(sf => sf.code === ldsf.code && sf.value === ldsf.value))) {\n return true;\n }\n }\n\n function validateLD(f856sUrn) {\n debug(`Validating the existence of legal deposit subfields`);\n const ldSubfields = createLDSubfields();\n const f856sUrnWithLdSubfields = f856sUrn.filter(field => fieldHasLDSubfields(field, ldSubfields));\n if (f856sUrnWithLdSubfields.length > 0) {\n debug(`Record has ${f856sUrnWithLdSubfields.length} URN fields with all necessary legal deposit subfields`);\n debugData(`f856sUrnWithLdSubfields: ${JSON.stringify(f856sUrnWithLdSubfields)}`);\n return true;\n }\n return false;\n }\n\n function validate(record) {\n // if not electronic skip this validator\n if (!isElectronicMaterial(record)) {\n debug(`Record is not electronic - no need to validate legal deposit URNs`);\n return {valid: true};\n }\n\n const f856sUrn = record.fields.filter(hasURN);\n\n if (f856sUrn.length > 0) {\n debug(`Record has ${f856sUrn.length} URN fields`);\n debugData(`f856sUrn: ${JSON.stringify(f856sUrn)}`);\n\n if (!isLegalDeposit || validateLD(f856sUrn)) {\n debug(`Record is valid`);\n return {valid: true};\n }\n }\n debug(`No (valid) URN fields - Record is not valid`);\n return {valid: false};\n }\n}\n"],"mappings":"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"}