@natlibfi/marc-record-validators-melinda 12.0.4 → 12.0.5

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.
@@ -56,7 +56,11 @@ const subfieldSortOrder = [
56
56
  // National convention
57
57
  //{'tag': '031', 'sortOrder': ['a', 'b', 'c', 'm', 'e', 'd']}, // utter guesswork
58
58
  { "tag": "040", "sortOrder": ["8", "a", "b", "e", "c", "d", "x"] },
59
- { "tag": "041", "sortOrder": ["8", "a", "d", "j", "p", "h", "e", "g", "m"] },
59
+ // rda mus: 041: k < h < e < n < g < m < j (I think h<e is bad)
60
+ // rda: g < h, j < p < h, i < j, k < h
61
+ // loc: b < j, $m follows $b or $g
62
+ // NV: $a
63
+ { "tag": "041", "sortOrder": ["8", "a", "d", "e", "b", "f", "i", "j", "p", "k", "h", "n", "g", "m"] },
60
64
  // guesswork
61
65
  { "tag": "048", "sortOrder": ["8", "b", "a"] },
62
66
  { "tag": "100", "sortOrder": sortOrderForX00 },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/sortSubfields.js"],
4
- "sourcesContent": ["// Author(s): Nicholas Volk\n\nimport clone from 'clone';\nimport createDebugLogger from 'debug';\nimport {fieldToString, nvdebug} from './utils.js';\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:sortSubfields');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\nconst defaultSortOrderStringFinns = '8673abcdefghijklmnopqrstuvwxyz420159'; // NB! We Finns like $2 before $0 in 6XX...\nconst defaultSortOrderStringOthers = '8673abcdefghijklmnopqrstuvwxyz402159';\n\nconst defaultSortOrderFinns = defaultSortOrderStringFinns.split('');\nconst defaultSortOrderOthers = defaultSortOrderStringOthers.split('');\n\n\nexport default function (defaultTagPattern) {\n\n return {\n description: 'Swap adjacent subfields',\n validate, fix\n };\n\n function getRelevantFields(record, tagPattern) {\n const datafields = record.fields.filter(f => f.subfields);\n if (!tagPattern) {\n return datafields;\n }\n\n const regexp = new RegExp(tagPattern, 'u');\n return datafields.filter(f => regexp.test(f.tag));\n }\n\n function fix(record, tagPattern = defaultTagPattern) {\n const res = {message: [], fix: [], valid: true};\n\n const relevantFields = getRelevantFields(record, tagPattern);\n\n relevantFields.forEach(field => {\n sortAdjacentSubfields(field);\n });\n\n return res;\n }\n\n function validate(record, tagPattern = defaultTagPattern) {\n const res = {message: []};\n\n const relevantFields = getRelevantFields(record, tagPattern);\n\n relevantFields.forEach(field => {\n const clonedField = clone(field);\n sortAdjacentSubfields(clonedField);\n const clonedFieldAsString = fieldToString(clonedField);\n const fieldAsString = fieldToString(field);\n if (fieldAsString !== clonedFieldAsString) {\n res.message.push(clonedFieldAsString);\n }\n });\n\n res.valid = !(res.message.length >= 1);\n return res;\n }\n}\n\n\n// X00, X10, X11 and X130 could also for their own sets...\n// (ouch! sometimes $c comes after $d...): LoC: 100 0# \u2021a Black Foot, \u2021c Chief, \u2021d d. 1877 \u2021c (Spirit)\nconst sortOrderForX00 = ['i', 'a', 'b', 'q', 'c', 'd', 'e', 't', 'u', 'l', 'f', 'x', 'y', 'z', '0', '1', '5', '9']; // skip $g. Can't remember why, though...\nconst sortOrderForX10 = ['i', 'a', 'b', 't', 'n', 'c', 'e', 'v', 'w', 'x', 'y', 'z', '0', '1', '5', '9']; // somewhat iffy\nconst sortOrderForX11 = ['a', 'n', 'd', 'c', 'e', 'g', 'j', '0', '1', '5', '9'];\nconst sortOrderFor7XX = ['8', '7', 'i', 'a', 's', 't', 'b', 'c', 'd', 'm', 'h', 'k', 'o', 'x', 'z', 'g', 'q', 'w'];\nconst sortOrderFor246 = ['i', 'a', 'b', 'n', 'p', 'f', '5', '9']; // Used by field 946 as well\n\n// List *only* exceptional order here. Otherwise default order is used.\nconst subfieldSortOrder = [\n {'tag': '017', 'sortOrder': ['i', 'a', 'b', 'd']},\n {'tag': '028', 'sortOrder': ['b', 'a', 'q']}, // National convention\n //{'tag': '031', 'sortOrder': ['a', 'b', 'c', 'm', 'e', 'd']}, // utter guesswork\n {'tag': '040', 'sortOrder': ['8', 'a', 'b', 'e', 'c', 'd', 'x']},\n {'tag': '041', 'sortOrder': ['8', 'a', 'd', 'j', 'p', 'h', 'e', 'g', 'm']}, // guesswork\n {'tag': '048', 'sortOrder': ['8', 'b', 'a']},\n {'tag': '100', 'sortOrder': sortOrderForX00},\n {'tag': '110', 'sortOrder': sortOrderForX10},\n {'tag': '111', 'sortOrder': sortOrderForX11},\n {'tag': '130', 'sortOrder': ['a', 'n', 'p', 'k', 'l']},\n {'tag': '240', 'sortOrder': ['a', 'm', 'n', 'p', 's', 'l', '2', '0', '1', '5', '9']},\n {'tag': '245', 'sortOrder': ['a', 'b', 'n', 'p', 'k', 'f', 'c']},\n {'tag': '246', 'sortOrder': sortOrderFor246},\n {'tag': '382', 'sortOrder': ['a']},\n {'tag': '385', 'sortOrder': ['8', 'm', 'n', 'a', '2', '0', '1']},\n {'tag': '386', 'sortOrder': ['8', 'm', 'n', 'a']},\n {'tag': '490', 'sortOrder': ['a', 'x', 'y', 'v', 'l']},\n {'tag': '505', 'sortOrder': ['a']},\n {'tag': '526', 'sortOrder': ['i', 'a', 'b', 'x', 'z']},\n {'tag': '534', 'sortOrder': ['3', 'p', 'a', 't', 'l', 'c', 'f', 'b', 'e', 'o', 'x', 'z']},\n {'tag': '540', 'sortOrder': ['a', 'b', 'c', 'd', 'f', '2', 'u']},\n {'tag': '600', 'sortOrder': sortOrderForX00},\n {'tag': '610', 'sortOrder': sortOrderForX10},\n {'tag': '611', 'sortOrder': sortOrderForX11},\n {'tag': '650', 'sortOrder': ['a', 'x', 'y', 'z']},\n {'tag': '700', 'sortOrder': sortOrderForX00},\n {'tag': '710', 'sortOrder': sortOrderForX10},\n {'tag': '711', 'sortOrder': sortOrderForX11},\n {'tag': '760', 'sortOrder': sortOrderFor7XX},\n {'tag': '762', 'sortOrder': sortOrderFor7XX},\n {'tag': '765', 'sortOrder': sortOrderFor7XX},\n {'tag': '767', 'sortOrder': sortOrderFor7XX},\n {'tag': '770', 'sortOrder': sortOrderFor7XX},\n {'tag': '772', 'sortOrder': sortOrderFor7XX},\n {'tag': '773', 'sortOrder': sortOrderFor7XX},\n {'tag': '774', 'sortOrder': sortOrderFor7XX},\n {'tag': '775', 'sortOrder': sortOrderFor7XX},\n {'tag': '776', 'sortOrder': sortOrderFor7XX},\n {'tag': '777', 'sortOrder': sortOrderFor7XX},\n {'tag': '780', 'sortOrder': sortOrderFor7XX},\n {'tag': '785', 'sortOrder': sortOrderFor7XX},\n {'tag': '786', 'sortOrder': sortOrderFor7XX},\n {'tag': '787', 'sortOrder': sortOrderFor7XX},\n {'tag': '788', 'sortOrder': sortOrderFor7XX},\n {'tag': '800', 'sortOrder': sortOrderForX00},\n {'tag': '810', 'sortOrder': sortOrderForX10},\n {'tag': '811', 'sortOrder': sortOrderForX11},\n {'tag': '830', 'sortOrder': ['a', 'n', 'x', 'v']}, // INCOMPLETE, SAME AS 490? APPARENTLY NOT...\n {'tag': '856', 'sortOrder': ['3', 'u', 'q', 'x', 'y', 'z', '5']}, // incomplete, LoC examples are inconclusive\n {'tag': '880', 'sortOrder': ['a']},\n {'tag': '946', 'sortOrder': sortOrderFor246},\n {'tag': 'LOW', 'sortOrder': ['a', 'b', 'c', 'l', 'h']},\n {'tag': 'SID', 'sortOrder': ['c', 'b']} // Hack, so that default order is not used\n];\n\nfunction getSubfieldSortOrder(field) {\n const entry = subfieldSortOrder.filter(currEntry => field.tag === currEntry.tag);\n if (entry.length > 0 && 'sortOrder' in entry[0]) {\n debugDev(`sort order for ${field.tag}: ${entry[0].sortOrder}`);\n return entry[0].sortOrder;\n }\n if (!['300'].includes(field.tag)) { // Lis tags which use normal $a...$z order here!\n nvdebug(`WARNING!\\tNo subfield order found for ${field.tag}.`);\n }\n return [];\n}\n\n\nfunction swapSubfields(field, sortOrder) {\n if (!field.subfields) {\n return;\n }\n\n const loopAgain = field.subfields.some((sf, index) => {\n if (index === 0) {\n return false;\n }\n const currPos = getPosition(sf, sortOrder);\n const prevPos = getPosition(field.subfields[index - 1], sortOrder);\n if (currPos === -1 || prevPos === -1 || currPos >= prevPos) {\n return false;\n }\n // Swap:\n const tmp = field.subfields[index - 1];\n field.subfields[index - 1] = sf;\n field.subfields[index] = tmp;\n return true;\n });\n\n if (loopAgain) {\n return swapSubfields(field, sortOrder);\n }\n\n return;\n\n function getPosition(subfield, sortOrder) {\n // Magic exception that *always* comes first, used by Aleph in linking overlong fields\n if (sortOrder.indexOf('9') > -1 && subfield.code === '9' && ['^', '^^'].includes(subfield.value)) {\n return -0.5; // normal \"best value\" is 0, and \"worst value\" is N\n }\n return sortOrder.indexOf(subfield.code);\n }\n}\n\n\nfunction twoBeforeZero(field) {\n const sf2 = field.subfields.filter(sf => sf.code === '2');\n if (sf2.length !== 1) {\n return true; // both true and false are ok here\n }\n // MRA-465: gcipplatform (field 753)\n // rdasco (344), creatorbio (353), gbd (668), lsch (eg. 385)\n if (['creatorbio', 'gbd', 'gcipplatform', 'lscsh', 'rdasco'].includes(sf2[0].value)) {\n return false;\n }\n return true;\n}\n\nfunction moveSubfield6ToTheFront(field) {\n // https://www.loc.gov/marc/bibliographic/ecbdcntf.html says \"Subfield $6 is always the first subfield in the field.\"\n const sf6s = field.subfields.filter(sf => sf.code === '6');\n const others = field.subfields.filter(sf => sf.code !== '6');\n field.subfields = [...sf6s, ...others];\n}\n\nexport function sortAdjacentSubfields(field, externalSortOrder = []) {\n if (!field.subfields) {\n return field;\n }\n\n moveSubfield6ToTheFront(field); // specs: \"Subfield $6 is always the first subfield in the field.\"\n\n // Features:\n // - Swap only sort adjacent pairs.\n // - No sorting over unlisted subfield codes. Thus a given subfield can not shift to wrong side of 700$t...\n\n // Implement: 880 field should use values from $6...\n\n // Should we support multiple sort orders per field?\n\n // Try to handle control subfield order. This is not 100% fool proof. Control subfields are pretty stable, though.\n // However, there are exceptions (eg. $9 ^^ comes first and $2 $0 is a Finnish convention...)\n\n\n const finnishWay = twoBeforeZero(field);\n\n // Note: 760-789: '7' comes way earlier (after '6' and '8')\n const controlSubfieldOrder = finnishWay ? ['8', '3', 'a', '4', '2', '0', '1', '7', '5', '9'] : ['8', '7', '3', 'a', '4', '0', '1', '2', '7', '5', '9'];\n swapSubfields(field, controlSubfieldOrder);\n\n const sortOrderForField = externalSortOrder.length > 0 ? externalSortOrder : getSubfieldSortOrder(field);\n //nvdebug(`INTERMEDIATE SUBFIELD ORDER FOR ${field.tag}: ${sortOrderForField.join(', ')}`);\n\n const defaultSortOrder = finnishWay ? defaultSortOrderFinns : defaultSortOrderOthers; // $2 vs $0\n const subfieldOrder = sortOrderForField.length > 0 ? sortOrderForField : defaultSortOrder;\n //nvdebug(`FINAL SUBFIELD ORDER (FINNISH=${finnishWay}) FOR ${field.tag}: ${subfieldOrder.join(', ')}`);\n //if (sortOrder === null) { return field; } //// Currently always sort..\n //nvdebug(`IN: ${fieldToString(field)}`);\n swapSubfields(field, subfieldOrder);\n //nvdebug(`OUT: ${fieldToString(field)}`);\n\n return field;\n}\n\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["// Author(s): Nicholas Volk\n\nimport clone from 'clone';\nimport createDebugLogger from 'debug';\nimport {fieldToString, nvdebug} from './utils.js';\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:sortSubfields');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\nconst defaultSortOrderStringFinns = '8673abcdefghijklmnopqrstuvwxyz420159'; // NB! We Finns like $2 before $0 in 6XX...\nconst defaultSortOrderStringOthers = '8673abcdefghijklmnopqrstuvwxyz402159';\n\nconst defaultSortOrderFinns = defaultSortOrderStringFinns.split('');\nconst defaultSortOrderOthers = defaultSortOrderStringOthers.split('');\n\n\nexport default function (defaultTagPattern) {\n\n return {\n description: 'Swap adjacent subfields',\n validate, fix\n };\n\n function getRelevantFields(record, tagPattern) {\n const datafields = record.fields.filter(f => f.subfields);\n if (!tagPattern) {\n return datafields;\n }\n\n const regexp = new RegExp(tagPattern, 'u');\n return datafields.filter(f => regexp.test(f.tag));\n }\n\n function fix(record, tagPattern = defaultTagPattern) {\n const res = {message: [], fix: [], valid: true};\n\n const relevantFields = getRelevantFields(record, tagPattern);\n\n relevantFields.forEach(field => {\n sortAdjacentSubfields(field);\n });\n\n return res;\n }\n\n function validate(record, tagPattern = defaultTagPattern) {\n const res = {message: []};\n\n const relevantFields = getRelevantFields(record, tagPattern);\n\n relevantFields.forEach(field => {\n const clonedField = clone(field);\n sortAdjacentSubfields(clonedField);\n const clonedFieldAsString = fieldToString(clonedField);\n const fieldAsString = fieldToString(field);\n if (fieldAsString !== clonedFieldAsString) {\n res.message.push(clonedFieldAsString);\n }\n });\n\n res.valid = !(res.message.length >= 1);\n return res;\n }\n}\n\n\n// X00, X10, X11 and X130 could also for their own sets...\n// (ouch! sometimes $c comes after $d...): LoC: 100 0# \u2021a Black Foot, \u2021c Chief, \u2021d d. 1877 \u2021c (Spirit)\nconst sortOrderForX00 = ['i', 'a', 'b', 'q', 'c', 'd', 'e', 't', 'u', 'l', 'f', 'x', 'y', 'z', '0', '1', '5', '9']; // skip $g. Can't remember why, though...\nconst sortOrderForX10 = ['i', 'a', 'b', 't', 'n', 'c', 'e', 'v', 'w', 'x', 'y', 'z', '0', '1', '5', '9']; // somewhat iffy\nconst sortOrderForX11 = ['a', 'n', 'd', 'c', 'e', 'g', 'j', '0', '1', '5', '9'];\nconst sortOrderFor7XX = ['8', '7', 'i', 'a', 's', 't', 'b', 'c', 'd', 'm', 'h', 'k', 'o', 'x', 'z', 'g', 'q', 'w'];\nconst sortOrderFor246 = ['i', 'a', 'b', 'n', 'p', 'f', '5', '9']; // Used by field 946 as well\n\n// List *only* exceptional order here. Otherwise default order is used.\nconst subfieldSortOrder = [\n {'tag': '017', 'sortOrder': ['i', 'a', 'b', 'd']},\n {'tag': '028', 'sortOrder': ['b', 'a', 'q']}, // National convention\n //{'tag': '031', 'sortOrder': ['a', 'b', 'c', 'm', 'e', 'd']}, // utter guesswork\n {'tag': '040', 'sortOrder': ['8', 'a', 'b', 'e', 'c', 'd', 'x']},\n // rda mus: 041: k < h < e < n < g < m < j (I think h<e is bad)\n // rda: g < h, j < p < h, i < j, k < h\n // loc: b < j, $m follows $b or $g\n // NV: $a \n {'tag': '041', 'sortOrder': ['8', 'a', 'd', 'e', 'b', 'f', 'i', 'j', 'p', 'k', 'h', 'n', 'g', 'm']}, // guesswork\n {'tag': '048', 'sortOrder': ['8', 'b', 'a']},\n {'tag': '100', 'sortOrder': sortOrderForX00},\n {'tag': '110', 'sortOrder': sortOrderForX10},\n {'tag': '111', 'sortOrder': sortOrderForX11},\n {'tag': '130', 'sortOrder': ['a', 'n', 'p', 'k', 'l']},\n {'tag': '240', 'sortOrder': ['a', 'm', 'n', 'p', 's', 'l', '2', '0', '1', '5', '9']},\n {'tag': '245', 'sortOrder': ['a', 'b', 'n', 'p', 'k', 'f', 'c']},\n {'tag': '246', 'sortOrder': sortOrderFor246},\n {'tag': '382', 'sortOrder': ['a']},\n {'tag': '385', 'sortOrder': ['8', 'm', 'n', 'a', '2', '0', '1']},\n {'tag': '386', 'sortOrder': ['8', 'm', 'n', 'a']},\n {'tag': '490', 'sortOrder': ['a', 'x', 'y', 'v', 'l']},\n {'tag': '505', 'sortOrder': ['a']},\n {'tag': '526', 'sortOrder': ['i', 'a', 'b', 'x', 'z']},\n {'tag': '534', 'sortOrder': ['3', 'p', 'a', 't', 'l', 'c', 'f', 'b', 'e', 'o', 'x', 'z']},\n {'tag': '540', 'sortOrder': ['a', 'b', 'c', 'd', 'f', '2', 'u']},\n {'tag': '600', 'sortOrder': sortOrderForX00},\n {'tag': '610', 'sortOrder': sortOrderForX10},\n {'tag': '611', 'sortOrder': sortOrderForX11},\n {'tag': '650', 'sortOrder': ['a', 'x', 'y', 'z']},\n {'tag': '700', 'sortOrder': sortOrderForX00},\n {'tag': '710', 'sortOrder': sortOrderForX10},\n {'tag': '711', 'sortOrder': sortOrderForX11},\n {'tag': '760', 'sortOrder': sortOrderFor7XX},\n {'tag': '762', 'sortOrder': sortOrderFor7XX},\n {'tag': '765', 'sortOrder': sortOrderFor7XX},\n {'tag': '767', 'sortOrder': sortOrderFor7XX},\n {'tag': '770', 'sortOrder': sortOrderFor7XX},\n {'tag': '772', 'sortOrder': sortOrderFor7XX},\n {'tag': '773', 'sortOrder': sortOrderFor7XX},\n {'tag': '774', 'sortOrder': sortOrderFor7XX},\n {'tag': '775', 'sortOrder': sortOrderFor7XX},\n {'tag': '776', 'sortOrder': sortOrderFor7XX},\n {'tag': '777', 'sortOrder': sortOrderFor7XX},\n {'tag': '780', 'sortOrder': sortOrderFor7XX},\n {'tag': '785', 'sortOrder': sortOrderFor7XX},\n {'tag': '786', 'sortOrder': sortOrderFor7XX},\n {'tag': '787', 'sortOrder': sortOrderFor7XX},\n {'tag': '788', 'sortOrder': sortOrderFor7XX},\n {'tag': '800', 'sortOrder': sortOrderForX00},\n {'tag': '810', 'sortOrder': sortOrderForX10},\n {'tag': '811', 'sortOrder': sortOrderForX11},\n {'tag': '830', 'sortOrder': ['a', 'n', 'x', 'v']}, // INCOMPLETE, SAME AS 490? APPARENTLY NOT...\n {'tag': '856', 'sortOrder': ['3', 'u', 'q', 'x', 'y', 'z', '5']}, // incomplete, LoC examples are inconclusive\n {'tag': '880', 'sortOrder': ['a']},\n {'tag': '946', 'sortOrder': sortOrderFor246},\n {'tag': 'LOW', 'sortOrder': ['a', 'b', 'c', 'l', 'h']},\n {'tag': 'SID', 'sortOrder': ['c', 'b']} // Hack, so that default order is not used\n];\n\nfunction getSubfieldSortOrder(field) {\n const entry = subfieldSortOrder.filter(currEntry => field.tag === currEntry.tag);\n if (entry.length > 0 && 'sortOrder' in entry[0]) {\n debugDev(`sort order for ${field.tag}: ${entry[0].sortOrder}`);\n return entry[0].sortOrder;\n }\n if (!['300'].includes(field.tag)) { // Lis tags which use normal $a...$z order here!\n nvdebug(`WARNING!\\tNo subfield order found for ${field.tag}.`);\n }\n return [];\n}\n\n\nfunction swapSubfields(field, sortOrder) {\n if (!field.subfields) {\n return;\n }\n\n const loopAgain = field.subfields.some((sf, index) => {\n if (index === 0) {\n return false;\n }\n const currPos = getPosition(sf, sortOrder);\n const prevPos = getPosition(field.subfields[index - 1], sortOrder);\n if (currPos === -1 || prevPos === -1 || currPos >= prevPos) {\n return false;\n }\n // Swap:\n const tmp = field.subfields[index - 1];\n field.subfields[index - 1] = sf;\n field.subfields[index] = tmp;\n return true;\n });\n\n if (loopAgain) {\n return swapSubfields(field, sortOrder);\n }\n\n return;\n\n function getPosition(subfield, sortOrder) {\n // Magic exception that *always* comes first, used by Aleph in linking overlong fields\n if (sortOrder.indexOf('9') > -1 && subfield.code === '9' && ['^', '^^'].includes(subfield.value)) {\n return -0.5; // normal \"best value\" is 0, and \"worst value\" is N\n }\n return sortOrder.indexOf(subfield.code);\n }\n}\n\n\nfunction twoBeforeZero(field) {\n const sf2 = field.subfields.filter(sf => sf.code === '2');\n if (sf2.length !== 1) {\n return true; // both true and false are ok here\n }\n // MRA-465: gcipplatform (field 753)\n // rdasco (344), creatorbio (353), gbd (668), lsch (eg. 385)\n if (['creatorbio', 'gbd', 'gcipplatform', 'lscsh', 'rdasco'].includes(sf2[0].value)) {\n return false;\n }\n return true;\n}\n\nfunction moveSubfield6ToTheFront(field) {\n // https://www.loc.gov/marc/bibliographic/ecbdcntf.html says \"Subfield $6 is always the first subfield in the field.\"\n const sf6s = field.subfields.filter(sf => sf.code === '6');\n const others = field.subfields.filter(sf => sf.code !== '6');\n field.subfields = [...sf6s, ...others];\n}\n\nexport function sortAdjacentSubfields(field, externalSortOrder = []) {\n if (!field.subfields) {\n return field;\n }\n\n moveSubfield6ToTheFront(field); // specs: \"Subfield $6 is always the first subfield in the field.\"\n\n // Features:\n // - Swap only sort adjacent pairs.\n // - No sorting over unlisted subfield codes. Thus a given subfield can not shift to wrong side of 700$t...\n\n // Implement: 880 field should use values from $6...\n\n // Should we support multiple sort orders per field?\n\n // Try to handle control subfield order. This is not 100% fool proof. Control subfields are pretty stable, though.\n // However, there are exceptions (eg. $9 ^^ comes first and $2 $0 is a Finnish convention...)\n\n\n const finnishWay = twoBeforeZero(field);\n\n // Note: 760-789: '7' comes way earlier (after '6' and '8')\n const controlSubfieldOrder = finnishWay ? ['8', '3', 'a', '4', '2', '0', '1', '7', '5', '9'] : ['8', '7', '3', 'a', '4', '0', '1', '2', '7', '5', '9'];\n swapSubfields(field, controlSubfieldOrder);\n\n const sortOrderForField = externalSortOrder.length > 0 ? externalSortOrder : getSubfieldSortOrder(field);\n //nvdebug(`INTERMEDIATE SUBFIELD ORDER FOR ${field.tag}: ${sortOrderForField.join(', ')}`);\n\n const defaultSortOrder = finnishWay ? defaultSortOrderFinns : defaultSortOrderOthers; // $2 vs $0\n const subfieldOrder = sortOrderForField.length > 0 ? sortOrderForField : defaultSortOrder;\n //nvdebug(`FINAL SUBFIELD ORDER (FINNISH=${finnishWay}) FOR ${field.tag}: ${subfieldOrder.join(', ')}`);\n //if (sortOrder === null) { return field; } //// Currently always sort..\n //nvdebug(`IN: ${fieldToString(field)}`);\n swapSubfields(field, subfieldOrder);\n //nvdebug(`OUT: ${fieldToString(field)}`);\n\n return field;\n}\n\n"],
5
+ "mappings": "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",
6
6
  "names": ["sortOrder"]
7
7
  }
package/package.json CHANGED
@@ -14,7 +14,7 @@
14
14
  "url": "https://github.com/NatLibFi/marc-record-validators-melinda"
15
15
  },
16
16
  "license": "MIT",
17
- "version": "12.0.4",
17
+ "version": "12.0.5",
18
18
  "main": "./dist/index.js",
19
19
  "publishConfig": {
20
20
  "access": "public"
@@ -31,12 +31,12 @@
31
31
  "test:base": "node --test --test-force-exit --experimental-test-coverage --test-reporter=spec './src/**/*.test.js'",
32
32
  "test:only": "npm run lint && npm run test:base:only",
33
33
  "test:base:only": "node --test --test-only --test-force-exit --experimental-test-coverage --test-reporter=spec './src/**/*.test.js'",
34
- "dev:test": "cross-env DEBUG=@natlibfi/* NODE_ENV=test node --watch --test --experimental-test-coverage --test-reporter=spec './src/*.test.js' './src/**/*.test.js'",
34
+ "dev:test": "cross-env DEBUG=@natlibfi/* NODE_ENV=test node --watch --test --experimental-test-coverage --test-reporter=spec './src/**/*.test.js'",
35
35
  "dev:debug": "cross-env LOG_LEVEL=debug DEBUG=@natlibfi/* NODE_ENV=test"
36
36
  },
37
37
  "dependencies": {
38
- "@natlibfi/iso9-1995": "^1.0.0",
39
- "@natlibfi/issn-verify": "^2.0.0",
38
+ "@natlibfi/iso9-1995": "^1.1.0",
39
+ "@natlibfi/issn-verify": "^2.0.1",
40
40
  "@natlibfi/marc-record": "^10.0.1",
41
41
  "@natlibfi/marc-record-serializers": "^11.0.1",
42
42
  "@natlibfi/marc-record-validate": "^9.0.0",
@@ -46,9 +46,8 @@
46
46
  "cld3-asm": "^4.0.0",
47
47
  "clone": "^2.1.2",
48
48
  "debug": "^4.4.3",
49
- "isbn3": "^2.0.2",
49
+ "isbn3": "^2.0.3",
50
50
  "langs": "^2.0.0",
51
- "undici": "^7.18.0",
52
51
  "xml2js": "^0.6.2",
53
52
  "xregexp": "^5.1.2"
54
53
  },
@@ -79,7 +79,11 @@ const subfieldSortOrder = [
79
79
  {'tag': '028', 'sortOrder': ['b', 'a', 'q']}, // National convention
80
80
  //{'tag': '031', 'sortOrder': ['a', 'b', 'c', 'm', 'e', 'd']}, // utter guesswork
81
81
  {'tag': '040', 'sortOrder': ['8', 'a', 'b', 'e', 'c', 'd', 'x']},
82
- {'tag': '041', 'sortOrder': ['8', 'a', 'd', 'j', 'p', 'h', 'e', 'g', 'm']}, // guesswork
82
+ // rda mus: 041: k < h < e < n < g < m < j (I think h<e is bad)
83
+ // rda: g < h, j < p < h, i < j, k < h
84
+ // loc: b < j, $m follows $b or $g
85
+ // NV: $a
86
+ {'tag': '041', 'sortOrder': ['8', 'a', 'd', 'e', 'b', 'f', 'i', 'j', 'p', 'k', 'h', 'n', 'g', 'm']}, // guesswork
83
87
  {'tag': '048', 'sortOrder': ['8', 'b', 'a']},
84
88
  {'tag': '100', 'sortOrder': sortOrderForX00},
85
89
  {'tag': '110', 'sortOrder': sortOrderForX10},