@natlibfi/marc-record-validators-melinda 10.13.0 → 10.13.1-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/.github/workflows/melinda-node-tests.yml +3 -3
  2. package/dist/field-505-separators.js +77 -0
  3. package/dist/field-505-separators.js.map +1 -0
  4. package/dist/field-505-separators.spec.js +51 -0
  5. package/dist/field-505-separators.spec.js.map +1 -0
  6. package/dist/fixRelatorTerms.js +278 -0
  7. package/dist/fixRelatorTerms.js.map +1 -0
  8. package/dist/fixRelatorTerms.spec.js +51 -0
  9. package/dist/fixRelatorTerms.spec.js.map +1 -0
  10. package/dist/index.js +101 -3
  11. package/dist/index.js.map +1 -1
  12. package/dist/normalize-qualifying-information.js +97 -0
  13. package/dist/normalize-qualifying-information.js.map +1 -0
  14. package/dist/normalize-qualifying-information.spec.js +51 -0
  15. package/dist/normalize-qualifying-information.spec.js.map +1 -0
  16. package/dist/normalizeSubfieldValueForComparison.js +12 -3
  17. package/dist/normalizeSubfieldValueForComparison.js.map +1 -1
  18. package/dist/prepublicationUtils.js +8 -26
  19. package/dist/prepublicationUtils.js.map +1 -1
  20. package/dist/punctuation2.js +7 -2
  21. package/dist/punctuation2.js.map +1 -1
  22. package/dist/removeInferiorDataFields.js +69 -10
  23. package/dist/removeInferiorDataFields.js.map +1 -1
  24. package/dist/utils.js +12 -0
  25. package/dist/utils.js.map +1 -1
  26. package/package.json +11 -11
  27. package/src/field-505-separators.js +75 -0
  28. package/src/field-505-separators.spec.js +52 -0
  29. package/src/fixRelatorTerms.js +233 -0
  30. package/src/fixRelatorTerms.spec.js +52 -0
  31. package/src/index.js +33 -4
  32. package/src/normalize-qualifying-information.js +92 -0
  33. package/src/normalize-qualifying-information.spec.js +52 -0
  34. package/src/normalizeSubfieldValueForComparison.js +14 -3
  35. package/src/prepublicationUtils.js +8 -25
  36. package/src/punctuation2.js +3 -2
  37. package/src/removeInferiorDataFields.js +70 -10
  38. package/src/utils.js +12 -0
  39. package/test-fixtures/field-505-separators/01/expectedResult.json +7 -0
  40. package/test-fixtures/field-505-separators/01/metadata.json +7 -0
  41. package/test-fixtures/field-505-separators/01/record.json +25 -0
  42. package/test-fixtures/field-505-separators/02/expectedResult.json +27 -0
  43. package/test-fixtures/field-505-separators/02/metadata.json +7 -0
  44. package/test-fixtures/field-505-separators/02/record.json +25 -0
  45. package/test-fixtures/fix-relator-terms/f01/expectedResult.json +14 -0
  46. package/test-fixtures/fix-relator-terms/f01/metadata.json +6 -0
  47. package/test-fixtures/fix-relator-terms/f01/record.json +13 -0
  48. package/test-fixtures/fix-relator-terms/f01b/expectedResult.json +12 -0
  49. package/test-fixtures/fix-relator-terms/f01b/metadata.json +6 -0
  50. package/test-fixtures/fix-relator-terms/f01b/record.json +11 -0
  51. package/test-fixtures/fix-relator-terms/f02/expectedResult.json +12 -0
  52. package/test-fixtures/fix-relator-terms/f02/metadata.json +6 -0
  53. package/test-fixtures/fix-relator-terms/f02/record.json +11 -0
  54. package/test-fixtures/normalize-qualifying-information/01/expectedResult.json +8 -0
  55. package/test-fixtures/normalize-qualifying-information/01/metadata.json +7 -0
  56. package/test-fixtures/normalize-qualifying-information/01/record.json +25 -0
  57. package/test-fixtures/normalize-qualifying-information/02/expectedResult.json +27 -0
  58. package/test-fixtures/normalize-qualifying-information/02/metadata.json +7 -0
  59. package/test-fixtures/normalize-qualifying-information/02/record.json +25 -0
  60. package/test-fixtures/punctuation2/97/expectedResult.json +6 -1
  61. package/test-fixtures/punctuation2/97/record.json +5 -0
  62. package/test-fixtures/remove-inferior-datafields/f09/expectedResult.json +20 -0
  63. package/test-fixtures/remove-inferior-datafields/f09/metadata.json +6 -0
  64. package/test-fixtures/remove-inferior-datafields/f09/record.json +30 -0
  65. package/test-fixtures/remove-inferior-datafields/f10/expectedResult.json +17 -0
  66. package/test-fixtures/remove-inferior-datafields/f10/metadata.json +6 -0
  67. package/test-fixtures/remove-inferior-datafields/f10/record.json +27 -0
  68. package/test-fixtures/remove-inferior-datafields/f11/expectedResult.json +14 -0
  69. package/test-fixtures/remove-inferior-datafields/f11/metadata.json +6 -0
  70. package/test-fixtures/remove-inferior-datafields/f11/record.json +18 -0
  71. package/test-fixtures/strip-punctuation/98/expectedResult.json +5 -0
  72. package/test-fixtures/strip-punctuation/98/record.json +5 -0
@@ -16,7 +16,7 @@ jobs:
16
16
 
17
17
  steps:
18
18
  - name: Checkout the code
19
- uses: actions/checkout@v3
19
+ uses: actions/checkout@v4
20
20
  - name: Use Node.js ${{ matrix.node-version }}
21
21
  uses: actions/setup-node@v3
22
22
  with:
@@ -36,7 +36,7 @@ jobs:
36
36
 
37
37
  steps:
38
38
  - name: Checkout the code
39
- uses: actions/checkout@v3
39
+ uses: actions/checkout@v4
40
40
  - name: nodejsscan scan
41
41
  id: njsscan
42
42
  uses: ajinabraham/njsscan-action@master
@@ -49,7 +49,7 @@ jobs:
49
49
  if: contains(github.ref, 'refs/tags/')
50
50
 
51
51
  steps:
52
- - uses: actions/checkout@v3
52
+ - uses: actions/checkout@v4
53
53
  # Setup .npmrc file to publish to npm
54
54
  - uses: actions/setup-node@v3
55
55
  with:
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = _default;
7
+ var _clone = _interopRequireDefault(require("clone"));
8
+ var _utils = require("./utils");
9
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
10
+ //import createDebugLogger from 'debug';
11
+
12
+ // Author(s): Nicholas Volk
13
+ function _default() {
14
+ return {
15
+ description: 'Normalize " ; " separators as " -- "',
16
+ validate,
17
+ fix
18
+ };
19
+ function fix(record) {
20
+ record.fields.forEach(field => {
21
+ fix505(field);
22
+ });
23
+ const res = {
24
+ message: [],
25
+ fix: [],
26
+ valid: true
27
+ };
28
+ return res;
29
+ }
30
+ function validate(record) {
31
+ const res = {
32
+ message: []
33
+ };
34
+ record.fields?.forEach(field => {
35
+ validateField(field, res);
36
+ });
37
+ res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data
38
+ return res;
39
+ }
40
+ function validateField(field, res) {
41
+ const orig = (0, _utils.fieldToString)(field);
42
+ const normalizedField = fix505((0, _clone.default)(field));
43
+ const mod = (0, _utils.fieldToString)(normalizedField);
44
+ if (orig !== mod) {
45
+ // Fail as the input is "broken"/"crap"/sumthing
46
+ res.message.push(`'TODO: ${orig}' => '${mod}'`); // eslint-disable-line functional/immutable-data
47
+ return;
48
+ }
49
+ return;
50
+ }
51
+ }
52
+ function field505FixSubfieldA(field) {
53
+ const a = field.subfields.filter(sf => sf.code === 'a');
54
+ a.forEach(sf => fixSubfieldA(sf));
55
+ function fixSubfieldA(a) {
56
+ a.value = a.value.replace(/ ; /ug, ' -- '); // eslint-disable-line functional/immutable-data
57
+ }
58
+ }
59
+
60
+ function field505FixSubfieldTRG(field) {
61
+ // Modify subfield if next subfield is $t:
62
+ const subfieldsThatWillBeModified = field.subfields.filter((sf, i) => i + 1 < field.subfields.length && field.subfields[i + 1].code === 't');
63
+ subfieldsThatWillBeModified.forEach(sf => fixSubfieldThatPrecedesT(sf));
64
+ function fixSubfieldThatPrecedesT(sf) {
65
+ sf.value = sf.value.replace(/ ;$/u, ' --'); // eslint-disable-line functional/immutable-data
66
+ }
67
+ }
68
+
69
+ function fix505(field) {
70
+ if (field.tag !== '505' || !field.subfields) {
71
+ return field;
72
+ }
73
+ field505FixSubfieldTRG(field);
74
+ field505FixSubfieldA(field);
75
+ return field;
76
+ }
77
+ //# sourceMappingURL=field-505-separators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field-505-separators.js","names":["_clone","_interopRequireDefault","require","_utils","obj","__esModule","default","_default","description","validate","fix","record","fields","forEach","field","fix505","res","message","valid","validateField","length","orig","fieldToString","normalizedField","clone","mod","push","field505FixSubfieldA","a","subfields","filter","sf","code","fixSubfieldA","value","replace","field505FixSubfieldTRG","subfieldsThatWillBeModified","i","fixSubfieldThatPrecedesT","tag"],"sources":["../src/field-505-separators.js"],"sourcesContent":["//import createDebugLogger from 'debug';\nimport clone from 'clone';\nimport {fieldToString} from './utils';\n\n// Author(s): Nicholas Volk\nexport default function () {\n\n return {\n description: 'Normalize \" ; \" separators as \" -- \"',\n validate, fix\n };\n\n function fix(record) {\n record.fields.forEach(field => {\n fix505(field);\n });\n\n const res = {message: [], fix: [], valid: true};\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n record.fields?.forEach(field => {\n validateField(field, res);\n });\n\n res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n\n function validateField(field, res) {\n const orig = fieldToString(field);\n\n const normalizedField = fix505(clone(field));\n const mod = fieldToString(normalizedField);\n if (orig !== mod) { // Fail as the input is \"broken\"/\"crap\"/sumthing\n res.message.push(`'TODO: ${orig}' => '${mod}'`); // eslint-disable-line functional/immutable-data\n return;\n }\n return;\n }\n}\n\n\nfunction field505FixSubfieldA(field) {\n const a = field.subfields.filter(sf => sf.code === 'a');\n\n a.forEach(sf => fixSubfieldA(sf));\n\n function fixSubfieldA(a) {\n a.value = a.value.replace(/ ; /ug, ' -- '); // eslint-disable-line functional/immutable-data\n }\n}\n\nfunction field505FixSubfieldTRG(field) {\n // Modify subfield if next subfield is $t:\n const subfieldsThatWillBeModified = field.subfields.filter((sf, i) => i + 1 < field.subfields.length && field.subfields[i + 1].code === 't');\n\n subfieldsThatWillBeModified.forEach(sf => fixSubfieldThatPrecedesT(sf));\n\n function fixSubfieldThatPrecedesT(sf) {\n sf.value = sf.value.replace(/ ;$/u, ' --'); // eslint-disable-line functional/immutable-data\n }\n}\n\nfunction fix505(field) {\n if (field.tag !== '505' || !field.subfields) {\n return field;\n }\n field505FixSubfieldTRG(field);\n field505FixSubfieldA(field);\n return field;\n}\n"],"mappings":";;;;;;AACA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,MAAA,GAAAD,OAAA;AAAsC,SAAAD,uBAAAG,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAFtC;;AAIA;AACe,SAAAG,SAAA,EAAY;EAEzB,OAAO;IACLC,WAAW,EAAE,sCAAsC;IACnDC,QAAQ;IAAEC;EACZ,CAAC;EAED,SAASA,GAAGA,CAACC,MAAM,EAAE;IACnBA,MAAM,CAACC,MAAM,CAACC,OAAO,CAACC,KAAK,IAAI;MAC7BC,MAAM,CAACD,KAAK,CAAC;IACf,CAAC,CAAC;IAEF,MAAME,GAAG,GAAG;MAACC,OAAO,EAAE,EAAE;MAAEP,GAAG,EAAE,EAAE;MAAEQ,KAAK,EAAE;IAAI,CAAC;IAC/C,OAAOF,GAAG;EACZ;EAEA,SAASP,QAAQA,CAACE,MAAM,EAAE;IACxB,MAAMK,GAAG,GAAG;MAACC,OAAO,EAAE;IAAE,CAAC;IAEzBN,MAAM,CAACC,MAAM,EAAEC,OAAO,CAACC,KAAK,IAAI;MAC9BK,aAAa,CAACL,KAAK,EAAEE,GAAG,CAAC;IAC3B,CAAC,CAAC;IAEFA,GAAG,CAACE,KAAK,GAAG,EAAEF,GAAG,CAACC,OAAO,CAACG,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC;IACxC,OAAOJ,GAAG;EACZ;EAEA,SAASG,aAAaA,CAACL,KAAK,EAAEE,GAAG,EAAE;IACjC,MAAMK,IAAI,GAAG,IAAAC,oBAAa,EAACR,KAAK,CAAC;IAEjC,MAAMS,eAAe,GAAGR,MAAM,CAAC,IAAAS,cAAK,EAACV,KAAK,CAAC,CAAC;IAC5C,MAAMW,GAAG,GAAG,IAAAH,oBAAa,EAACC,eAAe,CAAC;IAC1C,IAAIF,IAAI,KAAKI,GAAG,EAAE;MAAE;MAClBT,GAAG,CAACC,OAAO,CAACS,IAAI,CAAE,UAASL,IAAK,SAAQI,GAAI,GAAE,CAAC,CAAC,CAAC;MACjD;IACF;IACA;EACF;AACF;AAGA,SAASE,oBAAoBA,CAACb,KAAK,EAAE;EACnC,MAAMc,CAAC,GAAGd,KAAK,CAACe,SAAS,CAACC,MAAM,CAACC,EAAE,IAAIA,EAAE,CAACC,IAAI,KAAK,GAAG,CAAC;EAEvDJ,CAAC,CAACf,OAAO,CAACkB,EAAE,IAAIE,YAAY,CAACF,EAAE,CAAC,CAAC;EAEjC,SAASE,YAAYA,CAACL,CAAC,EAAE;IACvBA,CAAC,CAACM,KAAK,GAAGN,CAAC,CAACM,KAAK,CAACC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;EAC9C;AACF;;AAEA,SAASC,sBAAsBA,CAACtB,KAAK,EAAE;EACrC;EACA,MAAMuB,2BAA2B,GAAGvB,KAAK,CAACe,SAAS,CAACC,MAAM,CAAC,CAACC,EAAE,EAAEO,CAAC,KAAKA,CAAC,GAAG,CAAC,GAAGxB,KAAK,CAACe,SAAS,CAACT,MAAM,IAAIN,KAAK,CAACe,SAAS,CAACS,CAAC,GAAG,CAAC,CAAC,CAACN,IAAI,KAAK,GAAG,CAAC;EAE5IK,2BAA2B,CAACxB,OAAO,CAACkB,EAAE,IAAIQ,wBAAwB,CAACR,EAAE,CAAC,CAAC;EAEvE,SAASQ,wBAAwBA,CAACR,EAAE,EAAE;IACpCA,EAAE,CAACG,KAAK,GAAGH,EAAE,CAACG,KAAK,CAACC,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;EAC9C;AACF;;AAEA,SAASpB,MAAMA,CAACD,KAAK,EAAE;EACrB,IAAIA,KAAK,CAAC0B,GAAG,KAAK,KAAK,IAAI,CAAC1B,KAAK,CAACe,SAAS,EAAE;IAC3C,OAAOf,KAAK;EACd;EACAsB,sBAAsB,CAACtB,KAAK,CAAC;EAC7Ba,oBAAoB,CAACb,KAAK,CAAC;EAC3B,OAAOA,KAAK;AACd"}
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+
3
+ var _chai = require("chai");
4
+ var _marcRecord = require("@natlibfi/marc-record");
5
+ var _field505Separators = _interopRequireDefault(require("./field-505-separators"));
6
+ var _fixura = require("@natlibfi/fixura");
7
+ var _fixugen = _interopRequireDefault(require("@natlibfi/fixugen"));
8
+ var _debug = _interopRequireDefault(require("debug"));
9
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
10
+ (0, _fixugen.default)({
11
+ callback,
12
+ path: [__dirname, '..', 'test-fixtures', 'field-505-separators'],
13
+ useMetadataFile: true,
14
+ recurse: false,
15
+ fixura: {
16
+ reader: _fixura.READERS.JSON
17
+ },
18
+ mocha: {
19
+ before: () => testValidatorFactory()
20
+ }
21
+ });
22
+ const debug = (0, _debug.default)('@natlibfi/marc-record-validators-melinda/field-505-separators:test');
23
+ async function testValidatorFactory() {
24
+ const validator = await (0, _field505Separators.default)();
25
+ (0, _chai.expect)(validator).to.be.an('object').that.has.any.keys('description', 'validate');
26
+ (0, _chai.expect)(validator.description).to.be.a('string');
27
+ (0, _chai.expect)(validator.validate).to.be.a('function');
28
+ }
29
+ async function callback({
30
+ getFixture,
31
+ enabled = true,
32
+ fix = false
33
+ }) {
34
+ if (enabled === false) {
35
+ debug('TEST SKIPPED!');
36
+ return;
37
+ }
38
+ const validator = await (0, _field505Separators.default)();
39
+ const record = new _marcRecord.MarcRecord(getFixture('record.json'));
40
+ const expectedResult = getFixture('expectedResult.json');
41
+ // console.log(expectedResult); // eslint-disable-line
42
+
43
+ if (!fix) {
44
+ const result = await validator.validate(record);
45
+ (0, _chai.expect)(result).to.eql(expectedResult);
46
+ return;
47
+ }
48
+ await validator.fix(record);
49
+ (0, _chai.expect)(record).to.eql(expectedResult);
50
+ }
51
+ //# sourceMappingURL=field-505-separators.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field-505-separators.spec.js","names":["_chai","require","_marcRecord","_field505Separators","_interopRequireDefault","_fixura","_fixugen","_debug","obj","__esModule","default","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/field-505-separators.spec.js"],"sourcesContent":["import {expect} from 'chai';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './field-505-separators';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\nimport createDebugLogger from 'debug';\n\ngenerateTests({\n callback,\n path: [__dirname, '..', 'test-fixtures', 'field-505-separators'],\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/field-505-separators: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,IAAAA,KAAA,GAAAC,OAAA;AACA,IAAAC,WAAA,GAAAD,OAAA;AACA,IAAAE,mBAAA,GAAAC,sBAAA,CAAAH,OAAA;AACA,IAAAI,OAAA,GAAAJ,OAAA;AACA,IAAAK,QAAA,GAAAF,sBAAA,CAAAH,OAAA;AACA,IAAAM,MAAA,GAAAH,sBAAA,CAAAH,OAAA;AAAsC,SAAAG,uBAAAI,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAEtC,IAAAG,gBAAa,EAAC;EACZC,QAAQ;EACRC,IAAI,EAAE,CAACC,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE,sBAAsB,CAAC;EAChEC,eAAe,EAAE,IAAI;EACrBC,OAAO,EAAE,KAAK;EACdC,MAAM,EAAE;IACNC,MAAM,EAAEC,eAAO,CAACC;EAClB,CAAC;EACDC,KAAK,EAAE;IACLC,MAAM,EAAEA,CAAA,KAAMC,oBAAoB,CAAC;EACrC;AACF,CAAC,CAAC;AACF,MAAMC,KAAK,GAAG,IAAAC,cAAiB,EAAC,oEAAoE,CAAC;AAErG,eAAeF,oBAAoBA,CAAA,EAAG;EACpC,MAAMG,SAAS,GAAG,MAAM,IAAAC,2BAAgB,EAAC,CAAC;EAE1C,IAAAC,YAAM,EAACF,SAAS,CAAC,CACdG,EAAE,CAACC,EAAE,CAACC,EAAE,CAAC,QAAQ,CAAC,CAClBC,IAAI,CAACC,GAAG,CAACC,GAAG,CAACC,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC;EAE/C,IAAAP,YAAM,EAACF,SAAS,CAACU,WAAW,CAAC,CAACP,EAAE,CAACC,EAAE,CAACO,CAAC,CAAC,QAAQ,CAAC;EAC/C,IAAAT,YAAM,EAACF,SAAS,CAACY,QAAQ,CAAC,CAACT,EAAE,CAACC,EAAE,CAACO,CAAC,CAAC,UAAU,CAAC;AAChD;AAEA,eAAezB,QAAQA,CAAC;EAAC2B,UAAU;EAAEC,OAAO,GAAG,IAAI;EAAEC,GAAG,GAAG;AAAK,CAAC,EAAE;EACjE,IAAID,OAAO,KAAK,KAAK,EAAE;IACrBhB,KAAK,CAAC,eAAe,CAAC;IACtB;EACF;EAEA,MAAME,SAAS,GAAG,MAAM,IAAAC,2BAAgB,EAAC,CAAC;EAC1C,MAAMe,MAAM,GAAG,IAAIC,sBAAU,CAACJ,UAAU,CAAC,aAAa,CAAC,CAAC;EACxD,MAAMK,cAAc,GAAGL,UAAU,CAAC,qBAAqB,CAAC;EACxD;;EAEA,IAAI,CAACE,GAAG,EAAE;IACR,MAAMI,MAAM,GAAG,MAAMnB,SAAS,CAACY,QAAQ,CAACI,MAAM,CAAC;IAC/C,IAAAd,YAAM,EAACiB,MAAM,CAAC,CAAChB,EAAE,CAACiB,GAAG,CAACF,cAAc,CAAC;IACrC;EACF;EAEA,MAAMlB,SAAS,CAACe,GAAG,CAACC,MAAM,CAAC;EAC3B,IAAAd,YAAM,EAACc,MAAM,CAAC,CAACb,EAAE,CAACiB,GAAG,CAACF,cAAc,CAAC;AACvC"}
@@ -0,0 +1,278 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = _default;
7
+ exports.fieldFixRelatorTerms = fieldFixRelatorTerms;
8
+ exports.recordFixRelatorTerms = recordFixRelatorTerms;
9
+ var _clone = _interopRequireDefault(require("clone"));
10
+ var _punctuation = require("./punctuation2");
11
+ var _utils = require("./utils");
12
+ var _debug = _interopRequireDefault(require("debug"));
13
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
14
+ // Currently mainly translates X00$e values, so that we don't have "$a Name, $e kirjoittaja, $e författare.".
15
+ // Later on we could try and handle $4 stuff here as well.
16
+ const debug = (0, _debug.default)('@natlibfi/marc-record-validators-melinda:fixRelatorterms');
17
+ //const debugData = debug.extend('data');
18
+ const debugDev = debug.extend('dev');
19
+ function _default() {
20
+ return {
21
+ description: 'Fix $e subfields in field [1678][01]0 and 720',
22
+ validate,
23
+ fix
24
+ };
25
+ function fix(record) {
26
+ const res = {
27
+ message: [],
28
+ fix: [],
29
+ valid: true
30
+ };
31
+ const language = (0, _utils.getCatalogingLanguage)(record);
32
+ record.fields.forEach(field => {
33
+ fieldFixRelatorTerms(field, language, language);
34
+ });
35
+ return res;
36
+ }
37
+ function validate(record) {
38
+ const res = {
39
+ message: []
40
+ };
41
+ const language = (0, _utils.getCatalogingLanguage)(record);
42
+ record.fields.forEach(field => {
43
+ const clonedField = (0, _clone.default)(field);
44
+ // Rather hackily/abnormally use language as both fromLanguage and toLanguage.
45
+ // fromLanguage is used to expand "esitt." => "esittäjä".
46
+ // toLanguage is used by translations (fixes "författere" to "kirjoittaja", if 040$b is "fin")
47
+ fieldFixRelatorTerms(field, language, language);
48
+ const clonedFieldAsString = (0, _utils.fieldToString)(clonedField);
49
+ const fieldAsString = (0, _utils.fieldToString)(field);
50
+ if (fieldAsString !== clonedFieldAsString) {
51
+ // eslint-disable-line functional/no-conditional-statements
52
+ res.message.push(`${fieldAsString} => ${clonedFieldAsString}`); // eslint-disable-line functional/immutable-data
53
+ }
54
+ });
55
+
56
+ res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data
57
+ return res;
58
+ }
59
+ }
60
+
61
+ /*
62
+ export default () => (base, source) => {
63
+ recordTranslateRelatorTerms(base);
64
+ recordTranslateRelatorTerms(source);
65
+ recordHandleRelatorTermAbbreviations(base);
66
+ recordHandleRelatorTermAbbreviations(source);
67
+ const result = {base, source};
68
+ return result;
69
+ };
70
+ */
71
+
72
+ // Partial source: https://marc21.kansalliskirjasto.fi/funktiot_koodit.htm
73
+ // https://wiki.helsinki.fi/display/MARC21svenska/Funktions-+och+relationskoder+-+alfabetiskt+efter+funktion
74
+ // New, better source: https://id.kb.se/find?q=relator&_sort=_sortKeyByLang.en
75
+
76
+ // NB! How to handle German sex-based Verfasser/Verfasserin pairs?
77
+ const relatorTerms = [{
78
+ 'code': 'arr',
79
+ 'eng': 'arranger',
80
+ 'fin': 'sovittaja',
81
+ 'swe': 'arrangör av musikalisk komposition'
82
+ }, {
83
+ 'code': 'art',
84
+ 'eng': 'artist',
85
+ 'fin': 'taiteilija',
86
+ 'swe': 'konstnär'
87
+ }, {
88
+ 'code': 'aui',
89
+ 'eng': 'author of introduction',
90
+ 'fin': 'esipuheen tekijä'
91
+ }, {
92
+ 'code': 'aut',
93
+ 'eng': 'author',
94
+ 'fin': 'kirjoittaja',
95
+ 'swe': 'författare'
96
+ }, {
97
+ 'code': 'cmp',
98
+ 'eng': 'composer',
99
+ 'fin': 'säveltäjä',
100
+ 'swe': 'kompositör'
101
+ }, {
102
+ 'code': 'drt',
103
+ 'eng': 'director',
104
+ 'fin': 'ohjaaja',
105
+ 'swe': 'regissör'
106
+ }, {
107
+ 'code': 'edt',
108
+ 'eng': 'editor',
109
+ 'fin': 'toimittaja',
110
+ 'swe': 'redaktör'
111
+ }, {
112
+ 'code': 'ill',
113
+ 'eng': 'illustrator',
114
+ 'fin': 'kuvittaja',
115
+ 'swe': 'illustratör'
116
+ }, {
117
+ 'code': 'lyr',
118
+ 'eng': 'lyricist',
119
+ 'fin': 'sanoittaja',
120
+ 'swe': 'sångtext'
121
+ }, {
122
+ 'code': 'nrt',
123
+ 'eng': 'narrator',
124
+ 'fin': 'kertoja',
125
+ 'swe': 'berättare'
126
+ },
127
+ // berättare/inläsare
128
+ {
129
+ 'code': 'pbl',
130
+ 'eng': 'publisher',
131
+ 'fin': 'julkaisija',
132
+ 'swe': 'utgivare'
133
+ }, {
134
+ 'code': 'pht',
135
+ 'eng': 'photographer',
136
+ 'fin': 'valokuvaaja',
137
+ 'swe': 'fotograf'
138
+ }, {
139
+ 'code': 'prf',
140
+ 'eng': 'performer',
141
+ 'fin': 'esittäjä',
142
+ 'swe': 'framförande'
143
+ }, {
144
+ 'code': 'pro',
145
+ 'eng': 'producer',
146
+ 'fin': 'tuottaja',
147
+ 'swe': 'producent'
148
+ }, {
149
+ 'code': 'trl',
150
+ 'eng': 'translator',
151
+ 'fin': 'kääntäjä',
152
+ 'swe': 'översättare'
153
+ }];
154
+
155
+ /*
156
+ function recordNormalizeRelatorTerms(record, defaultLanguageCode = undef) {
157
+ const languageCode = defaultLanguageCode ? defaultLanguageCode : getCatalogingLanguage(record);
158
+ if (!languageCode || ['eng', 'fin', 'swe'].includes(languageCode)) {
159
+ return;
160
+ }
161
+
162
+ }
163
+ */
164
+
165
+ const finnishAbbreviations = {
166
+ 'esitt.': 'esittäjä',
167
+ 'käänt.': 'kääntäjä',
168
+ 'näytt.': 'näyttelijä',
169
+ 'san.': 'sanoittaja',
170
+ 'sov.': 'sovittaja',
171
+ 'säv.': 'säveltäjä',
172
+ 'toim.': 'toimittaja'
173
+ };
174
+ function subfieldHandleRelatorTermAbbreviation(subfield, language) {
175
+ if (subfield.code !== 'e') {
176
+ return;
177
+ }
178
+ (0, _utils.nvdebug)(`Relator cand subfield: '${(0, _utils.subfieldToString)(subfield)}', lang: ${language ? language : 'NULL'}`, debugDev);
179
+ if (language === null || language === 'mul') {
180
+ subfieldHandleRelatorTermAbbreviation(subfield, 'fin');
181
+ // Maybe later add Swedish here...
182
+ return;
183
+ }
184
+ const value = subfield.value.replace(/,$/u, '');
185
+ const punc = value === subfield.value ? '' : ',';
186
+ const lcValue = value.toLowerCase(); // Check Å, Ä, Ö...
187
+
188
+ // NB: Policy: if no language or multi-language: apply all rules! (Not much overlap I hope...)
189
+ if (language === 'fin') {
190
+ (0, _utils.nvdebug)(`Relator try Finnish for '${lcValue}}'...`, debugDev);
191
+ if (lcValue in finnishAbbreviations) {
192
+ const hit = `${finnishAbbreviations[lcValue]}${punc}`;
193
+ (0, _utils.nvdebug)(`Relator hit: ${hit}`, debugDev);
194
+ // NB! 'esitt.' => 'esittäjä'
195
+ subfield.value = hit; // eslint-disable-line functional/immutable-data
196
+ return;
197
+ }
198
+ }
199
+ }
200
+ function isRelatorField(field) {
201
+ // Tag list might be incomplete!
202
+ return field.tag.match(/^(?:100|110|600|610|700|710|720|800|810)$/u);
203
+ }
204
+ function fieldHandleRelatorTermAbbreviations(field, language) {
205
+ if (!isRelatorField(field)) {
206
+ return;
207
+ }
208
+ const originalValue = (0, _utils.fieldToString)(field);
209
+ field.subfields.forEach(sf => subfieldHandleRelatorTermAbbreviation(sf, language));
210
+ const modifiedValue = (0, _utils.fieldToString)(field);
211
+ if (modifiedValue === originalValue) {
212
+ return;
213
+ }
214
+ // Changes have happened... Try to punctuate.
215
+ // (NB! We need punctuation as a module, if we are to make abbr expansion a marc-record-validators-melinda validator/fixer)
216
+ (0, _punctuation.fieldFixPunctuation)(field);
217
+ }
218
+ function termIsInGivenLanguage(term, language) {
219
+ return relatorTerms.some(row => language in row && row[language] === term);
220
+ }
221
+ function anyToLanguage(originalTerm) {
222
+ // Sometimes there's no 040$b or 040$b and, say, 040$b and 700$e value don't correlate
223
+ if (termIsInGivenLanguage(originalTerm, 'fin')) {
224
+ return 'fin';
225
+ }
226
+ if (termIsInGivenLanguage(originalTerm, 'swe')) {
227
+ return 'swe';
228
+ }
229
+ if (termIsInGivenLanguage(originalTerm, 'eng')) {
230
+ return 'eng';
231
+ }
232
+ return null;
233
+ }
234
+ function translateRelatorTerm(originalTerm, defaultFromLanguage, toLanguage) {
235
+ // originalTerm is supposed to be normal version (abbrs have been expanded), possibly with punctuation
236
+ const term = originalTerm.replace(/[,.]$/u, '');
237
+ (0, _utils.nvdebug)(`Try to translate '${term}' from ${defaultFromLanguage} to ${toLanguage}`, debugDev);
238
+
239
+ // Kind of hacky... If term is in toLanguage, do nothing. defaultFromLanguage (040$b) isn't that reliable.
240
+ if (termIsInGivenLanguage(term, toLanguage)) {
241
+ return originalTerm;
242
+ }
243
+ // defaultFomLanguage (typically 040$b) isn't that reliable:
244
+ const fromLanguage = defaultFromLanguage === null || !termIsInGivenLanguage(term, defaultFromLanguage) ? anyToLanguage(term) : defaultFromLanguage;
245
+ const [candRow] = relatorTerms.filter(row => fromLanguage in row && toLanguage in row && row[fromLanguage] === term);
246
+ if (candRow) {
247
+ const punc = term === originalTerm ? '' : originalTerm.slice(-1);
248
+ const translation = `${candRow[toLanguage]}${punc}`;
249
+ (0, _utils.nvdebug)(`Translate relator term: ${originalTerm} => ${translation}`, debugDev);
250
+ return translation;
251
+ }
252
+ return originalTerm;
253
+ }
254
+ function subfieldTranslateRelatorTerm(subfield, fromLanguage, toLanguage) {
255
+ if (subfield.code !== 'e') {
256
+ return;
257
+ }
258
+ subfield.value = translateRelatorTerm(subfield.value, fromLanguage, toLanguage); // eslint-disable-line functional/immutable-data
259
+ }
260
+
261
+ function fieldFixRelatorTerms(field, fromLanguage, toLanguage) {
262
+ // fromLanguage can not be relied upon.
263
+ if (!isRelatorField(field) /* || fromLanguage === toLanguage*/) {
264
+ return;
265
+ }
266
+ fieldHandleRelatorTermAbbreviations(field, fromLanguage);
267
+ field.subfields.forEach(sf => subfieldTranslateRelatorTerm(sf, fromLanguage, toLanguage));
268
+ }
269
+ function recordFixRelatorTerms(record, defaultToLanguage = null, defaultFromLanguage = null) {
270
+ // WAS: translateRecord()
271
+ const fromLanguage = defaultFromLanguage ? defaultFromLanguage : (0, _utils.getCatalogingLanguage)(record);
272
+ const toLanguage = defaultToLanguage ? defaultToLanguage : (0, _utils.getCatalogingLanguage)(record);
273
+ record.fields.forEach(field => translateField(field, fromLanguage, toLanguage));
274
+ function translateField(field, from, to) {
275
+ fieldFixRelatorTerms(field, from, to);
276
+ }
277
+ }
278
+ //# sourceMappingURL=fixRelatorTerms.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixRelatorTerms.js","names":["_clone","_interopRequireDefault","require","_punctuation","_utils","_debug","obj","__esModule","default","debug","createDebugLogger","debugDev","extend","_default","description","validate","fix","record","res","message","valid","language","getCatalogingLanguage","fields","forEach","field","fieldFixRelatorTerms","clonedField","clone","clonedFieldAsString","fieldToString","fieldAsString","push","length","relatorTerms","finnishAbbreviations","subfieldHandleRelatorTermAbbreviation","subfield","code","nvdebug","subfieldToString","value","replace","punc","lcValue","toLowerCase","hit","isRelatorField","tag","match","fieldHandleRelatorTermAbbreviations","originalValue","subfields","sf","modifiedValue","fieldFixPunctuation","termIsInGivenLanguage","term","some","row","anyToLanguage","originalTerm","translateRelatorTerm","defaultFromLanguage","toLanguage","fromLanguage","candRow","filter","slice","translation","subfieldTranslateRelatorTerm","recordFixRelatorTerms","defaultToLanguage","translateField","from","to"],"sources":["../src/fixRelatorTerms.js"],"sourcesContent":["import clone from 'clone';\nimport {fieldFixPunctuation} from './punctuation2';\nimport {fieldToString, getCatalogingLanguage, nvdebug, subfieldToString} from './utils';\nimport createDebugLogger from 'debug';\n\n// Currently mainly translates X00$e values, so that we don't have \"$a Name, $e kirjoittaja, $e författare.\".\n// Later on we could try and handle $4 stuff here as well.\n\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:fixRelatorterms');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\nexport default function () {\n return {\n description: 'Fix $e subfields in field [1678][01]0 and 720',\n validate, fix\n };\n\n function fix(record) {\n const res = {message: [], fix: [], valid: true};\n\n const language = getCatalogingLanguage(record);\n\n record.fields.forEach(field => {\n fieldFixRelatorTerms(field, language, language);\n });\n\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n const language = getCatalogingLanguage(record);\n\n record.fields.forEach(field => {\n const clonedField = clone(field);\n // Rather hackily/abnormally use language as both fromLanguage and toLanguage.\n // fromLanguage is used to expand \"esitt.\" => \"esittäjä\".\n // toLanguage is used by translations (fixes \"författere\" to \"kirjoittaja\", if 040$b is \"fin\")\n fieldFixRelatorTerms(field, language, language);\n const clonedFieldAsString = fieldToString(clonedField);\n const fieldAsString = fieldToString(field);\n if (fieldAsString !== clonedFieldAsString) { // eslint-disable-line functional/no-conditional-statements\n res.message.push(`${fieldAsString} => ${clonedFieldAsString}`); // eslint-disable-line functional/immutable-data\n }\n });\n\n res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n}\n\n\n/*\nexport default () => (base, source) => {\n recordTranslateRelatorTerms(base);\n recordTranslateRelatorTerms(source);\n recordHandleRelatorTermAbbreviations(base);\n recordHandleRelatorTermAbbreviations(source);\n const result = {base, source};\n return result;\n};\n*/\n\n\n// Partial source: https://marc21.kansalliskirjasto.fi/funktiot_koodit.htm\n// https://wiki.helsinki.fi/display/MARC21svenska/Funktions-+och+relationskoder+-+alfabetiskt+efter+funktion\n// New, better source: https://id.kb.se/find?q=relator&_sort=_sortKeyByLang.en\n\n\n// NB! How to handle German sex-based Verfasser/Verfasserin pairs?\nconst relatorTerms = [\n {'code': 'arr', 'eng': 'arranger', 'fin': 'sovittaja', 'swe': 'arrangör av musikalisk komposition'},\n {'code': 'art', 'eng': 'artist', 'fin': 'taiteilija', 'swe': 'konstnär'},\n {'code': 'aui', 'eng': 'author of introduction', 'fin': 'esipuheen tekijä'},\n {'code': 'aut', 'eng': 'author', 'fin': 'kirjoittaja', 'swe': 'författare'},\n {'code': 'cmp', 'eng': 'composer', 'fin': 'säveltäjä', 'swe': 'kompositör'},\n {'code': 'drt', 'eng': 'director', 'fin': 'ohjaaja', 'swe': 'regissör'},\n {'code': 'edt', 'eng': 'editor', 'fin': 'toimittaja', 'swe': 'redaktör'},\n {'code': 'ill', 'eng': 'illustrator', 'fin': 'kuvittaja', 'swe': 'illustratör'},\n {'code': 'lyr', 'eng': 'lyricist', 'fin': 'sanoittaja', 'swe': 'sångtext'},\n {'code': 'nrt', 'eng': 'narrator', 'fin': 'kertoja', 'swe': 'berättare'}, // berättare/inläsare\n {'code': 'pbl', 'eng': 'publisher', 'fin': 'julkaisija', 'swe': 'utgivare'},\n {'code': 'pht', 'eng': 'photographer', 'fin': 'valokuvaaja', 'swe': 'fotograf'},\n {'code': 'prf', 'eng': 'performer', 'fin': 'esittäjä', 'swe': 'framförande'},\n {'code': 'pro', 'eng': 'producer', 'fin': 'tuottaja', 'swe': 'producent'},\n {'code': 'trl', 'eng': 'translator', 'fin': 'kääntäjä', 'swe': 'översättare'}\n];\n\n/*\nfunction recordNormalizeRelatorTerms(record, defaultLanguageCode = undef) {\n const languageCode = defaultLanguageCode ? defaultLanguageCode : getCatalogingLanguage(record);\n if (!languageCode || ['eng', 'fin', 'swe'].includes(languageCode)) {\n return;\n }\n\n}\n*/\n\n\nconst finnishAbbreviations = {\n 'esitt.': 'esittäjä',\n 'käänt.': 'kääntäjä',\n 'näytt.': 'näyttelijä',\n 'san.': 'sanoittaja',\n 'sov.': 'sovittaja',\n 'säv.': 'säveltäjä',\n 'toim.': 'toimittaja'\n};\n\nfunction subfieldHandleRelatorTermAbbreviation(subfield, language) {\n if (subfield.code !== 'e') {\n return;\n }\n nvdebug(`Relator cand subfield: '${subfieldToString(subfield)}', lang: ${language ? language : 'NULL'}`, debugDev);\n if (language === null || language === 'mul') {\n subfieldHandleRelatorTermAbbreviation(subfield, 'fin');\n // Maybe later add Swedish here...\n return;\n }\n const value = subfield.value.replace(/,$/u, '');\n const punc = value === subfield.value ? '' : ',';\n\n const lcValue = value.toLowerCase(); // Check Å, Ä, Ö...\n\n // NB: Policy: if no language or multi-language: apply all rules! (Not much overlap I hope...)\n if (language === 'fin') {\n nvdebug(`Relator try Finnish for '${lcValue}}'...`, debugDev);\n if (lcValue in finnishAbbreviations) {\n const hit = `${finnishAbbreviations[lcValue]}${punc}`;\n nvdebug(`Relator hit: ${hit}`, debugDev);\n // NB! 'esitt.' => 'esittäjä'\n subfield.value = hit; // eslint-disable-line functional/immutable-data\n return;\n }\n }\n}\n\n\nfunction isRelatorField(field) {\n // Tag list might be incomplete!\n return field.tag.match(/^(?:100|110|600|610|700|710|720|800|810)$/u);\n}\n\nfunction fieldHandleRelatorTermAbbreviations(field, language) {\n if (!isRelatorField(field)) {\n return;\n }\n\n const originalValue = fieldToString(field);\n field.subfields.forEach(sf => subfieldHandleRelatorTermAbbreviation(sf, language));\n const modifiedValue = fieldToString(field);\n if (modifiedValue === originalValue) {\n return;\n }\n // Changes have happened... Try to punctuate.\n // (NB! We need punctuation as a module, if we are to make abbr expansion a marc-record-validators-melinda validator/fixer)\n fieldFixPunctuation(field);\n}\n\nfunction termIsInGivenLanguage(term, language) {\n return relatorTerms.some(row => language in row && row[language] === term);\n}\n\nfunction anyToLanguage(originalTerm) {\n // Sometimes there's no 040$b or 040$b and, say, 040$b and 700$e value don't correlate\n if (termIsInGivenLanguage(originalTerm, 'fin')) {\n return 'fin';\n }\n if (termIsInGivenLanguage(originalTerm, 'swe')) {\n return 'swe';\n }\n if (termIsInGivenLanguage(originalTerm, 'eng')) {\n return 'eng';\n }\n return null;\n}\n\nfunction translateRelatorTerm(originalTerm, defaultFromLanguage, toLanguage) {\n\n // originalTerm is supposed to be normal version (abbrs have been expanded), possibly with punctuation\n const term = originalTerm.replace(/[,.]$/u, '');\n nvdebug(`Try to translate '${term}' from ${defaultFromLanguage} to ${toLanguage}`, debugDev);\n\n // Kind of hacky... If term is in toLanguage, do nothing. defaultFromLanguage (040$b) isn't that reliable.\n if (termIsInGivenLanguage(term, toLanguage)) {\n return originalTerm;\n }\n // defaultFomLanguage (typically 040$b) isn't that reliable:\n const fromLanguage = defaultFromLanguage === null || !termIsInGivenLanguage(term, defaultFromLanguage) ? anyToLanguage(term) : defaultFromLanguage;\n\n const [candRow] = relatorTerms.filter(row => fromLanguage in row && toLanguage in row && row[fromLanguage] === term);\n if (candRow) {\n const punc = term === originalTerm ? '' : originalTerm.slice(-1);\n const translation = `${candRow[toLanguage]}${punc}`;\n nvdebug(`Translate relator term: ${originalTerm} => ${translation}`, debugDev);\n return translation;\n }\n return originalTerm;\n}\n\nfunction subfieldTranslateRelatorTerm(subfield, fromLanguage, toLanguage) {\n if (subfield.code !== 'e') {\n return;\n }\n subfield.value = translateRelatorTerm(subfield.value, fromLanguage, toLanguage); // eslint-disable-line functional/immutable-data\n}\n\nexport function fieldFixRelatorTerms(field, fromLanguage, toLanguage) {\n // fromLanguage can not be relied upon.\n if (!isRelatorField(field)/* || fromLanguage === toLanguage*/) {\n return;\n }\n fieldHandleRelatorTermAbbreviations(field, fromLanguage);\n\n field.subfields.forEach(sf => subfieldTranslateRelatorTerm(sf, fromLanguage, toLanguage));\n}\n\n\nexport function recordFixRelatorTerms(record, defaultToLanguage = null, defaultFromLanguage = null) { // WAS: translateRecord()\n const fromLanguage = defaultFromLanguage ? defaultFromLanguage : getCatalogingLanguage(record);\n const toLanguage = defaultToLanguage ? defaultToLanguage : getCatalogingLanguage(record);\n\n record.fields.forEach(field => translateField(field, fromLanguage, toLanguage));\n\n function translateField(field, from, to) {\n fieldFixRelatorTerms(field, from, to);\n }\n}\n\n\n"],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+
3
+ var _chai = require("chai");
4
+ var _marcRecord = require("@natlibfi/marc-record");
5
+ var _fixRelatorTerms = _interopRequireDefault(require("./fixRelatorTerms"));
6
+ var _fixura = require("@natlibfi/fixura");
7
+ var _fixugen = _interopRequireDefault(require("@natlibfi/fixugen"));
8
+ var _debug = _interopRequireDefault(require("debug"));
9
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
10
+ (0, _fixugen.default)({
11
+ callback,
12
+ path: [__dirname, '..', 'test-fixtures', 'fix-relator-terms'],
13
+ useMetadataFile: true,
14
+ recurse: false,
15
+ fixura: {
16
+ reader: _fixura.READERS.JSON
17
+ },
18
+ mocha: {
19
+ before: () => testValidatorFactory()
20
+ }
21
+ });
22
+ const debug = (0, _debug.default)('@natlibfi/marc-record-validators-melinda/fixRelatorTerms:test');
23
+ async function testValidatorFactory() {
24
+ const validator = await (0, _fixRelatorTerms.default)();
25
+ (0, _chai.expect)(validator).to.be.an('object').that.has.any.keys('description', 'validate');
26
+ (0, _chai.expect)(validator.description).to.be.a('string');
27
+ (0, _chai.expect)(validator.validate).to.be.a('function');
28
+ }
29
+ async function callback({
30
+ getFixture,
31
+ enabled = true,
32
+ fix = false
33
+ }) {
34
+ if (enabled === false) {
35
+ debug('TEST SKIPPED!');
36
+ return;
37
+ }
38
+ const validator = await (0, _fixRelatorTerms.default)();
39
+ const record = new _marcRecord.MarcRecord(getFixture('record.json'));
40
+ const expectedResult = getFixture('expectedResult.json');
41
+ // console.log(expectedResult); // eslint-disable-line
42
+
43
+ if (!fix) {
44
+ const result = await validator.validate(record);
45
+ (0, _chai.expect)(result).to.eql(expectedResult);
46
+ return;
47
+ }
48
+ await validator.fix(record);
49
+ (0, _chai.expect)(record).to.eql(expectedResult);
50
+ }
51
+ //# sourceMappingURL=fixRelatorTerms.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixRelatorTerms.spec.js","names":["_chai","require","_marcRecord","_fixRelatorTerms","_interopRequireDefault","_fixura","_fixugen","_debug","obj","__esModule","default","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/fixRelatorTerms.spec.js"],"sourcesContent":["import {expect} from 'chai';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './fixRelatorTerms';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\nimport createDebugLogger from 'debug';\n\ngenerateTests({\n callback,\n path: [__dirname, '..', 'test-fixtures', 'fix-relator-terms'],\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/fixRelatorTerms: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,IAAAA,KAAA,GAAAC,OAAA;AACA,IAAAC,WAAA,GAAAD,OAAA;AACA,IAAAE,gBAAA,GAAAC,sBAAA,CAAAH,OAAA;AACA,IAAAI,OAAA,GAAAJ,OAAA;AACA,IAAAK,QAAA,GAAAF,sBAAA,CAAAH,OAAA;AACA,IAAAM,MAAA,GAAAH,sBAAA,CAAAH,OAAA;AAAsC,SAAAG,uBAAAI,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAEtC,IAAAG,gBAAa,EAAC;EACZC,QAAQ;EACRC,IAAI,EAAE,CAACC,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE,mBAAmB,CAAC;EAC7DC,eAAe,EAAE,IAAI;EACrBC,OAAO,EAAE,KAAK;EACdC,MAAM,EAAE;IACNC,MAAM,EAAEC,eAAO,CAACC;EAClB,CAAC;EACDC,KAAK,EAAE;IACLC,MAAM,EAAEA,CAAA,KAAMC,oBAAoB,CAAC;EACrC;AACF,CAAC,CAAC;AACF,MAAMC,KAAK,GAAG,IAAAC,cAAiB,EAAC,+DAA+D,CAAC;AAEhG,eAAeF,oBAAoBA,CAAA,EAAG;EACpC,MAAMG,SAAS,GAAG,MAAM,IAAAC,wBAAgB,EAAC,CAAC;EAE1C,IAAAC,YAAM,EAACF,SAAS,CAAC,CACdG,EAAE,CAACC,EAAE,CAACC,EAAE,CAAC,QAAQ,CAAC,CAClBC,IAAI,CAACC,GAAG,CAACC,GAAG,CAACC,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC;EAE/C,IAAAP,YAAM,EAACF,SAAS,CAACU,WAAW,CAAC,CAACP,EAAE,CAACC,EAAE,CAACO,CAAC,CAAC,QAAQ,CAAC;EAC/C,IAAAT,YAAM,EAACF,SAAS,CAACY,QAAQ,CAAC,CAACT,EAAE,CAACC,EAAE,CAACO,CAAC,CAAC,UAAU,CAAC;AAChD;AAEA,eAAezB,QAAQA,CAAC;EAAC2B,UAAU;EAAEC,OAAO,GAAG,IAAI;EAAEC,GAAG,GAAG;AAAK,CAAC,EAAE;EACjE,IAAID,OAAO,KAAK,KAAK,EAAE;IACrBhB,KAAK,CAAC,eAAe,CAAC;IACtB;EACF;EAEA,MAAME,SAAS,GAAG,MAAM,IAAAC,wBAAgB,EAAC,CAAC;EAC1C,MAAMe,MAAM,GAAG,IAAIC,sBAAU,CAACJ,UAAU,CAAC,aAAa,CAAC,CAAC;EACxD,MAAMK,cAAc,GAAGL,UAAU,CAAC,qBAAqB,CAAC;EACxD;;EAEA,IAAI,CAACE,GAAG,EAAE;IACR,MAAMI,MAAM,GAAG,MAAMnB,SAAS,CAACY,QAAQ,CAACI,MAAM,CAAC;IAC/C,IAAAd,YAAM,EAACiB,MAAM,CAAC,CAAChB,EAAE,CAACiB,GAAG,CAACF,cAAc,CAAC;IACrC;EACF;EAEA,MAAMlB,SAAS,CAACe,GAAG,CAACC,MAAM,CAAC;EAC3B,IAAAd,YAAM,EAACc,MAAM,CAAC,CAACb,EAAE,CAACiB,GAAG,CAACF,cAAc,CAAC;AACvC"}