@natlibfi/marc-record-validators-melinda 11.2.1 → 11.2.2-alpha.2

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/access-rights.spec.js +1 -1
  2. package/dist/access-rights.spec.js.map +1 -1
  3. package/dist/addMissingField041.js.map +1 -1
  4. package/dist/addMissingField041.spec.js +1 -1
  5. package/dist/addMissingField041.spec.js.map +1 -1
  6. package/dist/addMissingField336.js.map +1 -1
  7. package/dist/addMissingField336.spec.js +1 -1
  8. package/dist/addMissingField336.spec.js.map +1 -1
  9. package/dist/addMissingField337.js.map +1 -1
  10. package/dist/addMissingField337.spec.js +1 -1
  11. package/dist/addMissingField337.spec.js.map +1 -1
  12. package/dist/addMissingField338.js.map +1 -1
  13. package/dist/addMissingField338.spec.js +1 -1
  14. package/dist/addMissingField338.spec.js.map +1 -1
  15. package/dist/cyrillux-usemarcon-replacement.js +82 -22
  16. package/dist/cyrillux-usemarcon-replacement.js.map +1 -1
  17. package/dist/cyrillux-usemarcon-replacement.spec.js +1 -1
  18. package/dist/cyrillux-usemarcon-replacement.spec.js.map +1 -1
  19. package/dist/double-commas.spec.js +1 -1
  20. package/dist/double-commas.spec.js.map +1 -1
  21. package/dist/duplicates-ind1.js.map +1 -1
  22. package/dist/duplicates-ind1.spec.js +1 -1
  23. package/dist/duplicates-ind1.spec.js.map +1 -1
  24. package/dist/empty-fields.js.map +1 -1
  25. package/dist/empty-fields.spec.js +1 -1
  26. package/dist/empty-fields.spec.js.map +1 -1
  27. package/dist/ending-punctuation.js +1 -1
  28. package/dist/ending-punctuation.js.map +1 -1
  29. package/dist/ending-punctuation.spec.js +1 -1
  30. package/dist/ending-punctuation.spec.js.map +1 -1
  31. package/dist/ending-whitespace.js.map +1 -1
  32. package/dist/ending-whitespace.spec.js +1 -1
  33. package/dist/ending-whitespace.spec.js.map +1 -1
  34. package/dist/field-008-18-34-character-groups.js +1 -1
  35. package/dist/field-008-18-34-character-groups.js.map +1 -1
  36. package/dist/field-008-18-34-character-groups.spec.js +1 -1
  37. package/dist/field-008-18-34-character-groups.spec.js.map +1 -1
  38. package/dist/field-505-separators.js +1 -1
  39. package/dist/field-505-separators.js.map +1 -1
  40. package/dist/field-505-separators.spec.js +1 -1
  41. package/dist/field-505-separators.spec.js.map +1 -1
  42. package/dist/field-521-fix.js +1 -1
  43. package/dist/field-521-fix.js.map +1 -1
  44. package/dist/field-521-fix.spec.js +1 -1
  45. package/dist/field-521-fix.spec.js.map +1 -1
  46. package/dist/field-exclusion.js.map +1 -1
  47. package/dist/field-exclusion.spec.js +1 -1
  48. package/dist/field-exclusion.spec.js.map +1 -1
  49. package/dist/field-structure.js.map +1 -1
  50. package/dist/field-structure.spec.js +1 -1
  51. package/dist/field-structure.spec.js.map +1 -1
  52. package/dist/fields-present.spec.js +1 -1
  53. package/dist/fields-present.spec.js.map +1 -1
  54. package/dist/fix-33X.js +1 -1
  55. package/dist/fix-33X.js.map +1 -1
  56. package/dist/fix-33X.spec.js +1 -1
  57. package/dist/fix-33X.spec.js.map +1 -1
  58. package/dist/fix-country-codes.js.map +1 -1
  59. package/dist/fix-country-codes.spec.js +1 -1
  60. package/dist/fix-country-codes.spec.js.map +1 -1
  61. package/dist/fix-language-codes.js +1 -1
  62. package/dist/fix-language-codes.js.map +1 -1
  63. package/dist/fix-language-codes.spec.js +1 -1
  64. package/dist/fix-language-codes.spec.js.map +1 -1
  65. package/dist/fixRelatorTerms.js +6 -3
  66. package/dist/fixRelatorTerms.js.map +1 -1
  67. package/dist/fixRelatorTerms.spec.js +1 -1
  68. package/dist/fixRelatorTerms.spec.js.map +1 -1
  69. package/dist/fixed-fields.js.map +1 -1
  70. package/dist/fixed-fields.spec.js +1 -1
  71. package/dist/fixed-fields.spec.js.map +1 -1
  72. package/dist/identical-fields.js.map +1 -1
  73. package/dist/identical-fields.spec.js +1 -1
  74. package/dist/identical-fields.spec.js.map +1 -1
  75. package/dist/index.js +66 -3
  76. package/dist/index.js.map +1 -1
  77. package/dist/indicator-fixes.js +17 -0
  78. package/dist/indicator-fixes.js.map +1 -1
  79. package/dist/indicator-fixes.spec.js +1 -1
  80. package/dist/indicator-fixes.spec.js.map +1 -1
  81. package/dist/isbn-issn.js +1 -1
  82. package/dist/isbn-issn.js.map +1 -1
  83. package/dist/isbn-issn.spec.js +1 -1
  84. package/dist/isbn-issn.spec.js.map +1 -1
  85. package/dist/item-language.js +1 -1
  86. package/dist/item-language.js.map +1 -1
  87. package/dist/item-language.spec.js +1 -1
  88. package/dist/item-language.spec.js.map +1 -1
  89. package/dist/mergeField500Lisapainokset.js.map +1 -1
  90. package/dist/mergeField500Lisapainokset.spec.js +1 -1
  91. package/dist/mergeField500Lisapainokset.spec.js.map +1 -1
  92. package/dist/mergeRelatorTermFields.js +1 -1
  93. package/dist/mergeRelatorTermFields.js.map +1 -1
  94. package/dist/mergeRelatorTermFields.spec.js +1 -1
  95. package/dist/mergeRelatorTermFields.spec.js.map +1 -1
  96. package/dist/multiple-subfield-0.js.map +1 -1
  97. package/dist/multiple-subfield-0.spec.js +1 -1
  98. package/dist/multiple-subfield-0.spec.js.map +1 -1
  99. package/dist/non-breaking-space.js.map +1 -1
  100. package/dist/non-breaking-space.spec.js +1 -1
  101. package/dist/non-breaking-space.spec.js.map +1 -1
  102. package/dist/normalize-dashes.js +1 -1
  103. package/dist/normalize-dashes.js.map +1 -1
  104. package/dist/normalize-dashes.spec.js +1 -1
  105. package/dist/normalize-dashes.spec.js.map +1 -1
  106. package/dist/normalize-identifiers.js +1 -1
  107. package/dist/normalize-identifiers.js.map +1 -1
  108. package/dist/normalize-identifiers.spec.js +1 -1
  109. package/dist/normalize-identifiers.spec.js.map +1 -1
  110. package/dist/normalize-qualifying-information.js +1 -1
  111. package/dist/normalize-qualifying-information.js.map +1 -1
  112. package/dist/normalize-qualifying-information.spec.js +1 -1
  113. package/dist/normalize-qualifying-information.spec.js.map +1 -1
  114. package/dist/normalize-utf8-diacritics.js +1 -1
  115. package/dist/normalize-utf8-diacritics.js.map +1 -1
  116. package/dist/normalize-utf8-diacritics.spec.js +1 -1
  117. package/dist/normalize-utf8-diacritics.spec.js.map +1 -1
  118. package/dist/normalizeFieldForComparison.js +1 -1
  119. package/dist/normalizeFieldForComparison.js.map +1 -1
  120. package/dist/normalizeSubfieldValueForComparison.js +1 -1
  121. package/dist/normalizeSubfieldValueForComparison.js.map +1 -1
  122. package/dist/prepublicationUtils.js +1 -1
  123. package/dist/prepublicationUtils.js.map +1 -1
  124. package/dist/punctuation/index.js +1 -1
  125. package/dist/punctuation/index.js.map +1 -1
  126. package/dist/punctuation/rules/index.js +1 -1
  127. package/dist/punctuation/rules/index.js.map +1 -1
  128. package/dist/punctuation.spec.js +1 -1
  129. package/dist/punctuation.spec.js.map +1 -1
  130. package/dist/punctuation2.js +1 -1
  131. package/dist/punctuation2.js.map +1 -1
  132. package/dist/punctuation2.spec.js +1 -1
  133. package/dist/punctuation2.spec.js.map +1 -1
  134. package/dist/reindexSubfield6OccurenceNumbers.js +1 -1
  135. package/dist/reindexSubfield6OccurenceNumbers.js.map +1 -1
  136. package/dist/reindexSubfield6OccurenceNumbers.spec.js +1 -1
  137. package/dist/reindexSubfield6OccurenceNumbers.spec.js.map +1 -1
  138. package/dist/removeDuplicateDataFields.js +1 -1
  139. package/dist/removeDuplicateDataFields.js.map +1 -1
  140. package/dist/removeDuplicateDataFields.spec.js +1 -1
  141. package/dist/removeDuplicateDataFields.spec.js.map +1 -1
  142. package/dist/removeInferiorDataFields.js +1 -1
  143. package/dist/removeInferiorDataFields.js.map +1 -1
  144. package/dist/removeInferiorDataFields.spec.js +1 -1
  145. package/dist/removeInferiorDataFields.spec.js.map +1 -1
  146. package/dist/resolvable-ext-references-melinda.js +1 -1
  147. package/dist/resolvable-ext-references-melinda.js.map +1 -1
  148. package/dist/resolvable-ext-references-melinda.spec.js +1 -1
  149. package/dist/resolvable-ext-references-melinda.spec.js.map +1 -1
  150. package/dist/resolveOrphanedSubfield6s.js +1 -1
  151. package/dist/resolveOrphanedSubfield6s.js.map +1 -1
  152. package/dist/resolveOrphanedSubfield6s.spec.js +1 -1
  153. package/dist/resolveOrphanedSubfield6s.spec.js.map +1 -1
  154. package/dist/sanitize-vocabulary-source-codes.js +5 -1
  155. package/dist/sanitize-vocabulary-source-codes.js.map +1 -1
  156. package/dist/sanitize-vocabulary-source-codes.spec.js +1 -1
  157. package/dist/sanitize-vocabulary-source-codes.spec.js.map +1 -1
  158. package/dist/sort-tags.spec.js +1 -1
  159. package/dist/sort-tags.spec.js.map +1 -1
  160. package/dist/sortFields.js +1 -1
  161. package/dist/sortFields.js.map +1 -1
  162. package/dist/sortFields.spec.js +1 -1
  163. package/dist/sortFields.spec.js.map +1 -1
  164. package/dist/sortRelatorTerms.js +1 -1
  165. package/dist/sortRelatorTerms.js.map +1 -1
  166. package/dist/sortRelatorTerms.spec.js +1 -1
  167. package/dist/sortRelatorTerms.spec.js.map +1 -1
  168. package/dist/sortSubfields.js +1 -1
  169. package/dist/sortSubfields.js.map +1 -1
  170. package/dist/sortSubfields.spec.js +1 -1
  171. package/dist/sortSubfields.spec.js.map +1 -1
  172. package/dist/stripPunctuation.js.map +1 -1
  173. package/dist/stripPunctuation.spec.js +1 -1
  174. package/dist/stripPunctuation.spec.js.map +1 -1
  175. package/dist/subfield-exclusion.js.map +1 -1
  176. package/dist/subfield-exclusion.spec.js +1 -1
  177. package/dist/subfield-exclusion.spec.js.map +1 -1
  178. package/dist/subfield6Utils.js.map +1 -1
  179. package/dist/subfield8Utils.js.map +1 -1
  180. package/dist/subfieldValueNormalizations.js +1 -1
  181. package/dist/subfieldValueNormalizations.js.map +1 -1
  182. package/dist/subfieldValueNormalizations.spec.js +1 -1
  183. package/dist/subfieldValueNormalizations.spec.js.map +1 -1
  184. package/dist/sync-007-and-300.js +1 -1
  185. package/dist/sync-007-and-300.js.map +1 -1
  186. package/dist/sync-007-and-300.spec.js +1 -1
  187. package/dist/sync-007-and-300.spec.js.map +1 -1
  188. package/dist/typeOfDate-008.js +1 -1
  189. package/dist/typeOfDate-008.js.map +1 -1
  190. package/dist/typeOfDate-008.spec.js +1 -1
  191. package/dist/typeOfDate-008.spec.js.map +1 -1
  192. package/dist/unicode-decomposition.js.map +1 -1
  193. package/dist/unicode-decomposition.spec.js +1 -1
  194. package/dist/unicode-decomposition.spec.js.map +1 -1
  195. package/dist/update-field-540.spec.js +1 -1
  196. package/dist/update-field-540.spec.js.map +1 -1
  197. package/dist/urn.js +1 -1
  198. package/dist/urn.js.map +1 -1
  199. package/dist/urn.spec.js +1 -1
  200. package/dist/urn.spec.js.map +1 -1
  201. package/dist/utils.js +17 -0
  202. package/dist/utils.js.map +1 -1
  203. package/package.json +1 -1
  204. package/src/cyrillux-usemarcon-replacement.js +87 -24
  205. package/src/fixRelatorTerms.js +5 -2
  206. package/src/index.js +21 -3
  207. package/src/indicator-fixes.js +19 -0
  208. package/src/sanitize-vocabulary-source-codes.js +4 -0
  209. package/src/utils.js +16 -0
  210. package/test-fixtures/cyrillux-usemarcon-replacement/f11/expectedResult.json +3 -0
  211. package/test-fixtures/cyrillux-usemarcon-replacement/f11/record.json +8 -0
  212. package/test-fixtures/cyrillux-usemarcon-replacement/f12/expectedResult.json +32 -0
  213. package/test-fixtures/cyrillux-usemarcon-replacement/f12/metadata.json +6 -0
  214. package/test-fixtures/cyrillux-usemarcon-replacement/f12/record.json +30 -0
  215. package/test-fixtures/cyrillux-usemarcon-replacement/f13/expectedResult.json +38 -0
  216. package/test-fixtures/cyrillux-usemarcon-replacement/f13/metadata.json +6 -0
  217. package/test-fixtures/cyrillux-usemarcon-replacement/f13/record.json +29 -0
  218. package/test-fixtures/cyrillux-usemarcon-replacement/f14/expectedResult.json +42 -0
  219. package/test-fixtures/cyrillux-usemarcon-replacement/f14/metadata.json +6 -0
  220. package/test-fixtures/cyrillux-usemarcon-replacement/f14/record.json +33 -0
  221. package/test-fixtures/indicator-fixes/09/expectedResult.json +10 -0
  222. package/test-fixtures/indicator-fixes/09/metadata.json +4 -0
  223. package/test-fixtures/indicator-fixes/09/record.json +11 -0
  224. package/test-fixtures/sanitize-vocabulary-source-codes/f04/expectedResult.json +74 -0
  225. package/test-fixtures/sanitize-vocabulary-source-codes/f04/metadata.json +8 -0
  226. package/test-fixtures/sanitize-vocabulary-source-codes/f04/record.json +75 -0
  227. package/test-fixtures/sanitize-vocabulary-source-codes/v04/expectedResult.json +5 -0
  228. package/test-fixtures/sanitize-vocabulary-source-codes/v04/metadata.json +8 -0
  229. package/test-fixtures/sanitize-vocabulary-source-codes/v04/record.json +75 -0
package/dist/urn.js CHANGED
@@ -7,7 +7,7 @@ exports.default = _default;
7
7
  var _nodeFetch = _interopRequireDefault(require("node-fetch"));
8
8
  var _utils = require("./utils");
9
9
  var _debug = _interopRequireDefault(require("debug"));
10
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
10
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
11
11
  const URN_GENERATOR_URL = 'https://generator.urn.fi/cgi-bin/urn_generator.cgi?type=nbn';
12
12
  function _default(isLegalDeposit = false, useMelindaTemp = true) {
13
13
  const debug = (0, _debug.default)('@natlibfi/marc-record-validators-melinda:urn');
package/dist/urn.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"urn.js","names":["_nodeFetch","_interopRequireDefault","require","_utils","_debug","obj","__esModule","default","URN_GENERATOR_URL","_default","isLegalDeposit","useMelindaTemp","debug","createDebugLogger","debugData","extend","hasURN","f","tag","subfields","some","code","value","test","description","validate","fix","record","f856sUrn","fields","filter","JSON","stringify","ldSubfields","createLDSubfields","length","generated","createURNSubfield","tempSubField","insertField","ind1","ind2","forEach","sf","hasOld856LdPhrase","find","ldsf","push","rec","isbn","reduce","acc","a","undefined","createURN","response","fetch","body","text","fieldHasLDSubfields","field","every","validateLD","f856sUrnWithLdSubfields","isElectronicMaterial","valid"],"sources":["../src/urn.js"],"sourcesContent":["import fetch from 'node-fetch';\nimport {isElectronicMaterial} from './utils';\nimport createDebugLogger from 'debug';\n\nconst URN_GENERATOR_URL = 'https://generator.urn.fi/cgi-bin/urn_generator.cgi?type=nbn';\n\nexport default function (isLegalDeposit = false, useMelindaTemp = true) {\n const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:urn');\n const debugData = debug.extend('data');\n\n // We should check that the f856 with URN has second indicator '0' (Resource), ' ' (No information provided) or '8' (No display constant generated)\n // - if second indicator is '1' (Version of resource) or '2' (Related resource) the URN in f856 is not correct for the resource described in the record\n\n // This checks only the existence of URNs from the Finnish urn.fi -resolver\n\n const hasURN = f => f.tag === '856' && f.subfields.some(({code, value}) => code === 'u' && (/urn.fi/u).test(value));\n\n return {\n description: 'Adds URN for record, to 856-field (if not existing). If isLegalDeposit is active, adds legal deposit subfields to the f856s with URN.',\n validate,\n fix\n };\n\n async function fix(record) {\n const f856sUrn = record.fields.filter(hasURN);\n debugData(`f856sUrn: ${JSON.stringify(f856sUrn)}`);\n\n const ldSubfields = isLegalDeposit ? createLDSubfields() : [];\n debugData(`IsLegalDeposit: ${isLegalDeposit}, LegalDepositSubfields: ${JSON.stringify(ldSubfields)}`);\n\n // We add the URN even if we're not getting the legalDeposit - where does this URN resolve?\n // We probably should not do these additions\n\n if (f856sUrn.length === 0) { // eslint-disable-line functional/no-conditional-statements\n const {code, value, generated} = await createURNSubfield(record);\n\n if (generated && useMelindaTemp) {\n const tempSubField = {code: '9', value: 'MELINDA<TEMP>'};\n\n record.insertField({\n tag: '856',\n ind1: '4',\n ind2: '0',\n subfields: [{code, value}, ...ldSubfields, tempSubField]\n });\n\n return true;\n }\n\n record.insertField({\n tag: '856',\n ind1: '4',\n ind2: '0',\n subfields: [{code, value}, ...ldSubfields]\n });\n\n return true;\n } else if (isLegalDeposit) { // eslint-disable-line functional/no-conditional-statements\n\n // We add here legal deposit information to all URN-f856s - we probably should not do this\n // We should add extra f856 URN / URNs for legal deposits that already have a open (non-legal-deposit) URN\n // How do we decide which URN to use as a template if there are several URNs\n // We should check for existence of a legal deposit URN anyways\n\n f856sUrn.forEach(f => {\n // Change phrase from old to new if field with old phrase is found\n if (f.subfields.some(sf => hasOld856LdPhrase(sf))) { // eslint-disable-line functional/no-conditional-statements\n f.subfields // eslint-disable-line functional/immutable-data\n .find(sf => hasOld856LdPhrase(sf))\n .value = 'Käytettävissä vapaakappaletyöasemilla';\n }\n\n // Create subfields if necessary\n ldSubfields.forEach(ldsf => {\n if (!f.subfields.some(sf => sf.code === ldsf.code && sf.value === ldsf.value && !hasOld856LdPhrase(sf))) { // eslint-disable-line functional/no-conditional-statements\n f.subfields.push(ldsf); // eslint-disable-line functional/immutable-data\n }\n });\n });\n }\n\n return true;\n\n // We should check existence of URN in f024 i1: '7' $2 urn/URN for this too\n\n async function createURNSubfield(rec) {\n // isbn is picked from the last 020 $a in the record\n // what should we do in case of several 020 $a:s\n const isbn = rec.fields.reduce((acc, f) => {\n if (f.tag === '020') {\n const a = f.subfields.find(sf => sf.code === 'a');\n return a ? a.value : undefined;\n }\n\n return acc;\n }, undefined);\n\n debugData(`isbns: ${isbn}`);\n\n const {generated, value} = await createURN(isbn);\n return {code: 'u', value, generated};\n\n async function createURN(isbn = false) {\n if (isbn) {\n return {generated: false, value: `https://urn.fi/URN:ISBN:${isbn}`};\n }\n\n const response = await fetch(URN_GENERATOR_URL);\n const body = await response.text();\n\n // If we generated URN we could also add it to the 024\n // generated 024 should also have $9 MELINDA<TEMP>\n return {generated: true, value: `https://urn.fi/${body}`};\n }\n }\n\n function hasOld856LdPhrase({code, value}) {\n if (code === 'z' && value === 'Käytettävissä vapaakappalekirjastoissa') {\n return true;\n }\n\n return false;\n }\n\n }\n\n // Later when the new subfields that have f506/f540 -type contents, we should add also them here\n function createLDSubfields() {\n return [\n {\n code: 'z',\n value: 'Käytettävissä vapaakappaletyöasemilla'\n },\n {\n code: '5',\n value: 'FI-Vapaa'\n }\n ];\n }\n\n function fieldHasLDSubfields(field, ldSubfields) {\n if (ldSubfields.every(ldsf => field.subfields.some(sf => sf.code === ldsf.code && sf.value === ldsf.value))) {\n return true;\n }\n }\n\n function validateLD(f856sUrn) {\n debug(`Validating the existence of legal deposit subfields`);\n const ldSubfields = createLDSubfields();\n const f856sUrnWithLdSubfields = f856sUrn.filter(field => fieldHasLDSubfields(field, ldSubfields));\n if (f856sUrnWithLdSubfields.length > 0) {\n debug(`Record has ${f856sUrnWithLdSubfields.length} URN fields with all necessary legal deposit subfields`);\n debugData(`f856sUrnWithLdSubfields: ${JSON.stringify(f856sUrnWithLdSubfields)}`);\n return true;\n }\n return false;\n }\n\n function validate(record) {\n // if not electronic skip this validator\n if (!isElectronicMaterial(record)) {\n debug(`Record is not electronic - no need to validate legal deposit URNs`);\n return {valid: true};\n }\n\n const f856sUrn = record.fields.filter(hasURN);\n\n if (f856sUrn.length > 0) {\n debug(`Record has ${f856sUrn.length} URN fields`);\n debugData(`f856sUrn: ${JSON.stringify(f856sUrn)}`);\n\n if (!isLegalDeposit || validateLD(f856sUrn)) {\n debug(`Record is valid`);\n return {valid: true};\n }\n }\n debug(`No (valid) URN fields - Record is not valid`);\n return {valid: false};\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"urn.js","names":["_nodeFetch","_interopRequireDefault","require","_utils","_debug","e","__esModule","default","URN_GENERATOR_URL","_default","isLegalDeposit","useMelindaTemp","debug","createDebugLogger","debugData","extend","hasURN","f","tag","subfields","some","code","value","test","description","validate","fix","record","f856sUrn","fields","filter","JSON","stringify","ldSubfields","createLDSubfields","length","generated","createURNSubfield","tempSubField","insertField","ind1","ind2","forEach","sf","hasOld856LdPhrase","find","ldsf","push","rec","isbn","reduce","acc","a","undefined","createURN","response","fetch","body","text","fieldHasLDSubfields","field","every","validateLD","f856sUrnWithLdSubfields","isElectronicMaterial","valid"],"sources":["../src/urn.js"],"sourcesContent":["import fetch from 'node-fetch';\nimport {isElectronicMaterial} from './utils';\nimport createDebugLogger from 'debug';\n\nconst URN_GENERATOR_URL = 'https://generator.urn.fi/cgi-bin/urn_generator.cgi?type=nbn';\n\nexport default function (isLegalDeposit = false, useMelindaTemp = true) {\n const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:urn');\n const debugData = debug.extend('data');\n\n // We should check that the f856 with URN has second indicator '0' (Resource), ' ' (No information provided) or '8' (No display constant generated)\n // - if second indicator is '1' (Version of resource) or '2' (Related resource) the URN in f856 is not correct for the resource described in the record\n\n // This checks only the existence of URNs from the Finnish urn.fi -resolver\n\n const hasURN = f => f.tag === '856' && f.subfields.some(({code, value}) => code === 'u' && (/urn.fi/u).test(value));\n\n return {\n description: 'Adds URN for record, to 856-field (if not existing). If isLegalDeposit is active, adds legal deposit subfields to the f856s with URN.',\n validate,\n fix\n };\n\n async function fix(record) {\n const f856sUrn = record.fields.filter(hasURN);\n debugData(`f856sUrn: ${JSON.stringify(f856sUrn)}`);\n\n const ldSubfields = isLegalDeposit ? createLDSubfields() : [];\n debugData(`IsLegalDeposit: ${isLegalDeposit}, LegalDepositSubfields: ${JSON.stringify(ldSubfields)}`);\n\n // We add the URN even if we're not getting the legalDeposit - where does this URN resolve?\n // We probably should not do these additions\n\n if (f856sUrn.length === 0) { // eslint-disable-line functional/no-conditional-statements\n const {code, value, generated} = await createURNSubfield(record);\n\n if (generated && useMelindaTemp) {\n const tempSubField = {code: '9', value: 'MELINDA<TEMP>'};\n\n record.insertField({\n tag: '856',\n ind1: '4',\n ind2: '0',\n subfields: [{code, value}, ...ldSubfields, tempSubField]\n });\n\n return true;\n }\n\n record.insertField({\n tag: '856',\n ind1: '4',\n ind2: '0',\n subfields: [{code, value}, ...ldSubfields]\n });\n\n return true;\n } else if (isLegalDeposit) { // eslint-disable-line functional/no-conditional-statements\n\n // We add here legal deposit information to all URN-f856s - we probably should not do this\n // We should add extra f856 URN / URNs for legal deposits that already have a open (non-legal-deposit) URN\n // How do we decide which URN to use as a template if there are several URNs\n // We should check for existence of a legal deposit URN anyways\n\n f856sUrn.forEach(f => {\n // Change phrase from old to new if field with old phrase is found\n if (f.subfields.some(sf => hasOld856LdPhrase(sf))) { // eslint-disable-line functional/no-conditional-statements\n f.subfields // eslint-disable-line functional/immutable-data\n .find(sf => hasOld856LdPhrase(sf))\n .value = 'Käytettävissä vapaakappaletyöasemilla';\n }\n\n // Create subfields if necessary\n ldSubfields.forEach(ldsf => {\n if (!f.subfields.some(sf => sf.code === ldsf.code && sf.value === ldsf.value && !hasOld856LdPhrase(sf))) { // eslint-disable-line functional/no-conditional-statements\n f.subfields.push(ldsf); // eslint-disable-line functional/immutable-data\n }\n });\n });\n }\n\n return true;\n\n // We should check existence of URN in f024 i1: '7' $2 urn/URN for this too\n\n async function createURNSubfield(rec) {\n // isbn is picked from the last 020 $a in the record\n // what should we do in case of several 020 $a:s\n const isbn = rec.fields.reduce((acc, f) => {\n if (f.tag === '020') {\n const a = f.subfields.find(sf => sf.code === 'a');\n return a ? a.value : undefined;\n }\n\n return acc;\n }, undefined);\n\n debugData(`isbns: ${isbn}`);\n\n const {generated, value} = await createURN(isbn);\n return {code: 'u', value, generated};\n\n async function createURN(isbn = false) {\n if (isbn) {\n return {generated: false, value: `https://urn.fi/URN:ISBN:${isbn}`};\n }\n\n const response = await fetch(URN_GENERATOR_URL);\n const body = await response.text();\n\n // If we generated URN we could also add it to the 024\n // generated 024 should also have $9 MELINDA<TEMP>\n return {generated: true, value: `https://urn.fi/${body}`};\n }\n }\n\n function hasOld856LdPhrase({code, value}) {\n if (code === 'z' && value === 'Käytettävissä vapaakappalekirjastoissa') {\n return true;\n }\n\n return false;\n }\n\n }\n\n // Later when the new subfields that have f506/f540 -type contents, we should add also them here\n function createLDSubfields() {\n return [\n {\n code: 'z',\n value: 'Käytettävissä vapaakappaletyöasemilla'\n },\n {\n code: '5',\n value: 'FI-Vapaa'\n }\n ];\n }\n\n function fieldHasLDSubfields(field, ldSubfields) {\n if (ldSubfields.every(ldsf => field.subfields.some(sf => sf.code === ldsf.code && sf.value === ldsf.value))) {\n return true;\n }\n }\n\n function validateLD(f856sUrn) {\n debug(`Validating the existence of legal deposit subfields`);\n const ldSubfields = createLDSubfields();\n const f856sUrnWithLdSubfields = f856sUrn.filter(field => fieldHasLDSubfields(field, ldSubfields));\n if (f856sUrnWithLdSubfields.length > 0) {\n debug(`Record has ${f856sUrnWithLdSubfields.length} URN fields with all necessary legal deposit subfields`);\n debugData(`f856sUrnWithLdSubfields: ${JSON.stringify(f856sUrnWithLdSubfields)}`);\n return true;\n }\n return false;\n }\n\n function validate(record) {\n // if not electronic skip this validator\n if (!isElectronicMaterial(record)) {\n debug(`Record is not electronic - no need to validate legal deposit URNs`);\n return {valid: true};\n }\n\n const f856sUrn = record.fields.filter(hasURN);\n\n if (f856sUrn.length > 0) {\n debug(`Record has ${f856sUrn.length} URN fields`);\n debugData(`f856sUrn: ${JSON.stringify(f856sUrn)}`);\n\n if (!isLegalDeposit || validateLD(f856sUrn)) {\n debug(`Record is valid`);\n return {valid: true};\n }\n }\n debug(`No (valid) URN fields - Record is not valid`);\n return {valid: false};\n }\n}\n"],"mappings":"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","ignoreList":[]}
package/dist/urn.spec.js CHANGED
@@ -3,7 +3,7 @@
3
3
  var _chai = require("chai");
4
4
  var _marcRecord = require("@natlibfi/marc-record");
5
5
  var _urn = _interopRequireDefault(require("../src/urn"));
6
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
6
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
7
7
  describe('urn', async () => {
8
8
  // Fields
9
9
  const f337 = {
@@ -1 +1 @@
1
- {"version":3,"file":"urn.spec.js","names":["_chai","require","_marcRecord","_urn","_interopRequireDefault","obj","__esModule","default","describe","f337","tag","ind1","ind2","subfields","code","value","f337nonElectronic","ldf856","ldf856old","ldf856Https","ldf856partial","f856URN","f856URNHttps","f856URNnotResource","f856URL","f020","f020second","it","validator","validatorFactory","expect","to","be","an","that","has","any","keys","description","a","validate","test","isLegalDeposit","valid","recfields","result","MarcRecord","fields","eql","fix","resfields","record","nonld","ld","skip"],"sources":["../src/urn.spec.js"],"sourcesContent":["import {expect} from 'chai';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from '../src/urn';\n\ndescribe('urn', 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: 'b', value: 'n'},\n {code: '2', value: 'rdamedia'}\n ]\n };\n\n const ldf856 = {\n tag: '856',\n ind1: '4',\n ind2: '0',\n subfields: [\n {code: 'u', value: 'http://urn.fi/URN:ISBN:978-951-9155-47-0'},\n {code: 'z', value: 'Käytettävissä vapaakappaletyöasemilla'},\n {code: '5', value: 'FI-Vapaa'}\n ]\n };\n\n const ldf856old = {\n tag: '856',\n ind1: '4',\n ind2: '0',\n subfields: [\n {code: 'u', value: 'http://urn.fi/URN:ISBN:978-951-9155-47-0'},\n {code: 'z', value: 'Käytettävissä vapaakappalekirjastoissa'},\n {code: '5', value: 'FI-Vapaa'}\n ]\n };\n\n const ldf856Https = {\n tag: '856',\n ind1: '4',\n ind2: '0',\n subfields: [\n {code: 'u', value: 'https://urn.fi/URN:ISBN:978-951-9155-47-0'},\n {code: 'z', value: 'Käytettävissä vapaakappaletyöasemilla'},\n {code: '5', value: 'FI-Vapaa'}\n ]\n };\n\n const ldf856partial = {\n tag: '856',\n ind1: '4',\n ind2: '0',\n subfields: [\n {code: 'u', value: 'http://urn.fi/URN:ISBN:978-951-9155-47-0'},\n {code: '5', value: 'FI-Vapaa'}\n ]\n };\n\n const f856URN = {\n tag: '856',\n ind1: '4',\n ind2: '0',\n subfields: [{code: 'u', value: 'http://urn.fi/URN:ISBN:978-951-9155-47-0'}]\n };\n\n const f856URNHttps = {\n tag: '856',\n ind1: '4',\n ind2: '0',\n subfields: [{code: 'u', value: 'https://urn.fi/URN:ISBN:978-951-9155-47-0'}]\n };\n\n const f856URNnotResource = {\n tag: '856',\n ind1: '4',\n ind2: '1',\n subfields: [{code: 'u', value: 'http://urn.fi/URN:ISBN:978-951-9155-47-0'}]\n };\n\n\n const f856URL = {\n tag: '856',\n ind1: '4',\n ind2: '0',\n subfields: [{code: 'u', value: 'http://foo.bar/'}]\n };\n\n const f020 = {\n tag: '020',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: '978-951-9155-47-0'}]\n };\n\n const f020second = {\n tag: '020',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: '9789519155470'}]\n };\n\n\n it('Creates a validator', async () => {\n const validator = await validatorFactory();\n\n expect(validator)\n .to.be.an('object')\n .that.has.any.keys('description', 'validate');\n\n expect(validator.description).to.be.a('string');\n expect(validator.validate).to.be.a('function');\n });\n\n // Tests\n const test = async isLegalDeposit => {\n const validator = await validatorFactory(isLegalDeposit);\n return {\n validate: async (valid, ...recfields) => {\n const result = await validator.validate(new MarcRecord({fields: recfields}));\n expect(result).to.eql({valid});\n },\n\n fix: async (recfields, resfields) => {\n const record = new MarcRecord({fields: recfields});\n await validator.fix(record);\n expect(record.fields).to.eql(resfields);\n }\n };\n };\n\n /// Non-legal and legal deposit\n const nonld = await test(false);\n const ld = await test(true);\n\n describe('#validate', () => {\n // Validate non-electoronic\n it('Finds the record valid; non-electronic record', async () => {\n await nonld.validate(true, f337nonElectronic);\n });\n\n // Validate non-legal deposit\n it('Finds the record valid; 856 with urn, and is non-legal deposit', async () => {\n await nonld.validate(true, f337, f856URN);\n });\n\n // we should recognize that 856 with second indicator 1 is not describing the resource itself\n it.skip('Finds the record invalid; 856 ind2: 1 with urn, and is non-legal deposit', async () => {\n await nonld.validate(false, f337, f856URNnotResource);\n });\n\n // should we require urn if we're not handling a legal deposit\n it('Finds the record invalid; 856 without urn, and is non-legal deposit', async () => {\n await nonld.validate(false, f337, f856URL);\n });\n\n\n // should we require urn if we're not handling a legal deposit\n it('Finds the record invalid; Missing 856, and is non-legal deposit', async () => {\n await nonld.validate(false, f337, f020);\n });\n\n // Validate legal deposit\n it('Finds the record invalid; 856 with urn, and is legal deposit', async () => {\n await ld.validate(false, f020, f337, f856URN);\n });\n\n it('Finds the record invalid; 856 without urn, and is legal deposit', async () => {\n await ld.validate(false, f020, f337, f856URL);\n });\n\n it('Finds the record invalid; Missing 856, and is legal deposit', async () => {\n await ld.validate(false, f337, f020);\n });\n\n it('Finds the record valid; 856 with URN and legal deposit subfields, and is legal deposit', async () => {\n await ld.validate(true, f337, f020, ldf856);\n });\n\n it('Finds the record invalid; old phrase is used in $z', async () => {\n await ld.validate(false, f337, f020, ldf856old);\n });\n\n it('Finds the record valid; 856 with URN and legal deposit subfields and other f856s, and is legal deposit', async () => {\n await ld.validate(true, f337, f020, ldf856partial, ldf856, f856URL);\n });\n\n it('Finds the record invalid; 856 with URN and partial legal deposit subfields, and is legal deposit', async () => {\n await ld.validate(false, f337, f020, ldf856partial);\n });\n\n\n });\n\n describe('#fix', () => {\n // Fix non-legal deposit\n it('856 with urn, and is non-legal deposit; Nothing to add', async () => {\n await nonld.fix([f020, f856URL, f856URN], [f020, f856URL, f856URN]);\n });\n\n // should we actually add non-resolvable urns?\n it('856 without urn, and is non-legal deposit; Adds 856 with urn (https)', async () => {\n await nonld.fix([f020, f856URL], [f020, f856URL, f856URNHttps]);\n });\n\n // should we actually add non-resolvable urns?\n it('Missing 856, and is non-legal deposit; Adds 856 with urn (https)', async () => {\n await nonld.fix([f020], [f020, f856URNHttps]);\n });\n\n // should we actually add non-resolvable urns?\n it('Missing 856, and is non-legal deposit, two 020 fields; Adds 856 with urn from second 020 (https)', async () => {\n await nonld.fix([f020second, f020], [f020second, f020, f856URNHttps]);\n });\n\n // should we actually add non resovable urns?\n // we should think about how to choose the isbn to use in case of several ISBNs\n it.skip('Missing 856, and is non-legal deposit, two 020 fields; Adds 856 with urn from first 020 (https)', async () => {\n await nonld.fix([f020, f020second], [f020, f020second, f856URNHttps]);\n });\n\n\n // Fix legal deposit\n it('856 with urn and legal deposit fields, and is legal deposit; Nothing to add', async () => {\n await ld.fix([f020, f856URL, ldf856], [f020, f856URL, ldf856]);\n });\n\n it('856 with urn and legal deposit fields, and is legal deposit but phrase is old; change phrase to new', async () => {\n await ld.fix([f020, f856URL, ldf856old], [f020, f856URL, ldf856]);\n });\n\n it('856 without urn, and is legal deposit; Adds 856 with urn (https) and legal deposit fields', async () => {\n await ld.fix([f020, f856URL], [f020, f856URL, ldf856Https]);\n });\n\n // we should test generating the URN in case of no ISBN\n\n // we should test creating Melinda-temp field\n\n // We shouldn't lock the open URN for legal deposit use\n it('Missing 856, and is legal deposit; Adds 856 with urn (https) and legal deposit fields', async () => {\n await ld.fix([f020], [f020, ldf856Https]);\n });\n\n // We should actually do this instead of locking the original non-legal deposit URN for legal deposit use\n it.skip('856 with urn, and is legal deposit; Adds another f856 with URN and legal deposit fields', async () => {\n await ld.fix([f020, f856URL, f856URN], [f020, f856URL, f856URN, ldf856Https]);\n });\n\n // We should actually add a new urn in case of a non-resource URN\n it.skip('856 with non-resource-urn, and is legal deposit; Adds another f856 with URN and legal deposit fields', async () => {\n await ld.fix([f020, f856URL, f856URNnotResource], [f020, f856URL, f856URNnotResource, ldf856Https]);\n });\n\n\n });\n});\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"urn.spec.js","names":["_chai","require","_marcRecord","_urn","_interopRequireDefault","e","__esModule","default","describe","f337","tag","ind1","ind2","subfields","code","value","f337nonElectronic","ldf856","ldf856old","ldf856Https","ldf856partial","f856URN","f856URNHttps","f856URNnotResource","f856URL","f020","f020second","it","validator","validatorFactory","expect","to","be","an","that","has","any","keys","description","a","validate","test","isLegalDeposit","valid","recfields","result","MarcRecord","fields","eql","fix","resfields","record","nonld","ld","skip"],"sources":["../src/urn.spec.js"],"sourcesContent":["import {expect} from 'chai';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from '../src/urn';\n\ndescribe('urn', 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: 'b', value: 'n'},\n {code: '2', value: 'rdamedia'}\n ]\n };\n\n const ldf856 = {\n tag: '856',\n ind1: '4',\n ind2: '0',\n subfields: [\n {code: 'u', value: 'http://urn.fi/URN:ISBN:978-951-9155-47-0'},\n {code: 'z', value: 'Käytettävissä vapaakappaletyöasemilla'},\n {code: '5', value: 'FI-Vapaa'}\n ]\n };\n\n const ldf856old = {\n tag: '856',\n ind1: '4',\n ind2: '0',\n subfields: [\n {code: 'u', value: 'http://urn.fi/URN:ISBN:978-951-9155-47-0'},\n {code: 'z', value: 'Käytettävissä vapaakappalekirjastoissa'},\n {code: '5', value: 'FI-Vapaa'}\n ]\n };\n\n const ldf856Https = {\n tag: '856',\n ind1: '4',\n ind2: '0',\n subfields: [\n {code: 'u', value: 'https://urn.fi/URN:ISBN:978-951-9155-47-0'},\n {code: 'z', value: 'Käytettävissä vapaakappaletyöasemilla'},\n {code: '5', value: 'FI-Vapaa'}\n ]\n };\n\n const ldf856partial = {\n tag: '856',\n ind1: '4',\n ind2: '0',\n subfields: [\n {code: 'u', value: 'http://urn.fi/URN:ISBN:978-951-9155-47-0'},\n {code: '5', value: 'FI-Vapaa'}\n ]\n };\n\n const f856URN = {\n tag: '856',\n ind1: '4',\n ind2: '0',\n subfields: [{code: 'u', value: 'http://urn.fi/URN:ISBN:978-951-9155-47-0'}]\n };\n\n const f856URNHttps = {\n tag: '856',\n ind1: '4',\n ind2: '0',\n subfields: [{code: 'u', value: 'https://urn.fi/URN:ISBN:978-951-9155-47-0'}]\n };\n\n const f856URNnotResource = {\n tag: '856',\n ind1: '4',\n ind2: '1',\n subfields: [{code: 'u', value: 'http://urn.fi/URN:ISBN:978-951-9155-47-0'}]\n };\n\n\n const f856URL = {\n tag: '856',\n ind1: '4',\n ind2: '0',\n subfields: [{code: 'u', value: 'http://foo.bar/'}]\n };\n\n const f020 = {\n tag: '020',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: '978-951-9155-47-0'}]\n };\n\n const f020second = {\n tag: '020',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: '9789519155470'}]\n };\n\n\n it('Creates a validator', async () => {\n const validator = await validatorFactory();\n\n expect(validator)\n .to.be.an('object')\n .that.has.any.keys('description', 'validate');\n\n expect(validator.description).to.be.a('string');\n expect(validator.validate).to.be.a('function');\n });\n\n // Tests\n const test = async isLegalDeposit => {\n const validator = await validatorFactory(isLegalDeposit);\n return {\n validate: async (valid, ...recfields) => {\n const result = await validator.validate(new MarcRecord({fields: recfields}));\n expect(result).to.eql({valid});\n },\n\n fix: async (recfields, resfields) => {\n const record = new MarcRecord({fields: recfields});\n await validator.fix(record);\n expect(record.fields).to.eql(resfields);\n }\n };\n };\n\n /// Non-legal and legal deposit\n const nonld = await test(false);\n const ld = await test(true);\n\n describe('#validate', () => {\n // Validate non-electoronic\n it('Finds the record valid; non-electronic record', async () => {\n await nonld.validate(true, f337nonElectronic);\n });\n\n // Validate non-legal deposit\n it('Finds the record valid; 856 with urn, and is non-legal deposit', async () => {\n await nonld.validate(true, f337, f856URN);\n });\n\n // we should recognize that 856 with second indicator 1 is not describing the resource itself\n it.skip('Finds the record invalid; 856 ind2: 1 with urn, and is non-legal deposit', async () => {\n await nonld.validate(false, f337, f856URNnotResource);\n });\n\n // should we require urn if we're not handling a legal deposit\n it('Finds the record invalid; 856 without urn, and is non-legal deposit', async () => {\n await nonld.validate(false, f337, f856URL);\n });\n\n\n // should we require urn if we're not handling a legal deposit\n it('Finds the record invalid; Missing 856, and is non-legal deposit', async () => {\n await nonld.validate(false, f337, f020);\n });\n\n // Validate legal deposit\n it('Finds the record invalid; 856 with urn, and is legal deposit', async () => {\n await ld.validate(false, f020, f337, f856URN);\n });\n\n it('Finds the record invalid; 856 without urn, and is legal deposit', async () => {\n await ld.validate(false, f020, f337, f856URL);\n });\n\n it('Finds the record invalid; Missing 856, and is legal deposit', async () => {\n await ld.validate(false, f337, f020);\n });\n\n it('Finds the record valid; 856 with URN and legal deposit subfields, and is legal deposit', async () => {\n await ld.validate(true, f337, f020, ldf856);\n });\n\n it('Finds the record invalid; old phrase is used in $z', async () => {\n await ld.validate(false, f337, f020, ldf856old);\n });\n\n it('Finds the record valid; 856 with URN and legal deposit subfields and other f856s, and is legal deposit', async () => {\n await ld.validate(true, f337, f020, ldf856partial, ldf856, f856URL);\n });\n\n it('Finds the record invalid; 856 with URN and partial legal deposit subfields, and is legal deposit', async () => {\n await ld.validate(false, f337, f020, ldf856partial);\n });\n\n\n });\n\n describe('#fix', () => {\n // Fix non-legal deposit\n it('856 with urn, and is non-legal deposit; Nothing to add', async () => {\n await nonld.fix([f020, f856URL, f856URN], [f020, f856URL, f856URN]);\n });\n\n // should we actually add non-resolvable urns?\n it('856 without urn, and is non-legal deposit; Adds 856 with urn (https)', async () => {\n await nonld.fix([f020, f856URL], [f020, f856URL, f856URNHttps]);\n });\n\n // should we actually add non-resolvable urns?\n it('Missing 856, and is non-legal deposit; Adds 856 with urn (https)', async () => {\n await nonld.fix([f020], [f020, f856URNHttps]);\n });\n\n // should we actually add non-resolvable urns?\n it('Missing 856, and is non-legal deposit, two 020 fields; Adds 856 with urn from second 020 (https)', async () => {\n await nonld.fix([f020second, f020], [f020second, f020, f856URNHttps]);\n });\n\n // should we actually add non resovable urns?\n // we should think about how to choose the isbn to use in case of several ISBNs\n it.skip('Missing 856, and is non-legal deposit, two 020 fields; Adds 856 with urn from first 020 (https)', async () => {\n await nonld.fix([f020, f020second], [f020, f020second, f856URNHttps]);\n });\n\n\n // Fix legal deposit\n it('856 with urn and legal deposit fields, and is legal deposit; Nothing to add', async () => {\n await ld.fix([f020, f856URL, ldf856], [f020, f856URL, ldf856]);\n });\n\n it('856 with urn and legal deposit fields, and is legal deposit but phrase is old; change phrase to new', async () => {\n await ld.fix([f020, f856URL, ldf856old], [f020, f856URL, ldf856]);\n });\n\n it('856 without urn, and is legal deposit; Adds 856 with urn (https) and legal deposit fields', async () => {\n await ld.fix([f020, f856URL], [f020, f856URL, ldf856Https]);\n });\n\n // we should test generating the URN in case of no ISBN\n\n // we should test creating Melinda-temp field\n\n // We shouldn't lock the open URN for legal deposit use\n it('Missing 856, and is legal deposit; Adds 856 with urn (https) and legal deposit fields', async () => {\n await ld.fix([f020], [f020, ldf856Https]);\n });\n\n // We should actually do this instead of locking the original non-legal deposit URN for legal deposit use\n it.skip('856 with urn, and is legal deposit; Adds another f856 with URN and legal deposit fields', async () => {\n await ld.fix([f020, f856URL, f856URN], [f020, f856URL, f856URN, ldf856Https]);\n });\n\n // We should actually add a new urn in case of a non-resource URN\n it.skip('856 with non-resource-urn, and is legal deposit; Adds another f856 with URN and legal deposit fields', async () => {\n await ld.fix([f020, f856URL, f856URNnotResource], [f020, f856URL, f856URNnotResource, ldf856Https]);\n });\n\n\n });\n});\n"],"mappings":"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","ignoreList":[]}
package/dist/utils.js CHANGED
@@ -11,6 +11,7 @@ exports.isControlSubfieldCode = isControlSubfieldCode;
11
11
  exports.isElectronicMaterial = isElectronicMaterial;
12
12
  exports.nvdebug = nvdebug;
13
13
  exports.nvdebugFieldArray = nvdebugFieldArray;
14
+ exports.recordRemoveValuelessSubfields = recordRemoveValuelessSubfields;
14
15
  exports.recordToString = recordToString;
15
16
  exports.subfieldToString = subfieldToString;
16
17
  exports.uniqArray = uniqArray;
@@ -51,6 +52,22 @@ function recordToString(record) {
51
52
  const fields = record.fields.map(f => fieldToString(f));
52
53
  return `${ldr}\n${fields.join('\n')}`;
53
54
  }
55
+ function recordRemoveValuelessSubfields(record) {
56
+ record.fields = record.fields.map(field => {
57
+ // eslint-disable-line functional/immutable-data
58
+ if (!field.subfields) {
59
+ // Keep control fields
60
+ return field;
61
+ }
62
+ // Remove empty subfields from datafields:
63
+ field.subfields = field.subfields.filter(sf => sf.value); // eslint-disable-line functional/immutable-data
64
+
65
+ if (field.subfields && field.subfields.length === 0) {
66
+ return false; // Return false instead of a field if field has no subfields left. These will soon be filtered out.
67
+ }
68
+ return field; //if field has subfields return it
69
+ }).filter(field => field); // Filter those falses out
70
+ }
54
71
  function fieldToString(f) {
55
72
  if ('subfields' in f) {
56
73
  return `${f.tag} ${normalizeIndicatorValue(f.ind1)}${normalizeIndicatorValue(f.ind2)}${formatSubfields(f)}`;
package/dist/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":["isElectronicMaterial","record","f337s","get","length","some","f","fieldHasSubfield","nvdebug","message","func","undefined","field","subfieldCode","subfieldValue","subfields","sf","code","value","subfieldToString","normalizeIndicatorValue","val","recordToString","ldr","leader","fields","map","fieldToString","join","tag","ind1","ind2","formatSubfields","fieldsToString","nvdebugFieldArray","prefix","forEach","isControlSubfieldCode","includes","getCatalogingLanguage","defaultCatalogingLanguage","field040","b","filter","uniqArray","arr","i","indexOf"],"sources":["../src/utils.js"],"sourcesContent":["export function isElectronicMaterial(record) {\n const f337s = record.get('337');\n\n return f337s.length > 0 && f337s.some(f => fieldHasSubfield(f, 'b', 'c') && fieldHasSubfield(f, '2', 'rdamedia'));\n}\n\nexport function nvdebug(message, func = undefined) {\n if (func) { // eslint-disable-line functional/no-conditional-statements\n func(message);\n }\n //console.info(message); // eslint-disable-line no-console\n}\n\nexport function fieldHasSubfield(field, subfieldCode, subfieldValue = null) {\n if (!field.subfields) {\n return false;\n }\n if (subfieldValue === null) {\n return field.subfields.some(sf => sf.code === subfieldCode);\n }\n return field.subfields.some(sf => sf.code === subfieldCode && subfieldValue === sf.value);\n}\n\nexport function subfieldToString(sf) {\n if (!sf.value) {\n return `‡${sf.code}`;\n }\n return `‡${sf.code} ${sf.value}`;\n}\n\nfunction normalizeIndicatorValue(val) {\n if (val === ' ') {\n return '#';\n }\n return val;\n}\n\nexport function recordToString(record) {\n const ldr = `LDR ${record.leader}`;\n const fields = record.fields.map(f => fieldToString(f));\n return `${ldr}\\n${fields.join('\\n')}`;\n}\n\nexport function fieldToString(f) {\n if ('subfields' in f) {\n return `${f.tag} ${normalizeIndicatorValue(f.ind1)}${normalizeIndicatorValue(f.ind2)}${formatSubfields(f)}`;\n }\n return `${f.tag} ${f.value}`;\n\n function formatSubfields(field) {\n return field.subfields.map(sf => ` ${subfieldToString(sf)}`).join('');\n }\n}\n\nexport function fieldsToString(fields) {\n return fields.map(f => fieldToString(f)).join('\\t__SEPARATOR__\\t');\n}\n\nexport function nvdebugFieldArray(fields, prefix = ' ', func = undefined) {\n fields.forEach(field => nvdebug(`${prefix}${fieldToString(field)}`, func));\n}\n\nexport function isControlSubfieldCode(subfieldCode) {\n if (['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'w'].includes(subfieldCode)) {\n return true;\n }\n return false;\n}\n\nexport function getCatalogingLanguage(record, defaultCatalogingLanguage = undefined) {\n const [field040] = record.get(/^040$/u);\n if (!field040) {\n return defaultCatalogingLanguage;\n }\n const [b] = field040.subfields.filter(sf => sf.code === 'b');\n if (!b) {\n return defaultCatalogingLanguage;\n }\n return b.value;\n}\n\n\nexport function uniqArray(arr) {\n return arr.filter((val, i) => arr.indexOf(val) === i);\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"utils.js","names":["isElectronicMaterial","record","f337s","get","length","some","f","fieldHasSubfield","nvdebug","message","func","undefined","field","subfieldCode","subfieldValue","subfields","sf","code","value","subfieldToString","normalizeIndicatorValue","val","recordToString","ldr","leader","fields","map","fieldToString","join","recordRemoveValuelessSubfields","filter","tag","ind1","ind2","formatSubfields","fieldsToString","nvdebugFieldArray","prefix","forEach","isControlSubfieldCode","includes","getCatalogingLanguage","defaultCatalogingLanguage","field040","b","uniqArray","arr","i","indexOf"],"sources":["../src/utils.js"],"sourcesContent":["export function isElectronicMaterial(record) {\n const f337s = record.get('337');\n\n return f337s.length > 0 && f337s.some(f => fieldHasSubfield(f, 'b', 'c') && fieldHasSubfield(f, '2', 'rdamedia'));\n}\n\nexport function nvdebug(message, func = undefined) {\n if (func) { // eslint-disable-line functional/no-conditional-statements\n func(message);\n }\n //console.info(message); // eslint-disable-line no-console\n}\n\nexport function fieldHasSubfield(field, subfieldCode, subfieldValue = null) {\n if (!field.subfields) {\n return false;\n }\n if (subfieldValue === null) {\n return field.subfields.some(sf => sf.code === subfieldCode);\n }\n return field.subfields.some(sf => sf.code === subfieldCode && subfieldValue === sf.value);\n}\n\nexport function subfieldToString(sf) {\n if (!sf.value) {\n return `‡${sf.code}`;\n }\n return `‡${sf.code} ${sf.value}`;\n}\n\nfunction normalizeIndicatorValue(val) {\n if (val === ' ') {\n return '#';\n }\n return val;\n}\n\nexport function recordToString(record) {\n const ldr = `LDR ${record.leader}`;\n const fields = record.fields.map(f => fieldToString(f));\n return `${ldr}\\n${fields.join('\\n')}`;\n}\n\nexport function recordRemoveValuelessSubfields(record) {\n record.fields = record.fields.map(field => { // eslint-disable-line functional/immutable-data\n if (!field.subfields) { // Keep control fields\n return field;\n }\n // Remove empty subfields from datafields:\n field.subfields = field.subfields.filter(sf => sf.value); // eslint-disable-line functional/immutable-data\n\n if (field.subfields && field.subfields.length === 0) {\n return false; // Return false instead of a field if field has no subfields left. These will soon be filtered out.\n }\n\n return field; //if field has subfields return it\n }).filter(field => field); // Filter those falses out\n}\n\nexport function fieldToString(f) {\n if ('subfields' in f) {\n return `${f.tag} ${normalizeIndicatorValue(f.ind1)}${normalizeIndicatorValue(f.ind2)}${formatSubfields(f)}`;\n }\n return `${f.tag} ${f.value}`;\n\n function formatSubfields(field) {\n return field.subfields.map(sf => ` ${subfieldToString(sf)}`).join('');\n }\n}\n\nexport function fieldsToString(fields) {\n return fields.map(f => fieldToString(f)).join('\\t__SEPARATOR__\\t');\n}\n\nexport function nvdebugFieldArray(fields, prefix = ' ', func = undefined) {\n fields.forEach(field => nvdebug(`${prefix}${fieldToString(field)}`, func));\n}\n\nexport function isControlSubfieldCode(subfieldCode) {\n if (['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'w'].includes(subfieldCode)) {\n return true;\n }\n return false;\n}\n\nexport function getCatalogingLanguage(record, defaultCatalogingLanguage = undefined) {\n const [field040] = record.get(/^040$/u);\n if (!field040) {\n return defaultCatalogingLanguage;\n }\n const [b] = field040.subfields.filter(sf => sf.code === 'b');\n if (!b) {\n return defaultCatalogingLanguage;\n }\n return b.value;\n}\n\n\nexport function uniqArray(arr) {\n return arr.filter((val, i) => arr.indexOf(val) === i);\n}\n"],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -14,7 +14,7 @@
14
14
  "url": "git@github.com:natlibfi/marc-record-validators-melinda.git"
15
15
  },
16
16
  "license": "MIT",
17
- "version": "11.2.1",
17
+ "version": "11.2.2-alpha.2",
18
18
  "main": "./dist/index.js",
19
19
  "publishConfig": {
20
20
  "access": "public"
@@ -20,16 +20,17 @@ import {default as fixPunctuation} from './punctuation2';
20
20
  import {default as fixQualifyingInformation} from './normalize-qualifying-information';
21
21
  import {sortAdjacentSubfields} from './sortSubfields';
22
22
 
23
-
24
23
  // import createDebugLogger from 'debug';
25
- import {nvdebug, recordToString} from './utils';
24
+ import {fieldHasSubfield, nvdebug, recordRemoveValuelessSubfields, recordToString} from './utils';
26
25
 
27
26
  // const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/punctuation2');
28
27
 
29
28
  const description = 'Replacement for Cyrillux usemarcon rules';
30
29
 
31
30
  // Extended original list with 541, 561, 562, 583, 584
32
- const dropTags = ['001', '003', '010', '012', '014', '015', '016', '019', '025', '029', '032', '035', '036', '037', '038', '042', '049', '051', '061', '068', '071', '074', '079', '090', '091', '092', '094', '095', '096', '097', '099', '249', '261', '262', '350', '400', '411', '541', '561', '562', '574', '575', '577', '578', '583', '584', '589', '590', '591', '592', '593', '594', '595', '596', '597', '598', '599', '653', '698', '741', '742', '744', '761', '790', '841', '842', '843', '844', '845', '850', '852', '853', '854', '855', '858', '859', '863', '864', '865', '866', '867', '868', '876', '877', '878', '882', '886', '887', '888', '890', '899'];
31
+ // 017, 044... et al are LL additions from 2019 (via USEMARCON-RDA)
32
+ const dropTags = ['001', '003', '010', '012', '014', '015', '016', '017', '019', '025', '029', '032', '035', '036', '037', '038', '042', '044', '049', '051', '061', '068', '071', '074', '079', '090', '091', '092', '094', '095', '096', '097', '099', '249', '261', '262', '350', '400', '411', '541', '561', '562', '574', '575', '577', '578', '583', '584', '589', '590', '591', '592', '593', '594', '595', '596', '597', '598', '599', '653', '698', '741', '742', '744', '751', '761', '790', '841', '842', '843', '844', '845', '850', '852', '853', '854', '855', '858', '859', '863', '864', '865', '866', '867', '868', '876', '877', '878', '882', '886', '887', '888', '890', '899'];
33
+
33
34
 
34
35
  export default function () {
35
36
  return {
@@ -43,59 +44,109 @@ export default function () {
43
44
  return res;
44
45
  }
45
46
 
46
- function realFix(record) {
47
- // Fix leader: standard fixes + update LDR/17 to '4'
48
- fixLeader(record);
47
+ function realFixNonAleph(record) {
48
+ if (isAlephRecord(record)) {
49
+ return;
50
+ }
51
+ // Update LDR/17 to '4'
49
52
  record.leader = `${record.leader.substring(0, 17)}4${record.leader.substring(18, 24)}`; // eslint-disable-line functional/immutable-data
50
53
 
51
54
  // Remove unwanted fields:
52
55
  record.fields = record.fields.filter(f => !dropTags.includes(f.tag)); // eslint-disable-line functional/immutable-data
53
56
 
54
- record.fields.forEach(f => fieldSpecificStuff(f));
57
+ // Remove 084 fields that don't have $2 ykl (based on USEMARCON-RDA/bw_rda_kyril.rul code by LL 2019)
58
+ record.fields = record.fields.filter(f => f.tag !== '084' || f.subfields.some(sf => sf.code === '2' && sf.value === 'ykl')); // eslint-disable-line functional/immutable-data
59
+
60
+ fieldSpecificStuff(record.fields);
61
+
62
+ function fieldSpecificStuff(fields) {
63
+ const [field, ...rest] = fields;
64
+
65
+ if (field === undefined) {
66
+ return;
67
+ }
55
68
 
56
- function fieldSpecificStuff(field) {
57
69
  removeOwnershipSubfield5(field);
58
70
  removeFromOldCatalog(field); // Remove LoC phrase "[from old catalog]" from srings
59
71
  translateFieldToFinnish(field);
72
+
73
+ return fieldSpecificStuff(rest);
74
+ }
75
+
76
+ fixField040(record); // All $b values are changed to 'mul'. As a side effect 33X$b=>$a mappings are in Finnish! Ok in this domain!
77
+
78
+ fieldSpecificStuff2(record.fields);
79
+
80
+ function fieldSpecificStuff2(fields) {
81
+ const [field, ...rest] = fields;
82
+
83
+ if (field === undefined) {
84
+ return;
85
+ }
86
+
87
+ removeSubfieldH(field); // NB! Do this only after 33X creation, as 245$h might be useful there!
88
+
89
+ field100eKirjoittaja(field);
90
+
91
+ function field100eKirjoittaja(f) { // LL 2019 USEMARCON-RDA rule
92
+ if (f.tag === '100' && !fieldHasSubfield(f, 'e') && record.isBK()) {
93
+ f.subfields = [{code: 'e', value: 'kirjoittaja.'}, ...f.subfields]; // eslint-disable-line functional/immutable-data
94
+ sortAdjacentSubfields(f);
95
+ // Punctuation will be done later on...
96
+ return;
97
+ }
98
+ }
99
+
100
+ field260To264s(field, record);
101
+
102
+ // NB! 300 (before or after 33X creation?)
103
+ field410To490And810(field, record);
104
+ field440To490And830(field, record);
105
+ // handle505(field); // not applying them usemarcon-cyrillux rules for field 505 as I can't understand their motivation.
106
+ return fieldSpecificStuff2(rest);
60
107
  }
61
108
 
109
+ }
110
+
111
+ function realFixAll1(record) {
112
+ fixLeader(record); // Fix defaults, esp. LDR/18=i
113
+
62
114
  fixCountryCodes().fix(record); // 008/15-17
63
115
  fixLanguageCodes().fix(record); // 008/35-37 AND 041 (note that all relevant subfield codes are fixed, not just $a)
64
116
 
65
- fixQualifyingInformation().fix(record); // 015, 020, 024 and 028
117
+ recordRemoveValuelessSubfields(record);
66
118
 
67
119
  // Field 028: use $b$a, not $a$b:
68
120
  const f028 = record.fields.filter(f => f.tag === '028');
69
121
  f028.forEach(f => sortAdjacentSubfields(f));
70
122
 
71
- fixField040(record); // All $b values are changed to 'mul'. As a side effect 33X$b=>$a mappings are in Finnish! Ok in this domain!
72
123
  add041().fix(record);
73
124
 
74
125
  fixRelatorTerms().fix(record);
75
126
 
127
+ }
128
+
129
+ function realFixAll2(record) {
130
+ fixQualifyingInformation().fix(record); // 015, 020, 024 and 028
131
+
132
+ // Cyrillux specific code might change 040$b and thus affect these rules:
76
133
  fix33X().fix(record); // 33X$a => 33X$a$b$2
77
134
  add336().fix(record);
78
135
  add337().fix(record);
79
136
  add338().fix(record);
80
137
 
81
- record.fields.forEach(f => fieldSpecificStuff2(f));
82
-
83
- function fieldSpecificStuff2(field) {
84
- removeSubfieldH(field); // only after 33X creation, as 245$h might be useful
85
-
86
- field260To264s(field, record);
138
+ // The fixer below implements Cyrillux rules such as 245I1 | 245I1 | If (Exists(@100) Or Exists(@110) Or Exists(@111) Or Exists(@130)) Then '1' Else '0' and plenty of other good stuff:
139
+ fixIndicators().fix(record);
87
140
 
88
- // NB! 300 (before or after 33X creation?)
89
- field410To490And810(field, record);
90
- field440To490And830(field, record);
91
- // handle505(field); // not applying them usemarcon-cyrillux rules for field 505 as I can't understand their motivation.
141
+ fixPunctuation().fix(record);
142
+ }
92
143
 
93
- }
144
+ function realFix(record) {
145
+ realFixAll1(record);
94
146
 
95
- // The fixer below implement Cyrillux rules such as 245I1 | 245I1 | If (Exists(@100) Or Exists(@110) Or Exists(@111) Or Exists(@130)) Then '1' Else '0' and plenty of other good stuff:
96
- fixIndicators().fix(record);
147
+ realFixNonAleph(record);
97
148
 
98
- fixPunctuation().fix(record);
149
+ realFixAll2(record);
99
150
 
100
151
  const res = {message: [], fix: [], valid: true};
101
152
  return res;
@@ -146,6 +197,9 @@ function fixField040(record) {
146
197
  }
147
198
 
148
199
  export function removeFromOldCatalog(field) {
200
+ if (!field.tag.match(/^(?:240|65[0135]|[1678](?:00|10|11|30))$/u)) {
201
+ return;
202
+ }
149
203
  // See https://catalog.loc.gov/vwebv/ui/en_US/htdocs/help/faqs.html for motivation
150
204
  field.subfields?.forEach(sf => removeFromOldCatalogFromSubfield(sf));
151
205
 
@@ -221,6 +275,10 @@ function field440To490And830(field, record) { // might be generic... if so, move
221
275
  record.insertField(field830);
222
276
  }
223
277
 
278
+ function isAlephRecord(record) {
279
+ // Records that are already in Aleph are not processed as aggressively as genuinely new ones:
280
+ return record.fields.some(field => ['CAT', 'LKR', 'LOW', 'SID'].includes(field.tag));
281
+ }
224
282
 
225
283
  function field260To264s(field, record) { // might be generic... if so, move to utils...
226
284
  // As per my quick reading of usemarcon-cyrillux
@@ -382,6 +440,11 @@ function finnishTranslationsAndMappings(value) {
382
440
  replace('black and white', 'mustavalkoinen').
383
441
  replace(/\bbilaga\b/gui, 'liite').
384
442
  replace(/\bbilagor\b/gui, 'liitettä').
443
+ // https://github.com/NatLibFi/USEMARCON-BOOKWHERE-RDA/blob/master/bw_rda_kyril.rul#L365
444
+ replace(/(\b1\]?) с\./gui, '$1 sivu'). // eslint-disable-line prefer-named-capture-group
445
+ replace(/(\d\]?) с\./gui, '$1 sivua'). // eslint-disable-line prefer-named-capture-group
446
+ replace(/(\d) см/gui, '$1 cm'). // eslint-disable-line prefer-named-capture-group
447
+
385
448
  replace(/\bcharts\b/gui, 'kaavioita').
386
449
  replace('chiefly color illustrations', 'pääosin värikuvitettu').
387
450
  replace('chiefly', 'pääosin').
@@ -108,7 +108,10 @@ const finnishAbbreviations = {
108
108
  'san.': 'sanoittaja',
109
109
  'sov.': 'sovittaja',
110
110
  'säv.': 'säveltäjä',
111
- 'toim.': 'toimittaja'
111
+ 'toim.': 'toimittaja',
112
+ // Quick and dirty implementation of https://github.com/NatLibFi/USEMARCON-BOOKWHERE-RDA/blob/master/bw_rda_kyril.rul#L651
113
+ 'сост.': 'toimittaja',
114
+ 'ред.': 'toimittaja'
112
115
  };
113
116
 
114
117
  function subfieldHandleRelatorTermAbbreviation(subfield, language) {
@@ -127,7 +130,7 @@ function subfieldHandleRelatorTermAbbreviation(subfield, language) {
127
130
  const lcValue = value.toLowerCase(); // Check Å, Ä, Ö...
128
131
 
129
132
  // NB: Policy: if no language or multi-language: apply all rules! (Not much overlap I hope...)
130
- if (language === 'fin') {
133
+ if (language === 'fin' || language === 'mul') {
131
134
  nvdebug(`Relator try Finnish for '${lcValue}}'...`, debugDev);
132
135
  if (lcValue in finnishAbbreviations) {
133
136
  const hit = `${finnishAbbreviations[lcValue]}${punc}`;
package/src/index.js CHANGED
@@ -1,16 +1,25 @@
1
1
  import AccessRights from './access-rights';
2
+ import AddMissingField041 from './addMissingField041';
3
+ import AddMissingField336 from './addMissingField336';
4
+ import AddMissingField337 from './addMissingField337';
5
+ import AddMissingField338 from './addMissingField338';
6
+ import CyrilluxUsemarconReplacement from './cyrillux-usemarcon-replacement';
2
7
  import DoubleCommas from './double-commas';
3
8
  import DuplicatesInd1 from './duplicates-ind1';
4
9
  import EmptyFields from './empty-fields';
5
10
  import EndingPunctuation from './ending-punctuation';
6
11
  import EndingWhitespace from './ending-whitespace';
12
+ import Field008CharacterGroups from './field-008-18-34-character-groups';
7
13
  import Field505Separators from './field-505-separators';
8
14
  import Field521Fix from './field-521-fix';
9
15
  import FieldExclusion from './field-exclusion';
10
16
  import FieldStructure from './field-structure';
11
17
  import FieldsPresent from './fields-present';
12
- import FixedFields from './fixed-fields';
18
+ import Fix33X from './fix-33X';
19
+ import FixCountryCodes from './fix-country-codes';
20
+ import FixLanguageCodes from './fix-language-codes';
13
21
  import FixRelatorTerms from './fixRelatorTerms';
22
+ import FixedFields from './fixed-fields';
14
23
  import IdenticalFields from './identical-fields';
15
24
  import IndicatorFixes from './indicator-fixes';
16
25
  import IsbnIssn from './isbn-issn';
@@ -25,11 +34,11 @@ import NormalizeQualifyingInformation from './normalize-qualifying-information';
25
34
  import NormalizeUTF8Diacritics from './normalize-utf8-diacritics';
26
35
  import Punctuation from './punctuation/';
27
36
  import Punctuation2 from './punctuation2';
28
- import ResolveOrphanedSubfield6s from './resolveOrphanedSubfield6s'; // Do this before reindexing! (thus not in alphabetical order)
29
37
  import ReindexSubfield6OccurenceNumbers from './reindexSubfield6OccurenceNumbers';
30
38
  import RemoveDuplicateDataFields from './removeDuplicateDataFields';
31
39
  import RemoveInferiorDataFields from './removeInferiorDataFields';
32
40
  import ResolvableExtReferences from './resolvable-ext-references-melinda';
41
+ import ResolveOrphanedSubfield6s from './resolveOrphanedSubfield6s';
33
42
  import SanitizeVocabularySourceCodes from './sanitize-vocabulary-source-codes';
34
43
  import SortFields from './sortFields';
35
44
  import SortRelatorTerms from './sortRelatorTerms';
@@ -46,16 +55,25 @@ import Urn from './urn';
46
55
 
47
56
  export {
48
57
  AccessRights,
58
+ AddMissingField041,
59
+ AddMissingField336,
60
+ AddMissingField337,
61
+ AddMissingField338,
62
+ CyrilluxUsemarconReplacement,
49
63
  DoubleCommas,
50
64
  DuplicatesInd1,
51
65
  EmptyFields,
52
66
  EndingPunctuation,
53
67
  EndingWhitespace,
68
+ Field008CharacterGroups,
54
69
  Field505Separators,
55
70
  Field521Fix,
56
71
  FieldExclusion,
57
72
  FieldsPresent,
58
73
  FieldStructure,
74
+ Fix33X,
75
+ FixCountryCodes,
76
+ FixLanguageCodes,
59
77
  FixRelatorTerms,
60
78
  FixedFields,
61
79
  IdenticalFields,
@@ -72,7 +90,7 @@ export {
72
90
  NormalizeUTF8Diacritics,
73
91
  Punctuation,
74
92
  Punctuation2,
75
- ResolveOrphanedSubfield6s,
93
+ ResolveOrphanedSubfield6s, // Do this before reindexing! (thus I'm not sticking with alphabetical order here)
76
94
  ReindexSubfield6OccurenceNumbers,
77
95
  RemoveDuplicateDataFields,
78
96
  RemoveInferiorDataFields,
@@ -144,6 +144,24 @@ function normalizeNonFilingIndicator2(field, languages = []) {
144
144
  field.ind2 = determineNonFilingIndicatorValue(field, languages); // eslint-disable-line functional/immutable-data
145
145
  }
146
146
 
147
+ const fiktiivisenAineistonLisaluokatFI = ['Eläimet', 'Erotiikka', 'Erä', 'Fantasia', 'Historia', 'Huumori', 'Jännitys', 'Kauhu', 'Novellit', 'Romantiikka', 'Scifi', 'Sota', 'Urheilu', 'Uskonto'];
148
+
149
+ function containsFiktiivisenAineistonLisaluokka(field) {
150
+ // Should we check Swedish versions as well?
151
+ return field.subfields.some(sf => sf.code === 'a' && fiktiivisenAineistonLisaluokatFI.includes(sf.value));
152
+ }
153
+
154
+ function normalize084Indicator1(field) {
155
+ if (field.tag !== '084') {
156
+ return;
157
+ }
158
+
159
+ // https://marc21.kansalliskirjasto.fi/bib/05X-08X.htm#084 and https://finto.fi/ykl/fi/page/fiktioluokka
160
+ if (field.ind1 !== '9' && containsFiktiivisenAineistonLisaluokka(field) && field.subfields.some(sf => sf.code === '2' && sf.value === 'ykl')) {
161
+ field.ind1 = '9'; // eslint-disable-line functional/immutable-data
162
+ return;
163
+ }
164
+ }
147
165
 
148
166
  function normalize245Indicator1(field, record) {
149
167
  if (field.tag !== '245') {
@@ -222,6 +240,7 @@ export function recordNormalizeIndicators(record) {
222
240
  }
223
241
 
224
242
  function fieldNormalizeIndicators(field, record, languages) {
243
+ normalize084Indicator1(field);
225
244
  normalize245Indicator1(field, record);
226
245
  normalizeNonFilingIndicator1(field, languages);
227
246
  normalizeNonFilingIndicator2(field, languages);
@@ -88,6 +88,10 @@ function fieldHasUnfixableVocabularySourceCode(field) {
88
88
  }
89
89
 
90
90
  function subfieldHasUnfixableVocabularySourceCode(subfield) {
91
+ if (subfield.code !== '2') {
92
+ return false;
93
+ }
94
+
91
95
  // As we can't fix this here, apply this yso-rule only when validating!
92
96
  if (subfield.value.indexOf('yso/') === 0) {
93
97
  return !['yso/eng', 'yso/fin', 'yso/sme', 'yso/swe'].includes(subfield.value);
package/src/utils.js CHANGED
@@ -41,6 +41,22 @@ export function recordToString(record) {
41
41
  return `${ldr}\n${fields.join('\n')}`;
42
42
  }
43
43
 
44
+ export function recordRemoveValuelessSubfields(record) {
45
+ record.fields = record.fields.map(field => { // eslint-disable-line functional/immutable-data
46
+ if (!field.subfields) { // Keep control fields
47
+ return field;
48
+ }
49
+ // Remove empty subfields from datafields:
50
+ field.subfields = field.subfields.filter(sf => sf.value); // eslint-disable-line functional/immutable-data
51
+
52
+ if (field.subfields && field.subfields.length === 0) {
53
+ return false; // Return false instead of a field if field has no subfields left. These will soon be filtered out.
54
+ }
55
+
56
+ return field; //if field has subfields return it
57
+ }).filter(field => field); // Filter those falses out
58
+ }
59
+
44
60
  export function fieldToString(f) {
45
61
  if ('subfields' in f) {
46
62
  return `${f.tag} ${normalizeIndicatorValue(f.ind1)}${normalizeIndicatorValue(f.ind2)}${formatSubfields(f)}`;
@@ -30,6 +30,9 @@
30
30
  { "code": "a", "value": "määrittelemätön" },
31
31
  { "code": "b", "value": "zu"},
32
32
  { "code": "2", "value": "rdacarrier" }
33
+ ]},
34
+ { "tag": "FOO", "ind1": " ", "ind2": " ", "subfields": [
35
+ { "code": "a", "value": "whatever" }
33
36
  ]}
34
37
  ]
35
38
  }