@natlibfi/marc-record-validators-melinda 9.0.13 → 9.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/dist/access-rights.spec.js +2 -2
  2. package/dist/access-rights.spec.js.map +1 -1
  3. package/dist/duplicates-ind1.js +3 -1
  4. package/dist/duplicates-ind1.js.map +1 -1
  5. package/dist/duplicates-ind1.spec.js +45 -98
  6. package/dist/duplicates-ind1.spec.js.map +1 -1
  7. package/dist/indicator-fixes.js +266 -0
  8. package/dist/indicator-fixes.js.map +1 -0
  9. package/dist/indicator-fixes.spec.js +61 -0
  10. package/dist/indicator-fixes.spec.js.map +1 -0
  11. package/dist/mergeField500Lisapainokset.js +192 -0
  12. package/dist/mergeField500Lisapainokset.js.map +1 -0
  13. package/dist/mergeField500Lisapainokset.spec.js +61 -0
  14. package/dist/mergeField500Lisapainokset.spec.js.map +1 -0
  15. package/dist/urn.js +74 -18
  16. package/dist/urn.js.map +1 -1
  17. package/dist/urn.spec.js +91 -11
  18. package/dist/urn.spec.js.map +1 -1
  19. package/package.json +6 -6
  20. package/src/access-rights.spec.js +5 -2
  21. package/src/duplicates-ind1.js +1 -1
  22. package/src/duplicates-ind1.spec.js +39 -85
  23. package/src/indicator-fixes.js +249 -0
  24. package/src/indicator-fixes.spec.js +52 -0
  25. package/src/mergeField500Lisapainokset.js +154 -0
  26. package/src/mergeField500Lisapainokset.spec.js +52 -0
  27. package/src/urn.js +82 -16
  28. package/src/urn.spec.js +95 -4
  29. package/test-fixtures/duplicates-ind1/01/expectedResult.json +4 -0
  30. package/test-fixtures/duplicates-ind1/01/metadata.json +4 -0
  31. package/test-fixtures/duplicates-ind1/01/record.json +16 -0
  32. package/test-fixtures/duplicates-ind1/02/expectedResult.json +6 -0
  33. package/test-fixtures/duplicates-ind1/02/metadata.json +4 -0
  34. package/test-fixtures/duplicates-ind1/02/record.json +16 -0
  35. package/test-fixtures/duplicates-ind1/03/expectedResult.json +13 -0
  36. package/test-fixtures/duplicates-ind1/03/metadata.json +6 -0
  37. package/test-fixtures/duplicates-ind1/03/record.json +16 -0
  38. package/test-fixtures/indicator-fixes/01/expectedResult.json +9 -0
  39. package/test-fixtures/indicator-fixes/01/metadata.json +5 -0
  40. package/test-fixtures/indicator-fixes/01/record.json +64 -0
  41. package/test-fixtures/indicator-fixes/02/expectedResult.json +66 -0
  42. package/test-fixtures/indicator-fixes/02/metadata.json +5 -0
  43. package/test-fixtures/indicator-fixes/02/record.json +64 -0
  44. package/test-fixtures/indicator-fixes/03/expectedResult.json +55 -0
  45. package/test-fixtures/indicator-fixes/03/metadata.json +5 -0
  46. package/test-fixtures/indicator-fixes/03/record.json +54 -0
  47. package/test-fixtures/indicator-fixes/04/expectedResult.json +66 -0
  48. package/test-fixtures/indicator-fixes/04/metadata.json +5 -0
  49. package/test-fixtures/indicator-fixes/04/record.json +65 -0
  50. package/test-fixtures/indicator-fixes/05/expectedResult.json +66 -0
  51. package/test-fixtures/indicator-fixes/05/metadata.json +5 -0
  52. package/test-fixtures/indicator-fixes/05/record.json +65 -0
  53. package/test-fixtures/indicator-fixes/06/expectedResult.json +75 -0
  54. package/test-fixtures/indicator-fixes/06/metadata.json +5 -0
  55. package/test-fixtures/indicator-fixes/06/record.json +74 -0
  56. package/test-fixtures/lisapainokset/fixer/01/expectedResult.json +37 -0
  57. package/test-fixtures/lisapainokset/fixer/01/metadata.json +6 -0
  58. package/test-fixtures/lisapainokset/fixer/01/record.json +61 -0
  59. package/test-fixtures/lisapainokset/fixer/02/expectedResult.json +44 -0
  60. package/test-fixtures/lisapainokset/fixer/02/metadata.json +6 -0
  61. package/test-fixtures/lisapainokset/fixer/02/record.json +45 -0
  62. package/test-fixtures/lisapainokset/fixer/03/expectedResult.json +21 -0
  63. package/test-fixtures/lisapainokset/fixer/03/metadata.json +6 -0
  64. package/test-fixtures/lisapainokset/fixer/03/record.json +45 -0
  65. package/test-fixtures/lisapainokset/validator/01/expectedResult.json +7 -0
  66. package/test-fixtures/lisapainokset/validator/01/metadata.json +6 -0
  67. package/test-fixtures/lisapainokset/validator/01/record.json +45 -0
  68. package/test-fixtures/lisapainokset/validator/02/expectedResult.json +6 -0
  69. package/test-fixtures/lisapainokset/validator/02/metadata.json +6 -0
  70. package/test-fixtures/lisapainokset/validator/02/record.json +61 -0
  71. package/test-fixtures/lisapainokset/validator/03/expectedResult.json +4 -0
  72. package/test-fixtures/lisapainokset/validator/03/metadata.json +6 -0
  73. package/test-fixtures/lisapainokset/validator/03/record.json +37 -0
@@ -143,10 +143,10 @@ describe('access-rights', async () => {
143
143
  await test.fix([f5060, ldf540], [f5060, ldf5061, ldf540]);
144
144
  });
145
145
  it('5061 but missing 540; Adds 540', async () => {
146
- await test.fix([ldf5061, f540], [ldf5061, f540, ldf540]);
146
+ await test.fix([ldf5061, f540], [ldf5061, ldf540, f540]);
147
147
  });
148
148
  it('Both, 5061 and 540, missing; Adds 5061 and 540', async () => {
149
- await test.fix([f5060, f540], [f5060, ldf5061, f540, ldf540]);
149
+ await test.fix([f5060, f540], [f5060, ldf5061, ldf540, f540]);
150
150
  });
151
151
  });
152
152
  });
@@ -1 +1 @@
1
- {"version":3,"file":"access-rights.spec.js","names":["describe","f337","tag","ind1","ind2","subfields","code","value","ldf5061","ldf540","f5060","f540","it","validator","validatorFactory","expect","to","be","an","that","has","any","keys","description","a","validate","test","valid","recfields","result","MarcRecord","fields","eql","fix","resfields","record"],"sources":["../src/access-rights.spec.js"],"sourcesContent":["import {expect} from 'chai';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from '../src/access-rights';\n\ndescribe('access-rights', async () => {\n // Fields\n const f337 = {\n tag: '337',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {code: 'b', value: 'c'},\n {code: '2', value: 'rdamedia'}\n ]\n };\n\n const ldf5061 = {\n tag: '506',\n ind1: '1',\n ind2: ' ',\n subfields: [\n {code: 'a', value: 'Aineisto on käytettävissä vapaakappalekirjastoissa.'},\n {code: 'f', value: 'Online access with authorization'},\n {code: '2', value: 'star'},\n {code: '5', value: 'FI-Vapaa'},\n {code: '9', value: 'FENNI<KEEP>'}\n ]\n };\n const ldf540 = {\n tag: '540',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {code: 'a', value: 'Aineisto on käytettävissä tutkimus- ja muihin tarkoituksiin;'},\n {code: 'b', value: 'Kansalliskirjasto;'},\n {code: 'c', value: 'Laki kulttuuriaineistojen tallettamisesta ja säilyttämisestä'},\n {code: 'u', value: 'http://www.finlex.fi/fi/laki/ajantasa/2007/20071433'},\n {code: '5', value: 'FI-Vapaa'},\n {code: '9', value: 'FENNI<KEEP>'}\n ]\n };\n const f5060 = {\n tag: '506',\n ind1: '0',\n ind2: ' ',\n subfields: [\n {code: 'a', value: 'Aineisto on vapaasti saatavissa.'},\n {code: 'f', value: 'Unrestricted online access'},\n {code: '2', value: 'star'},\n {code: '9', value: 'FENNI<KEEP>'}\n ]\n };\n const f540 = {\n tag: '540',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'c', value: 'This publication is copyrighted. You may download, display and print it for Your own personal use. Commercial use is prohibited.'}]\n };\n\n it('Creates a validator', async () => {\n const validator = await validatorFactory();\n\n expect(validator)\n .to.be.an('object')\n .that.has.any.keys('description', 'validate');\n\n expect(validator.description).to.be.a('string');\n expect(validator.validate).to.be.a('function');\n });\n\n // Tests\n const test = await (async () => {\n const validator = await validatorFactory();\n return {\n validate: async (valid, ...recfields) => {\n const result = await validator.validate(new MarcRecord({fields: recfields}));\n expect(result).to.eql({valid});\n },\n\n fix: async (recfields, resfields) => {\n const record = new MarcRecord({fields: recfields});\n await validator.fix(record);\n expect(record.fields).to.eql(resfields);\n }\n };\n })();\n\n describe('#validate', () => {\n it('Finds the record valid; Legal deposit fields 5061 and 540', async () => {\n await test.validate(true, ldf5061, ldf540);\n });\n\n it('Finds the record invalid; Missing 5061', async () => {\n await test.validate(false, f337, f5060, ldf540);\n });\n\n it('Finds the record invalid; Missing 540', async () => {\n await test.validate(false, f337, ldf5061, f540);\n });\n\n it('Finds the record invalid; Missing 5061 and 540', async () => {\n await test.validate(false, f337, f5060, f540);\n });\n });\n\n describe('#fix', () => {\n it('Legal deposit fields 5061 and 540; Nothing to add', async () => {\n await test.fix([ldf5061, ldf540], [ldf5061, ldf540]);\n });\n\n it('540 but missing 5061; Adds 5061', async () => {\n await test.fix([f5060, ldf540], [f5060, ldf5061, ldf540]);\n });\n\n it('5061 but missing 540; Adds 540', async () => {\n await test.fix([ldf5061, f540], [ldf5061, f540, ldf540]);\n });\n\n it('Both, 5061 and 540, missing; Adds 5061 and 540', async () => {\n await test.fix([f5060, f540], [f5060, ldf5061, f540, ldf540]);\n });\n });\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"access-rights.spec.js","names":["describe","f337","tag","ind1","ind2","subfields","code","value","ldf5061","ldf540","f5060","f540","it","validator","validatorFactory","expect","to","be","an","that","has","any","keys","description","a","validate","test","valid","recfields","result","MarcRecord","fields","eql","fix","resfields","record"],"sources":["../src/access-rights.spec.js"],"sourcesContent":["import {expect} from 'chai';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from '../src/access-rights';\n\ndescribe('access-rights', async () => {\n // Fields\n const f337 = {\n tag: '337',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {code: 'b', value: 'c'},\n {code: '2', value: 'rdamedia'}\n ]\n };\n\n const ldf5061 = {\n tag: '506',\n ind1: '1',\n ind2: ' ',\n subfields: [\n {code: 'a', value: 'Aineisto on käytettävissä vapaakappalekirjastoissa.'},\n {code: 'f', value: 'Online access with authorization'},\n {code: '2', value: 'star'},\n {code: '5', value: 'FI-Vapaa'},\n {code: '9', value: 'FENNI<KEEP>'}\n ]\n };\n\n const ldf540 = {\n tag: '540',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {code: 'a', value: 'Aineisto on käytettävissä tutkimus- ja muihin tarkoituksiin;'},\n {code: 'b', value: 'Kansalliskirjasto;'},\n {code: 'c', value: 'Laki kulttuuriaineistojen tallettamisesta ja säilyttämisestä'},\n {code: 'u', value: 'http://www.finlex.fi/fi/laki/ajantasa/2007/20071433'},\n {code: '5', value: 'FI-Vapaa'},\n {code: '9', value: 'FENNI<KEEP>'}\n ]\n };\n\n const f5060 = {\n tag: '506',\n ind1: '0',\n ind2: ' ',\n subfields: [\n {code: 'a', value: 'Aineisto on vapaasti saatavissa.'},\n {code: 'f', value: 'Unrestricted online access'},\n {code: '2', value: 'star'},\n {code: '9', value: 'FENNI<KEEP>'}\n ]\n };\n\n const f540 = {\n tag: '540',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'c', value: 'This publication is copyrighted. You may download, display and print it for Your own personal use. Commercial use is prohibited.'}]\n };\n\n it('Creates a validator', async () => {\n const validator = await validatorFactory();\n\n expect(validator)\n .to.be.an('object')\n .that.has.any.keys('description', 'validate');\n\n expect(validator.description).to.be.a('string');\n expect(validator.validate).to.be.a('function');\n });\n\n // Tests\n const test = await (async () => {\n const validator = await validatorFactory();\n return {\n validate: async (valid, ...recfields) => {\n const result = await validator.validate(new MarcRecord({fields: recfields}));\n expect(result).to.eql({valid});\n },\n\n fix: async (recfields, resfields) => {\n const record = new MarcRecord({fields: recfields});\n await validator.fix(record);\n expect(record.fields).to.eql(resfields);\n }\n };\n })();\n\n describe('#validate', () => {\n it('Finds the record valid; Legal deposit fields 5061 and 540', async () => {\n await test.validate(true, ldf5061, ldf540);\n });\n\n it('Finds the record invalid; Missing 5061', async () => {\n await test.validate(false, f337, f5060, ldf540);\n });\n\n it('Finds the record invalid; Missing 540', async () => {\n await test.validate(false, f337, ldf5061, f540);\n });\n\n it('Finds the record invalid; Missing 5061 and 540', async () => {\n await test.validate(false, f337, f5060, f540);\n });\n });\n\n describe('#fix', () => {\n it('Legal deposit fields 5061 and 540; Nothing to add', async () => {\n await test.fix([ldf5061, ldf540], [ldf5061, ldf540]);\n });\n\n it('540 but missing 5061; Adds 5061', async () => {\n await test.fix([f5060, ldf540], [f5060, ldf5061, ldf540]);\n });\n\n it('5061 but missing 540; Adds 540', async () => {\n await test.fix([ldf5061, f540], [ldf5061, ldf540, f540]);\n });\n\n it('Both, 5061 and 540, missing; Adds 5061 and 540', async () => {\n await test.fix([f5060, f540], [f5060, ldf5061, ldf540, f540]);\n });\n });\n});\n"],"mappings":"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"}
@@ -32,7 +32,9 @@ function _default(tagPattern) {
32
32
  validation,
33
33
  ...item
34
34
  }) => item) // eslint-disable-line no-unused-vars
35
- .forEach(field => record.removeField(field));
35
+ .forEach(({
36
+ obj
37
+ }) => record.removeField(obj));
36
38
  }
37
39
 
38
40
  function iterateFields(record) {
@@ -1 +1 @@
1
- {"version":3,"file":"duplicates-ind1.js","names":["tagPattern","RegExp","description","validate","fix","Error","record","invalid","iterateFields","find","obj","validation","valid","messages","tag","filter","item","map","forEach","field","removeField","fields","matches","test","ind1","hasDuplicate","fieldA","some","fieldB","subfields","length","every","aSf","bSf","code","value"],"sources":["../src/duplicates-ind1.js"],"sourcesContent":["export default function (tagPattern) {\n if (tagPattern instanceof RegExp) {\n return {\n description:\n 'Handles data fields that only differ in the first indicator',\n validate,\n fix\n };\n }\n\n throw new Error('No tagPattern provided');\n\n function validate(record) {\n const invalid = iterateFields(record)\n .find(obj => obj.validation === true);\n return invalid ? {valid: false, messages: [`Multiple ${invalid.obj.tag} fields which only differ in the first indicator`]} : {valid: true, messages: []};\n }\n\n function fix(record) {\n iterateFields(record)\n .filter(item => item.validation === false)\n .map(({validation, ...item}) => item) // eslint-disable-line no-unused-vars\n .forEach(field => record.removeField(field));\n }\n\n function iterateFields(record) {\n return record.fields.map(obj => ({validation: matches(obj, record.fields), obj}));\n }\n\n function matches(field, fields) {\n return tagPattern.test(field.tag) && field.ind1 === ' ' && hasDuplicate(field, fields);\n }\n\n function hasDuplicate(fieldA, fields) {\n return fields.some(fieldB => fieldA !== fieldB &&\n fieldA.tag === fieldB.tag &&\n fieldA.ind1 !== fieldB.ind1 &&\n fieldA.subfields.length === fieldB.subfields.length &&\n fieldA.subfields.every(aSf => fieldB.subfields.some(bSf => aSf.code === bSf.code && aSf.value === bSf.value)));\n }\n}\n"],"mappings":";;;;;;;AAAe,kBAAUA,UAAV,EAAsB;EACnC,IAAIA,UAAU,YAAYC,MAA1B,EAAkC;IAChC,OAAO;MACLC,WAAW,EACT,6DAFG;MAGLC,QAHK;MAILC;IAJK,CAAP;EAMD;;EAED,MAAM,IAAIC,KAAJ,CAAU,wBAAV,CAAN;;EAEA,SAASF,QAAT,CAAkBG,MAAlB,EAA0B;IACxB,MAAMC,OAAO,GAAGC,aAAa,CAACF,MAAD,CAAb,CACbG,IADa,CACRC,GAAG,IAAIA,GAAG,CAACC,UAAJ,KAAmB,IADlB,CAAhB;IAEA,OAAOJ,OAAO,GAAG;MAACK,KAAK,EAAE,KAAR;MAAeC,QAAQ,EAAE,CAAE,YAAWN,OAAO,CAACG,GAAR,CAAYI,GAAI,kDAA7B;IAAzB,CAAH,GAA+G;MAACF,KAAK,EAAE,IAAR;MAAcC,QAAQ,EAAE;IAAxB,CAA7H;EACD;;EAED,SAAST,GAAT,CAAaE,MAAb,EAAqB;IACnBE,aAAa,CAACF,MAAD,CAAb,CACGS,MADH,CACUC,IAAI,IAAIA,IAAI,CAACL,UAAL,KAAoB,KADtC,EAEGM,GAFH,CAEO,CAAC;MAACN,UAAD;MAAa,GAAGK;IAAhB,CAAD,KAA2BA,IAFlC,EAEwC;IAFxC,CAGGE,OAHH,CAGWC,KAAK,IAAIb,MAAM,CAACc,WAAP,CAAmBD,KAAnB,CAHpB;EAID;;EAED,SAASX,aAAT,CAAuBF,MAAvB,EAA+B;IAC7B,OAAOA,MAAM,CAACe,MAAP,CAAcJ,GAAd,CAAkBP,GAAG,KAAK;MAACC,UAAU,EAAEW,OAAO,CAACZ,GAAD,EAAMJ,MAAM,CAACe,MAAb,CAApB;MAA0CX;IAA1C,CAAL,CAArB,CAAP;EACD;;EAED,SAASY,OAAT,CAAiBH,KAAjB,EAAwBE,MAAxB,EAAgC;IAC9B,OAAOrB,UAAU,CAACuB,IAAX,CAAgBJ,KAAK,CAACL,GAAtB,KAA8BK,KAAK,CAACK,IAAN,KAAe,GAA7C,IAAoDC,YAAY,CAACN,KAAD,EAAQE,MAAR,CAAvE;EACD;;EAED,SAASI,YAAT,CAAsBC,MAAtB,EAA8BL,MAA9B,EAAsC;IACpC,OAAOA,MAAM,CAACM,IAAP,CAAYC,MAAM,IAAIF,MAAM,KAAKE,MAAX,IAC3BF,MAAM,CAACZ,GAAP,KAAec,MAAM,CAACd,GADK,IAE3BY,MAAM,CAACF,IAAP,KAAgBI,MAAM,CAACJ,IAFI,IAG3BE,MAAM,CAACG,SAAP,CAAiBC,MAAjB,KAA4BF,MAAM,CAACC,SAAP,CAAiBC,MAHlB,IAI3BJ,MAAM,CAACG,SAAP,CAAiBE,KAAjB,CAAuBC,GAAG,IAAIJ,MAAM,CAACC,SAAP,CAAiBF,IAAjB,CAAsBM,GAAG,IAAID,GAAG,CAACE,IAAJ,KAAaD,GAAG,CAACC,IAAjB,IAAyBF,GAAG,CAACG,KAAJ,KAAcF,GAAG,CAACE,KAAxE,CAA9B,CAJK,CAAP;EAKD;AACF"}
1
+ {"version":3,"file":"duplicates-ind1.js","names":["tagPattern","RegExp","description","validate","fix","Error","record","invalid","iterateFields","find","obj","validation","valid","messages","tag","filter","item","map","forEach","removeField","fields","matches","field","test","ind1","hasDuplicate","fieldA","some","fieldB","subfields","length","every","aSf","bSf","code","value"],"sources":["../src/duplicates-ind1.js"],"sourcesContent":["export default function (tagPattern) {\n if (tagPattern instanceof RegExp) {\n return {\n description:\n 'Handles data fields that only differ in the first indicator',\n validate,\n fix\n };\n }\n\n throw new Error('No tagPattern provided');\n\n function validate(record) {\n const invalid = iterateFields(record)\n .find(obj => obj.validation === true);\n return invalid ? {valid: false, messages: [`Multiple ${invalid.obj.tag} fields which only differ in the first indicator`]} : {valid: true, messages: []};\n }\n\n function fix(record) {\n iterateFields(record)\n .filter(item => item.validation === false)\n .map(({validation, ...item}) => item) // eslint-disable-line no-unused-vars\n .forEach(({obj}) => record.removeField(obj));\n }\n\n function iterateFields(record) {\n return record.fields.map(obj => ({validation: matches(obj, record.fields), obj}));\n }\n\n function matches(field, fields) {\n return tagPattern.test(field.tag) && field.ind1 === ' ' && hasDuplicate(field, fields);\n }\n\n function hasDuplicate(fieldA, fields) {\n return fields.some(fieldB => fieldA !== fieldB &&\n fieldA.tag === fieldB.tag &&\n fieldA.ind1 !== fieldB.ind1 &&\n fieldA.subfields.length === fieldB.subfields.length &&\n fieldA.subfields.every(aSf => fieldB.subfields.some(bSf => aSf.code === bSf.code && aSf.value === bSf.value)));\n }\n}\n"],"mappings":";;;;;;;AAAe,kBAAUA,UAAV,EAAsB;EACnC,IAAIA,UAAU,YAAYC,MAA1B,EAAkC;IAChC,OAAO;MACLC,WAAW,EACT,6DAFG;MAGLC,QAHK;MAILC;IAJK,CAAP;EAMD;;EAED,MAAM,IAAIC,KAAJ,CAAU,wBAAV,CAAN;;EAEA,SAASF,QAAT,CAAkBG,MAAlB,EAA0B;IACxB,MAAMC,OAAO,GAAGC,aAAa,CAACF,MAAD,CAAb,CACbG,IADa,CACRC,GAAG,IAAIA,GAAG,CAACC,UAAJ,KAAmB,IADlB,CAAhB;IAEA,OAAOJ,OAAO,GAAG;MAACK,KAAK,EAAE,KAAR;MAAeC,QAAQ,EAAE,CAAE,YAAWN,OAAO,CAACG,GAAR,CAAYI,GAAI,kDAA7B;IAAzB,CAAH,GAA+G;MAACF,KAAK,EAAE,IAAR;MAAcC,QAAQ,EAAE;IAAxB,CAA7H;EACD;;EAED,SAAST,GAAT,CAAaE,MAAb,EAAqB;IACnBE,aAAa,CAACF,MAAD,CAAb,CACGS,MADH,CACUC,IAAI,IAAIA,IAAI,CAACL,UAAL,KAAoB,KADtC,EAEGM,GAFH,CAEO,CAAC;MAACN,UAAD;MAAa,GAAGK;IAAhB,CAAD,KAA2BA,IAFlC,EAEwC;IAFxC,CAGGE,OAHH,CAGW,CAAC;MAACR;IAAD,CAAD,KAAWJ,MAAM,CAACa,WAAP,CAAmBT,GAAnB,CAHtB;EAID;;EAED,SAASF,aAAT,CAAuBF,MAAvB,EAA+B;IAC7B,OAAOA,MAAM,CAACc,MAAP,CAAcH,GAAd,CAAkBP,GAAG,KAAK;MAACC,UAAU,EAAEU,OAAO,CAACX,GAAD,EAAMJ,MAAM,CAACc,MAAb,CAApB;MAA0CV;IAA1C,CAAL,CAArB,CAAP;EACD;;EAED,SAASW,OAAT,CAAiBC,KAAjB,EAAwBF,MAAxB,EAAgC;IAC9B,OAAOpB,UAAU,CAACuB,IAAX,CAAgBD,KAAK,CAACR,GAAtB,KAA8BQ,KAAK,CAACE,IAAN,KAAe,GAA7C,IAAoDC,YAAY,CAACH,KAAD,EAAQF,MAAR,CAAvE;EACD;;EAED,SAASK,YAAT,CAAsBC,MAAtB,EAA8BN,MAA9B,EAAsC;IACpC,OAAOA,MAAM,CAACO,IAAP,CAAYC,MAAM,IAAIF,MAAM,KAAKE,MAAX,IAC3BF,MAAM,CAACZ,GAAP,KAAec,MAAM,CAACd,GADK,IAE3BY,MAAM,CAACF,IAAP,KAAgBI,MAAM,CAACJ,IAFI,IAG3BE,MAAM,CAACG,SAAP,CAAiBC,MAAjB,KAA4BF,MAAM,CAACC,SAAP,CAAiBC,MAHlB,IAI3BJ,MAAM,CAACG,SAAP,CAAiBE,KAAjB,CAAuBC,GAAG,IAAIJ,MAAM,CAACC,SAAP,CAAiBF,IAAjB,CAAsBM,GAAG,IAAID,GAAG,CAACE,IAAJ,KAAaD,GAAG,CAACC,IAAjB,IAAyBF,GAAG,CAACG,KAAJ,KAAcF,GAAG,CAACE,KAAxE,CAA9B,CAJK,CAAP;EAKD;AACF"}
@@ -4,106 +4,53 @@ var _chai = require("chai");
4
4
 
5
5
  var _marcRecord = require("@natlibfi/marc-record");
6
6
 
7
- var _duplicatesInd = _interopRequireDefault(require("../src/duplicates-ind1"));
7
+ var _duplicatesInd = _interopRequireDefault(require("./duplicates-ind1"));
8
+
9
+ var _fixura = require("@natlibfi/fixura");
10
+
11
+ var _fixugen = _interopRequireDefault(require("@natlibfi/fixugen"));
12
+
13
+ var _debug = _interopRequireDefault(require("debug"));
8
14
 
9
15
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
10
16
 
11
- describe('duplicates-ind1', () => {
12
- it('Creates a validator', async () => {
13
- const validator = await (0, _duplicatesInd.default)(/^245$/u);
14
- (0, _chai.expect)(validator).to.be.an('object').that.has.any.keys('description', 'validate');
15
- (0, _chai.expect)(validator.description).to.be.a('string');
16
- (0, _chai.expect)(validator.validate).to.be.a('function');
17
- });
18
- describe('#validate', () => {
19
- it('Finds the record valid', async () => {
20
- const validator = await (0, _duplicatesInd.default)(/^500$/u);
21
- const record = new _marcRecord.MarcRecord({
22
- fields: [{
23
- tag: '500',
24
- ind1: ' ',
25
- ind2: '0',
26
- subfields: [{
27
- code: 'a',
28
- value: 'foo'
29
- }]
30
- }, {
31
- tag: '500',
32
- ind1: ' ',
33
- ind2: '0',
34
- subfields: [{
35
- code: 'a',
36
- value: 'foo'
37
- }]
38
- }]
39
- });
40
- const result = await validator.validate(record);
41
- (0, _chai.expect)(result).to.eql({
42
- valid: true,
43
- messages: []
44
- });
45
- });
46
- it('Finds the record invalid', async () => {
47
- const validator = await (0, _duplicatesInd.default)(/^500$/u);
48
- const record = new _marcRecord.MarcRecord({
49
- fields: [{
50
- tag: '500',
51
- ind1: ' ',
52
- ind2: '0',
53
- subfields: [{
54
- code: 'a',
55
- value: 'foo'
56
- }]
57
- }, {
58
- tag: '500',
59
- ind1: '1',
60
- ind2: '0',
61
- subfields: [{
62
- code: 'a',
63
- value: 'foo'
64
- }]
65
- }]
66
- });
67
- const result = await validator.validate(record);
68
- (0, _chai.expect)(result).to.eql({
69
- valid: false,
70
- messages: ['Multiple 500 fields which only differ in the first indicator']
71
- });
72
- });
73
- });
74
- describe('#fix', () => {
75
- it('Removes duplicate values', async () => {
76
- const validator = await (0, _duplicatesInd.default)(/^500$/u);
77
- const record = new _marcRecord.MarcRecord({
78
- fields: [{
79
- tag: '500',
80
- ind1: ' ',
81
- ind2: '0',
82
- subfields: [{
83
- code: 'a',
84
- value: 'foo'
85
- }]
86
- }, {
87
- tag: '500',
88
- ind1: '1',
89
- ind2: '0',
90
- subfields: [{
91
- code: 'a',
92
- value: 'foo'
93
- }]
94
- }]
95
- });
96
- await validator.fix(record);
97
- (0, _chai.expect)(record.fields).to.eql([{
98
- tag: '500',
99
- ind1: ' ',
100
- ind2: '0',
101
- subfields: [{
102
- code: 'a',
103
- value: 'foo'
104
- }]
105
- }]);
106
- });
107
- });
17
+ (0, _fixugen.default)({
18
+ callback,
19
+ path: [__dirname, '..', 'test-fixtures', 'duplicates-ind1'],
20
+ useMetadataFile: true,
21
+ recurse: false,
22
+ fixura: {
23
+ reader: _fixura.READERS.JSON
24
+ },
25
+ mocha: {
26
+ before: () => testValidatorFactory()
27
+ }
108
28
  });
29
+ const debug = (0, _debug.default)('@natlibfi/marc-record-validators-melinda/duplicates-ind1:test');
30
+
31
+ async function testValidatorFactory() {
32
+ const validator = await (0, _duplicatesInd.default)(/^500$/u);
33
+ (0, _chai.expect)(validator).to.be.an('object').that.has.any.keys('description', 'validate');
34
+ (0, _chai.expect)(validator.description).to.be.a('string');
35
+ (0, _chai.expect)(validator.validate).to.be.a('function');
36
+ }
37
+
38
+ async function callback({
39
+ getFixture,
40
+ tagPattern,
41
+ fix = false
42
+ }) {
43
+ const validator = await (0, _duplicatesInd.default)(new RegExp(tagPattern, 'u'));
44
+ const record = new _marcRecord.MarcRecord(getFixture('record.json'));
45
+ const expectedResult = getFixture('expectedResult.json');
46
+
47
+ if (!fix) {
48
+ const result = await validator.validate(record);
49
+ return (0, _chai.expect)(result).to.eql(expectedResult);
50
+ }
51
+
52
+ const fixedRecord = await validator.fix(record);
53
+ debug(fixedRecord);
54
+ (0, _chai.expect)(record.fields).to.eql(expectedResult);
55
+ }
109
56
  //# sourceMappingURL=duplicates-ind1.spec.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"duplicates-ind1.spec.js","names":["describe","it","validator","validatorFactory","expect","to","be","an","that","has","any","keys","description","a","validate","record","MarcRecord","fields","tag","ind1","ind2","subfields","code","value","result","eql","valid","messages","fix"],"sources":["../src/duplicates-ind1.spec.js"],"sourcesContent":["import {expect} from 'chai';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from '../src/duplicates-ind1';\n\ndescribe('duplicates-ind1', () => {\n it('Creates a validator', async () => {\n const validator = await validatorFactory(/^245$/u);\n\n expect(validator)\n .to.be.an('object')\n .that.has.any.keys('description', 'validate');\n\n expect(validator.description).to.be.a('string');\n expect(validator.validate).to.be.a('function');\n });\n\n describe('#validate', () => {\n it('Finds the record valid', async () => {\n const validator = await validatorFactory(/^500$/u);\n const record = new MarcRecord({\n fields: [\n {\n tag: '500',\n ind1: ' ',\n ind2: '0',\n subfields: [{code: 'a', value: 'foo'}]\n },\n {\n tag: '500',\n ind1: ' ',\n ind2: '0',\n subfields: [{code: 'a', value: 'foo'}]\n }\n ]\n });\n const result = await validator.validate(record);\n\n expect(result).to.eql({valid: true, messages: []});\n });\n it('Finds the record invalid', async () => {\n const validator = await validatorFactory(/^500$/u);\n const record = new MarcRecord({\n fields: [\n {\n tag: '500',\n ind1: ' ',\n ind2: '0',\n subfields: [{code: 'a', value: 'foo'}]\n },\n {\n tag: '500',\n ind1: '1',\n ind2: '0',\n subfields: [{code: 'a', value: 'foo'}]\n }\n ]\n });\n const result = await validator.validate(record);\n\n expect(result).to.eql({valid: false, messages: ['Multiple 500 fields which only differ in the first indicator']});\n });\n });\n\n describe('#fix', () => {\n it('Removes duplicate values', async () => {\n const validator = await validatorFactory(/^500$/u);\n const record = new MarcRecord({\n fields: [\n {\n tag: '500',\n ind1: ' ',\n ind2: '0',\n subfields: [{code: 'a', value: 'foo'}]\n },\n {\n tag: '500',\n ind1: '1',\n ind2: '0',\n subfields: [{code: 'a', value: 'foo'}]\n }\n ]\n });\n await validator.fix(record);\n expect(record.fields).to.eql([\n {\n tag: '500',\n ind1: ' ',\n ind2: '0',\n subfields: [{code: 'a', value: 'foo'}]\n }\n ]);\n });\n });\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"duplicates-ind1.spec.js","names":["generateTests","callback","path","__dirname","useMetadataFile","recurse","fixura","reader","READERS","JSON","mocha","before","testValidatorFactory","debug","createDebugLogger","validator","validatorFactory","expect","to","be","an","that","has","any","keys","description","a","validate","getFixture","tagPattern","fix","RegExp","record","MarcRecord","expectedResult","result","eql","fixedRecord","fields"],"sources":["../src/duplicates-ind1.spec.js"],"sourcesContent":["import {expect} from 'chai';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './duplicates-ind1';\n\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\nimport createDebugLogger from 'debug';\n\ngenerateTests({\n callback,\n path: [__dirname, '..', 'test-fixtures', 'duplicates-ind1'],\n useMetadataFile: true,\n recurse: false,\n fixura: {\n reader: READERS.JSON\n },\n mocha: {\n before: () => testValidatorFactory()\n }\n});\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/duplicates-ind1:test');\n\nasync function testValidatorFactory() {\n const validator = await validatorFactory(/^500$/u);\n\n expect(validator)\n .to.be.an('object')\n .that.has.any.keys('description', 'validate');\n\n expect(validator.description).to.be.a('string');\n expect(validator.validate).to.be.a('function');\n}\n\nasync function callback({getFixture, tagPattern, fix = false}) {\n const validator = await validatorFactory(new RegExp(tagPattern, 'u'));\n const record = new MarcRecord(getFixture('record.json'));\n const expectedResult = getFixture('expectedResult.json');\n\n if (!fix) {\n const result = await validator.validate(record);\n return expect(result).to.eql(expectedResult);\n }\n\n const fixedRecord = await validator.fix(record);\n debug(fixedRecord);\n expect(record.fields).to.eql(expectedResult);\n}\n"],"mappings":";;AAAA;;AACA;;AACA;;AAEA;;AACA;;AACA;;;;AAEA,IAAAA,gBAAA,EAAc;EACZC,QADY;EAEZC,IAAI,EAAE,CAACC,SAAD,EAAY,IAAZ,EAAkB,eAAlB,EAAmC,iBAAnC,CAFM;EAGZC,eAAe,EAAE,IAHL;EAIZC,OAAO,EAAE,KAJG;EAKZC,MAAM,EAAE;IACNC,MAAM,EAAEC,eAAA,CAAQC;EADV,CALI;EAQZC,KAAK,EAAE;IACLC,MAAM,EAAE,MAAMC,oBAAoB;EAD7B;AARK,CAAd;AAaA,MAAMC,KAAK,GAAG,IAAAC,cAAA,EAAkB,+DAAlB,CAAd;;AAEA,eAAeF,oBAAf,GAAsC;EACpC,MAAMG,SAAS,GAAG,MAAM,IAAAC,sBAAA,EAAiB,QAAjB,CAAxB;EAEA,IAAAC,YAAA,EAAOF,SAAP,EACGG,EADH,CACMC,EADN,CACSC,EADT,CACY,QADZ,EAEGC,IAFH,CAEQC,GAFR,CAEYC,GAFZ,CAEgBC,IAFhB,CAEqB,aAFrB,EAEoC,UAFpC;EAIA,IAAAP,YAAA,EAAOF,SAAS,CAACU,WAAjB,EAA8BP,EAA9B,CAAiCC,EAAjC,CAAoCO,CAApC,CAAsC,QAAtC;EACA,IAAAT,YAAA,EAAOF,SAAS,CAACY,QAAjB,EAA2BT,EAA3B,CAA8BC,EAA9B,CAAiCO,CAAjC,CAAmC,UAAnC;AACD;;AAED,eAAezB,QAAf,CAAwB;EAAC2B,UAAD;EAAaC,UAAb;EAAyBC,GAAG,GAAG;AAA/B,CAAxB,EAA+D;EAC7D,MAAMf,SAAS,GAAG,MAAM,IAAAC,sBAAA,EAAiB,IAAIe,MAAJ,CAAWF,UAAX,EAAuB,GAAvB,CAAjB,CAAxB;EACA,MAAMG,MAAM,GAAG,IAAIC,sBAAJ,CAAeL,UAAU,CAAC,aAAD,CAAzB,CAAf;EACA,MAAMM,cAAc,GAAGN,UAAU,CAAC,qBAAD,CAAjC;;EAEA,IAAI,CAACE,GAAL,EAAU;IACR,MAAMK,MAAM,GAAG,MAAMpB,SAAS,CAACY,QAAV,CAAmBK,MAAnB,CAArB;IACA,OAAO,IAAAf,YAAA,EAAOkB,MAAP,EAAejB,EAAf,CAAkBkB,GAAlB,CAAsBF,cAAtB,CAAP;EACD;;EAED,MAAMG,WAAW,GAAG,MAAMtB,SAAS,CAACe,GAAV,CAAcE,MAAd,CAA1B;EACAnB,KAAK,CAACwB,WAAD,CAAL;EACA,IAAApB,YAAA,EAAOe,MAAM,CAACM,MAAd,EAAsBpB,EAAtB,CAAyBkB,GAAzB,CAA6BF,cAA7B;AACD"}
@@ -0,0 +1,266 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = _default;
7
+ exports.recordNormalizeIndicators = recordNormalizeIndicators;
8
+
9
+ // Relocated from melinda-marc-record-merge-reducers (and renamed)
10
+ //import createDebugLogger from 'debug';
11
+ //const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:normalizeIdentifiers');
12
+ function fieldToString(f) {
13
+ if (!f.subfields) {
14
+ return `${f.tag} ${f.value}`;
15
+ }
16
+
17
+ return `${f.tag} ${f.ind1}${f.ind2} ‡${formatSubfields(f)}`;
18
+
19
+ function formatSubfields(field) {
20
+ //return field.subfields.map(sf => `${sf.code}${sf.value || ''}`).join('‡');
21
+ return field.subfields.map(sf => `${sf.code}${sf.value}`).join(' ‡');
22
+ }
23
+ }
24
+ /*
25
+ function nvdebug(message, func) {
26
+ if (func) { // eslint-disable-line functional/no-conditional-statement
27
+ func(message);
28
+ }
29
+ console.info(message); // eslint-disable-line no-console
30
+ }
31
+ */
32
+
33
+
34
+ function _default() {
35
+ // NB! We should and could handle ISNIs here as well.
36
+ return {
37
+ description: 'Normalizes indicator values',
38
+ validate,
39
+ fix
40
+ };
41
+
42
+ function fix(record) {
43
+ const res = {
44
+ message: [],
45
+ fix: [],
46
+ valid: true
47
+ }; //message.fix = []; // eslint-disable-line functional/immutable-data
48
+ // Actual parsing of all fields
49
+
50
+ /*
51
+ if (!record.fields) {
52
+ return false;
53
+ }
54
+ */
55
+
56
+ recordNormalizeIndicators(record); // message.valid = !(message.message.length >= 1); // eslint-disable-line functional/immutable-data
57
+
58
+ return res;
59
+ }
60
+
61
+ function validate(record) {
62
+ const res = {
63
+ message: []
64
+ }; //nvdebug(`NORMALIZE CONTROL NUMBER VALIDATE`, debug);
65
+ // Actual parsing of all fields
66
+
67
+ /*
68
+ if (!record.fields) {
69
+ return false;
70
+ }
71
+ */
72
+
73
+ validateRecord(record, res);
74
+ res.valid = res.message.length < 1; // eslint-disable-line functional/immutable-data
75
+
76
+ return res;
77
+ }
78
+
79
+ function validateRecord(record, res) {
80
+ //nvdebug(record);
81
+ const clonedFields = JSON.parse(JSON.stringify(record.fields));
82
+ recordNormalizeIndicators(record);
83
+ record.fields.forEach((field, index) => compareFields(field, index));
84
+
85
+ function compareFields(field, index) {
86
+ const origFieldAsString = fieldToString(clonedFields[index]); //const clonedFieldAsString = fieldToString(field);
87
+
88
+ if (clonedFields[index].ind1 !== field.ind1) {
89
+ // eslint-disable-line functional/no-conditional-statement
90
+ //nvdebug(`FIX IND1: '${clonedFields[index].ind1}' => '${field.ind1}': ${clonedFieldAsString}`);
91
+ res.message.push(`Expected IND1 for '${origFieldAsString}' is '${field.ind1}'`); // eslint-disable-line functional/immutable-data
92
+ }
93
+
94
+ if (clonedFields[index].ind2 !== field.ind2) {
95
+ // eslint-disable-line functional/no-conditional-statement
96
+ //nvdebug(`FIX IND2: '${clonedFields[index].ind2}' => '${field.ind2}': ${clonedFieldAsString}`);
97
+ res.message.push(`Expected IND2 for '${origFieldAsString}' is '${field.ind2}'`); // eslint-disable-line functional/immutable-data
98
+ }
99
+ } // Validator should not change the original record:
100
+
101
+
102
+ record.fields = clonedFields; // eslint-disable-line functional/immutable-data
103
+
104
+ return;
105
+ }
106
+ }
107
+
108
+ const ind1NonFilingChars = ['130', '630', '730', '740'];
109
+ const ind2NonFilingChars = ['222', '240', '242', '243', '245', '830'];
110
+
111
+ function hasNonFilingIndicator1(field) {
112
+ return ind1NonFilingChars.includes(field.tag);
113
+ }
114
+
115
+ function modifiableIndicatorValue(value) {
116
+ // If field contains a legit-looking value, don't try to modify it here...
117
+ return !['9', '8', '7', '6', '5', '4', '3', '2', '1'].includes(value);
118
+ }
119
+
120
+ function hasNonFilingIndicator2(field) {
121
+ return ind2NonFilingChars.includes(field.tag);
122
+ }
123
+
124
+ function valueBeginsWithDeterminer(value, cands) {
125
+ return cands.find(cand => value.substring(0, cand.length) === cand);
126
+ }
127
+
128
+ function determineNonFilingIndicatorValue(field, languages = undefined) {
129
+ const subfieldA = field.subfields.find(sf => sf.code === 'a');
130
+
131
+ if (!subfieldA) {
132
+ // nvdebug(' Subfield $a miss!');
133
+ return;
134
+ }
135
+
136
+ const name = subfieldA.value.toLowerCase();
137
+
138
+ if (languages.includes('eng')) {
139
+ const match = valueBeginsWithDeterminer(name, ['a ', 'an ', 'the ']);
140
+
141
+ if (match) {
142
+ return `${match.length}`;
143
+ }
144
+ }
145
+
146
+ if (languages.includes('fre')) {
147
+ const match = valueBeginsWithDeterminer(name, ['l\'', 'le ']);
148
+
149
+ if (match) {
150
+ return `${match.length}`;
151
+ }
152
+ }
153
+
154
+ if (languages.includes('ger')) {
155
+ const match = valueBeginsWithDeterminer(name, ['das ', 'der ', 'die ']);
156
+
157
+ if (match) {
158
+ return `${match.length}`;
159
+ }
160
+ }
161
+
162
+ if (languages.includes('swe')) {
163
+ const match = valueBeginsWithDeterminer(name, ['en ', 'ett ']);
164
+
165
+ if (match) {
166
+ return `${match.length}`;
167
+ }
168
+ } // Fallback-ish: try to guess even without languages:
169
+
170
+
171
+ const match = valueBeginsWithDeterminer(name, ['the ']);
172
+
173
+ if (match) {
174
+ return `${match.length}`;
175
+ }
176
+
177
+ return '0';
178
+ }
179
+
180
+ function normalizeNonFilingIndicator1(field, languages = []) {
181
+ if (!hasNonFilingIndicator1(field) || !modifiableIndicatorValue(field.ind1)) {
182
+ return;
183
+ }
184
+
185
+ field.ind1 = determineNonFilingIndicatorValue(field, languages); // eslint-disable-line functional/immutable-data
186
+ }
187
+
188
+ function normalizeNonFilingIndicator2(field, languages = []) {
189
+ if (!hasNonFilingIndicator2(field) || !modifiableIndicatorValue(field.ind2)) {
190
+ return;
191
+ }
192
+
193
+ field.ind2 = determineNonFilingIndicatorValue(field, languages); // eslint-disable-line functional/immutable-data
194
+ }
195
+
196
+ function normalize245Indicator1(field, record) {
197
+ if (field.tag !== '245') {
198
+ return;
199
+ }
200
+
201
+ const field1XX = record.get('^1..$');
202
+ field.ind1 = field1XX.length === 0 ? '0' : '1'; // eslint-disable-line functional/immutable-data
203
+ }
204
+
205
+ function recordNormalize490(record) {
206
+ const fields490 = record.get('^490$');
207
+ const fields8XX = record.get('^(?:800|810|811|830)$');
208
+
209
+ if (fields490.length === 0) {
210
+ return;
211
+ }
212
+
213
+ if (fields490.length <= fields8XX.length) {
214
+ // Trace found for each field 490:
215
+ fields490.forEach(f => {
216
+ f.ind1 = '1'; // eslint-disable-line functional/immutable-data
217
+ });
218
+ return;
219
+ }
220
+
221
+ if (fields8XX.length === 0) {
222
+ // Fields 490 are always untraced (no traces found)
223
+ fields490.forEach(f => {
224
+ f.ind1 = '0'; // eslint-disable-line functional/immutable-data
225
+ });
226
+ return;
227
+ } // For other combinations we just can't be sure, so leave them as they are.
228
+
229
+ }
230
+
231
+ function getLanguages(record) {
232
+ const langFields = record.get('^041$');
233
+
234
+ if (langFields.length === 0) {
235
+ return [];
236
+ }
237
+
238
+ return langFields[0].subfields.filter(sf => isRelevantSubfield(sf)).map(subfield => subfield.value);
239
+
240
+ function isRelevantSubfield(subfield) {
241
+ if (subfield.code !== 'a' && subfield.code !== 'd') {
242
+ return false;
243
+ }
244
+
245
+ if (subfield.value.length !== 3) {
246
+ return false;
247
+ } // We could require /^[a-z][a-z][a-z]$/ etc as well, but it's not really that relevant.
248
+
249
+
250
+ return true;
251
+ }
252
+ }
253
+
254
+ function recordNormalizeIndicators(record) {
255
+ recordNormalize490(record); // Language is used to handle non-filing indicators
256
+
257
+ const languages = getLanguages(record);
258
+ record.fields.forEach(field => fieldNormalizeIndicators(field, record, languages));
259
+ }
260
+
261
+ function fieldNormalizeIndicators(field, record, languages) {
262
+ normalize245Indicator1(field, record);
263
+ normalizeNonFilingIndicator1(field, languages);
264
+ normalizeNonFilingIndicator2(field, languages);
265
+ }
266
+ //# sourceMappingURL=indicator-fixes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indicator-fixes.js","names":["fieldToString","f","subfields","tag","value","ind1","ind2","formatSubfields","field","map","sf","code","join","description","validate","fix","record","res","message","valid","recordNormalizeIndicators","validateRecord","length","clonedFields","JSON","parse","stringify","fields","forEach","index","compareFields","origFieldAsString","push","ind1NonFilingChars","ind2NonFilingChars","hasNonFilingIndicator1","includes","modifiableIndicatorValue","hasNonFilingIndicator2","valueBeginsWithDeterminer","cands","find","cand","substring","determineNonFilingIndicatorValue","languages","undefined","subfieldA","name","toLowerCase","match","normalizeNonFilingIndicator1","normalizeNonFilingIndicator2","normalize245Indicator1","field1XX","get","recordNormalize490","fields490","fields8XX","getLanguages","langFields","filter","isRelevantSubfield","subfield","fieldNormalizeIndicators"],"sources":["../src/indicator-fixes.js"],"sourcesContent":["// Relocated from melinda-marc-record-merge-reducers (and renamed)\n//import createDebugLogger from 'debug';\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:normalizeIdentifiers');\n\n\nfunction fieldToString(f) {\n if (!f.subfields) {\n return `${f.tag} ${f.value}`;\n }\n return `${f.tag} ${f.ind1}${f.ind2} ‡${formatSubfields(f)}`;\n\n function formatSubfields(field) {\n //return field.subfields.map(sf => `${sf.code}${sf.value || ''}`).join('‡');\n return field.subfields.map(sf => `${sf.code}${sf.value}`).join(' ‡');\n }\n}\n\n/*\nfunction nvdebug(message, func) {\n if (func) { // eslint-disable-line functional/no-conditional-statement\n func(message);\n }\n console.info(message); // eslint-disable-line no-console\n}\n*/\n\nexport default function () {\n\n // NB! We should and could handle ISNIs here as well.\n return {\n description: 'Normalizes indicator values',\n validate, fix\n };\n\n function fix(record) {\n const res = {message: [], fix: [], valid: true};\n //message.fix = []; // eslint-disable-line functional/immutable-data\n\n // Actual parsing of all fields\n /*\n if (!record.fields) {\n return false;\n }\n */\n\n\n recordNormalizeIndicators(record);\n\n\n // message.valid = !(message.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n //nvdebug(`NORMALIZE CONTROL NUMBER VALIDATE`, debug);\n // Actual parsing of all fields\n /*\n if (!record.fields) {\n return false;\n }\n */\n\n validateRecord(record, res);\n\n res.valid = res.message.length < 1; // eslint-disable-line functional/immutable-data\n return res;\n }\n\n\n function validateRecord(record, res) {\n //nvdebug(record);\n const clonedFields = JSON.parse(JSON.stringify(record.fields));\n recordNormalizeIndicators(record);\n\n record.fields.forEach((field, index) => compareFields(field, index));\n\n function compareFields(field, index) {\n const origFieldAsString = fieldToString(clonedFields[index]);\n //const clonedFieldAsString = fieldToString(field);\n if (clonedFields[index].ind1 !== field.ind1) { // eslint-disable-line functional/no-conditional-statement\n //nvdebug(`FIX IND1: '${clonedFields[index].ind1}' => '${field.ind1}': ${clonedFieldAsString}`);\n res.message.push(`Expected IND1 for '${origFieldAsString}' is '${field.ind1}'`); // eslint-disable-line functional/immutable-data\n }\n if (clonedFields[index].ind2 !== field.ind2) { // eslint-disable-line functional/no-conditional-statement\n //nvdebug(`FIX IND2: '${clonedFields[index].ind2}' => '${field.ind2}': ${clonedFieldAsString}`);\n res.message.push(`Expected IND2 for '${origFieldAsString}' is '${field.ind2}'`); // eslint-disable-line functional/immutable-data\n }\n }\n // Validator should not change the original record:\n record.fields = clonedFields; // eslint-disable-line functional/immutable-data\n return;\n }\n}\n\n\nconst ind1NonFilingChars = ['130', '630', '730', '740'];\nconst ind2NonFilingChars = ['222', '240', '242', '243', '245', '830'];\n\nfunction hasNonFilingIndicator1(field) {\n return ind1NonFilingChars.includes(field.tag);\n}\n\nfunction modifiableIndicatorValue(value) {\n // If field contains a legit-looking value, don't try to modify it here...\n return !['9', '8', '7', '6', '5', '4', '3', '2', '1'].includes(value);\n}\n\nfunction hasNonFilingIndicator2(field) {\n return ind2NonFilingChars.includes(field.tag);\n}\n\nfunction valueBeginsWithDeterminer(value, cands) {\n return cands.find(cand => value.substring(0, cand.length) === cand);\n}\n\nfunction determineNonFilingIndicatorValue(field, languages = undefined) {\n const subfieldA = field.subfields.find(sf => sf.code === 'a');\n if (!subfieldA) {\n // nvdebug(' Subfield $a miss!');\n return;\n }\n\n const name = subfieldA.value.toLowerCase();\n\n if (languages.includes('eng')) {\n const match = valueBeginsWithDeterminer(name, ['a ', 'an ', 'the ']);\n if (match) {\n return `${match.length}`;\n }\n }\n\n if (languages.includes('fre')) {\n const match = valueBeginsWithDeterminer(name, ['l\\'', 'le ']);\n if (match) {\n return `${match.length}`;\n }\n }\n\n if (languages.includes('ger')) {\n const match = valueBeginsWithDeterminer(name, ['das ', 'der ', 'die ']);\n if (match) {\n return `${match.length}`;\n }\n }\n\n if (languages.includes('swe')) {\n const match = valueBeginsWithDeterminer(name, ['en ', 'ett ']);\n if (match) {\n return `${match.length}`;\n }\n }\n\n // Fallback-ish: try to guess even without languages:\n const match = valueBeginsWithDeterminer(name, ['the ']);\n if (match) {\n return `${match.length}`;\n }\n\n return '0';\n}\n\nfunction normalizeNonFilingIndicator1(field, languages = []) {\n if (!hasNonFilingIndicator1(field) || !modifiableIndicatorValue(field.ind1)) {\n return;\n }\n\n field.ind1 = determineNonFilingIndicatorValue(field, languages); // eslint-disable-line functional/immutable-data\n}\n\nfunction normalizeNonFilingIndicator2(field, languages = []) {\n if (!hasNonFilingIndicator2(field) || !modifiableIndicatorValue(field.ind2)) {\n return;\n }\n\n field.ind2 = determineNonFilingIndicatorValue(field, languages); // eslint-disable-line functional/immutable-data\n}\n\n\nfunction normalize245Indicator1(field, record) {\n if (field.tag !== '245') {\n return;\n }\n const field1XX = record.get('^1..$');\n field.ind1 = field1XX.length === 0 ? '0' : '1'; // eslint-disable-line functional/immutable-data\n}\n\n\nfunction recordNormalize490(record) {\n const fields490 = record.get('^490$');\n const fields8XX = record.get('^(?:800|810|811|830)$');\n\n if (fields490.length === 0) {\n return;\n }\n if (fields490.length <= fields8XX.length) {\n // Trace found for each field 490:\n fields490.forEach(f => {\n f.ind1 = '1'; // eslint-disable-line functional/immutable-data\n });\n return;\n }\n if (fields8XX.length === 0) { // Fields 490 are always untraced (no traces found)\n fields490.forEach(f => {\n f.ind1 = '0'; // eslint-disable-line functional/immutable-data\n });\n return;\n }\n // For other combinations we just can't be sure, so leave them as they are.\n}\n\n\nfunction getLanguages(record) {\n const langFields = record.get('^041$');\n\n if (langFields.length === 0) {\n return [];\n }\n\n return langFields[0].subfields.filter(sf => isRelevantSubfield(sf)).map(subfield => subfield.value);\n\n function isRelevantSubfield(subfield) {\n if (subfield.code !== 'a' && subfield.code !== 'd') {\n return false;\n }\n if (subfield.value.length !== 3) {\n return false;\n }\n // We could require /^[a-z][a-z][a-z]$/ etc as well, but it's not really that relevant.\n return true;\n }\n\n}\n\nexport function recordNormalizeIndicators(record) {\n recordNormalize490(record);\n\n // Language is used to handle non-filing indicators\n const languages = getLanguages(record);\n\n record.fields.forEach(field => fieldNormalizeIndicators(field, record, languages));\n\n}\n\nfunction fieldNormalizeIndicators(field, record, languages) {\n normalize245Indicator1(field, record);\n normalizeNonFilingIndicator1(field, languages);\n normalizeNonFilingIndicator2(field, languages);\n}\n"],"mappings":";;;;;;;;AAAA;AACA;AACA;AAGA,SAASA,aAAT,CAAuBC,CAAvB,EAA0B;EACxB,IAAI,CAACA,CAAC,CAACC,SAAP,EAAkB;IAChB,OAAQ,GAAED,CAAC,CAACE,GAAI,OAAMF,CAAC,CAACG,KAAM,EAA9B;EACD;;EACD,OAAQ,GAAEH,CAAC,CAACE,GAAI,IAAGF,CAAC,CAACI,IAAK,GAAEJ,CAAC,CAACK,IAAK,KAAIC,eAAe,CAACN,CAAD,CAAI,EAA1D;;EAEA,SAASM,eAAT,CAAyBC,KAAzB,EAAgC;IAC9B;IACA,OAAOA,KAAK,CAACN,SAAN,CAAgBO,GAAhB,CAAoBC,EAAE,IAAK,GAAEA,EAAE,CAACC,IAAK,GAAED,EAAE,CAACN,KAAM,EAAhD,EAAmDQ,IAAnD,CAAwD,IAAxD,CAAP;EACD;AACF;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAEe,oBAAY;EAEzB;EACA,OAAO;IACLC,WAAW,EAAE,6BADR;IAELC,QAFK;IAEKC;EAFL,CAAP;;EAKA,SAASA,GAAT,CAAaC,MAAb,EAAqB;IACnB,MAAMC,GAAG,GAAG;MAACC,OAAO,EAAE,EAAV;MAAcH,GAAG,EAAE,EAAnB;MAAuBI,KAAK,EAAE;IAA9B,CAAZ,CADmB,CAEnB;IAEA;;IACA;AACJ;AACA;AACA;AACA;;IAGIC,yBAAyB,CAACJ,MAAD,CAAzB,CAZmB,CAenB;;IACA,OAAOC,GAAP;EACD;;EAED,SAASH,QAAT,CAAkBE,MAAlB,EAA0B;IACxB,MAAMC,GAAG,GAAG;MAACC,OAAO,EAAE;IAAV,CAAZ,CADwB,CAExB;IACA;;IACA;AACJ;AACA;AACA;AACA;;IAEIG,cAAc,CAACL,MAAD,EAASC,GAAT,CAAd;IAEAA,GAAG,CAACE,KAAJ,GAAYF,GAAG,CAACC,OAAJ,CAAYI,MAAZ,GAAqB,CAAjC,CAZwB,CAYY;;IACpC,OAAOL,GAAP;EACD;;EAGD,SAASI,cAAT,CAAwBL,MAAxB,EAAgCC,GAAhC,EAAqC;IACnC;IACA,MAAMM,YAAY,GAAGC,IAAI,CAACC,KAAL,CAAWD,IAAI,CAACE,SAAL,CAAeV,MAAM,CAACW,MAAtB,CAAX,CAArB;IACAP,yBAAyB,CAACJ,MAAD,CAAzB;IAEAA,MAAM,CAACW,MAAP,CAAcC,OAAd,CAAsB,CAACpB,KAAD,EAAQqB,KAAR,KAAkBC,aAAa,CAACtB,KAAD,EAAQqB,KAAR,CAArD;;IAEA,SAASC,aAAT,CAAuBtB,KAAvB,EAA8BqB,KAA9B,EAAqC;MACnC,MAAME,iBAAiB,GAAG/B,aAAa,CAACuB,YAAY,CAACM,KAAD,CAAb,CAAvC,CADmC,CAEnC;;MACA,IAAIN,YAAY,CAACM,KAAD,CAAZ,CAAoBxB,IAApB,KAA6BG,KAAK,CAACH,IAAvC,EAA6C;QAAE;QAC7C;QACAY,GAAG,CAACC,OAAJ,CAAYc,IAAZ,CAAkB,sBAAqBD,iBAAkB,SAAQvB,KAAK,CAACH,IAAK,GAA5E,EAF2C,CAEsC;MAClF;;MACD,IAAIkB,YAAY,CAACM,KAAD,CAAZ,CAAoBvB,IAApB,KAA6BE,KAAK,CAACF,IAAvC,EAA6C;QAAE;QAC7C;QACAW,GAAG,CAACC,OAAJ,CAAYc,IAAZ,CAAkB,sBAAqBD,iBAAkB,SAAQvB,KAAK,CAACF,IAAK,GAA5E,EAF2C,CAEsC;MAClF;IACF,CAlBkC,CAmBnC;;;IACAU,MAAM,CAACW,MAAP,GAAgBJ,YAAhB,CApBmC,CAoBL;;IAC9B;EACD;AACF;;AAGD,MAAMU,kBAAkB,GAAG,CAAC,KAAD,EAAQ,KAAR,EAAe,KAAf,EAAsB,KAAtB,CAA3B;AACA,MAAMC,kBAAkB,GAAG,CAAC,KAAD,EAAQ,KAAR,EAAe,KAAf,EAAsB,KAAtB,EAA6B,KAA7B,EAAoC,KAApC,CAA3B;;AAEA,SAASC,sBAAT,CAAgC3B,KAAhC,EAAuC;EACrC,OAAOyB,kBAAkB,CAACG,QAAnB,CAA4B5B,KAAK,CAACL,GAAlC,CAAP;AACD;;AAED,SAASkC,wBAAT,CAAkCjC,KAAlC,EAAyC;EACvC;EACA,OAAO,CAAC,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,EAAqB,GAArB,EAA0B,GAA1B,EAA+B,GAA/B,EAAoC,GAApC,EAAyC,GAAzC,EAA8CgC,QAA9C,CAAuDhC,KAAvD,CAAR;AACD;;AAED,SAASkC,sBAAT,CAAgC9B,KAAhC,EAAuC;EACrC,OAAO0B,kBAAkB,CAACE,QAAnB,CAA4B5B,KAAK,CAACL,GAAlC,CAAP;AACD;;AAED,SAASoC,yBAAT,CAAmCnC,KAAnC,EAA0CoC,KAA1C,EAAiD;EAC/C,OAAOA,KAAK,CAACC,IAAN,CAAWC,IAAI,IAAItC,KAAK,CAACuC,SAAN,CAAgB,CAAhB,EAAmBD,IAAI,CAACpB,MAAxB,MAAoCoB,IAAvD,CAAP;AACD;;AAED,SAASE,gCAAT,CAA0CpC,KAA1C,EAAiDqC,SAAS,GAAGC,SAA7D,EAAwE;EACtE,MAAMC,SAAS,GAAGvC,KAAK,CAACN,SAAN,CAAgBuC,IAAhB,CAAqB/B,EAAE,IAAIA,EAAE,CAACC,IAAH,KAAY,GAAvC,CAAlB;;EACA,IAAI,CAACoC,SAAL,EAAgB;IACd;IACA;EACD;;EAED,MAAMC,IAAI,GAAGD,SAAS,CAAC3C,KAAV,CAAgB6C,WAAhB,EAAb;;EAEA,IAAIJ,SAAS,CAACT,QAAV,CAAmB,KAAnB,CAAJ,EAA+B;IAC7B,MAAMc,KAAK,GAAGX,yBAAyB,CAACS,IAAD,EAAO,CAAC,IAAD,EAAO,KAAP,EAAc,MAAd,CAAP,CAAvC;;IACA,IAAIE,KAAJ,EAAW;MACT,OAAQ,GAAEA,KAAK,CAAC5B,MAAO,EAAvB;IACD;EACF;;EAED,IAAIuB,SAAS,CAACT,QAAV,CAAmB,KAAnB,CAAJ,EAA+B;IAC7B,MAAMc,KAAK,GAAGX,yBAAyB,CAACS,IAAD,EAAO,CAAC,KAAD,EAAQ,KAAR,CAAP,CAAvC;;IACA,IAAIE,KAAJ,EAAW;MACT,OAAQ,GAAEA,KAAK,CAAC5B,MAAO,EAAvB;IACD;EACF;;EAED,IAAIuB,SAAS,CAACT,QAAV,CAAmB,KAAnB,CAAJ,EAA+B;IAC7B,MAAMc,KAAK,GAAGX,yBAAyB,CAACS,IAAD,EAAO,CAAC,MAAD,EAAS,MAAT,EAAiB,MAAjB,CAAP,CAAvC;;IACA,IAAIE,KAAJ,EAAW;MACT,OAAQ,GAAEA,KAAK,CAAC5B,MAAO,EAAvB;IACD;EACF;;EAED,IAAIuB,SAAS,CAACT,QAAV,CAAmB,KAAnB,CAAJ,EAA+B;IAC7B,MAAMc,KAAK,GAAGX,yBAAyB,CAACS,IAAD,EAAO,CAAC,KAAD,EAAQ,MAAR,CAAP,CAAvC;;IACA,IAAIE,KAAJ,EAAW;MACT,OAAQ,GAAEA,KAAK,CAAC5B,MAAO,EAAvB;IACD;EACF,CAnCqE,CAqCtE;;;EACA,MAAM4B,KAAK,GAAGX,yBAAyB,CAACS,IAAD,EAAO,CAAC,MAAD,CAAP,CAAvC;;EACA,IAAIE,KAAJ,EAAW;IACT,OAAQ,GAAEA,KAAK,CAAC5B,MAAO,EAAvB;EACD;;EAED,OAAO,GAAP;AACD;;AAED,SAAS6B,4BAAT,CAAsC3C,KAAtC,EAA6CqC,SAAS,GAAG,EAAzD,EAA6D;EAC3D,IAAI,CAACV,sBAAsB,CAAC3B,KAAD,CAAvB,IAAkC,CAAC6B,wBAAwB,CAAC7B,KAAK,CAACH,IAAP,CAA/D,EAA6E;IAC3E;EACD;;EAEDG,KAAK,CAACH,IAAN,GAAauC,gCAAgC,CAACpC,KAAD,EAAQqC,SAAR,CAA7C,CAL2D,CAKM;AAClE;;AAED,SAASO,4BAAT,CAAsC5C,KAAtC,EAA6CqC,SAAS,GAAG,EAAzD,EAA6D;EAC3D,IAAI,CAACP,sBAAsB,CAAC9B,KAAD,CAAvB,IAAkC,CAAC6B,wBAAwB,CAAC7B,KAAK,CAACF,IAAP,CAA/D,EAA6E;IAC3E;EACD;;EAEDE,KAAK,CAACF,IAAN,GAAasC,gCAAgC,CAACpC,KAAD,EAAQqC,SAAR,CAA7C,CAL2D,CAKM;AAClE;;AAGD,SAASQ,sBAAT,CAAgC7C,KAAhC,EAAuCQ,MAAvC,EAA+C;EAC7C,IAAIR,KAAK,CAACL,GAAN,KAAc,KAAlB,EAAyB;IACvB;EACD;;EACD,MAAMmD,QAAQ,GAAGtC,MAAM,CAACuC,GAAP,CAAW,OAAX,CAAjB;EACA/C,KAAK,CAACH,IAAN,GAAaiD,QAAQ,CAAChC,MAAT,KAAoB,CAApB,GAAwB,GAAxB,GAA8B,GAA3C,CAL6C,CAKG;AACjD;;AAGD,SAASkC,kBAAT,CAA4BxC,MAA5B,EAAoC;EAClC,MAAMyC,SAAS,GAAGzC,MAAM,CAACuC,GAAP,CAAW,OAAX,CAAlB;EACA,MAAMG,SAAS,GAAG1C,MAAM,CAACuC,GAAP,CAAW,uBAAX,CAAlB;;EAEA,IAAIE,SAAS,CAACnC,MAAV,KAAqB,CAAzB,EAA4B;IAC1B;EACD;;EACD,IAAImC,SAAS,CAACnC,MAAV,IAAoBoC,SAAS,CAACpC,MAAlC,EAA0C;IACxC;IACAmC,SAAS,CAAC7B,OAAV,CAAkB3B,CAAC,IAAI;MACrBA,CAAC,CAACI,IAAF,GAAS,GAAT,CADqB,CACP;IACf,CAFD;IAGA;EACD;;EACD,IAAIqD,SAAS,CAACpC,MAAV,KAAqB,CAAzB,EAA4B;IAAE;IAC5BmC,SAAS,CAAC7B,OAAV,CAAkB3B,CAAC,IAAI;MACrBA,CAAC,CAACI,IAAF,GAAS,GAAT,CADqB,CACP;IACf,CAFD;IAGA;EACD,CAnBiC,CAoBlC;;AACD;;AAGD,SAASsD,YAAT,CAAsB3C,MAAtB,EAA8B;EAC5B,MAAM4C,UAAU,GAAG5C,MAAM,CAACuC,GAAP,CAAW,OAAX,CAAnB;;EAEA,IAAIK,UAAU,CAACtC,MAAX,KAAsB,CAA1B,EAA6B;IAC3B,OAAO,EAAP;EACD;;EAED,OAAOsC,UAAU,CAAC,CAAD,CAAV,CAAc1D,SAAd,CAAwB2D,MAAxB,CAA+BnD,EAAE,IAAIoD,kBAAkB,CAACpD,EAAD,CAAvD,EAA6DD,GAA7D,CAAiEsD,QAAQ,IAAIA,QAAQ,CAAC3D,KAAtF,CAAP;;EAEA,SAAS0D,kBAAT,CAA4BC,QAA5B,EAAsC;IACpC,IAAIA,QAAQ,CAACpD,IAAT,KAAkB,GAAlB,IAAyBoD,QAAQ,CAACpD,IAAT,KAAkB,GAA/C,EAAoD;MAClD,OAAO,KAAP;IACD;;IACD,IAAIoD,QAAQ,CAAC3D,KAAT,CAAekB,MAAf,KAA0B,CAA9B,EAAiC;MAC/B,OAAO,KAAP;IACD,CANmC,CAOpC;;;IACA,OAAO,IAAP;EACD;AAEF;;AAEM,SAASF,yBAAT,CAAmCJ,MAAnC,EAA2C;EAChDwC,kBAAkB,CAACxC,MAAD,CAAlB,CADgD,CAGhD;;EACA,MAAM6B,SAAS,GAAGc,YAAY,CAAC3C,MAAD,CAA9B;EAEAA,MAAM,CAACW,MAAP,CAAcC,OAAd,CAAsBpB,KAAK,IAAIwD,wBAAwB,CAACxD,KAAD,EAAQQ,MAAR,EAAgB6B,SAAhB,CAAvD;AAED;;AAED,SAASmB,wBAAT,CAAkCxD,KAAlC,EAAyCQ,MAAzC,EAAiD6B,SAAjD,EAA4D;EAC1DQ,sBAAsB,CAAC7C,KAAD,EAAQQ,MAAR,CAAtB;EACAmC,4BAA4B,CAAC3C,KAAD,EAAQqC,SAAR,CAA5B;EACAO,4BAA4B,CAAC5C,KAAD,EAAQqC,SAAR,CAA5B;AACD"}
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+
3
+ var _chai = require("chai");
4
+
5
+ var _marcRecord = require("@natlibfi/marc-record");
6
+
7
+ var _indicatorFixes = _interopRequireDefault(require("./indicator-fixes"));
8
+
9
+ var _fixura = require("@natlibfi/fixura");
10
+
11
+ var _fixugen = _interopRequireDefault(require("@natlibfi/fixugen"));
12
+
13
+ var _debug = _interopRequireDefault(require("debug"));
14
+
15
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
16
+
17
+ (0, _fixugen.default)({
18
+ callback,
19
+ path: [__dirname, '..', 'test-fixtures', 'indicator-fixes'],
20
+ useMetadataFile: true,
21
+ recurse: false,
22
+ fixura: {
23
+ reader: _fixura.READERS.JSON
24
+ },
25
+ mocha: {
26
+ before: () => testValidatorFactory()
27
+ }
28
+ });
29
+ const debug = (0, _debug.default)('@natlibfi/marc-record-validators-melinda/indicator-fixes:test');
30
+
31
+ async function testValidatorFactory() {
32
+ const validator = await (0, _indicatorFixes.default)();
33
+ (0, _chai.expect)(validator).to.be.an('object').that.has.any.keys('description', 'validate');
34
+ (0, _chai.expect)(validator.description).to.be.a('string');
35
+ (0, _chai.expect)(validator.validate).to.be.a('function');
36
+ }
37
+
38
+ async function callback({
39
+ getFixture,
40
+ enabled = true,
41
+ fix = false
42
+ }) {
43
+ if (enabled === false) {
44
+ debug('TEST SKIPPED!');
45
+ return;
46
+ }
47
+
48
+ const validator = await (0, _indicatorFixes.default)();
49
+ const record = new _marcRecord.MarcRecord(getFixture('record.json'));
50
+ const expectedResult = getFixture('expectedResult.json'); // console.log(expectedResult); // eslint-disable-line
51
+
52
+ if (!fix) {
53
+ const result = await validator.validate(record);
54
+ (0, _chai.expect)(result).to.eql(expectedResult);
55
+ return;
56
+ }
57
+
58
+ await validator.fix(record);
59
+ (0, _chai.expect)(record).to.eql(expectedResult);
60
+ }
61
+ //# sourceMappingURL=indicator-fixes.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indicator-fixes.spec.js","names":["generateTests","callback","path","__dirname","useMetadataFile","recurse","fixura","reader","READERS","JSON","mocha","before","testValidatorFactory","debug","createDebugLogger","validator","validatorFactory","expect","to","be","an","that","has","any","keys","description","a","validate","getFixture","enabled","fix","record","MarcRecord","expectedResult","result","eql"],"sources":["../src/indicator-fixes.spec.js"],"sourcesContent":["import {expect} from 'chai';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './indicator-fixes';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\nimport createDebugLogger from 'debug';\n\ngenerateTests({\n callback,\n path: [__dirname, '..', 'test-fixtures', 'indicator-fixes'],\n useMetadataFile: true,\n recurse: false,\n fixura: {\n reader: READERS.JSON\n },\n mocha: {\n before: () => testValidatorFactory()\n }\n});\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/indicator-fixes:test');\n\nasync function testValidatorFactory() {\n const validator = await validatorFactory();\n\n expect(validator)\n .to.be.an('object')\n .that.has.any.keys('description', 'validate');\n\n expect(validator.description).to.be.a('string');\n expect(validator.validate).to.be.a('function');\n}\n\nasync function callback({getFixture, enabled = true, fix = false}) {\n if (enabled === false) {\n debug('TEST SKIPPED!');\n return;\n }\n\n const validator = await validatorFactory();\n const record = new MarcRecord(getFixture('record.json'));\n const expectedResult = getFixture('expectedResult.json');\n // console.log(expectedResult); // eslint-disable-line\n\n if (!fix) {\n const result = await validator.validate(record);\n expect(result).to.eql(expectedResult);\n return;\n }\n\n await validator.fix(record);\n expect(record).to.eql(expectedResult);\n}\n"],"mappings":";;AAAA;;AACA;;AACA;;AACA;;AACA;;AACA;;;;AAEA,IAAAA,gBAAA,EAAc;EACZC,QADY;EAEZC,IAAI,EAAE,CAACC,SAAD,EAAY,IAAZ,EAAkB,eAAlB,EAAmC,iBAAnC,CAFM;EAGZC,eAAe,EAAE,IAHL;EAIZC,OAAO,EAAE,KAJG;EAKZC,MAAM,EAAE;IACNC,MAAM,EAAEC,eAAA,CAAQC;EADV,CALI;EAQZC,KAAK,EAAE;IACLC,MAAM,EAAE,MAAMC,oBAAoB;EAD7B;AARK,CAAd;AAYA,MAAMC,KAAK,GAAG,IAAAC,cAAA,EAAkB,+DAAlB,CAAd;;AAEA,eAAeF,oBAAf,GAAsC;EACpC,MAAMG,SAAS,GAAG,MAAM,IAAAC,uBAAA,GAAxB;EAEA,IAAAC,YAAA,EAAOF,SAAP,EACGG,EADH,CACMC,EADN,CACSC,EADT,CACY,QADZ,EAEGC,IAFH,CAEQC,GAFR,CAEYC,GAFZ,CAEgBC,IAFhB,CAEqB,aAFrB,EAEoC,UAFpC;EAIA,IAAAP,YAAA,EAAOF,SAAS,CAACU,WAAjB,EAA8BP,EAA9B,CAAiCC,EAAjC,CAAoCO,CAApC,CAAsC,QAAtC;EACA,IAAAT,YAAA,EAAOF,SAAS,CAACY,QAAjB,EAA2BT,EAA3B,CAA8BC,EAA9B,CAAiCO,CAAjC,CAAmC,UAAnC;AACD;;AAED,eAAezB,QAAf,CAAwB;EAAC2B,UAAD;EAAaC,OAAO,GAAG,IAAvB;EAA6BC,GAAG,GAAG;AAAnC,CAAxB,EAAmE;EACjE,IAAID,OAAO,KAAK,KAAhB,EAAuB;IACrBhB,KAAK,CAAC,eAAD,CAAL;IACA;EACD;;EAED,MAAME,SAAS,GAAG,MAAM,IAAAC,uBAAA,GAAxB;EACA,MAAMe,MAAM,GAAG,IAAIC,sBAAJ,CAAeJ,UAAU,CAAC,aAAD,CAAzB,CAAf;EACA,MAAMK,cAAc,GAAGL,UAAU,CAAC,qBAAD,CAAjC,CARiE,CASjE;;EAEA,IAAI,CAACE,GAAL,EAAU;IACR,MAAMI,MAAM,GAAG,MAAMnB,SAAS,CAACY,QAAV,CAAmBI,MAAnB,CAArB;IACA,IAAAd,YAAA,EAAOiB,MAAP,EAAehB,EAAf,CAAkBiB,GAAlB,CAAsBF,cAAtB;IACA;EACD;;EAED,MAAMlB,SAAS,CAACe,GAAV,CAAcC,MAAd,CAAN;EACA,IAAAd,YAAA,EAAOc,MAAP,EAAeb,EAAf,CAAkBiB,GAAlB,CAAsBF,cAAtB;AACD"}