@natlibfi/marc-record-validators-melinda 12.0.10 → 12.0.11

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.
@@ -1,9 +1,8 @@
1
- import { loadModule as loadCLD } from "cld3-asm";
2
- import LanguageCodes from "langs";
1
+ import { francAll } from "franc";
3
2
  import createDebugLogger from "debug";
4
- export default async function(tagPattern, treshold = 0.9) {
3
+ import { nvdebug } from "./utils.js";
4
+ export default async function(tagPattern, threshold = 0.9) {
5
5
  const debug = createDebugLogger("@natlibfi/marc-record-validators-melinda/item-language");
6
- const cldFactory = await loadCLD();
7
6
  if (tagPattern instanceof RegExp) {
8
7
  return {
9
8
  description: "Handles invalid/missing item language code",
@@ -12,8 +11,8 @@ export default async function(tagPattern, treshold = 0.9) {
12
11
  };
13
12
  }
14
13
  throw new Error("No tagPattern provided");
15
- async function validate(record) {
16
- const results = await checkLanguage(record);
14
+ function validate(record) {
15
+ const results = checkLanguage(record);
17
16
  if (results.failed) {
18
17
  return { valid: Boolean(results.currentCode), messages: ["Language detection failed"] };
19
18
  }
@@ -27,8 +26,8 @@ export default async function(tagPattern, treshold = 0.9) {
27
26
  return { valid: Boolean(results.currentCode), messages: [`Item language code is invalid. Current code: ${results.currentCode}, suggestions: ${results.suggested.join()}`] };
28
27
  }
29
28
  }
30
- async function fix(record) {
31
- const results = await checkLanguage(record);
29
+ function fix(record) {
30
+ const results = checkLanguage(record);
32
31
  if (results.suggested && results.currentCode) {
33
32
  return;
34
33
  }
@@ -69,60 +68,63 @@ export default async function(tagPattern, treshold = 0.9) {
69
68
  }
70
69
  }
71
70
  }
72
- async function checkLanguage(record) {
71
+ function checkLanguage(record) {
73
72
  const text = getText(record);
74
73
  const langCode = getLanguageCode(record);
75
- const Identifier = cldFactory.create();
74
+ if (["mul", "sgn", "und", "zxx"].includes(langCode)) {
75
+ return { failed: true, currentCode: langCode };
76
+ }
76
77
  if (text.length === 0) {
77
- Identifier.dispose();
78
78
  return { failed: true, currentCode: langCode };
79
79
  }
80
- try {
81
- const results = await Identifier.findLanguage(text);
82
- Identifier.dispose();
83
- if (results.is_reliable) {
84
- if (results.probability >= treshold) {
85
- return {
86
- detected: get2TLangCode(results.language),
87
- currentCode: langCode
88
- };
89
- }
90
- return {
91
- currentCode: langCode,
92
- suggested: [get2TLangCode(results.language)]
93
- };
94
- }
80
+ const results = francAll(text);
81
+ const [francLang, probability] = results[0];
82
+ nvdebug(`FRANC ${langCode}/${threshold} vs ${francLang}/${probability}`, debug);
83
+ if (francLang === "und") {
95
84
  return { failed: true, currentCode: langCode };
96
- } catch (err) {
97
- try {
98
- Identifier.dispose();
99
- } catch (err2) {
100
- debug(`Got error disposing identifier: ${err2 instanceof Error ? err2.stack : err2}`);
101
- }
102
- throw err instanceof Error ? err : new Error(err.message);
103
85
  }
86
+ if (probability >= threshold) {
87
+ return {
88
+ detected: francLang,
89
+ currentCode: langCode
90
+ };
91
+ }
92
+ if (probability > 0) {
93
+ return {
94
+ currentCode: langCode,
95
+ suggested: [francLang]
96
+ };
97
+ }
98
+ return { failed: true, currentCode: langCode };
104
99
  function getText(record2) {
105
100
  return record2.get(tagPattern).reduce((acc, field) => {
106
101
  const fieldText = field.subfields.find((sf) => sf.code === "a").value;
107
102
  return `${acc}${fieldText}`;
108
103
  }, "");
109
104
  }
105
+ function isValidLanguageCode(code) {
106
+ if (!/^[a-z][a-z][a-z]$/u.test(code)) {
107
+ return false;
108
+ }
109
+ return true;
110
+ }
110
111
  function getLanguageCode(record2) {
111
112
  const [f008] = record2.get(/^008$/u);
112
113
  if (f008) {
113
114
  const code = f008.value.slice(35, 38);
114
- if (/^[a-z][a-z][a-z]$/u.test(code) && code !== "zxx") {
115
+ if (isValidLanguageCode(code)) {
115
116
  return code;
116
117
  }
117
118
  }
118
119
  const [f041] = record2.get(/^041$/u);
119
120
  if (f041) {
120
- const code = f041.subfields.find((sf) => sf.code === "a").value;
121
- return code;
121
+ const subfield = f041.subfields.find((sf) => ["a"].includes(sf.code) && isValidLanguageCode(sf.value));
122
+ if (!subfield) {
123
+ return void 0;
124
+ }
125
+ return subfield.value;
122
126
  }
123
- }
124
- function get2TLangCode(code) {
125
- return LanguageCodes.where("1", code)["2T"];
127
+ return void 0;
126
128
  }
127
129
  }
128
130
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/item-language.js"],
4
- "sourcesContent": ["import {loadModule as loadCLD} from 'cld3-asm';\nimport LanguageCodes from 'langs';\nimport createDebugLogger from 'debug';\n\nexport default async function (tagPattern, treshold = 0.9) {\n const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/item-language');\n const cldFactory = await loadCLD();\n\n if (tagPattern instanceof RegExp) {\n return {\n description:\n 'Handles invalid/missing item language code',\n validate,\n fix\n };\n }\n\n throw new Error('No tagPattern provided');\n\n async function validate(record) {\n const results = await checkLanguage(record);\n\n if (results.failed) {\n return {valid: Boolean(results.currentCode), messages: ['Language detection failed']};\n }\n\n if (results.detected) {\n if (results.detected !== results.currentCode) {\n return {valid: false, messages: [`Item language code is invalid. Correct language code: ${results.detected}`]};\n }\n\n return {valid: true};\n }\n\n if (results.suggested) {\n return {valid: Boolean(results.currentCode), messages: [`Item language code is invalid. Current code: ${results.currentCode}, suggestions: ${results.suggested.join()}`]};\n }\n }\n\n async function fix(record) {\n const results = await checkLanguage(record);\n\n if (results.suggested && results.currentCode) {\n return;\n }\n\n if (results.failed && !results.currentCode) {\n return;\n }\n\n if (results.detected && results.detected !== results.currentCode) {\n const f008 = record.get(/^008$/u).shift();\n\n if (f008) {\n const start = f008.value.slice(0, 35);\n const end = f008.value.slice(38);\n f008.value = `${start}${results.detected}${end}`;\n }\n\n const f041 = record.get(/^041$/u).shift();\n\n if (f041) {\n const subfield = f041.subfields.find(sf => sf.code === 'a');\n\n if (subfield) {\n subfield.value = results.detected;\n } else {\n f041.subfields.push({code: 'a', value: results.detected});\n f041.subfields.sort((a, b) => {\n if (a.code < b.code) {\n return -1;\n }\n\n if (a.code > b.code) {\n return 1;\n }\n\n return 0;\n });\n }\n } else {\n record.insertField({tag: '041', ind1: ' ', ind2: ' ', subfields: [\n {\n code: 'a',\n value: results.detected\n }\n ]});\n }\n }\n }\n\n async function checkLanguage(record) {\n const text = getText(record);\n const langCode = getLanguageCode(record);\n\n const Identifier = cldFactory.create();\n\n if (text.length === 0) {\n Identifier.dispose();\n return {failed: true, currentCode: langCode};\n }\n\n try {\n const results = await Identifier.findLanguage(text);\n Identifier.dispose();\n\n if (results.is_reliable) {\n if (results.probability >= treshold) {\n return {\n detected: get2TLangCode(results.language),\n currentCode: langCode\n };\n }\n\n return {\n currentCode: langCode,\n suggested: [get2TLangCode(results.language)]\n };\n }\n\n return {failed: true, currentCode: langCode};\n } catch (err) {\n /* istanbul ignore next: How to cause errors? */\n try {\n Identifier.dispose();\n } catch (err2) {\n debug(`Got error disposing identifier: ${err2 instanceof Error ? err2.stack : err2}`);\n }\n\n /* istanbul ignore next: How to cause errors? */\n throw err instanceof Error ? err : new Error(err.message);\n }\n\n function getText(record) {\n return record.get(tagPattern).reduce((acc, field) => {\n const fieldText = field.subfields.find(sf => sf.code === 'a').value;\n return `${acc}${fieldText}`;\n }, '');\n }\n\n function getLanguageCode(record) {\n const [f008] = record.get(/^008$/u);\n\n if (f008) {\n const code = f008.value.slice(35, 38);\n if ((/^[a-z][a-z][a-z]$/u).test(code) && code !== 'zxx') {\n return code;\n }\n }\n\n const [f041] = record.get(/^041$/u);\n\n if (f041) {\n const code = f041.subfields.find(sf => sf.code === 'a').value;\n return code;\n }\n }\n\n function get2TLangCode(code) {\n return LanguageCodes.where('1', code)['2T'];\n }\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import {francAll} from 'franc';\n\nimport createDebugLogger from 'debug';\nimport {nvdebug} from './utils.js';\n\n// NB! Should we support 041$d? (Audio books use it, don't they?)\n\nexport default async function (tagPattern, threshold = 0.9) {\n const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/item-language');\n\n if (tagPattern instanceof RegExp) {\n return {\n description:\n 'Handles invalid/missing item language code',\n validate,\n fix\n };\n }\n\n throw new Error('No tagPattern provided');\n\n function validate(record) {\n const results = checkLanguage(record);\n\n if (results.failed) {\n return {valid: Boolean(results.currentCode), messages: ['Language detection failed']};\n }\n\n if (results.detected) {\n if (results.detected !== results.currentCode) {\n return {valid: false, messages: [`Item language code is invalid. Correct language code: ${results.detected}`]};\n }\n\n return {valid: true};\n }\n\n if (results.suggested) {\n return {valid: Boolean(results.currentCode), messages: [`Item language code is invalid. Current code: ${results.currentCode}, suggestions: ${results.suggested.join()}`]};\n }\n }\n\n function fix(record) {\n const results = checkLanguage(record);\n\n if (results.suggested && results.currentCode) {\n return;\n }\n\n if (results.failed && !results.currentCode) {\n return;\n }\n\n if (results.detected && results.detected !== results.currentCode) {\n const f008 = record.get(/^008$/u).shift();\n\n if (f008) {\n const start = f008.value.slice(0, 35);\n const end = f008.value.slice(38);\n f008.value = `${start}${results.detected}${end}`;\n }\n\n const f041 = record.get(/^041$/u).shift();\n\n if (f041) {\n const subfield = f041.subfields.find(sf => sf.code === 'a');\n\n if (subfield) {\n subfield.value = results.detected;\n } else {\n f041.subfields.push({code: 'a', value: results.detected});\n f041.subfields.sort((a, b) => {\n if (a.code < b.code) {\n return -1;\n }\n\n if (a.code > b.code) {\n return 1;\n }\n\n return 0;\n });\n }\n } else {\n record.insertField({tag: '041', ind1: ' ', ind2: ' ', subfields: [\n {\n code: 'a',\n value: results.detected\n }\n ]});\n }\n }\n }\n\n function checkLanguage(record) {\n const text = getText(record);\n const langCode = getLanguageCode(record);\n\n // We don't want to change these no matter what the abstract says.\n if (['mul', 'sgn', 'und', 'zxx'].includes(langCode)) {\n return {failed: true, currentCode: langCode};\n }\n\n if (text.length === 0) {\n return {failed: true, currentCode: langCode};\n }\n\n const results = francAll(text);\n\n const [francLang, probability] = results[0];\n\n nvdebug(`FRANC ${langCode}/${threshold} vs ${francLang}/${probability}`, debug);\n\n if (francLang === 'und') { // franc returns ['und', 1.0] for failure!\n return {failed: true, currentCode: langCode};\n }\n\n if (probability >= threshold) {\n return {\n detected: francLang,\n currentCode: langCode\n };\n }\n\n if (probability > 0.0) {\n return {\n currentCode: langCode,\n suggested: [francLang]\n };\n }\n\n return {failed: true, currentCode: langCode};\n\n function getText(record) {\n return record.get(tagPattern).reduce((acc, field) => {\n const fieldText = field.subfields.find(sf => sf.code === 'a').value;\n return `${acc}${fieldText}`;\n }, '');\n }\n\n\n function isValidLanguageCode(code) {\n if (!(/^[a-z][a-z][a-z]$/u).test(code)) {\n return false;\n }\n return true;\n }\n\n function getLanguageCode(record) {\n const [f008] = record.get(/^008$/u);\n\n if (f008) {\n const code = f008.value.slice(35, 38);\n if(isValidLanguageCode(code)) {\n return code;\n }\n }\n\n const [f041] = record.get(/^041$/u);\n\n if (f041) {\n const subfield = f041.subfields.find(sf => ['a'].includes(sf.code) && isValidLanguageCode(sf.value)); // sami languages are not supported by franc, so don't worry about smi/sme logic.\n if (!subfield) {\n return undefined;\n }\n return subfield.value;\n }\n return undefined;\n }\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["record"]
7
7
  }
@@ -93,8 +93,8 @@ describe("item-language", () => {
93
93
  const result = await validator.validate(record);
94
94
  assert.deepEqual(result, { valid: false, messages: ["Item language code is invalid. Correct language code: eng"] });
95
95
  });
96
- it("Finds the record invalid (Probability doesn't meet treshold)", async () => {
97
- const validator = await validatorFactory(/^520$/u, 1);
96
+ it("Finds the record invalid (Probability doesn't meet threshold)", async () => {
97
+ const validator = await validatorFactory(/^520$/u, 1.1);
98
98
  const record = new MarcRecord({
99
99
  fields: [
100
100
  {
@@ -139,7 +139,7 @@ describe("item-language", () => {
139
139
  }
140
140
  ]
141
141
  });
142
- const result = await validator.validate(record);
142
+ const result = validator.validate(record);
143
143
  assert.deepEqual(result, { valid: true, messages: ["Language detection failed"] });
144
144
  });
145
145
  });
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/item-language.test.js"],
4
- "sourcesContent": ["import assert from 'node:assert';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './item-language.js';\nimport {describe, it} from 'node:test';\n\ndescribe('item-language', () => {\n it('Creates a validator', async () => {\n const validator = await validatorFactory(/^520$/u);\n\n assert.equal(typeof validator, 'object');\n assert.equal(typeof validator.description, 'string');\n assert.equal(typeof validator.validate, 'function');\n });\n\n it('Throws an error when tagPattern is not provided', async () => {\n await assert.rejects(validatorFactory(), (err) => {\n assert.equal(err instanceof Error, true);\n assert.equal(err.message, 'No tagPattern provided');\n return true;\n });\n //await assert(validatorFactory()).to.be.rejectedWith(Error, 'No tagPattern provided');\n });\n\n describe('#validate', () => {\n it('Finds the record valid', async () => {\n const validator = await validatorFactory(/^520$/u);\n const record = new MarcRecord({\n fields: [\n {\n tag: '041',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'fin'}]\n },\n {\n tag: '520',\n ind1: ' ',\n ind2: '',\n subfields: [\n {\n code: 'a',\n value: 'Matti Yl\u00F6sen Veroparatiisit on kirja siit\u00E4, kuinka miljon\u00E4\u00E4rit ja monikansalliset yritykset ovat 20 vuoden aikana siirt\u00E4neet kiihtyv\u00E4ll\u00E4 tahdilla tulojaan s\u00E4\u00E4telyn ja verottajan ulottumattomiin korkeiden pankkisalaisuuslakien suojiin. Samoihin keitaisiin, joita my\u00F6s kansainv\u00E4linen rikollisuus k\u00E4ytt\u00E4\u00E4 rahanpesuun. Suomi on toistaiseksi ollut osa ongelmaa, ei sen ratkaisua.\\nKirja sis\u00E4lt\u00E4\u00E4 n\u00E4k\u00F6kulmia ja kiinnekohtia demokratian, hyvinvointivaltion ja kilpailullisen markkinatalouden kriiseihin. Mukana my\u00F6s toimintaehdotuksia, joita Suomen tulee ajaa veroparatiisiongelman ratkaisemiseksi. Veroparatiisit on ajankohtainen tietopaketti veronkierron mekanismeista ja vaikutuksista.'\n }\n ]\n }\n ]\n });\n const result = await validator.validate(record);\n\n assert.deepEqual(result, {valid: true});\n });\n\n it('Finds the record invalid (Language code is missing and detection failed', async () => {\n const validator = await validatorFactory(/^520$/u);\n const record = new MarcRecord({\n fields: [\n {\n tag: '520',\n ind1: ' ',\n ind2: '',\n subfields: [\n {\n code: 'a',\n value: '.'\n }\n ]\n }\n ]\n });\n const result = await validator.validate(record);\n\n assert.deepEqual(result, {valid: false, messages: ['Language detection failed']});\n });\n\n it('Finds the record invalid (Detected language differs)', async () => {\n const validator = await validatorFactory(/^520$/u);\n const record = new MarcRecord({\n fields: [\n {\n tag: '008',\n value: '151118t20162016fi^a|||^^^^^^^|0|^0|fin|^'\n },\n {\n tag: '041',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'fin'}]\n },\n {\n tag: '520',\n ind1: ' ',\n ind2: '',\n subfields: [\n {\n code: 'a',\n value: 'If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.'\n }\n ]\n }\n ]\n });\n const result = await validator.validate(record);\n\n assert.deepEqual(result, {valid: false, messages: ['Item language code is invalid. Correct language code: eng']});\n });\n\n it('Finds the record invalid (Probability doesn\\'t meet treshold)', async () => {\n const validator = await validatorFactory(/^520$/u, 1);\n const record = new MarcRecord({\n fields: [\n {\n tag: '008',\n value: '151118t20162016fi^a|||^^^^^^^|0|^0|fin|^'\n },\n {\n tag: '041',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'fin'}]\n },\n {\n tag: '520',\n ind1: ' ',\n ind2: '',\n subfields: [\n {\n code: 'a',\n value: 'If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.'\n }\n ]\n }\n ]\n });\n const result = await validator.validate(record);\n\n assert.deepEqual(result, {valid: true, messages: ['Item language code is invalid. Current code: fin, suggestions: eng']});\n });\n\n it('Finds the record invalid (No detectable text)', async () => {\n const validator = await validatorFactory(/^520$/u, 1);\n const record = new MarcRecord({\n fields: [\n {\n tag: '008',\n value: '151118t20162016fi^a|||^^^^^^^|0|^0|fin|^'\n },\n {\n tag: '041',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'fin'}]\n }\n ]\n });\n const result = await validator.validate(record);\n\n assert.deepEqual(result, {valid: true, messages: ['Language detection failed']});\n });\n });\n\n describe('#fix', () => {\n it('Fixes the record', async () => {\n const validator = await validatorFactory(/^520$/u);\n const record = new MarcRecord({\n fields: [\n {\n tag: '008',\n value: '151118t20162016fi^a|||^^^^^^^|0|^0|fin|^'\n },\n {\n tag: '041',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'eng'}]\n },\n {\n tag: '520',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.'\n }\n ]\n }\n ]\n });\n await validator.fix(record);\n\n assert.deepEqual(record.fields, [\n {\n tag: '008',\n value: '151118t20162016fi^a|||^^^^^^^|0|^0|eng|^'\n },\n {\n tag: '041',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'eng'}]\n },\n {\n tag: '520',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.'\n }\n ]\n }\n ]);\n });\n\n it('Fixes the record (Insert missing fields)', async () => {\n const validator = await validatorFactory(/^520$/u);\n const record = new MarcRecord({\n fields: [\n {\n tag: '008',\n value: '151118t20162016fi^a|||^^^^^^^|0|^0|fin|^'\n },\n {\n tag: '520',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.'\n }\n ]\n }\n ]\n });\n await validator.fix(record);\n\n assert.deepEqual(record.fields, [\n {\n tag: '008',\n value: '151118t20162016fi^a|||^^^^^^^|0|^0|eng|^'\n },\n {\n tag: '041',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'eng'}]\n },\n {\n tag: '520',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.'\n }\n ]\n }\n ]);\n });\n\n it('Fixes the record (Insert missing subfields)', async () => {\n const validator = await validatorFactory(/^520$/u);\n const record = new MarcRecord({\n fields: [\n {\n tag: '008',\n value: '151118t20162016fi^a|||^^^^^^^|0|^0|fin|^'\n },\n {\n tag: '041',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'b', value: 'foo'}]\n },\n {\n tag: '520',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.'\n }\n ]\n }\n ]\n });\n await validator.fix(record);\n\n assert.deepEqual(record.fields, [\n {\n tag: '008',\n value: '151118t20162016fi^a|||^^^^^^^|0|^0|eng|^'\n },\n {\n tag: '041',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'eng'}, {code: 'b', value: 'foo'}]\n },\n {\n tag: '520',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.'\n }\n ]\n }\n ]);\n });\n\n it('Fails to fix the record', async () => {\n const validator = await validatorFactory(/^520$/u);\n const record = new MarcRecord({\n fields: [\n {\n tag: '520',\n ind1: ' ',\n ind2: '',\n subfields: [\n {\n code: 'a',\n value: '.'\n }\n ]\n }\n ]\n });\n\n try {\n await validator.fix(record);\n } catch (err) {\n assert.equal(err.message, 'Language code is missing and detection failed');\n }\n });\n });\n});\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import assert from 'node:assert';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './item-language.js';\nimport {describe, it} from 'node:test';\n\ndescribe('item-language', () => {\n it('Creates a validator', async () => {\n const validator = await validatorFactory(/^520$/u);\n\n assert.equal(typeof validator, 'object');\n assert.equal(typeof validator.description, 'string');\n assert.equal(typeof validator.validate, 'function');\n });\n\n it('Throws an error when tagPattern is not provided', async () => {\n await assert.rejects(validatorFactory(), (err) => {\n assert.equal(err instanceof Error, true);\n assert.equal(err.message, 'No tagPattern provided');\n return true;\n });\n //await assert(validatorFactory()).to.be.rejectedWith(Error, 'No tagPattern provided');\n });\n\n describe('#validate', () => {\n it('Finds the record valid', async () => {\n const validator = await validatorFactory(/^520$/u);\n const record = new MarcRecord({\n fields: [\n {\n tag: '041',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'fin'}]\n },\n {\n tag: '520',\n ind1: ' ',\n ind2: '',\n subfields: [\n {\n code: 'a',\n value: 'Matti Yl\u00F6sen Veroparatiisit on kirja siit\u00E4, kuinka miljon\u00E4\u00E4rit ja monikansalliset yritykset ovat 20 vuoden aikana siirt\u00E4neet kiihtyv\u00E4ll\u00E4 tahdilla tulojaan s\u00E4\u00E4telyn ja verottajan ulottumattomiin korkeiden pankkisalaisuuslakien suojiin. Samoihin keitaisiin, joita my\u00F6s kansainv\u00E4linen rikollisuus k\u00E4ytt\u00E4\u00E4 rahanpesuun. Suomi on toistaiseksi ollut osa ongelmaa, ei sen ratkaisua.\\nKirja sis\u00E4lt\u00E4\u00E4 n\u00E4k\u00F6kulmia ja kiinnekohtia demokratian, hyvinvointivaltion ja kilpailullisen markkinatalouden kriiseihin. Mukana my\u00F6s toimintaehdotuksia, joita Suomen tulee ajaa veroparatiisiongelman ratkaisemiseksi. Veroparatiisit on ajankohtainen tietopaketti veronkierron mekanismeista ja vaikutuksista.'\n }\n ]\n }\n ]\n });\n const result = await validator.validate(record);\n\n assert.deepEqual(result, {valid: true});\n });\n\n it('Finds the record invalid (Language code is missing and detection failed', async () => {\n const validator = await validatorFactory(/^520$/u);\n const record = new MarcRecord({\n fields: [\n {\n tag: '520',\n ind1: ' ',\n ind2: '',\n subfields: [\n {\n code: 'a',\n value: '.'\n }\n ]\n }\n ]\n });\n const result = await validator.validate(record);\n\n assert.deepEqual(result, {valid: false, messages: ['Language detection failed']});\n });\n\n it('Finds the record invalid (Detected language differs)', async () => {\n const validator = await validatorFactory(/^520$/u);\n const record = new MarcRecord({\n fields: [\n {\n tag: '008',\n value: '151118t20162016fi^a|||^^^^^^^|0|^0|fin|^'\n },\n {\n tag: '041',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'fin'}]\n },\n {\n tag: '520',\n ind1: ' ',\n ind2: '',\n subfields: [\n {\n code: 'a',\n value: 'If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.'\n }\n ]\n }\n ]\n });\n const result = await validator.validate(record);\n\n assert.deepEqual(result, {valid: false, messages: ['Item language code is invalid. Correct language code: eng']});\n });\n\n it('Finds the record invalid (Probability doesn\\'t meet threshold)', async () => {\n const validator = await validatorFactory(/^520$/u, 1.1); // franc (unlike cld3) returns 1.0 for this, so I use threshold 1.1 to make test fail...\n const record = new MarcRecord({\n fields: [\n {\n tag: '008',\n value: '151118t20162016fi^a|||^^^^^^^|0|^0|fin|^'\n },\n {\n tag: '041',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'fin'}]\n },\n {\n tag: '520',\n ind1: ' ',\n ind2: '',\n subfields: [\n {\n code: 'a',\n value: 'If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.'\n }\n ]\n }\n ]\n });\n const result = await validator.validate(record);\n\n assert.deepEqual(result, {valid: true, messages: ['Item language code is invalid. Current code: fin, suggestions: eng']});\n });\n\n it('Finds the record invalid (No detectable text)', async () => {\n const validator = await validatorFactory(/^520$/u, 1);\n const record = new MarcRecord({\n fields: [\n {\n tag: '008',\n value: '151118t20162016fi^a|||^^^^^^^|0|^0|fin|^'\n },\n {\n tag: '041',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'fin'}]\n }\n ]\n });\n const result = validator.validate(record);\n\n assert.deepEqual(result, {valid: true, messages: ['Language detection failed']});\n });\n });\n\n describe('#fix', () => {\n it('Fixes the record', async () => {\n const validator = await validatorFactory(/^520$/u);\n const record = new MarcRecord({\n fields: [\n {\n tag: '008',\n value: '151118t20162016fi^a|||^^^^^^^|0|^0|fin|^'\n },\n {\n tag: '041',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'eng'}]\n },\n {\n tag: '520',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.'\n }\n ]\n }\n ]\n });\n await validator.fix(record);\n\n assert.deepEqual(record.fields, [\n {\n tag: '008',\n value: '151118t20162016fi^a|||^^^^^^^|0|^0|eng|^'\n },\n {\n tag: '041',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'eng'}]\n },\n {\n tag: '520',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.'\n }\n ]\n }\n ]);\n });\n\n it('Fixes the record (Insert missing fields)', async () => {\n const validator = await validatorFactory(/^520$/u);\n const record = new MarcRecord({\n fields: [\n {\n tag: '008',\n value: '151118t20162016fi^a|||^^^^^^^|0|^0|fin|^'\n },\n {\n tag: '520',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.'\n }\n ]\n }\n ]\n });\n await validator.fix(record);\n\n assert.deepEqual(record.fields, [\n {\n tag: '008',\n value: '151118t20162016fi^a|||^^^^^^^|0|^0|eng|^'\n },\n {\n tag: '041',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'eng'}]\n },\n {\n tag: '520',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.'\n }\n ]\n }\n ]);\n });\n\n it('Fixes the record (Insert missing subfields)', async () => {\n const validator = await validatorFactory(/^520$/u);\n const record = new MarcRecord({\n fields: [\n {\n tag: '008',\n value: '151118t20162016fi^a|||^^^^^^^|0|^0|fin|^'\n },\n {\n tag: '041',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'b', value: 'foo'}]\n },\n {\n tag: '520',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.'\n }\n ]\n }\n ]\n });\n await validator.fix(record);\n\n assert.deepEqual(record.fields, [\n {\n tag: '008',\n value: '151118t20162016fi^a|||^^^^^^^|0|^0|eng|^'\n },\n {\n tag: '041',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'eng'}, {code: 'b', value: 'foo'}]\n },\n {\n tag: '520',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.'\n }\n ]\n }\n ]);\n });\n\n it('Fails to fix the record', async () => {\n const validator = await validatorFactory(/^520$/u);\n const record = new MarcRecord({\n fields: [\n {\n tag: '520',\n ind1: ' ',\n ind2: '',\n subfields: [\n {\n code: 'a',\n value: '.'\n }\n ]\n }\n ]\n });\n\n try {\n await validator.fix(record);\n } catch (err) {\n assert.equal(err.message, 'Language code is missing and detection failed');\n }\n });\n });\n});\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -110,7 +110,7 @@ const mergeConstraints = [
110
110
  { "tag": "338", "required": "b2", "key": "ab2" },
111
111
  // / MET-88: don't merge different $a subfields
112
112
  { "tag": "340", "required": "", "paired": "abcdefghijkmnop", "key": "abcdefghijkmnop" },
113
- { "tag": "341", "required": "", "paired": "abcde", "key": "abcde" },
113
+ { "tag": "341", "required": "", "paired": "a2", "key": "abcde2" },
114
114
  // NEW! Starting to appear!
115
115
  { "tag": "342", "required": "", "paired": "abcdefghijklmnopqrstuvw", "key": "abcdefghijklmnopqrstuvw" },
116
116
  // SKIP 342. NOT SEEN!
@@ -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': 'abcde', 'key': 'abcde'}, // 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,SAAS,OAAO,QAAO;AAAA;AAAA,EAChE,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', '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
  }
package/package.json CHANGED
@@ -14,7 +14,7 @@
14
14
  "url": "https://github.com/NatLibFi/marc-record-validators-melinda"
15
15
  },
16
16
  "license": "MIT",
17
- "version": "12.0.10",
17
+ "version": "12.0.11",
18
18
  "main": "./dist/index.js",
19
19
  "publishConfig": {
20
20
  "access": "public"
@@ -43,11 +43,10 @@
43
43
  "@natlibfi/melinda-commons": "^14.0.2",
44
44
  "@natlibfi/sfs-4900": "^2.0.0",
45
45
  "@natlibfi/sru-client": "^7.0.1",
46
- "cld3-asm": "^4.0.0",
47
46
  "clone": "^2.1.2",
48
47
  "debug": "^4.4.3",
48
+ "franc": "^6.2.0",
49
49
  "isbn3": "^2.0.6",
50
- "langs": "^2.0.0",
51
50
  "xml2js": "^0.6.2",
52
51
  "xregexp": "^5.1.2"
53
52
  },
@@ -58,12 +57,8 @@
58
57
  "@natlibfi/fixugen": "^3.0.1",
59
58
  "@natlibfi/fixura": "^4.0.1",
60
59
  "cross-env": "^10.1.0",
61
- "esbuild": "^0.27.3",
60
+ "esbuild": "^0.27.4",
62
61
  "eslint": "^10.0.3",
63
62
  "fetch-mock": "^12.6.0"
64
- },
65
- "overrides": {
66
- "nanoid": "^3.3.8"
67
- },
68
- "nvolkComment": "cld3-asm 4.0.0 uses emscripten-wasm-loader ^3.0.3 which uses problematic, non-secure nanoid version 2.X.X."
63
+ }
69
64
  }
@@ -1,10 +1,12 @@
1
- import {loadModule as loadCLD} from 'cld3-asm';
2
- import LanguageCodes from 'langs';
1
+ import {francAll} from 'franc';
2
+
3
3
  import createDebugLogger from 'debug';
4
+ import {nvdebug} from './utils.js';
5
+
6
+ // NB! Should we support 041$d? (Audio books use it, don't they?)
4
7
 
5
- export default async function (tagPattern, treshold = 0.9) {
8
+ export default async function (tagPattern, threshold = 0.9) {
6
9
  const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/item-language');
7
- const cldFactory = await loadCLD();
8
10
 
9
11
  if (tagPattern instanceof RegExp) {
10
12
  return {
@@ -17,8 +19,8 @@ export default async function (tagPattern, treshold = 0.9) {
17
19
 
18
20
  throw new Error('No tagPattern provided');
19
21
 
20
- async function validate(record) {
21
- const results = await checkLanguage(record);
22
+ function validate(record) {
23
+ const results = checkLanguage(record);
22
24
 
23
25
  if (results.failed) {
24
26
  return {valid: Boolean(results.currentCode), messages: ['Language detection failed']};
@@ -37,8 +39,8 @@ export default async function (tagPattern, treshold = 0.9) {
37
39
  }
38
40
  }
39
41
 
40
- async function fix(record) {
41
- const results = await checkLanguage(record);
42
+ function fix(record) {
43
+ const results = checkLanguage(record);
42
44
 
43
45
  if (results.suggested && results.currentCode) {
44
46
  return;
@@ -89,48 +91,45 @@ export default async function (tagPattern, treshold = 0.9) {
89
91
  }
90
92
  }
91
93
 
92
- async function checkLanguage(record) {
94
+ function checkLanguage(record) {
93
95
  const text = getText(record);
94
96
  const langCode = getLanguageCode(record);
95
97
 
96
- const Identifier = cldFactory.create();
98
+ // We don't want to change these no matter what the abstract says.
99
+ if (['mul', 'sgn', 'und', 'zxx'].includes(langCode)) {
100
+ return {failed: true, currentCode: langCode};
101
+ }
97
102
 
98
103
  if (text.length === 0) {
99
- Identifier.dispose();
100
104
  return {failed: true, currentCode: langCode};
101
105
  }
102
106
 
103
- try {
104
- const results = await Identifier.findLanguage(text);
105
- Identifier.dispose();
107
+ const results = francAll(text);
106
108
 
107
- if (results.is_reliable) {
108
- if (results.probability >= treshold) {
109
- return {
110
- detected: get2TLangCode(results.language),
111
- currentCode: langCode
112
- };
113
- }
109
+ const [francLang, probability] = results[0];
114
110
 
115
- return {
116
- currentCode: langCode,
117
- suggested: [get2TLangCode(results.language)]
118
- };
119
- }
111
+ nvdebug(`FRANC ${langCode}/${threshold} vs ${francLang}/${probability}`, debug);
120
112
 
113
+ if (francLang === 'und') { // franc returns ['und', 1.0] for failure!
121
114
  return {failed: true, currentCode: langCode};
122
- } catch (err) {
123
- /* istanbul ignore next: How to cause errors? */
124
- try {
125
- Identifier.dispose();
126
- } catch (err2) {
127
- debug(`Got error disposing identifier: ${err2 instanceof Error ? err2.stack : err2}`);
128
- }
115
+ }
116
+
117
+ if (probability >= threshold) {
118
+ return {
119
+ detected: francLang,
120
+ currentCode: langCode
121
+ };
122
+ }
129
123
 
130
- /* istanbul ignore next: How to cause errors? */
131
- throw err instanceof Error ? err : new Error(err.message);
124
+ if (probability > 0.0) {
125
+ return {
126
+ currentCode: langCode,
127
+ suggested: [francLang]
128
+ };
132
129
  }
133
130
 
131
+ return {failed: true, currentCode: langCode};
132
+
134
133
  function getText(record) {
135
134
  return record.get(tagPattern).reduce((acc, field) => {
136
135
  const fieldText = field.subfields.find(sf => sf.code === 'a').value;
@@ -138,12 +137,20 @@ export default async function (tagPattern, treshold = 0.9) {
138
137
  }, '');
139
138
  }
140
139
 
140
+
141
+ function isValidLanguageCode(code) {
142
+ if (!(/^[a-z][a-z][a-z]$/u).test(code)) {
143
+ return false;
144
+ }
145
+ return true;
146
+ }
147
+
141
148
  function getLanguageCode(record) {
142
149
  const [f008] = record.get(/^008$/u);
143
150
 
144
151
  if (f008) {
145
152
  const code = f008.value.slice(35, 38);
146
- if ((/^[a-z][a-z][a-z]$/u).test(code) && code !== 'zxx') {
153
+ if(isValidLanguageCode(code)) {
147
154
  return code;
148
155
  }
149
156
  }
@@ -151,13 +158,13 @@ export default async function (tagPattern, treshold = 0.9) {
151
158
  const [f041] = record.get(/^041$/u);
152
159
 
153
160
  if (f041) {
154
- const code = f041.subfields.find(sf => sf.code === 'a').value;
155
- return code;
161
+ const subfield = f041.subfields.find(sf => ['a'].includes(sf.code) && isValidLanguageCode(sf.value)); // sami languages are not supported by franc, so don't worry about smi/sme logic.
162
+ if (!subfield) {
163
+ return undefined;
164
+ }
165
+ return subfield.value;
156
166
  }
157
- }
158
-
159
- function get2TLangCode(code) {
160
- return LanguageCodes.where('1', code)['2T'];
167
+ return undefined;
161
168
  }
162
169
  }
163
170
  }
@@ -104,8 +104,8 @@ describe('item-language', () => {
104
104
  assert.deepEqual(result, {valid: false, messages: ['Item language code is invalid. Correct language code: eng']});
105
105
  });
106
106
 
107
- it('Finds the record invalid (Probability doesn\'t meet treshold)', async () => {
108
- const validator = await validatorFactory(/^520$/u, 1);
107
+ it('Finds the record invalid (Probability doesn\'t meet threshold)', async () => {
108
+ const validator = await validatorFactory(/^520$/u, 1.1); // franc (unlike cld3) returns 1.0 for this, so I use threshold 1.1 to make test fail...
109
109
  const record = new MarcRecord({
110
110
  fields: [
111
111
  {
@@ -152,7 +152,7 @@ describe('item-language', () => {
152
152
  }
153
153
  ]
154
154
  });
155
- const result = await validator.validate(record);
155
+ const result = validator.validate(record);
156
156
 
157
157
  assert.deepEqual(result, {valid: true, messages: ['Language detection failed']});
158
158
  });
@@ -106,7 +106,7 @@ const mergeConstraints = [
106
106
  {'tag': '337', 'required': 'b2', 'key': 'ab2'}, // MET-88: don't merge different $a subfields
107
107
  {'tag': '338', 'required': 'b2', 'key': 'ab2'}, // / MET-88: don't merge different $a subfields
108
108
  {'tag': '340', 'required': '', 'paired': 'abcdefghijkmnop', 'key': 'abcdefghijkmnop'},
109
- {'tag': '341', 'required': '', 'paired': 'abcde', 'key': 'abcde'}, // NEW! Starting to appear!
109
+ {'tag': '341', 'required': '', 'paired': 'a2', 'key': 'abcde2'}, // NEW! Starting to appear!
110
110
  {'tag': '342', 'required': '', 'paired': 'abcdefghijklmnopqrstuvw', 'key': 'abcdefghijklmnopqrstuvw'}, // SKIP 342. NOT SEEN!
111
111
  {'tag': '343', 'required': '', 'paired': 'abcdefghi', 'key': 'abcdefghi'}, // SKIP 343.
112
112
  {'tag': '344', 'required': '', 'paired': 'abcdefgh', 'key': 'abcdefgh'},
@@ -0,0 +1,12 @@
1
+ {
2
+ "_validationOptions": {},
3
+ "fields": [
4
+ { "tag": "341", "ind1": "0", "ind2": " ", "subfields": [
5
+ { "code": "a", "value": "textual" },
6
+ { "code": "b", "value": "displayTransformability" },
7
+ { "code": "2", "value": "sapdv" }
8
+ ] }
9
+ ],
10
+ "leader": "01331cam a22003498i 4500"
11
+
12
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "description": "f16: merge 341",
3
+ "ref": "https://kansalliskirjasto.slack.com/archives/C0519JARQV6/p1773905735148649?thread_ts=1773648181.514179&cid=C0519JARQV6",
4
+ "fix": true,
5
+ "only": true,
6
+ "tagPattern": "^341$"
7
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "_validationOptions": {},
3
+ "fields": [
4
+ { "tag": "341", "ind1": " ", "ind2": " ", "subfields": [ { "code": "a", "value": "textual" }, { "code": "2", "value": "sapdv"} ] },
5
+ { "tag": "341", "ind1": "0", "ind2": " ", "subfields": [
6
+ { "code": "2", "value": "sapdv" },
7
+ { "code": "a", "value": "textual" },
8
+ { "code": "b", "value": "displayTransformability" }
9
+ ] }
10
+ ],
11
+ "leader": "01331cam a22003498i 4500"
12
+
13
+ }