@natlibfi/marc-record-validators-melinda 12.0.0 → 12.0.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 (229) hide show
  1. package/dist/disambiguateSeriesStatements.test.js +1 -7
  2. package/dist/disambiguateSeriesStatements.test.js.map +2 -2
  3. package/dist/drop-terms.js +122 -0
  4. package/dist/drop-terms.js.map +7 -0
  5. package/dist/drop-terms.test.js +56 -0
  6. package/dist/drop-terms.test.js.map +7 -0
  7. package/dist/field-008-18-34-character-groups.test.js +1 -7
  8. package/dist/field-008-18-34-character-groups.test.js.map +2 -2
  9. package/dist/field-505-separators.test.js +1 -7
  10. package/dist/field-505-separators.test.js.map +2 -2
  11. package/dist/field-521-fix.test.js +1 -7
  12. package/dist/field-521-fix.test.js.map +2 -2
  13. package/dist/fix-33X.test.js +1 -1
  14. package/dist/fix-33X.test.js.map +1 -1
  15. package/dist/fix-country-codes.test.js +1 -7
  16. package/dist/fix-country-codes.test.js.map +2 -2
  17. package/dist/fix-sami-041.js +87 -0
  18. package/dist/fix-sami-041.js.map +7 -0
  19. package/dist/fix-sami-041.test.js +40 -0
  20. package/dist/fix-sami-041.test.js.map +7 -0
  21. package/dist/fixRelatorTerms.test.js +1 -7
  22. package/dist/fixRelatorTerms.test.js.map +2 -2
  23. package/dist/index.js +7 -1
  24. package/dist/index.js.map +2 -2
  25. package/dist/indicator-fixes.js +10 -0
  26. package/dist/indicator-fixes.js.map +2 -2
  27. package/dist/indicator-fixes.test.js +1 -7
  28. package/dist/indicator-fixes.test.js.map +2 -2
  29. package/dist/merge-fields.test.js +2 -7
  30. package/dist/merge-fields.test.js.map +2 -2
  31. package/dist/mergeField500Lisapainokset.test.js +1 -7
  32. package/dist/mergeField500Lisapainokset.test.js.map +2 -2
  33. package/dist/mergeRelatorTermFields.test.js +1 -7
  34. package/dist/mergeRelatorTermFields.test.js.map +2 -2
  35. package/dist/multiple-subfield-0.test.js +1 -7
  36. package/dist/multiple-subfield-0.test.js.map +2 -2
  37. package/dist/normalize-dashes.test.js +1 -7
  38. package/dist/normalize-dashes.test.js.map +2 -2
  39. package/dist/normalize-identifiers.test.js +1 -7
  40. package/dist/normalize-identifiers.test.js.map +2 -2
  41. package/dist/normalize-qualifying-information.test.js +1 -7
  42. package/dist/normalize-qualifying-information.test.js.map +2 -2
  43. package/dist/normalize-utf8-diacritics.test.js +1 -7
  44. package/dist/normalize-utf8-diacritics.test.js.map +2 -2
  45. package/dist/punctuation.test.js +1 -7
  46. package/dist/punctuation.test.js.map +2 -2
  47. package/dist/punctuation2.test.js +1 -7
  48. package/dist/punctuation2.test.js.map +2 -2
  49. package/dist/reindexSubfield6OccurenceNumbers.test.js +1 -7
  50. package/dist/reindexSubfield6OccurenceNumbers.test.js.map +2 -2
  51. package/dist/remove-041-zxx.js +56 -0
  52. package/dist/remove-041-zxx.js.map +7 -0
  53. package/dist/remove-041-zxx.test.js +40 -0
  54. package/dist/remove-041-zxx.test.js.map +7 -0
  55. package/dist/removeDuplicateDataFields.test.js +1 -7
  56. package/dist/removeDuplicateDataFields.test.js.map +2 -2
  57. package/dist/removeInferiorDataFields.js +1 -9
  58. package/dist/removeInferiorDataFields.js.map +2 -2
  59. package/dist/removeInferiorDataFields.test.js +1 -7
  60. package/dist/removeInferiorDataFields.test.js.map +2 -2
  61. package/dist/resolveOrphanedSubfield6s.js +1 -3
  62. package/dist/resolveOrphanedSubfield6s.js.map +2 -2
  63. package/dist/resolveOrphanedSubfield6s.test.js +1 -7
  64. package/dist/resolveOrphanedSubfield6s.test.js.map +2 -2
  65. package/dist/sanitize-vocabulary-source-codes.test.js +1 -7
  66. package/dist/sanitize-vocabulary-source-codes.test.js.map +2 -2
  67. package/dist/sortFields.js +16 -1
  68. package/dist/sortFields.js.map +2 -2
  69. package/dist/sortFields.test.js +1 -7
  70. package/dist/sortFields.test.js.map +2 -2
  71. package/dist/sortRelatorTerms.test.js +1 -7
  72. package/dist/sortRelatorTerms.test.js.map +2 -2
  73. package/dist/sortSubfields.js +3 -1
  74. package/dist/sortSubfields.js.map +2 -2
  75. package/dist/sortSubfields.test.js +1 -7
  76. package/dist/sortSubfields.test.js.map +2 -2
  77. package/dist/stripPunctuation.js +7 -4
  78. package/dist/stripPunctuation.js.map +2 -2
  79. package/dist/stripPunctuation.test.js +1 -7
  80. package/dist/stripPunctuation.test.js.map +2 -2
  81. package/dist/subfield6Utils.js +1 -13
  82. package/dist/subfield6Utils.js.map +2 -2
  83. package/dist/subfieldValueNormalizations.test.js +1 -7
  84. package/dist/subfieldValueNormalizations.test.js.map +2 -2
  85. package/dist/sync-007-and-300.test.js +1 -7
  86. package/dist/sync-007-and-300.test.js.map +2 -2
  87. package/dist/sync-language.js +103 -0
  88. package/dist/sync-language.js.map +7 -0
  89. package/dist/sync-language.test.js +40 -0
  90. package/dist/sync-language.test.js.map +7 -0
  91. package/dist/translate-terms.js +121 -85
  92. package/dist/translate-terms.js.map +3 -3
  93. package/dist/translate-terms.test.js +5 -8
  94. package/dist/translate-terms.test.js.map +2 -2
  95. package/dist/update-field-540.test.js +1 -7
  96. package/dist/update-field-540.test.js.map +2 -2
  97. package/dist/urn.test.js +1 -7
  98. package/dist/urn.test.js.map +2 -2
  99. package/package.json +8 -6
  100. package/src/disambiguateSeriesStatements.test.js +3 -8
  101. package/src/drop-terms.js +162 -0
  102. package/src/drop-terms.test.js +81 -0
  103. package/src/field-008-18-34-character-groups.test.js +3 -8
  104. package/src/field-505-separators.test.js +3 -8
  105. package/src/field-521-fix.test.js +3 -8
  106. package/src/fix-33X.test.js +1 -1
  107. package/src/fix-country-codes.test.js +3 -8
  108. package/src/fix-sami-041.js +113 -0
  109. package/src/fix-sami-041.test.js +52 -0
  110. package/src/fixRelatorTerms.test.js +3 -8
  111. package/src/index.js +8 -1
  112. package/src/indicator-fixes.js +12 -0
  113. package/src/indicator-fixes.test.js +3 -8
  114. package/src/merge-fields.test.js +3 -8
  115. package/src/mergeField500Lisapainokset.test.js +3 -8
  116. package/src/mergeRelatorTermFields.test.js +3 -8
  117. package/src/multiple-subfield-0.test.js +3 -8
  118. package/src/normalize-dashes.test.js +3 -8
  119. package/src/normalize-identifiers.test.js +3 -8
  120. package/src/normalize-qualifying-information.test.js +3 -8
  121. package/src/normalize-utf8-diacritics.test.js +3 -8
  122. package/src/punctuation.test.js +3 -8
  123. package/src/punctuation2.test.js +3 -8
  124. package/src/reindexSubfield6OccurenceNumbers.test.js +3 -8
  125. package/src/remove-041-zxx.js +85 -0
  126. package/src/remove-041-zxx.test.js +52 -0
  127. package/src/removeDuplicateDataFields.test.js +3 -8
  128. package/src/removeInferiorDataFields.js +7 -7
  129. package/src/removeInferiorDataFields.test.js +3 -8
  130. package/src/resolveOrphanedSubfield6s.js +3 -3
  131. package/src/resolveOrphanedSubfield6s.test.js +3 -8
  132. package/src/sanitize-vocabulary-source-codes.test.js +3 -8
  133. package/src/sortFields.js +20 -1
  134. package/src/sortFields.test.js +3 -8
  135. package/src/sortRelatorTerms.test.js +3 -8
  136. package/src/sortSubfields.js +3 -1
  137. package/src/sortSubfields.test.js +3 -8
  138. package/src/stripPunctuation.js +9 -6
  139. package/src/stripPunctuation.test.js +3 -8
  140. package/src/subfield6Utils.js +13 -13
  141. package/src/subfieldValueNormalizations.test.js +3 -8
  142. package/src/sync-007-and-300.test.js +3 -8
  143. package/src/sync-language.js +148 -0
  144. package/src/sync-language.test.js +52 -0
  145. package/src/translate-terms.js +158 -103
  146. package/src/translate-terms.test.js +12 -16
  147. package/src/update-field-540.test.js +3 -8
  148. package/src/urn.test.js +3 -8
  149. package/test-fixtures/drop-terms/01/expectedResult.json +31 -0
  150. package/test-fixtures/drop-terms/01/metadata.json +6 -0
  151. package/test-fixtures/drop-terms/01/record.json +35 -0
  152. package/test-fixtures/drop-terms/02/expectedResult.json +7 -0
  153. package/test-fixtures/drop-terms/02/metadata.json +6 -0
  154. package/test-fixtures/drop-terms/02/record.json +40 -0
  155. package/test-fixtures/drop-terms/03/expectedResult.json +6 -0
  156. package/test-fixtures/drop-terms/03/metadata.json +18 -0
  157. package/test-fixtures/drop-terms/03/record.json +39 -0
  158. package/test-fixtures/drop-terms/04/expectedResult.json +6 -0
  159. package/test-fixtures/drop-terms/04/metadata.json +19 -0
  160. package/test-fixtures/drop-terms/04/record.json +24 -0
  161. package/test-fixtures/fix-language-codes/02/metadata.json +1 -1
  162. package/test-fixtures/fix-sami-041/01/expectedResult.json +6 -0
  163. package/test-fixtures/fix-sami-041/01/metadata.json +4 -0
  164. package/test-fixtures/fix-sami-041/01/record.json +13 -0
  165. package/test-fixtures/fix-sami-041/02/expectedResult.json +10 -0
  166. package/test-fixtures/fix-sami-041/02/metadata.json +4 -0
  167. package/test-fixtures/fix-sami-041/02/record.json +8 -0
  168. package/test-fixtures/fix-sami-041/03/expectedResult.json +5 -0
  169. package/test-fixtures/fix-sami-041/03/metadata.json +5 -0
  170. package/test-fixtures/fix-sami-041/03/record.json +8 -0
  171. package/test-fixtures/fix-sami-041/04/expectedResult.json +7 -0
  172. package/test-fixtures/fix-sami-041/04/metadata.json +4 -0
  173. package/test-fixtures/fix-sami-041/04/record.json +10 -0
  174. package/test-fixtures/fix-sami-041/05/expectedResult.json +10 -0
  175. package/test-fixtures/fix-sami-041/05/metadata.json +6 -0
  176. package/test-fixtures/fix-sami-041/05/record.json +8 -0
  177. package/test-fixtures/indicator-fixes/11/expectedResult.json +10 -0
  178. package/test-fixtures/indicator-fixes/11/metadata.json +4 -0
  179. package/test-fixtures/indicator-fixes/11/record.json +10 -0
  180. package/test-fixtures/merge-fields/f05/metadata.json +1 -1
  181. package/test-fixtures/remove-041-zxx/01/expectedResult.json +5 -0
  182. package/test-fixtures/remove-041-zxx/01/metadata.json +5 -0
  183. package/test-fixtures/remove-041-zxx/01/record.json +10 -0
  184. package/test-fixtures/remove-041-zxx/02/expectedResult.json +7 -0
  185. package/test-fixtures/remove-041-zxx/02/metadata.json +5 -0
  186. package/test-fixtures/remove-041-zxx/02/record.json +9 -0
  187. package/test-fixtures/remove-041-zxx/11/expectedResult.json +10 -0
  188. package/test-fixtures/remove-041-zxx/11/metadata.json +5 -0
  189. package/test-fixtures/remove-041-zxx/11/record.json +9 -0
  190. package/test-fixtures/remove-041-zxx/12/expectedResult.json +10 -0
  191. package/test-fixtures/remove-041-zxx/12/metadata.json +5 -0
  192. package/test-fixtures/remove-041-zxx/12/record.json +9 -0
  193. package/test-fixtures/sort-fields/15/input.json +9 -0
  194. package/test-fixtures/sort-fields/15/metadata.json +5 -0
  195. package/test-fixtures/sort-fields/15/result.json +10 -0
  196. package/test-fixtures/sync-language/01/expectedResult.json +5 -0
  197. package/test-fixtures/sync-language/01/metadata.json +5 -0
  198. package/test-fixtures/sync-language/01/record.json +7 -0
  199. package/test-fixtures/sync-language/02/expectedResult.json +6 -0
  200. package/test-fixtures/sync-language/02/metadata.json +5 -0
  201. package/test-fixtures/sync-language/02/record.json +10 -0
  202. package/test-fixtures/sync-language/03/expectedResult.json +6 -0
  203. package/test-fixtures/sync-language/03/metadata.json +5 -0
  204. package/test-fixtures/sync-language/03/record.json +6 -0
  205. package/test-fixtures/sync-language/10/expectedResult.json +10 -0
  206. package/test-fixtures/sync-language/10/metadata.json +5 -0
  207. package/test-fixtures/sync-language/10/record.json +8 -0
  208. package/test-fixtures/sync-language/11/expectedResult.json +10 -0
  209. package/test-fixtures/sync-language/11/metadata.json +5 -0
  210. package/test-fixtures/sync-language/11/record.json +7 -0
  211. package/test-fixtures/sync-language/12/expectedResult.json +9 -0
  212. package/test-fixtures/sync-language/12/metadata.json +6 -0
  213. package/test-fixtures/sync-language/12/record.json +6 -0
  214. package/test-fixtures/sync-language/13/expectedResult.json +10 -0
  215. package/test-fixtures/sync-language/13/metadata.json +5 -0
  216. package/test-fixtures/sync-language/13/record.json +8 -0
  217. package/test-fixtures/sync-language/14/expectedResult.json +9 -0
  218. package/test-fixtures/sync-language/14/metadata.json +5 -0
  219. package/test-fixtures/sync-language/14/record.json +7 -0
  220. package/test-fixtures/sync-language/15/expectedResult.json +9 -0
  221. package/test-fixtures/sync-language/15/metadata.json +5 -0
  222. package/test-fixtures/sync-language/15/record.json +7 -0
  223. package/test-fixtures/translate-terms/05/expectedResult.json +12 -0
  224. package/test-fixtures/translate-terms/05/metadata.json +7 -0
  225. package/test-fixtures/translate-terms/05/record.json +11 -0
  226. package/test-fixtures/translate-terms/06/expectedResult.json +12 -0
  227. package/test-fixtures/translate-terms/06/metadata.json +7 -0
  228. package/test-fixtures/translate-terms/06/record.json +11 -0
  229. package/test-fixtures/translate-terms-data.js +23 -0
@@ -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
  }
@@ -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
+ }
@@ -3,7 +3,6 @@ import { MarcRecord } from "@natlibfi/marc-record";
3
3
  import validatorFactory from "./field-008-18-34-character-groups.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", "field-008-18-34-character-groups"],
@@ -18,7 +17,6 @@ generateTests({
18
17
  }
19
18
  }
20
19
  });
21
- const debug = createDebugLogger("@natlibfi/marc-record-validators-melinda/field-008-18-34-character-groups:test");
22
20
  async function testValidatorFactory() {
23
21
  const validator = await validatorFactory();
24
22
  assert.equal(typeof validator, "object");
@@ -26,11 +24,7 @@ async function testValidatorFactory() {
26
24
  assert.equal(typeof validator.fix, "function");
27
25
  assert.equal(typeof validator.validate, "function");
28
26
  }
29
- async function callback({ getFixture, enabled = true, fix = false }) {
30
- if (enabled === false) {
31
- debug("TEST SKIPPED!");
32
- return;
33
- }
27
+ async function callback({ getFixture, fix = false }) {
34
28
  const validator = await validatorFactory();
35
29
  const record = new MarcRecord(getFixture("record.json"));
36
30
  const expectedResult = getFixture("expectedResult.json");
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/field-008-18-34-character-groups.test.js"],
4
- "sourcesContent": ["import assert from 'node:assert';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './field-008-18-34-character-groups.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', 'field-008-18-34-character-groups'],\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/field-008-18-34-character-groups: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.fix, 'function');\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,kCAAkC;AAAA,EACrF,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,gFAAgF;AAEhH,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,KAAK,UAAU;AAC7C,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 './field-008-18-34-character-groups.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', 'field-008-18-34-character-groups'],\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/field-008-18-34-character-groups: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.fix, 'function');\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,kCAAkC;AAAA,EACrF,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,KAAK,UAAU;AAC7C,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
  }
@@ -3,7 +3,6 @@ import { MarcRecord } from "@natlibfi/marc-record";
3
3
  import validatorFactory from "./field-505-separators.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", "field-505-separators"],
@@ -18,18 +17,13 @@ generateTests({
18
17
  }
19
18
  }
20
19
  });
21
- const debug = createDebugLogger("@natlibfi/marc-record-validators-melinda/field-505-separators: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 recordFixture = getFixture("record.json");
35
29
  const record = recordFixture._validationOptions ? new MarcRecord(recordFixture, recordFixture._validationOptions) : new MarcRecord(recordFixture);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/field-505-separators.test.js"],
4
- "sourcesContent": ["import assert from 'node:assert';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './field-505-separators.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', 'field-505-separators'],\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/field-505-separators: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\n const recordFixture = getFixture('record.json');\n const record = recordFixture._validationOptions ? new MarcRecord(recordFixture, recordFixture._validationOptions) : new MarcRecord(recordFixture);\n\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,sBAAsB;AAAA,EACzE,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,oEAAoE;AAEpG,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;AAEzC,QAAM,gBAAgB,WAAW,aAAa;AAC9C,QAAM,SAAS,cAAc,qBAAqB,IAAI,WAAW,eAAe,cAAc,kBAAkB,IAAI,IAAI,WAAW,aAAa;AAEhJ,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 './field-505-separators.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', 'field-505-separators'],\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/field-505-separators: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\n const recordFixture = getFixture('record.json');\n const record = recordFixture._validationOptions ? new MarcRecord(recordFixture, recordFixture._validationOptions) : new MarcRecord(recordFixture);\n\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,sBAAsB;AAAA,EACzE,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;AAEzC,QAAM,gBAAgB,WAAW,aAAa;AAC9C,QAAM,SAAS,cAAc,qBAAqB,IAAI,WAAW,eAAe,cAAc,kBAAkB,IAAI,IAAI,WAAW,aAAa;AAEhJ,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 "./field-521-fix.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", "fix521"],
@@ -18,18 +17,13 @@ generateTests({
18
17
  }
19
18
  }
20
19
  });
21
- const debug = createDebugLogger("@natlibfi/marc-record-validators-melinda/fix521: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/field-521-fix.test.js"],
4
- "sourcesContent": ["import assert from 'node:assert';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './field-521-fix.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', 'fix521'],\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/fix521: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,QAAQ;AAAA,EAC3D,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,sDAAsD;AAEtF,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 './field-521-fix.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', 'fix521'],\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/fix521: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,QAAQ;AAAA,EAC3D,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
  }
@@ -19,7 +19,7 @@ generateTests({
19
19
  });
20
20
  async function testValidatorFactory() {
21
21
  const validator = await validatorFactory();
22
- assert.equal(typeof validator, "objecr");
22
+ assert.equal(typeof validator, "object");
23
23
  assert.equal(typeof validator.description, "string");
24
24
  assert.equal(typeof validator.validate, "function");
25
25
  assert.equal(typeof validator.fix, "function");
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/fix-33X.test.js"],
4
- "sourcesContent": ["import assert from 'node:assert';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './fix-33X.js';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\n\ngenerateTests({\n callback,\n path: [import.meta.dirname, '..', 'test-fixtures', 'fix-33X'],\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, 'objecr');\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"],
4
+ "sourcesContent": ["import assert from 'node:assert';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './fix-33X.js';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\n\ngenerateTests({\n callback,\n path: [import.meta.dirname, '..', 'test-fixtures', 'fix-33X'],\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 // 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,SAAS;AAAA,EAC5D,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;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 "./fix-country-codes.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", "fix-country-codes"],
@@ -18,18 +17,13 @@ generateTests({
18
17
  }
19
18
  }
20
19
  });
21
- const debug = createDebugLogger("@natlibfi/marc-record-validators-melinda/fix-country-codes: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/fix-country-codes.test.js"],
4
- "sourcesContent": ["import assert from 'node:assert';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './fix-country-codes.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', 'fix-country-codes'],\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/fix-country-codes: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,mBAAmB;AAAA,EACtE,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,iEAAiE;AAEjG,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 './fix-country-codes.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', 'fix-country-codes'],\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/fix-country-codes: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,mBAAmB;AAAA,EACtE,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
  }
@@ -0,0 +1,87 @@
1
+ import clone from "clone";
2
+ import { fieldToString } from "./utils.js";
3
+ export default function() {
4
+ const samiLanguages = ["sma", "sme", "smj", "smn", "sms"];
5
+ const relevantSubfieldCodes = ["a", "d"];
6
+ return {
7
+ description: "Add corresponing 'smi' subfield before a specific sami language subfields, if needed",
8
+ validate,
9
+ fix
10
+ };
11
+ function fix(record, validateMode = false) {
12
+ const relevantFields = record.fields.filter((f) => isRelevantField(f, validateMode)).map((f) => validateMode ? clone(f) : f);
13
+ if (relevantFields.length === 0) {
14
+ if (validateMode) {
15
+ return { message: [], valid: true };
16
+ }
17
+ return { message: [], fix: [], valid: true };
18
+ }
19
+ const relevantFieldsAsStrings = relevantFields.map((f) => fieldToString(f));
20
+ relevantFields.forEach((f) => processField(f));
21
+ const modFieldsAsStrings = relevantFields.map((f) => fieldToString(f));
22
+ const report = [...updateAndReport008(), ...createReport(relevantFieldsAsStrings, modFieldsAsStrings)];
23
+ if (validateMode) {
24
+ return { "message": report, "valid": false };
25
+ }
26
+ return { message: [], fix: report, valid: true };
27
+ function updateAndReport008() {
28
+ const [f008] = record.get("008").map((f) => validateMode ? clone(f) : f);
29
+ if (!f008) {
30
+ return [];
31
+ }
32
+ const currLang = f008.value.substr(35, 3);
33
+ if (!samiLanguages.includes(currLang)) {
34
+ return [];
35
+ }
36
+ const origValue = f008.value;
37
+ const firstRelevantSubfield = relevantFields[0].subfields.find((sf) => sf.code === "a" || sf.code === "d");
38
+ if (firstRelevantSubfield.value === "smi") {
39
+ f008.value = `${f008.value.substr(0, 35)}smi${f008.value.substr(38)}`;
40
+ }
41
+ return createReport([origValue], [f008.value]);
42
+ }
43
+ }
44
+ function createReport(origArray, modArray) {
45
+ return origArray.map((entry, index) => createEntry(entry, index));
46
+ function createEntry(item, index) {
47
+ return `'${item}' => '${modArray[index]}'`;
48
+ }
49
+ }
50
+ function validate(record) {
51
+ return fix(record, true);
52
+ }
53
+ function processField(f) {
54
+ f.subfields = prosessSubfields(f.subfields);
55
+ return f;
56
+ }
57
+ function prosessSubfields(incomingSubfields, outgoingSubfields = []) {
58
+ const [currSubfield, ...otherSubfields] = incomingSubfields;
59
+ if (!currSubfield) {
60
+ return outgoingSubfields;
61
+ }
62
+ if (!isRelevantSamiSubfield(currSubfield, [...outgoingSubfields, ...otherSubfields])) {
63
+ return prosessSubfields(otherSubfields, [...outgoingSubfields, currSubfield]);
64
+ }
65
+ const smiSubfield = {
66
+ code: currSubfield.code,
67
+ value: "smi"
68
+ };
69
+ return prosessSubfields(otherSubfields, [...outgoingSubfields, smiSubfield, currSubfield]);
70
+ }
71
+ function isRelevantField(f) {
72
+ if (f.tag !== "041" || !f.subfields || f.subfields.some((sf) => sf.code === "2")) {
73
+ return false;
74
+ }
75
+ return f.subfields.some((sf) => isRelevantSamiSubfield(sf, f.subfields));
76
+ }
77
+ function isRelevantSamiSubfield(sf, otherSubfields) {
78
+ if (!relevantSubfieldCodes.includes(sf.code) || !samiLanguages.includes(sf.value)) {
79
+ return false;
80
+ }
81
+ if (otherSubfields.some((sf2) => sf2.code === sf.code && sf2.value === "smi")) {
82
+ return false;
83
+ }
84
+ return true;
85
+ }
86
+ }
87
+ //# sourceMappingURL=fix-sami-041.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/fix-sami-041.js"],
4
+ "sourcesContent": ["// Author(s): Nicholas Volk\n\n//import createDebugLogger from 'debug';\nimport clone from 'clone';\n\nimport {fieldToString} from './utils.js';\n\n// const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:fix-sami-041');\n\n\n\nexport default function () {\n /* 'sma': etel\u00E4saame, 'sme': pohjoissaame, 'smj': luulajansaame, 'smn': inarinsaame, 'sms': koltansaame */\n const samiLanguages = ['sma', 'sme', 'smj', 'smn', 'sms'];\n const relevantSubfieldCodes = ['a', 'd']; // Subfield codes that should also have 'smi' if a sami langauge is used. Confirmed by A.R. via Slack 2025-12-05\n\n return {\n description: 'Add corresponing \\'smi\\' subfield before a specific sami language subfields, if needed',\n validate, fix\n };\n\n function fix(record, validateMode = false) {\n const relevantFields = record.fields.filter(f => isRelevantField(f, validateMode)).map(f => validateMode ? clone(f) : f); // NV! relevant fields are cloned in validation mode!\n // Nothing to do:\n if (relevantFields.length === 0) {\n if (validateMode) {\n return {message: [], valid: true};\n }\n return {message: [], fix: [], valid: true};\n }\n\n const relevantFieldsAsStrings = relevantFields.map(f => fieldToString(f)); // get original values\n\n relevantFields.forEach(f => processField(f));\n const modFieldsAsStrings = relevantFields.map(f => fieldToString(f));\n const report = [...updateAndReport008(), ...createReport(relevantFieldsAsStrings, modFieldsAsStrings)];\n\n if (validateMode) {\n return {'message': report, 'valid': false};\n }\n\n return {message: [], fix: report, valid: true};\n\n function updateAndReport008() {\n const [f008] = record.get('008').map(f => validateMode ? clone(f) : f);\n\n if (!f008) {\n return [];\n }\n const currLang = f008.value.substr(35, 3);\n if (!samiLanguages.includes(currLang)) { // NB! If original 008/35-37 was not a sami language, we don't change anything!\n return [];\n }\n const origValue = f008.value;\n const firstRelevantSubfield = relevantFields[0].subfields.find(sf => sf.code === 'a' || sf.code === 'd'); // NB! don't use relevantSubfieldCodes here!\n if (firstRelevantSubfield.value === 'smi') { // First relevant subfield is \n f008.value = `${f008.value.substr(0, 35)}smi${f008.value.substr(38)}`;\n }\n return createReport([origValue], [f008.value]);\n }\n }\n\n function createReport(origArray, modArray) {\n return origArray.map((entry, index) => createEntry(entry, index));\n\n function createEntry(item, index) {\n return `'${item}' => '${modArray[index]}'`;\n }\n }\n\n function validate(record) {\n return fix(record, true);\n }\n\n function processField(f) {\n f.subfields = prosessSubfields(f.subfields);\n return f;\n }\n\n function prosessSubfields(incomingSubfields, outgoingSubfields = []) {\n const [currSubfield, ...otherSubfields] = incomingSubfields;\n if (!currSubfield) {\n return outgoingSubfields;\n }\n if (!isRelevantSamiSubfield(currSubfield, [...outgoingSubfields, ...otherSubfields])) {\n return prosessSubfields(otherSubfields, [...outgoingSubfields, currSubfield]);\n }\n\n const smiSubfield = {\n code: currSubfield.code,\n value: 'smi'\n };\n return prosessSubfields(otherSubfields, [...outgoingSubfields, smiSubfield, currSubfield]);\n }\n\n function isRelevantField(f) {\n if (f.tag !== '041' || !f.subfields || f.subfields.some(sf => sf.code === '2')) {\n return false;\n }\n return f.subfields.some(sf => isRelevantSamiSubfield(sf, f.subfields)); // it's ok to pass sf in f.subfields also\n }\n\n function isRelevantSamiSubfield(sf, otherSubfields) {\n if (!relevantSubfieldCodes.includes(sf.code) || !samiLanguages.includes(sf.value)) {\n return false;\n }\n if (otherSubfields.some(sf2 => sf2.code === sf.code && sf2.value === 'smi')) {\n return false;\n }\n return true;\n }\n}\n\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }