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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (292) hide show
  1. package/dist/access-rights.test.js +1 -1
  2. package/dist/access-rights.test.js.map +1 -1
  3. package/dist/addMissingField337.test.js +1 -1
  4. package/dist/addMissingField337.test.js.map +1 -1
  5. package/dist/addMissingField338.test.js +1 -1
  6. package/dist/addMissingField338.test.js.map +1 -1
  7. package/dist/cyrillux-usemarcon-replacement.test.js +4 -7
  8. package/dist/cyrillux-usemarcon-replacement.test.js.map +2 -2
  9. package/dist/cyrillux.test.js +1 -1
  10. package/dist/cyrillux.test.js.map +1 -1
  11. package/dist/disambiguateSeriesStatements.test.js +1 -7
  12. package/dist/disambiguateSeriesStatements.test.js.map +2 -2
  13. package/dist/double-commas.test.js +1 -1
  14. package/dist/double-commas.test.js.map +1 -1
  15. package/dist/drop-terms.js +122 -0
  16. package/dist/drop-terms.js.map +7 -0
  17. package/dist/drop-terms.test.js +56 -0
  18. package/dist/drop-terms.test.js.map +7 -0
  19. package/dist/empty-fields.test.js +1 -1
  20. package/dist/empty-fields.test.js.map +1 -1
  21. package/dist/ending-punctuation.test.js +39 -19
  22. package/dist/ending-punctuation.test.js.map +2 -2
  23. package/dist/field-008-18-34-character-groups.test.js +2 -8
  24. package/dist/field-008-18-34-character-groups.test.js.map +2 -2
  25. package/dist/field-505-separators.test.js +1 -7
  26. package/dist/field-505-separators.test.js.map +2 -2
  27. package/dist/field-521-fix.test.js +1 -7
  28. package/dist/field-521-fix.test.js.map +2 -2
  29. package/dist/field-exclusion.test.js +11 -8
  30. package/dist/field-exclusion.test.js.map +2 -2
  31. package/dist/field-structure.test.js +1 -1
  32. package/dist/field-structure.test.js.map +1 -1
  33. package/dist/fields-present.test.js +1 -1
  34. package/dist/fields-present.test.js.map +1 -1
  35. package/dist/fix-33X.test.js +1 -1
  36. package/dist/fix-33X.test.js.map +1 -1
  37. package/dist/fix-country-codes.test.js +1 -7
  38. package/dist/fix-country-codes.test.js.map +2 -2
  39. package/dist/fix-sami-041.js +87 -0
  40. package/dist/fix-sami-041.js.map +7 -0
  41. package/dist/fix-sami-041.test.js +40 -0
  42. package/dist/fix-sami-041.test.js.map +7 -0
  43. package/dist/fixRelatorTerms.test.js +2 -8
  44. package/dist/fixRelatorTerms.test.js.map +2 -2
  45. package/dist/fixed-fields.test.js +29 -18
  46. package/dist/fixed-fields.test.js.map +2 -2
  47. package/dist/identical-fields.test.js +1 -1
  48. package/dist/identical-fields.test.js.map +1 -1
  49. package/dist/index.js +7 -1
  50. package/dist/index.js.map +2 -2
  51. package/dist/indicator-fixes.js +10 -0
  52. package/dist/indicator-fixes.js.map +2 -2
  53. package/dist/indicator-fixes.test.js +1 -7
  54. package/dist/indicator-fixes.test.js.map +2 -2
  55. package/dist/isbn-issn.js +1 -1
  56. package/dist/isbn-issn.js.map +2 -2
  57. package/dist/isbn-issn.test.js +9 -6
  58. package/dist/isbn-issn.test.js.map +2 -2
  59. package/dist/item-language.test.js +1 -1
  60. package/dist/item-language.test.js.map +2 -2
  61. package/dist/merge-fields.test.js +2 -7
  62. package/dist/merge-fields.test.js.map +2 -2
  63. package/dist/mergeField500Lisapainokset.test.js +1 -7
  64. package/dist/mergeField500Lisapainokset.test.js.map +2 -2
  65. package/dist/mergeRelatorTermFields.test.js +1 -7
  66. package/dist/mergeRelatorTermFields.test.js.map +2 -2
  67. package/dist/multiple-subfield-0.test.js +1 -7
  68. package/dist/multiple-subfield-0.test.js.map +2 -2
  69. package/dist/normalize-dashes.test.js +1 -7
  70. package/dist/normalize-dashes.test.js.map +2 -2
  71. package/dist/normalize-identifiers.test.js +1 -7
  72. package/dist/normalize-identifiers.test.js.map +2 -2
  73. package/dist/normalize-qualifying-information.test.js +1 -7
  74. package/dist/normalize-qualifying-information.test.js.map +2 -2
  75. package/dist/normalize-utf8-diacritics.test.js +1 -7
  76. package/dist/normalize-utf8-diacritics.test.js.map +2 -2
  77. package/dist/normalizeFieldForComparison.js +24 -0
  78. package/dist/normalizeFieldForComparison.js.map +2 -2
  79. package/dist/punctuation.test.js +1 -7
  80. package/dist/punctuation.test.js.map +2 -2
  81. package/dist/punctuation2.test.js +2 -8
  82. package/dist/punctuation2.test.js.map +2 -2
  83. package/dist/reindexSubfield6OccurenceNumbers.test.js +1 -7
  84. package/dist/reindexSubfield6OccurenceNumbers.test.js.map +2 -2
  85. package/dist/remove-041-zxx.js +56 -0
  86. package/dist/remove-041-zxx.js.map +7 -0
  87. package/dist/remove-041-zxx.test.js +40 -0
  88. package/dist/remove-041-zxx.test.js.map +7 -0
  89. package/dist/removeDuplicateDataFields.test.js +2 -8
  90. package/dist/removeDuplicateDataFields.test.js.map +2 -2
  91. package/dist/removeInferiorDataFields.js +1 -9
  92. package/dist/removeInferiorDataFields.js.map +2 -2
  93. package/dist/removeInferiorDataFields.test.js +1 -7
  94. package/dist/removeInferiorDataFields.test.js.map +2 -2
  95. package/dist/resolvable-ext-references-melinda.test.js +1 -1
  96. package/dist/resolvable-ext-references-melinda.test.js.map +2 -2
  97. package/dist/resolveOrphanedSubfield6s.js +1 -3
  98. package/dist/resolveOrphanedSubfield6s.js.map +2 -2
  99. package/dist/resolveOrphanedSubfield6s.test.js +1 -7
  100. package/dist/resolveOrphanedSubfield6s.test.js.map +2 -2
  101. package/dist/sanitize-vocabulary-source-codes.test.js +1 -7
  102. package/dist/sanitize-vocabulary-source-codes.test.js.map +2 -2
  103. package/dist/sort-tags.test.js +1 -1
  104. package/dist/sort-tags.test.js.map +1 -1
  105. package/dist/sortFields.js +16 -1
  106. package/dist/sortFields.js.map +2 -2
  107. package/dist/sortFields.test.js +1 -7
  108. package/dist/sortFields.test.js.map +2 -2
  109. package/dist/sortRelatorTerms.test.js +1 -7
  110. package/dist/sortRelatorTerms.test.js.map +2 -2
  111. package/dist/sortSubfields.js +3 -1
  112. package/dist/sortSubfields.js.map +2 -2
  113. package/dist/sortSubfields.test.js +1 -7
  114. package/dist/sortSubfields.test.js.map +2 -2
  115. package/dist/stripPunctuation.js +7 -4
  116. package/dist/stripPunctuation.js.map +2 -2
  117. package/dist/stripPunctuation.test.js +1 -7
  118. package/dist/stripPunctuation.test.js.map +2 -2
  119. package/dist/subfield-exclusion.test.js +1 -1
  120. package/dist/subfield-exclusion.test.js.map +1 -1
  121. package/dist/subfield6Utils.js +1 -13
  122. package/dist/subfield6Utils.js.map +2 -2
  123. package/dist/subfieldValueNormalizations.test.js +1 -7
  124. package/dist/subfieldValueNormalizations.test.js.map +2 -2
  125. package/dist/sync-007-and-300.test.js +1 -7
  126. package/dist/sync-007-and-300.test.js.map +2 -2
  127. package/dist/sync-language.js +103 -0
  128. package/dist/sync-language.js.map +7 -0
  129. package/dist/sync-language.test.js +40 -0
  130. package/dist/sync-language.test.js.map +7 -0
  131. package/dist/translate-terms.js +121 -85
  132. package/dist/translate-terms.js.map +3 -3
  133. package/dist/translate-terms.test.js +5 -8
  134. package/dist/translate-terms.test.js.map +2 -2
  135. package/dist/unicode-decomposition.test.js +1 -1
  136. package/dist/unicode-decomposition.test.js.map +1 -1
  137. package/dist/update-field-540.test.js +2 -8
  138. package/dist/update-field-540.test.js.map +2 -2
  139. package/dist/urn.test.js +2 -8
  140. package/dist/urn.test.js.map +2 -2
  141. package/package.json +18 -16
  142. package/src/access-rights.test.js +1 -1
  143. package/src/addMissingField337.test.js +1 -1
  144. package/src/addMissingField338.test.js +1 -1
  145. package/src/cyrillux-usemarcon-replacement.test.js +4 -9
  146. package/src/cyrillux.test.js +1 -1
  147. package/src/disambiguateSeriesStatements.test.js +3 -8
  148. package/src/double-commas.test.js +1 -1
  149. package/src/drop-terms.js +162 -0
  150. package/src/drop-terms.test.js +81 -0
  151. package/src/empty-fields.test.js +1 -1
  152. package/src/ending-punctuation.test.js +28 -20
  153. package/src/field-008-18-34-character-groups.test.js +4 -9
  154. package/src/field-505-separators.test.js +3 -8
  155. package/src/field-521-fix.test.js +3 -8
  156. package/src/field-exclusion.test.js +10 -8
  157. package/src/field-structure.test.js +1 -1
  158. package/src/fields-present.test.js +1 -1
  159. package/src/fix-33X.test.js +1 -1
  160. package/src/fix-country-codes.test.js +3 -8
  161. package/src/fix-sami-041.js +113 -0
  162. package/src/fix-sami-041.test.js +52 -0
  163. package/src/fixRelatorTerms.test.js +4 -9
  164. package/src/fixed-fields.test.js +24 -18
  165. package/src/identical-fields.test.js +1 -1
  166. package/src/index.js +8 -1
  167. package/src/indicator-fixes.js +12 -0
  168. package/src/indicator-fixes.test.js +3 -8
  169. package/src/isbn-issn.js +1 -1
  170. package/src/isbn-issn.test.js +8 -6
  171. package/src/item-language.test.js +2 -2
  172. package/src/merge-fields.test.js +3 -8
  173. package/src/mergeField500Lisapainokset.test.js +3 -8
  174. package/src/mergeRelatorTermFields.test.js +3 -8
  175. package/src/multiple-subfield-0.test.js +3 -8
  176. package/src/normalize-dashes.test.js +3 -8
  177. package/src/normalize-identifiers.test.js +3 -8
  178. package/src/normalize-qualifying-information.test.js +3 -8
  179. package/src/normalize-utf8-diacritics.test.js +3 -8
  180. package/src/normalizeFieldForComparison.js +26 -0
  181. package/src/punctuation.test.js +3 -8
  182. package/src/punctuation2.test.js +4 -9
  183. package/src/reindexSubfield6OccurenceNumbers.test.js +3 -8
  184. package/src/remove-041-zxx.js +85 -0
  185. package/src/remove-041-zxx.test.js +52 -0
  186. package/src/removeDuplicateDataFields.test.js +4 -9
  187. package/src/removeInferiorDataFields.js +7 -7
  188. package/src/removeInferiorDataFields.test.js +3 -8
  189. package/src/resolvable-ext-references-melinda.test.js +5 -5
  190. package/src/resolveOrphanedSubfield6s.js +3 -3
  191. package/src/resolveOrphanedSubfield6s.test.js +3 -8
  192. package/src/sanitize-vocabulary-source-codes.test.js +3 -8
  193. package/src/sort-tags.test.js +1 -1
  194. package/src/sortFields.js +20 -1
  195. package/src/sortFields.test.js +3 -8
  196. package/src/sortRelatorTerms.test.js +3 -8
  197. package/src/sortSubfields.js +3 -1
  198. package/src/sortSubfields.test.js +3 -8
  199. package/src/stripPunctuation.js +9 -6
  200. package/src/stripPunctuation.test.js +3 -8
  201. package/src/subfield-exclusion.test.js +1 -1
  202. package/src/subfield6Utils.js +13 -13
  203. package/src/subfieldValueNormalizations.test.js +3 -8
  204. package/src/sync-007-and-300.test.js +3 -8
  205. package/src/sync-language.js +148 -0
  206. package/src/sync-language.test.js +52 -0
  207. package/src/translate-terms.js +158 -103
  208. package/src/translate-terms.test.js +12 -16
  209. package/src/unicode-decomposition.test.js +1 -1
  210. package/src/update-field-540.test.js +4 -9
  211. package/src/urn.test.js +4 -9
  212. package/test-fixtures/drop-terms/01/expectedResult.json +31 -0
  213. package/test-fixtures/drop-terms/01/metadata.json +6 -0
  214. package/test-fixtures/drop-terms/01/record.json +35 -0
  215. package/test-fixtures/drop-terms/02/expectedResult.json +7 -0
  216. package/test-fixtures/drop-terms/02/metadata.json +6 -0
  217. package/test-fixtures/drop-terms/02/record.json +40 -0
  218. package/test-fixtures/drop-terms/03/expectedResult.json +6 -0
  219. package/test-fixtures/drop-terms/03/metadata.json +18 -0
  220. package/test-fixtures/drop-terms/03/record.json +39 -0
  221. package/test-fixtures/drop-terms/04/expectedResult.json +6 -0
  222. package/test-fixtures/drop-terms/04/metadata.json +19 -0
  223. package/test-fixtures/drop-terms/04/record.json +24 -0
  224. package/test-fixtures/fix-language-codes/02/metadata.json +1 -1
  225. package/test-fixtures/fix-sami-041/01/expectedResult.json +6 -0
  226. package/test-fixtures/fix-sami-041/01/metadata.json +4 -0
  227. package/test-fixtures/fix-sami-041/01/record.json +13 -0
  228. package/test-fixtures/fix-sami-041/02/expectedResult.json +10 -0
  229. package/test-fixtures/fix-sami-041/02/metadata.json +4 -0
  230. package/test-fixtures/fix-sami-041/02/record.json +8 -0
  231. package/test-fixtures/fix-sami-041/03/expectedResult.json +5 -0
  232. package/test-fixtures/fix-sami-041/03/metadata.json +5 -0
  233. package/test-fixtures/fix-sami-041/03/record.json +8 -0
  234. package/test-fixtures/fix-sami-041/04/expectedResult.json +7 -0
  235. package/test-fixtures/fix-sami-041/04/metadata.json +4 -0
  236. package/test-fixtures/fix-sami-041/04/record.json +10 -0
  237. package/test-fixtures/fix-sami-041/05/expectedResult.json +10 -0
  238. package/test-fixtures/fix-sami-041/05/metadata.json +6 -0
  239. package/test-fixtures/fix-sami-041/05/record.json +8 -0
  240. package/test-fixtures/indicator-fixes/11/expectedResult.json +10 -0
  241. package/test-fixtures/indicator-fixes/11/metadata.json +4 -0
  242. package/test-fixtures/indicator-fixes/11/record.json +10 -0
  243. package/test-fixtures/merge-fields/f05/metadata.json +1 -1
  244. package/test-fixtures/remove-041-zxx/01/expectedResult.json +5 -0
  245. package/test-fixtures/remove-041-zxx/01/metadata.json +5 -0
  246. package/test-fixtures/remove-041-zxx/01/record.json +10 -0
  247. package/test-fixtures/remove-041-zxx/02/expectedResult.json +7 -0
  248. package/test-fixtures/remove-041-zxx/02/metadata.json +5 -0
  249. package/test-fixtures/remove-041-zxx/02/record.json +9 -0
  250. package/test-fixtures/remove-041-zxx/11/expectedResult.json +10 -0
  251. package/test-fixtures/remove-041-zxx/11/metadata.json +5 -0
  252. package/test-fixtures/remove-041-zxx/11/record.json +9 -0
  253. package/test-fixtures/remove-041-zxx/12/expectedResult.json +10 -0
  254. package/test-fixtures/remove-041-zxx/12/metadata.json +5 -0
  255. package/test-fixtures/remove-041-zxx/12/record.json +9 -0
  256. package/test-fixtures/sort-fields/15/input.json +9 -0
  257. package/test-fixtures/sort-fields/15/metadata.json +5 -0
  258. package/test-fixtures/sort-fields/15/result.json +10 -0
  259. package/test-fixtures/sync-language/01/expectedResult.json +5 -0
  260. package/test-fixtures/sync-language/01/metadata.json +5 -0
  261. package/test-fixtures/sync-language/01/record.json +7 -0
  262. package/test-fixtures/sync-language/02/expectedResult.json +6 -0
  263. package/test-fixtures/sync-language/02/metadata.json +5 -0
  264. package/test-fixtures/sync-language/02/record.json +10 -0
  265. package/test-fixtures/sync-language/03/expectedResult.json +6 -0
  266. package/test-fixtures/sync-language/03/metadata.json +5 -0
  267. package/test-fixtures/sync-language/03/record.json +6 -0
  268. package/test-fixtures/sync-language/10/expectedResult.json +10 -0
  269. package/test-fixtures/sync-language/10/metadata.json +5 -0
  270. package/test-fixtures/sync-language/10/record.json +8 -0
  271. package/test-fixtures/sync-language/11/expectedResult.json +10 -0
  272. package/test-fixtures/sync-language/11/metadata.json +5 -0
  273. package/test-fixtures/sync-language/11/record.json +7 -0
  274. package/test-fixtures/sync-language/12/expectedResult.json +9 -0
  275. package/test-fixtures/sync-language/12/metadata.json +6 -0
  276. package/test-fixtures/sync-language/12/record.json +6 -0
  277. package/test-fixtures/sync-language/13/expectedResult.json +10 -0
  278. package/test-fixtures/sync-language/13/metadata.json +5 -0
  279. package/test-fixtures/sync-language/13/record.json +8 -0
  280. package/test-fixtures/sync-language/14/expectedResult.json +9 -0
  281. package/test-fixtures/sync-language/14/metadata.json +5 -0
  282. package/test-fixtures/sync-language/14/record.json +7 -0
  283. package/test-fixtures/sync-language/15/expectedResult.json +9 -0
  284. package/test-fixtures/sync-language/15/metadata.json +5 -0
  285. package/test-fixtures/sync-language/15/record.json +7 -0
  286. package/test-fixtures/translate-terms/05/expectedResult.json +12 -0
  287. package/test-fixtures/translate-terms/05/metadata.json +7 -0
  288. package/test-fixtures/translate-terms/05/record.json +11 -0
  289. package/test-fixtures/translate-terms/06/expectedResult.json +12 -0
  290. package/test-fixtures/translate-terms/06/metadata.json +7 -0
  291. package/test-fixtures/translate-terms/06/record.json +11 -0
  292. package/test-fixtures/translate-terms-data.js +23 -0
@@ -1,7 +1,7 @@
1
1
  import assert from "node:assert";
2
2
  import { describe, it } from "node:test";
3
3
  import { MarcRecord } from "@natlibfi/marc-record";
4
- import validatorFactory from "../src/access-rights.js";
4
+ import validatorFactory from "./access-rights.js";
5
5
  describe("access-rights", async () => {
6
6
  const f337 = {
7
7
  tag: "337",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/access-rights.test.js"],
4
- "sourcesContent": ["import assert from 'node:assert';\nimport {describe, it} from 'node:test';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from '../src/access-rights.js';\n\n\ndescribe('access-rights', async () => {\n // Fields\n const f337 = {\n tag: '337',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {code: 'b', value: 'c'},\n {code: '2', value: 'rdamedia'}\n ]\n };\n\n const f337nonElectronic = {\n tag: '337',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {code: 'a', value: 'k\u00E4ytett\u00E4viss\u00E4 ilman laitetta'},\n {code: 'b', value: 'n'},\n {code: '2', value: 'rdamedia'}\n ]\n };\n\n const ldf5061old = {\n tag: '506',\n ind1: '1',\n ind2: ' ',\n subfields: [\n {code: 'a', value: 'Aineisto on k\u00E4ytett\u00E4viss\u00E4 vapaakappalekirjastoissa.'},\n {code: 'f', value: 'Online access with authorization'},\n {code: '2', value: 'star'},\n {code: '5', value: 'FI-Vapaa'},\n {code: '9', value: 'FENNI<KEEP>'}\n ]\n };\n\n const ldf5061new = {\n tag: '506',\n ind1: '1',\n ind2: ' ',\n subfields: [\n {code: 'a', value: 'Aineisto on k\u00E4ytett\u00E4viss\u00E4 vapaakappalety\u00F6asemilla.'},\n {code: 'f', value: 'Online access with authorization'},\n {code: '2', value: 'star'},\n {code: '5', value: 'FI-Vapaa'},\n {code: '9', value: 'FENNI<KEEP>'}\n ]\n };\n\n\n const ldf540 = {\n tag: '540',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {code: 'a', value: 'Aineisto on k\u00E4ytett\u00E4viss\u00E4 tutkimus- ja muihin tarkoituksiin;'},\n {code: 'b', value: 'Kansalliskirjasto;'},\n {code: 'c', value: 'Laki kulttuuriaineistojen tallettamisesta ja s\u00E4ilytt\u00E4misest\u00E4'},\n {code: 'u', value: 'http://www.finlex.fi/fi/laki/ajantasa/2007/20071433'},\n {code: '5', value: 'FI-Vapaa'},\n {code: '9', value: 'FENNI<KEEP>'}\n ]\n };\n\n const f5060 = {\n tag: '506',\n ind1: '0',\n ind2: ' ',\n subfields: [\n {code: 'a', value: 'Aineisto on vapaasti saatavissa.'},\n {code: 'f', value: 'Unrestricted online access'},\n {code: '2', value: 'star'},\n {code: '9', value: 'FENNI<KEEP>'}\n ]\n };\n\n const f540 = {\n tag: '540',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'c', value: 'This publication is copyrighted. You may download, display and print it for Your own personal use. Commercial use is prohibited.'}]\n };\n\n it('Creates a validator', async () => {\n const validator = await validatorFactory();\n\n assert.equal(typeof validator, 'object');\n assert.equal(typeof validator.description, 'string');\n assert.equal(typeof validator.validate, 'function');\n });\n\n // Tests\n const test = await (async () => {\n const validator = await validatorFactory();\n return {\n validate: async (valid, ...recfields) => {\n const result = await validator.validate(new MarcRecord({fields: recfields}));\n assert.deepEqual(result, {valid});\n },\n\n fix: async (recfields, resfields) => {\n const record = new MarcRecord({fields: recfields});\n await validator.fix(record);\n assert.deepEqual(record.fields, resfields);\n }\n };\n })();\n\n describe('#validate', () => {\n it('Finds the record valid; fields 5061 and 540 are missing but its ok since record is not electronic', async () => {\n await test.validate(true, f337nonElectronic);\n });\n\n it('Finds the record valid; Legal deposit fields 5061 and 540', async () => {\n await test.validate(true, f337, ldf5061new, ldf540);\n });\n\n it('Finds the record invalid; Old phrase in 5061', async () => {\n await test.validate(false, f337, ldf5061old, ldf540);\n });\n\n it('Finds the record invalid; Missing 5061', async () => {\n await test.validate(false, f337, f5060, ldf540);\n });\n\n it('Finds the record invalid; Missing 540', async () => {\n await test.validate(false, f337, ldf5061new, f540);\n });\n\n it('Finds the record invalid; Missing 5061 and 540', async () => {\n await test.validate(false, f337, f5060, f540);\n });\n });\n\n describe('#fix', () => {\n it('Legal deposit fields 5061 and 540; Nothing to add', async () => {\n await test.fix([ldf5061new, ldf540], [ldf5061new, ldf540]);\n });\n\n it('Old phrase in 5061; Overwritten with new phrase', async () => {\n await test.fix([ldf5061old, ldf540], [ldf5061new, ldf540]);\n });\n\n it('540 but missing 5061; Adds 5061', async () => {\n await test.fix([f5060, ldf540], [f5060, ldf5061new, ldf540]);\n });\n\n it('5061 but missing 540; Adds 540', async () => {\n await test.fix([ldf5061new, f540], [ldf5061new, f540, ldf540]);\n });\n\n it('Both, 5061 and 540, missing; Adds 5061 and 540', async () => {\n await test.fix([f5060, f540], [f5060, ldf5061new, f540, ldf540]);\n });\n });\n});\n"],
4
+ "sourcesContent": ["import assert from 'node:assert';\nimport {describe, it} from 'node:test';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './access-rights.js';\n\n\ndescribe('access-rights', async () => {\n // Fields\n const f337 = {\n tag: '337',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {code: 'b', value: 'c'},\n {code: '2', value: 'rdamedia'}\n ]\n };\n\n const f337nonElectronic = {\n tag: '337',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {code: 'a', value: 'k\u00E4ytett\u00E4viss\u00E4 ilman laitetta'},\n {code: 'b', value: 'n'},\n {code: '2', value: 'rdamedia'}\n ]\n };\n\n const ldf5061old = {\n tag: '506',\n ind1: '1',\n ind2: ' ',\n subfields: [\n {code: 'a', value: 'Aineisto on k\u00E4ytett\u00E4viss\u00E4 vapaakappalekirjastoissa.'},\n {code: 'f', value: 'Online access with authorization'},\n {code: '2', value: 'star'},\n {code: '5', value: 'FI-Vapaa'},\n {code: '9', value: 'FENNI<KEEP>'}\n ]\n };\n\n const ldf5061new = {\n tag: '506',\n ind1: '1',\n ind2: ' ',\n subfields: [\n {code: 'a', value: 'Aineisto on k\u00E4ytett\u00E4viss\u00E4 vapaakappalety\u00F6asemilla.'},\n {code: 'f', value: 'Online access with authorization'},\n {code: '2', value: 'star'},\n {code: '5', value: 'FI-Vapaa'},\n {code: '9', value: 'FENNI<KEEP>'}\n ]\n };\n\n\n const ldf540 = {\n tag: '540',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {code: 'a', value: 'Aineisto on k\u00E4ytett\u00E4viss\u00E4 tutkimus- ja muihin tarkoituksiin;'},\n {code: 'b', value: 'Kansalliskirjasto;'},\n {code: 'c', value: 'Laki kulttuuriaineistojen tallettamisesta ja s\u00E4ilytt\u00E4misest\u00E4'},\n {code: 'u', value: 'http://www.finlex.fi/fi/laki/ajantasa/2007/20071433'},\n {code: '5', value: 'FI-Vapaa'},\n {code: '9', value: 'FENNI<KEEP>'}\n ]\n };\n\n const f5060 = {\n tag: '506',\n ind1: '0',\n ind2: ' ',\n subfields: [\n {code: 'a', value: 'Aineisto on vapaasti saatavissa.'},\n {code: 'f', value: 'Unrestricted online access'},\n {code: '2', value: 'star'},\n {code: '9', value: 'FENNI<KEEP>'}\n ]\n };\n\n const f540 = {\n tag: '540',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'c', value: 'This publication is copyrighted. You may download, display and print it for Your own personal use. Commercial use is prohibited.'}]\n };\n\n it('Creates a validator', async () => {\n const validator = await validatorFactory();\n\n assert.equal(typeof validator, 'object');\n assert.equal(typeof validator.description, 'string');\n assert.equal(typeof validator.validate, 'function');\n });\n\n // Tests\n const test = await (async () => {\n const validator = await validatorFactory();\n return {\n validate: async (valid, ...recfields) => {\n const result = await validator.validate(new MarcRecord({fields: recfields}));\n assert.deepEqual(result, {valid});\n },\n\n fix: async (recfields, resfields) => {\n const record = new MarcRecord({fields: recfields});\n await validator.fix(record);\n assert.deepEqual(record.fields, resfields);\n }\n };\n })();\n\n describe('#validate', () => {\n it('Finds the record valid; fields 5061 and 540 are missing but its ok since record is not electronic', async () => {\n await test.validate(true, f337nonElectronic);\n });\n\n it('Finds the record valid; Legal deposit fields 5061 and 540', async () => {\n await test.validate(true, f337, ldf5061new, ldf540);\n });\n\n it('Finds the record invalid; Old phrase in 5061', async () => {\n await test.validate(false, f337, ldf5061old, ldf540);\n });\n\n it('Finds the record invalid; Missing 5061', async () => {\n await test.validate(false, f337, f5060, ldf540);\n });\n\n it('Finds the record invalid; Missing 540', async () => {\n await test.validate(false, f337, ldf5061new, f540);\n });\n\n it('Finds the record invalid; Missing 5061 and 540', async () => {\n await test.validate(false, f337, f5060, f540);\n });\n });\n\n describe('#fix', () => {\n it('Legal deposit fields 5061 and 540; Nothing to add', async () => {\n await test.fix([ldf5061new, ldf540], [ldf5061new, ldf540]);\n });\n\n it('Old phrase in 5061; Overwritten with new phrase', async () => {\n await test.fix([ldf5061old, ldf540], [ldf5061new, ldf540]);\n });\n\n it('540 but missing 5061; Adds 5061', async () => {\n await test.fix([f5060, ldf540], [f5060, ldf5061new, ldf540]);\n });\n\n it('5061 but missing 540; Adds 540', async () => {\n await test.fix([ldf5061new, f540], [ldf5061new, f540, ldf540]);\n });\n\n it('Both, 5061 and 540, missing; Adds 5061 and 540', async () => {\n await test.fix([f5060, f540], [f5060, ldf5061new, f540, ldf540]);\n });\n });\n});\n"],
5
5
  "mappings": "AAAA,OAAO,YAAY;AACnB,SAAQ,UAAU,UAAS;AAC3B,SAAQ,kBAAiB;AACzB,OAAO,sBAAsB;AAG7B,SAAS,iBAAiB,YAAY;AAEpC,QAAM,OAAO;AAAA,IACX,KAAK;AAAA,IACL,MAAM;AAAA,IACN,MAAM;AAAA,IACN,WAAW;AAAA,MACT,EAAC,MAAM,KAAK,OAAO,IAAG;AAAA,MACtB,EAAC,MAAM,KAAK,OAAO,WAAU;AAAA,IAC/B;AAAA,EACF;AAEA,QAAM,oBAAoB;AAAA,IACxB,KAAK;AAAA,IACL,MAAM;AAAA,IACN,MAAM;AAAA,IACN,WAAW;AAAA,MACT,EAAC,MAAM,KAAK,OAAO,wCAA8B;AAAA,MACjD,EAAC,MAAM,KAAK,OAAO,IAAG;AAAA,MACtB,EAAC,MAAM,KAAK,OAAO,WAAU;AAAA,IAC/B;AAAA,EACF;AAEA,QAAM,aAAa;AAAA,IACjB,KAAK;AAAA,IACL,MAAM;AAAA,IACN,MAAM;AAAA,IACN,WAAW;AAAA,MACT,EAAC,MAAM,KAAK,OAAO,+DAAqD;AAAA,MACxE,EAAC,MAAM,KAAK,OAAO,mCAAkC;AAAA,MACrD,EAAC,MAAM,KAAK,OAAO,OAAM;AAAA,MACzB,EAAC,MAAM,KAAK,OAAO,WAAU;AAAA,MAC7B,EAAC,MAAM,KAAK,OAAO,cAAa;AAAA,IAClC;AAAA,EACF;AAEA,QAAM,aAAa;AAAA,IACjB,KAAK;AAAA,IACL,MAAM;AAAA,IACN,MAAM;AAAA,IACN,WAAW;AAAA,MACT,EAAC,MAAM,KAAK,OAAO,iEAAoD;AAAA,MACvE,EAAC,MAAM,KAAK,OAAO,mCAAkC;AAAA,MACrD,EAAC,MAAM,KAAK,OAAO,OAAM;AAAA,MACzB,EAAC,MAAM,KAAK,OAAO,WAAU;AAAA,MAC7B,EAAC,MAAM,KAAK,OAAO,cAAa;AAAA,IAClC;AAAA,EACF;AAGA,QAAM,SAAS;AAAA,IACb,KAAK;AAAA,IACL,MAAM;AAAA,IACN,MAAM;AAAA,IACN,WAAW;AAAA,MACT,EAAC,MAAM,KAAK,OAAO,wEAA8D;AAAA,MACjF,EAAC,MAAM,KAAK,OAAO,qBAAoB;AAAA,MACvC,EAAC,MAAM,KAAK,OAAO,wEAA8D;AAAA,MACjF,EAAC,MAAM,KAAK,OAAO,sDAAqD;AAAA,MACxE,EAAC,MAAM,KAAK,OAAO,WAAU;AAAA,MAC7B,EAAC,MAAM,KAAK,OAAO,cAAa;AAAA,IAClC;AAAA,EACF;AAEA,QAAM,QAAQ;AAAA,IACZ,KAAK;AAAA,IACL,MAAM;AAAA,IACN,MAAM;AAAA,IACN,WAAW;AAAA,MACT,EAAC,MAAM,KAAK,OAAO,mCAAkC;AAAA,MACrD,EAAC,MAAM,KAAK,OAAO,6BAA4B;AAAA,MAC/C,EAAC,MAAM,KAAK,OAAO,OAAM;AAAA,MACzB,EAAC,MAAM,KAAK,OAAO,cAAa;AAAA,IAClC;AAAA,EACF;AAEA,QAAM,OAAO;AAAA,IACX,KAAK;AAAA,IACL,MAAM;AAAA,IACN,MAAM;AAAA,IACN,WAAW,CAAC,EAAC,MAAM,KAAK,OAAO,mIAAkI,CAAC;AAAA,EACpK;AAEA,KAAG,uBAAuB,YAAY;AACpC,UAAM,YAAY,MAAM,iBAAiB;AAEzC,WAAO,MAAM,OAAO,WAAW,QAAQ;AACvC,WAAO,MAAM,OAAO,UAAU,aAAa,QAAQ;AACnD,WAAO,MAAM,OAAO,UAAU,UAAU,UAAU;AAAA,EACpD,CAAC;AAGD,QAAM,OAAO,OAAO,YAAY;AAC9B,UAAM,YAAY,MAAM,iBAAiB;AACzC,WAAO;AAAA,MACL,UAAU,OAAO,UAAU,cAAc;AACvC,cAAM,SAAS,MAAM,UAAU,SAAS,IAAI,WAAW,EAAC,QAAQ,UAAS,CAAC,CAAC;AAC3E,eAAO,UAAU,QAAQ,EAAC,MAAK,CAAC;AAAA,MAClC;AAAA,MAEA,KAAK,OAAO,WAAW,cAAc;AACnC,cAAM,SAAS,IAAI,WAAW,EAAC,QAAQ,UAAS,CAAC;AACjD,cAAM,UAAU,IAAI,MAAM;AAC1B,eAAO,UAAU,OAAO,QAAQ,SAAS;AAAA,MAC3C;AAAA,IACF;AAAA,EACF,GAAG;AAEH,WAAS,aAAa,MAAM;AAC1B,OAAG,qGAAqG,YAAY;AAClH,YAAM,KAAK,SAAS,MAAM,iBAAiB;AAAA,IAC7C,CAAC;AAED,OAAG,6DAA6D,YAAY;AAC1E,YAAM,KAAK,SAAS,MAAM,MAAM,YAAY,MAAM;AAAA,IACpD,CAAC;AAED,OAAG,gDAAgD,YAAY;AAC7D,YAAM,KAAK,SAAS,OAAO,MAAM,YAAY,MAAM;AAAA,IACrD,CAAC;AAED,OAAG,0CAA0C,YAAY;AACvD,YAAM,KAAK,SAAS,OAAO,MAAM,OAAO,MAAM;AAAA,IAChD,CAAC;AAED,OAAG,yCAAyC,YAAY;AACtD,YAAM,KAAK,SAAS,OAAO,MAAM,YAAY,IAAI;AAAA,IACnD,CAAC;AAED,OAAG,kDAAkD,YAAY;AAC/D,YAAM,KAAK,SAAS,OAAO,MAAM,OAAO,IAAI;AAAA,IAC9C,CAAC;AAAA,EACH,CAAC;AAED,WAAS,QAAQ,MAAM;AACrB,OAAG,qDAAqD,YAAY;AAClE,YAAM,KAAK,IAAI,CAAC,YAAY,MAAM,GAAG,CAAC,YAAY,MAAM,CAAC;AAAA,IAC3D,CAAC;AAED,OAAG,mDAAmD,YAAY;AAChE,YAAM,KAAK,IAAI,CAAC,YAAY,MAAM,GAAG,CAAC,YAAY,MAAM,CAAC;AAAA,IAC3D,CAAC;AAED,OAAG,mCAAmC,YAAY;AAChD,YAAM,KAAK,IAAI,CAAC,OAAO,MAAM,GAAG,CAAC,OAAO,YAAY,MAAM,CAAC;AAAA,IAC7D,CAAC;AAED,OAAG,kCAAkC,YAAY;AAC/C,YAAM,KAAK,IAAI,CAAC,YAAY,IAAI,GAAG,CAAC,YAAY,MAAM,MAAM,CAAC;AAAA,IAC/D,CAAC;AAED,OAAG,kDAAkD,YAAY;AAC/D,YAAM,KAAK,IAAI,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,YAAY,MAAM,MAAM,CAAC;AAAA,IACjE,CAAC;AAAA,EACH,CAAC;AACH,CAAC;",
6
6
  "names": []
7
7
  }
@@ -1,6 +1,6 @@
1
1
  import assert from "node:assert";
2
2
  import { MarcRecord } from "@natlibfi/marc-record";
3
- import validatorFactory from "../src/addMissingField337.js";
3
+ import validatorFactory from "./addMissingField337.js";
4
4
  import { READERS } from "@natlibfi/fixura";
5
5
  import generateTests from "@natlibfi/fixugen";
6
6
  generateTests({
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/addMissingField337.test.js"],
4
- "sourcesContent": ["import assert from 'node:assert';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from '../src/addMissingField337.js';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\n\ngenerateTests({\n callback,\n path: [import.meta.dirname, '..', 'test-fixtures', 'addMissingField337'],\n useMetadataFile: true,\n recurse: false,\n fixura: {\n reader: READERS.JSON\n },\n hooks: {\n before: async () => {\n testValidatorFactory();\n }\n }\n});\n\nasync function testValidatorFactory() {\n const validator = await validatorFactory();\n\n assert.equal(typeof validator, 'object');\n assert.equal(typeof validator.description, 'string');\n assert.equal(typeof validator.validate, 'function');\n assert.equal(typeof validator.fix, 'function');\n}\n\nasync function callback({getFixture, fix = false}) {\n const validator = await validatorFactory();\n const record = new MarcRecord(getFixture('record.json'));\n const expectedResult = getFixture('expectedResult.json');\n\n if (!fix) {\n const result = await validator.validate(record);\n assert.deepEqual(result, expectedResult);\n return;\n }\n\n await validator.fix(record);\n assert.deepEqual(record, expectedResult);\n}\n"],
4
+ "sourcesContent": ["import assert from 'node:assert';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './addMissingField337.js';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\n\ngenerateTests({\n callback,\n path: [import.meta.dirname, '..', 'test-fixtures', 'addMissingField337'],\n useMetadataFile: true,\n recurse: false,\n fixura: {\n reader: READERS.JSON\n },\n hooks: {\n before: async () => {\n testValidatorFactory();\n }\n }\n});\n\nasync function testValidatorFactory() {\n const validator = await validatorFactory();\n\n assert.equal(typeof validator, 'object');\n assert.equal(typeof validator.description, 'string');\n assert.equal(typeof validator.validate, 'function');\n assert.equal(typeof validator.fix, 'function');\n}\n\nasync function callback({getFixture, fix = false}) {\n const validator = await validatorFactory();\n const record = new MarcRecord(getFixture('record.json'));\n const expectedResult = getFixture('expectedResult.json');\n\n if (!fix) {\n const result = await validator.validate(record);\n assert.deepEqual(result, expectedResult);\n return;\n }\n\n await validator.fix(record);\n assert.deepEqual(record, expectedResult);\n}\n"],
5
5
  "mappings": "AAAA,OAAO,YAAY;AACnB,SAAQ,kBAAiB;AACzB,OAAO,sBAAsB;AAC7B,SAAQ,eAAc;AACtB,OAAO,mBAAmB;AAE1B,cAAc;AAAA,EACZ;AAAA,EACA,MAAM,CAAC,YAAY,SAAS,MAAM,iBAAiB,oBAAoB;AAAA,EACvE,iBAAiB;AAAA,EACjB,SAAS;AAAA,EACT,QAAQ;AAAA,IACN,QAAQ,QAAQ;AAAA,EAClB;AAAA,EACA,OAAO;AAAA,IACL,QAAQ,YAAY;AAClB,2BAAqB;AAAA,IACvB;AAAA,EACF;AACF,CAAC;AAED,eAAe,uBAAuB;AACpC,QAAM,YAAY,MAAM,iBAAiB;AAEzC,SAAO,MAAM,OAAO,WAAW,QAAQ;AACvC,SAAO,MAAM,OAAO,UAAU,aAAa,QAAQ;AACnD,SAAO,MAAM,OAAO,UAAU,UAAU,UAAU;AAClD,SAAO,MAAM,OAAO,UAAU,KAAK,UAAU;AAC/C;AAEA,eAAe,SAAS,EAAC,YAAY,MAAM,MAAK,GAAG;AACjD,QAAM,YAAY,MAAM,iBAAiB;AACzC,QAAM,SAAS,IAAI,WAAW,WAAW,aAAa,CAAC;AACvD,QAAM,iBAAiB,WAAW,qBAAqB;AAEvD,MAAI,CAAC,KAAK;AACR,UAAM,SAAS,MAAM,UAAU,SAAS,MAAM;AAC9C,WAAO,UAAU,QAAQ,cAAc;AACvC;AAAA,EACF;AAEA,QAAM,UAAU,IAAI,MAAM;AAC1B,SAAO,UAAU,QAAQ,cAAc;AACzC;",
6
6
  "names": []
7
7
  }
@@ -1,6 +1,6 @@
1
1
  import assert from "node:assert";
2
2
  import { MarcRecord } from "@natlibfi/marc-record";
3
- import validatorFactory from "../src/addMissingField338.js";
3
+ import validatorFactory from "./addMissingField338.js";
4
4
  import { READERS } from "@natlibfi/fixura";
5
5
  import generateTests from "@natlibfi/fixugen";
6
6
  generateTests({
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/addMissingField338.test.js"],
4
- "sourcesContent": ["import assert from 'node:assert';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from '../src/addMissingField338.js';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\n\ngenerateTests({\n callback,\n path: [import.meta.dirname, '..', 'test-fixtures', 'addMissingField338'],\n useMetadataFile: true,\n recurse: false,\n fixura: {\n reader: READERS.JSON\n },\n hooks: {\n before: async () => {\n testValidatorFactory();\n }\n }\n});\n\nasync function testValidatorFactory() {\n const validator = await validatorFactory();\n\n assert.equal(typeof validator, 'object');\n assert.equal(typeof validator.description, 'string');\n assert.equal(typeof validator.validate, 'function');\n assert.equal(validator.fix, 'function');\n}\n\nasync function callback({getFixture, fix = false}) {\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 assert.deepEqual(result, expectedResult);\n return;\n }\n\n await validator.fix(record);\n assert.deepEqual(record, expectedResult);\n}\n"],
4
+ "sourcesContent": ["import assert from 'node:assert';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './addMissingField338.js';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\n\ngenerateTests({\n callback,\n path: [import.meta.dirname, '..', 'test-fixtures', 'addMissingField338'],\n useMetadataFile: true,\n recurse: false,\n fixura: {\n reader: READERS.JSON\n },\n hooks: {\n before: async () => {\n testValidatorFactory();\n }\n }\n});\n\nasync function testValidatorFactory() {\n const validator = await validatorFactory();\n\n assert.equal(typeof validator, 'object');\n assert.equal(typeof validator.description, 'string');\n assert.equal(typeof validator.validate, 'function');\n assert.equal(validator.fix, 'function');\n}\n\nasync function callback({getFixture, fix = false}) {\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 assert.deepEqual(result, expectedResult);\n return;\n }\n\n await validator.fix(record);\n assert.deepEqual(record, expectedResult);\n}\n"],
5
5
  "mappings": "AAAA,OAAO,YAAY;AACnB,SAAQ,kBAAiB;AACzB,OAAO,sBAAsB;AAC7B,SAAQ,eAAc;AACtB,OAAO,mBAAmB;AAE1B,cAAc;AAAA,EACZ;AAAA,EACA,MAAM,CAAC,YAAY,SAAS,MAAM,iBAAiB,oBAAoB;AAAA,EACvE,iBAAiB;AAAA,EACjB,SAAS;AAAA,EACT,QAAQ;AAAA,IACN,QAAQ,QAAQ;AAAA,EAClB;AAAA,EACA,OAAO;AAAA,IACL,QAAQ,YAAY;AAClB,2BAAqB;AAAA,IACvB;AAAA,EACF;AACF,CAAC;AAED,eAAe,uBAAuB;AACpC,QAAM,YAAY,MAAM,iBAAiB;AAEzC,SAAO,MAAM,OAAO,WAAW,QAAQ;AACvC,SAAO,MAAM,OAAO,UAAU,aAAa,QAAQ;AACnD,SAAO,MAAM,OAAO,UAAU,UAAU,UAAU;AAClD,SAAO,MAAM,UAAU,KAAK,UAAU;AACxC;AAEA,eAAe,SAAS,EAAC,YAAY,MAAM,MAAK,GAAG;AACjD,QAAM,YAAY,MAAM,iBAAiB;AACzC,QAAM,SAAS,IAAI,WAAW,WAAW,aAAa,CAAC;AACvD,QAAM,iBAAiB,WAAW,qBAAqB;AAGvD,MAAI,CAAC,KAAK;AACR,UAAM,SAAS,MAAM,UAAU,SAAS,MAAM;AAC9C,WAAO,UAAU,QAAQ,cAAc;AACvC;AAAA,EACF;AAEA,QAAM,UAAU,IAAI,MAAM;AAC1B,SAAO,UAAU,QAAQ,cAAc;AACzC;",
6
6
  "names": []
7
7
  }
@@ -1,15 +1,8 @@
1
1
  import assert from "node:assert";
2
- import { after, before } from "node:test";
3
2
  import { MarcRecord } from "@natlibfi/marc-record";
4
3
  import validatorFactory from "./cyrillux-usemarcon-replacement.js";
5
4
  import { READERS } from "@natlibfi/fixura";
6
5
  import generateTests from "@natlibfi/fixugen";
7
- before(() => {
8
- MarcRecord.setValidationOptions({ subfields: false, subfieldValues: false });
9
- });
10
- after(() => {
11
- MarcRecord.setValidationOptions({});
12
- });
13
6
  generateTests({
14
7
  callback,
15
8
  path: [import.meta.dirname, "..", "test-fixtures", "cyrillux-usemarcon-replacement"],
@@ -20,7 +13,11 @@ generateTests({
20
13
  },
21
14
  hooks: {
22
15
  before: async () => {
16
+ MarcRecord.setValidationOptions({ subfields: false, subfieldValues: false });
23
17
  testValidatorFactory();
18
+ },
19
+ after: async () => {
20
+ MarcRecord.setValidationOptions({});
24
21
  }
25
22
  }
26
23
  });
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/cyrillux-usemarcon-replacement.test.js"],
4
- "sourcesContent": ["import assert from 'node:assert';\nimport {after, before} from 'node:test';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './cyrillux-usemarcon-replacement.js';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\n\nbefore(() => {\n MarcRecord.setValidationOptions({subfields: false, subfieldValues: false});\n});\n\nafter(() => {\n MarcRecord.setValidationOptions({});\n});\n\ngenerateTests({\n callback,\n path: [import.meta.dirname, '..', 'test-fixtures', 'cyrillux-usemarcon-replacement'],\n useMetadataFile: true,\n recurse: false,\n fixura: {\n reader: READERS.JSON\n },\n hooks: {\n before: async () => {\n testValidatorFactory();\n }\n }\n});\n\n\nasync function testValidatorFactory() {\n const validator = await validatorFactory();\n\n assert.equal(typeof validator, 'object');\n assert.equal(typeof validator.description, 'string');\n assert.equal(typeof validator.validate, 'function');\n assert.equal(typeof validator.fix, 'function');\n}\n\nasync function callback({getFixture, fix = false}) {\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 assert.deepEqual(result, expectedResult);\n return;\n }\n\n await validator.fix(record);\n assert.deepEqual(record, expectedResult);\n}\n"],
5
- "mappings": "AAAA,OAAO,YAAY;AACnB,SAAQ,OAAO,cAAa;AAC5B,SAAQ,kBAAiB;AACzB,OAAO,sBAAsB;AAC7B,SAAQ,eAAc;AACtB,OAAO,mBAAmB;AAE1B,OAAO,MAAM;AACX,aAAW,qBAAqB,EAAC,WAAW,OAAO,gBAAgB,MAAK,CAAC;AAC3E,CAAC;AAED,MAAM,MAAM;AACV,aAAW,qBAAqB,CAAC,CAAC;AACpC,CAAC;AAED,cAAc;AAAA,EACZ;AAAA,EACA,MAAM,CAAC,YAAY,SAAS,MAAM,iBAAiB,gCAAgC;AAAA,EACnF,iBAAiB;AAAA,EACjB,SAAS;AAAA,EACT,QAAQ;AAAA,IACN,QAAQ,QAAQ;AAAA,EAClB;AAAA,EACA,OAAO;AAAA,IACL,QAAQ,YAAY;AAClB,2BAAqB;AAAA,IACvB;AAAA,EACF;AACF,CAAC;AAGD,eAAe,uBAAuB;AACpC,QAAM,YAAY,MAAM,iBAAiB;AAEzC,SAAO,MAAM,OAAO,WAAW,QAAQ;AACvC,SAAO,MAAM,OAAO,UAAU,aAAa,QAAQ;AACnD,SAAO,MAAM,OAAO,UAAU,UAAU,UAAU;AAClD,SAAO,MAAM,OAAO,UAAU,KAAK,UAAU;AAC/C;AAEA,eAAe,SAAS,EAAC,YAAY,MAAM,MAAK,GAAG;AACjD,QAAM,YAAY,MAAM,iBAAiB;AACzC,QAAM,SAAS,IAAI,WAAW,WAAW,aAAa,CAAC;AACvD,QAAM,iBAAiB,WAAW,qBAAqB;AAGvD,MAAI,CAAC,KAAK;AACR,UAAM,SAAS,MAAM,UAAU,SAAS,MAAM;AAC9C,WAAO,UAAU,QAAQ,cAAc;AACvC;AAAA,EACF;AAEA,QAAM,UAAU,IAAI,MAAM;AAC1B,SAAO,UAAU,QAAQ,cAAc;AACzC;",
4
+ "sourcesContent": ["import assert from 'node:assert';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './cyrillux-usemarcon-replacement.js';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\n\ngenerateTests({\n callback,\n path: [import.meta.dirname, '..', 'test-fixtures', 'cyrillux-usemarcon-replacement'],\n useMetadataFile: true,\n recurse: false,\n fixura: {\n reader: READERS.JSON\n },\n hooks: {\n before: async () => {\n MarcRecord.setValidationOptions({subfields: false, subfieldValues: false});\n testValidatorFactory();\n },\n after: async () => {\n MarcRecord.setValidationOptions({});\n }\n }\n});\n\n\nasync function testValidatorFactory() {\n const validator = await validatorFactory();\n\n assert.equal(typeof validator, 'object');\n assert.equal(typeof validator.description, 'string');\n assert.equal(typeof validator.validate, 'function');\n assert.equal(typeof validator.fix, 'function');\n}\n\nasync function callback({getFixture, fix = false}) {\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 assert.deepEqual(result, expectedResult);\n return;\n }\n\n await validator.fix(record);\n assert.deepEqual(record, expectedResult);\n}\n"],
5
+ "mappings": "AAAA,OAAO,YAAY;AACnB,SAAQ,kBAAiB;AACzB,OAAO,sBAAsB;AAC7B,SAAQ,eAAc;AACtB,OAAO,mBAAmB;AAE1B,cAAc;AAAA,EACZ;AAAA,EACA,MAAM,CAAC,YAAY,SAAS,MAAM,iBAAiB,gCAAgC;AAAA,EACnF,iBAAiB;AAAA,EACjB,SAAS;AAAA,EACT,QAAQ;AAAA,IACN,QAAQ,QAAQ;AAAA,EAClB;AAAA,EACA,OAAO;AAAA,IACL,QAAQ,YAAY;AAClB,iBAAW,qBAAqB,EAAC,WAAW,OAAO,gBAAgB,MAAK,CAAC;AACzE,2BAAqB;AAAA,IACvB;AAAA,IACA,OAAO,YAAY;AACjB,iBAAW,qBAAqB,CAAC,CAAC;AAAA,IACpC;AAAA,EACF;AACF,CAAC;AAGD,eAAe,uBAAuB;AACpC,QAAM,YAAY,MAAM,iBAAiB;AAEzC,SAAO,MAAM,OAAO,WAAW,QAAQ;AACvC,SAAO,MAAM,OAAO,UAAU,aAAa,QAAQ;AACnD,SAAO,MAAM,OAAO,UAAU,UAAU,UAAU;AAClD,SAAO,MAAM,OAAO,UAAU,KAAK,UAAU;AAC/C;AAEA,eAAe,SAAS,EAAC,YAAY,MAAM,MAAK,GAAG;AACjD,QAAM,YAAY,MAAM,iBAAiB;AACzC,QAAM,SAAS,IAAI,WAAW,WAAW,aAAa,CAAC;AACvD,QAAM,iBAAiB,WAAW,qBAAqB;AAGvD,MAAI,CAAC,KAAK;AACR,UAAM,SAAS,MAAM,UAAU,SAAS,MAAM;AAC9C,WAAO,UAAU,QAAQ,cAAc;AACvC;AAAA,EACF;AAEA,QAAM,UAAU,IAAI,MAAM;AAC1B,SAAO,UAAU,QAAQ,cAAc;AACzC;",
6
6
  "names": []
7
7
  }
@@ -1,6 +1,6 @@
1
1
  import assert from "node:assert";
2
2
  import { MarcRecord } from "@natlibfi/marc-record";
3
- import validatorFactory from "../src/cyrillux.js";
3
+ import validatorFactory from "./cyrillux.js";
4
4
  import { READERS } from "@natlibfi/fixura";
5
5
  import generateTests from "@natlibfi/fixugen";
6
6
  generateTests({
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/cyrillux.test.js"],
4
- "sourcesContent": ["import assert from 'node:assert';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from '../src/cyrillux.js';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\n\ngenerateTests({\n callback,\n path: [import.meta.dirname, '..', 'test-fixtures', 'cyrillux'],\n useMetadataFile: true,\n recurse: false,\n fixura: {\n reader: READERS.JSON\n },\n hooks: {\n before: async () => {\n testValidatorFactory();\n }\n }\n});\n\nasync function testValidatorFactory() {\n const validator = await validatorFactory();\n\n assert.equal(typeof validator, 'object');\n assert.equal(typeof validator.description, 'string');\n assert.equal(typeof validator.validate, 'function');\n assert.equal(typeof validator.fix, 'function');\n}\n\nasync function callback({getFixture, fix = false, config = {}}) {\n const validator = await validatorFactory(config);\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 assert.deepEqual(result, expectedResult);\n return;\n }\n\n await validator.fix(record);\n assert.deepEqual(record, expectedResult);\n}\n"],
4
+ "sourcesContent": ["import assert from 'node:assert';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './cyrillux.js';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\n\ngenerateTests({\n callback,\n path: [import.meta.dirname, '..', 'test-fixtures', 'cyrillux'],\n useMetadataFile: true,\n recurse: false,\n fixura: {\n reader: READERS.JSON\n },\n hooks: {\n before: async () => {\n testValidatorFactory();\n }\n }\n});\n\nasync function testValidatorFactory() {\n const validator = await validatorFactory();\n\n assert.equal(typeof validator, 'object');\n assert.equal(typeof validator.description, 'string');\n assert.equal(typeof validator.validate, 'function');\n assert.equal(typeof validator.fix, 'function');\n}\n\nasync function callback({getFixture, fix = false, config = {}}) {\n const validator = await validatorFactory(config);\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 assert.deepEqual(result, expectedResult);\n return;\n }\n\n await validator.fix(record);\n assert.deepEqual(record, expectedResult);\n}\n"],
5
5
  "mappings": "AAAA,OAAO,YAAY;AACnB,SAAQ,kBAAiB;AACzB,OAAO,sBAAsB;AAC7B,SAAQ,eAAc;AACtB,OAAO,mBAAmB;AAE1B,cAAc;AAAA,EACZ;AAAA,EACA,MAAM,CAAC,YAAY,SAAS,MAAM,iBAAiB,UAAU;AAAA,EAC7D,iBAAiB;AAAA,EACjB,SAAS;AAAA,EACT,QAAQ;AAAA,IACN,QAAQ,QAAQ;AAAA,EAClB;AAAA,EACA,OAAO;AAAA,IACL,QAAQ,YAAY;AAClB,2BAAqB;AAAA,IACvB;AAAA,EACF;AACF,CAAC;AAED,eAAe,uBAAuB;AACpC,QAAM,YAAY,MAAM,iBAAiB;AAEzC,SAAO,MAAM,OAAO,WAAW,QAAQ;AACvC,SAAO,MAAM,OAAO,UAAU,aAAa,QAAQ;AACnD,SAAO,MAAM,OAAO,UAAU,UAAU,UAAU;AAClD,SAAO,MAAM,OAAO,UAAU,KAAK,UAAU;AAC/C;AAEA,eAAe,SAAS,EAAC,YAAY,MAAM,OAAO,SAAS,CAAC,EAAC,GAAG;AAC9D,QAAM,YAAY,MAAM,iBAAiB,MAAM;AAC/C,QAAM,SAAS,IAAI,WAAW,WAAW,aAAa,CAAC;AACvD,QAAM,iBAAiB,WAAW,qBAAqB;AAGvD,MAAI,CAAC,KAAK;AACR,UAAM,SAAS,MAAM,UAAU,SAAS,MAAM;AAC9C,WAAO,UAAU,QAAQ,cAAc;AACvC;AAAA,EACF;AAEA,QAAM,UAAU,IAAI,MAAM;AAC1B,SAAO,UAAU,QAAQ,cAAc;AACzC;",
6
6
  "names": []
7
7
  }
@@ -3,7 +3,6 @@ import { MarcRecord } from "@natlibfi/marc-record";
3
3
  import validatorFactory from "./disambiguateSeriesStatements.js";
4
4
  import { READERS } from "@natlibfi/fixura";
5
5
  import generateTests from "@natlibfi/fixugen";
6
- import createDebugLogger from "debug";
7
6
  generateTests({
8
7
  callback,
9
8
  path: [import.meta.dirname, "..", "test-fixtures", "disambiguate-series-statements"],
@@ -18,18 +17,13 @@ generateTests({
18
17
  }
19
18
  }
20
19
  });
21
- const debug = createDebugLogger("@natlibfi/marc-record-validators-melinda/disambiguateSeriesStatements:test");
22
20
  async function testValidatorFactory() {
23
21
  const validator = await validatorFactory();
24
22
  assert.equal(typeof validator, "object");
25
23
  assert.equal(typeof validator.description, "string");
26
24
  assert.equal(typeof validator.validate, "function");
27
25
  }
28
- async function callback({ getFixture, enabled = true, fix = false }) {
29
- if (enabled === false) {
30
- debug("TEST SKIPPED!");
31
- return;
32
- }
26
+ async function callback({ getFixture, fix = false }) {
33
27
  const validator = await validatorFactory();
34
28
  const record = new MarcRecord(getFixture("record.json"));
35
29
  const expectedResult = getFixture("expectedResult.json");
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/disambiguateSeriesStatements.test.js"],
4
- "sourcesContent": ["import assert from 'node:assert';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './disambiguateSeriesStatements.js';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\nimport createDebugLogger from 'debug';\n\ngenerateTests({\n callback,\n path: [import.meta.dirname, '..', 'test-fixtures', 'disambiguate-series-statements'],\n useMetadataFile: true,\n recurse: false,\n fixura: {\n reader: READERS.JSON\n },\n hooks: {\n before: async () => {\n testValidatorFactory();\n }\n }\n});\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/disambiguateSeriesStatements:test');\n\nasync function testValidatorFactory() {\n const validator = await validatorFactory();\n\n assert.equal(typeof validator, 'object');\n assert.equal(typeof validator.description, 'string');\n assert.equal(typeof validator.validate, '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 assert.deepEqual(result, expectedResult);\n return;\n }\n\n await validator.fix(record);\n assert.deepEqual(record, expectedResult);\n}\n"],
5
- "mappings": "AAAA,OAAO,YAAY;AACnB,SAAQ,kBAAiB;AACzB,OAAO,sBAAsB;AAC7B,SAAQ,eAAc;AACtB,OAAO,mBAAmB;AAC1B,OAAO,uBAAuB;AAE9B,cAAc;AAAA,EACZ;AAAA,EACA,MAAM,CAAC,YAAY,SAAS,MAAM,iBAAiB,gCAAgC;AAAA,EACnF,iBAAiB;AAAA,EACjB,SAAS;AAAA,EACT,QAAQ;AAAA,IACN,QAAQ,QAAQ;AAAA,EAClB;AAAA,EACA,OAAO;AAAA,IACL,QAAQ,YAAY;AAClB,2BAAqB;AAAA,IACvB;AAAA,EACF;AACF,CAAC;AACD,MAAM,QAAQ,kBAAkB,4EAA4E;AAE5G,eAAe,uBAAuB;AACpC,QAAM,YAAY,MAAM,iBAAiB;AAEzC,SAAO,MAAM,OAAO,WAAW,QAAQ;AACvC,SAAO,MAAM,OAAO,UAAU,aAAa,QAAQ;AACnD,SAAO,MAAM,OAAO,UAAU,UAAU,UAAU;AACpD;AAEA,eAAe,SAAS,EAAC,YAAY,UAAU,MAAM,MAAM,MAAK,GAAG;AACjE,MAAI,YAAY,OAAO;AACrB,UAAM,eAAe;AACrB;AAAA,EACF;AAEA,QAAM,YAAY,MAAM,iBAAiB;AACzC,QAAM,SAAS,IAAI,WAAW,WAAW,aAAa,CAAC;AACvD,QAAM,iBAAiB,WAAW,qBAAqB;AAGvD,MAAI,CAAC,KAAK;AACR,UAAM,SAAS,MAAM,UAAU,SAAS,MAAM;AAC9C,WAAO,UAAU,QAAQ,cAAc;AACvC;AAAA,EACF;AAEA,QAAM,UAAU,IAAI,MAAM;AAC1B,SAAO,UAAU,QAAQ,cAAc;AACzC;",
4
+ "sourcesContent": ["import assert from 'node:assert';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './disambiguateSeriesStatements.js';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\n//import createDebugLogger from 'debug';\n\ngenerateTests({\n callback,\n path: [import.meta.dirname, '..', 'test-fixtures', 'disambiguate-series-statements'],\n useMetadataFile: true,\n recurse: false,\n fixura: {\n reader: READERS.JSON\n },\n hooks: {\n before: async () => {\n testValidatorFactory();\n }\n }\n});\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/disambiguateSeriesStatements:test');\n\nasync function testValidatorFactory() {\n const validator = await validatorFactory();\n\n assert.equal(typeof validator, 'object');\n assert.equal(typeof validator.description, 'string');\n assert.equal(typeof validator.validate, 'function');\n}\n\nasync function callback({getFixture, fix = false}) {\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 assert.deepEqual(result, expectedResult);\n return;\n }\n\n await validator.fix(record);\n assert.deepEqual(record, expectedResult);\n}\n"],
5
+ "mappings": "AAAA,OAAO,YAAY;AACnB,SAAQ,kBAAiB;AACzB,OAAO,sBAAsB;AAC7B,SAAQ,eAAc;AACtB,OAAO,mBAAmB;AAG1B,cAAc;AAAA,EACZ;AAAA,EACA,MAAM,CAAC,YAAY,SAAS,MAAM,iBAAiB,gCAAgC;AAAA,EACnF,iBAAiB;AAAA,EACjB,SAAS;AAAA,EACT,QAAQ;AAAA,IACN,QAAQ,QAAQ;AAAA,EAClB;AAAA,EACA,OAAO;AAAA,IACL,QAAQ,YAAY;AAClB,2BAAqB;AAAA,IACvB;AAAA,EACF;AACF,CAAC;AAGD,eAAe,uBAAuB;AACpC,QAAM,YAAY,MAAM,iBAAiB;AAEzC,SAAO,MAAM,OAAO,WAAW,QAAQ;AACvC,SAAO,MAAM,OAAO,UAAU,aAAa,QAAQ;AACnD,SAAO,MAAM,OAAO,UAAU,UAAU,UAAU;AACpD;AAEA,eAAe,SAAS,EAAC,YAAY,MAAM,MAAK,GAAG;AACjD,QAAM,YAAY,MAAM,iBAAiB;AACzC,QAAM,SAAS,IAAI,WAAW,WAAW,aAAa,CAAC;AACvD,QAAM,iBAAiB,WAAW,qBAAqB;AAGvD,MAAI,CAAC,KAAK;AACR,UAAM,SAAS,MAAM,UAAU,SAAS,MAAM;AAC9C,WAAO,UAAU,QAAQ,cAAc;AACvC;AAAA,EACF;AAEA,QAAM,UAAU,IAAI,MAAM;AAC1B,SAAO,UAAU,QAAQ,cAAc;AACzC;",
6
6
  "names": []
7
7
  }
@@ -1,6 +1,6 @@
1
1
  import assert from "node:assert";
2
2
  import { MarcRecord } from "@natlibfi/marc-record";
3
- import validatorFactory from "../src/double-commas.js";
3
+ import validatorFactory from "./double-commas.js";
4
4
  import { describe, it } from "node:test";
5
5
  describe("double-commas", () => {
6
6
  it("Creates a validator", async () => {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/double-commas.test.js"],
4
- "sourcesContent": ["import assert from 'node:assert';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from '../src/double-commas.js';\nimport {describe, it} from 'node:test';\n\ndescribe('double-commas', () => {\n it('Creates a validator', async () => {\n const validator = await validatorFactory();\n\n assert.equal(typeof validator, 'object');\n assert.equal(typeof validator.description, 'string');\n assert.equal(typeof validator.validate, 'function');\n });\n\n describe('#validate', () => {\n it('Finds the record valid', async () => {\n const validator = await validatorFactory();\n const record = new MarcRecord({\n fields: [{tag: '700', subfields: [{code: 'e', value: 'foo,bar'}]}]\n });\n const result = await validator.validate(record);\n\n assert.deepEqual(result, {valid: true});\n });\n it('Finds the record invalid', async () => {\n const validator = await validatorFactory();\n const record = new MarcRecord({\n fields: [{tag: '700', subfields: [{code: 'e', value: 'foo,,bar'}]}]\n });\n const result = await validator.validate(record);\n\n assert.deepEqual(result, {valid: false});\n });\n });\n\n describe('#fix', () => {\n it('Fixes the record', async () => {\n const validator = await validatorFactory();\n const record = new MarcRecord({\n fields: [{tag: '700', subfields: [{code: 'e', value: 'foo,,bar'}]}]\n });\n await validator.fix(record);\n\n assert.deepEqual(record.fields, [\n {\n tag: '700',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'e', value: 'foo,bar'}]\n }\n ]);\n });\n });\n});\n"],
4
+ "sourcesContent": ["import assert from 'node:assert';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './double-commas.js';\nimport {describe, it} from 'node:test';\n\ndescribe('double-commas', () => {\n it('Creates a validator', async () => {\n const validator = await validatorFactory();\n\n assert.equal(typeof validator, 'object');\n assert.equal(typeof validator.description, 'string');\n assert.equal(typeof validator.validate, 'function');\n });\n\n describe('#validate', () => {\n it('Finds the record valid', async () => {\n const validator = await validatorFactory();\n const record = new MarcRecord({\n fields: [{tag: '700', subfields: [{code: 'e', value: 'foo,bar'}]}]\n });\n const result = await validator.validate(record);\n\n assert.deepEqual(result, {valid: true});\n });\n it('Finds the record invalid', async () => {\n const validator = await validatorFactory();\n const record = new MarcRecord({\n fields: [{tag: '700', subfields: [{code: 'e', value: 'foo,,bar'}]}]\n });\n const result = await validator.validate(record);\n\n assert.deepEqual(result, {valid: false});\n });\n });\n\n describe('#fix', () => {\n it('Fixes the record', async () => {\n const validator = await validatorFactory();\n const record = new MarcRecord({\n fields: [{tag: '700', subfields: [{code: 'e', value: 'foo,,bar'}]}]\n });\n await validator.fix(record);\n\n assert.deepEqual(record.fields, [\n {\n tag: '700',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'e', value: 'foo,bar'}]\n }\n ]);\n });\n });\n});\n"],
5
5
  "mappings": "AAAA,OAAO,YAAY;AACnB,SAAQ,kBAAiB;AACzB,OAAO,sBAAsB;AAC7B,SAAQ,UAAU,UAAS;AAE3B,SAAS,iBAAiB,MAAM;AAC9B,KAAG,uBAAuB,YAAY;AACpC,UAAM,YAAY,MAAM,iBAAiB;AAEzC,WAAO,MAAM,OAAO,WAAW,QAAQ;AACvC,WAAO,MAAM,OAAO,UAAU,aAAa,QAAQ;AACnD,WAAO,MAAM,OAAO,UAAU,UAAU,UAAU;AAAA,EACpD,CAAC;AAED,WAAS,aAAa,MAAM;AAC1B,OAAG,0BAA0B,YAAY;AACvC,YAAM,YAAY,MAAM,iBAAiB;AACzC,YAAM,SAAS,IAAI,WAAW;AAAA,QAC5B,QAAQ,CAAC,EAAC,KAAK,OAAO,WAAW,CAAC,EAAC,MAAM,KAAK,OAAO,UAAS,CAAC,EAAC,CAAC;AAAA,MACnE,CAAC;AACD,YAAM,SAAS,MAAM,UAAU,SAAS,MAAM;AAE9C,aAAO,UAAU,QAAQ,EAAC,OAAO,KAAI,CAAC;AAAA,IACxC,CAAC;AACD,OAAG,4BAA4B,YAAY;AACzC,YAAM,YAAY,MAAM,iBAAiB;AACzC,YAAM,SAAS,IAAI,WAAW;AAAA,QAC5B,QAAQ,CAAC,EAAC,KAAK,OAAO,WAAW,CAAC,EAAC,MAAM,KAAK,OAAO,WAAU,CAAC,EAAC,CAAC;AAAA,MACpE,CAAC;AACD,YAAM,SAAS,MAAM,UAAU,SAAS,MAAM;AAE9C,aAAO,UAAU,QAAQ,EAAC,OAAO,MAAK,CAAC;AAAA,IACzC,CAAC;AAAA,EACH,CAAC;AAED,WAAS,QAAQ,MAAM;AACrB,OAAG,oBAAoB,YAAY;AACjC,YAAM,YAAY,MAAM,iBAAiB;AACzC,YAAM,SAAS,IAAI,WAAW;AAAA,QAC5B,QAAQ,CAAC,EAAC,KAAK,OAAO,WAAW,CAAC,EAAC,MAAM,KAAK,OAAO,WAAU,CAAC,EAAC,CAAC;AAAA,MACpE,CAAC;AACD,YAAM,UAAU,IAAI,MAAM;AAE1B,aAAO,UAAU,OAAO,QAAQ;AAAA,QAC9B;AAAA,UACE,KAAK;AAAA,UACL,MAAM;AAAA,UACN,MAAM;AAAA,UACN,WAAW,CAAC,EAAC,MAAM,KAAK,OAAO,UAAS,CAAC;AAAA,QAC3C;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AACH,CAAC;",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,122 @@
1
+ import clone from "clone";
2
+ import createDebugLogger from "debug";
3
+ import { fieldToString, nvdebug } from "./utils.js";
4
+ import { getLexiconAndLanguage, getTermData, isLabel, isValidSubfield0 } from "./translate-terms.js";
5
+ const debug = createDebugLogger("@natlibfi/marc-record-validators-melinda:drop-terms");
6
+ const defaultConfig = {
7
+ "constraints": [
8
+ { "tag": "648", "lex": "yso/fin" },
9
+ { "tag": "648", "lex": "yso/swe" },
10
+ { "tag": "650", "lex": "yso/fin" },
11
+ { "tag": "650", "lex": "yso/swe" },
12
+ { "tag": "651", "lex": "yso/fin" },
13
+ { "tag": "651", "lex": "yso/swe" },
14
+ { "tag": "655", "lex": "slm/fin" },
15
+ { "tag": "655", "lex": "slm/swe" }
16
+ ],
17
+ "keep invalid url": false,
18
+ // If not true, removes illegal subfield $0. The whole field removal is later decided by 'keep 0-less'
19
+ "keep invalid label": false,
20
+ // label ($a) is neither pref Label nor altLabel => remove whole field
21
+ "remove altLabel": false,
22
+ "remove 0-less": true
23
+ };
24
+ export default function(config = defaultConfig) {
25
+ return {
26
+ description: "Drop yso and slm terms that do not match their identifiers. Use for incoming records only! Not for records already in Melinda!",
27
+ validate,
28
+ fix
29
+ };
30
+ async function fix(record, validateMode = false) {
31
+ const clonedFields = record.fields.map((f) => clone(f));
32
+ const results = await processFields(clonedFields);
33
+ const removables = results.map((f, i) => !f ? record.fields[i] : void 0).filter((f) => f);
34
+ const modMessages = results.map((f, i) => getMod(f, i)).filter((f) => f);
35
+ const removalMessages = removables.map((f) => `Remove '${fieldToString(f)}'`);
36
+ const allMessages = [...modMessages, ...removalMessages];
37
+ if (validateMode) {
38
+ if (allMessages.length === 0) {
39
+ return { "message": [], "valid": true };
40
+ }
41
+ return { "message": allMessages, "valid": false };
42
+ }
43
+ removables.forEach((f) => record.removeField(f));
44
+ return { message: [], fix: allMessages, valid: true };
45
+ function getMod(field, index) {
46
+ if (!field) {
47
+ return void 0;
48
+ }
49
+ const before = fieldToString(record.fields[index]);
50
+ const after = fieldToString(results[index]);
51
+ if (before !== after) {
52
+ if (!validateMode) {
53
+ record.fields[index] = field;
54
+ }
55
+ return `Modify '${before}' => '${after}'`;
56
+ }
57
+ return void 0;
58
+ }
59
+ }
60
+ function isPotentialField(f) {
61
+ if (!config || !config.constraints) {
62
+ return false;
63
+ }
64
+ return config.constraints.some((c) => c.tag === f.tag && f.subfields?.some((sf) => sf.code === "2" && sf.value === c.lex));
65
+ }
66
+ async function validate(record) {
67
+ return fix(record, true);
68
+ }
69
+ async function processFields(fields, results = []) {
70
+ const [currField, ...remainingFields] = fields;
71
+ if (!currField) {
72
+ return results;
73
+ }
74
+ if (!isPotentialField(currField)) {
75
+ return processFields(remainingFields, [...results, currField]);
76
+ }
77
+ removeSyntacticallyIllegalSubfield0s(currField);
78
+ const removable = await isRemovableField(currField);
79
+ return processFields(remainingFields, [...results, removable ? void 0 : currField]);
80
+ }
81
+ function removeSyntacticallyIllegalSubfield0s(field) {
82
+ if (config["keep invalid url"]) {
83
+ return;
84
+ }
85
+ const lexData = getLexiconAndLanguage(field);
86
+ if (!lexData.lang) {
87
+ return;
88
+ }
89
+ field.subfields = field.subfields.filter((sf) => sf.code !== "0" || isValidSubfield0(sf, lexData.lex));
90
+ }
91
+ async function isRemovableField(field) {
92
+ if (!field.subfields.some((sf) => sf.code === "0")) {
93
+ return config["remove 0-less"];
94
+ }
95
+ const subfield0 = field.subfields.find((sf) => sf.code === "0");
96
+ const data = await getTermData(subfield0.value);
97
+ if (data) {
98
+ const subfieldA = field.subfields.find((sf) => sf.code === "a");
99
+ if (subfieldA) {
100
+ const lexData = getLexiconAndLanguage(field);
101
+ if (isLabel(data.prefLabel, subfieldA.value, lexData.lang)) {
102
+ debug(`altLabel found: ${subfieldA.value}`);
103
+ return false;
104
+ }
105
+ if (isLabel(data.altLabel, subfieldA.value, lexData.lang)) {
106
+ debug(`altLabel found: ${subfieldA.value}`);
107
+ return config["remove altLabel"];
108
+ }
109
+ debug(`a-2-0 mismatch: ${fieldToString(field)}`);
110
+ }
111
+ }
112
+ if (config["keep invalid label"]) {
113
+ if (!config["keep invalid url"]) {
114
+ nvdebug(`=============== 0-removal`);
115
+ field.subfields = field.subfields.filter((sf) => sf.code !== "0");
116
+ }
117
+ return false;
118
+ }
119
+ return true;
120
+ }
121
+ }
122
+ //# sourceMappingURL=drop-terms.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/drop-terms.js"],
4
+ "sourcesContent": ["// Author(s): Nicholas Volk\n\nimport clone from 'clone';\nimport createDebugLogger from 'debug';\nimport {fieldToString, nvdebug} from './utils.js';\nimport {getLexiconAndLanguage, getTermData, isLabel, isValidSubfield0} from './translate-terms.js';\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:drop-terms');\n\n\nconst defaultConfig = {\n 'constraints': [\n {'tag': '648', 'lex': 'yso/fin'},\n {'tag': '648', 'lex': 'yso/swe'},\n {'tag': '650', 'lex': 'yso/fin'},\n {'tag': '650', 'lex': 'yso/swe'},\n {'tag': '651', 'lex': 'yso/fin'},\n {'tag': '651', 'lex': 'yso/swe'},\n {'tag': '655', 'lex': 'slm/fin'},\n {'tag': '655', 'lex': 'slm/swe'}\n ],\n 'keep invalid url': false, // If not true, removes illegal subfield $0. The whole field removal is later decided by 'keep 0-less'\n 'keep invalid label': false, // label ($a) is neither pref Label nor altLabel => remove whole field\n 'remove altLabel': false,\n 'remove 0-less': true\n};\n\nexport default function (config = defaultConfig) {\n\n return {\n description: 'Drop yso and slm terms that do not match their identifiers. Use for incoming records only! Not for records already in Melinda!',\n validate, fix\n };\n\n async function fix(record, validateMode = false) {\n const clonedFields = record.fields.map(f => clone(f));\n\n const results = await processFields(clonedFields);\n\n const removables = results.map((f, i) => !f ? record.fields[i] : undefined).filter(f => f);\n const modMessages = results.map((f, i) => getMod(f, i)).filter(f => f);\n const removalMessages = removables.map(f => `Remove '${fieldToString(f)}'`);\n const allMessages = [...modMessages, ...removalMessages];\n\n if (validateMode) {\n if (allMessages.length === 0) {\n return {'message': [], 'valid': true};\n }\n return {'message': allMessages, 'valid': false};\n }\n\n removables.forEach(f => record.removeField(f));\n\n return {message: [], fix: allMessages, valid: true};\n\n function getMod(field, index) {\n if (!field) {\n return undefined;\n }\n const before = fieldToString(record.fields[index]);\n const after = fieldToString(results[index]);\n if (before !== after) {\n if (!validateMode) {\n record.fields[index] = field;\n }\n return `Modify '${before}' => '${after}'`;\n }\n return undefined;\n }\n }\n\n function isPotentialField(f) {\n if (!config || !config.constraints) {\n return false;\n }\n return config.constraints.some(c => c.tag === f.tag && f.subfields?.some(sf => sf.code === '2' && sf.value === c.lex));\n }\n\n async function validate(record) {\n return fix(record, true);\n }\n\n\n async function processFields(fields, results = []) {\n const [currField, ...remainingFields] = fields;\n if (!currField) {\n return results;\n }\n\n if (!isPotentialField(currField)) { // Not interested in this field\n return processFields(remainingFields, [...results, currField]);\n }\n\n removeSyntacticallyIllegalSubfield0s(currField); // iff config wants them to be removed...\n\n const removable = await isRemovableField(currField);\n\n return processFields(remainingFields, [...results, removable ? undefined : currField]);\n }\n\n function removeSyntacticallyIllegalSubfield0s(field) {\n if (config['keep invalid url']) {\n return;\n }\n\n const lexData = getLexiconAndLanguage(field);\n if (!lexData.lang) { // This is an error of sorts. Should we proceed and remove $0s?\n return;\n }\n\n field.subfields = field.subfields.filter(sf => sf.code !== '0' || isValidSubfield0(sf, lexData.lex));\n }\n\n async function isRemovableField(field) {\n // nvdebug(`FOO===== ${fieldToString(field)}`);\n\n\n // $0-less field:\n if (!field.subfields.some(sf => sf.code === '0')) {\n return config['remove 0-less'];\n }\n\n const subfield0 = field.subfields.find(sf => sf.code === '0');\n const data = await getTermData(subfield0.value);\n // NB! No data might be a BUG! This might delete all incoming terms if Finto is down... (we should distinguish between a miss and a failure)\n // However, if we use this validator only for incoming records, it's fine enough.\n\n if (data) {\n const subfieldA = field.subfields.find(sf => sf.code === 'a');\n if (subfieldA) {\n const lexData = getLexiconAndLanguage(field);\n\n // $a is the pref label. All is fine!\n if (isLabel(data.prefLabel, subfieldA.value, lexData.lang)) {\n debug(`altLabel found: ${subfieldA.value}`);\n return false;\n }\n if (isLabel(data.altLabel, subfieldA.value, lexData.lang)) {\n debug(`altLabel found: ${subfieldA.value}`);\n // Oddly enough this could remove altLabel but keep totally invalid labels...\n return config['remove altLabel'];\n }\n debug(`a-2-0 mismatch: ${fieldToString(field)}`);\n }\n }\n\n\n if (config['keep invalid label']) {\n // We keep the label $a. However, we can get rid of $0 if we want to (semantic reasons)\n if (!config['keep invalid url']) {\n nvdebug(`=============== 0-removal`);\n field.subfields = field.subfields.filter(sf => sf.code !== '0');\n }\n return false;\n }\n return true;\n\n }\n\n\n}\n\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,56 @@
1
+ import assert from "node:assert/strict";
2
+ import fetchMock from "fetch-mock";
3
+ import validatorFactory from "./drop-terms.js";
4
+ import { MarcRecord } from "@natlibfi/marc-record";
5
+ import { READERS } from "@natlibfi/fixura";
6
+ import generateTests from "@natlibfi/fixugen";
7
+ import { fakeData } from "../test-fixtures/translate-terms-data.js";
8
+ const uris = [
9
+ "http://www.yso.fi/onto/yso/p444",
10
+ "http://www.yso.fi/onto/yso/p500",
11
+ "http://www.yso.fi/onto/yso/p13299",
12
+ "http://www.yso.fi/onto/yso/p111739",
13
+ "http://www.yso.fi/onto/yso/p6197061979",
14
+ "http://www.yso.fi/onto/yso/p6196061969",
15
+ "http://urn.fi/URN:NBN:fi:au:slm:s161"
16
+ ];
17
+ const useMock = 1;
18
+ generateTests({
19
+ callback,
20
+ path: [import.meta.dirname, "..", "test-fixtures", "drop-terms"],
21
+ useMetadataFile: true,
22
+ recurse: false,
23
+ fixura: {
24
+ reader: READERS.JSON
25
+ },
26
+ hooks: {
27
+ before: async () => {
28
+ if (useMock) {
29
+ fetchMock.mockGlobal().get(`https://api.finto.fi/rest/v1/data?uri=${uris[0]}&format=application%2Fjson`, { status: 200, headers: {}, body: fakeData }).get(`https://api.finto.fi/rest/v1/data?uri=${uris[1]}&format=application%2Fjson`, { status: 200, headers: {}, body: fakeData }).get(`https://api.finto.fi/rest/v1/data?uri=${uris[2]}&format=application%2Fjson`, { status: 200, headers: {}, body: fakeData }).get(`https://api.finto.fi/rest/v1/data?uri=${uris[3]}&format=application%2Fjson`, { status: 200, headers: {}, body: fakeData }).get(`https://api.finto.fi/rest/v1/data?uri=${uris[4]}&format=application%2Fjson`, { status: 200, headers: {}, body: fakeData }).get(`https://api.finto.fi/rest/v1/data?uri=${uris[5]}&format=application%2Fjson`, { status: 200, headers: {}, body: fakeData }).get(`https://api.finto.fi/rest/v1/data?uri=${uris[6]}&format=application%2Fjson`, { status: 200, headers: {}, body: fakeData });
30
+ }
31
+ testValidatorFactory();
32
+ }
33
+ }
34
+ });
35
+ async function testValidatorFactory() {
36
+ const validator = await validatorFactory();
37
+ assert.equal(typeof validator, "object");
38
+ assert.equal(typeof validator.description, "string");
39
+ assert.equal(typeof validator.validate, "function");
40
+ }
41
+ async function callback({ getFixture, fix = false, config = void 0 }) {
42
+ const validator = await validatorFactory(config);
43
+ const record = new MarcRecord(getFixture("record.json"));
44
+ const expectedResult = getFixture("expectedResult.json");
45
+ if (!fix) {
46
+ const result = await validator.validate(record);
47
+ assert.deepEqual(result, expectedResult);
48
+ const originalRecord = new MarcRecord(getFixture("record.json"));
49
+ assert.deepEqual(record, originalRecord);
50
+ return;
51
+ }
52
+ const expectedResult2 = new MarcRecord(expectedResult);
53
+ await validator.fix(record);
54
+ assert.deepEqual(record, expectedResult2);
55
+ }
56
+ //# sourceMappingURL=drop-terms.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/drop-terms.test.js"],
4
+ "sourcesContent": ["import assert from 'node:assert/strict';\n//import createDebugLogger from 'debug';\nimport fetchMock from 'fetch-mock';\n\nimport validatorFactory from './drop-terms.js';\n\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\n\n\nimport {fakeData} from '../test-fixtures/translate-terms-data.js';\n\n\nconst uris = [\n 'http://www.yso.fi/onto/yso/p444',\n 'http://www.yso.fi/onto/yso/p500',\n 'http://www.yso.fi/onto/yso/p13299',\n 'http://www.yso.fi/onto/yso/p111739',\n 'http://www.yso.fi/onto/yso/p6197061979',\n 'http://www.yso.fi/onto/yso/p6196061969',\n 'http://urn.fi/URN:NBN:fi:au:slm:s161'\n];\n\nconst useMock = 1;\n\n\ngenerateTests({\n callback,\n path: [import.meta.dirname, '..', 'test-fixtures', 'drop-terms'],\n useMetadataFile: true,\n recurse: false,\n fixura: {\n reader: READERS.JSON\n },\n hooks: {\n before: async () => {\n\n if (useMock) {\n fetchMock.mockGlobal()\n .get(`https://api.finto.fi/rest/v1/data?uri=${uris[0]}&format=application%2Fjson`, {status: 200, headers: {}, body: fakeData})\n .get(`https://api.finto.fi/rest/v1/data?uri=${uris[1]}&format=application%2Fjson`, {status: 200, headers: {}, body: fakeData})\n .get(`https://api.finto.fi/rest/v1/data?uri=${uris[2]}&format=application%2Fjson`, {status: 200, headers: {}, body: fakeData})\n .get(`https://api.finto.fi/rest/v1/data?uri=${uris[3]}&format=application%2Fjson`, {status: 200, headers: {}, body: fakeData})\n .get(`https://api.finto.fi/rest/v1/data?uri=${uris[4]}&format=application%2Fjson`, {status: 200, headers: {}, body: fakeData})\n .get(`https://api.finto.fi/rest/v1/data?uri=${uris[5]}&format=application%2Fjson`, {status: 200, headers: {}, body: fakeData})\n .get(`https://api.finto.fi/rest/v1/data?uri=${uris[6]}&format=application%2Fjson`, {status: 200, headers: {}, body: fakeData});\n }\n\n testValidatorFactory();\n }\n }\n});\n\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/drop-terms:test');\n\nasync function testValidatorFactory() {\n const validator = await validatorFactory();\n\n assert.equal(typeof validator, 'object');\n assert.equal(typeof validator.description, 'string');\n assert.equal(typeof validator.validate, 'function');\n}\n\nasync function callback({getFixture, fix = false, config = undefined}) {\n const validator = await validatorFactory(config);\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 assert.deepEqual(result, expectedResult);\n const originalRecord = new MarcRecord(getFixture('record.json'));\n assert.deepEqual(record, originalRecord); // Validation should not change the record\n return;\n }\n const expectedResult2 = new MarcRecord(expectedResult);\n await validator.fix(record);\n assert.deepEqual(record, expectedResult2);\n}\n"],
5
+ "mappings": "AAAA,OAAO,YAAY;AAEnB,OAAO,eAAe;AAEtB,OAAO,sBAAsB;AAE7B,SAAQ,kBAAiB;AACzB,SAAQ,eAAc;AACtB,OAAO,mBAAmB;AAG1B,SAAQ,gBAAe;AAGvB,MAAM,OAAO;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,MAAM,UAAU;AAGhB,cAAc;AAAA,EACZ;AAAA,EACA,MAAM,CAAC,YAAY,SAAS,MAAM,iBAAiB,YAAY;AAAA,EAC/D,iBAAiB;AAAA,EACjB,SAAS;AAAA,EACT,QAAQ;AAAA,IACN,QAAQ,QAAQ;AAAA,EAClB;AAAA,EACA,OAAO;AAAA,IACL,QAAQ,YAAY;AAElB,UAAI,SAAS;AACX,kBAAU,WAAW,EACpB,IAAI,yCAAyC,KAAK,CAAC,CAAC,8BAA8B,EAAC,QAAQ,KAAK,SAAS,CAAC,GAAG,MAAM,SAAQ,CAAC,EAC5H,IAAI,yCAAyC,KAAK,CAAC,CAAC,8BAA8B,EAAC,QAAQ,KAAK,SAAS,CAAC,GAAG,MAAM,SAAQ,CAAC,EAC5H,IAAI,yCAAyC,KAAK,CAAC,CAAC,8BAA8B,EAAC,QAAQ,KAAK,SAAS,CAAC,GAAG,MAAM,SAAQ,CAAC,EAC5H,IAAI,yCAAyC,KAAK,CAAC,CAAC,8BAA8B,EAAC,QAAQ,KAAK,SAAS,CAAC,GAAG,MAAM,SAAQ,CAAC,EAC5H,IAAI,yCAAyC,KAAK,CAAC,CAAC,8BAA8B,EAAC,QAAQ,KAAK,SAAS,CAAC,GAAG,MAAM,SAAQ,CAAC,EAC5H,IAAI,yCAAyC,KAAK,CAAC,CAAC,8BAA8B,EAAC,QAAQ,KAAK,SAAS,CAAC,GAAG,MAAM,SAAQ,CAAC,EAC5H,IAAI,yCAAyC,KAAK,CAAC,CAAC,8BAA8B,EAAC,QAAQ,KAAK,SAAS,CAAC,GAAG,MAAM,SAAQ,CAAC;AAAA,MAC/H;AAEA,2BAAqB;AAAA,IACvB;AAAA,EACF;AACF,CAAC;AAID,eAAe,uBAAuB;AACpC,QAAM,YAAY,MAAM,iBAAiB;AAEzC,SAAO,MAAM,OAAO,WAAW,QAAQ;AACvC,SAAO,MAAM,OAAO,UAAU,aAAa,QAAQ;AACnD,SAAO,MAAM,OAAO,UAAU,UAAU,UAAU;AACpD;AAEA,eAAe,SAAS,EAAC,YAAY,MAAM,OAAO,SAAS,OAAS,GAAG;AACrE,QAAM,YAAY,MAAM,iBAAiB,MAAM;AAC/C,QAAM,SAAS,IAAI,WAAW,WAAW,aAAa,CAAC;AACvD,QAAM,iBAAiB,WAAW,qBAAqB;AAGvD,MAAI,CAAC,KAAK;AACR,UAAM,SAAS,MAAM,UAAU,SAAS,MAAM;AAC9C,WAAO,UAAU,QAAQ,cAAc;AACvC,UAAM,iBAAiB,IAAI,WAAW,WAAW,aAAa,CAAC;AAC/D,WAAO,UAAU,QAAQ,cAAc;AACvC;AAAA,EACF;AACA,QAAM,kBAAkB,IAAI,WAAW,cAAc;AACrD,QAAM,UAAU,IAAI,MAAM;AAC1B,SAAO,UAAU,QAAQ,eAAe;AAC1C;",
6
+ "names": []
7
+ }
@@ -1,6 +1,6 @@
1
1
  import assert from "node:assert";
2
2
  import { MarcRecord } from "@natlibfi/marc-record";
3
- import validatorFactory from "../src/empty-fields.js";
3
+ import validatorFactory from "./empty-fields.js";
4
4
  import { after, before, describe, it } from "node:test";
5
5
  before(() => {
6
6
  MarcRecord.setValidationOptions({ subfields: false, subfieldValues: false });
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/empty-fields.test.js"],
4
- "sourcesContent": ["import assert from 'node:assert';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from '../src/empty-fields.js';\nimport {after, before, describe, it} from 'node:test';\n\nbefore(() => {\n MarcRecord.setValidationOptions({subfields: false, subfieldValues: false});\n});\n\nafter(() => {\n MarcRecord.setValidationOptions({});\n});\n\ndescribe('empty-fields', () => {\n it('Creates a validator', async () => {\n const validator = await validatorFactory();\n\n assert.equal(typeof validator, 'object');\n assert.equal(typeof validator.description, 'string');\n assert.equal(typeof validator.validate, 'function');\n });\n\n describe('#validate', () => {\n it('Finds the record valid', async () => {\n const validator = await validatorFactory();\n const record = new MarcRecord({\n fields: [\n {tag: '001', value: '1234567'},\n {tag: '500', ind1: ' ', ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'foo'\n }\n ]}\n ]\n });\n const result = await validator.validate(record);\n assert.deepEqual(result.valid, true);\n });\n\n it('Finds a missing subfield value', async () => {\n const validator = await validatorFactory();\n const record = new MarcRecord({\n fields: [\n {\n tag: '245',\n subfields: [\n {\n code: 'a'\n }\n ]\n }\n ]\n });\n const result = await validator.validate(record);\n\n assert.deepEqual(result, {valid: false, messages: ['Field 245 has missing subfield values: a']});\n });\n\n it('Finds an empty subfield array', async () => {\n const validator = await validatorFactory();\n const record = new MarcRecord({\n fields: [\n {\n tag: '500',\n subfields: []\n }\n ]\n });\n const result = await validator.validate(record);\n\n assert.deepEqual(result, {valid: false, messages: ['Field 500 has no subfields']});\n });\n });\n\n describe('#fix', () => {\n it('Removes a subfield with missing value', 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: 'foo'\n },\n {\n code: 'b'\n }\n ]\n }\n ]\n });\n await validator.fix(record);\n\n assert.deepEqual(record.fields, [\n {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'foo'\n }\n ]\n }\n ]);\n });\n\n it('Removes a field with no subfields', async () => {\n const validator = await validatorFactory();\n const record = new MarcRecord({\n fields: [\n {\n tag: '001',\n value: '1234567'\n },\n {\n tag: '500',\n subfields: []\n }\n ]\n });\n await validator.fix(record);\n\n assert.deepEqual(record.fields, [\n {\n tag: '001',\n value: '1234567'\n }\n ]);\n });\n });\n});\n"],
4
+ "sourcesContent": ["import assert from 'node:assert';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './empty-fields.js';\nimport {after, before, describe, it} from 'node:test';\n\nbefore(() => {\n MarcRecord.setValidationOptions({subfields: false, subfieldValues: false});\n});\n\nafter(() => {\n MarcRecord.setValidationOptions({});\n});\n\ndescribe('empty-fields', () => {\n it('Creates a validator', async () => {\n const validator = await validatorFactory();\n\n assert.equal(typeof validator, 'object');\n assert.equal(typeof validator.description, 'string');\n assert.equal(typeof validator.validate, 'function');\n });\n\n describe('#validate', () => {\n it('Finds the record valid', async () => {\n const validator = await validatorFactory();\n const record = new MarcRecord({\n fields: [\n {tag: '001', value: '1234567'},\n {tag: '500', ind1: ' ', ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'foo'\n }\n ]}\n ]\n });\n const result = await validator.validate(record);\n assert.deepEqual(result.valid, true);\n });\n\n it('Finds a missing subfield value', async () => {\n const validator = await validatorFactory();\n const record = new MarcRecord({\n fields: [\n {\n tag: '245',\n subfields: [\n {\n code: 'a'\n }\n ]\n }\n ]\n });\n const result = await validator.validate(record);\n\n assert.deepEqual(result, {valid: false, messages: ['Field 245 has missing subfield values: a']});\n });\n\n it('Finds an empty subfield array', async () => {\n const validator = await validatorFactory();\n const record = new MarcRecord({\n fields: [\n {\n tag: '500',\n subfields: []\n }\n ]\n });\n const result = await validator.validate(record);\n\n assert.deepEqual(result, {valid: false, messages: ['Field 500 has no subfields']});\n });\n });\n\n describe('#fix', () => {\n it('Removes a subfield with missing value', 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: 'foo'\n },\n {\n code: 'b'\n }\n ]\n }\n ]\n });\n await validator.fix(record);\n\n assert.deepEqual(record.fields, [\n {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'foo'\n }\n ]\n }\n ]);\n });\n\n it('Removes a field with no subfields', async () => {\n const validator = await validatorFactory();\n const record = new MarcRecord({\n fields: [\n {\n tag: '001',\n value: '1234567'\n },\n {\n tag: '500',\n subfields: []\n }\n ]\n });\n await validator.fix(record);\n\n assert.deepEqual(record.fields, [\n {\n tag: '001',\n value: '1234567'\n }\n ]);\n });\n });\n});\n"],
5
5
  "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,6 +1,6 @@
1
1
  import assert from "node:assert";
2
2
  import { MarcRecord } from "@natlibfi/marc-record";
3
- import validatorFactory from "../src/ending-punctuation.js";
3
+ import validatorFactory from "./ending-punctuation.js";
4
4
  import { describe, it } from "node:test";
5
5
  describe("ending-punctuation", () => {
6
6
  describe("#validate: Indicators and subfields", () => {
@@ -1479,15 +1479,25 @@ describe("ending-punctuation", () => {
1479
1479
  const recordValid650FinNo = new MarcRecord({
1480
1480
  leader: "",
1481
1481
  fields: [
1482
- { tag: "650", ind1: " ", ind2: "7", subfields: [
1483
- { code: "a", value: "kirjastot" },
1484
- { code: "x", value: "atk-j\xE4rjestelm\xE4t" },
1485
- { code: "2", value: "kauno/fin" }
1486
- ] },
1487
- { tag: "650", ind1: " ", ind2: "7", subfields: [
1488
- { code: "a", value: "ajovalot" },
1489
- { code: "2", value: "juho" }
1490
- ] }
1482
+ {
1483
+ tag: "650",
1484
+ ind1: " ",
1485
+ ind2: "7",
1486
+ subfields: [
1487
+ { code: "a", value: "kirjastot" },
1488
+ { code: "x", value: "atk-j\xE4rjestelm\xE4t" },
1489
+ { code: "2", value: "kauno/fin" }
1490
+ ]
1491
+ },
1492
+ {
1493
+ tag: "650",
1494
+ ind1: " ",
1495
+ ind2: "7",
1496
+ subfields: [
1497
+ { code: "a", value: "ajovalot" },
1498
+ { code: "2", value: "juho" }
1499
+ ]
1500
+ }
1491
1501
  ]
1492
1502
  });
1493
1503
  const recordValid650EngNoControl = new MarcRecord({
@@ -1605,15 +1615,25 @@ describe("ending-punctuation", () => {
1605
1615
  const recordInvalid650FinYes = new MarcRecord({
1606
1616
  leader: "",
1607
1617
  fields: [
1608
- { tag: "650", ind1: " ", ind2: "7", subfields: [
1609
- { code: "a", value: "kirjastot" },
1610
- { code: "x", value: "atk-j\xE4rjestelm\xE4t." },
1611
- { code: "2", value: "kauno/fin" }
1612
- ] },
1613
- { tag: "650", ind1: " ", ind2: "7", subfields: [
1614
- { code: "a", value: "ajovalot." },
1615
- { code: "2", value: "juho" }
1616
- ] }
1618
+ {
1619
+ tag: "650",
1620
+ ind1: " ",
1621
+ ind2: "7",
1622
+ subfields: [
1623
+ { code: "a", value: "kirjastot" },
1624
+ { code: "x", value: "atk-j\xE4rjestelm\xE4t." },
1625
+ { code: "2", value: "kauno/fin" }
1626
+ ]
1627
+ },
1628
+ {
1629
+ tag: "650",
1630
+ ind1: " ",
1631
+ ind2: "7",
1632
+ subfields: [
1633
+ { code: "a", value: "ajovalot." },
1634
+ { code: "2", value: "juho" }
1635
+ ]
1636
+ }
1617
1637
  ]
1618
1638
  });
1619
1639
  const recordInvalid650EngNoControl = new MarcRecord({