@natlibfi/marc-record-validators-melinda 13.0.4 → 13.0.5-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/dist/cyrillux-usemarcon-replacement.test.js +2 -2
  2. package/dist/cyrillux-usemarcon-replacement.test.js.map +2 -2
  3. package/dist/merge-fields/mergeConstraints.js +1 -1
  4. package/dist/merge-fields/mergeConstraints.js.map +2 -2
  5. package/dist/merge-fields/mergeField.js +2 -2
  6. package/dist/merge-fields/mergeField.js.map +2 -2
  7. package/dist/merge-fields/mergeOrAddSubfield.js +19 -5
  8. package/dist/merge-fields/mergeOrAddSubfield.js.map +2 -2
  9. package/dist/punctuation2.js +16 -8
  10. package/dist/punctuation2.js.map +2 -2
  11. package/dist/punctuation2.test.js +2 -2
  12. package/dist/punctuation2.test.js.map +2 -2
  13. package/dist/sortSubfields.js +2 -2
  14. package/dist/sortSubfields.js.map +2 -2
  15. package/package.json +8 -8
  16. package/src/cyrillux-usemarcon-replacement.test.js +2 -2
  17. package/src/merge-fields/mergeConstraints.js +1 -1
  18. package/src/merge-fields/mergeField.js +2 -2
  19. package/src/merge-fields/mergeOrAddSubfield.js +28 -5
  20. package/src/punctuation2.js +20 -12
  21. package/src/punctuation2.test.js +2 -2
  22. package/src/sortSubfields.js +1 -1
  23. package/test-fixtures/cyrillux-usemarcon-replacement/f10/metadata.json +1 -1
  24. package/test-fixtures/merge-fields/f04/expectedResult.json +1 -2
  25. package/test-fixtures/merge-fields/f04/record.json +1 -2
  26. package/test-fixtures/merge-fields/f700_01/expectedResult.json +18 -0
  27. package/test-fixtures/merge-fields/f700_01/metadata.json +5 -0
  28. package/test-fixtures/merge-fields/f700_01/record.json +24 -0
  29. package/test-fixtures/merge-fields/f830_01/expectedResult.json +20 -0
  30. package/test-fixtures/merge-fields/f830_01/metadata.json +6 -0
  31. package/test-fixtures/merge-fields/f830_01/record.json +20 -0
@@ -1,4 +1,4 @@
1
- import assert from "node:assert";
1
+ import assert from "node:assert/strict";
2
2
  import { MarcRecord } from "@natlibfi/marc-record";
3
3
  import validatorFactory from "./cyrillux-usemarcon-replacement.js";
4
4
  import { READERS } from "@natlibfi/fixura";
@@ -38,6 +38,6 @@ async function callback({ getFixture, fix = false }) {
38
38
  return;
39
39
  }
40
40
  await validator.fix(record);
41
- assert.deepEqual(record, expectedResult);
41
+ assert.deepEqual(record, new MarcRecord(expectedResult));
42
42
  }
43
43
  //# sourceMappingURL=cyrillux-usemarcon-replacement.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/cyrillux-usemarcon-replacement.test.js"],
4
- "sourcesContent": ["import assert from 'node:assert';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './cyrillux-usemarcon-replacement.js';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\n\ngenerateTests({\n callback,\n path: [import.meta.dirname, '..', 'test-fixtures', 'cyrillux-usemarcon-replacement'],\n useMetadataFile: true,\n recurse: false,\n fixura: {\n reader: READERS.JSON\n },\n hooks: {\n before: async () => {\n MarcRecord.setValidationOptions({subfields: false, subfieldValues: false});\n testValidatorFactory();\n },\n after: async () => {\n MarcRecord.setValidationOptions({});\n }\n }\n});\n\n\nasync function testValidatorFactory() {\n const validator = await validatorFactory();\n\n assert.equal(typeof validator, 'object');\n assert.equal(typeof validator.description, 'string');\n assert.equal(typeof validator.validate, 'function');\n assert.equal(typeof validator.fix, 'function');\n}\n\nasync function callback({getFixture, fix = false}) {\n const validator = await validatorFactory();\n const record = new MarcRecord(getFixture('record.json'));\n const expectedResult = getFixture('expectedResult.json');\n // console.log(expectedResult); // eslint-disable-line\n\n if (!fix) {\n const result = await validator.validate(record);\n assert.deepEqual(result, expectedResult);\n return;\n }\n\n await validator.fix(record);\n assert.deepEqual(record, expectedResult);\n}\n"],
5
- "mappings": "AAAA,OAAO,YAAY;AACnB,SAAQ,kBAAiB;AACzB,OAAO,sBAAsB;AAC7B,SAAQ,eAAc;AACtB,OAAO,mBAAmB;AAE1B,cAAc;AAAA,EACZ;AAAA,EACA,MAAM,CAAC,YAAY,SAAS,MAAM,iBAAiB,gCAAgC;AAAA,EACnF,iBAAiB;AAAA,EACjB,SAAS;AAAA,EACT,QAAQ;AAAA,IACN,QAAQ,QAAQ;AAAA,EAClB;AAAA,EACA,OAAO;AAAA,IACL,QAAQ,YAAY;AAClB,iBAAW,qBAAqB,EAAC,WAAW,OAAO,gBAAgB,MAAK,CAAC;AACzE,2BAAqB;AAAA,IACvB;AAAA,IACA,OAAO,YAAY;AACjB,iBAAW,qBAAqB,CAAC,CAAC;AAAA,IACpC;AAAA,EACF;AACF,CAAC;AAGD,eAAe,uBAAuB;AACpC,QAAM,YAAY,MAAM,iBAAiB;AAEzC,SAAO,MAAM,OAAO,WAAW,QAAQ;AACvC,SAAO,MAAM,OAAO,UAAU,aAAa,QAAQ;AACnD,SAAO,MAAM,OAAO,UAAU,UAAU,UAAU;AAClD,SAAO,MAAM,OAAO,UAAU,KAAK,UAAU;AAC/C;AAEA,eAAe,SAAS,EAAC,YAAY,MAAM,MAAK,GAAG;AACjD,QAAM,YAAY,MAAM,iBAAiB;AACzC,QAAM,SAAS,IAAI,WAAW,WAAW,aAAa,CAAC;AACvD,QAAM,iBAAiB,WAAW,qBAAqB;AAGvD,MAAI,CAAC,KAAK;AACR,UAAM,SAAS,MAAM,UAAU,SAAS,MAAM;AAC9C,WAAO,UAAU,QAAQ,cAAc;AACvC;AAAA,EACF;AAEA,QAAM,UAAU,IAAI,MAAM;AAC1B,SAAO,UAAU,QAAQ,cAAc;AACzC;",
4
+ "sourcesContent": ["import assert from 'node:assert/strict';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './cyrillux-usemarcon-replacement.js';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\n\ngenerateTests({\n callback,\n path: [import.meta.dirname, '..', 'test-fixtures', 'cyrillux-usemarcon-replacement'],\n useMetadataFile: true,\n recurse: false,\n fixura: {\n reader: READERS.JSON\n },\n hooks: {\n before: async () => {\n MarcRecord.setValidationOptions({subfields: false, subfieldValues: false});\n testValidatorFactory();\n },\n after: async () => {\n MarcRecord.setValidationOptions({});\n }\n }\n});\n\n\nasync function testValidatorFactory() {\n const validator = await validatorFactory();\n\n assert.equal(typeof validator, 'object');\n assert.equal(typeof validator.description, 'string');\n assert.equal(typeof validator.validate, 'function');\n assert.equal(typeof validator.fix, 'function');\n}\n\nasync function callback({getFixture, fix = false}) {\n const validator = await validatorFactory();\n const record = new MarcRecord(getFixture('record.json'));\n const expectedResult = getFixture('expectedResult.json');\n // console.log(expectedResult); // eslint-disable-line\n\n if (!fix) {\n const result = await validator.validate(record);\n assert.deepEqual(result, expectedResult);\n return;\n }\n\n await validator.fix(record);\n assert.deepEqual(record, new MarcRecord(expectedResult));\n}\n"],
5
+ "mappings": "AAAA,OAAO,YAAY;AACnB,SAAQ,kBAAiB;AACzB,OAAO,sBAAsB;AAC7B,SAAQ,eAAc;AACtB,OAAO,mBAAmB;AAE1B,cAAc;AAAA,EACZ;AAAA,EACA,MAAM,CAAC,YAAY,SAAS,MAAM,iBAAiB,gCAAgC;AAAA,EACnF,iBAAiB;AAAA,EACjB,SAAS;AAAA,EACT,QAAQ;AAAA,IACN,QAAQ,QAAQ;AAAA,EAClB;AAAA,EACA,OAAO;AAAA,IACL,QAAQ,YAAY;AAClB,iBAAW,qBAAqB,EAAC,WAAW,OAAO,gBAAgB,MAAK,CAAC;AACzE,2BAAqB;AAAA,IACvB;AAAA,IACA,OAAO,YAAY;AACjB,iBAAW,qBAAqB,CAAC,CAAC;AAAA,IACpC;AAAA,EACF;AACF,CAAC;AAGD,eAAe,uBAAuB;AACpC,QAAM,YAAY,MAAM,iBAAiB;AAEzC,SAAO,MAAM,OAAO,WAAW,QAAQ;AACvC,SAAO,MAAM,OAAO,UAAU,aAAa,QAAQ;AACnD,SAAO,MAAM,OAAO,UAAU,UAAU,UAAU;AAClD,SAAO,MAAM,OAAO,UAAU,KAAK,UAAU;AAC/C;AAEA,eAAe,SAAS,EAAC,YAAY,MAAM,MAAK,GAAG;AACjD,QAAM,YAAY,MAAM,iBAAiB;AACzC,QAAM,SAAS,IAAI,WAAW,WAAW,aAAa,CAAC;AACvD,QAAM,iBAAiB,WAAW,qBAAqB;AAGvD,MAAI,CAAC,KAAK;AACR,UAAM,SAAS,MAAM,UAAU,SAAS,MAAM;AAC9C,WAAO,UAAU,QAAQ,cAAc;AACvC;AAAA,EACF;AAEA,QAAM,UAAU,IAAI,MAAM;AAC1B,SAAO,UAAU,QAAQ,IAAI,WAAW,cAAc,CAAC;AACzD;",
6
6
  "names": []
7
7
  }
@@ -268,7 +268,7 @@ const mergeConstraints = [
268
268
  { "tag": "800", "required": "a", "paired": "bt", "key": keyX00 },
269
269
  { "tag": "810", "required": "a", "paired": "bt", "key": keyX10 },
270
270
  { "tag": "811", "required": "a", "paired": "t", "key": keyX11 },
271
- { "tag": "830", "required": "a", "key": keyX30 },
271
+ { "tag": "830", "required": "a", "paired": "np", "key": keyX30 },
272
272
  { "tag": "840", "required": "a" },
273
273
  { "tag": "841", "required": "a" },
274
274
  { "tag": "842", "required": "a" },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/merge-fields/mergeConstraints.js"],
4
- "sourcesContent": ["import createDebugLogger from 'debug';\nconst debug = createDebugLogger('@natlibfi/melinda-marc-record-merge-reducers:mergeConstraints');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\n// \"required\": both fields bust have the subfield and the value must be same.\n// \"paired\": subfield bust either exists (with value match) or not exist in both fields (negative XOR). Sort of an optional version of 'required'\n// \"key\": one or both fields lack the subfield OR both fields have it and theor values match.\n// There are typically NR subfields but the system should support multival repeatable subfields. However, (R) support is considered experimental.\n// NB: key+paired with identical values is an attempt to prevent copy for (ET) fields, and to force separate fields on (T) fields.\n// NB! If base has eg. no 264, two+ 264 fields can be copied from the source.\n\n// NB! not all X00 fields have, say, $x subfield. However, we can still share them...\n// $h is non-1XX?, $i is 7XX only, $w is 8XX only...\nconst keyX00 = 'abcjklnoqrstuwx'; // Shared: $abcdefg...\nconst keyX10 = 'abcdfghklnoprstuwx';\nconst keyX11 = 'acdefghklnpqstuwx';\nconst keyX30 = 'adfghklmnoprstvwxyz';\nconst pairedTitleSubfields = 'iklmnoprst'\n\nconst mergeConstraints = [\n {'tag': '010', 'required': 'a', 'key': 'a'},\n {'tag': '013', 'required': 'a', 'key': 'a'}, // We have 2 instances in Melinda...\n {'tag': '015', 'required': 'a', 'key': 'a'},\n {'tag': '016', 'required': 'a', 'key': 'a2'},\n {'tag': '017', 'required': 'a', 'key': 'a'},\n {'tag': '018', 'required': 'a', 'key': 'a'},\n {'tag': '020', 'required': '', 'paired': 'a', 'key': 'az'}, // NB! $a foo $z lorum and $a foo $z ipsum would not merge! Due to common denominator and f020$z onlies this is the best we can done. This could be handled if 020 would have multiple merge constrains: one for f020$a, and one for f020$z...\n {'tag': '022', 'required': '', 'paired': 'a', 'key': 'alz'},\n {'tag': '024', 'required': '', 'paired': 'a', 'key': 'ad'},\n {'tag': '025', 'required': 'a', 'key': 'a'},\n {'tag': '026', 'required': 'a', 'key': 'a'},\n {'tag': '027', 'required': 'a', 'key': 'a'}, // on tuolla pari $z:\u00E4\u00E4\n {'tag': '028', 'required': 'a', 'key': 'ab'},\n {'tag': '030', 'required': 'a', 'key': 'a'},\n {'tag': '031', 'required': '', 'key': 'abcegmnopr2'}, // mites t\u00E4mm\u00F6isen k\u00E4yt\u00E4nn\u00F6ss\u00E4 avaimettoman klaarais? TODO: tests\n {'tag': '032', 'required': 'a', 'key': 'ab'},\n {'tag': '033', 'required': 'a', 'key': 'abcp0123'}, // 0,1% are without $a. Ignore them for now.\n {'tag': '034', 'required': 'ab', 'key': 'abcdefghjkmnprstxyz0123'},\n {'tag': '035', 'required': '', 'key': 'az'},\n {'tag': '036', 'required': 'a', 'key': 'a'},\n {'tag': '037', 'required': 'b', 'key': 'ab'},\n {'tag': '039', 'required': 'a'},\n {'tag': '040', 'required': '', 'key': ''},\n {'tag': '041', 'required': '', 'paired': '2', 'key': 'ad'}, // Don't put $2 in 'key'! hasCommonNominator() would get into trouble with it...\n {'tag': '042', 'required': '', 'key': ''}, // Contents (supposedly $a subfields) can be anything, and still merge... (042 $a foo + 042 $b bar is perfectly mergeable)\n {'tag': '043', 'required': 'a', 'key': 'abc'},\n {'tag': '044', 'required': '', 'key': 'abc', 'paired': 'abc'},\n {'tag': '045', 'required': '', 'key': 'abc', 'paired': 'abc'}, // (ET) // 045 is problematic either-$a or $b or $c...\n {'tag': '046', 'required': 'a', 'key': 'abcdejklmnop', 'paired': 'abcdejklmnop'},\n {'tag': '047', 'required': 'a', 'key': 'a2'},\n {'tag': '048', 'required': '', 'paired': 'ab', 'key': 'ba'},\n {'tag': '049', 'required': '', 'key': 'abcd'},\n {'tag': '050', 'required': 'a', 'key': 'ab13'},\n {'tag': '051', 'required': 'a', 'key': 'abc'}, // 2021-08-27: only one field in the whole Melinda\n {'tag': '052', 'required': 'a', 'key': 'abd'},\n {'tag': '055', 'required': 'a', 'key': 'ab'},\n {'tag': '060', 'required': 'a', 'key': 'ab'},\n {'tag': '061', 'required': 'a', 'paired': 'b', 'key': 'abc'},\n {'tag': '066', 'required': 'c'},\n {'tag': '070', 'required': 'a', 'key': 'ab'},\n {'tag': '071', 'required': 'a', 'paired': 'abc', 'key': 'abc'}, // N=3\n {'tag': '072', 'required': 'a', 'key': 'ax'},\n {'tag': '074', 'required': '', 'paired': 'a', 'key': 'az'},\n {'tag': '080', 'required': 'a', 'paired': 'bx', 'key': 'abx'},\n {'tag': '082', 'required': 'a', 'paired': 'b', 'key': 'abmq2'},\n {'tag': '083', 'required': 'a', 'paired': 'b', 'key': 'abmqy'},\n {'tag': '084', 'required': 'a', 'paired': 'b2', 'key': 'abq2'},\n {'tag': '085', 'required': '', 'paired': 'abcfrstuvwyz', 'key': 'abcfrstuvwxyz'},\n {'tag': '086', 'required': '', 'paired': 'a', 'key': 'a'},\n {'tag': '088', 'required': '', 'paired': 'a', 'key': 'a'},\n // NB! 100, 110 and 111 may have title parts that are handled elsewhere\n {'tag': '100', 'required': 'a', 'paired': `b${pairedTitleSubfields}`, 'key': keyX00},\n {'tag': '110', 'required': 'a', 'paired': `b${pairedTitleSubfields}`, 'key': keyX10},\n {'tag': '111', 'required': 'a', 'paired': pairedTitleSubfields, 'key': keyX11},\n // NB! 130 has no name part, key is used for title part\n {'tag': '130', 'required': 'a', paired: pairedTitleSubfields, 'key': keyX30},\n {'tag': '210', 'required': 'a', 'key': 'ab'},\n {'tag': '222', 'required': 'a', 'key': 'ab'},\n {'tag': '240', 'required': 'a', 'key': 'adfghklmnoprs'},\n {'tag': '242', 'required': 'a', 'key': 'abchnpy'},\n {'tag': '243', 'required': 'a', 'key': 'adfghklmnoprs'},\n {'tag': '245', 'required': 'a', 'key': 'abcghnps', 'paired': 'abnps'},\n {'tag': '246', 'required': 'a', 'key': 'abfnp'},\n {'tag': '247', 'required': 'a', 'key': 'abfnpx'},\n {'tag': '250', 'required': 'a', 'key': 'ab'},\n {'tag': '251', 'required': 'a', 'key': 'a'},\n {'tag': '254', 'required': 'a', 'key': 'a'},\n {'tag': '255', 'required': 'a', 'key': 'abcdefg', 'paired': 'abcdefg'},\n {'tag': '256', 'required': 'a', 'key': 'a'},\n {'tag': '257', 'required': 'a', 'key': 'a'},\n {'tag': '258', 'required': 'a', 'key': 'a'}, // Melinda: N=1\n //{'tag': '260', 'required': '', 'paired': 'abcefg', 'key': 'abcefg'},\n {'tag': '260', 'required': '', 'key': 'abcefg'},\n {'tag': '263', 'required': 'a', 'key': 'a'},\n //{'tag': '264', 'required': '', 'paired': 'abc', 'key': 'abc'}, // NB \"S.l.\" normalizations?\" not implemented\n {'tag': '264', 'required': '', 'key': 'abc'}, // NB \"S.l.\" normalizations?\" not implemented\n // SKIP TAG 270 ON PURPOSE! Melinda's N=43.\n {'tag': '300', 'required': '', 'key': 'abcefg'},\n {'tag': '306', 'required': 'a', 'key': 'a'},\n // SKIP TAG 307 ON PURPOSE! N=0\n {'tag': '310', 'required': 'a', 'key': 'ab'},\n {'tag': '321', 'required': 'a', 'key': 'ab'},\n {'tag': '335', 'required': 'a', 'key': 'ab'}, // Melinda N=1 (a test field). M might increase?\n {'tag': '336', 'required': 'b2', 'key': 'ab2'}, // MET-88: don't merge different $a subfields\n {'tag': '337', 'required': 'b2', 'key': 'ab2'}, // MET-88: don't merge different $a subfields\n {'tag': '338', 'required': 'b2', 'key': 'ab2'}, // / MET-88: don't merge different $a subfields\n {'tag': '340', 'required': '', 'paired': 'abcdefghijkmnop', 'key': 'abcdefghijkmnop'},\n {'tag': '341', 'required': '', 'paired': 'a2', 'key': 'abcde2'}, // NEW! Starting to appear!\n {'tag': '342', 'required': '', 'paired': 'abcdefghijklmnopqrstuvw', 'key': 'abcdefghijklmnopqrstuvw'}, // SKIP 342. NOT SEEN!\n {'tag': '343', 'required': '', 'paired': 'abcdefghi', 'key': 'abcdefghi'}, // SKIP 343.\n {'tag': '344', 'required': '', 'paired': 'abcdefgh', 'key': 'abcdefgh'},\n {'tag': '345', 'required': '', 'paired': 'abcd', 'key': 'abcd'},\n {'tag': '346', 'required': '', 'paired': 'ab', 'key': 'ab'},\n {'tag': '347', 'required': '', 'paired': 'abcdef', 'key': 'abcdef'},\n {'tag': '348', 'required': '', 'paired': 'ab', 'key': 'ab'},\n {'tag': '348', 'required': '', 'paired': 'abc', 'key': 'abc'},\n {'tag': '351', 'required': '', 'paired': 'abc', 'key': 'abc'},\n {'tag': '352', 'required': '', 'paired': 'abcdefgiq', 'key': 'abcdefgiq'},\n {'tag': '355', 'required': '', 'paired': 'abcdefghj', 'key': 'abcdefghj'},\n {'tag': '357', 'required': 'a', 'key': 'abcg'},\n {'tag': '362', 'required': 'a', 'key': 'az'},\n {'tag': '363', 'required': '', 'paired': 'abcdefghijklmuv', 'key': 'abcdefghijklmuv'},\n {'tag': '365', 'required': 'b', 'paired': 'abcdefghijkm', 'key': 'abcdefghijkm'}, // N=0\n {'tag': '366', 'required': '', 'paired': 'abcdefgjkm', 'key': 'abcdefgjkm'},\n {'tag': '370', 'required': '', 'paired': 'cfgistuv', 'key': 'cfgistuv'},\n {'tag': '377', 'required': '', 'paired': 'al', 'key': 'al'},\n {'tag': '380', 'required': 'a', 'key': 'a'},\n {'tag': '381', 'required': 'auv', 'key': 'auv'},\n {'tag': '382', 'required': ''},\n {'tag': '383', 'required': 'abcde', 'key': 'abcde'},\n {'tag': '384', 'required': 'a', 'key': 'a'},\n {'tag': '385', 'required': 'a', 'paired': 'abmn', 'key': 'abmn'},\n {'tag': '386', 'required': 'a', 'paired': 'abmn', 'key': 'abmn'},\n {'tag': '388', 'required': 'a', 'key': 'a'},\n {'tag': '490', 'required': '', 'key': 'axvl'},\n {'tag': '500', 'required': 'a', 'key': 'a'},\n {'tag': '501', 'required': 'a', 'key': 'a'},\n {'tag': '502', 'required': 'a', 'key': 'abcdgo'},\n {'tag': '504', 'required': 'a', 'paired': 'ab', 'key': 'ab'},\n {'tag': '505', 'required': '', 'paired': 'agrtu', 'key': 'agrtu'},\n {'tag': '506', 'required': 'a', 'paired': '', 'key': 'abcdefgqu'},\n {'tag': '507', 'required': 'a', 'paired': 'ab', 'key': 'ab'},\n {'tag': '508', 'required': 'a', 'key': 'a'},\n {'tag': '509', 'required': 'a', 'key': 'acd'},\n {'tag': '510', 'required': 'a', 'key': 'abcx'},\n {'tag': '511', 'required': 'a', 'key': 'a'},\n {'tag': '513', 'required': '', 'paired': 'ab', 'key': 'ab'},\n {'tag': '514', 'required': '', 'paired': 'abcdefghijkmuz', 'key': 'abcdefghijkmuz'},\n {'tag': '515', 'required': 'a', 'key': 'a'},\n {'tag': '518', 'required': '', 'paired': 'adop', 'key': 'adop'},\n {'tag': '520', 'required': 'a', 'paired': 'abc', 'key': 'abc'},\n {'tag': '521', 'required': 'a', 'paired': 'ab', 'key': 'ab'},\n {'tag': '522', 'required': 'a', 'key': 'a'},\n {'tag': '524', 'required': 'a', 'key': 'a'},\n {'tag': '525', 'required': 'a', 'key': 'a'},\n {'tag': '526', 'required': 'a', 'paired': 'abcdi', 'key': 'abcdi'},\n {'tag': '530', 'required': 'a', 'paired': 'abcd', 'key': 'abcd'},\n {'tag': '532', 'required': 'a', 'key': 'a'},\n {'tag': '533', 'required': 'a', 'paired': 'abcdefmn7', 'key': 'abcdefmn7'},\n {'tag': '534', 'required': '', 'paired': 'abcempt', 'key': 'abcempt'},\n {'tag': '535', 'required': '', 'paired': 'abcdg', 'key': 'abcdg'},\n {'tag': '536', 'required': '', 'paired': 'abcdefgh', 'key': 'abcdefgh'},\n {'tag': '538', 'required': 'a', 'paired': 'aiu', 'key': 'aiu'},\n {'tag': '540', 'required': '', 'paired': 'abcdfgqu', 'key': 'abcdfgqu'},\n {'tag': '541', 'required': '', 'paired': 'abcdefhno', 'key': 'abcdefhno'},\n {'tag': '542', 'required': '', 'paired': 'abcdfghijklmopqrsu', 'key': 'abcdfghijklmopqrsu'},\n {'tag': '544', 'required': '', 'paired': 'abcden', 'key': 'abcden'},\n {'tag': '545', 'required': '', 'paired': 'abu', 'key': 'abu'},\n {'tag': '546', 'required': '', 'paired': 'ab', 'key': 'ab'},\n {'tag': '547', 'required': 'a', 'key': 'a'},\n {'tag': '550', 'required': 'a', 'key': 'a'},\n {'tag': '552', 'required': '', 'paired': 'abcdefghijklmnopuz', 'key': 'abcdefghijklmnopuz'},\n {'tag': '555', 'required': 'a', 'paired': 'abcdu', 'key': 'abcdu'},\n {'tag': '556', 'required': 'a', 'key': 'az'},\n {'tag': '561', 'required': 'a', 'key': 'au'},\n {'tag': '562', 'required': '', 'paired': 'abcde', 'key': 'abcde'},\n {'tag': '563', 'required': 'a', 'key': 'au'},\n {'tag': '565', 'required': '', 'paired': 'abc', 'key': 'abc'},\n {'tag': '567', 'required': '', 'paired': 'ab', 'key': 'ab'},\n {'tag': '580', 'required': 'a', 'key': 'a'},\n {'tag': '581', 'required': 'a', 'key': 'a'},\n {'tag': '583', 'required': '', 'paired': 'abcdefhijklnou', 'key': 'abcdefhijklnou'},\n {'tag': '584', 'required': '', 'paired': 'ab', 'key': 'ab'},\n {'tag': '585', 'required': 'a', 'key': 'a'},\n {'tag': '586', 'required': 'a', 'key': 'a'},\n {'tag': '588', 'required': 'a', 'key': 'a'},\n // NB! Currently we never merge 59X fields (see mergableTags.js). Doublish removals such as MELKEHITYS-3147 are handled by postprocessor.\n {'tag': '590', 'required': ''},\n {'tag': '591', 'required': ''},\n {'tag': '592', 'required': ''},\n {'tag': '593', 'required': ''},\n {'tag': '594', 'required': ''},\n {'tag': '595', 'required': ''},\n {'tag': '596', 'required': ''},\n {'tag': '597', 'required': ''},\n {'tag': '598', 'required': ''},\n {'tag': '599', 'required': ''},\n {'tag': '600', 'required': 'a', 'paired': `b${pairedTitleSubfields}vxyz`, 'key': keyX00},\n {'tag': '610', 'required': 'a', 'paired': `b${pairedTitleSubfields}vxyz`, 'key': keyX10},\n {'tag': '611', 'required': 'a', 'paired': `${pairedTitleSubfields}vxyz`, 'key': keyX11},\n {'tag': '630', 'required': 'a', 'paired': `${pairedTitleSubfields}vxyz`, 'key': keyX30},\n // NB! 700, 710 and 711 may have title parts that are handled elsewhere\n {'tag': '647', 'required': 'a', 'paired': 'avxyz', 'key': 'acdgvxyz02'},\n {'tag': '648', 'required': 'a', 'paired': 'avxyz', 'key': 'avxyz02'},\n {'tag': '650', 'required': 'a', 'paired': 'abcdegvxyz', 'key': 'abcdegvxyz20'},\n {'tag': '651', 'required': 'a', 'paired': 'aegvxyz', 'key': 'aegvxyz20'},\n {'tag': '653', 'required': 'a', 'paired': 'a', 'key': 'a'}, // this is interesting as a can be repeated\n {'tag': '654', 'required': '', 'paired': 'abcevxyz'},\n {'tag': '655', 'required': 'a', 'paired': 'abcvxyz', 'key': 'avxyz20'},\n {'tag': '656', 'required': 'a', 'paired': 'akvxyz'}, // N=0\n {'tag': '657', 'required': 'a', 'paired': 'avxyz'}, // N=0\n {'tag': '658', 'required': 'a', 'paired': 'abcd'}, // N=0\n {'tag': '662', 'required': '', 'paired': 'abcdefgh'}, // N=0\n {'tag': '688', 'required': 'a'}, // N=0\n {'tag': '700', 'required': 'a', 'paired': `b${pairedTitleSubfields}x`, 'key': keyX00}, // h/i/m/o/r/s/x are missing from 100, NB! 's' is repeatable, but we are not merging them here!\n {'tag': '710', 'required': 'a', 'paired': `b${pairedTitleSubfields}x`, 'key': keyX10}, // h/j/m/o/r/s/x are missing from 110\n {'tag': '711', 'required': 'a', 'paired': `cdef${pairedTitleSubfields}x`, 'key': keyX11}, // h/i/s/x are missing from 711\n {'tag': '720', 'required': 'a', 'key': 'a'},\n // NB! 730 has no name part, key is used for title part\n {'tag': '730', 'required': 'a', 'paired': `df${pairedTitleSubfields}x`, 'key': keyX30}, // NB: 130->730 magic subfields might not agree...\n {'tag': '740', 'required': 'a', 'key': 'ahnp'},\n {'tag': '751', 'required': 'a', 'key': 'a'}, // N=11, kaikissa pelkk\u00E4 $a\n {'tag': '752', 'required': '', 'key': 'abcdefgh'}, // N=12234\n {'tag': '753', 'required': '', 'key': 'abc'},\n {'tag': '754', 'required': '', 'key': 'acdxz'}, // N=3\n {'tag': '758', 'required': 'a', 'key': 'ai'}, // N=1\n\n {'tag': '760', 'required': 'tw', key: 'twxy'},\n {'tag': '762', 'required': 't', key: 'abcdhmstxy'},\n {'tag': '765', 'required': 't', key: 'abcdhmrstuwxyz'},\n {'tag': '767', 'required': 't', key: 'abcdhmrstuwxyz'},\n {'tag': '770', 'required': 't', 'paired': 'ruxyz', key: 'abcdhmrstuwxyz'},\n {'tag': '772', 'required': 't', key: 'abcdhmrstuwxyz'},\n {'tag': '773', 'required': 'w', key: 'wgq'}, // Kirjav\u00E4litys should not have any component parts. However, this need to be re-thought...\n // Currently we (appently) drop fields that don't contain 773$w...\n {'tag': '774', 'required': '', 'paired': 'nruxyz', 'key': 'npqrstrxyz'},\n {'tag': '775', 'required': '', 'paired': 'ruxyz', 'key': 'abcdefhmstuxyz'},\n {'tag': '776', 'required': '', 'paired': 'ruxyz', 'key': 'abcdhmsuwxyz'},\n {'tag': '777', 'required': '', 'paired': 'ruxyz', 'key': 'abcdhmstuxyz'},\n {'tag': '780', 'required': '', 'paired': 'ruxyz', 'key': 'abcdhmstuxyz'},\n {'tag': '785', 'required': '', 'paired': 'uxyz', 'key': 'abcdhmstuxyz'},\n {'tag': '786', 'required': '', 'paired': 'abcrstuxyz', 'key': 'abcdhijmprstuxyz4'},\n {'tag': '787', 'required': '', 'paired': 'abcdhmstuxyz4'},\n {'tag': '788', 'required': '', 'paired': 'stx', 'key': 'abdestx'},\n {'tag': '800', 'required': 'a', 'paired': 'bt', 'key': keyX00},\n {'tag': '810', 'required': 'a', 'paired': 'bt', 'key': keyX10},\n {'tag': '811', 'required': 'a', 'paired': 't', 'key': keyX11},\n {'tag': '830', 'required': 'a', 'key': keyX30},\n {'tag': '840', 'required': 'a'},\n {'tag': '841', 'required': 'a'},\n {'tag': '842', 'required': 'a'},\n {'tag': '843', 'required': 'a'},\n {'tag': '844', 'required': 'a'},\n {'tag': '845', 'required': 'a'},\n {'tag': '850', 'required': 'a', 'key': 'a'},\n {'tag': '852', 'required': 'a'}, // HMM... we might want to reconsider this...\n {'tag': '853', 'required': 'a'},\n {'tag': '854', 'required': 'a'},\n {'tag': '855', 'required': 'a'},\n {'tag': '856', 'required': 'u', 'paired': 'u', 'key': 'opuw23'}, // 856 is built around $u...\n {'tag': '863', 'required': 'a'},\n {'tag': '864', 'required': 'a'},\n {'tag': '865', 'required': 'a'},\n {'tag': '866', 'required': 'a'},\n {'tag': '867', 'required': 'a'},\n {'tag': '868', 'required': 'a'},\n {'tag': '876', 'required': 'a'},\n {'tag': '877', 'required': 'a'},\n {'tag': '878', 'required': 'a'},\n {'tag': '880', 'required': '', 'paired': 'a', 'key': 'abcdefghijklmnopqrstuvwxyz'},\n {'tag': '881', 'required': ''},\n {'tag': '882', 'required': ''},\n {'tag': '883', 'required': ''},\n {'tag': '884', 'required': '', 'paired': 'agkq'},\n {'tag': '885', 'required': ''},\n {'tag': '886', 'required': ''},\n {'tag': '887', 'required': ''},\n {'tag': '900', 'required': ''},\n {'tag': '901', 'required': ''},\n {'tag': '910', 'required': ''},\n {'tag': '935', 'required': 'a', 'key': 'az'}, // Fono information at least\n {'tag': '940', 'required': ''},\n {'tag': '946', 'required': 'a', 'key': 'abfnp'}, // Copied from 246. However, final version might contain some elements from field 245 as well\n {'tag': '960', 'required': ''},\n {'tag': '973', 'required': 'w', 'key': 'w'}, // Viola multi-hosts\n {'tag': '995', 'required': ''},\n {'tag': 'CAT', 'required': ''},\n {'tag': 'LOW', 'required': ''},\n {'tag': 'SID', 'required': ''}\n];\n\n\nexport function getMergeConstraintsForTag(tag, constraintName = undefined) {\n const tagsConstraintsArray = mergeConstraints.filter(entry => tag === entry.tag);\n if (tagsConstraintsArray.length === 0) {\n debugDev(`WARNING\\tNo key found for ${tag}!`);\n }\n if (!constraintName) {\n return tagsConstraintsArray;\n }\n // NB! should we support multiple contains for a field? Eg. 505$a vs 505($tg)+\n if (tagsConstraintsArray.length > 1) {\n debugDev(`WARNING\\tMultiple values for '${constraintName}' (N=${tagsConstraintsArray.length}) found in ${tag}. Using first values.`);\n }\n //return constraintToValue(tagsConstraintsArray[0], constraintName);\n return tagsConstraintsArray.map(c => constraintToValue(c, constraintName));\n\n function constraintToValue(tagsConstraints, constraintName) {\n if (constraintName in tagsConstraints) {\n return tagsConstraints[constraintName];\n }\n return null; // NB! \"\" might mean \"apply to everything\" (eg. 040.key) while null means that it is not applied.\n }\n}\n"],
5
- "mappings": "AAAA,OAAO,uBAAuB;AAC9B,MAAM,QAAQ,kBAAkB,+DAA+D;AAE/F,MAAM,WAAW,MAAM,OAAO,KAAK;AAWnC,MAAM,SAAS;AACf,MAAM,SAAS;AACf,MAAM,SAAS;AACf,MAAM,SAAS;AACf,MAAM,uBAAuB;AAE7B,MAAM,mBAAmB;AAAA,EACvB,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,KAAI;AAAA,EAC3C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,KAAK,OAAO,KAAI;AAAA;AAAA,EACzD,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,KAAK,OAAO,MAAK;AAAA,EAC1D,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,KAAK,OAAO,KAAI;AAAA,EACzD,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,KAAI;AAAA,EAC3C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,IAAI,OAAO,cAAa;AAAA;AAAA,EACnD,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,KAAI;AAAA,EAC3C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,WAAU;AAAA;AAAA,EACjD,EAAC,OAAO,OAAO,YAAY,MAAM,OAAO,0BAAyB;AAAA,EACjE,EAAC,OAAO,OAAO,YAAY,IAAI,OAAO,KAAI;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,KAAI;AAAA,EAC3C,EAAC,OAAO,OAAO,YAAY,IAAG;AAAA,EAC9B,EAAC,OAAO,OAAO,YAAY,IAAI,OAAO,GAAE;AAAA,EACxC,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,KAAK,OAAO,KAAI;AAAA;AAAA,EACzD,EAAC,OAAO,OAAO,YAAY,IAAI,OAAO,GAAE;AAAA;AAAA,EACxC,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,MAAK;AAAA,EAC5C,EAAC,OAAO,OAAO,YAAY,IAAI,OAAO,OAAO,UAAU,MAAK;AAAA,EAC5D,EAAC,OAAO,OAAO,YAAY,IAAI,OAAO,OAAO,UAAU,MAAK;AAAA;AAAA,EAC5D,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,gBAAgB,UAAU,eAAc;AAAA,EAC/E,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,KAAI;AAAA,EAC3C,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,MAAM,OAAO,KAAI;AAAA,EAC1D,EAAC,OAAO,OAAO,YAAY,IAAI,OAAO,OAAM;AAAA,EAC5C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,OAAM;AAAA,EAC7C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,MAAK;AAAA;AAAA,EAC5C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,MAAK;AAAA,EAC5C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,KAAI;AAAA,EAC3C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,KAAI;AAAA,EAC3C,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,KAAK,OAAO,MAAK;AAAA,EAC3D,EAAC,OAAO,OAAO,YAAY,IAAG;AAAA,EAC9B,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,KAAI;AAAA,EAC3C,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,OAAO,OAAO,MAAK;AAAA;AAAA,EAC7D,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,KAAI;AAAA,EAC3C,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,KAAK,OAAO,KAAI;AAAA,EACzD,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,MAAM,OAAO,MAAK;AAAA,EAC5D,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,KAAK,OAAO,QAAO;AAAA,EAC7D,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,KAAK,OAAO,QAAO;AAAA,EAC7D,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,MAAM,OAAO,OAAM;AAAA,EAC7D,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,gBAAgB,OAAO,gBAAe;AAAA,EAC/E,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,KAAK,OAAO,IAAG;AAAA,EACxD,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,KAAK,OAAO,IAAG;AAAA;AAAA,EAExD,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,IAAI,oBAAoB,IAAI,OAAO,OAAM;AAAA,EACnF,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,IAAI,oBAAoB,IAAI,OAAO,OAAM;AAAA,EACnF,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,sBAAsB,OAAO,OAAM;AAAA;AAAA,EAE7E,EAAC,OAAO,OAAO,YAAY,KAAK,QAAQ,sBAAsB,OAAO,OAAM;AAAA,EAC3E,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,KAAI;AAAA,EAC3C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,KAAI;AAAA,EAC3C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,gBAAe;AAAA,EACtD,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,UAAS;AAAA,EAChD,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,gBAAe;AAAA,EACtD,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,YAAY,UAAU,QAAO;AAAA,EACpE,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,QAAO;AAAA,EAC9C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,SAAQ;AAAA,EAC/C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,KAAI;AAAA,EAC3C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,WAAW,UAAU,UAAS;AAAA,EACrE,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA;AAAA;AAAA,EAE1C,EAAC,OAAO,OAAO,YAAY,IAAI,OAAO,SAAQ;AAAA,EAC9C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA;AAAA,EAE1C,EAAC,OAAO,OAAO,YAAY,IAAI,OAAO,MAAK;AAAA;AAAA;AAAA,EAE3C,EAAC,OAAO,OAAO,YAAY,IAAI,OAAO,SAAQ;AAAA,EAC9C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA;AAAA,EAE1C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,KAAI;AAAA,EAC3C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,KAAI;AAAA,EAC3C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,KAAI;AAAA;AAAA,EAC3C,EAAC,OAAO,OAAO,YAAY,MAAM,OAAO,MAAK;AAAA;AAAA,EAC7C,EAAC,OAAO,OAAO,YAAY,MAAM,OAAO,MAAK;AAAA;AAAA,EAC7C,EAAC,OAAO,OAAO,YAAY,MAAM,OAAO,MAAK;AAAA;AAAA,EAC7C,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,mBAAmB,OAAO,kBAAiB;AAAA,EACpF,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,MAAM,OAAO,SAAQ;AAAA;AAAA,EAC9D,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,2BAA2B,OAAO,0BAAyB;AAAA;AAAA,EACpG,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,aAAa,OAAO,YAAW;AAAA;AAAA,EACxE,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,YAAY,OAAO,WAAU;AAAA,EACtE,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,QAAQ,OAAO,OAAM;AAAA,EAC9D,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,MAAM,OAAO,KAAI;AAAA,EAC1D,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,UAAU,OAAO,SAAQ;AAAA,EAClE,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,MAAM,OAAO,KAAI;AAAA,EAC1D,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,OAAO,OAAO,MAAK;AAAA,EAC5D,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,OAAO,OAAO,MAAK;AAAA,EAC5D,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,aAAa,OAAO,YAAW;AAAA,EACxE,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,aAAa,OAAO,YAAW;AAAA,EACxE,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,OAAM;AAAA,EAC7C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,KAAI;AAAA,EAC3C,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,mBAAmB,OAAO,kBAAiB;AAAA,EACpF,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,gBAAgB,OAAO,eAAc;AAAA;AAAA,EAC/E,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,cAAc,OAAO,aAAY;AAAA,EAC1E,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,YAAY,OAAO,WAAU;AAAA,EACtE,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,MAAM,OAAO,KAAI;AAAA,EAC1D,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,OAAO,OAAO,MAAK;AAAA,EAC9C,EAAC,OAAO,OAAO,YAAY,GAAE;AAAA,EAC7B,EAAC,OAAO,OAAO,YAAY,SAAS,OAAO,QAAO;AAAA,EAClD,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,QAAQ,OAAO,OAAM;AAAA,EAC/D,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,QAAQ,OAAO,OAAM;AAAA,EAC/D,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,IAAI,OAAO,OAAM;AAAA,EAC5C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,SAAQ;AAAA,EAC/C,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,MAAM,OAAO,KAAI;AAAA,EAC3D,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,SAAS,OAAO,QAAO;AAAA,EAChE,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,IAAI,OAAO,YAAW;AAAA,EAChE,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,MAAM,OAAO,KAAI;AAAA,EAC3D,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,MAAK;AAAA,EAC5C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,OAAM;AAAA,EAC7C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,MAAM,OAAO,KAAI;AAAA,EAC1D,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,kBAAkB,OAAO,iBAAgB;AAAA,EAClF,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,QAAQ,OAAO,OAAM;AAAA,EAC9D,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,OAAO,OAAO,MAAK;AAAA,EAC7D,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,MAAM,OAAO,KAAI;AAAA,EAC3D,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,SAAS,OAAO,QAAO;AAAA,EACjE,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,QAAQ,OAAO,OAAM;AAAA,EAC/D,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,aAAa,OAAO,YAAW;AAAA,EACzE,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,WAAW,OAAO,UAAS;AAAA,EACpE,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,SAAS,OAAO,QAAO;AAAA,EAChE,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,YAAY,OAAO,WAAU;AAAA,EACtE,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,OAAO,OAAO,MAAK;AAAA,EAC7D,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,YAAY,OAAO,WAAU;AAAA,EACtE,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,aAAa,OAAO,YAAW;AAAA,EACxE,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,sBAAsB,OAAO,qBAAoB;AAAA,EAC1F,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,UAAU,OAAO,SAAQ;AAAA,EAClE,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,OAAO,OAAO,MAAK;AAAA,EAC5D,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,MAAM,OAAO,KAAI;AAAA,EAC1D,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,sBAAsB,OAAO,qBAAoB;AAAA,EAC1F,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,SAAS,OAAO,QAAO;AAAA,EACjE,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,KAAI;AAAA,EAC3C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,KAAI;AAAA,EAC3C,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,SAAS,OAAO,QAAO;AAAA,EAChE,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,KAAI;AAAA,EAC3C,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,OAAO,OAAO,MAAK;AAAA,EAC5D,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,MAAM,OAAO,KAAI;AAAA,EAC1D,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,kBAAkB,OAAO,iBAAgB;AAAA,EAClF,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,MAAM,OAAO,KAAI;AAAA,EAC1D,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA;AAAA,EAE1C,EAAC,OAAO,OAAO,YAAY,GAAE;AAAA,EAC7B,EAAC,OAAO,OAAO,YAAY,GAAE;AAAA,EAC7B,EAAC,OAAO,OAAO,YAAY,GAAE;AAAA,EAC7B,EAAC,OAAO,OAAO,YAAY,GAAE;AAAA,EAC7B,EAAC,OAAO,OAAO,YAAY,GAAE;AAAA,EAC7B,EAAC,OAAO,OAAO,YAAY,GAAE;AAAA,EAC7B,EAAC,OAAO,OAAO,YAAY,GAAE;AAAA,EAC7B,EAAC,OAAO,OAAO,YAAY,GAAE;AAAA,EAC7B,EAAC,OAAO,OAAO,YAAY,GAAE;AAAA,EAC7B,EAAC,OAAO,OAAO,YAAY,GAAE;AAAA,EAC7B,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,IAAI,oBAAoB,QAAQ,OAAO,OAAM;AAAA,EACvF,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,IAAI,oBAAoB,QAAQ,OAAO,OAAM;AAAA,EACvF,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,GAAG,oBAAoB,QAAQ,OAAO,OAAM;AAAA,EACtF,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,GAAG,oBAAoB,QAAQ,OAAO,OAAM;AAAA;AAAA,EAEtF,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,SAAS,OAAO,aAAY;AAAA,EACtE,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,SAAS,OAAO,UAAS;AAAA,EACnE,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,cAAc,OAAO,eAAc;AAAA,EAC7E,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,WAAW,OAAO,YAAW;AAAA,EACvE,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,KAAK,OAAO,IAAG;AAAA;AAAA,EACzD,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,WAAU;AAAA,EACnD,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,WAAW,OAAO,UAAS;AAAA,EACrE,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,SAAQ;AAAA;AAAA,EAClD,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,QAAO;AAAA;AAAA,EACjD,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,OAAM;AAAA;AAAA,EAChD,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,WAAU;AAAA;AAAA,EACnD,EAAC,OAAO,OAAO,YAAY,IAAG;AAAA;AAAA,EAC9B,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,IAAI,oBAAoB,KAAK,OAAO,OAAM;AAAA;AAAA,EACpF,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,IAAI,oBAAoB,KAAK,OAAO,OAAM;AAAA;AAAA,EACpF,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,OAAO,oBAAoB,KAAK,OAAO,OAAM;AAAA;AAAA,EACvF,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA;AAAA,EAE1C,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,KAAK,oBAAoB,KAAK,OAAO,OAAM;AAAA;AAAA,EACrF,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,OAAM;AAAA,EAC7C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,IAAI,OAAO,WAAU;AAAA;AAAA,EAChD,EAAC,OAAO,OAAO,YAAY,IAAI,OAAO,MAAK;AAAA,EAC3C,EAAC,OAAO,OAAO,YAAY,IAAI,OAAO,QAAO;AAAA;AAAA,EAC7C,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,KAAI;AAAA;AAAA,EAE3C,EAAC,OAAO,OAAO,YAAY,MAAM,KAAK,OAAM;AAAA,EAC5C,EAAC,OAAO,OAAO,YAAY,KAAK,KAAK,aAAY;AAAA,EACjD,EAAC,OAAO,OAAO,YAAY,KAAK,KAAK,iBAAgB;AAAA,EACrD,EAAC,OAAO,OAAO,YAAY,KAAK,KAAK,iBAAgB;AAAA,EACrD,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,SAAS,KAAK,iBAAgB;AAAA,EACxE,EAAC,OAAO,OAAO,YAAY,KAAK,KAAK,iBAAgB;AAAA,EACrD,EAAC,OAAO,OAAO,YAAY,KAAK,KAAK,MAAK;AAAA;AAAA;AAAA,EAE1C,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,UAAU,OAAO,aAAY;AAAA,EACtE,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,SAAS,OAAO,iBAAgB;AAAA,EACzE,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,SAAS,OAAO,eAAc;AAAA,EACvE,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,SAAS,OAAO,eAAc;AAAA,EACvE,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,SAAS,OAAO,eAAc;AAAA,EACvE,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,QAAQ,OAAO,eAAc;AAAA,EACtE,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,cAAc,OAAO,oBAAmB;AAAA,EACjF,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,gBAAe;AAAA,EACxD,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,OAAO,OAAO,UAAS;AAAA,EAChE,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,MAAM,OAAO,OAAM;AAAA,EAC7D,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,MAAM,OAAO,OAAM;AAAA,EAC7D,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,KAAK,OAAO,OAAM;AAAA,EAC5D,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,OAAM;AAAA,EAC7C,EAAC,OAAO,OAAO,YAAY,IAAG;AAAA,EAC9B,EAAC,OAAO,OAAO,YAAY,IAAG;AAAA,EAC9B,EAAC,OAAO,OAAO,YAAY,IAAG;AAAA,EAC9B,EAAC,OAAO,OAAO,YAAY,IAAG;AAAA,EAC9B,EAAC,OAAO,OAAO,YAAY,IAAG;AAAA,EAC9B,EAAC,OAAO,OAAO,YAAY,IAAG;AAAA,EAC9B,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,IAAG;AAAA;AAAA,EAC9B,EAAC,OAAO,OAAO,YAAY,IAAG;AAAA,EAC9B,EAAC,OAAO,OAAO,YAAY,IAAG;AAAA,EAC9B,EAAC,OAAO,OAAO,YAAY,IAAG;AAAA,EAC9B,EAAC,OAAO,OAAO,YAAY,KAAK,UAAU,KAAK,OAAO,SAAQ;AAAA;AAAA,EAC9D,EAAC,OAAO,OAAO,YAAY,IAAG;AAAA,EAC9B,EAAC,OAAO,OAAO,YAAY,IAAG;AAAA,EAC9B,EAAC,OAAO,OAAO,YAAY,IAAG;AAAA,EAC9B,EAAC,OAAO,OAAO,YAAY,IAAG;AAAA,EAC9B,EAAC,OAAO,OAAO,YAAY,IAAG;AAAA,EAC9B,EAAC,OAAO,OAAO,YAAY,IAAG;AAAA,EAC9B,EAAC,OAAO,OAAO,YAAY,IAAG;AAAA,EAC9B,EAAC,OAAO,OAAO,YAAY,IAAG;AAAA,EAC9B,EAAC,OAAO,OAAO,YAAY,IAAG;AAAA,EAC9B,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,KAAK,OAAO,6BAA4B;AAAA,EACjF,EAAC,OAAO,OAAO,YAAY,GAAE;AAAA,EAC7B,EAAC,OAAO,OAAO,YAAY,GAAE;AAAA,EAC7B,EAAC,OAAO,OAAO,YAAY,GAAE;AAAA,EAC7B,EAAC,OAAO,OAAO,YAAY,IAAI,UAAU,OAAM;AAAA,EAC/C,EAAC,OAAO,OAAO,YAAY,GAAE;AAAA,EAC7B,EAAC,OAAO,OAAO,YAAY,GAAE;AAAA,EAC7B,EAAC,OAAO,OAAO,YAAY,GAAE;AAAA,EAC7B,EAAC,OAAO,OAAO,YAAY,GAAE;AAAA,EAC7B,EAAC,OAAO,OAAO,YAAY,GAAE;AAAA,EAC7B,EAAC,OAAO,OAAO,YAAY,GAAE;AAAA,EAC7B,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,KAAI;AAAA;AAAA,EAC3C,EAAC,OAAO,OAAO,YAAY,GAAE;AAAA,EAC7B,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,QAAO;AAAA;AAAA,EAC9C,EAAC,OAAO,OAAO,YAAY,GAAE;AAAA,EAC7B,EAAC,OAAO,OAAO,YAAY,KAAK,OAAO,IAAG;AAAA;AAAA,EAC1C,EAAC,OAAO,OAAO,YAAY,GAAE;AAAA,EAC7B,EAAC,OAAO,OAAO,YAAY,GAAE;AAAA,EAC7B,EAAC,OAAO,OAAO,YAAY,GAAE;AAAA,EAC7B,EAAC,OAAO,OAAO,YAAY,GAAE;AAC/B;AAGO,gBAAS,0BAA0B,KAAK,iBAAiB,QAAW;AACzE,QAAM,uBAAuB,iBAAiB,OAAO,WAAS,QAAQ,MAAM,GAAG;AAC/E,MAAI,qBAAqB,WAAW,GAAG;AACrC,aAAS,4BAA6B,GAAG,GAAG;AAAA,EAC9C;AACA,MAAI,CAAC,gBAAgB;AACnB,WAAO;AAAA,EACT;AAEA,MAAI,qBAAqB,SAAS,GAAG;AACnC,aAAS,gCAAiC,cAAc,QAAQ,qBAAqB,MAAM,cAAc,GAAG,uBAAuB;AAAA,EACrI;AAEA,SAAO,qBAAqB,IAAI,OAAK,kBAAkB,GAAG,cAAc,CAAC;AAEzE,WAAS,kBAAkB,iBAAiBA,iBAAgB;AAC1D,QAAIA,mBAAkB,iBAAiB;AACrC,aAAO,gBAAgBA,eAAc;AAAA,IACvC;AACA,WAAO;AAAA,EACT;AACF;",
4
+ "sourcesContent": ["import createDebugLogger from 'debug';\nconst debug = createDebugLogger('@natlibfi/melinda-marc-record-merge-reducers:mergeConstraints');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\n// \"required\": both fields bust have the subfield and the value must be same.\n// \"paired\": subfield bust either exists (with value match) or not exist in both fields (negative XOR). Sort of an optional version of 'required'\n// \"key\": one or both fields lack the subfield OR both fields have it and theor values match.\n// There are typically NR subfields but the system should support multival repeatable subfields. However, (R) support is considered experimental.\n// NB: key+paired with identical values is an attempt to prevent copy for (ET) fields, and to force separate fields on (T) fields.\n// NB! If base has eg. no 264, two+ 264 fields can be copied from the source.\n\n// NB! not all X00 fields have, say, $x subfield. However, we can still share them...\n// $h is non-1XX?, $i is 7XX only, $w is 8XX only...\nconst keyX00 = 'abcjklnoqrstuwx'; // Shared: $abcdefg...\nconst keyX10 = 'abcdfghklnoprstuwx';\nconst keyX11 = 'acdefghklnpqstuwx';\nconst keyX30 = 'adfghklmnoprstvwxyz';\nconst pairedTitleSubfields = 'iklmnoprst'\n\nconst mergeConstraints = [\n {'tag': '010', 'required': 'a', 'key': 'a'},\n {'tag': '013', 'required': 'a', 'key': 'a'}, // We have 2 instances in Melinda...\n {'tag': '015', 'required': 'a', 'key': 'a'},\n {'tag': '016', 'required': 'a', 'key': 'a2'},\n {'tag': '017', 'required': 'a', 'key': 'a'},\n {'tag': '018', 'required': 'a', 'key': 'a'},\n {'tag': '020', 'required': '', 'paired': 'a', 'key': 'az'}, // NB! $a foo $z lorum and $a foo $z ipsum would not merge! Due to common denominator and f020$z onlies this is the best we can done. This could be handled if 020 would have multiple merge constrains: one for f020$a, and one for f020$z...\n {'tag': '022', 'required': '', 'paired': 'a', 'key': 'alz'},\n {'tag': '024', 'required': '', 'paired': 'a', 'key': 'ad'},\n {'tag': '025', 'required': 'a', 'key': 'a'},\n {'tag': '026', 'required': 'a', 'key': 'a'},\n {'tag': '027', 'required': 'a', 'key': 'a'}, // on tuolla pari $z:\u00E4\u00E4\n {'tag': '028', 'required': 'a', 'key': 'ab'},\n {'tag': '030', 'required': 'a', 'key': 'a'},\n {'tag': '031', 'required': '', 'key': 'abcegmnopr2'}, // mites t\u00E4mm\u00F6isen k\u00E4yt\u00E4nn\u00F6ss\u00E4 avaimettoman klaarais? TODO: tests\n {'tag': '032', 'required': 'a', 'key': 'ab'},\n {'tag': '033', 'required': 'a', 'key': 'abcp0123'}, // 0,1% are without $a. Ignore them for now.\n {'tag': '034', 'required': 'ab', 'key': 'abcdefghjkmnprstxyz0123'},\n {'tag': '035', 'required': '', 'key': 'az'},\n {'tag': '036', 'required': 'a', 'key': 'a'},\n {'tag': '037', 'required': 'b', 'key': 'ab'},\n {'tag': '039', 'required': 'a'},\n {'tag': '040', 'required': '', 'key': ''},\n {'tag': '041', 'required': '', 'paired': '2', 'key': 'ad'}, // Don't put $2 in 'key'! hasCommonNominator() would get into trouble with it...\n {'tag': '042', 'required': '', 'key': ''}, // Contents (supposedly $a subfields) can be anything, and still merge... (042 $a foo + 042 $b bar is perfectly mergeable)\n {'tag': '043', 'required': 'a', 'key': 'abc'},\n {'tag': '044', 'required': '', 'key': 'abc', 'paired': 'abc'},\n {'tag': '045', 'required': '', 'key': 'abc', 'paired': 'abc'}, // (ET) // 045 is problematic either-$a or $b or $c...\n {'tag': '046', 'required': 'a', 'key': 'abcdejklmnop', 'paired': 'abcdejklmnop'},\n {'tag': '047', 'required': 'a', 'key': 'a2'},\n {'tag': '048', 'required': '', 'paired': 'ab', 'key': 'ba'},\n {'tag': '049', 'required': '', 'key': 'abcd'},\n {'tag': '050', 'required': 'a', 'key': 'ab13'},\n {'tag': '051', 'required': 'a', 'key': 'abc'}, // 2021-08-27: only one field in the whole Melinda\n {'tag': '052', 'required': 'a', 'key': 'abd'},\n {'tag': '055', 'required': 'a', 'key': 'ab'},\n {'tag': '060', 'required': 'a', 'key': 'ab'},\n {'tag': '061', 'required': 'a', 'paired': 'b', 'key': 'abc'},\n {'tag': '066', 'required': 'c'},\n {'tag': '070', 'required': 'a', 'key': 'ab'},\n {'tag': '071', 'required': 'a', 'paired': 'abc', 'key': 'abc'}, // N=3\n {'tag': '072', 'required': 'a', 'key': 'ax'},\n {'tag': '074', 'required': '', 'paired': 'a', 'key': 'az'},\n {'tag': '080', 'required': 'a', 'paired': 'bx', 'key': 'abx'},\n {'tag': '082', 'required': 'a', 'paired': 'b', 'key': 'abmq2'},\n {'tag': '083', 'required': 'a', 'paired': 'b', 'key': 'abmqy'},\n {'tag': '084', 'required': 'a', 'paired': 'b2', 'key': 'abq2'},\n {'tag': '085', 'required': '', 'paired': 'abcfrstuvwyz', 'key': 'abcfrstuvwxyz'},\n {'tag': '086', 'required': '', 'paired': 'a', 'key': 'a'},\n {'tag': '088', 'required': '', 'paired': 'a', 'key': 'a'},\n // NB! 100, 110 and 111 may have title parts that are handled elsewhere\n {'tag': '100', 'required': 'a', 'paired': `b${pairedTitleSubfields}`, 'key': keyX00},\n {'tag': '110', 'required': 'a', 'paired': `b${pairedTitleSubfields}`, 'key': keyX10},\n {'tag': '111', 'required': 'a', 'paired': pairedTitleSubfields, 'key': keyX11},\n // NB! 130 has no name part, key is used for title part\n {'tag': '130', 'required': 'a', paired: pairedTitleSubfields, 'key': keyX30},\n {'tag': '210', 'required': 'a', 'key': 'ab'},\n {'tag': '222', 'required': 'a', 'key': 'ab'},\n {'tag': '240', 'required': 'a', 'key': 'adfghklmnoprs'},\n {'tag': '242', 'required': 'a', 'key': 'abchnpy'},\n {'tag': '243', 'required': 'a', 'key': 'adfghklmnoprs'},\n {'tag': '245', 'required': 'a', 'key': 'abcghnps', 'paired': 'abnps'},\n {'tag': '246', 'required': 'a', 'key': 'abfnp'},\n {'tag': '247', 'required': 'a', 'key': 'abfnpx'},\n {'tag': '250', 'required': 'a', 'key': 'ab'},\n {'tag': '251', 'required': 'a', 'key': 'a'},\n {'tag': '254', 'required': 'a', 'key': 'a'},\n {'tag': '255', 'required': 'a', 'key': 'abcdefg', 'paired': 'abcdefg'},\n {'tag': '256', 'required': 'a', 'key': 'a'},\n {'tag': '257', 'required': 'a', 'key': 'a'},\n {'tag': '258', 'required': 'a', 'key': 'a'}, // Melinda: N=1\n //{'tag': '260', 'required': '', 'paired': 'abcefg', 'key': 'abcefg'},\n {'tag': '260', 'required': '', 'key': 'abcefg'},\n {'tag': '263', 'required': 'a', 'key': 'a'},\n //{'tag': '264', 'required': '', 'paired': 'abc', 'key': 'abc'}, // NB \"S.l.\" normalizations?\" not implemented\n {'tag': '264', 'required': '', 'key': 'abc'}, // NB \"S.l.\" normalizations?\" not implemented\n // SKIP TAG 270 ON PURPOSE! Melinda's N=43.\n {'tag': '300', 'required': '', 'key': 'abcefg'},\n {'tag': '306', 'required': 'a', 'key': 'a'},\n // SKIP TAG 307 ON PURPOSE! N=0\n {'tag': '310', 'required': 'a', 'key': 'ab'},\n {'tag': '321', 'required': 'a', 'key': 'ab'},\n {'tag': '335', 'required': 'a', 'key': 'ab'}, // Melinda N=1 (a test field). M might increase?\n {'tag': '336', 'required': 'b2', 'key': 'ab2'}, // MET-88: don't merge different $a subfields\n {'tag': '337', 'required': 'b2', 'key': 'ab2'}, // MET-88: don't merge different $a subfields\n {'tag': '338', 'required': 'b2', 'key': 'ab2'}, // / MET-88: don't merge different $a subfields\n {'tag': '340', 'required': '', 'paired': 'abcdefghijkmnop', 'key': 'abcdefghijkmnop'},\n {'tag': '341', 'required': '', 'paired': 'a2', 'key': 'abcde2'}, // NEW! Starting to appear!\n {'tag': '342', 'required': '', 'paired': 'abcdefghijklmnopqrstuvw', 'key': 'abcdefghijklmnopqrstuvw'}, // SKIP 342. NOT SEEN!\n {'tag': '343', 'required': '', 'paired': 'abcdefghi', 'key': 'abcdefghi'}, // SKIP 343.\n {'tag': '344', 'required': '', 'paired': 'abcdefgh', 'key': 'abcdefgh'},\n {'tag': '345', 'required': '', 'paired': 'abcd', 'key': 'abcd'},\n {'tag': '346', 'required': '', 'paired': 'ab', 'key': 'ab'},\n {'tag': '347', 'required': '', 'paired': 'abcdef', 'key': 'abcdef'},\n {'tag': '348', 'required': '', 'paired': 'ab', 'key': 'ab'},\n {'tag': '348', 'required': '', 'paired': 'abc', 'key': 'abc'},\n {'tag': '351', 'required': '', 'paired': 'abc', 'key': 'abc'},\n {'tag': '352', 'required': '', 'paired': 'abcdefgiq', 'key': 'abcdefgiq'},\n {'tag': '355', 'required': '', 'paired': 'abcdefghj', 'key': 'abcdefghj'},\n {'tag': '357', 'required': 'a', 'key': 'abcg'},\n {'tag': '362', 'required': 'a', 'key': 'az'},\n {'tag': '363', 'required': '', 'paired': 'abcdefghijklmuv', 'key': 'abcdefghijklmuv'},\n {'tag': '365', 'required': 'b', 'paired': 'abcdefghijkm', 'key': 'abcdefghijkm'}, // N=0\n {'tag': '366', 'required': '', 'paired': 'abcdefgjkm', 'key': 'abcdefgjkm'},\n {'tag': '370', 'required': '', 'paired': 'cfgistuv', 'key': 'cfgistuv'},\n {'tag': '377', 'required': '', 'paired': 'al', 'key': 'al'},\n {'tag': '380', 'required': 'a', 'key': 'a'},\n {'tag': '381', 'required': 'auv', 'key': 'auv'},\n {'tag': '382', 'required': ''},\n {'tag': '383', 'required': 'abcde', 'key': 'abcde'},\n {'tag': '384', 'required': 'a', 'key': 'a'},\n {'tag': '385', 'required': 'a', 'paired': 'abmn', 'key': 'abmn'},\n {'tag': '386', 'required': 'a', 'paired': 'abmn', 'key': 'abmn'},\n {'tag': '388', 'required': 'a', 'key': 'a'},\n {'tag': '490', 'required': '', 'key': 'axvl'},\n {'tag': '500', 'required': 'a', 'key': 'a'},\n {'tag': '501', 'required': 'a', 'key': 'a'},\n {'tag': '502', 'required': 'a', 'key': 'abcdgo'},\n {'tag': '504', 'required': 'a', 'paired': 'ab', 'key': 'ab'},\n {'tag': '505', 'required': '', 'paired': 'agrtu', 'key': 'agrtu'},\n {'tag': '506', 'required': 'a', 'paired': '', 'key': 'abcdefgqu'},\n {'tag': '507', 'required': 'a', 'paired': 'ab', 'key': 'ab'},\n {'tag': '508', 'required': 'a', 'key': 'a'},\n {'tag': '509', 'required': 'a', 'key': 'acd'},\n {'tag': '510', 'required': 'a', 'key': 'abcx'},\n {'tag': '511', 'required': 'a', 'key': 'a'},\n {'tag': '513', 'required': '', 'paired': 'ab', 'key': 'ab'},\n {'tag': '514', 'required': '', 'paired': 'abcdefghijkmuz', 'key': 'abcdefghijkmuz'},\n {'tag': '515', 'required': 'a', 'key': 'a'},\n {'tag': '518', 'required': '', 'paired': 'adop', 'key': 'adop'},\n {'tag': '520', 'required': 'a', 'paired': 'abc', 'key': 'abc'},\n {'tag': '521', 'required': 'a', 'paired': 'ab', 'key': 'ab'},\n {'tag': '522', 'required': 'a', 'key': 'a'},\n {'tag': '524', 'required': 'a', 'key': 'a'},\n {'tag': '525', 'required': 'a', 'key': 'a'},\n {'tag': '526', 'required': 'a', 'paired': 'abcdi', 'key': 'abcdi'},\n {'tag': '530', 'required': 'a', 'paired': 'abcd', 'key': 'abcd'},\n {'tag': '532', 'required': 'a', 'key': 'a'},\n {'tag': '533', 'required': 'a', 'paired': 'abcdefmn7', 'key': 'abcdefmn7'},\n {'tag': '534', 'required': '', 'paired': 'abcempt', 'key': 'abcempt'},\n {'tag': '535', 'required': '', 'paired': 'abcdg', 'key': 'abcdg'},\n {'tag': '536', 'required': '', 'paired': 'abcdefgh', 'key': 'abcdefgh'},\n {'tag': '538', 'required': 'a', 'paired': 'aiu', 'key': 'aiu'},\n {'tag': '540', 'required': '', 'paired': 'abcdfgqu', 'key': 'abcdfgqu'},\n {'tag': '541', 'required': '', 'paired': 'abcdefhno', 'key': 'abcdefhno'},\n {'tag': '542', 'required': '', 'paired': 'abcdfghijklmopqrsu', 'key': 'abcdfghijklmopqrsu'},\n {'tag': '544', 'required': '', 'paired': 'abcden', 'key': 'abcden'},\n {'tag': '545', 'required': '', 'paired': 'abu', 'key': 'abu'},\n {'tag': '546', 'required': '', 'paired': 'ab', 'key': 'ab'},\n {'tag': '547', 'required': 'a', 'key': 'a'},\n {'tag': '550', 'required': 'a', 'key': 'a'},\n {'tag': '552', 'required': '', 'paired': 'abcdefghijklmnopuz', 'key': 'abcdefghijklmnopuz'},\n {'tag': '555', 'required': 'a', 'paired': 'abcdu', 'key': 'abcdu'},\n {'tag': '556', 'required': 'a', 'key': 'az'},\n {'tag': '561', 'required': 'a', 'key': 'au'},\n {'tag': '562', 'required': '', 'paired': 'abcde', 'key': 'abcde'},\n {'tag': '563', 'required': 'a', 'key': 'au'},\n {'tag': '565', 'required': '', 'paired': 'abc', 'key': 'abc'},\n {'tag': '567', 'required': '', 'paired': 'ab', 'key': 'ab'},\n {'tag': '580', 'required': 'a', 'key': 'a'},\n {'tag': '581', 'required': 'a', 'key': 'a'},\n {'tag': '583', 'required': '', 'paired': 'abcdefhijklnou', 'key': 'abcdefhijklnou'},\n {'tag': '584', 'required': '', 'paired': 'ab', 'key': 'ab'},\n {'tag': '585', 'required': 'a', 'key': 'a'},\n {'tag': '586', 'required': 'a', 'key': 'a'},\n {'tag': '588', 'required': 'a', 'key': 'a'},\n // NB! Currently we never merge 59X fields (see mergableTags.js). Doublish removals such as MELKEHITYS-3147 are handled by postprocessor.\n {'tag': '590', 'required': ''},\n {'tag': '591', 'required': ''},\n {'tag': '592', 'required': ''},\n {'tag': '593', 'required': ''},\n {'tag': '594', 'required': ''},\n {'tag': '595', 'required': ''},\n {'tag': '596', 'required': ''},\n {'tag': '597', 'required': ''},\n {'tag': '598', 'required': ''},\n {'tag': '599', 'required': ''},\n {'tag': '600', 'required': 'a', 'paired': `b${pairedTitleSubfields}vxyz`, 'key': keyX00},\n {'tag': '610', 'required': 'a', 'paired': `b${pairedTitleSubfields}vxyz`, 'key': keyX10},\n {'tag': '611', 'required': 'a', 'paired': `${pairedTitleSubfields}vxyz`, 'key': keyX11},\n {'tag': '630', 'required': 'a', 'paired': `${pairedTitleSubfields}vxyz`, 'key': keyX30},\n // NB! 700, 710 and 711 may have title parts that are handled elsewhere\n {'tag': '647', 'required': 'a', 'paired': 'avxyz', 'key': 'acdgvxyz02'},\n {'tag': '648', 'required': 'a', 'paired': 'avxyz', 'key': 'avxyz02'},\n {'tag': '650', 'required': 'a', 'paired': 'abcdegvxyz', 'key': 'abcdegvxyz20'},\n {'tag': '651', 'required': 'a', 'paired': 'aegvxyz', 'key': 'aegvxyz20'},\n {'tag': '653', 'required': 'a', 'paired': 'a', 'key': 'a'}, // this is interesting as a can be repeated\n {'tag': '654', 'required': '', 'paired': 'abcevxyz'},\n {'tag': '655', 'required': 'a', 'paired': 'abcvxyz', 'key': 'avxyz20'},\n {'tag': '656', 'required': 'a', 'paired': 'akvxyz'}, // N=0\n {'tag': '657', 'required': 'a', 'paired': 'avxyz'}, // N=0\n {'tag': '658', 'required': 'a', 'paired': 'abcd'}, // N=0\n {'tag': '662', 'required': '', 'paired': 'abcdefgh'}, // N=0\n {'tag': '688', 'required': 'a'}, // N=0\n {'tag': '700', 'required': 'a', 'paired': `b${pairedTitleSubfields}x`, 'key': keyX00}, // h/i/m/o/r/s/x are missing from 100, NB! 's' is repeatable, but we are not merging them here!\n {'tag': '710', 'required': 'a', 'paired': `b${pairedTitleSubfields}x`, 'key': keyX10}, // h/j/m/o/r/s/x are missing from 110\n {'tag': '711', 'required': 'a', 'paired': `cdef${pairedTitleSubfields}x`, 'key': keyX11}, // h/i/s/x are missing from 711\n {'tag': '720', 'required': 'a', 'key': 'a'},\n // NB! 730 has no name part, key is used for title part\n {'tag': '730', 'required': 'a', 'paired': `df${pairedTitleSubfields}x`, 'key': keyX30}, // NB: 130->730 magic subfields might not agree...\n {'tag': '740', 'required': 'a', 'key': 'ahnp'},\n {'tag': '751', 'required': 'a', 'key': 'a'}, // N=11, kaikissa pelkk\u00E4 $a\n {'tag': '752', 'required': '', 'key': 'abcdefgh'}, // N=12234\n {'tag': '753', 'required': '', 'key': 'abc'},\n {'tag': '754', 'required': '', 'key': 'acdxz'}, // N=3\n {'tag': '758', 'required': 'a', 'key': 'ai'}, // N=1\n\n {'tag': '760', 'required': 'tw', key: 'twxy'},\n {'tag': '762', 'required': 't', key: 'abcdhmstxy'},\n {'tag': '765', 'required': 't', key: 'abcdhmrstuwxyz'},\n {'tag': '767', 'required': 't', key: 'abcdhmrstuwxyz'},\n {'tag': '770', 'required': 't', 'paired': 'ruxyz', key: 'abcdhmrstuwxyz'},\n {'tag': '772', 'required': 't', key: 'abcdhmrstuwxyz'},\n {'tag': '773', 'required': 'w', key: 'wgq'}, // Kirjav\u00E4litys should not have any component parts. However, this need to be re-thought...\n // Currently we (appently) drop fields that don't contain 773$w...\n {'tag': '774', 'required': '', 'paired': 'nruxyz', 'key': 'npqrstrxyz'},\n {'tag': '775', 'required': '', 'paired': 'ruxyz', 'key': 'abcdefhmstuxyz'},\n {'tag': '776', 'required': '', 'paired': 'ruxyz', 'key': 'abcdhmsuwxyz'},\n {'tag': '777', 'required': '', 'paired': 'ruxyz', 'key': 'abcdhmstuxyz'},\n {'tag': '780', 'required': '', 'paired': 'ruxyz', 'key': 'abcdhmstuxyz'},\n {'tag': '785', 'required': '', 'paired': 'uxyz', 'key': 'abcdhmstuxyz'},\n {'tag': '786', 'required': '', 'paired': 'abcrstuxyz', 'key': 'abcdhijmprstuxyz4'},\n {'tag': '787', 'required': '', 'paired': 'abcdhmstuxyz4'},\n {'tag': '788', 'required': '', 'paired': 'stx', 'key': 'abdestx'},\n {'tag': '800', 'required': 'a', 'paired': 'bt', 'key': keyX00},\n {'tag': '810', 'required': 'a', 'paired': 'bt', 'key': keyX10},\n {'tag': '811', 'required': 'a', 'paired': 't', 'key': keyX11},\n {'tag': '830', 'required': 'a', 'paired': 'np', 'key': keyX30},\n {'tag': '840', 'required': 'a'},\n {'tag': '841', 'required': 'a'},\n {'tag': '842', 'required': 'a'},\n {'tag': '843', 'required': 'a'},\n {'tag': '844', 'required': 'a'},\n {'tag': '845', 'required': 'a'},\n {'tag': '850', 'required': 'a', 'key': 'a'},\n {'tag': '852', 'required': 'a'}, // HMM... we might want to reconsider this...\n {'tag': '853', 'required': 'a'},\n {'tag': '854', 'required': 'a'},\n {'tag': '855', 'required': 'a'},\n {'tag': '856', 'required': 'u', 'paired': 'u', 'key': 'opuw23'}, // 856 is built around $u...\n {'tag': '863', 'required': 'a'},\n {'tag': '864', 'required': 'a'},\n {'tag': '865', 'required': 'a'},\n {'tag': '866', 'required': 'a'},\n {'tag': '867', 'required': 'a'},\n {'tag': '868', 'required': 'a'},\n {'tag': '876', 'required': 'a'},\n {'tag': '877', 'required': 'a'},\n {'tag': '878', 'required': 'a'},\n {'tag': '880', 'required': '', 'paired': 'a', 'key': 'abcdefghijklmnopqrstuvwxyz'},\n {'tag': '881', 'required': ''},\n {'tag': '882', 'required': ''},\n {'tag': '883', 'required': ''},\n {'tag': '884', 'required': '', 'paired': 'agkq'},\n {'tag': '885', 'required': ''},\n {'tag': '886', 'required': ''},\n {'tag': '887', 'required': ''},\n {'tag': '900', 'required': ''},\n {'tag': '901', 'required': ''},\n {'tag': '910', 'required': ''},\n {'tag': '935', 'required': 'a', 'key': 'az'}, // Fono information at least\n {'tag': '940', 'required': ''},\n {'tag': '946', 'required': 'a', 'key': 'abfnp'}, // Copied from 246. However, final version might contain some elements from field 245 as well\n {'tag': '960', 'required': ''},\n {'tag': '973', 'required': 'w', 'key': 'w'}, // Viola multi-hosts\n {'tag': '995', 'required': ''},\n {'tag': 'CAT', 'required': ''},\n {'tag': 'LOW', 'required': ''},\n {'tag': 'SID', 'required': ''}\n];\n\n\nexport function getMergeConstraintsForTag(tag, constraintName = undefined) {\n const tagsConstraintsArray = mergeConstraints.filter(entry => tag === entry.tag);\n if (tagsConstraintsArray.length === 0) {\n debugDev(`WARNING\\tNo key found for ${tag}!`);\n }\n if (!constraintName) {\n return tagsConstraintsArray;\n }\n // NB! should we support multiple contains for a field? Eg. 505$a vs 505($tg)+\n if (tagsConstraintsArray.length > 1) {\n debugDev(`WARNING\\tMultiple values for '${constraintName}' (N=${tagsConstraintsArray.length}) found in ${tag}. Using first values.`);\n }\n //return constraintToValue(tagsConstraintsArray[0], constraintName);\n return tagsConstraintsArray.map(c => constraintToValue(c, constraintName));\n\n function constraintToValue(tagsConstraints, constraintName) {\n if (constraintName in tagsConstraints) {\n return tagsConstraints[constraintName];\n }\n return null; // NB! \"\" might mean \"apply to everything\" (eg. 040.key) while null means that it is not applied.\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["constraintName"]
7
7
  }
@@ -45,7 +45,7 @@ function mergeField2(baseRecord, baseField, sourceField, config, candFieldPairs8
45
45
  const originalBaseValue = fieldToString(baseField);
46
46
  nvdebug(` TRYING TO MERGE SUBFIELD '${subfieldToString(originalSubfield)}' TO '${originalBaseValue}'`, debugDev);
47
47
  const subfieldData = { "tag": sourceField.tag, "code": originalSubfield.code, "originalValue": originalSubfield.value, "normalizedValue": normalizedSubfield.value, "punctuationlessValue": punctlessSubfield.value };
48
- mergeOrAddSubfield(baseField, subfieldData, candFieldPairs880);
48
+ mergeOrAddSubfield(baseField, subfieldData, candFieldPairs880, sourceField);
49
49
  const newValue = fieldToString(baseField);
50
50
  if (originalBaseValue !== newValue) {
51
51
  nvdebug(` SUBFIELD MERGE RESULT: '${newValue}'`, debugDev);
@@ -100,7 +100,7 @@ export function mergeField(baseRecord, sourceRecord, sourceField, config) {
100
100
  delete sourceField.mergeCandidate;
101
101
  return false;
102
102
  }
103
- nvdebug(`mergeField(): Try to merge '${fieldToString(sourceField)}'.`, debugDev);
103
+ nvdebug(`mergeField(): Try to merge '${fieldToString(sourceField)}'.`, debug);
104
104
  const counterpartField = getCounterpart(baseRecord, sourceRecord, sourceField, config);
105
105
  if (counterpartField) {
106
106
  if (sourceRecordIsBetter(counterpartField, sourceField)) {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/merge-fields/mergeField.js"],
4
- "sourcesContent": ["//import {MarcRecord} from '@natlibfi/marc-record';\nimport createDebugLogger from 'debug';\nimport {fieldToString, fieldsToString, fieldsAreIdentical, nvdebug, hasCopyright, removeCopyright, subfieldToString} from '../utils.js';\nimport {fieldGetOccurrenceNumberPairs} from '../subfield6Utils.js';\nimport {cloneAndNormalizeFieldForComparison, cloneAndRemovePunctuation} from '../normalizeFieldForComparison.js';\nimport {mergeOrAddSubfield} from './mergeOrAddSubfield.js';\nimport {mergeIndicators} from './mergeIndicator.js';\nimport {mergableTag} from './mergableTag.js';\nimport {getCounterpart} from './counterpartField.js';\nimport {isEnnakkotietoSubfield} from '../prepublicationUtils.js';\n//import {default as normalizeEncoding} from '@natlibfi/marc-record-validators-melinda/dist/normalize-utf8-diacritics';\n//import {postprocessRecords} from './mergeOrAddPostprocess.js';\n//import {preprocessBeforeAdd} from './processFilter.js';\n\n//const defaultConfig = JSON.parse(fs.readFileSync(path.join(__dirname, '..', '..', 'src', 'reducers', 'config.json'), 'utf8'));\n\n// Specs: https://workgroups.helsinki.fi/x/K1ohCw (though we occasionally differ from them)...\n\nconst debug = createDebugLogger('@natlibfi/melinda-marc-record-merge-reducers:mergeField');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\n// NB! Can we do this via config.json?\nfunction removeEnnakkotieto(field) {\n const tmp = field.subfields.filter(subfield => !isEnnakkotietoSubfield(subfield));\n // remove only iff some other subfield remains\n if (tmp.length > 0) {\n field.subfields = tmp;\n }\n}\n\n\nfunction copyrightYearHack(baseRecord, baseField, sourceField) {\n if (baseField.tag !== '264' || sourceField.tag !== '260') {\n return;\n }\n const relevantSubfields = sourceField.subfields.filter(sf => sf.code === 'c' && hasCopyright(sf.value));\n\n relevantSubfields.forEach(sf => {\n // Add new:\n const value = sf.value.replace(/\\.$/u, '');\n baseRecord.insertField({'tag': '264', 'ind1': ' ', 'ind2': '4', 'subfields': [{'code': 'c', value}]});\n // Modify original subfield:\n sf.value = removeCopyright(sf.value);\n });\n}\n\nfunction mergeField2(baseRecord, baseField, sourceField, config, candFieldPairs880 = []) {\n //// Identical fields\n // No need to check every subfield separately.\n // Also no need to postprocess the resulting field.\n if (fieldToString(baseField) === fieldToString(sourceField)) {\n return baseRecord;\n }\n\n // If a base ennakkotieto is merged with real data, remove ennakkotieto subfield:\n // (If our prepub normalizations are ok, this should not be needed.\n // However, it's simple and works well enough, so let's keep it here.)\n if (baseField.subfields?.find(sf => isEnnakkotietoSubfield(sf)) && !sourceField.subfields?.find(sf => isEnnakkotietoSubfield(sf))) {\n removeEnnakkotieto(baseField);\n baseField.merged = 1;\n }\n\n copyrightYearHack(baseRecord, baseField, sourceField);\n\n mergeIndicators(baseField, sourceField, config);\n\n\n // We want to add the incoming subfields without punctuation, and add puctuation later on.\n // (Cloning is harmless, but probably not needed.)\n // NEW: we also drag the normalized version along. It is needed for the merge-or-add decision\n const normalizedSourceField = cloneAndNormalizeFieldForComparison(sourceField); // This is for comparison\n const strippedSourceField = cloneAndRemovePunctuation(sourceField); // This is for adding subfields\n\n //nvdebug(` MERGING SUBFIELDS OF '${fieldToString(sourceField)}' (original)`, debugDev);\n //nvdebug(` MERGING SUBFIELDS OF '${fieldToString(normalizedSourceField)}' (comparison)`, debugDev);\n nvdebug(` MERGING SUBFIELDS OF '${fieldToString(strippedSourceField)}' (merge/add)`, debugDev);\n\n sourceField.subfields.forEach((originalSubfield, index) => {\n //strippedSourceField.subfields.forEach((subfieldForMergeOrAdd, index) => {\n const normalizedSubfield = normalizedSourceField.subfields[index];\n const punctlessSubfield = strippedSourceField.subfields[index];\n const originalBaseValue = fieldToString(baseField);\n nvdebug(` TRYING TO MERGE SUBFIELD '${subfieldToString(originalSubfield)}' TO '${originalBaseValue}'`, debugDev);\n\n const subfieldData = {'tag': sourceField.tag, 'code': originalSubfield.code, 'originalValue': originalSubfield.value, 'normalizedValue': normalizedSubfield.value, 'punctuationlessValue': punctlessSubfield.value};\n\n mergeOrAddSubfield(baseField, subfieldData, candFieldPairs880); // candSubfield);\n const newValue = fieldToString(baseField);\n if (originalBaseValue !== newValue) {\n nvdebug(` SUBFIELD MERGE RESULT: '${newValue}'`, debugDev);\n //debug(` TODO: sort subfields, handle punctuation...`);\n }\n //else { debugDev(` mergeOrAddSubfield() did not add '\u2021${fieldToString(subfieldForMergeOrAdd)}' to '${originalValue}'`); }\n\n });\n}\n\n\nfunction skipMergeField(baseRecord, sourceField, config) {\n if (!mergableTag(sourceField.tag, config)) {\n nvdebug(`skipMergeField(): field '${fieldToString(sourceField)}' listed as skippable!`, debugDev);\n return true;\n }\n\n // Skip duplicate field when merging two records (NB! internal merge merges/removes the duplicate field):\n if (!baseRecord.internalMerge && baseRecord.fields.some(baseField => !baseField.mergeCandidate && fieldsAreIdentical(sourceField, baseField))) {\n nvdebug(`skipMergeField(): field '${fieldToString(sourceField)}' already exists! No merge required!`, debugDev);\n sourceField.deleted = 1;\n return true;\n }\n\n return false;\n}\n\nfunction sourceRecordIsBetter(baseField, sourceField) {\n if (!baseField.subfields) {\n return;\n }\n // MELINDA-8978: prefer Asteri version\n if (isAsteriField(sourceField) && !isAsteriField(baseField)) {\n return 1;\n }\n\n function isAsteriField(field) {\n if (field.subfields.some(sf => sf.code === '0' && sf.value.match(/^\\((?:FI-ASTERI-[NW]|FIN1[13])\\)[0-9]{9}$/u))) {\n return true;\n }\n }\n return false;\n}\n\nfunction swapDataBetweenFields(field1, field2) {\n // NB! Does not support controlfields yet! Add support if the need arises.\n if (field1.subfields) { // If field1 has subfields, then also field2 has them. No need to check the other field here.\n swapNamedData('ind1');\n swapNamedData('ind2');\n swapNamedData('subfields');\n return;\n }\n return;\n\n function swapNamedData(name) {\n const data = field1[name];\n field1[name] = field2[name];\n field2[name] = data;\n }\n\n}\n\nexport function mergeField(baseRecord, sourceRecord, sourceField, config) {\n nvdebug(`SELF: ${fieldToString(sourceField)}`, debugDev);\n\n sourceField.mergeCandidate = true;\n // skip duplicates and special cases:\n if (skipMergeField(baseRecord, sourceField, config)) {\n nvdebug(`mergeField(): don't merge '${fieldToString(sourceField)}'`, debugDev);\n delete sourceField.mergeCandidate;\n return false;\n }\n\n nvdebug(`mergeField(): Try to merge '${fieldToString(sourceField)}'.`, debugDev);\n const counterpartField = getCounterpart(baseRecord, sourceRecord, sourceField, config);\n\n if (counterpartField) {\n if (sourceRecordIsBetter(counterpartField, sourceField)) {\n swapDataBetweenFields(counterpartField, sourceField);\n }\n\n const candFieldPairs880 = sourceField.tag === '880' ? undefined : fieldGetOccurrenceNumberPairs(sourceField, sourceRecord.fields);\n nvdebug(`mergeField(): Got counterpart: '${fieldToString(counterpartField)}'. Thus try merge...`, debugDev);\n nvdebug(`PAIR: ${candFieldPairs880 ? fieldsToString(candFieldPairs880) : 'NADA'}`, debugDev);\n mergeField2(baseRecord, counterpartField, sourceField, config, candFieldPairs880);\n sourceField.deleted = 1;\n delete sourceField.mergeCandidate;\n return true;\n }\n // NB! Counterpartless field is inserted to 7XX even if field.tag says 1XX:\n debugDev(`mergeField(): No mergable counterpart found for '${fieldToString(sourceField)}'.`);\n delete sourceField.mergeCandidate;\n return false;\n}\n\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["//import {MarcRecord} from '@natlibfi/marc-record';\nimport createDebugLogger from 'debug';\nimport {fieldToString, fieldsToString, fieldsAreIdentical, nvdebug, hasCopyright, removeCopyright, subfieldToString} from '../utils.js';\nimport {fieldGetOccurrenceNumberPairs} from '../subfield6Utils.js';\nimport {cloneAndNormalizeFieldForComparison, cloneAndRemovePunctuation} from '../normalizeFieldForComparison.js';\nimport {mergeOrAddSubfield} from './mergeOrAddSubfield.js';\nimport {mergeIndicators} from './mergeIndicator.js';\nimport {mergableTag} from './mergableTag.js';\nimport {getCounterpart} from './counterpartField.js';\nimport {isEnnakkotietoSubfield} from '../prepublicationUtils.js';\n//import {default as normalizeEncoding} from '@natlibfi/marc-record-validators-melinda/dist/normalize-utf8-diacritics';\n//import {postprocessRecords} from './mergeOrAddPostprocess.js';\n//import {preprocessBeforeAdd} from './processFilter.js';\n\n//const defaultConfig = JSON.parse(fs.readFileSync(path.join(__dirname, '..', '..', 'src', 'reducers', 'config.json'), 'utf8'));\n\n// Specs: https://workgroups.helsinki.fi/x/K1ohCw (though we occasionally differ from them)...\n\nconst debug = createDebugLogger('@natlibfi/melinda-marc-record-merge-reducers:mergeField');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\n// NB! Can we do this via config.json?\nfunction removeEnnakkotieto(field) {\n const tmp = field.subfields.filter(subfield => !isEnnakkotietoSubfield(subfield));\n // remove only iff some other subfield remains\n if (tmp.length > 0) {\n field.subfields = tmp;\n }\n}\n\n\nfunction copyrightYearHack(baseRecord, baseField, sourceField) {\n if (baseField.tag !== '264' || sourceField.tag !== '260') {\n return;\n }\n const relevantSubfields = sourceField.subfields.filter(sf => sf.code === 'c' && hasCopyright(sf.value));\n\n relevantSubfields.forEach(sf => {\n // Add new:\n const value = sf.value.replace(/\\.$/u, '');\n baseRecord.insertField({'tag': '264', 'ind1': ' ', 'ind2': '4', 'subfields': [{'code': 'c', value}]});\n // Modify original subfield:\n sf.value = removeCopyright(sf.value);\n });\n}\n\nfunction mergeField2(baseRecord, baseField, sourceField, config, candFieldPairs880 = []) {\n //// Identical fields\n // No need to check every subfield separately.\n // Also no need to postprocess the resulting field.\n if (fieldToString(baseField) === fieldToString(sourceField)) {\n return baseRecord;\n }\n\n // If a base ennakkotieto is merged with real data, remove ennakkotieto subfield:\n // (If our prepub normalizations are ok, this should not be needed.\n // However, it's simple and works well enough, so let's keep it here.)\n if (baseField.subfields?.find(sf => isEnnakkotietoSubfield(sf)) && !sourceField.subfields?.find(sf => isEnnakkotietoSubfield(sf))) {\n removeEnnakkotieto(baseField);\n baseField.merged = 1;\n }\n\n copyrightYearHack(baseRecord, baseField, sourceField);\n\n mergeIndicators(baseField, sourceField, config);\n\n\n // We want to add the incoming subfields without punctuation, and add puctuation later on.\n // (Cloning is harmless, but probably not needed.)\n // NEW: we also drag the normalized version along. It is needed for the merge-or-add decision\n const normalizedSourceField = cloneAndNormalizeFieldForComparison(sourceField); // This is for comparison\n const strippedSourceField = cloneAndRemovePunctuation(sourceField); // This is for adding subfields\n\n //nvdebug(` MERGING SUBFIELDS OF '${fieldToString(sourceField)}' (original)`, debugDev);\n //nvdebug(` MERGING SUBFIELDS OF '${fieldToString(normalizedSourceField)}' (comparison)`, debugDev);\n nvdebug(` MERGING SUBFIELDS OF '${fieldToString(strippedSourceField)}' (merge/add)`, debugDev);\n\n sourceField.subfields.forEach((originalSubfield, index) => {\n //strippedSourceField.subfields.forEach((subfieldForMergeOrAdd, index) => {\n const normalizedSubfield = normalizedSourceField.subfields[index];\n const punctlessSubfield = strippedSourceField.subfields[index];\n const originalBaseValue = fieldToString(baseField);\n nvdebug(` TRYING TO MERGE SUBFIELD '${subfieldToString(originalSubfield)}' TO '${originalBaseValue}'`, debugDev);\n\n const subfieldData = {'tag': sourceField.tag, 'code': originalSubfield.code, 'originalValue': originalSubfield.value, 'normalizedValue': normalizedSubfield.value, 'punctuationlessValue': punctlessSubfield.value};\n\n mergeOrAddSubfield(baseField, subfieldData, candFieldPairs880, sourceField); // candSubfield);\n const newValue = fieldToString(baseField);\n if (originalBaseValue !== newValue) {\n nvdebug(` SUBFIELD MERGE RESULT: '${newValue}'`, debugDev);\n //debug(` TODO: sort subfields, handle punctuation...`);\n }\n //else { debugDev(` mergeOrAddSubfield() did not add '\u2021${fieldToString(subfieldForMergeOrAdd)}' to '${originalValue}'`); }\n\n });\n}\n\n\nfunction skipMergeField(baseRecord, sourceField, config) {\n if (!mergableTag(sourceField.tag, config)) {\n nvdebug(`skipMergeField(): field '${fieldToString(sourceField)}' listed as skippable!`, debugDev);\n return true;\n }\n\n // Skip duplicate field when merging two records (NB! internal merge merges/removes the duplicate field):\n if (!baseRecord.internalMerge && baseRecord.fields.some(baseField => !baseField.mergeCandidate && fieldsAreIdentical(sourceField, baseField))) {\n nvdebug(`skipMergeField(): field '${fieldToString(sourceField)}' already exists! No merge required!`, debugDev);\n sourceField.deleted = 1;\n return true;\n }\n\n return false;\n}\n\nfunction sourceRecordIsBetter(baseField, sourceField) {\n if (!baseField.subfields) {\n return;\n }\n // MELINDA-8978: prefer Asteri version\n if (isAsteriField(sourceField) && !isAsteriField(baseField)) {\n return 1;\n }\n\n function isAsteriField(field) {\n if (field.subfields.some(sf => sf.code === '0' && sf.value.match(/^\\((?:FI-ASTERI-[NW]|FIN1[13])\\)[0-9]{9}$/u))) {\n return true;\n }\n }\n return false;\n}\n\nfunction swapDataBetweenFields(field1, field2) {\n // NB! Does not support controlfields yet! Add support if the need arises.\n if (field1.subfields) { // If field1 has subfields, then also field2 has them. No need to check the other field here.\n swapNamedData('ind1');\n swapNamedData('ind2');\n swapNamedData('subfields');\n return;\n }\n return;\n\n function swapNamedData(name) {\n const data = field1[name];\n field1[name] = field2[name];\n field2[name] = data;\n }\n\n}\n\nexport function mergeField(baseRecord, sourceRecord, sourceField, config) {\n nvdebug(`SELF: ${fieldToString(sourceField)}`, debugDev);\n\n sourceField.mergeCandidate = true;\n // skip duplicates and special cases:\n if (skipMergeField(baseRecord, sourceField, config)) {\n nvdebug(`mergeField(): don't merge '${fieldToString(sourceField)}'`, debugDev);\n delete sourceField.mergeCandidate;\n return false;\n }\n\n nvdebug(`mergeField(): Try to merge '${fieldToString(sourceField)}'.`, debug);\n const counterpartField = getCounterpart(baseRecord, sourceRecord, sourceField, config);\n\n if (counterpartField) {\n if (sourceRecordIsBetter(counterpartField, sourceField)) {\n swapDataBetweenFields(counterpartField, sourceField);\n }\n\n const candFieldPairs880 = sourceField.tag === '880' ? undefined : fieldGetOccurrenceNumberPairs(sourceField, sourceRecord.fields);\n nvdebug(`mergeField(): Got counterpart: '${fieldToString(counterpartField)}'. Thus try merge...`, debugDev);\n nvdebug(`PAIR: ${candFieldPairs880 ? fieldsToString(candFieldPairs880) : 'NADA'}`, debugDev);\n mergeField2(baseRecord, counterpartField, sourceField, config, candFieldPairs880);\n sourceField.deleted = 1;\n delete sourceField.mergeCandidate;\n return true;\n }\n // NB! Counterpartless field is inserted to 7XX even if field.tag says 1XX:\n debugDev(`mergeField(): No mergable counterpart found for '${fieldToString(sourceField)}'.`);\n delete sourceField.mergeCandidate;\n return false;\n}\n\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -27,13 +27,27 @@ function dataContainsPrepublicationSubfield(candSubfieldData) {
27
27
  }
28
28
  return false;
29
29
  }
30
- function mergeOrAddSubfieldNotRequiredSpecialCases(targetField, candSubfieldData) {
30
+ function mergeOrAddSubfieldNotRequiredSpecialCases(targetField, candSubfieldData, sourceField) {
31
31
  if (targetField.tag.charAt(0) === "1" && candSubfieldData.tag.charAt(0) === "7" && candSubfieldData.code === "9" && candSubfieldData.originalValue.match(/<KEEP>/u)) {
32
32
  return true;
33
33
  }
34
34
  if (!valueCarriesMeaning(targetField.tag, candSubfieldData.code, candSubfieldData.normalizedValue)) {
35
35
  return true;
36
36
  }
37
+ if (targetField.subfields.some((sf) => sf.code === "0") && sourceField && !sourceField.subfields.some((sf) => sf.code === "0")) {
38
+ if (["100", "600", "700", "800"].includes(targetField.tag) && ["a", "b", "c", "d", "q"].includes(candSubfieldData.code)) {
39
+ return true;
40
+ }
41
+ if (["110", "610", "710", "810"].includes(targetField.tag) && ["a", "b"].includes(candSubfieldData.code)) {
42
+ return true;
43
+ }
44
+ if (["111", "611", "711", "811"].includes(targetField.tag) && ["a"].includes(candSubfieldData.code)) {
45
+ return true;
46
+ }
47
+ if (["130", "630", "730", "830"].includes(targetField.tag) && ["a", "n", "p"].includes(candSubfieldData.code)) {
48
+ return true;
49
+ }
50
+ }
37
51
  const alephIdentifierType = normalizeAs(targetField.tag, candSubfieldData.code);
38
52
  if (alephIdentifierType !== void 0) {
39
53
  const normalizedSubfieldValue = normalizeControlSubfieldValue(candSubfieldData.originalValue, alephIdentifierType);
@@ -52,11 +66,11 @@ function skipNormalizedComparison(tag, subfieldCode, subfieldValue) {
52
66
  }
53
67
  return false;
54
68
  }
55
- function mergeOrAddSubfieldNotRequired(targetField, candSubfieldData) {
69
+ function mergeOrAddSubfieldNotRequired(targetField, candSubfieldData, sourceField) {
56
70
  if (catalogingSourceModifyingAgencyCandIsOriginalCatalogingSourceAgencyInTargetField(targetField, candSubfieldData) || dataContainsPrepublicationSubfield(candSubfieldData)) {
57
71
  return true;
58
72
  }
59
- if (mergeOrAddSubfieldNotRequiredSpecialCases(targetField, candSubfieldData)) {
73
+ if (mergeOrAddSubfieldNotRequiredSpecialCases(targetField, candSubfieldData, sourceField)) {
60
74
  return true;
61
75
  }
62
76
  const relevantTargetSubfields = targetField.subfields.filter((sf) => sf.code === candSubfieldData.code);
@@ -108,11 +122,11 @@ function resetPaired880(candFieldPair880, targetField, punctlessCandSubfield) {
108
122
  nvdebug(`880 contents: ${fieldToString(candFieldPair880)}`, debugDev);
109
123
  resetSubfield6Tag(candFieldPair880.subfields[0], targetField.tag);
110
124
  }
111
- export function mergeOrAddSubfield(targetField, candSubfieldData, candFieldPairs880 = []) {
125
+ export function mergeOrAddSubfield(targetField, candSubfieldData, candFieldPairs880 = [], sourceField) {
112
126
  const candSubfieldAsString = `${candSubfieldData.code} ${candSubfieldData.originalValue}`;
113
127
  nvdebug(` Q: mergeOrAddSubfield '${candSubfieldAsString}'
114
128
  with field '${fieldToString(targetField)}'?`, debugDev);
115
- if (mergeOrAddSubfieldNotRequired(targetField, candSubfieldData)) {
129
+ if (mergeOrAddSubfieldNotRequired(targetField, candSubfieldData, sourceField)) {
116
130
  nvdebug(` A: No. No need to merge nor to add the subfield '${candSubfieldAsString}'`, debugDev);
117
131
  return;
118
132
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/merge-fields/mergeOrAddSubfield.js"],
4
- "sourcesContent": ["import createDebugLogger from 'debug';\nimport {cloneAndNormalizeFieldForComparison} from '../normalizeFieldForComparison.js';\nimport {normalizeAs, normalizeControlSubfieldValue} from '../normalize-identifiers.js';\nimport {fieldHasSubfield, fieldToString, isContentSubfieldCode, nvdebug, subfieldIsRepeatable, subfieldToString} from '../utils.js';\nimport {mergeSubfield} from './mergeSubfield.js';\nimport {sortAdjacentSubfields} from '../sortSubfields.js';\n\nimport {valueCarriesMeaning} from './worldKnowledge.js';\nimport {resetSubfield6Tag} from '../subfield6Utils.js';\nimport {isEnnakkotietoSubfield} from '../prepublicationUtils.js';\n\nconst debug = createDebugLogger('@natlibfi/melinda-marc-record-merge-reducers:mergeOrAddSubfield');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\nfunction catalogingSourceModifyingAgencyCandIsOriginalCatalogingSourceAgencyInTargetField(targetField, candSubfieldData) {\n if (targetField.tag !== '040' || candSubfieldData.code !== 'd') {\n return false;\n }\n nvdebug(`${fieldToString(targetField)} vs $d ${candSubfieldData.originalValue}}`, debugDev);\n // Add hard-coded exceptions here\n if (targetField.subfields.some(sf => sf.code === 'a' && sf.value === candSubfieldData.originalValue)) {\n nvdebug('040\u2021d matched 040\u2021a', debugDev);\n return true;\n }\n return false;\n}\n\nfunction dataContainsPrepublicationSubfield(candSubfieldData) {\n if (isEnnakkotietoSubfield({'code': candSubfieldData.code, 'value': candSubfieldData.originalValue})) {\n // Skip just \u2021g subfield or the whole field?\n // We decided to skip just this subfield. We want at least $0 and maybe even more from ennakkotieto.\n debugDev(`Skip '\u2021${candSubfieldData.code} ${candSubfieldData.originalValue}'`);\n return true;\n }\n return false;\n}\n\n\nfunction mergeOrAddSubfieldNotRequiredSpecialCases(targetField, candSubfieldData) {\n\n // Don't bring WHATEVER<KEEP> from source 7XX to base 1XX.\n // Exceptionally we can merge <KEEP>ed 7XX with un-<KEEP>ed 1XX as 1XX should not use <KEEP>s.\n if (targetField.tag.charAt(0) === '1' && candSubfieldData.tag.charAt(0) === '7' && candSubfieldData.code === '9' && candSubfieldData.originalValue.match(/<KEEP>/u)) {\n return true;\n }\n\n // Don't add 264$b 'Kustannuspaikka tuntematon' etc\n if (!valueCarriesMeaning(targetField.tag, candSubfieldData.code, candSubfieldData.normalizedValue)) {\n return true;\n }\n\n\n // Don't add $0 subfields that mean the same even if they look different:\n const alephIdentifierType = normalizeAs(targetField.tag, candSubfieldData.code);\n if (alephIdentifierType !== undefined) {\n const normalizedSubfieldValue = normalizeControlSubfieldValue(candSubfieldData.originalValue, alephIdentifierType);\n if (targetField.subfields.some(sf => normalizeControlSubfieldValue(sf.value) === normalizedSubfieldValue && sf.code === candSubfieldData.code)) {\n return true;\n }\n }\n return false;\n}\n\n\nfunction skipNormalizedComparison(tag, subfieldCode, subfieldValue) {\n if (tag === '020' && subfieldCode === 'a') {\n return true;\n }\n // Hackish: we want 'ntamo' to win 'Ntamo'...\n // If there are other similar excepting put them into an array.\n if (['110', '610', '710', '810'].includes(tag) && subfieldCode === 'a' && subfieldValue.substring(0, 5) === 'ntamo') {\n return true;\n }\n return false;\n}\n\nfunction mergeOrAddSubfieldNotRequired(targetField, candSubfieldData) {\n if (catalogingSourceModifyingAgencyCandIsOriginalCatalogingSourceAgencyInTargetField(targetField, candSubfieldData) || dataContainsPrepublicationSubfield(candSubfieldData)) {\n return true;\n }\n\n if (mergeOrAddSubfieldNotRequiredSpecialCases(targetField, candSubfieldData)) {\n return true;\n }\n\n const relevantTargetSubfields = targetField.subfields.filter(sf => sf.code === candSubfieldData.code);\n // Target field does not have this subfield yet:\n if (relevantTargetSubfields.length === 0) {\n return false;\n }\n nvdebug(` Look for identical subfields in '${fieldToString(targetField)}' using`, debugDev);\n nvdebug(` ORIG. \u2021${candSubfieldData.code} ${candSubfieldData.originalValue}`, debugDev);\n nvdebug(` NO-PUNC \u2021${candSubfieldData.code} ${candSubfieldData.punctuationlessValue}`, debugDev);\n if (relevantTargetSubfields.some(sf => sf.code === candSubfieldData.code && sf.value === candSubfieldData.originalValue)) {\n return true;\n }\n if (relevantTargetSubfields.some(sf => sf.code === candSubfieldData.code && sf.value === candSubfieldData.punctuationlessValue)) {\n return true;\n }\n\n if (!skipNormalizedComparison(targetField.tag, candSubfieldData.code, candSubfieldData.originalValue)) {\n const normalizedTargetField = cloneAndNormalizeFieldForComparison(targetField);\n nvdebug(` Look for identical normalized subfields in '${fieldToString(normalizedTargetField)}'`, debugDev);\n nvdebug(` NO-PUNC \u2021${candSubfieldData.code} ${candSubfieldData.normalizedValue})`, debugDev);\n\n if (normalizedTargetField.subfields.some(sf => sf.code === candSubfieldData.code && sf.value === candSubfieldData.normalizedValue)) {\n // Subfield with identical normalized value exists. Do nothing.\n // Not ideal 382\u2021n subfields, I guess... Nor 505\u2021trg repetitions... These need to be fixed...\n return true;\n }\n }\n\n return false; // (note that this is a double negation: not required is false)\n}\n\nfunction addSubfield(targetField, candSubfield) {\n nvdebug(` Added subfield '${subfieldToString(candSubfield)}' to field`, debugDev);\n // Add subfield to the end of all subfields. NB! Implement a separate function that does this + subfield reordering somehow...\n targetField.subfields.push(candSubfield);\n\n targetField.merged = 1;\n\n setPunctuationFlag(targetField, candSubfield);\n sortAdjacentSubfields(targetField);\n\n}\n\nfunction setPunctuationFlag(field, addedSubfield) {\n if (!isContentSubfieldCode(addedSubfield.code, field.tag)) { // These are never punctuation related\n return;\n }\n field.useExternalEndPunctuation = 1;\n}\n\n\nfunction resetPaired880(candFieldPair880, targetField, punctlessCandSubfield) {\n // No relevant:\n if (punctlessCandSubfield.code !== '6') {\n return;\n }\n if (targetField.tag === '880') {\n return;\n }\n // NB! $6 comes first:\n if (candFieldPair880 === undefined || !candFieldPair880.subfields || candFieldPair880.subfields[0].code !== '6') {\n return;\n\n }\n nvdebug(`880 contents: ${fieldToString(candFieldPair880)}`, debugDev);\n resetSubfield6Tag(candFieldPair880.subfields[0], targetField.tag);\n}\n\nexport function mergeOrAddSubfield(targetField, candSubfieldData, candFieldPairs880 = []) {\n\n const candSubfieldAsString = `${candSubfieldData.code} ${candSubfieldData.originalValue}`;\n\n nvdebug(` Q: mergeOrAddSubfield '${candSubfieldAsString}'\\n with field '${fieldToString(targetField)}'?`, debugDev);\n if (mergeOrAddSubfieldNotRequired(targetField, candSubfieldData)) {\n nvdebug(` A: No. No need to merge nor to add the subfield '${candSubfieldAsString}'`, debugDev);\n return;\n }\n\n const candSubfield = {'code': candSubfieldData.code, 'value': candSubfieldData.punctuationlessValue};\n\n // Currently only for X00$d 1984- => 1984-2000 type of changes, where source version is better that what base has.\n // It all other cases the original subfield is kept.\n const original = fieldToString(targetField);\n\n if (mergeSubfield(targetField, candSubfield)) { // We might need the normalizedCandSubfield later on\n mergeSubfieldPostprocessor();\n return;\n }\n\n // Subfield codes missing from the original record can be added by default:\n if (addSubfieldWithPreviouslyUnseenSubfieldCode()) {\n return;\n }\n\n // melindaCustomMergeFields.json tells us whether the subfield is repeatable or not:\n if (subfieldIsRepeatable(targetField.tag, candSubfield.code)) {\n // We don't want to add multiple, say, 260$c\n if (['260', '264'].includes(targetField.tag)) {\n nvdebug(` A: Exceptionally skip repeatable existing subfield '${subfieldToString(candSubfield)}'`, debugDev);\n return;\n }\n nvdebug(` A: Yes. Add repeatable subfield '${subfieldToString(candSubfield)}'`, debugDev);\n targetField.merged = 1;\n setPunctuationFlag(targetField, candSubfield);\n addSubfield(targetField, candSubfield);\n return;\n }\n\n nvdebug(` A: No. Non-repeatable subfield '${subfieldToString(candSubfield)}'`, debugDev);\n return;\n\n function mergeSubfieldPostprocessor() {\n if (original !== fieldToString(targetField)) {\n nvdebug(` A: Merge. Subfield '${candSubfieldAsString}' replaces the original subfield.`, debugDev);\n targetField.merged = 1;\n setPunctuationFlag(targetField, candSubfield);\n return;\n }\n nvdebug(` A: No. Field ${original} already had the same or a synonymous or a better merge candidate than our subfield '${candSubfieldAsString}'.`, debugDev);\n return;\n }\n\n function addSubfieldWithPreviouslyUnseenSubfieldCode() {\n if (!fieldHasSubfield(targetField, candSubfield.code)) {\n nvdebug(` A: Yes. Add previously unseen subfield '${subfieldToString(candSubfield)}'`, debugDev);\n targetField.merged = 1;\n setPunctuationFlag(targetField, candSubfield);\n candFieldPairs880.forEach(pair => resetPaired880(pair, targetField, candSubfield));\n addSubfield(targetField, candSubfield);\n return true;\n }\n return false;\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import createDebugLogger from 'debug';\nimport {cloneAndNormalizeFieldForComparison} from '../normalizeFieldForComparison.js';\nimport {normalizeAs, normalizeControlSubfieldValue} from '../normalize-identifiers.js';\nimport {fieldHasSubfield, fieldToString, isContentSubfieldCode, nvdebug, subfieldIsRepeatable, subfieldToString} from '../utils.js';\nimport {mergeSubfield} from './mergeSubfield.js';\nimport {sortAdjacentSubfields} from '../sortSubfields.js';\n\nimport {valueCarriesMeaning} from './worldKnowledge.js';\nimport {resetSubfield6Tag} from '../subfield6Utils.js';\nimport {isEnnakkotietoSubfield} from '../prepublicationUtils.js';\n\nconst debug = createDebugLogger('@natlibfi/melinda-marc-record-merge-reducers:mergeOrAddSubfield');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\nfunction catalogingSourceModifyingAgencyCandIsOriginalCatalogingSourceAgencyInTargetField(targetField, candSubfieldData) {\n if (targetField.tag !== '040' || candSubfieldData.code !== 'd') {\n return false;\n }\n nvdebug(`${fieldToString(targetField)} vs $d ${candSubfieldData.originalValue}}`, debugDev);\n // Add hard-coded exceptions here\n if (targetField.subfields.some(sf => sf.code === 'a' && sf.value === candSubfieldData.originalValue)) {\n nvdebug('040\u2021d matched 040\u2021a', debugDev);\n return true;\n }\n return false;\n}\n\nfunction dataContainsPrepublicationSubfield(candSubfieldData) {\n if (isEnnakkotietoSubfield({'code': candSubfieldData.code, 'value': candSubfieldData.originalValue})) {\n // Skip just \u2021g subfield or the whole field?\n // We decided to skip just this subfield. We want at least $0 and maybe even more from ennakkotieto.\n debugDev(`Skip '\u2021${candSubfieldData.code} ${candSubfieldData.originalValue}'`);\n return true;\n }\n return false;\n}\n\n\nfunction mergeOrAddSubfieldNotRequiredSpecialCases(targetField, candSubfieldData, sourceField) {\n\n // Don't bring WHATEVER<KEEP> from source 7XX to base 1XX.\n // Exceptionally we can merge <KEEP>ed 7XX with un-<KEEP>ed 1XX as 1XX should not use <KEEP>s.\n if (targetField.tag.charAt(0) === '1' && candSubfieldData.tag.charAt(0) === '7' && candSubfieldData.code === '9' && candSubfieldData.originalValue.match(/<KEEP>/u)) {\n return true;\n }\n\n // Don't add 264$b 'Kustannuspaikka tuntematon' etc\n if (!valueCarriesMeaning(targetField.tag, candSubfieldData.code, candSubfieldData.normalizedValue)) {\n return true;\n }\n\n // Authorized fields: don't add data that in covered by authorization:\n // (Even if, say 100$d exists and is correct, the authorized row does not want it!)\n if (targetField.subfields.some(sf => sf.code === '0') && sourceField && !sourceField.subfields.some(sf => sf.code === '0')) {\n // FIN13 should also remove $t etc work related subfield...\n if (['100', '600', '700', '800'].includes(targetField.tag) && ['a', 'b', 'c', 'd', 'q'].includes(candSubfieldData.code)) {\n return true;\n }\n // X10: Asteri has only $a and $b extensively: 53601 a, 10862 b, 34 d, 16 c, 10 n, 1 t\n if (['110', '610', '710', '810'].includes(targetField.tag) && ['a', 'b'].includes(candSubfieldData.code)) {\n return true;\n }\n // X11: 1388 a, 72 d, 63 c, 43 n, 11 e\n if (['111', '611', '711', '811'].includes(targetField.tag) && ['a'].includes(candSubfieldData.code)) {\n return true;\n }\n\n if (['130', '630', '730', '830'].includes(targetField.tag) && ['a', 'n', 'p'].includes(candSubfieldData.code)) {\n return true;\n }\n\n }\n\n\n\n // Don't add $0 subfields that mean the same even if they look different:\n const alephIdentifierType = normalizeAs(targetField.tag, candSubfieldData.code);\n if (alephIdentifierType !== undefined) {\n const normalizedSubfieldValue = normalizeControlSubfieldValue(candSubfieldData.originalValue, alephIdentifierType);\n if (targetField.subfields.some(sf => normalizeControlSubfieldValue(sf.value) === normalizedSubfieldValue && sf.code === candSubfieldData.code)) {\n return true;\n }\n }\n return false;\n}\n\n\nfunction skipNormalizedComparison(tag, subfieldCode, subfieldValue) {\n if (tag === '020' && subfieldCode === 'a') {\n return true;\n }\n // Hackish: we want 'ntamo' to win 'Ntamo'...\n // If there are other similar excepting put them into an array.\n if (['110', '610', '710', '810'].includes(tag) && subfieldCode === 'a' && subfieldValue.substring(0, 5) === 'ntamo') {\n return true;\n }\n return false;\n}\n\nfunction mergeOrAddSubfieldNotRequired(targetField, candSubfieldData, sourceField) {\n if (catalogingSourceModifyingAgencyCandIsOriginalCatalogingSourceAgencyInTargetField(targetField, candSubfieldData) || dataContainsPrepublicationSubfield(candSubfieldData)) {\n return true;\n }\n\n if (mergeOrAddSubfieldNotRequiredSpecialCases(targetField, candSubfieldData, sourceField)) {\n return true;\n }\n\n const relevantTargetSubfields = targetField.subfields.filter(sf => sf.code === candSubfieldData.code);\n // Target field does not have this subfield yet:\n if (relevantTargetSubfields.length === 0) {\n return false;\n }\n nvdebug(` Look for identical subfields in '${fieldToString(targetField)}' using`, debugDev);\n nvdebug(` ORIG. \u2021${candSubfieldData.code} ${candSubfieldData.originalValue}`, debugDev);\n nvdebug(` NO-PUNC \u2021${candSubfieldData.code} ${candSubfieldData.punctuationlessValue}`, debugDev);\n if (relevantTargetSubfields.some(sf => sf.code === candSubfieldData.code && sf.value === candSubfieldData.originalValue)) {\n return true;\n }\n if (relevantTargetSubfields.some(sf => sf.code === candSubfieldData.code && sf.value === candSubfieldData.punctuationlessValue)) {\n return true;\n }\n\n if (!skipNormalizedComparison(targetField.tag, candSubfieldData.code, candSubfieldData.originalValue)) {\n const normalizedTargetField = cloneAndNormalizeFieldForComparison(targetField);\n nvdebug(` Look for identical normalized subfields in '${fieldToString(normalizedTargetField)}'`, debugDev);\n nvdebug(` NO-PUNC \u2021${candSubfieldData.code} ${candSubfieldData.normalizedValue})`, debugDev);\n\n if (normalizedTargetField.subfields.some(sf => sf.code === candSubfieldData.code && sf.value === candSubfieldData.normalizedValue)) {\n // Subfield with identical normalized value exists. Do nothing.\n // Not ideal 382\u2021n subfields, I guess... Nor 505\u2021trg repetitions... These need to be fixed...\n return true;\n }\n }\n\n return false; // (note that this is a double negation: not required is false)\n}\n\nfunction addSubfield(targetField, candSubfield) {\n nvdebug(` Added subfield '${subfieldToString(candSubfield)}' to field`, debugDev);\n // Add subfield to the end of all subfields. NB! Implement a separate function that does this + subfield reordering somehow...\n targetField.subfields.push(candSubfield);\n\n targetField.merged = 1;\n\n setPunctuationFlag(targetField, candSubfield);\n sortAdjacentSubfields(targetField);\n\n}\n\nfunction setPunctuationFlag(field, addedSubfield) {\n if (!isContentSubfieldCode(addedSubfield.code, field.tag)) { // These are never punctuation related\n return;\n }\n field.useExternalEndPunctuation = 1;\n}\n\n\nfunction resetPaired880(candFieldPair880, targetField, punctlessCandSubfield) {\n // No relevant:\n if (punctlessCandSubfield.code !== '6') {\n return;\n }\n if (targetField.tag === '880') {\n return;\n }\n // NB! $6 comes first:\n if (candFieldPair880 === undefined || !candFieldPair880.subfields || candFieldPair880.subfields[0].code !== '6') {\n return;\n\n }\n nvdebug(`880 contents: ${fieldToString(candFieldPair880)}`, debugDev);\n resetSubfield6Tag(candFieldPair880.subfields[0], targetField.tag);\n}\n\nexport function mergeOrAddSubfield(targetField, candSubfieldData, candFieldPairs880 = [], sourceField) {\n\n const candSubfieldAsString = `${candSubfieldData.code} ${candSubfieldData.originalValue}`;\n\n nvdebug(` Q: mergeOrAddSubfield '${candSubfieldAsString}'\\n with field '${fieldToString(targetField)}'?`, debugDev);\n if (mergeOrAddSubfieldNotRequired(targetField, candSubfieldData, sourceField)) {\n nvdebug(` A: No. No need to merge nor to add the subfield '${candSubfieldAsString}'`, debugDev);\n return;\n }\n\n const candSubfield = {'code': candSubfieldData.code, 'value': candSubfieldData.punctuationlessValue};\n\n // Currently only for X00$d 1984- => 1984-2000 type of changes, where source version is better that what base has.\n // It all other cases the original subfield is kept.\n const original = fieldToString(targetField);\n\n if (mergeSubfield(targetField, candSubfield)) { // We might need the normalizedCandSubfield later on\n mergeSubfieldPostprocessor();\n return;\n }\n\n // Subfield codes missing from the original record can be added by default:\n if (addSubfieldWithPreviouslyUnseenSubfieldCode()) {\n return;\n }\n\n // melindaCustomMergeFields.json tells us whether the subfield is repeatable or not:\n if (subfieldIsRepeatable(targetField.tag, candSubfield.code)) {\n // We don't want to add multiple, say, 260$c\n if (['260', '264'].includes(targetField.tag)) {\n nvdebug(` A: Exceptionally skip repeatable existing subfield '${subfieldToString(candSubfield)}'`, debugDev);\n return;\n }\n nvdebug(` A: Yes. Add repeatable subfield '${subfieldToString(candSubfield)}'`, debugDev);\n targetField.merged = 1;\n setPunctuationFlag(targetField, candSubfield);\n addSubfield(targetField, candSubfield);\n return;\n }\n\n nvdebug(` A: No. Non-repeatable subfield '${subfieldToString(candSubfield)}'`, debugDev);\n return;\n\n function mergeSubfieldPostprocessor() {\n if (original !== fieldToString(targetField)) {\n nvdebug(` A: Merge. Subfield '${candSubfieldAsString}' replaces the original subfield.`, debugDev);\n targetField.merged = 1;\n setPunctuationFlag(targetField, candSubfield);\n return;\n }\n nvdebug(` A: No. Field ${original} already had the same or a synonymous or a better merge candidate than our subfield '${candSubfieldAsString}'.`, debugDev);\n return;\n }\n\n function addSubfieldWithPreviouslyUnseenSubfieldCode() {\n if (!fieldHasSubfield(targetField, candSubfield.code)) {\n nvdebug(` A: Yes. Add previously unseen subfield '${subfieldToString(candSubfield)}'`, debugDev);\n targetField.merged = 1;\n setPunctuationFlag(targetField, candSubfield);\n candFieldPairs880.forEach(pair => resetPaired880(pair, targetField, candSubfield));\n addSubfield(targetField, candSubfield);\n return true;\n }\n return false;\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -78,7 +78,7 @@ const cleanPuncBeforeLanguage = { "code": "atvxyz", "followedBy": "l", "context"
78
78
  const addX00aComma = { "add": ",", "code": "abcqejt", "followedBy": "cdegnr", "context": doesNotEndInPunc, "contextRHS": allowsPuncRHS };
79
79
  const addX00dComma = { "name": 'X00$d ending in "-" does not get comma', "add": ",", "code": "d", "followedBy": "cdeg", "context": /[^-,.!]$/u, "contextRHS": allowsPuncRHS };
80
80
  const addX00aComma2 = { "add": ",", "code": "abcdej", "followedBy": "cdeg", "context": /(?:[A-Z]|Å|Ä|Ö)\.$/u, "contextRHS": allowsPuncRHS };
81
- const addX00Dot = { "add": ".", "code": "abcdetv", "followedBy": "fklptu", "context": needsPuncAfterAlphanumeric };
81
+ const addX00Dot = { "name": "addX00Dot", "add": ".", "code": "abcdetv", "followedBy": "fklptu", "context": needsPuncAfterAlphanumeric };
82
82
  const addEntryFieldFinalDot = { "name": "X00 final dot", "add": ".", "code": "abcdefghijklmnopqrstuvwxyz", "followedBy": "#", "context": /[^.)!?-]$/u };
83
83
  const addXX0iColon = { name: "Punctuate relationship information", add: ":", code: "i", context: defaultNeedsPuncAfter2 };
84
84
  const addX10bDot = { "name": "Add X10 pre-$b dot", "add": ".", "code": "ab", "followedBy": "b", "context": defaultNeedsPuncAfter2 };
@@ -87,7 +87,7 @@ const addX10Dot = { "name": "Add X10 final dot", "add": ".", "code": "abet", "fo
87
87
  const addColonToRelationshipInformation = { "name": "Add ':' to 7X0 $i relationship info", "add": ":", "code": "i", "context": defaultNeedsPuncAfter2 };
88
88
  const addX11Spacecolon = { name: "611 space colon(y :-)", add: " :", code: "nd", followedBy: "dc", "context": defaultNeedsPuncAfter2 };
89
89
  const addDotBeforeLanguageSubfieldL = { "name": "Add dot before $l", "add": ".", "code": "abepst", "followedBy": "l", "context": doesNotEndInPunc };
90
- const addSemicolonBeforeVolumeDesignation = { "name": 'Add " ;" before $v', "add": " ;", "code": "atxyz", "followedBy": "v", "context": /[^;]$/u };
90
+ const addSemicolonBeforeVolumeDesignation = { "name": 'Add " ;" before $v', "add": " ;", "followedBy": "v", "context": /[^;]$/u };
91
91
  const NONE = 0;
92
92
  const ADD = 2;
93
93
  const REMOVE = 1;
@@ -165,7 +165,11 @@ const legalX10punc = [cleanLegalX10Comma, cleanLegalX10Dot, cleanX00eDot, ...leg
165
165
  const cleanLegalSeriesTitle = [
166
166
  // 490 and 830
167
167
  { "code": "a", "followedBy": "a", "remove": / =$/u },
168
- { "code": "axyz", "followedBy": "xyz", "remove": /,$/u, "context": /.,$/u },
168
+ { "code": "a", "followedBy": "n", "remove": /\.$/u },
169
+ // f830-only
170
+ { "code": "n", "followedBy": "p", "remove": /,$/u },
171
+ // f830-only
172
+ { "code": "anpxyz", "followedBy": "xyz", "remove": /,$/u, "context": /.,$/u },
169
173
  { "code": "axyz", "followedBy": "v", "remove": / *;$/u }
170
174
  ];
171
175
  const clean24X = [
@@ -217,7 +221,7 @@ const cleanValidPunctuationRules = {
217
221
  "611": legalX11Punc,
218
222
  "630": legalEntryField,
219
223
  // Experimental, MET366-ish (end punc in internationally valid, but we don't use it here in Finland):
220
- "648": [{ "code": "a", "content": /^[0-9]+\.$/u, "ind2": ["4"], "remove": /\.$/u }],
224
+ "648": [{ "code": "a", "context": /^[0-9]+\.$/u, "ind2": ["4"], "remove": /\.$/u }],
221
225
  "700": legalX00punc,
222
226
  "710": legalX10punc,
223
227
  "711": legalX11Punc,
@@ -232,7 +236,11 @@ const addToAllEntryFields = [addDotBeforeLanguageSubfieldL, addSemicolonBeforeVo
232
236
  const addX00 = [addXX0iColon, addX00aComma, addX00aComma2, addX00Dot, addX00dComma, ...addToAllEntryFields];
233
237
  const addX10 = [addXX0iColon, addX10bDot, addX10Comma, addX10Dot, ...addToAllEntryFields];
234
238
  const addX11 = [...addToAllEntryFields, addX11Spacecolon];
235
- const addX30 = [...addToAllEntryFields];
239
+ const addX30 = [
240
+ ...addToAllEntryFields,
241
+ { "name": "X30$a dot", "code": "a", "followedBy": "knp", "add": ".", "context": needsPuncAfterAlphanumeric },
242
+ { "name": "X30 final dot", "code": "adfghklmnoprstv", "followedBy": "#", "add": ".", "context": needsPuncAfterAlphanumeric }
243
+ ];
236
244
  const add24X = [
237
245
  { "code": "i", "followedBy": "a", "add": ":", "context": needsPuncAfterAlphanumeric },
238
246
  { "code": "a", "followedBy": "b", "add": " :", "context": "[^:]$" },
@@ -251,7 +259,7 @@ const add245 = [
251
259
  const addSeriesTitle = [
252
260
  // 490 and 830
253
261
  { "code": "a", "followedBy": "a", "add": " =", "context": defaultNeedsPuncAfter2 },
254
- { "code": "axyz", "followedBy": "xy", "add": ",", "context": defaultNeedsPuncAfter2 },
262
+ { "code": "anpxyz", "followedBy": "pxy", "add": ",", "context": defaultNeedsPuncAfter2 },
255
263
  addSemicolonBeforeVolumeDesignation
256
264
  // eg. 490$axyz-$v
257
265
  ];
@@ -413,14 +421,14 @@ export function fieldStripPunctuation(field) {
413
421
  });
414
422
  return field;
415
423
  }
416
- export function fieldFixPunctuation(field) {
424
+ export function fieldFixPunctuation(field, externalEndPunctuation = false) {
417
425
  if (!field.subfields) {
418
426
  return field;
419
427
  }
420
428
  field.subfields.forEach((sf, i) => {
421
429
  subfieldFixPunctuation(field, sf, getNextRelevantSubfield(field, i));
422
430
  });
423
- if (field.useExternalEndPunctuation) {
431
+ if (externalEndPunctuation || field.useExternalEndPunctuation) {
424
432
  validateSingleField(field, false, true);
425
433
  }
426
434
  return field;