@natlibfi/marc-record-validators-melinda 10.0.3-alpha.1 → 10.1.0-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 (136) hide show
  1. package/dist/ending-whitespace.js +1 -4
  2. package/dist/ending-whitespace.js.map +1 -1
  3. package/dist/ending-whitespace.spec.js +7 -0
  4. package/dist/ending-whitespace.spec.js.map +1 -1
  5. package/dist/index.js +14 -14
  6. package/dist/index.js.map +1 -1
  7. package/dist/mergeField500Lisapainokset.spec.js +1 -1
  8. package/dist/mergeField500Lisapainokset.spec.js.map +1 -1
  9. package/dist/multiple-subfield-0.js +105 -0
  10. package/dist/multiple-subfield-0.js.map +1 -0
  11. package/dist/multiple-subfield-0.spec.js +51 -0
  12. package/dist/multiple-subfield-0.spec.js.map +1 -0
  13. package/dist/non-breaking-space.js +7 -13
  14. package/dist/non-breaking-space.js.map +1 -1
  15. package/dist/non-breaking-space.spec.js +7 -0
  16. package/dist/non-breaking-space.spec.js.map +1 -1
  17. package/dist/normalize-utf8-diacritics.js +1 -1
  18. package/dist/normalize-utf8-diacritics.js.map +1 -1
  19. package/dist/reindexSubfield6OccurenceNumbers.js +199 -0
  20. package/dist/reindexSubfield6OccurenceNumbers.js.map +1 -0
  21. package/dist/reindexSubfield6OccurenceNumbers.spec.js +51 -0
  22. package/dist/reindexSubfield6OccurenceNumbers.spec.js.map +1 -0
  23. package/dist/removeDuplicateDataFields.js +263 -0
  24. package/dist/removeDuplicateDataFields.js.map +1 -0
  25. package/dist/removeDuplicateDataFields.spec.js +51 -0
  26. package/dist/removeDuplicateDataFields.spec.js.map +1 -0
  27. package/dist/resolveOrphanedSubfield6s.js +116 -0
  28. package/dist/resolveOrphanedSubfield6s.js.map +1 -0
  29. package/dist/resolveOrphanedSubfield6s.spec.js +51 -0
  30. package/dist/resolveOrphanedSubfield6s.spec.js.map +1 -0
  31. package/dist/subfield6Utils.js +358 -0
  32. package/dist/subfield6Utils.js.map +1 -0
  33. package/dist/subfield8Utils.js +69 -0
  34. package/dist/subfield8Utils.js.map +1 -0
  35. package/dist/utils.js +37 -0
  36. package/dist/utils.js.map +1 -1
  37. package/package.json +1 -1
  38. package/src/ending-whitespace.js +1 -5
  39. package/src/ending-whitespace.spec.js +8 -1
  40. package/src/index.js +5 -4
  41. package/src/mergeField500Lisapainokset.spec.js +1 -1
  42. package/src/multiple-subfield-0.js +111 -0
  43. package/src/multiple-subfield-0.spec.js +52 -0
  44. package/src/non-breaking-space.js +3 -16
  45. package/src/non-breaking-space.spec.js +8 -1
  46. package/src/normalize-utf8-diacritics.js +1 -1
  47. package/src/reindexSubfield6OccurenceNumbers.js +210 -0
  48. package/src/reindexSubfield6OccurenceNumbers.spec.js +52 -0
  49. package/src/removeDuplicateDataFields.js +284 -0
  50. package/src/removeDuplicateDataFields.spec.js +52 -0
  51. package/src/resolveOrphanedSubfield6s.js +115 -0
  52. package/src/resolveOrphanedSubfield6s.spec.js +52 -0
  53. package/src/subfield6Utils.js +369 -0
  54. package/src/subfield8Utils.js +69 -0
  55. package/src/utils.js +37 -0
  56. package/test-fixtures/ending-whitespace/01/metadata.json +1 -2
  57. package/test-fixtures/ending-whitespace/02/metadata.json +1 -2
  58. package/test-fixtures/ending-whitespace/03/metadata.json +1 -2
  59. package/test-fixtures/non-breaking-space/01/metadata.json +1 -2
  60. package/test-fixtures/non-breaking-space/02/metadata.json +1 -2
  61. package/test-fixtures/non-breaking-space/03/metadata.json +1 -2
  62. package/test-fixtures/reindex-sf6-occurence-numbers/f01/expectedResult.json +35 -0
  63. package/test-fixtures/reindex-sf6-occurence-numbers/f01/metadata.json +6 -0
  64. package/test-fixtures/reindex-sf6-occurence-numbers/f01/record.json +34 -0
  65. package/test-fixtures/reindex-sf6-occurence-numbers/f02/expectedResult.json +53 -0
  66. package/test-fixtures/reindex-sf6-occurence-numbers/f02/metadata.json +6 -0
  67. package/test-fixtures/reindex-sf6-occurence-numbers/f02/record.json +51 -0
  68. package/test-fixtures/reindex-sf6-occurence-numbers/f03/expectedResult.json +46 -0
  69. package/test-fixtures/reindex-sf6-occurence-numbers/f03/metadata.json +7 -0
  70. package/test-fixtures/reindex-sf6-occurence-numbers/f03/record.json +44 -0
  71. package/test-fixtures/reindex-sf6-occurence-numbers/v01/expectedResult.json +6 -0
  72. package/test-fixtures/reindex-sf6-occurence-numbers/v01/metadata.json +5 -0
  73. package/test-fixtures/reindex-sf6-occurence-numbers/v01/record.json +31 -0
  74. package/test-fixtures/reindex-sf6-occurence-numbers/v02/expectedResult.json +6 -0
  75. package/test-fixtures/reindex-sf6-occurence-numbers/v02/metadata.json +6 -0
  76. package/test-fixtures/reindex-sf6-occurence-numbers/v02/record.json +38 -0
  77. package/test-fixtures/reindex-sf6-occurence-numbers/v03/expectedResult.json +6 -0
  78. package/test-fixtures/reindex-sf6-occurence-numbers/v03/metadata.json +6 -0
  79. package/test-fixtures/reindex-sf6-occurence-numbers/v03/record.json +30 -0
  80. package/test-fixtures/remove-duplicate-datafields/f01/expectedResult.json +35 -0
  81. package/test-fixtures/remove-duplicate-datafields/f01/metadata.json +6 -0
  82. package/test-fixtures/remove-duplicate-datafields/f01/record.json +34 -0
  83. package/test-fixtures/remove-duplicate-datafields/f04/expectedResult.json +31 -0
  84. package/test-fixtures/remove-duplicate-datafields/f04/metadata.json +6 -0
  85. package/test-fixtures/remove-duplicate-datafields/f04/record.json +41 -0
  86. package/test-fixtures/remove-duplicate-datafields/f05/expectedResult.json +23 -0
  87. package/test-fixtures/remove-duplicate-datafields/f05/metadata.json +6 -0
  88. package/test-fixtures/remove-duplicate-datafields/f05/record.json +29 -0
  89. package/test-fixtures/remove-duplicate-datafields/f06/expectedResult.json +42 -0
  90. package/test-fixtures/remove-duplicate-datafields/f06/metadata.json +6 -0
  91. package/test-fixtures/remove-duplicate-datafields/f06/record.json +41 -0
  92. package/test-fixtures/remove-duplicate-datafields/v01/expectedResult.json +6 -0
  93. package/test-fixtures/remove-duplicate-datafields/v01/metadata.json +6 -0
  94. package/test-fixtures/remove-duplicate-datafields/v01/record.json +31 -0
  95. package/test-fixtures/remove-duplicate-datafields/v02/expectedResult.json +11 -0
  96. package/test-fixtures/remove-duplicate-datafields/v02/metadata.json +6 -0
  97. package/test-fixtures/remove-duplicate-datafields/v02/record.json +45 -0
  98. package/test-fixtures/remove-duplicate-datafields/v03/expectedResult.json +7 -0
  99. package/test-fixtures/remove-duplicate-datafields/v03/metadata.json +7 -0
  100. package/test-fixtures/remove-duplicate-datafields/v03/record.json +37 -0
  101. package/test-fixtures/remove-duplicate-datafields/v04/expectedResult.json +6 -0
  102. package/test-fixtures/remove-duplicate-datafields/v04/metadata.json +6 -0
  103. package/test-fixtures/remove-duplicate-datafields/v04/record.json +41 -0
  104. package/test-fixtures/remove-orphanded-sf6s/f01/expectedResult.json +35 -0
  105. package/test-fixtures/remove-orphanded-sf6s/f01/metadata.json +6 -0
  106. package/test-fixtures/remove-orphanded-sf6s/f01/record.json +34 -0
  107. package/test-fixtures/remove-orphanded-sf6s/f02/expectedResult.json +40 -0
  108. package/test-fixtures/remove-orphanded-sf6s/f02/metadata.json +6 -0
  109. package/test-fixtures/remove-orphanded-sf6s/f02/record.json +43 -0
  110. package/test-fixtures/remove-orphanded-sf6s/v01/expectedResult.json +6 -0
  111. package/test-fixtures/remove-orphanded-sf6s/v01/metadata.json +6 -0
  112. package/test-fixtures/remove-orphanded-sf6s/v01/record.json +31 -0
  113. package/test-fixtures/remove-orphanded-sf6s/v02/expectedResult.json +6 -0
  114. package/test-fixtures/remove-orphanded-sf6s/v02/metadata.json +6 -0
  115. package/test-fixtures/remove-orphanded-sf6s/v02/record.json +31 -0
  116. package/test-fixtures/subfield0/f01/expectedResult.json +25 -0
  117. package/test-fixtures/subfield0/f01/metadata.json +6 -0
  118. package/test-fixtures/subfield0/f01/record.json +23 -0
  119. package/test-fixtures/subfield0/f02/expectedResult.json +26 -0
  120. package/test-fixtures/subfield0/f02/metadata.json +6 -0
  121. package/test-fixtures/subfield0/f02/record.json +30 -0
  122. package/test-fixtures/subfield0/f03/expectedResult.json +21 -0
  123. package/test-fixtures/subfield0/f03/metadata.json +6 -0
  124. package/test-fixtures/subfield0/f03/record.json +22 -0
  125. package/test-fixtures/subfield0/v01/expectedResult.json +4 -0
  126. package/test-fixtures/subfield0/v01/metadata.json +6 -0
  127. package/test-fixtures/subfield0/v01/record.json +23 -0
  128. package/test-fixtures/subfield0/v02/expectedResult.json +8 -0
  129. package/test-fixtures/subfield0/v02/metadata.json +6 -0
  130. package/test-fixtures/subfield0/v02/record.json +30 -0
  131. package/test-fixtures/ending-whitespace/04/expectedResult.json +0 -10
  132. package/test-fixtures/ending-whitespace/04/metadata.json +0 -6
  133. package/test-fixtures/ending-whitespace/04/record.json +0 -8
  134. package/test-fixtures/non-breaking-space/04/expectedResult.json +0 -21
  135. package/test-fixtures/non-breaking-space/04/metadata.json +0 -6
  136. package/test-fixtures/non-breaking-space/04/record.json +0 -19
@@ -17,7 +17,7 @@ function _default() {
17
17
  function validate(record) {
18
18
  const nonValidFields = record.fields.filter(({
19
19
  subfields
20
- }) => subfields !== undefined && subfields.filter(valueEndsWithWhitespace).length > 0);
20
+ }) => subfields.filter(valueEndsWithWhitespace).length > 0);
21
21
  const valid = nonValidFields.length === 0;
22
22
  const messages = nonValidFields.flatMap(({
23
23
  tag,
@@ -37,9 +37,6 @@ function _default() {
37
37
  record.fields.forEach(({
38
38
  subfields
39
39
  }) => {
40
- if (subfields === undefined) {
41
- return;
42
- }
43
40
  subfields.forEach(subfield => {
44
41
  if (valueEndsWithWhitespace(subfield)) {
45
42
  subfield.value = subfield.value.trimEnd();
@@ -1 +1 @@
1
- {"version":3,"file":"ending-whitespace.js","names":["description","validate","fix","record","nonValidFields","fields","filter","subfields","undefined","valueEndsWithWhitespace","length","valid","messages","flatMap","tag","map","sf","code","forEach","subfield","value","trimEnd","test"],"sources":["../src/ending-whitespace.js"],"sourcesContent":["/**\n * Provides interface to validate and fix record fields, which include subfields that end with whitespace character\n * @returns {Object} Object containing interfaces required by marc-record-validators-melinda package\n */\nexport default function () {\n return {\n description: 'Handles subfields that ends with whitespace character',\n validate,\n fix\n };\n\n function validate(record) {\n const nonValidFields = record.fields.filter(({subfields}) => subfields !== undefined && subfields.filter(valueEndsWithWhitespace).length > 0);\n\n const valid = nonValidFields.length === 0;\n const messages = nonValidFields.flatMap(({tag, subfields}) => subfields.map(sf => `Field ${tag} subfield $${sf.code} ends with whitespace`));\n\n return valid ? {valid, messages: []} : {valid, messages};\n }\n\n /* eslint-disable functional/immutable-data,functional/no-conditional-statement */\n function fix(record) {\n record.fields.forEach(({subfields}) => {\n if (subfields === undefined) {\n return;\n }\n\n subfields.forEach(subfield => {\n if (valueEndsWithWhitespace(subfield)) {\n subfield.value = subfield.value.trimEnd();\n }\n });\n });\n }\n /* eslint-enable functional/immutable-data,functional/no-conditional-statement */\n\n function valueEndsWithWhitespace({value}) {\n return (/\\s$/u).test(value);\n }\n}\n"],"mappings":";;;;;;AAAA;AACA;AACA;AACA;AACe,oBAAY;EACzB,OAAO;IACLA,WAAW,EAAE,uDAAuD;IACpEC,QAAQ;IACRC;EACF,CAAC;EAED,SAASD,QAAQ,CAACE,MAAM,EAAE;IACxB,MAAMC,cAAc,GAAGD,MAAM,CAACE,MAAM,CAACC,MAAM,CAAC,CAAC;MAACC;IAAS,CAAC,KAAKA,SAAS,KAAKC,SAAS,IAAID,SAAS,CAACD,MAAM,CAACG,uBAAuB,CAAC,CAACC,MAAM,GAAG,CAAC,CAAC;IAE7I,MAAMC,KAAK,GAAGP,cAAc,CAACM,MAAM,KAAK,CAAC;IACzC,MAAME,QAAQ,GAAGR,cAAc,CAACS,OAAO,CAAC,CAAC;MAACC,GAAG;MAAEP;IAAS,CAAC,KAAKA,SAAS,CAACQ,GAAG,CAACC,EAAE,IAAK,SAAQF,GAAI,cAAaE,EAAE,CAACC,IAAK,uBAAsB,CAAC,CAAC;IAE5I,OAAON,KAAK,GAAG;MAACA,KAAK;MAAEC,QAAQ,EAAE;IAAE,CAAC,GAAG;MAACD,KAAK;MAAEC;IAAQ,CAAC;EAC1D;;EAEA;EACA,SAASV,GAAG,CAACC,MAAM,EAAE;IACnBA,MAAM,CAACE,MAAM,CAACa,OAAO,CAAC,CAAC;MAACX;IAAS,CAAC,KAAK;MACrC,IAAIA,SAAS,KAAKC,SAAS,EAAE;QAC3B;MACF;MAEAD,SAAS,CAACW,OAAO,CAACC,QAAQ,IAAI;QAC5B,IAAIV,uBAAuB,CAACU,QAAQ,CAAC,EAAE;UACrCA,QAAQ,CAACC,KAAK,GAAGD,QAAQ,CAACC,KAAK,CAACC,OAAO,EAAE;QAC3C;MACF,CAAC,CAAC;IACJ,CAAC,CAAC;EACJ;EACA;;EAEA,SAASZ,uBAAuB,CAAC;IAACW;EAAK,CAAC,EAAE;IACxC,OAAQ,MAAM,CAAEE,IAAI,CAACF,KAAK,CAAC;EAC7B;AACF"}
1
+ {"version":3,"file":"ending-whitespace.js","names":["description","validate","fix","record","nonValidFields","fields","filter","subfields","valueEndsWithWhitespace","length","valid","messages","flatMap","tag","map","sf","code","forEach","subfield","value","trimEnd","test"],"sources":["../src/ending-whitespace.js"],"sourcesContent":["/**\n * Provides interface to validate and fix record fields, which include subfields that end with whitespace character\n * @returns {Object} Object containing interfaces required by marc-record-validators-melinda package\n */\nexport default function () {\n return {\n description: 'Handles subfields that ends with whitespace character',\n validate,\n fix\n };\n\n function validate(record) {\n const nonValidFields = record.fields.filter(({subfields}) => subfields.filter(valueEndsWithWhitespace).length > 0);\n\n const valid = nonValidFields.length === 0;\n const messages = nonValidFields.flatMap(({tag, subfields}) => subfields.map(sf => `Field ${tag} subfield $${sf.code} ends with whitespace`));\n\n return valid ? {valid, messages: []} : {valid, messages};\n }\n\n /* eslint-disable functional/immutable-data,functional/no-conditional-statement */\n function fix(record) {\n record.fields.forEach(({subfields}) => {\n subfields.forEach(subfield => {\n if (valueEndsWithWhitespace(subfield)) {\n subfield.value = subfield.value.trimEnd();\n }\n });\n });\n }\n /* eslint-enable functional/immutable-data,functional/no-conditional-statement */\n\n function valueEndsWithWhitespace({value}) {\n return (/\\s$/u).test(value);\n }\n}\n"],"mappings":";;;;;;AAAA;AACA;AACA;AACA;AACe,oBAAY;EACzB,OAAO;IACLA,WAAW,EAAE,uDAAuD;IACpEC,QAAQ;IACRC;EACF,CAAC;EAED,SAASD,QAAQ,CAACE,MAAM,EAAE;IACxB,MAAMC,cAAc,GAAGD,MAAM,CAACE,MAAM,CAACC,MAAM,CAAC,CAAC;MAACC;IAAS,CAAC,KAAKA,SAAS,CAACD,MAAM,CAACE,uBAAuB,CAAC,CAACC,MAAM,GAAG,CAAC,CAAC;IAElH,MAAMC,KAAK,GAAGN,cAAc,CAACK,MAAM,KAAK,CAAC;IACzC,MAAME,QAAQ,GAAGP,cAAc,CAACQ,OAAO,CAAC,CAAC;MAACC,GAAG;MAAEN;IAAS,CAAC,KAAKA,SAAS,CAACO,GAAG,CAACC,EAAE,IAAK,SAAQF,GAAI,cAAaE,EAAE,CAACC,IAAK,uBAAsB,CAAC,CAAC;IAE5I,OAAON,KAAK,GAAG;MAACA,KAAK;MAAEC,QAAQ,EAAE;IAAE,CAAC,GAAG;MAACD,KAAK;MAAEC;IAAQ,CAAC;EAC1D;;EAEA;EACA,SAAST,GAAG,CAACC,MAAM,EAAE;IACnBA,MAAM,CAACE,MAAM,CAACY,OAAO,CAAC,CAAC;MAACV;IAAS,CAAC,KAAK;MACrCA,SAAS,CAACU,OAAO,CAACC,QAAQ,IAAI;QAC5B,IAAIV,uBAAuB,CAACU,QAAQ,CAAC,EAAE;UACrCA,QAAQ,CAACC,KAAK,GAAGD,QAAQ,CAACC,KAAK,CAACC,OAAO,EAAE;QAC3C;MACF,CAAC,CAAC;IACJ,CAAC,CAAC;EACJ;EACA;;EAEA,SAASZ,uBAAuB,CAAC;IAACW;EAAK,CAAC,EAAE;IACxC,OAAQ,MAAM,CAAEE,IAAI,CAACF,KAAK,CAAC;EAC7B;AACF"}
@@ -5,6 +5,7 @@ var _marcRecord = require("@natlibfi/marc-record");
5
5
  var _endingWhitespace = _interopRequireDefault(require("./ending-whitespace"));
6
6
  var _fixura = require("@natlibfi/fixura");
7
7
  var _fixugen = _interopRequireDefault(require("@natlibfi/fixugen"));
8
+ var _debug = _interopRequireDefault(require("debug"));
8
9
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
9
10
  (0, _fixugen.default)({
10
11
  callback,
@@ -18,6 +19,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
18
19
  before: () => testValidatorFactory()
19
20
  }
20
21
  });
22
+ const debug = (0, _debug.default)('@natlibfi/marc-record-validators-melinda/ending-whitespace:test');
21
23
  async function testValidatorFactory() {
22
24
  const validator = await (0, _endingWhitespace.default)();
23
25
  (0, _chai.expect)(validator).to.be.an('object').that.has.any.keys('description', 'validate');
@@ -26,8 +28,13 @@ async function testValidatorFactory() {
26
28
  }
27
29
  async function callback({
28
30
  getFixture,
31
+ enabled = true,
29
32
  fix = false
30
33
  }) {
34
+ if (enabled === false) {
35
+ debug('TEST SKIPPED!');
36
+ return;
37
+ }
31
38
  const validator = await (0, _endingWhitespace.default)();
32
39
  const record = new _marcRecord.MarcRecord(getFixture('record.json'));
33
40
  const expectedResult = getFixture('expectedResult.json');
@@ -1 +1 @@
1
- {"version":3,"file":"ending-whitespace.spec.js","names":["generateTests","callback","path","__dirname","useMetadataFile","recurse","fixura","reader","READERS","JSON","mocha","before","testValidatorFactory","validator","validatorFactory","expect","to","be","an","that","has","any","keys","description","a","validate","getFixture","fix","record","MarcRecord","expectedResult","result","eql"],"sources":["../src/ending-whitespace.spec.js"],"sourcesContent":["import {expect} from 'chai';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './ending-whitespace';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\n\ngenerateTests({\n callback,\n path: [__dirname, '..', 'test-fixtures', 'ending-whitespace'],\n useMetadataFile: true,\n recurse: false,\n fixura: {\n reader: READERS.JSON\n },\n mocha: {\n before: () => testValidatorFactory()\n }\n});\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, fix = false}) {\n const validator = await validatorFactory();\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 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;AAA8C;AAE9C,IAAAA,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,EAAE,MAAMC,oBAAoB;EACpC;AACF,CAAC,CAAC;AAEF,eAAeA,oBAAoB,GAAG;EACpC,MAAMC,SAAS,GAAG,MAAM,IAAAC,yBAAgB,GAAE;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,eAAevB,QAAQ,CAAC;EAACyB,UAAU;EAAEC,GAAG,GAAG;AAAK,CAAC,EAAE;EACjD,MAAMd,SAAS,GAAG,MAAM,IAAAC,yBAAgB,GAAE;EAC1C,MAAMc,MAAM,GAAG,IAAIC,sBAAU,CAACH,UAAU,CAAC,aAAa,CAAC,CAAC;EACxD,MAAMI,cAAc,GAAGJ,UAAU,CAAC,qBAAqB,CAAC;EAExD,IAAI,CAACC,GAAG,EAAE;IACR,MAAMI,MAAM,GAAG,MAAMlB,SAAS,CAACY,QAAQ,CAACG,MAAM,CAAC;IAC/C,IAAAb,YAAM,EAACgB,MAAM,CAAC,CAACf,EAAE,CAACgB,GAAG,CAACF,cAAc,CAAC;IACrC;EACF;EAEA,MAAMjB,SAAS,CAACc,GAAG,CAACC,MAAM,CAAC;EAC3B,IAAAb,YAAM,EAACa,MAAM,CAAC,CAACZ,EAAE,CAACgB,GAAG,CAACF,cAAc,CAAC;AACvC"}
1
+ {"version":3,"file":"ending-whitespace.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/ending-whitespace.spec.js"],"sourcesContent":["import {expect} from 'chai';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './ending-whitespace';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\nimport createDebugLogger from 'debug';\n\ngenerateTests({\n callback,\n path: [__dirname, '..', 'test-fixtures', 'ending-whitespace'],\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/ending-whitespace: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\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;AAAsC;AAEtC,IAAAA,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,EAAE,MAAMC,oBAAoB;EACpC;AACF,CAAC,CAAC;AACF,MAAMC,KAAK,GAAG,IAAAC,cAAiB,EAAC,iEAAiE,CAAC;AAElG,eAAeF,oBAAoB,GAAG;EACpC,MAAMG,SAAS,GAAG,MAAM,IAAAC,yBAAgB,GAAE;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,QAAQ,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,yBAAgB,GAAE;EAC1C,MAAMe,MAAM,GAAG,IAAIC,sBAAU,CAACJ,UAAU,CAAC,aAAa,CAAC,CAAC;EACxD,MAAMK,cAAc,GAAGL,UAAU,CAAC,qBAAqB,CAAC;EAExD,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"}
package/dist/index.js CHANGED
@@ -33,12 +33,6 @@ Object.defineProperty(exports, "EndingPunctuation", {
33
33
  return _endingPunctuation.default;
34
34
  }
35
35
  });
36
- Object.defineProperty(exports, "EndingWhitespace", {
37
- enumerable: true,
38
- get: function () {
39
- return _endingWhitespace.default;
40
- }
41
- });
42
36
  Object.defineProperty(exports, "FieldExclusion", {
43
37
  enumerable: true,
44
38
  get: function () {
@@ -81,12 +75,6 @@ Object.defineProperty(exports, "ItemLanguage", {
81
75
  return _itemLanguage.default;
82
76
  }
83
77
  });
84
- Object.defineProperty(exports, "NonBreakingSpace", {
85
- enumerable: true,
86
- get: function () {
87
- return _nonBreakingSpace.default;
88
- }
89
- });
90
78
  Object.defineProperty(exports, "NormalizeUTF8Diacritics", {
91
79
  enumerable: true,
92
80
  get: function () {
@@ -99,12 +87,24 @@ Object.defineProperty(exports, "Punctuation", {
99
87
  return _punctuation.default;
100
88
  }
101
89
  });
90
+ Object.defineProperty(exports, "ReindexSubfield6OccurenceNumbers", {
91
+ enumerable: true,
92
+ get: function () {
93
+ return _reindexSubfield6OccurenceNumbers.default;
94
+ }
95
+ });
102
96
  Object.defineProperty(exports, "ResolvableExtReferences", {
103
97
  enumerable: true,
104
98
  get: function () {
105
99
  return _resolvableExtReferencesMelinda.default;
106
100
  }
107
101
  });
102
+ Object.defineProperty(exports, "ResolveOrphanedSubfield6s", {
103
+ enumerable: true,
104
+ get: function () {
105
+ return _resolveOrphanedSubfield6s.default;
106
+ }
107
+ });
108
108
  Object.defineProperty(exports, "SortTags", {
109
109
  enumerable: true,
110
110
  get: function () {
@@ -134,7 +134,6 @@ var _doubleCommas = _interopRequireDefault(require("./double-commas"));
134
134
  var _duplicatesInd = _interopRequireDefault(require("./duplicates-ind1"));
135
135
  var _emptyFields = _interopRequireDefault(require("./empty-fields"));
136
136
  var _endingPunctuation = _interopRequireDefault(require("./ending-punctuation"));
137
- var _endingWhitespace = _interopRequireDefault(require("./ending-whitespace"));
138
137
  var _fieldsPresent = _interopRequireDefault(require("./fields-present"));
139
138
  var _fieldStructure = _interopRequireDefault(require("./field-structure"));
140
139
  var _fixedFields = _interopRequireDefault(require("./fixed-fields"));
@@ -142,9 +141,10 @@ var _fieldExclusion = _interopRequireDefault(require("./field-exclusion"));
142
141
  var _identicalFields = _interopRequireDefault(require("./identical-fields"));
143
142
  var _isbnIssn = _interopRequireDefault(require("./isbn-issn"));
144
143
  var _itemLanguage = _interopRequireDefault(require("./item-language"));
145
- var _nonBreakingSpace = _interopRequireDefault(require("./non-breaking-space"));
146
144
  var _normalizeUtf8Diacritics = _interopRequireDefault(require("./normalize-utf8-diacritics"));
147
145
  var _punctuation = _interopRequireDefault(require("./punctuation/"));
146
+ var _resolveOrphanedSubfield6s = _interopRequireDefault(require("./resolveOrphanedSubfield6s"));
147
+ var _reindexSubfield6OccurenceNumbers = _interopRequireDefault(require("./reindexSubfield6OccurenceNumbers"));
148
148
  var _resolvableExtReferencesMelinda = _interopRequireDefault(require("./resolvable-ext-references-melinda"));
149
149
  var _sortTags = _interopRequireDefault(require("./sort-tags"));
150
150
  var _subfieldExclusion = _interopRequireDefault(require("./subfield-exclusion"));
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/index.js"],"sourcesContent":["import AccessRights from './access-rights';\nimport DoubleCommas from './double-commas';\nimport DuplicatesInd1 from './duplicates-ind1';\nimport EmptyFields from './empty-fields';\nimport EndingPunctuation from './ending-punctuation';\nimport EndingWhitespace from './ending-whitespace';\nimport FieldsPresent from './fields-present';\nimport FieldStructure from './field-structure';\nimport FixedFields from './fixed-fields';\nimport FieldExclusion from './field-exclusion';\nimport IdenticalFields from './identical-fields';\nimport IsbnIssn from './isbn-issn';\nimport ItemLanguage from './item-language';\nimport NonBreakingSpace from './non-breaking-space';\nimport NormalizeUTF8Diacritics from './normalize-utf8-diacritics';\nimport Punctuation from './punctuation/';\nimport ResolvableExtReferences from './resolvable-ext-references-melinda';\nimport SortTags from './sort-tags';\nimport SubfieldExclusion from './subfield-exclusion';\nimport UnicodeDecomposition from './unicode-decomposition';\nimport Urn from './urn';\n\nexport {\n AccessRights,\n DoubleCommas,\n DuplicatesInd1,\n EmptyFields,\n EndingPunctuation,\n EndingWhitespace,\n FieldExclusion,\n FieldsPresent,\n FieldStructure,\n FixedFields,\n IdenticalFields,\n IsbnIssn,\n ItemLanguage,\n NonBreakingSpace,\n NormalizeUTF8Diacritics,\n Punctuation,\n ResolvableExtReferences,\n SortTags,\n SubfieldExclusion,\n UnicodeDecomposition,\n Urn\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAwB"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/index.js"],"sourcesContent":["import AccessRights from './access-rights';\nimport DoubleCommas from './double-commas';\nimport DuplicatesInd1 from './duplicates-ind1';\nimport EmptyFields from './empty-fields';\nimport EndingPunctuation from './ending-punctuation';\nimport FieldsPresent from './fields-present';\nimport FieldStructure from './field-structure';\nimport FixedFields from './fixed-fields';\nimport FieldExclusion from './field-exclusion';\nimport IdenticalFields from './identical-fields';\nimport IsbnIssn from './isbn-issn';\nimport ItemLanguage from './item-language';\nimport NormalizeUTF8Diacritics from './normalize-utf8-diacritics';\nimport Punctuation from './punctuation/';\nimport ResolveOrphanedSubfield6s from './resolveOrphanedSubfield6s'; // Do this before reindexing!\nimport ReindexSubfield6OccurenceNumbers from './reindexSubfield6OccurenceNumbers';\nimport ResolvableExtReferences from './resolvable-ext-references-melinda';\n\nimport SortTags from './sort-tags';\nimport SubfieldExclusion from './subfield-exclusion';\nimport UnicodeDecomposition from './unicode-decomposition';\nimport Urn from './urn';\n\nexport {\n AccessRights,\n DoubleCommas,\n DuplicatesInd1,\n EmptyFields,\n EndingPunctuation,\n FieldExclusion,\n FieldsPresent,\n FieldStructure,\n FixedFields,\n IdenticalFields,\n IsbnIssn,\n ItemLanguage,\n NormalizeUTF8Diacritics,\n Punctuation,\n ResolveOrphanedSubfield6s,\n ReindexSubfield6OccurenceNumbers,\n ResolvableExtReferences,\n SortTags,\n SubfieldExclusion,\n UnicodeDecomposition,\n Urn\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAAwB"}
@@ -19,7 +19,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
19
19
  before: () => testValidatorFactory()
20
20
  }
21
21
  });
22
- const debug = (0, _debug.default)('@natlibfi/marc-record-validators-melinda/normalize-utf8-diacritics:test');
22
+ const debug = (0, _debug.default)('@natlibfi/marc-record-validators-melinda/mergeField500Lisapainokset:test');
23
23
  async function testValidatorFactory() {
24
24
  const validator = await (0, _mergeField500Lisapainokset.default)();
25
25
  (0, _chai.expect)(validator).to.be.an('object').that.has.any.keys('description', 'validate');
@@ -1 +1 @@
1
- {"version":3,"file":"mergeField500Lisapainokset.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/mergeField500Lisapainokset.spec.js"],"sourcesContent":["import {expect} from 'chai';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './mergeField500Lisapainokset';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\nimport createDebugLogger from 'debug';\n\ngenerateTests({\n callback,\n path: [__dirname, '..', 'test-fixtures', 'lisapainokset'],\n useMetadataFile: true,\n recurse: true,\n fixura: {\n reader: READERS.JSON\n },\n mocha: {\n before: () => testValidatorFactory()\n }\n});\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/normalize-utf8-diacritics: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;AAAsC;AAEtC,IAAAA,gBAAa,EAAC;EACZC,QAAQ;EACRC,IAAI,EAAE,CAACC,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE,eAAe,CAAC;EACzDC,eAAe,EAAE,IAAI;EACrBC,OAAO,EAAE,IAAI;EACbC,MAAM,EAAE;IACNC,MAAM,EAAEC,eAAO,CAACC;EAClB,CAAC;EACDC,KAAK,EAAE;IACLC,MAAM,EAAE,MAAMC,oBAAoB;EACpC;AACF,CAAC,CAAC;AACF,MAAMC,KAAK,GAAG,IAAAC,cAAiB,EAAC,yEAAyE,CAAC;AAE1G,eAAeF,oBAAoB,GAAG;EACpC,MAAMG,SAAS,GAAG,MAAM,IAAAC,mCAAgB,GAAE;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,QAAQ,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,mCAAgB,GAAE;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"}
1
+ {"version":3,"file":"mergeField500Lisapainokset.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/mergeField500Lisapainokset.spec.js"],"sourcesContent":["import {expect} from 'chai';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './mergeField500Lisapainokset';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\nimport createDebugLogger from 'debug';\n\ngenerateTests({\n callback,\n path: [__dirname, '..', 'test-fixtures', 'lisapainokset'],\n useMetadataFile: true,\n recurse: true,\n fixura: {\n reader: READERS.JSON\n },\n mocha: {\n before: () => testValidatorFactory()\n }\n});\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/mergeField500Lisapainokset: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;AAAsC;AAEtC,IAAAA,gBAAa,EAAC;EACZC,QAAQ;EACRC,IAAI,EAAE,CAACC,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE,eAAe,CAAC;EACzDC,eAAe,EAAE,IAAI;EACrBC,OAAO,EAAE,IAAI;EACbC,MAAM,EAAE;IACNC,MAAM,EAAEC,eAAO,CAACC;EAClB,CAAC;EACDC,KAAK,EAAE;IACLC,MAAM,EAAE,MAAMC,oBAAoB;EACpC;AACF,CAAC,CAAC;AACF,MAAMC,KAAK,GAAG,IAAAC,cAAiB,EAAC,0EAA0E,CAAC;AAE3G,eAAeF,oBAAoB,GAAG;EACpC,MAAMG,SAAS,GAAG,MAAM,IAAAC,mCAAgB,GAAE;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,QAAQ,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,mCAAgB,GAAE;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,105 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = _default;
7
+ var _utils = require("./utils");
8
+ // import createDebugLogger from 'debug';
9
+ // import clone from 'clone';
10
+ // const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:multiple-subfield-0');
11
+
12
+ const asteriPrefixes = ['(FI-ASTERI-N)', '(FIN11)', 'http://urn.fi/URN:NBN:fi:au:finaf:', 'https://urn.fi/URN:NBN:fi:au:finaf:'];
13
+ function _default() {
14
+ return {
15
+ description: 'If Asteri subfield $0 is found, remove non-Asteri $0 subfields',
16
+ validate,
17
+ fix
18
+ };
19
+ function fix(record) {
20
+ function removeNonAsteriSubfields(field) {
21
+ const removableSubfields = getDeletableSubfields(field.subfields);
22
+ removableSubfields.forEach(sf => record.removeSubfield(sf, field));
23
+ }
24
+ const res = {
25
+ message: [],
26
+ fix: [],
27
+ valid: true
28
+ };
29
+ const relevantFields = getRelevantFields(record);
30
+ relevantFields.forEach(field => removeNonAsteriSubfields(field));
31
+
32
+ // message.valid = !(message.message.length >= 1); // eslint-disable-line functional/immutable-data
33
+ return res;
34
+ }
35
+ function validate(record) {
36
+ const relevantFields = getRelevantFields(record);
37
+ const messages = relevantFields.map(field => `Contains deletable $0 subfield(s): ${(0, _utils.fieldToString)(field)}`);
38
+ const res = {
39
+ message: messages
40
+ };
41
+ res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data
42
+ return res;
43
+ }
44
+ function fieldGetSubfields(field, code) {
45
+ return field.subfields.filter(sf => sf.code === code);
46
+ }
47
+ function isAsteriId(value) {
48
+ const nineDigitTail = value.slice(-9);
49
+ if (!/^[0-9]{9}$/u.test(nineDigitTail)) {
50
+ return false;
51
+ }
52
+ // Normalize prefix:
53
+ const currPrefix = value.slice(0, -9);
54
+ if (asteriPrefixes.includes(currPrefix)) {
55
+ return true;
56
+ }
57
+ return false;
58
+ }
59
+ function getAsteriSubfields(subfields) {
60
+ return subfields.filter(sf => isAsteriId(sf.value));
61
+ }
62
+ function getDeletableSubfields(subfields) {
63
+ return subfields.filter(sf => sf.code === '0' && isDeletableId(sf.value));
64
+ function isDeletableId(value) {
65
+ if (isAsteriId(value)) {
66
+ return false;
67
+ }
68
+ // Bit lazy here, but it's easy to edit, and this should be good enough for proof-of-concept at least
69
+ if (value.match(/(?:isni|orcid)/ui)) {
70
+ return true;
71
+ }
72
+ // Currently default to false, and delete only specified values
73
+ return false;
74
+ }
75
+ }
76
+ function fieldHasTitlePart(field) {
77
+ if (['600', '610', '700', '710', '800', '810'].includes(field.tag)) {
78
+ if ((0, _utils.fieldHasSubfield)(field, 't')) {
79
+ return true;
80
+ }
81
+ }
82
+ return false;
83
+ }
84
+ function fieldIsRelevant(field) {
85
+ const subfield0s = fieldGetSubfields(field, '0');
86
+ if (subfield0s.length < 2) {
87
+ return false;
88
+ }
89
+ const asteriSubfields = getAsteriSubfields(subfield0s);
90
+ if (asteriSubfields.length < 1) {
91
+ return false;
92
+ }
93
+
94
+ // $0 might refer to name part or title part. If title part is present, don't remove...
95
+ if (fieldHasTitlePart(field)) {
96
+ return false;
97
+ }
98
+ const deletableSubfields = getDeletableSubfields(subfield0s);
99
+ return deletableSubfields.length > 0;
100
+ }
101
+ function getRelevantFields(record) {
102
+ return record.fields.filter(field => field.subfields && fieldIsRelevant(field));
103
+ }
104
+ }
105
+ //# sourceMappingURL=multiple-subfield-0.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multiple-subfield-0.js","names":["asteriPrefixes","description","validate","fix","record","removeNonAsteriSubfields","field","removableSubfields","getDeletableSubfields","subfields","forEach","sf","removeSubfield","res","message","valid","relevantFields","getRelevantFields","messages","map","fieldToString","length","fieldGetSubfields","code","filter","isAsteriId","value","nineDigitTail","slice","test","currPrefix","includes","getAsteriSubfields","isDeletableId","match","fieldHasTitlePart","tag","fieldHasSubfield","fieldIsRelevant","subfield0s","asteriSubfields","deletableSubfields","fields"],"sources":["../src/multiple-subfield-0.js"],"sourcesContent":["// import createDebugLogger from 'debug';\n// import clone from 'clone';\n// const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:multiple-subfield-0');\n\nimport {fieldHasSubfield, fieldToString} from './utils';\n\nconst asteriPrefixes = ['(FI-ASTERI-N)', '(FIN11)', 'http://urn.fi/URN:NBN:fi:au:finaf:', 'https://urn.fi/URN:NBN:fi:au:finaf:'];\n\nexport default function () {\n\n return {\n description: 'If Asteri subfield $0 is found, remove non-Asteri $0 subfields',\n validate, fix\n };\n\n function fix(record) {\n function removeNonAsteriSubfields(field) {\n const removableSubfields = getDeletableSubfields(field.subfields);\n removableSubfields.forEach(sf => record.removeSubfield(sf, field));\n }\n\n const res = {message: [], fix: [], valid: true};\n\n const relevantFields = getRelevantFields(record);\n\n relevantFields.forEach(field => removeNonAsteriSubfields(field));\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 relevantFields = getRelevantFields(record);\n const messages = relevantFields.map(field => `Contains deletable $0 subfield(s): ${fieldToString(field)}`);\n const res = {message: messages};\n res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n\n function fieldGetSubfields(field, code) {\n return field.subfields.filter(sf => sf.code === code);\n }\n\n function isAsteriId(value) {\n const nineDigitTail = value.slice(-9);\n if (!(/^[0-9]{9}$/u).test(nineDigitTail)) {\n return false;\n }\n // Normalize prefix:\n const currPrefix = value.slice(0, -9);\n\n if (asteriPrefixes.includes(currPrefix)) {\n return true;\n }\n return false;\n }\n\n function getAsteriSubfields(subfields) {\n return subfields.filter(sf => isAsteriId(sf.value));\n }\n\n\n function getDeletableSubfields(subfields) {\n return subfields.filter(sf => sf.code === '0' && isDeletableId(sf.value));\n\n function isDeletableId(value) {\n if (isAsteriId(value)) {\n return false;\n }\n // Bit lazy here, but it's easy to edit, and this should be good enough for proof-of-concept at least\n if (value.match(/(?:isni|orcid)/ui)) {\n return true;\n }\n // Currently default to false, and delete only specified values\n return false;\n }\n }\n\n function fieldHasTitlePart(field) {\n if (['600', '610', '700', '710', '800', '810'].includes(field.tag)) {\n if (fieldHasSubfield(field, 't')) {\n return true;\n }\n }\n return false;\n }\n\n function fieldIsRelevant(field) {\n const subfield0s = fieldGetSubfields(field, '0');\n if (subfield0s.length < 2) {\n return false;\n }\n const asteriSubfields = getAsteriSubfields(subfield0s);\n if (asteriSubfields.length < 1) {\n return false;\n }\n\n // $0 might refer to name part or title part. If title part is present, don't remove...\n if (fieldHasTitlePart(field)) {\n return false;\n }\n\n\n const deletableSubfields = getDeletableSubfields(subfield0s);\n return deletableSubfields.length > 0;\n }\n\n function getRelevantFields(record) {\n return record.fields.filter(field => field.subfields && fieldIsRelevant(field));\n }\n}\n"],"mappings":";;;;;;AAIA;AAJA;AACA;AACA;;AAIA,MAAMA,cAAc,GAAG,CAAC,eAAe,EAAE,SAAS,EAAE,oCAAoC,EAAE,qCAAqC,CAAC;AAEjH,oBAAY;EAEzB,OAAO;IACLC,WAAW,EAAE,gEAAgE;IAC7EC,QAAQ;IAAEC;EACZ,CAAC;EAED,SAASA,GAAG,CAACC,MAAM,EAAE;IACnB,SAASC,wBAAwB,CAACC,KAAK,EAAE;MACvC,MAAMC,kBAAkB,GAAGC,qBAAqB,CAACF,KAAK,CAACG,SAAS,CAAC;MACjEF,kBAAkB,CAACG,OAAO,CAACC,EAAE,IAAIP,MAAM,CAACQ,cAAc,CAACD,EAAE,EAAEL,KAAK,CAAC,CAAC;IACpE;IAEA,MAAMO,GAAG,GAAG;MAACC,OAAO,EAAE,EAAE;MAAEX,GAAG,EAAE,EAAE;MAAEY,KAAK,EAAE;IAAI,CAAC;IAE/C,MAAMC,cAAc,GAAGC,iBAAiB,CAACb,MAAM,CAAC;IAEhDY,cAAc,CAACN,OAAO,CAACJ,KAAK,IAAID,wBAAwB,CAACC,KAAK,CAAC,CAAC;;IAEhE;IACA,OAAOO,GAAG;EACZ;EAEA,SAASX,QAAQ,CAACE,MAAM,EAAE;IACxB,MAAMY,cAAc,GAAGC,iBAAiB,CAACb,MAAM,CAAC;IAChD,MAAMc,QAAQ,GAAGF,cAAc,CAACG,GAAG,CAACb,KAAK,IAAK,sCAAqC,IAAAc,oBAAa,EAACd,KAAK,CAAE,EAAC,CAAC;IAC1G,MAAMO,GAAG,GAAG;MAACC,OAAO,EAAEI;IAAQ,CAAC;IAC/BL,GAAG,CAACE,KAAK,GAAG,EAAEF,GAAG,CAACC,OAAO,CAACO,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC;IACxC,OAAOR,GAAG;EACZ;EAEA,SAASS,iBAAiB,CAAChB,KAAK,EAAEiB,IAAI,EAAE;IACtC,OAAOjB,KAAK,CAACG,SAAS,CAACe,MAAM,CAACb,EAAE,IAAIA,EAAE,CAACY,IAAI,KAAKA,IAAI,CAAC;EACvD;EAEA,SAASE,UAAU,CAACC,KAAK,EAAE;IACzB,MAAMC,aAAa,GAAGD,KAAK,CAACE,KAAK,CAAC,CAAC,CAAC,CAAC;IACrC,IAAI,CAAE,aAAa,CAAEC,IAAI,CAACF,aAAa,CAAC,EAAE;MACxC,OAAO,KAAK;IACd;IACA;IACA,MAAMG,UAAU,GAAGJ,KAAK,CAACE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAErC,IAAI5B,cAAc,CAAC+B,QAAQ,CAACD,UAAU,CAAC,EAAE;MACvC,OAAO,IAAI;IACb;IACA,OAAO,KAAK;EACd;EAEA,SAASE,kBAAkB,CAACvB,SAAS,EAAE;IACrC,OAAOA,SAAS,CAACe,MAAM,CAACb,EAAE,IAAIc,UAAU,CAACd,EAAE,CAACe,KAAK,CAAC,CAAC;EACrD;EAGA,SAASlB,qBAAqB,CAACC,SAAS,EAAE;IACxC,OAAOA,SAAS,CAACe,MAAM,CAACb,EAAE,IAAIA,EAAE,CAACY,IAAI,KAAK,GAAG,IAAIU,aAAa,CAACtB,EAAE,CAACe,KAAK,CAAC,CAAC;IAEzE,SAASO,aAAa,CAACP,KAAK,EAAE;MAC5B,IAAID,UAAU,CAACC,KAAK,CAAC,EAAE;QACrB,OAAO,KAAK;MACd;MACA;MACA,IAAIA,KAAK,CAACQ,KAAK,CAAC,kBAAkB,CAAC,EAAE;QACnC,OAAO,IAAI;MACb;MACA;MACA,OAAO,KAAK;IACd;EACF;EAEA,SAASC,iBAAiB,CAAC7B,KAAK,EAAE;IAChC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAACyB,QAAQ,CAACzB,KAAK,CAAC8B,GAAG,CAAC,EAAE;MAClE,IAAI,IAAAC,uBAAgB,EAAC/B,KAAK,EAAE,GAAG,CAAC,EAAE;QAChC,OAAO,IAAI;MACb;IACF;IACA,OAAO,KAAK;EACd;EAEA,SAASgC,eAAe,CAAChC,KAAK,EAAE;IAC9B,MAAMiC,UAAU,GAAGjB,iBAAiB,CAAChB,KAAK,EAAE,GAAG,CAAC;IAChD,IAAIiC,UAAU,CAAClB,MAAM,GAAG,CAAC,EAAE;MACzB,OAAO,KAAK;IACd;IACA,MAAMmB,eAAe,GAAGR,kBAAkB,CAACO,UAAU,CAAC;IACtD,IAAIC,eAAe,CAACnB,MAAM,GAAG,CAAC,EAAE;MAC9B,OAAO,KAAK;IACd;;IAEA;IACA,IAAIc,iBAAiB,CAAC7B,KAAK,CAAC,EAAE;MAC5B,OAAO,KAAK;IACd;IAGA,MAAMmC,kBAAkB,GAAGjC,qBAAqB,CAAC+B,UAAU,CAAC;IAC5D,OAAOE,kBAAkB,CAACpB,MAAM,GAAG,CAAC;EACtC;EAEA,SAASJ,iBAAiB,CAACb,MAAM,EAAE;IACjC,OAAOA,MAAM,CAACsC,MAAM,CAAClB,MAAM,CAAClB,KAAK,IAAIA,KAAK,CAACG,SAAS,IAAI6B,eAAe,CAAChC,KAAK,CAAC,CAAC;EACjF;AACF"}
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+
3
+ var _chai = require("chai");
4
+ var _marcRecord = require("@natlibfi/marc-record");
5
+ var _multipleSubfield = _interopRequireDefault(require("./multiple-subfield-0"));
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', 'subfield0'],
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/multiple-subfield-0:test');
23
+ async function testValidatorFactory() {
24
+ const validator = await (0, _multipleSubfield.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, _multipleSubfield.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=multiple-subfield-0.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multiple-subfield-0.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/multiple-subfield-0.spec.js"],"sourcesContent":["import {expect} from 'chai';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './multiple-subfield-0';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\nimport createDebugLogger from 'debug';\n\ngenerateTests({\n callback,\n path: [__dirname, '..', 'test-fixtures', 'subfield0'],\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/multiple-subfield-0: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;AAAsC;AAEtC,IAAAA,gBAAa,EAAC;EACZC,QAAQ;EACRC,IAAI,EAAE,CAACC,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE,WAAW,CAAC;EACrDC,eAAe,EAAE,IAAI;EACrBC,OAAO,EAAE,KAAK;EACdC,MAAM,EAAE;IACNC,MAAM,EAAEC,eAAO,CAACC;EAClB,CAAC;EACDC,KAAK,EAAE;IACLC,MAAM,EAAE,MAAMC,oBAAoB;EACpC;AACF,CAAC,CAAC;AACF,MAAMC,KAAK,GAAG,IAAAC,cAAiB,EAAC,mEAAmE,CAAC;AAEpG,eAAeF,oBAAoB,GAAG;EACpC,MAAMG,SAAS,GAAG,MAAM,IAAAC,yBAAgB,GAAE;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,QAAQ,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,yBAAgB,GAAE;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"}
@@ -15,7 +15,9 @@ function _default() {
15
15
  fix
16
16
  };
17
17
  function validate(record) {
18
- const nonValidFields = record.fields.filter(field => collectNonValidFields(field));
18
+ const nonValidFields = record.fields.filter(({
19
+ subfields
20
+ }) => subfields.filter(valueContainsNonBreakingSpace).length > 0);
19
21
  const valid = nonValidFields.length === 0;
20
22
  const messages = nonValidFields.flatMap(({
21
23
  tag,
@@ -28,22 +30,14 @@ function _default() {
28
30
  valid,
29
31
  messages
30
32
  };
31
- function collectNonValidFields(field) {
32
- if (field.value) {
33
- return /\u00A0/u.test(field.value);
34
- }
35
- return field.subfields.filter(valueContainsNonBreakingSpace).length > 0;
36
- }
37
33
  }
38
34
 
39
35
  /* eslint-disable functional/immutable-data,functional/no-conditional-statement */
40
36
  function fix(record) {
41
- record.fields.forEach(field => {
42
- if (field.value) {
43
- field.value = field.value.replaceAll(/\u00A0/gu, ' ');
44
- return;
45
- }
46
- field.subfields.forEach(subfield => {
37
+ record.fields.forEach(({
38
+ subfields
39
+ }) => {
40
+ subfields.forEach(subfield => {
47
41
  if (valueContainsNonBreakingSpace(subfield)) {
48
42
  subfield.value = subfield.value.replaceAll(/\u00A0/gu, ' ');
49
43
  }
@@ -1 +1 @@
1
- {"version":3,"file":"non-breaking-space.js","names":["description","validate","fix","record","nonValidFields","fields","filter","field","collectNonValidFields","valid","length","messages","flatMap","tag","subfields","map","sf","code","value","test","valueContainsNonBreakingSpace","forEach","replaceAll","subfield"],"sources":["../src/non-breaking-space.js"],"sourcesContent":["/**\n * Provides interface to validate and fix record fields, which include subfields that contain no-breaking space character\n * @returns {Object} Object containing interfaces required by marc-record-validators-melinda package\n */\nexport default function () {\n return {\n description: 'Handles subfields that contains non-breaking space character',\n validate,\n fix\n };\n\n function validate(record) {\n const nonValidFields = record.fields.filter((field) => collectNonValidFields(field));\n\n const valid = nonValidFields.length === 0;\n const messages = nonValidFields.flatMap(({tag, subfields}) => subfields.map(sf => `Field ${tag} subfield $${sf.code} contains non-breaking space character(s)`));\n\n return valid ? {valid, messages: []} : {valid, messages};\n\n function collectNonValidFields(field) {\n if (field.value) {\n return (/\\u00A0/u).test(field.value);\n }\n\n return field.subfields.filter(valueContainsNonBreakingSpace).length > 0;\n }\n }\n\n /* eslint-disable functional/immutable-data,functional/no-conditional-statement */\n function fix(record) {\n record.fields.forEach((field) => {\n if (field.value) {\n field.value = field.value.replaceAll(/\\u00A0/gu, ' ');\n return;\n }\n\n field.subfields.forEach(subfield => {\n if (valueContainsNonBreakingSpace(subfield)) {\n subfield.value = subfield.value.replaceAll(/\\u00A0/gu, ' ');\n }\n });\n });\n }\n /* eslint-enable functional/immutable-data,functional/no-conditional-statement */\n\n function valueContainsNonBreakingSpace({value}) {\n return (/\\u00A0/u).test(value);\n }\n}\n"],"mappings":";;;;;;AAAA;AACA;AACA;AACA;AACe,oBAAY;EACzB,OAAO;IACLA,WAAW,EAAE,8DAA8D;IAC3EC,QAAQ;IACRC;EACF,CAAC;EAED,SAASD,QAAQ,CAACE,MAAM,EAAE;IACxB,MAAMC,cAAc,GAAGD,MAAM,CAACE,MAAM,CAACC,MAAM,CAAEC,KAAK,IAAKC,qBAAqB,CAACD,KAAK,CAAC,CAAC;IAEpF,MAAME,KAAK,GAAGL,cAAc,CAACM,MAAM,KAAK,CAAC;IACzC,MAAMC,QAAQ,GAAGP,cAAc,CAACQ,OAAO,CAAC,CAAC;MAACC,GAAG;MAAEC;IAAS,CAAC,KAAKA,SAAS,CAACC,GAAG,CAACC,EAAE,IAAK,SAAQH,GAAI,cAAaG,EAAE,CAACC,IAAK,2CAA0C,CAAC,CAAC;IAEhK,OAAOR,KAAK,GAAG;MAACA,KAAK;MAAEE,QAAQ,EAAE;IAAE,CAAC,GAAG;MAACF,KAAK;MAAEE;IAAQ,CAAC;IAExD,SAASH,qBAAqB,CAACD,KAAK,EAAE;MACpC,IAAIA,KAAK,CAACW,KAAK,EAAE;QACf,OAAQ,SAAS,CAAEC,IAAI,CAACZ,KAAK,CAACW,KAAK,CAAC;MACtC;MAEA,OAAOX,KAAK,CAACO,SAAS,CAACR,MAAM,CAACc,6BAA6B,CAAC,CAACV,MAAM,GAAG,CAAC;IACzE;EACF;;EAEA;EACA,SAASR,GAAG,CAACC,MAAM,EAAE;IACnBA,MAAM,CAACE,MAAM,CAACgB,OAAO,CAAEd,KAAK,IAAK;MAC/B,IAAIA,KAAK,CAACW,KAAK,EAAE;QACfX,KAAK,CAACW,KAAK,GAAGX,KAAK,CAACW,KAAK,CAACI,UAAU,CAAC,UAAU,EAAE,GAAG,CAAC;QACrD;MACF;MAEAf,KAAK,CAACO,SAAS,CAACO,OAAO,CAACE,QAAQ,IAAI;QAClC,IAAIH,6BAA6B,CAACG,QAAQ,CAAC,EAAE;UAC3CA,QAAQ,CAACL,KAAK,GAAGK,QAAQ,CAACL,KAAK,CAACI,UAAU,CAAC,UAAU,EAAE,GAAG,CAAC;QAC7D;MACF,CAAC,CAAC;IACJ,CAAC,CAAC;EACJ;EACA;;EAEA,SAASF,6BAA6B,CAAC;IAACF;EAAK,CAAC,EAAE;IAC9C,OAAQ,SAAS,CAAEC,IAAI,CAACD,KAAK,CAAC;EAChC;AACF"}
1
+ {"version":3,"file":"non-breaking-space.js","names":["description","validate","fix","record","nonValidFields","fields","filter","subfields","valueContainsNonBreakingSpace","length","valid","messages","flatMap","tag","map","sf","code","forEach","subfield","value","replaceAll","test"],"sources":["../src/non-breaking-space.js"],"sourcesContent":["/**\n * Provides interface to validate and fix record fields, which include subfields that contain no-breaking space character\n * @returns {Object} Object containing interfaces required by marc-record-validators-melinda package\n */\nexport default function () {\n return {\n description: 'Handles subfields that contains non-breaking space character',\n validate,\n fix\n };\n\n function validate(record) {\n const nonValidFields = record.fields.filter(({subfields}) => subfields.filter(valueContainsNonBreakingSpace).length > 0);\n\n const valid = nonValidFields.length === 0;\n const messages = nonValidFields.flatMap(({tag, subfields}) => subfields.map(sf => `Field ${tag} subfield $${sf.code} contains non-breaking space character(s)`));\n\n return valid ? {valid, messages: []} : {valid, messages};\n }\n\n /* eslint-disable functional/immutable-data,functional/no-conditional-statement */\n function fix(record) {\n record.fields.forEach(({subfields}) => {\n subfields.forEach(subfield => {\n if (valueContainsNonBreakingSpace(subfield)) {\n subfield.value = subfield.value.replaceAll(/\\u00A0/gu, ' ');\n }\n });\n });\n }\n /* eslint-enable functional/immutable-data,functional/no-conditional-statement */\n\n function valueContainsNonBreakingSpace({value}) {\n return (/\\u00A0/u).test(value);\n }\n}\n"],"mappings":";;;;;;AAAA;AACA;AACA;AACA;AACe,oBAAY;EACzB,OAAO;IACLA,WAAW,EAAE,8DAA8D;IAC3EC,QAAQ;IACRC;EACF,CAAC;EAED,SAASD,QAAQ,CAACE,MAAM,EAAE;IACxB,MAAMC,cAAc,GAAGD,MAAM,CAACE,MAAM,CAACC,MAAM,CAAC,CAAC;MAACC;IAAS,CAAC,KAAKA,SAAS,CAACD,MAAM,CAACE,6BAA6B,CAAC,CAACC,MAAM,GAAG,CAAC,CAAC;IAExH,MAAMC,KAAK,GAAGN,cAAc,CAACK,MAAM,KAAK,CAAC;IACzC,MAAME,QAAQ,GAAGP,cAAc,CAACQ,OAAO,CAAC,CAAC;MAACC,GAAG;MAAEN;IAAS,CAAC,KAAKA,SAAS,CAACO,GAAG,CAACC,EAAE,IAAK,SAAQF,GAAI,cAAaE,EAAE,CAACC,IAAK,2CAA0C,CAAC,CAAC;IAEhK,OAAON,KAAK,GAAG;MAACA,KAAK;MAAEC,QAAQ,EAAE;IAAE,CAAC,GAAG;MAACD,KAAK;MAAEC;IAAQ,CAAC;EAC1D;;EAEA;EACA,SAAST,GAAG,CAACC,MAAM,EAAE;IACnBA,MAAM,CAACE,MAAM,CAACY,OAAO,CAAC,CAAC;MAACV;IAAS,CAAC,KAAK;MACrCA,SAAS,CAACU,OAAO,CAACC,QAAQ,IAAI;QAC5B,IAAIV,6BAA6B,CAACU,QAAQ,CAAC,EAAE;UAC3CA,QAAQ,CAACC,KAAK,GAAGD,QAAQ,CAACC,KAAK,CAACC,UAAU,CAAC,UAAU,EAAE,GAAG,CAAC;QAC7D;MACF,CAAC,CAAC;IACJ,CAAC,CAAC;EACJ;EACA;;EAEA,SAASZ,6BAA6B,CAAC;IAACW;EAAK,CAAC,EAAE;IAC9C,OAAQ,SAAS,CAAEE,IAAI,CAACF,KAAK,CAAC;EAChC;AACF"}
@@ -5,6 +5,7 @@ var _marcRecord = require("@natlibfi/marc-record");
5
5
  var _nonBreakingSpace = _interopRequireDefault(require("./non-breaking-space"));
6
6
  var _fixura = require("@natlibfi/fixura");
7
7
  var _fixugen = _interopRequireDefault(require("@natlibfi/fixugen"));
8
+ var _debug = _interopRequireDefault(require("debug"));
8
9
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
9
10
  (0, _fixugen.default)({
10
11
  callback,
@@ -18,6 +19,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
18
19
  before: () => testValidatorFactory()
19
20
  }
20
21
  });
22
+ const debug = (0, _debug.default)('@natlibfi/marc-record-validators-melinda/non-breaking-space:test');
21
23
  async function testValidatorFactory() {
22
24
  const validator = await (0, _nonBreakingSpace.default)();
23
25
  (0, _chai.expect)(validator).to.be.an('object').that.has.any.keys('description', 'validate');
@@ -26,8 +28,13 @@ async function testValidatorFactory() {
26
28
  }
27
29
  async function callback({
28
30
  getFixture,
31
+ enabled = true,
29
32
  fix = false
30
33
  }) {
34
+ if (enabled === false) {
35
+ debug('TEST SKIPPED!');
36
+ return;
37
+ }
31
38
  const validator = await (0, _nonBreakingSpace.default)();
32
39
  const record = new _marcRecord.MarcRecord(getFixture('record.json'));
33
40
  const expectedResult = getFixture('expectedResult.json');
@@ -1 +1 @@
1
- {"version":3,"file":"non-breaking-space.spec.js","names":["generateTests","callback","path","__dirname","useMetadataFile","recurse","fixura","reader","READERS","JSON","mocha","before","testValidatorFactory","validator","validatorFactory","expect","to","be","an","that","has","any","keys","description","a","validate","getFixture","fix","record","MarcRecord","expectedResult","result","eql"],"sources":["../src/non-breaking-space.spec.js"],"sourcesContent":["import {expect} from 'chai';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './non-breaking-space';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\n\ngenerateTests({\n callback,\n path: [__dirname, '..', 'test-fixtures', 'non-breaking-space'],\n useMetadataFile: true,\n recurse: false,\n fixura: {\n reader: READERS.JSON\n },\n mocha: {\n before: () => testValidatorFactory()\n }\n});\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, fix = false}) {\n const validator = await validatorFactory();\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 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;AAA8C;AAE9C,IAAAA,gBAAa,EAAC;EACZC,QAAQ;EACRC,IAAI,EAAE,CAACC,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE,oBAAoB,CAAC;EAC9DC,eAAe,EAAE,IAAI;EACrBC,OAAO,EAAE,KAAK;EACdC,MAAM,EAAE;IACNC,MAAM,EAAEC,eAAO,CAACC;EAClB,CAAC;EACDC,KAAK,EAAE;IACLC,MAAM,EAAE,MAAMC,oBAAoB;EACpC;AACF,CAAC,CAAC;AAEF,eAAeA,oBAAoB,GAAG;EACpC,MAAMC,SAAS,GAAG,MAAM,IAAAC,yBAAgB,GAAE;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,eAAevB,QAAQ,CAAC;EAACyB,UAAU;EAAEC,GAAG,GAAG;AAAK,CAAC,EAAE;EACjD,MAAMd,SAAS,GAAG,MAAM,IAAAC,yBAAgB,GAAE;EAC1C,MAAMc,MAAM,GAAG,IAAIC,sBAAU,CAACH,UAAU,CAAC,aAAa,CAAC,CAAC;EACxD,MAAMI,cAAc,GAAGJ,UAAU,CAAC,qBAAqB,CAAC;EAExD,IAAI,CAACC,GAAG,EAAE;IACR,MAAMI,MAAM,GAAG,MAAMlB,SAAS,CAACY,QAAQ,CAACG,MAAM,CAAC;IAC/C,IAAAb,YAAM,EAACgB,MAAM,CAAC,CAACf,EAAE,CAACgB,GAAG,CAACF,cAAc,CAAC;IACrC;EACF;EAEA,MAAMjB,SAAS,CAACc,GAAG,CAACC,MAAM,CAAC;EAC3B,IAAAb,YAAM,EAACa,MAAM,CAAC,CAACZ,EAAE,CAACgB,GAAG,CAACF,cAAc,CAAC;AACvC"}
1
+ {"version":3,"file":"non-breaking-space.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/non-breaking-space.spec.js"],"sourcesContent":["import {expect} from 'chai';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './non-breaking-space';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\nimport createDebugLogger from 'debug';\n\ngenerateTests({\n callback,\n path: [__dirname, '..', 'test-fixtures', 'non-breaking-space'],\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/non-breaking-space: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\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;AAAsC;AAEtC,IAAAA,gBAAa,EAAC;EACZC,QAAQ;EACRC,IAAI,EAAE,CAACC,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE,oBAAoB,CAAC;EAC9DC,eAAe,EAAE,IAAI;EACrBC,OAAO,EAAE,KAAK;EACdC,MAAM,EAAE;IACNC,MAAM,EAAEC,eAAO,CAACC;EAClB,CAAC;EACDC,KAAK,EAAE;IACLC,MAAM,EAAE,MAAMC,oBAAoB;EACpC;AACF,CAAC,CAAC;AACF,MAAMC,KAAK,GAAG,IAAAC,cAAiB,EAAC,kEAAkE,CAAC;AAEnG,eAAeF,oBAAoB,GAAG;EACpC,MAAMG,SAAS,GAAG,MAAM,IAAAC,yBAAgB,GAAE;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,QAAQ,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,yBAAgB,GAAE;EAC1C,MAAMe,MAAM,GAAG,IAAIC,sBAAU,CAACJ,UAAU,CAAC,aAAa,CAAC,CAAC;EACxD,MAAMK,cAAc,GAAGL,UAAU,CAAC,qBAAqB,CAAC;EAExD,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"}
@@ -13,7 +13,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
13
13
  // Note that https://github.com/NatLibFi/marc-record-validators-melinda/blob/master/src/unicode-decomposition.js contains
14
14
  // similar functionalities. It's less generic and lacks diacritic removal but has it advantages as well.
15
15
 
16
- //const debug = createDebugLogger('@natlibfi/melinda-marc-record-merge-reducers/reducers/normalizeEncoding');
16
+ //const debug = createDebugLogger('@natlibfi/melinda-marc-record-merge-reducers/reducers/normalize-utf-diacritics');
17
17
 
18
18
  // See also https://github.com/NatLibFi/marc-record-validators-melinda/blob/master/src/unicode-decomposition.js .
19
19
  // It uses a list of convertable characters whilst this uses a generic stuff as well.
@@ -1 +1 @@
1
- {"version":3,"file":"normalize-utf8-diacritics.js","names":["description","validate","fix","record","res","message","valid","fields","forEach","field","fieldFixComposition","validateField","length","subfields","orig","fieldToString","normalizedField","clone","mod","push","f","tag","ind1","ind2","formatSubfields","map","sf","code","value","join","precomposeFinnishLetters","replace","fixComposition","match","nongenericNormalization","String","normalize","subfield","index"],"sources":["../src/normalize-utf8-diacritics.js"],"sourcesContent":["//import createDebugLogger from 'debug';\nimport clone from 'clone';\nimport {convert as nongenericNormalization} from './unicode-decomposition';\n\n// Note that https://github.com/NatLibFi/marc-record-validators-melinda/blob/master/src/unicode-decomposition.js contains\n// similar functionalities. It's less generic and lacks diacritic removal but has it advantages as well.\n\n//const debug = createDebugLogger('@natlibfi/melinda-marc-record-merge-reducers/reducers/normalizeEncoding');\n\n// See also https://github.com/NatLibFi/marc-record-validators-melinda/blob/master/src/unicode-decomposition.js .\n// It uses a list of convertable characters whilst this uses a generic stuff as well.\n// It handles various '.' and '©' type normalizations as well.\n// NB! This version has minor bug/feature issue regarding fixComposition()\n\n// Author(s): Nicholas Volk\nexport default function () {\n\n return {\n description: 'Generic normalization of latin UTF-8 diacritics. Precompose Finnish å, ä and ö. Decompose others.',\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 record.fields.forEach(field => {\n fieldFixComposition(field);\n //validateField(field, true, message);\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\n // Actual parsing of all fields\n /*\n if (!record.fields) {\n return false;\n }\n */\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 if (!field.subfields) {\n return;\n }\n const orig = fieldToString(field);\n\n const normalizedField = fieldFixComposition(clone(field));\n const mod = fieldToString(normalizedField);\n if (orig !== mod) { // Fail as the input is \"broken\"/\"crap\"/sumthing\n res.message.push(`'${orig}' requires normalization`); // eslint-disable-line functional/immutable-data\n return;\n }\n return;\n }\n\n function fieldToString(f) {\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\n\n// Traditionally these six are precomposed and all the rest decomposed\nfunction precomposeFinnishLetters(value = '') {\n return value.\n replace(/å/gu, 'å').\n replace(/ä/gu, 'ä').\n replace(/ö/gu, 'ö').\n replace(/Å/gu, 'Å').\n replace(/Ä/gu, 'Ä').\n replace(/Ö/gu, 'Ö');\n}\n\nfunction fixComposition(value = '') {\n // Target: Diacritics use Melinda internal notation.\n // General solution: Decompose everything and then compose 'å', 'ä', 'ö', 'Å', 'Ä' and 'Ö'.\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize\n // Bug/Feature: the generic normalize() function also normalizes non-latin encodings as well, is this ok?\n // Exception: Input contains non-Latin script letters: don't decompose (see field 880 tests):\n if (value.match(/[^\\p{Script=Latin}\\p{Script=Common}\\p{Script=Inherited}]/u)) {\n // Problem with this approach: mixed language content (eg. cyrillic + latin) won't get normalized.\n // Hack/Damage control: we might add decomposition rules for most common diacritis here (eg. ü, é...).\n // OR we could split input to words and handle them separately?\n // NB! Hack not implemented yet. The main source of problematic case would probably be greek characters\n // within texts, that are written with latin alphabet.\n //return precomposeFinnishLetters(value);\n return nongenericNormalization(value);\n }\n return precomposeFinnishLetters(String(value).normalize('NFD'));\n}\n\n\nexport function fieldFixComposition(field) {\n if (!field.subfields) {\n return field;\n }\n //const originalValue = fieldToString(field);\n //nvdebug(`fFC: '${originalValue}'`, debug);\n field.subfields.forEach((subfield, index) => {\n field.subfields[index].value = fixComposition(subfield.value); // eslint-disable-line functional/immutable-data\n });\n //const newValue = fieldToString(field);\n //if (originalValue !== newValue) { // eslint-disable-line functional/no-conditional-statement\n // debug(`FIXCOMP: '${originalValue}' => '${newValue}'`);\n //}\n return field;\n}\n\n/*\nexport function fieldRemoveDecomposedDiacritics(field) {\n // Raison d'être/motivation: \"Sirén\" and diacriticless \"Siren\" might refer to a same surname, so this normalization\n // allows us to compare authors and avoid duplicate fields.\n field.subfields.forEach((sf) => {\n sf.value = removeDecomposedDiacritics(sf.value); // eslint-disable-line functional/immutable-data\n });\n\n function removeDecomposedDiacritics(value = '') {\n // NB #1: Does nothing to precomposed letters. String.normalize('NFD') can handle them.\n // NB #2: Finnish letters 'å', 'ä', 'ö', 'Å', Ä', and 'Ö' should be handled (=precomposed) before calling this.\n // NB #3: Calling our very own fixComposition() before this function handles both #1 and #2.\n return String(value).replace(/\\p{Diacritic}/gu, '');\n }\n}\n*/\n\n"],"mappings":"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"}
1
+ {"version":3,"file":"normalize-utf8-diacritics.js","names":["description","validate","fix","record","res","message","valid","fields","forEach","field","fieldFixComposition","validateField","length","subfields","orig","fieldToString","normalizedField","clone","mod","push","f","tag","ind1","ind2","formatSubfields","map","sf","code","value","join","precomposeFinnishLetters","replace","fixComposition","match","nongenericNormalization","String","normalize","subfield","index"],"sources":["../src/normalize-utf8-diacritics.js"],"sourcesContent":["//import createDebugLogger from 'debug';\nimport clone from 'clone';\nimport {convert as nongenericNormalization} from './unicode-decomposition';\n\n// Note that https://github.com/NatLibFi/marc-record-validators-melinda/blob/master/src/unicode-decomposition.js contains\n// similar functionalities. It's less generic and lacks diacritic removal but has it advantages as well.\n\n//const debug = createDebugLogger('@natlibfi/melinda-marc-record-merge-reducers/reducers/normalize-utf-diacritics');\n\n// See also https://github.com/NatLibFi/marc-record-validators-melinda/blob/master/src/unicode-decomposition.js .\n// It uses a list of convertable characters whilst this uses a generic stuff as well.\n// It handles various '.' and '©' type normalizations as well.\n// NB! This version has minor bug/feature issue regarding fixComposition()\n\n// Author(s): Nicholas Volk\nexport default function () {\n\n return {\n description: 'Generic normalization of latin UTF-8 diacritics. Precompose Finnish å, ä and ö. Decompose others.',\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 record.fields.forEach(field => {\n fieldFixComposition(field);\n //validateField(field, true, message);\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\n // Actual parsing of all fields\n /*\n if (!record.fields) {\n return false;\n }\n */\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 if (!field.subfields) {\n return;\n }\n const orig = fieldToString(field);\n\n const normalizedField = fieldFixComposition(clone(field));\n const mod = fieldToString(normalizedField);\n if (orig !== mod) { // Fail as the input is \"broken\"/\"crap\"/sumthing\n res.message.push(`'${orig}' requires normalization`); // eslint-disable-line functional/immutable-data\n return;\n }\n return;\n }\n\n function fieldToString(f) {\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\n\n// Traditionally these six are precomposed and all the rest decomposed\nfunction precomposeFinnishLetters(value = '') {\n return value.\n replace(/å/gu, 'å').\n replace(/ä/gu, 'ä').\n replace(/ö/gu, 'ö').\n replace(/Å/gu, 'Å').\n replace(/Ä/gu, 'Ä').\n replace(/Ö/gu, 'Ö');\n}\n\nfunction fixComposition(value = '') {\n // Target: Diacritics use Melinda internal notation.\n // General solution: Decompose everything and then compose 'å', 'ä', 'ö', 'Å', 'Ä' and 'Ö'.\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize\n // Bug/Feature: the generic normalize() function also normalizes non-latin encodings as well, is this ok?\n // Exception: Input contains non-Latin script letters: don't decompose (see field 880 tests):\n if (value.match(/[^\\p{Script=Latin}\\p{Script=Common}\\p{Script=Inherited}]/u)) {\n // Problem with this approach: mixed language content (eg. cyrillic + latin) won't get normalized.\n // Hack/Damage control: we might add decomposition rules for most common diacritis here (eg. ü, é...).\n // OR we could split input to words and handle them separately?\n // NB! Hack not implemented yet. The main source of problematic case would probably be greek characters\n // within texts, that are written with latin alphabet.\n //return precomposeFinnishLetters(value);\n return nongenericNormalization(value);\n }\n return precomposeFinnishLetters(String(value).normalize('NFD'));\n}\n\n\nexport function fieldFixComposition(field) {\n if (!field.subfields) {\n return field;\n }\n //const originalValue = fieldToString(field);\n //nvdebug(`fFC: '${originalValue}'`, debug);\n field.subfields.forEach((subfield, index) => {\n field.subfields[index].value = fixComposition(subfield.value); // eslint-disable-line functional/immutable-data\n });\n //const newValue = fieldToString(field);\n //if (originalValue !== newValue) { // eslint-disable-line functional/no-conditional-statement\n // debug(`FIXCOMP: '${originalValue}' => '${newValue}'`);\n //}\n return field;\n}\n\n/*\nexport function fieldRemoveDecomposedDiacritics(field) {\n // Raison d'être/motivation: \"Sirén\" and diacriticless \"Siren\" might refer to a same surname, so this normalization\n // allows us to compare authors and avoid duplicate fields.\n field.subfields.forEach((sf) => {\n sf.value = removeDecomposedDiacritics(sf.value); // eslint-disable-line functional/immutable-data\n });\n\n function removeDecomposedDiacritics(value = '') {\n // NB #1: Does nothing to precomposed letters. String.normalize('NFD') can handle them.\n // NB #2: Finnish letters 'å', 'ä', 'ö', 'Å', Ä', and 'Ö' should be handled (=precomposed) before calling this.\n // NB #3: Calling our very own fixComposition() before this function handles both #1 and #2.\n return String(value).replace(/\\p{Diacritic}/gu, '');\n }\n}\n*/\n\n"],"mappings":";;;;;;;AACA;AACA;AAA2E;AAF3E;;AAIA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACe,oBAAY;EAEzB,OAAO;IACLA,WAAW,EAAE,mGAAmG;IAChHC,QAAQ;IAAEC;EACZ,CAAC;EAED,SAASA,GAAG,CAACC,MAAM,EAAE;IACnB,MAAMC,GAAG,GAAG;MAACC,OAAO,EAAE,EAAE;MAAEH,GAAG,EAAE,EAAE;MAAEI,KAAK,EAAE;IAAI,CAAC;IAC/C;;IAEA;IACA;AACJ;AACA;AACA;AACA;;IAEIH,MAAM,CAACI,MAAM,CAACC,OAAO,CAACC,KAAK,IAAI;MAC7BC,mBAAmB,CAACD,KAAK,CAAC;MAC1B;IACF,CAAC,CAAC;;IAEF;IACA,OAAOL,GAAG;EACZ;EAEA,SAASH,QAAQ,CAACE,MAAM,EAAE;IACxB,MAAMC,GAAG,GAAG;MAACC,OAAO,EAAE;IAAE,CAAC;;IAEzB;IACA;AACJ;AACA;AACA;AACA;;IAEIF,MAAM,CAACI,MAAM,CAACC,OAAO,CAACC,KAAK,IAAI;MAC7BE,aAAa,CAACF,KAAK,EAAEL,GAAG,CAAC;IAC3B,CAAC,CAAC;IAEFA,GAAG,CAACE,KAAK,GAAG,EAAEF,GAAG,CAACC,OAAO,CAACO,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC;IACxC,OAAOR,GAAG;EACZ;EAEA,SAASO,aAAa,CAACF,KAAK,EAAEL,GAAG,EAAE;IACjC,IAAI,CAACK,KAAK,CAACI,SAAS,EAAE;MACpB;IACF;IACA,MAAMC,IAAI,GAAGC,aAAa,CAACN,KAAK,CAAC;IAEjC,MAAMO,eAAe,GAAGN,mBAAmB,CAAC,IAAAO,cAAK,EAACR,KAAK,CAAC,CAAC;IACzD,MAAMS,GAAG,GAAGH,aAAa,CAACC,eAAe,CAAC;IAC1C,IAAIF,IAAI,KAAKI,GAAG,EAAE;MAAE;MAClBd,GAAG,CAACC,OAAO,CAACc,IAAI,CAAE,IAAGL,IAAK,0BAAyB,CAAC,CAAC,CAAC;MACtD;IACF;IACA;EACF;EAEA,SAASC,aAAa,CAACK,CAAC,EAAE;IACxB,OAAQ,GAAEA,CAAC,CAACC,GAAI,IAAGD,CAAC,CAACE,IAAK,GAAEF,CAAC,CAACG,IAAK,KAAIC,eAAe,CAACJ,CAAC,CAAE,EAAC;IAE3D,SAASI,eAAe,CAACf,KAAK,EAAE;MAC9B;MACA,OAAOA,KAAK,CAACI,SAAS,CAACY,GAAG,CAACC,EAAE,IAAK,GAAEA,EAAE,CAACC,IAAK,GAAED,EAAE,CAACE,KAAM,EAAC,CAAC,CAACC,IAAI,CAAC,GAAG,CAAC;IACrE;EACF;AACF;;AAGA;AACA,SAASC,wBAAwB,CAACF,KAAK,GAAG,EAAE,EAAE;EAC5C,OAAOA,KAAK,CACVG,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CACpBA,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CACpBA,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CACpBA,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CACpBA,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CACpBA,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;AACxB;AAEA,SAASC,cAAc,CAACJ,KAAK,GAAG,EAAE,EAAE;EAClC;EACA;EACA;EACA;EACA;EACA,IAAIA,KAAK,CAACK,KAAK,CAAC,2DAA2D,CAAC,EAAE;IAC5E;IACA;IACA;IACA;IACA;IACA;IACA,OAAO,IAAAC,6BAAuB,EAACN,KAAK,CAAC;EACvC;EACA,OAAOE,wBAAwB,CAACK,MAAM,CAACP,KAAK,CAAC,CAACQ,SAAS,CAAC,KAAK,CAAC,CAAC;AACjE;AAGO,SAAS1B,mBAAmB,CAACD,KAAK,EAAE;EACzC,IAAI,CAACA,KAAK,CAACI,SAAS,EAAE;IACpB,OAAOJ,KAAK;EACd;EACA;EACA;EACAA,KAAK,CAACI,SAAS,CAACL,OAAO,CAAC,CAAC6B,QAAQ,EAAEC,KAAK,KAAK;IAC3C7B,KAAK,CAACI,SAAS,CAACyB,KAAK,CAAC,CAACV,KAAK,GAAGI,cAAc,CAACK,QAAQ,CAACT,KAAK,CAAC,CAAC,CAAC;EACjE,CAAC,CAAC;EACF;EACA;EACA;EACA;EACA,OAAOnB,KAAK;AACd;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA"}