@natlibfi/marc-record-validators-melinda 11.6.5 → 11.6.7-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (223) hide show
  1. package/.github/workflows/melinda-node-tests.yml +1 -1
  2. package/dist/access-rights.js +1 -5
  3. package/dist/access-rights.js.map +1 -1
  4. package/dist/addMissingField336.js +1 -1
  5. package/dist/addMissingField336.js.map +1 -1
  6. package/dist/cyrillux-usemarcon-replacement.js +41 -45
  7. package/dist/cyrillux-usemarcon-replacement.js.map +1 -1
  8. package/dist/cyrillux.js +13 -17
  9. package/dist/cyrillux.js.map +1 -1
  10. package/dist/disambiguateSeriesStatements.js +3 -4
  11. package/dist/disambiguateSeriesStatements.js.map +1 -1
  12. package/dist/double-commas.js +2 -1
  13. package/dist/double-commas.js.map +1 -1
  14. package/dist/duplicates-ind1.js +1 -1
  15. package/dist/duplicates-ind1.js.map +1 -1
  16. package/dist/empty-fields.js +0 -4
  17. package/dist/empty-fields.js.map +1 -1
  18. package/dist/ending-punctuation.js +21 -49
  19. package/dist/ending-punctuation.js.map +1 -1
  20. package/dist/ending-whitespace.js +0 -4
  21. package/dist/ending-whitespace.js.map +1 -1
  22. package/dist/field-008-18-34-character-groups.js +4 -5
  23. package/dist/field-008-18-34-character-groups.js.map +1 -1
  24. package/dist/field-505-separators.js +8 -6
  25. package/dist/field-505-separators.js.map +1 -1
  26. package/dist/field-521-fix.js +5 -6
  27. package/dist/field-521-fix.js.map +1 -1
  28. package/dist/field-exclusion.js +5 -12
  29. package/dist/field-exclusion.js.map +1 -1
  30. package/dist/field-exclusion.spec.js +3 -5
  31. package/dist/field-exclusion.spec.js.map +1 -1
  32. package/dist/field-structure.js +2 -5
  33. package/dist/field-structure.js.map +1 -1
  34. package/dist/fields-present.js +1 -1
  35. package/dist/fields-present.js.map +1 -1
  36. package/dist/fields-present.spec.js +1 -1
  37. package/dist/fields-present.spec.js.map +1 -1
  38. package/dist/fix-33X.js +5 -6
  39. package/dist/fix-33X.js.map +1 -1
  40. package/dist/fix-country-codes.js +3 -4
  41. package/dist/fix-country-codes.js.map +1 -1
  42. package/dist/fix-language-codes.js +12 -9
  43. package/dist/fix-language-codes.js.map +1 -1
  44. package/dist/fixRelatorTerms.js +8 -8
  45. package/dist/fixRelatorTerms.js.map +1 -1
  46. package/dist/fixed-fields.js +1 -4
  47. package/dist/fixed-fields.js.map +1 -1
  48. package/dist/identical-fields.js +2 -3
  49. package/dist/identical-fields.js.map +1 -1
  50. package/dist/indicator-fixes.js +14 -15
  51. package/dist/indicator-fixes.js.map +1 -1
  52. package/dist/isbn-issn.js +8 -11
  53. package/dist/isbn-issn.js.map +1 -1
  54. package/dist/item-language.js +5 -12
  55. package/dist/item-language.js.map +1 -1
  56. package/dist/merge-fields/counterpartField.js +6 -8
  57. package/dist/merge-fields/counterpartField.js.map +1 -1
  58. package/dist/merge-fields/index.js +3 -3
  59. package/dist/merge-fields/index.js.map +1 -1
  60. package/dist/merge-fields/mergeConstraints.js +0 -1
  61. package/dist/merge-fields/mergeConstraints.js.map +1 -1
  62. package/dist/merge-fields/mergeField.js +12 -18
  63. package/dist/merge-fields/mergeField.js.map +1 -1
  64. package/dist/merge-fields/mergeIndicator.js +5 -5
  65. package/dist/merge-fields/mergeIndicator.js.map +1 -1
  66. package/dist/merge-fields/mergeOrAddPostprocess.js +6 -9
  67. package/dist/merge-fields/mergeOrAddPostprocess.js.map +1 -1
  68. package/dist/merge-fields/mergeOrAddSubfield.js +6 -8
  69. package/dist/merge-fields/mergeOrAddSubfield.js.map +1 -1
  70. package/dist/merge-fields/mergeSubfield.js +8 -8
  71. package/dist/merge-fields/mergeSubfield.js.map +1 -1
  72. package/dist/merge-fields/removeDuplicateSubfields.js +1 -2
  73. package/dist/merge-fields/removeDuplicateSubfields.js.map +1 -1
  74. package/dist/merge-fields/worldKnowledge.js +1 -1
  75. package/dist/merge-fields/worldKnowledge.js.map +1 -1
  76. package/dist/mergeField500Lisapainokset.js +0 -3
  77. package/dist/mergeField500Lisapainokset.js.map +1 -1
  78. package/dist/mergeRelatorTermFields.js +3 -3
  79. package/dist/mergeRelatorTermFields.js.map +1 -1
  80. package/dist/modernize-502.js +6 -6
  81. package/dist/modernize-502.js.map +1 -1
  82. package/dist/multiple-subfield-0.js +4 -4
  83. package/dist/multiple-subfield-0.js.map +1 -1
  84. package/dist/non-breaking-space.js +0 -4
  85. package/dist/non-breaking-space.js.map +1 -1
  86. package/dist/normalize-dashes.js +5 -4
  87. package/dist/normalize-dashes.js.map +1 -1
  88. package/dist/normalize-identifiers.js +6 -6
  89. package/dist/normalize-identifiers.js.map +1 -1
  90. package/dist/normalize-qualifying-information.js +4 -4
  91. package/dist/normalize-qualifying-information.js.map +1 -1
  92. package/dist/normalize-utf8-diacritics.js +7 -7
  93. package/dist/normalize-utf8-diacritics.js.map +1 -1
  94. package/dist/normalizeFieldForComparison.js +21 -20
  95. package/dist/normalizeFieldForComparison.js.map +1 -1
  96. package/dist/normalizeSubfieldValueForComparison.js +1 -2
  97. package/dist/normalizeSubfieldValueForComparison.js.map +1 -1
  98. package/dist/prepublicationUtils.js +3 -3
  99. package/dist/prepublicationUtils.js.map +1 -1
  100. package/dist/punctuation/index.js +14 -31
  101. package/dist/punctuation/index.js.map +1 -1
  102. package/dist/punctuation2.js +9 -10
  103. package/dist/punctuation2.js.map +1 -1
  104. package/dist/reindexSubfield6OccurenceNumbers.js +8 -9
  105. package/dist/reindexSubfield6OccurenceNumbers.js.map +1 -1
  106. package/dist/removeDuplicateDataFields.js +18 -20
  107. package/dist/removeDuplicateDataFields.js.map +1 -1
  108. package/dist/removeInferiorDataFields.js +16 -19
  109. package/dist/removeInferiorDataFields.js.map +1 -1
  110. package/dist/resolvable-ext-references-melinda.js +4 -8
  111. package/dist/resolvable-ext-references-melinda.js.map +1 -1
  112. package/dist/resolveOrphanedSubfield6s.js +9 -9
  113. package/dist/resolveOrphanedSubfield6s.js.map +1 -1
  114. package/dist/sanitize-vocabulary-source-codes.js +9 -9
  115. package/dist/sanitize-vocabulary-source-codes.js.map +1 -1
  116. package/dist/sort-tags.js +2 -2
  117. package/dist/sort-tags.js.map +1 -1
  118. package/dist/sortFields.js +4 -9
  119. package/dist/sortFields.js.map +1 -1
  120. package/dist/sortRelatorTerms.js +4 -5
  121. package/dist/sortRelatorTerms.js.map +1 -1
  122. package/dist/sortSubfields.js +6 -7
  123. package/dist/sortSubfields.js.map +1 -1
  124. package/dist/stripPunctuation.js +2 -2
  125. package/dist/stripPunctuation.js.map +1 -1
  126. package/dist/subfield-exclusion.js +4 -11
  127. package/dist/subfield-exclusion.js.map +1 -1
  128. package/dist/subfield6Utils.js +12 -11
  129. package/dist/subfield6Utils.js.map +1 -1
  130. package/dist/subfield8Utils.js +8 -9
  131. package/dist/subfield8Utils.js.map +1 -1
  132. package/dist/subfieldValueNormalizations.js +5 -8
  133. package/dist/subfieldValueNormalizations.js.map +1 -1
  134. package/dist/sync-007-and-300.js +8 -8
  135. package/dist/sync-007-and-300.js.map +1 -1
  136. package/dist/translate-terms.js +5 -6
  137. package/dist/translate-terms.js.map +1 -1
  138. package/dist/typeOfDate-008.js +3 -4
  139. package/dist/typeOfDate-008.js.map +1 -1
  140. package/dist/unicode-decomposition.js +1 -1
  141. package/dist/unicode-decomposition.js.map +1 -1
  142. package/dist/update-field-540.js +5 -6
  143. package/dist/update-field-540.js.map +1 -1
  144. package/dist/urn.js +4 -9
  145. package/dist/urn.js.map +1 -1
  146. package/dist/utils.js +5 -9
  147. package/dist/utils.js.map +1 -1
  148. package/eslint.config.mjs +53 -0
  149. package/package.json +12 -13
  150. package/src/access-rights.js +4 -4
  151. package/src/addMissingField336.js +1 -1
  152. package/src/cyrillux-usemarcon-replacement.js +38 -38
  153. package/src/cyrillux.js +14 -14
  154. package/src/disambiguateSeriesStatements.js +3 -3
  155. package/src/double-commas.js +2 -2
  156. package/src/duplicates-ind1.js +1 -1
  157. package/src/empty-fields.js +4 -4
  158. package/src/ending-punctuation.js +46 -49
  159. package/src/ending-whitespace.js +0 -2
  160. package/src/field-008-18-34-character-groups.js +5 -5
  161. package/src/field-505-separators.js +6 -6
  162. package/src/field-521-fix.js +6 -6
  163. package/src/field-exclusion.js +12 -12
  164. package/src/field-exclusion.spec.js +4 -4
  165. package/src/field-structure.js +5 -5
  166. package/src/fields-present.js +1 -1
  167. package/src/fields-present.spec.js +1 -1
  168. package/src/fix-33X.js +5 -5
  169. package/src/fix-country-codes.js +3 -3
  170. package/src/fix-language-codes.js +10 -9
  171. package/src/fixRelatorTerms.js +8 -8
  172. package/src/fixed-fields.js +3 -3
  173. package/src/identical-fields.js +3 -3
  174. package/src/indicator-fixes.js +15 -15
  175. package/src/isbn-issn.js +11 -11
  176. package/src/item-language.js +10 -10
  177. package/src/merge-fields/counterpartField.js +7 -7
  178. package/src/merge-fields/index.js +3 -3
  179. package/src/merge-fields/mergeConstraints.js +1 -1
  180. package/src/merge-fields/mergeField.js +16 -17
  181. package/src/merge-fields/mergeIndicator.js +5 -5
  182. package/src/merge-fields/mergeOrAddPostprocess.js +9 -9
  183. package/src/merge-fields/mergeOrAddSubfield.js +6 -6
  184. package/src/merge-fields/mergeSubfield.js +8 -8
  185. package/src/merge-fields/removeDuplicateSubfields.js +1 -2
  186. package/src/merge-fields/worldKnowledge.js +1 -1
  187. package/src/mergeField500Lisapainokset.js +0 -2
  188. package/src/mergeRelatorTermFields.js +3 -3
  189. package/src/modernize-502.js +6 -6
  190. package/src/multiple-subfield-0.js +4 -4
  191. package/src/non-breaking-space.js +0 -2
  192. package/src/normalize-dashes.js +4 -4
  193. package/src/normalize-identifiers.js +6 -6
  194. package/src/normalize-qualifying-information.js +4 -4
  195. package/src/normalize-utf8-diacritics.js +7 -7
  196. package/src/normalizeFieldForComparison.js +20 -20
  197. package/src/normalizeSubfieldValueForComparison.js +1 -1
  198. package/src/prepublicationUtils.js +3 -3
  199. package/src/punctuation/index.js +29 -29
  200. package/src/punctuation2.js +10 -10
  201. package/src/reindexSubfield6OccurenceNumbers.js +9 -9
  202. package/src/removeDuplicateDataFields.js +21 -23
  203. package/src/removeInferiorDataFields.js +19 -19
  204. package/src/resolvable-ext-references-melinda.js +8 -8
  205. package/src/resolveOrphanedSubfield6s.js +9 -9
  206. package/src/sanitize-vocabulary-source-codes.js +8 -8
  207. package/src/sort-tags.js +2 -2
  208. package/src/sortFields.js +6 -6
  209. package/src/sortRelatorTerms.js +5 -5
  210. package/src/sortSubfields.js +7 -7
  211. package/src/stripPunctuation.js +2 -2
  212. package/src/subfield-exclusion.js +11 -11
  213. package/src/subfield6Utils.js +11 -11
  214. package/src/subfield8Utils.js +6 -9
  215. package/src/subfieldValueNormalizations.js +5 -7
  216. package/src/sync-007-and-300.js +8 -8
  217. package/src/translate-terms.js +3 -5
  218. package/src/typeOfDate-008.js +3 -3
  219. package/src/unicode-decomposition.js +1 -1
  220. package/src/update-field-540.js +6 -6
  221. package/src/urn.js +8 -6
  222. package/src/utils.js +8 -8
  223. package/.eslintignore +0 -1
@@ -36,8 +36,6 @@ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e
36
36
  *
37
37
  */
38
38
 
39
- /* eslint-disable complexity, max-params */
40
-
41
39
  // Import {validPuncMarks, finnishTerms, confSpec} from './ending-punctuation-conf.js';
42
40
 
43
41
  const debug = (0, _debug.default)('@natlibfi/marc-record-validator-melinda/ending-punctuation');
@@ -55,8 +53,7 @@ function _default() {
55
53
  message: []
56
54
  };
57
55
  if (fix) {
58
- // eslint-disable-line functional/no-conditional-statements
59
- message.fix = []; // eslint-disable-line functional/immutable-data
56
+ message.fix = [];
60
57
  }
61
58
 
62
59
  // Actual parsing of all fields
@@ -66,7 +63,7 @@ function _default() {
66
63
  record.fields.forEach(field => {
67
64
  validateField(field, false, fix, message);
68
65
  });
69
- message.valid = !(message.message.length >= 1); // eslint-disable-line functional/immutable-data
66
+ message.valid = !(message.message.length >= 1);
70
67
  return message;
71
68
  }
72
69
  }
@@ -88,57 +85,50 @@ function validateField(field, linkedTag, fix, message) {
88
85
  // Last char should be punc, but its not one of marks nor dot
89
86
  if (punc && !(lastPuncMark || lastPuncDot)) {
90
87
  // Console.log("1. Invalid punctuation - missing")
91
- message.message.push(`Field ${tag} has invalid ending punctuation`); // eslint-disable-line functional/immutable-data
88
+ message.message.push(`Field ${tag} has invalid ending punctuation`);
92
89
  if (fix) {
93
- // eslint-disable-line functional/no-conditional-statements
94
- subfield.value = subfield.value.concat('.'); // eslint-disable-line functional/immutable-data
95
- message.fix.push(`Field ${tag} - Added punctuation to $${subfield.code}`); // eslint-disable-line functional/immutable-data
90
+ subfield.value = subfield.value.concat('.');
91
+ message.fix.push(`Field ${tag} - Added punctuation to $${subfield.code}`);
96
92
  }
97
93
 
98
94
  // Last char is dot, but previous char is one of punc marks, like 'Question?.'
99
95
  } else if (lastPuncDot && subfield.value.length > 1 && puncMarks.includes(subfield.value.charAt(subfield.value.length - 2))) {
100
96
  // Console.log("2. Invalid punctuation - duplicate, like '?.'")
101
- message.message.push(`Field ${tag} has invalid ending punctuation`); // eslint-disable-line functional/immutable-data
97
+ message.message.push(`Field ${tag} has invalid ending punctuation`);
102
98
  if (fix) {
103
- // eslint-disable-line functional/no-conditional-statements
104
- subfield.value = subfield.value.slice(0, -1); // eslint-disable-line functional/immutable-data
105
- message.fix.push(`Field ${tag} - Removed double punctuation from $${subfield.code}`); // eslint-disable-line functional/immutable-data
99
+ subfield.value = subfield.value.slice(0, -1);
100
+ message.fix.push(`Field ${tag} - Removed double punctuation from $${subfield.code}`);
106
101
  }
107
102
 
108
103
  // Last char shouldn't be dot !! This is behind checkEnd boolean, because of dots at end of abbreviations, so this is checked only in special cases !!//
109
104
  } else if (checkEnd && !punc && lastPuncDot) {
110
105
  // Console.log("3. Invalid punctuation - Shouldn't be dot, is")
111
- message.message.push(`Field ${tag} has invalid ending punctuation`); // eslint-disable-line functional/immutable-data
106
+ message.message.push(`Field ${tag} has invalid ending punctuation`);
112
107
  if (fix) {
113
- // eslint-disable-line functional/no-conditional-statements
114
- subfield.value = subfield.value.slice(0, -1); // eslint-disable-line functional/immutable-data
115
- message.fix.push(`Field ${tag} - Removed punctuation from $${subfield.code}`); // eslint-disable-line functional/immutable-data
108
+ subfield.value = subfield.value.slice(0, -1);
109
+ message.fix.push(`Field ${tag} - Removed punctuation from $${subfield.code}`);
116
110
  }
117
111
  }
118
112
  }
119
113
 
120
114
  // Special cases from here on
121
115
  function specialCases(res, field, tag) {
122
- let lastSubField = null; // eslint-disable-line functional/no-let
116
+ let lastSubField = null;
123
117
  // Punctuation should be only after specific field
124
118
  if (res.special.afterOnly) {
125
119
  lastSubField = findLastSubfield(field);
126
120
  if (lastSubField) {
127
121
  if (typeof res.special.strict === 'undefined') {
128
- // eslint-disable-line functional/no-conditional-statements
129
- res.special.strict = true; // eslint-disable-line functional/immutable-data
122
+ res.special.strict = true;
130
123
  }
131
124
  if (lastSubField.code === res.special.afterOnly) {
132
- // eslint-disable-line functional/no-conditional-statements
133
125
  normalPuncRules(lastSubField, res.punc, tag, res.special.strict, false);
134
126
  } else {
135
- // eslint-disable-line functional/no-conditional-statements
136
127
  normalPuncRules(lastSubField, !res.punc, tag, true, false);
137
128
  }
138
129
  }
139
130
  } else if (res.special.noPuncIfField) {
140
131
  if (field.subfields.some(subField => subField.code === res.special.noPuncIfField) === false) {
141
- // eslint-disable-line functional/no-conditional-statements
142
132
  lastSubField = findLastSubfield(field);
143
133
  normalPuncRules(lastSubField, res.punc, tag, true, false);
144
134
  }
@@ -147,30 +137,24 @@ function validateField(field, linkedTag, fix, message) {
147
137
  if (lastSubField && lastSubField.code === res.special.puncSubField) {
148
138
  // Ind2 match, check second if at punc rules with special punc char override
149
139
  if (res.special.ifInd2 && res.special.ifInd2.includes(field.ind2)) {
150
- // eslint-disable-line functional/no-conditional-statements
151
140
  normalPuncRules(lastSubField, res.special.ifBoth, tag, true, res.special.ifLastCharNot);
152
141
 
153
142
  // Matches execption to special rule, noPuncIfInd2 (likely with value 4, that indicates copyright mark)
154
143
  } else if (res.special.noPuncIfInd2 && field.ind2 && res.special.noPuncIfInd2.includes(field.ind2)) {
155
- // eslint-disable-line functional/no-conditional-statements
156
144
  normalPuncRules(lastSubField, !res.special.ifBoth, tag, true, res.special.ifLastCharNot);
157
145
 
158
146
  // Does not match rules -> shouldn't have punc
159
147
  } else {
160
- // eslint-disable-line functional/no-conditional-statements
161
148
  normalPuncRules(lastSubField, !res.special.ifBoth, tag, true, res.special.ifLastCharNot);
162
149
  }
163
150
  }
164
151
  } else if (res.special.secondLastIfLast) {
165
- // eslint-disable-line functional/no-conditional-statements
166
152
  field.subfields.forEach(subField => {
167
153
  if (isNaN(subField.code) && res.special.secondLastIfLast !== subField.code) {
168
- // eslint-disable-line functional/no-conditional-statements
169
154
  lastSubField = subField;
170
155
  } // Not control field
171
156
 
172
157
  if (typeof res.special.last !== 'undefined' && res.special.secondLastIfLast === subField.code) {
173
- // eslint-disable-line functional/no-conditional-statements
174
158
  normalPuncRules(subField, res.special.last, tag, true, false);
175
159
  } // Strict because this field should not be abbreviation
176
160
  });
@@ -184,11 +168,9 @@ function validateField(field, linkedTag, fix, message) {
184
168
  code
185
169
  }) => code === res.special.termField);
186
170
  if (languageField && languageField.value && _endingPunctuationConf.finnishTerms.some(p => p.test(languageField.value))) {
187
- // eslint-disable-line functional/no-conditional-statements
188
171
  // If (languageField && languageField.value && finnishTerms.indexOf(languageField.value) > -1) {
189
172
  normalPuncRules(lastSubField, res.punc, tag, true, false);
190
173
  } else {
191
- // eslint-disable-line functional/no-conditional-statements
192
174
  normalPuncRules(lastSubField, res.special.else, tag, false, false); // Strict because of years etc (648, 650)
193
175
  }
194
176
  }
@@ -197,24 +179,20 @@ function validateField(field, linkedTag, fix, message) {
197
179
  lastSubField = null;
198
180
  field.subfields.filter(subField => 'value' in subField).forEach(subField => {
199
181
  if (isNaN(subField.code) && res.special.lastOf.indexOf(subField.code) > -1) {
200
- // eslint-disable-line functional/no-conditional-statements
201
182
  lastSubField = subField;
202
183
  } // Not control field
203
184
 
204
185
  if (res.special.mandatory && res.special.mandatory.indexOf(subField.code) > -1) {
205
- // eslint-disable-line functional/no-conditional-statements
206
186
  normalPuncRules(subField, res.punc, tag, true, false);
207
187
  } // Strict because of mandatory
208
188
  });
209
189
  if (lastSubField) {
210
- // eslint-disable-line functional/no-conditional-statements
211
190
  normalPuncRules(lastSubField, res.punc, tag, false, false);
212
191
  }
213
192
 
214
193
  // If field has linked rules (tag: 880), find rules and re-validate
215
194
  } else if (res.special.linked) {
216
- // eslint-disable-line functional/no-conditional-statements
217
- let linkedTag = null; // eslint-disable-line functional/no-let
195
+ let linkedTag = null;
218
196
  try {
219
197
  linkedTag = parseInt(field.subfields.find(({
220
198
  code
@@ -226,15 +204,12 @@ function validateField(field, linkedTag, fix, message) {
226
204
  validateField(field, linkedTag, fix, message);
227
205
  }
228
206
  }
229
- let res = null; // eslint-disable-line functional/no-let
230
- let tag = null; // eslint-disable-line functional/no-let
231
- let lastSubField = null; // eslint-disable-line functional/no-let
232
-
207
+ let res = null;
208
+ let tag = null;
209
+ let lastSubField = null;
233
210
  if (linkedTag) {
234
- // eslint-disable-line functional/no-conditional-statements
235
211
  tag = linkedTag;
236
212
  } else {
237
- // eslint-disable-line functional/no-conditional-statements
238
213
  try {
239
214
  tag = parseInt(field.tag, 10);
240
215
  } catch (err) {
@@ -254,7 +229,7 @@ function validateField(field, linkedTag, fix, message) {
254
229
 
255
230
  // Field does not have subfields; invalid
256
231
  if (typeof field.subfields === 'undefined' || field.subfields === null) {
257
- message.message.push(`Field ${field.tag} has invalid ending punctuation`); // eslint-disable-line functional/immutable-data
232
+ message.message.push(`Field ${field.tag} has invalid ending punctuation`);
258
233
  return;
259
234
  }
260
235
 
@@ -262,11 +237,9 @@ function validateField(field, linkedTag, fix, message) {
262
237
  if (typeof res.special === 'undefined' || res.special === null) {
263
238
  lastSubField = findLastSubfield(field);
264
239
  if (lastSubField) {
265
- // eslint-disable-line functional/no-conditional-statements
266
240
  normalPuncRules(lastSubField, res.punc, field.tag, false, false, fix, message);
267
241
  }
268
242
  } else {
269
- // eslint-disable-line functional/no-conditional-statements
270
243
  try {
271
244
  specialCases(res, field, field.tag);
272
245
  } catch (e) {
@@ -276,13 +249,12 @@ function validateField(field, linkedTag, fix, message) {
276
249
  }
277
250
  function validateSingleField(field, linkedTag, fix) {
278
251
  const message = {};
279
- message.message = []; // eslint-disable-line functional/immutable-data
252
+ message.message = [];
280
253
  if (fix) {
281
- // eslint-disable-line functional/no-conditional-statements
282
- message.fix = []; // eslint-disable-line functional/immutable-data
254
+ message.fix = [];
283
255
  }
284
256
  validateField(field, linkedTag, fix, message);
285
- message.valid = !(message.message.length >= 1); // eslint-disable-line functional/immutable-data
257
+ message.valid = !(message.message.length >= 1);
286
258
  return message;
287
259
  }
288
260
  //# sourceMappingURL=ending-punctuation.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ending-punctuation.js","names":["_endingPunctuationConf","require","_debug","_interopRequireDefault","e","__esModule","default","debug","createDebugLogger","_default","description","validate","record","validatePunc","fix","message","fields","forEach","field","validateField","valid","length","linkedTag","findLastSubfield","subfields","filter","sf","isNaN","code","slice","shift","normalPuncRules","subfield","punc","tag","checkEnd","overrideValidPuncMarks","puncMarks","validPuncMarks","lastPuncMark","includes","value","lastPuncDot","push","concat","charAt","specialCases","res","lastSubField","special","afterOnly","strict","noPuncIfField","some","subField","ifBoth","puncSubField","ifInd2","ind2","ifLastCharNot","noPuncIfInd2","secondLastIfLast","last","termField","languageField","find","finnishTerms","p","test","else","lastOf","indexOf","mandatory","linked","parseInt","substr","err","Error","stack","Object","values","confSpec","o","rangeFine","rangeStart","rangeEnd","index","console","error","validateSingleField"],"sources":["../src/ending-punctuation.js"],"sourcesContent":["/**\n*\n* @licstart The following is the entire license notice for the JavaScript code in this file.\n*\n* MARC record validators used in Melinda\n*\n* Copyright (c) 2014-2021 University Of Helsinki (The National Library Of Finland)\n*\n* This file is part of marc-record-validators-melinda\n*\n* marc-record-validators-melinda program is free software: you can redistribute it and/or modify\n* it under the terms of the GNU Lesser General Public License as\n* published by the Free Software Foundation, either version 3 of the\n* License, or (at your option) any later version.\n*\n* marc-record-validators-melinda is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n* GNU Lesser General Public License for more details.\n*\n* You should have received a copy of the GNU Lesser General Public License\n* along with this program. If not, see <http://www.gnu.org/licenses/>.\n*\n* @licend The above is the entire license notice\n* for the JavaScript code in this file.\n*\n*/\n\n/* eslint-disable complexity, max-params */\n\n\n// Import {validPuncMarks, finnishTerms, confSpec} from './ending-punctuation-conf.js';\nimport {validPuncMarks, finnishTerms, confSpec} from './ending-punctuation-conf';\nimport createDebugLogger from 'debug';\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validator-melinda/ending-punctuation');\n\nexport default function () {\n return {\n description:\n 'Handles invalid ending punctuation',\n validate: record => validatePunc(record, false), // Record (Object), fix (boolean)\n fix: record => validatePunc(record, true) // Record (Object), fix (boolean)\n\n };\n\n // This is used to validate record against configuration\n function validatePunc(record, fix) {\n const message = {message: []};\n\n if (fix) { // eslint-disable-line functional/no-conditional-statements\n message.fix = []; // eslint-disable-line functional/immutable-data\n }\n\n // Actual parsing of all fields\n if (!record.fields) {\n return false;\n }\n\n record.fields.forEach(field => {\n validateField(field, false, fix, message);\n });\n\n message.valid = !(message.message.length >= 1); // eslint-disable-line functional/immutable-data\n return message;\n }\n}\n\n// Field validation with punctuation rules for normal and special cases in subfunction (to reduce complexity to please travisci)\nfunction validateField(field, linkedTag, fix, message) {\n // This is used to find last subfield that should have punctuation\n function findLastSubfield(field) {\n const subfields = field.subfields.filter(sf => isNaN(sf.code) && 'value' in sf);\n return subfields.slice(-1).shift();\n }\n\n // Punctuation rule (Boolean), Check no ending dot strict (Boolean)\n function normalPuncRules(subfield, punc, tag, checkEnd, overrideValidPuncMarks) {\n const puncMarks = overrideValidPuncMarks || validPuncMarks;\n const lastPuncMark = puncMarks.includes(subfield.value.slice(-1)); // If string ends to punctuation char\n const lastPuncDot = '.'.includes(subfield.value.slice(-1)); // If string ends to dot\n\n // Last char should be punc, but its not one of marks nor dot\n if (punc && !(lastPuncMark || lastPuncDot)) {\n // Console.log(\"1. Invalid punctuation - missing\")\n message.message.push(`Field ${tag} has invalid ending punctuation`); // eslint-disable-line functional/immutable-data\n if (fix) { // eslint-disable-line functional/no-conditional-statements\n subfield.value = subfield.value.concat('.'); // eslint-disable-line functional/immutable-data\n message.fix.push(`Field ${tag} - Added punctuation to $${subfield.code}`); // eslint-disable-line functional/immutable-data\n }\n\n // Last char is dot, but previous char is one of punc marks, like 'Question?.'\n } else if (lastPuncDot && subfield.value.length > 1 && puncMarks.includes(subfield.value.charAt(subfield.value.length - 2))) {\n // Console.log(\"2. Invalid punctuation - duplicate, like '?.'\")\n message.message.push(`Field ${tag} has invalid ending punctuation`); // eslint-disable-line functional/immutable-data\n if (fix) { // eslint-disable-line functional/no-conditional-statements\n subfield.value = subfield.value.slice(0, -1); // eslint-disable-line functional/immutable-data\n message.fix.push(`Field ${tag} - Removed double punctuation from $${subfield.code}`); // eslint-disable-line functional/immutable-data\n }\n\n // Last char shouldn't be dot !! This is behind checkEnd boolean, because of dots at end of abbreviations, so this is checked only in special cases !!//\n } else if (checkEnd && (!punc && lastPuncDot)) {\n // Console.log(\"3. Invalid punctuation - Shouldn't be dot, is\")\n message.message.push(`Field ${tag} has invalid ending punctuation`); // eslint-disable-line functional/immutable-data\n if (fix) { // eslint-disable-line functional/no-conditional-statements\n subfield.value = subfield.value.slice(0, -1); // eslint-disable-line functional/immutable-data\n message.fix.push(`Field ${tag} - Removed punctuation from $${subfield.code}`); // eslint-disable-line functional/immutable-data\n }\n }\n }\n\n // Special cases from here on\n function specialCases(res, field, tag) {\n let lastSubField = null; // eslint-disable-line functional/no-let\n // Punctuation should be only after specific field\n if (res.special.afterOnly) {\n lastSubField = findLastSubfield(field);\n\n if (lastSubField) {\n if (typeof res.special.strict === 'undefined') { // eslint-disable-line functional/no-conditional-statements\n res.special.strict = true; // eslint-disable-line functional/immutable-data\n }\n\n if (lastSubField.code === res.special.afterOnly) { // eslint-disable-line functional/no-conditional-statements\n normalPuncRules(lastSubField, res.punc, tag, res.special.strict, false);\n } else { // eslint-disable-line functional/no-conditional-statements\n normalPuncRules(lastSubField, !res.punc, tag, true, false);\n }\n }\n } else if (res.special.noPuncIfField) {\n if (field.subfields.some(subField => subField.code === res.special.noPuncIfField) === false) { // eslint-disable-line functional/no-conditional-statements\n lastSubField = findLastSubfield(field);\n normalPuncRules(lastSubField, res.punc, tag, true, false);\n }\n } else if (res.special.ifBoth) {\n lastSubField = findLastSubfield(field);\n if (lastSubField && lastSubField.code === res.special.puncSubField) {\n // Ind2 match, check second if at punc rules with special punc char override\n if (res.special.ifInd2 && res.special.ifInd2.includes(field.ind2)) { // eslint-disable-line functional/no-conditional-statements\n normalPuncRules(lastSubField, res.special.ifBoth, tag, true, res.special.ifLastCharNot);\n\n // Matches execption to special rule, noPuncIfInd2 (likely with value 4, that indicates copyright mark)\n } else if (res.special.noPuncIfInd2 && field.ind2 && res.special.noPuncIfInd2.includes(field.ind2)) { // eslint-disable-line functional/no-conditional-statements\n normalPuncRules(lastSubField, !res.special.ifBoth, tag, true, res.special.ifLastCharNot);\n\n // Does not match rules -> shouldn't have punc\n } else { // eslint-disable-line functional/no-conditional-statements\n normalPuncRules(lastSubField, !res.special.ifBoth, tag, true, res.special.ifLastCharNot);\n }\n }\n } else if (res.special.secondLastIfLast) { // eslint-disable-line functional/no-conditional-statements\n field.subfields.forEach(subField => {\n if (isNaN(subField.code) && res.special.secondLastIfLast !== subField.code) { // eslint-disable-line functional/no-conditional-statements\n lastSubField = subField;\n } // Not control field\n\n if (typeof res.special.last !== 'undefined' && res.special.secondLastIfLast === subField.code) { // eslint-disable-line functional/no-conditional-statements\n normalPuncRules(subField, res.special.last, tag, true, false);\n } // Strict because this field should not be abbreviation\n });\n normalPuncRules(lastSubField, res.punc, tag, false, false);\n\n // Search for Finnish terms\n } else if (res.special.termField) {\n lastSubField = findLastSubfield(field);\n\n if (lastSubField) {\n const languageField = field.subfields.find(({code}) => code === res.special.termField);\n if (languageField && languageField.value && finnishTerms.some(p => p.test(languageField.value))) { // eslint-disable-line functional/no-conditional-statements\n // If (languageField && languageField.value && finnishTerms.indexOf(languageField.value) > -1) {\n normalPuncRules(lastSubField, res.punc, tag, true, false);\n } else { // eslint-disable-line functional/no-conditional-statements\n normalPuncRules(lastSubField, res.special.else, tag, false, false); // Strict because of years etc (648, 650)\n }\n }\n // Search last of array in subfields and check if it has punc\n } else if (res.special.lastOf) {\n lastSubField = null;\n field.subfields.filter(subField => 'value' in subField).forEach(subField => {\n if (isNaN(subField.code) && res.special.lastOf.indexOf(subField.code) > -1) { // eslint-disable-line functional/no-conditional-statements\n lastSubField = subField;\n } // Not control field\n\n if (res.special.mandatory && res.special.mandatory.indexOf(subField.code) > -1) { // eslint-disable-line functional/no-conditional-statements\n normalPuncRules(subField, res.punc, tag, true, false);\n } // Strict because of mandatory\n });\n\n if (lastSubField) { // eslint-disable-line functional/no-conditional-statements\n normalPuncRules(lastSubField, res.punc, tag, false, false);\n }\n\n // If field has linked rules (tag: 880), find rules and re-validate\n } else if (res.special.linked) { // eslint-disable-line functional/no-conditional-statements\n let linkedTag = null; // eslint-disable-line functional/no-let\n try {\n linkedTag = parseInt(field.subfields.find(({code}) => code === res.special.linked).value.substr(0, 3), 10); // Substring feels stupid, but is used in MarcRecord to extract tag.\n } catch (err) {\n debug(`Got error while parsing tag: ${err instanceof Error ? err.stack : err}`);\n return false;\n }\n\n validateField(field, linkedTag, fix, message);\n }\n }\n\n let res = null; // eslint-disable-line functional/no-let\n let tag = null; // eslint-disable-line functional/no-let\n let lastSubField = null; // eslint-disable-line functional/no-let\n\n if (linkedTag) { // eslint-disable-line functional/no-conditional-statements\n tag = linkedTag;\n } else { // eslint-disable-line functional/no-conditional-statements\n try {\n tag = parseInt(field.tag, 10);\n } catch (err) {\n debug(`Got error while parsing tag: ${err instanceof Error ? err.stack : err}`);\n return false;\n }\n }\n\n // Find configuration object matching tag:\n res = Object.values(confSpec).find(o => {\n const rangeFine = o.rangeStart <= tag && o.rangeEnd >= tag;\n return o.index === tag || rangeFine;\n });\n\n if (!res) {\n return;\n } // Configuration not found, pass field without error\n\n // Field does not have subfields; invalid\n if (typeof field.subfields === 'undefined' || field.subfields === null) {\n message.message.push(`Field ${field.tag} has invalid ending punctuation`); // eslint-disable-line functional/immutable-data\n return;\n }\n\n // Normal rules\n if (typeof res.special === 'undefined' || res.special === null) {\n lastSubField = findLastSubfield(field);\n\n if (lastSubField) { // eslint-disable-line functional/no-conditional-statements\n normalPuncRules(lastSubField, res.punc, field.tag, false, false, fix, message);\n }\n } else { // eslint-disable-line functional/no-conditional-statements\n try {\n specialCases(res, field, field.tag);\n } catch (e) {\n console.error('Catched error from special case: ', e); // eslint-disable-line no-console\n }\n }\n}\n\nexport function validateSingleField(field, linkedTag, fix) {\n const message = {};\n message.message = []; // eslint-disable-line functional/immutable-data\n if (fix) { // eslint-disable-line functional/no-conditional-statements\n message.fix = []; // eslint-disable-line functional/immutable-data\n }\n\n validateField(field, linkedTag, fix, message);\n message.valid = !(message.message.length >= 1); // eslint-disable-line functional/immutable-data\n return message;\n}\n\n"],"mappings":";;;;;;;AAgCA,IAAAA,sBAAA,GAAAC,OAAA;AACA,IAAAC,MAAA,GAAAC,sBAAA,CAAAF,OAAA;AAAsC,SAAAE,uBAAAC,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAjCtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAGA;;AAIA,MAAMG,KAAK,GAAG,IAAAC,cAAiB,EAAC,4DAA4D,CAAC;AAE9E,SAAAC,SAAA,EAAY;EACzB,OAAO;IACLC,WAAW,EACT,oCAAoC;IACtCC,QAAQ,EAAEC,MAAM,IAAIC,YAAY,CAACD,MAAM,EAAE,KAAK,CAAC;IAAE;IACjDE,GAAG,EAAEF,MAAM,IAAIC,YAAY,CAACD,MAAM,EAAE,IAAI,CAAC,CAAC;EAE5C,CAAC;;EAED;EACA,SAASC,YAAYA,CAACD,MAAM,EAAEE,GAAG,EAAE;IACjC,MAAMC,OAAO,GAAG;MAACA,OAAO,EAAE;IAAE,CAAC;IAE7B,IAAID,GAAG,EAAE;MAAE;MACTC,OAAO,CAACD,GAAG,GAAG,EAAE,CAAC,CAAC;IACpB;;IAEA;IACA,IAAI,CAACF,MAAM,CAACI,MAAM,EAAE;MAClB,OAAO,KAAK;IACd;IAEAJ,MAAM,CAACI,MAAM,CAACC,OAAO,CAACC,KAAK,IAAI;MAC7BC,aAAa,CAACD,KAAK,EAAE,KAAK,EAAEJ,GAAG,EAAEC,OAAO,CAAC;IAC3C,CAAC,CAAC;IAEFA,OAAO,CAACK,KAAK,GAAG,EAAEL,OAAO,CAACA,OAAO,CAACM,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC;IAChD,OAAON,OAAO;EAChB;AACF;;AAEA;AACA,SAASI,aAAaA,CAACD,KAAK,EAAEI,SAAS,EAAER,GAAG,EAAEC,OAAO,EAAE;EACrD;EACA,SAASQ,gBAAgBA,CAACL,KAAK,EAAE;IAC/B,MAAMM,SAAS,GAAGN,KAAK,CAACM,SAAS,CAACC,MAAM,CAACC,EAAE,IAAIC,KAAK,CAACD,EAAE,CAACE,IAAI,CAAC,IAAI,OAAO,IAAIF,EAAE,CAAC;IAC/E,OAAOF,SAAS,CAACK,KAAK,CAAC,CAAC,CAAC,CAAC,CAACC,KAAK,CAAC,CAAC;EACpC;;EAEA;EACA,SAASC,eAAeA,CAACC,QAAQ,EAAEC,IAAI,EAAEC,GAAG,EAAEC,QAAQ,EAAEC,sBAAsB,EAAE;IAC9E,MAAMC,SAAS,GAAGD,sBAAsB,IAAIE,qCAAc;IAC1D,MAAMC,YAAY,GAAGF,SAAS,CAACG,QAAQ,CAACR,QAAQ,CAACS,KAAK,CAACZ,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnE,MAAMa,WAAW,GAAG,GAAG,CAACF,QAAQ,CAACR,QAAQ,CAACS,KAAK,CAACZ,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;;IAE5D;IACA,IAAII,IAAI,IAAI,EAAEM,YAAY,IAAIG,WAAW,CAAC,EAAE;MAC1C;MACA3B,OAAO,CAACA,OAAO,CAAC4B,IAAI,CAAC,SAAST,GAAG,iCAAiC,CAAC,CAAC,CAAC;MACrE,IAAIpB,GAAG,EAAE;QAAE;QACTkB,QAAQ,CAACS,KAAK,GAAGT,QAAQ,CAACS,KAAK,CAACG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7C7B,OAAO,CAACD,GAAG,CAAC6B,IAAI,CAAC,SAAST,GAAG,4BAA4BF,QAAQ,CAACJ,IAAI,EAAE,CAAC,CAAC,CAAC;MAC7E;;MAEA;IACF,CAAC,MAAM,IAAIc,WAAW,IAAIV,QAAQ,CAACS,KAAK,CAACpB,MAAM,GAAG,CAAC,IAAIgB,SAAS,CAACG,QAAQ,CAACR,QAAQ,CAACS,KAAK,CAACI,MAAM,CAACb,QAAQ,CAACS,KAAK,CAACpB,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE;MAC3H;MACAN,OAAO,CAACA,OAAO,CAAC4B,IAAI,CAAC,SAAST,GAAG,iCAAiC,CAAC,CAAC,CAAC;MACrE,IAAIpB,GAAG,EAAE;QAAE;QACTkB,QAAQ,CAACS,KAAK,GAAGT,QAAQ,CAACS,KAAK,CAACZ,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9Cd,OAAO,CAACD,GAAG,CAAC6B,IAAI,CAAC,SAAST,GAAG,uCAAuCF,QAAQ,CAACJ,IAAI,EAAE,CAAC,CAAC,CAAC;MACxF;;MAEA;IACF,CAAC,MAAM,IAAIO,QAAQ,IAAK,CAACF,IAAI,IAAIS,WAAY,EAAE;MAC7C;MACA3B,OAAO,CAACA,OAAO,CAAC4B,IAAI,CAAC,SAAST,GAAG,iCAAiC,CAAC,CAAC,CAAC;MACrE,IAAIpB,GAAG,EAAE;QAAE;QACTkB,QAAQ,CAACS,KAAK,GAAGT,QAAQ,CAACS,KAAK,CAACZ,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9Cd,OAAO,CAACD,GAAG,CAAC6B,IAAI,CAAC,SAAST,GAAG,gCAAgCF,QAAQ,CAACJ,IAAI,EAAE,CAAC,CAAC,CAAC;MACjF;IACF;EACF;;EAEA;EACA,SAASkB,YAAYA,CAACC,GAAG,EAAE7B,KAAK,EAAEgB,GAAG,EAAE;IACrC,IAAIc,YAAY,GAAG,IAAI,CAAC,CAAC;IACzB;IACA,IAAID,GAAG,CAACE,OAAO,CAACC,SAAS,EAAE;MACzBF,YAAY,GAAGzB,gBAAgB,CAACL,KAAK,CAAC;MAEtC,IAAI8B,YAAY,EAAE;QAChB,IAAI,OAAOD,GAAG,CAACE,OAAO,CAACE,MAAM,KAAK,WAAW,EAAE;UAAE;UAC/CJ,GAAG,CAACE,OAAO,CAACE,MAAM,GAAG,IAAI,CAAC,CAAC;QAC7B;QAEA,IAAIH,YAAY,CAACpB,IAAI,KAAKmB,GAAG,CAACE,OAAO,CAACC,SAAS,EAAE;UAAE;UACjDnB,eAAe,CAACiB,YAAY,EAAED,GAAG,CAACd,IAAI,EAAEC,GAAG,EAAEa,GAAG,CAACE,OAAO,CAACE,MAAM,EAAE,KAAK,CAAC;QACzE,CAAC,MAAM;UAAE;UACPpB,eAAe,CAACiB,YAAY,EAAE,CAACD,GAAG,CAACd,IAAI,EAAEC,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC;QAC5D;MACF;IACF,CAAC,MAAM,IAAIa,GAAG,CAACE,OAAO,CAACG,aAAa,EAAE;MACpC,IAAIlC,KAAK,CAACM,SAAS,CAAC6B,IAAI,CAACC,QAAQ,IAAIA,QAAQ,CAAC1B,IAAI,KAAKmB,GAAG,CAACE,OAAO,CAACG,aAAa,CAAC,KAAK,KAAK,EAAE;QAAE;QAC7FJ,YAAY,GAAGzB,gBAAgB,CAACL,KAAK,CAAC;QACtCa,eAAe,CAACiB,YAAY,EAAED,GAAG,CAACd,IAAI,EAAEC,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC;MAC3D;IACF,CAAC,MAAM,IAAIa,GAAG,CAACE,OAAO,CAACM,MAAM,EAAE;MAC7BP,YAAY,GAAGzB,gBAAgB,CAACL,KAAK,CAAC;MACtC,IAAI8B,YAAY,IAAIA,YAAY,CAACpB,IAAI,KAAKmB,GAAG,CAACE,OAAO,CAACO,YAAY,EAAE;QAClE;QACA,IAAIT,GAAG,CAACE,OAAO,CAACQ,MAAM,IAAIV,GAAG,CAACE,OAAO,CAACQ,MAAM,CAACjB,QAAQ,CAACtB,KAAK,CAACwC,IAAI,CAAC,EAAE;UAAE;UACnE3B,eAAe,CAACiB,YAAY,EAAED,GAAG,CAACE,OAAO,CAACM,MAAM,EAAErB,GAAG,EAAE,IAAI,EAAEa,GAAG,CAACE,OAAO,CAACU,aAAa,CAAC;;UAEvF;QACF,CAAC,MAAM,IAAIZ,GAAG,CAACE,OAAO,CAACW,YAAY,IAAI1C,KAAK,CAACwC,IAAI,IAAIX,GAAG,CAACE,OAAO,CAACW,YAAY,CAACpB,QAAQ,CAACtB,KAAK,CAACwC,IAAI,CAAC,EAAE;UAAE;UACpG3B,eAAe,CAACiB,YAAY,EAAE,CAACD,GAAG,CAACE,OAAO,CAACM,MAAM,EAAErB,GAAG,EAAE,IAAI,EAAEa,GAAG,CAACE,OAAO,CAACU,aAAa,CAAC;;UAExF;QACF,CAAC,MAAM;UAAE;UACP5B,eAAe,CAACiB,YAAY,EAAE,CAACD,GAAG,CAACE,OAAO,CAACM,MAAM,EAAErB,GAAG,EAAE,IAAI,EAAEa,GAAG,CAACE,OAAO,CAACU,aAAa,CAAC;QAC1F;MACF;IACF,CAAC,MAAM,IAAIZ,GAAG,CAACE,OAAO,CAACY,gBAAgB,EAAE;MAAE;MACzC3C,KAAK,CAACM,SAAS,CAACP,OAAO,CAACqC,QAAQ,IAAI;QAClC,IAAI3B,KAAK,CAAC2B,QAAQ,CAAC1B,IAAI,CAAC,IAAImB,GAAG,CAACE,OAAO,CAACY,gBAAgB,KAAKP,QAAQ,CAAC1B,IAAI,EAAE;UAAE;UAC5EoB,YAAY,GAAGM,QAAQ;QACzB,CAAC,CAAC;;QAEF,IAAI,OAAOP,GAAG,CAACE,OAAO,CAACa,IAAI,KAAK,WAAW,IAAIf,GAAG,CAACE,OAAO,CAACY,gBAAgB,KAAKP,QAAQ,CAAC1B,IAAI,EAAE;UAAE;UAC/FG,eAAe,CAACuB,QAAQ,EAAEP,GAAG,CAACE,OAAO,CAACa,IAAI,EAAE5B,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC;QAC/D,CAAC,CAAC;MACJ,CAAC,CAAC;MACFH,eAAe,CAACiB,YAAY,EAAED,GAAG,CAACd,IAAI,EAAEC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC;;MAE1D;IACF,CAAC,MAAM,IAAIa,GAAG,CAACE,OAAO,CAACc,SAAS,EAAE;MAChCf,YAAY,GAAGzB,gBAAgB,CAACL,KAAK,CAAC;MAEtC,IAAI8B,YAAY,EAAE;QAChB,MAAMgB,aAAa,GAAG9C,KAAK,CAACM,SAAS,CAACyC,IAAI,CAAC,CAAC;UAACrC;QAAI,CAAC,KAAKA,IAAI,KAAKmB,GAAG,CAACE,OAAO,CAACc,SAAS,CAAC;QACtF,IAAIC,aAAa,IAAIA,aAAa,CAACvB,KAAK,IAAIyB,mCAAY,CAACb,IAAI,CAACc,CAAC,IAAIA,CAAC,CAACC,IAAI,CAACJ,aAAa,CAACvB,KAAK,CAAC,CAAC,EAAE;UAAE;UACjG;UACAV,eAAe,CAACiB,YAAY,EAAED,GAAG,CAACd,IAAI,EAAEC,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC;QAC3D,CAAC,MAAM;UAAE;UACPH,eAAe,CAACiB,YAAY,EAAED,GAAG,CAACE,OAAO,CAACoB,IAAI,EAAEnC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;QACtE;MACF;MACA;IACF,CAAC,MAAM,IAAIa,GAAG,CAACE,OAAO,CAACqB,MAAM,EAAE;MAC7BtB,YAAY,GAAG,IAAI;MACnB9B,KAAK,CAACM,SAAS,CAACC,MAAM,CAAC6B,QAAQ,IAAI,OAAO,IAAIA,QAAQ,CAAC,CAACrC,OAAO,CAACqC,QAAQ,IAAI;QAC1E,IAAI3B,KAAK,CAAC2B,QAAQ,CAAC1B,IAAI,CAAC,IAAImB,GAAG,CAACE,OAAO,CAACqB,MAAM,CAACC,OAAO,CAACjB,QAAQ,CAAC1B,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE;UAAE;UAC5EoB,YAAY,GAAGM,QAAQ;QACzB,CAAC,CAAC;;QAEF,IAAIP,GAAG,CAACE,OAAO,CAACuB,SAAS,IAAIzB,GAAG,CAACE,OAAO,CAACuB,SAAS,CAACD,OAAO,CAACjB,QAAQ,CAAC1B,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE;UAAE;UAChFG,eAAe,CAACuB,QAAQ,EAAEP,GAAG,CAACd,IAAI,EAAEC,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC;QACvD,CAAC,CAAC;MACJ,CAAC,CAAC;MAEF,IAAIc,YAAY,EAAE;QAAE;QAClBjB,eAAe,CAACiB,YAAY,EAAED,GAAG,CAACd,IAAI,EAAEC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC;MAC5D;;MAEA;IACF,CAAC,MAAM,IAAIa,GAAG,CAACE,OAAO,CAACwB,MAAM,EAAE;MAAE;MAC/B,IAAInD,SAAS,GAAG,IAAI,CAAC,CAAC;MACtB,IAAI;QACFA,SAAS,GAAGoD,QAAQ,CAACxD,KAAK,CAACM,SAAS,CAACyC,IAAI,CAAC,CAAC;UAACrC;QAAI,CAAC,KAAKA,IAAI,KAAKmB,GAAG,CAACE,OAAO,CAACwB,MAAM,CAAC,CAAChC,KAAK,CAACkC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;MAC9G,CAAC,CAAC,OAAOC,GAAG,EAAE;QACZrE,KAAK,CAAC,gCAAgCqE,GAAG,YAAYC,KAAK,GAAGD,GAAG,CAACE,KAAK,GAAGF,GAAG,EAAE,CAAC;QAC/E,OAAO,KAAK;MACd;MAEAzD,aAAa,CAACD,KAAK,EAAEI,SAAS,EAAER,GAAG,EAAEC,OAAO,CAAC;IAC/C;EACF;EAEA,IAAIgC,GAAG,GAAG,IAAI,CAAC,CAAC;EAChB,IAAIb,GAAG,GAAG,IAAI,CAAC,CAAC;EAChB,IAAIc,YAAY,GAAG,IAAI,CAAC,CAAC;;EAEzB,IAAI1B,SAAS,EAAE;IAAE;IACfY,GAAG,GAAGZ,SAAS;EACjB,CAAC,MAAM;IAAE;IACP,IAAI;MACFY,GAAG,GAAGwC,QAAQ,CAACxD,KAAK,CAACgB,GAAG,EAAE,EAAE,CAAC;IAC/B,CAAC,CAAC,OAAO0C,GAAG,EAAE;MACZrE,KAAK,CAAC,gCAAgCqE,GAAG,YAAYC,KAAK,GAAGD,GAAG,CAACE,KAAK,GAAGF,GAAG,EAAE,CAAC;MAC/E,OAAO,KAAK;IACd;EACF;;EAEA;EACA7B,GAAG,GAAGgC,MAAM,CAACC,MAAM,CAACC,+BAAQ,CAAC,CAAChB,IAAI,CAACiB,CAAC,IAAI;IACtC,MAAMC,SAAS,GAAGD,CAAC,CAACE,UAAU,IAAIlD,GAAG,IAAIgD,CAAC,CAACG,QAAQ,IAAInD,GAAG;IAC1D,OAAOgD,CAAC,CAACI,KAAK,KAAKpD,GAAG,IAAIiD,SAAS;EACrC,CAAC,CAAC;EAEF,IAAI,CAACpC,GAAG,EAAE;IACR;EACF,CAAC,CAAC;;EAEF;EACA,IAAI,OAAO7B,KAAK,CAACM,SAAS,KAAK,WAAW,IAAIN,KAAK,CAACM,SAAS,KAAK,IAAI,EAAE;IACtET,OAAO,CAACA,OAAO,CAAC4B,IAAI,CAAC,SAASzB,KAAK,CAACgB,GAAG,iCAAiC,CAAC,CAAC,CAAC;IAC3E;EACF;;EAEA;EACA,IAAI,OAAOa,GAAG,CAACE,OAAO,KAAK,WAAW,IAAIF,GAAG,CAACE,OAAO,KAAK,IAAI,EAAE;IAC9DD,YAAY,GAAGzB,gBAAgB,CAACL,KAAK,CAAC;IAEtC,IAAI8B,YAAY,EAAE;MAAE;MAClBjB,eAAe,CAACiB,YAAY,EAAED,GAAG,CAACd,IAAI,EAAEf,KAAK,CAACgB,GAAG,EAAE,KAAK,EAAE,KAAK,EAAEpB,GAAG,EAAEC,OAAO,CAAC;IAChF;EACF,CAAC,MAAM;IAAE;IACP,IAAI;MACF+B,YAAY,CAACC,GAAG,EAAE7B,KAAK,EAAEA,KAAK,CAACgB,GAAG,CAAC;IACrC,CAAC,CAAC,OAAO9B,CAAC,EAAE;MACVmF,OAAO,CAACC,KAAK,CAAC,mCAAmC,EAAEpF,CAAC,CAAC,CAAC,CAAC;IACzD;EACF;AACF;AAEO,SAASqF,mBAAmBA,CAACvE,KAAK,EAAEI,SAAS,EAAER,GAAG,EAAE;EACzD,MAAMC,OAAO,GAAG,CAAC,CAAC;EAClBA,OAAO,CAACA,OAAO,GAAG,EAAE,CAAC,CAAC;EACtB,IAAID,GAAG,EAAE;IAAE;IACTC,OAAO,CAACD,GAAG,GAAG,EAAE,CAAC,CAAC;EACpB;EAEAK,aAAa,CAACD,KAAK,EAAEI,SAAS,EAAER,GAAG,EAAEC,OAAO,CAAC;EAC7CA,OAAO,CAACK,KAAK,GAAG,EAAEL,OAAO,CAACA,OAAO,CAACM,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC;EAChD,OAAON,OAAO;AAChB","ignoreList":[]}
1
+ {"version":3,"file":"ending-punctuation.js","names":["_endingPunctuationConf","require","_debug","_interopRequireDefault","e","__esModule","default","debug","createDebugLogger","_default","description","validate","record","validatePunc","fix","message","fields","forEach","field","validateField","valid","length","linkedTag","findLastSubfield","subfields","filter","sf","isNaN","code","slice","shift","normalPuncRules","subfield","punc","tag","checkEnd","overrideValidPuncMarks","puncMarks","validPuncMarks","lastPuncMark","includes","value","lastPuncDot","push","concat","charAt","specialCases","res","lastSubField","special","afterOnly","strict","noPuncIfField","some","subField","ifBoth","puncSubField","ifInd2","ind2","ifLastCharNot","noPuncIfInd2","secondLastIfLast","last","termField","languageField","find","finnishTerms","p","test","else","lastOf","indexOf","mandatory","linked","parseInt","substr","err","Error","stack","Object","values","confSpec","o","rangeFine","rangeStart","rangeEnd","index","console","error","validateSingleField"],"sources":["../src/ending-punctuation.js"],"sourcesContent":["/**\n*\n* @licstart The following is the entire license notice for the JavaScript code in this file.\n*\n* MARC record validators used in Melinda\n*\n* Copyright (c) 2014-2021 University Of Helsinki (The National Library Of Finland)\n*\n* This file is part of marc-record-validators-melinda\n*\n* marc-record-validators-melinda program is free software: you can redistribute it and/or modify\n* it under the terms of the GNU Lesser General Public License as\n* published by the Free Software Foundation, either version 3 of the\n* License, or (at your option) any later version.\n*\n* marc-record-validators-melinda is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n* GNU Lesser General Public License for more details.\n*\n* You should have received a copy of the GNU Lesser General Public License\n* along with this program. If not, see <http://www.gnu.org/licenses/>.\n*\n* @licend The above is the entire license notice\n* for the JavaScript code in this file.\n*\n*/\n\n// Import {validPuncMarks, finnishTerms, confSpec} from './ending-punctuation-conf.js';\nimport {validPuncMarks, finnishTerms, confSpec} from './ending-punctuation-conf';\nimport createDebugLogger from 'debug';\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validator-melinda/ending-punctuation');\n\nexport default function () {\n return {\n description:\n 'Handles invalid ending punctuation',\n validate: record => validatePunc(record, false), // Record (Object), fix (boolean)\n fix: record => validatePunc(record, true) // Record (Object), fix (boolean)\n\n };\n\n // This is used to validate record against configuration\n function validatePunc(record, fix) {\n const message = {message: []};\n\n if (fix) {\n message.fix = [];\n }\n\n // Actual parsing of all fields\n if (!record.fields) {\n return false;\n }\n\n record.fields.forEach(field => {\n validateField(field, false, fix, message);\n });\n\n message.valid = !(message.message.length >= 1);\n return message;\n }\n}\n\n// Field validation with punctuation rules for normal and special cases in subfunction (to reduce complexity to please travisci)\nfunction validateField(field, linkedTag, fix, message) {\n // This is used to find last subfield that should have punctuation\n function findLastSubfield(field) {\n const subfields = field.subfields.filter(sf => isNaN(sf.code) && 'value' in sf);\n return subfields.slice(-1).shift();\n }\n\n // Punctuation rule (Boolean), Check no ending dot strict (Boolean)\n function normalPuncRules(subfield, punc, tag, checkEnd, overrideValidPuncMarks) {\n const puncMarks = overrideValidPuncMarks || validPuncMarks;\n const lastPuncMark = puncMarks.includes(subfield.value.slice(-1)); // If string ends to punctuation char\n const lastPuncDot = '.'.includes(subfield.value.slice(-1)); // If string ends to dot\n\n // Last char should be punc, but its not one of marks nor dot\n if (punc && !(lastPuncMark || lastPuncDot)) {\n // Console.log(\"1. Invalid punctuation - missing\")\n message.message.push(`Field ${tag} has invalid ending punctuation`);\n if (fix) {\n subfield.value = subfield.value.concat('.');\n message.fix.push(`Field ${tag} - Added punctuation to $${subfield.code}`);\n }\n\n // Last char is dot, but previous char is one of punc marks, like 'Question?.'\n } else if (lastPuncDot && subfield.value.length > 1 && puncMarks.includes(subfield.value.charAt(subfield.value.length - 2))) {\n // Console.log(\"2. Invalid punctuation - duplicate, like '?.'\")\n message.message.push(`Field ${tag} has invalid ending punctuation`);\n if (fix) {\n subfield.value = subfield.value.slice(0, -1);\n message.fix.push(`Field ${tag} - Removed double punctuation from $${subfield.code}`);\n }\n\n // Last char shouldn't be dot !! This is behind checkEnd boolean, because of dots at end of abbreviations, so this is checked only in special cases !!//\n } else if (checkEnd && (!punc && lastPuncDot)) {\n // Console.log(\"3. Invalid punctuation - Shouldn't be dot, is\")\n message.message.push(`Field ${tag} has invalid ending punctuation`);\n if (fix) {\n subfield.value = subfield.value.slice(0, -1);\n message.fix.push(`Field ${tag} - Removed punctuation from $${subfield.code}`);\n }\n }\n }\n\n // Special cases from here on\n function specialCases(res, field, tag) {\n let lastSubField = null;\n // Punctuation should be only after specific field\n if (res.special.afterOnly) {\n lastSubField = findLastSubfield(field);\n\n if (lastSubField) {\n if (typeof res.special.strict === 'undefined') {\n res.special.strict = true;\n }\n\n if (lastSubField.code === res.special.afterOnly) {\n normalPuncRules(lastSubField, res.punc, tag, res.special.strict, false);\n } else {\n normalPuncRules(lastSubField, !res.punc, tag, true, false);\n }\n }\n } else if (res.special.noPuncIfField) {\n if (field.subfields.some(subField => subField.code === res.special.noPuncIfField) === false) {\n lastSubField = findLastSubfield(field);\n normalPuncRules(lastSubField, res.punc, tag, true, false);\n }\n } else if (res.special.ifBoth) {\n lastSubField = findLastSubfield(field);\n if (lastSubField && lastSubField.code === res.special.puncSubField) {\n // Ind2 match, check second if at punc rules with special punc char override\n if (res.special.ifInd2 && res.special.ifInd2.includes(field.ind2)) {\n normalPuncRules(lastSubField, res.special.ifBoth, tag, true, res.special.ifLastCharNot);\n\n // Matches execption to special rule, noPuncIfInd2 (likely with value 4, that indicates copyright mark)\n } else if (res.special.noPuncIfInd2 && field.ind2 && res.special.noPuncIfInd2.includes(field.ind2)) {\n normalPuncRules(lastSubField, !res.special.ifBoth, tag, true, res.special.ifLastCharNot);\n\n // Does not match rules -> shouldn't have punc\n } else {\n normalPuncRules(lastSubField, !res.special.ifBoth, tag, true, res.special.ifLastCharNot);\n }\n }\n } else if (res.special.secondLastIfLast) {\n field.subfields.forEach(subField => {\n if (isNaN(subField.code) && res.special.secondLastIfLast !== subField.code) {\n lastSubField = subField;\n } // Not control field\n\n if (typeof res.special.last !== 'undefined' && res.special.secondLastIfLast === subField.code) {\n normalPuncRules(subField, res.special.last, tag, true, false);\n } // Strict because this field should not be abbreviation\n });\n normalPuncRules(lastSubField, res.punc, tag, false, false);\n\n // Search for Finnish terms\n } else if (res.special.termField) {\n lastSubField = findLastSubfield(field);\n\n if (lastSubField) {\n const languageField = field.subfields.find(({code}) => code === res.special.termField);\n if (languageField && languageField.value && finnishTerms.some(p => p.test(languageField.value))) {\n // If (languageField && languageField.value && finnishTerms.indexOf(languageField.value) > -1) {\n normalPuncRules(lastSubField, res.punc, tag, true, false);\n } else {\n normalPuncRules(lastSubField, res.special.else, tag, false, false); // Strict because of years etc (648, 650)\n }\n }\n // Search last of array in subfields and check if it has punc\n } else if (res.special.lastOf) {\n lastSubField = null;\n field.subfields.filter(subField => 'value' in subField).forEach(subField => {\n if (isNaN(subField.code) && res.special.lastOf.indexOf(subField.code) > -1) {\n lastSubField = subField;\n } // Not control field\n\n if (res.special.mandatory && res.special.mandatory.indexOf(subField.code) > -1) {\n normalPuncRules(subField, res.punc, tag, true, false);\n } // Strict because of mandatory\n });\n\n if (lastSubField) {\n normalPuncRules(lastSubField, res.punc, tag, false, false);\n }\n\n // If field has linked rules (tag: 880), find rules and re-validate\n } else if (res.special.linked) {\n let linkedTag = null;\n try {\n linkedTag = parseInt(field.subfields.find(({code}) => code === res.special.linked).value.substr(0, 3), 10); // Substring feels stupid, but is used in MarcRecord to extract tag.\n } catch (err) {\n debug(`Got error while parsing tag: ${err instanceof Error ? err.stack : err}`);\n return false;\n }\n\n validateField(field, linkedTag, fix, message);\n }\n }\n\n let res = null;\n let tag = null;\n let lastSubField = null;\n\n if (linkedTag) {\n tag = linkedTag;\n } else {\n try {\n tag = parseInt(field.tag, 10);\n } catch (err) {\n debug(`Got error while parsing tag: ${err instanceof Error ? err.stack : err}`);\n return false;\n }\n }\n\n // Find configuration object matching tag:\n res = Object.values(confSpec).find(o => {\n const rangeFine = o.rangeStart <= tag && o.rangeEnd >= tag;\n return o.index === tag || rangeFine;\n });\n\n if (!res) {\n return;\n } // Configuration not found, pass field without error\n\n // Field does not have subfields; invalid\n if (typeof field.subfields === 'undefined' || field.subfields === null) {\n message.message.push(`Field ${field.tag} has invalid ending punctuation`);\n return;\n }\n\n // Normal rules\n if (typeof res.special === 'undefined' || res.special === null) {\n lastSubField = findLastSubfield(field);\n\n if (lastSubField) {\n normalPuncRules(lastSubField, res.punc, field.tag, false, false, fix, message);\n }\n } else {\n try {\n specialCases(res, field, field.tag);\n } catch (e) {\n console.error('Catched error from special case: ', e); // eslint-disable-line no-console\n }\n }\n}\n\nexport function validateSingleField(field, linkedTag, fix) {\n const message = {};\n message.message = [];\n if (fix) {\n message.fix = [];\n }\n\n validateField(field, linkedTag, fix, message);\n message.valid = !(message.message.length >= 1);\n return message;\n}\n\n"],"mappings":"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","ignoreList":[]}
@@ -31,8 +31,6 @@ function _default() {
31
31
  messages
32
32
  };
33
33
  }
34
-
35
- /* eslint-disable functional/immutable-data,functional/no-conditional-statements */
36
34
  function fix(record) {
37
35
  record.fields.forEach(({
38
36
  subfields
@@ -47,8 +45,6 @@ function _default() {
47
45
  });
48
46
  });
49
47
  }
50
- /* eslint-enable functional/immutable-data,functional/no-conditional-statements */
51
-
52
48
  function valueEndsWithWhitespace({
53
49
  value
54
50
  }) {
@@ -1 +1 @@
1
- {"version":3,"file":"ending-whitespace.js","names":["_default","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-statements */\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-statements */\n\n function valueEndsWithWhitespace({value}) {\n return (/\\s$/u).test(value);\n }\n}\n"],"mappings":";;;;;;AAAA;AACA;AACA;AACA;AACe,SAAAA,SAAA,EAAY;EACzB,OAAO;IACLC,WAAW,EAAE,uDAAuD;IACpEC,QAAQ;IACRC;EACF,CAAC;EAED,SAASD,QAAQA,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,IAAI,SAASF,GAAG,cAAcE,EAAE,CAACC,IAAI,uBAAuB,CAAC,CAAC;IAE5I,OAAON,KAAK,GAAG;MAACA,KAAK;MAAEC,QAAQ,EAAE;IAAE,CAAC,GAAG;MAACD,KAAK;MAAEC;IAAQ,CAAC;EAC1D;;EAEA;EACA,SAASV,GAAGA,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,CAAC,CAAC;QAC3C;MACF,CAAC,CAAC;IACJ,CAAC,CAAC;EACJ;EACA;;EAEA,SAASZ,uBAAuBA,CAAC;IAACW;EAAK,CAAC,EAAE;IACxC,OAAQ,MAAM,CAAEE,IAAI,CAACF,KAAK,CAAC;EAC7B;AACF","ignoreList":[]}
1
+ {"version":3,"file":"ending-whitespace.js","names":["_default","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 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\n function valueEndsWithWhitespace({value}) {\n return (/\\s$/u).test(value);\n }\n}\n"],"mappings":";;;;;;AAAA;AACA;AACA;AACA;AACe,SAAAA,SAAA,EAAY;EACzB,OAAO;IACLC,WAAW,EAAE,uDAAuD;IACpEC,QAAQ;IACRC;EACF,CAAC;EAED,SAASD,QAAQA,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,IAAI,SAASF,GAAG,cAAcE,EAAE,CAACC,IAAI,uBAAuB,CAAC,CAAC;IAE5I,OAAON,KAAK,GAAG;MAACA,KAAK;MAAEC,QAAQ,EAAE;IAAE,CAAC,GAAG;MAACD,KAAK;MAAEC;IAAQ,CAAC;EAC1D;EAEA,SAASV,GAAGA,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,CAAC,CAAC;QAC3C;MACF,CAAC,CAAC;IACJ,CAAC,CAAC;EACJ;EAEA,SAASZ,uBAAuBA,CAAC;IAACW;EAAK,CAAC,EAAE;IACxC,OAAQ,MAAM,CAAEE,IAAI,CAACF,KAAK,CAAC;EAC7B;AACF","ignoreList":[]}
@@ -40,7 +40,7 @@ function _default() {
40
40
  record.fields?.forEach(field => {
41
41
  validateField(field, res, typeOfMaterial);
42
42
  });
43
- res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data
43
+ res.valid = !(res.message.length >= 1);
44
44
  return res;
45
45
  }
46
46
  function validateField(field, res, typeOfMaterial) {
@@ -53,7 +53,7 @@ function _default() {
53
53
  const mod = (0, _utils.fieldToString)(normalizedField);
54
54
  if (orig !== mod) {
55
55
  // Fail as the input is "broken"/"crap"/sumthing
56
- res.message.push(`TODO: '${orig}' => '${mod}'`); // eslint-disable-line functional/immutable-data
56
+ res.message.push(`TODO: '${orig}' => '${mod}'`);
57
57
  return;
58
58
  }
59
59
  return;
@@ -119,7 +119,6 @@ function processCharacterGroup(field, group) {
119
119
  //console.info(`008/${group.start}-${group.end}: '${originalContent}'`); // eslint-disable-line no-console
120
120
  const charArray = content.split('');
121
121
  charArray.sort(function (a, b) {
122
- // eslint-disable-line functional/immutable-data, prefer-arrow-callback
123
122
  return scoreChar(a) - scoreChar(b);
124
123
  });
125
124
  const newContent = charArray.join('');
@@ -129,7 +128,7 @@ function processCharacterGroup(field, group) {
129
128
 
130
129
  //console.info(`'${fieldToString(field)}' =>`); // eslint-disable-line no-console
131
130
 
132
- field.value = `${field.value.substring(0, group.start)}${newContent}${field.value.substring(group.end + 1)}`; // eslint-disable-line functional/immutable-data
131
+ field.value = `${field.value.substring(0, group.start)}${newContent}${field.value.substring(group.end + 1)}`;
133
132
  //console.info(`'${fieldToString(field)}'`); // eslint-disable-line no-console
134
133
 
135
134
  function fixBlanks(str) {
@@ -167,7 +166,7 @@ function justifyAndSortField008CharacterGroups(field, typeOfMaterial) {
167
166
  //console.info(typeOfMaterial); // eslint-disable-line no-console
168
167
 
169
168
  const relevantCharacterGroups = characterGroups.filter(gr => gr.type === typeOfMaterial);
170
- relevantCharacterGroups.forEach(group => processCharacterGroup(field, group));
169
+ relevantCharacterGroups.forEach(group => processCharacterGroup(field, group)); // eslint-disable-line array-callback-return
171
170
 
172
171
  //justifyField008CharacterGroups(field, typeOfMaterial); // Oops: also sorts...
173
172
 
@@ -1 +1 @@
1
- {"version":3,"file":"field-008-18-34-character-groups.js","names":["_clone","_interopRequireDefault","require","_utils","e","__esModule","default","_default","description","validate","fix","record","typeOfMaterial","getTypeOfMaterial","fields","forEach","field","justifyAndSortField008CharacterGroups","res","message","valid","validateField","length","tag","orig","fieldToString","normalizedField","clone","mod","push","characterGroups","type","start","end","sort","name","BIG_BAD_VALUE","processCharacterGroup","group","originalContent","value","substring","content","removeDuplicateValues","fixBlanks","charArray","split","a","b","scoreChar","newContent","join","str","includes","match","replaceAll","c","asciiCode","charCodeAt","subfields","relevantCharacterGroups","filter","gr","arr","reducedStr","i","indexOf","output","repeat"],"sources":["../src/field-008-18-34-character-groups.js"],"sourcesContent":["//import createDebugLogger from 'debug';\nimport clone from 'clone';\nimport {fieldToString} from './utils';\n// Author(s): Nicholas Volk\n// NB! CR 008/24 vs 008/25-27 is not supported yet!\n\nexport default function () {\n\n return {\n description: 'Justify left and sort character groups within 008/18-24',\n validate, fix\n };\n\n function fix(record) {\n const typeOfMaterial = record.getTypeOfMaterial();\n record.fields.forEach(field => {\n justifyAndSortField008CharacterGroups(field, typeOfMaterial);\n });\n // Fix always succeeds (even when it really does not):\n const res = {message: [], fix: [], valid: true};\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n const typeOfMaterial = record.getTypeOfMaterial();\n\n record.fields?.forEach(field => {\n validateField(field, res, typeOfMaterial);\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, typeOfMaterial) {\n if (field.tag !== '008') { // Optimize code a bit...\n return;\n }\n const orig = fieldToString(field);\n\n const normalizedField = justifyAndSortField008CharacterGroups(clone(field), typeOfMaterial);\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// Should we add legal values?\nconst characterGroups = [\n {type: 'BK', start: 18, end: 21, sort: true, name: 'illustrations'},\n {type: 'BK', start: 24, end: 27, sort: true, name: 'nature of contents'}, // English doc does not explicitly mention alphabetical sorting... Finnish does.\n {type: 'CR', start: 25, end: 27, sort: true, name: 'nature of contents'}, // NB! 24 vs 25-27 logic needs to be implemented separately\n {type: 'MP', start: 18, end: 21, sort: false, name: 'relief'}, // Order of importance!\n {type: 'MP', start: 33, end: 34, sort: false, name: 'special format of characteristics'}, // Order of importance!\n {type: 'MU', start: 24, end: 29, sort: true, name: 'accompanying material'},\n {type: 'MU', start: 30, end: 31, sort: true, name: 'literary text for sound recordings'}\n];\n\nconst BIG_BAD_VALUE = 999999999;\n\nfunction processCharacterGroup(field, group) {\n const originalContent = field.value.substring(group.start, group.end + 1);\n const content = removeDuplicateValues(fixBlanks(originalContent));\n //console.info(`008/${group.start}-${group.end}: '${originalContent}'`); // eslint-disable-line no-console\n const charArray = content.split('');\n\n charArray.sort(function(a, b) { // eslint-disable-line functional/immutable-data, prefer-arrow-callback\n return scoreChar(a) - scoreChar(b);\n });\n\n const newContent = charArray.join('');\n if (originalContent === newContent) {\n return;\n }\n\n //console.info(`'${fieldToString(field)}' =>`); // eslint-disable-line no-console\n\n field.value = `${field.value.substring(0, group.start)}${newContent}${field.value.substring(group.end + 1)}`; // eslint-disable-line functional/immutable-data\n //console.info(`'${fieldToString(field)}'`); // eslint-disable-line no-console\n\n function fixBlanks(str) {\n if (str.includes('|') && str.match(/[^ |]/u)) {\n return str.replaceAll('|', ' ');\n }\n return str;\n }\n\n function scoreChar(c) {\n if (c === '|' || c === ' ') {\n return BIG_BAD_VALUE; // Max value, these should code last\n }\n if (!group.sort) { // more meaningful comes first: keep the original order\n return 1;\n }\n const asciiCode = c.charCodeAt(0);\n // a-z get values 1-26:\n if (asciiCode >= 97 && asciiCode <= 122) {\n return asciiCode - 96;\n }\n // 0-9 get values 100-109\n if (asciiCode >= 48 && asciiCode <= 57) {\n return asciiCode + 52;\n }\n // Others (=crap) return something between '9' and BIG BAD VALUE\n return asciiCode + 200;\n }\n}\n\nexport function justifyAndSortField008CharacterGroups(field, typeOfMaterial) {\n if (field.tag !== '008' || field.subfields) {\n return field;\n }\n\n //console.info(typeOfMaterial); // eslint-disable-line no-console\n\n const relevantCharacterGroups = characterGroups.filter(gr => gr.type === typeOfMaterial);\n\n relevantCharacterGroups.forEach(group => processCharacterGroup(field, group));\n\n //justifyField008CharacterGroups(field, typeOfMaterial); // Oops: also sorts...\n\n // NB! add value # and | normalizations\n //fixBlanks(field, typeOfMaterial);\n\n return field;\n}\n\nfunction removeDuplicateValues(str) {\n const arr = str.split('');\n // Take only the first instance of a proper value-carrying character\n const reducedStr = arr.filter((c, i) => c === ' ' || c === '|' || arr.indexOf(c) === i).join('');\n //console.info(`I: '${str}'`); // eslint-disable-line no-console\n //console.info(`M: '${reducedStr}'`); // eslint-disable-line no-console\n const output = `${reducedStr}${' '.repeat(str.length - reducedStr.length)}`; // Had some weird trouble with str.padEnd(n)\n //console.info(`M: '${output}'`); // eslint-disable-line no-console\n return output;\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"field-008-18-34-character-groups.js","names":["_clone","_interopRequireDefault","require","_utils","e","__esModule","default","_default","description","validate","fix","record","typeOfMaterial","getTypeOfMaterial","fields","forEach","field","justifyAndSortField008CharacterGroups","res","message","valid","validateField","length","tag","orig","fieldToString","normalizedField","clone","mod","push","characterGroups","type","start","end","sort","name","BIG_BAD_VALUE","processCharacterGroup","group","originalContent","value","substring","content","removeDuplicateValues","fixBlanks","charArray","split","a","b","scoreChar","newContent","join","str","includes","match","replaceAll","c","asciiCode","charCodeAt","subfields","relevantCharacterGroups","filter","gr","arr","reducedStr","i","indexOf","output","repeat"],"sources":["../src/field-008-18-34-character-groups.js"],"sourcesContent":["//import createDebugLogger from 'debug';\nimport clone from 'clone';\nimport {fieldToString} from './utils';\n// Author(s): Nicholas Volk\n// NB! CR 008/24 vs 008/25-27 is not supported yet!\n\nexport default function () {\n\n return {\n description: 'Justify left and sort character groups within 008/18-24',\n validate, fix\n };\n\n function fix(record) {\n const typeOfMaterial = record.getTypeOfMaterial();\n record.fields.forEach(field => {\n justifyAndSortField008CharacterGroups(field, typeOfMaterial);\n });\n // Fix always succeeds (even when it really does not):\n const res = {message: [], fix: [], valid: true};\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n const typeOfMaterial = record.getTypeOfMaterial();\n\n record.fields?.forEach(field => {\n validateField(field, res, typeOfMaterial);\n });\n\n res.valid = !(res.message.length >= 1);\n return res;\n }\n\n function validateField(field, res, typeOfMaterial) {\n if (field.tag !== '008') { // Optimize code a bit...\n return;\n }\n const orig = fieldToString(field);\n\n const normalizedField = justifyAndSortField008CharacterGroups(clone(field), typeOfMaterial);\n const mod = fieldToString(normalizedField);\n if (orig !== mod) { // Fail as the input is \"broken\"/\"crap\"/sumthing\n res.message.push(`TODO: '${orig}' => '${mod}'`);\n return;\n }\n return;\n }\n}\n\n// Should we add legal values?\nconst characterGroups = [\n {type: 'BK', start: 18, end: 21, sort: true, name: 'illustrations'},\n {type: 'BK', start: 24, end: 27, sort: true, name: 'nature of contents'}, // English doc does not explicitly mention alphabetical sorting... Finnish does.\n {type: 'CR', start: 25, end: 27, sort: true, name: 'nature of contents'}, // NB! 24 vs 25-27 logic needs to be implemented separately\n {type: 'MP', start: 18, end: 21, sort: false, name: 'relief'}, // Order of importance!\n {type: 'MP', start: 33, end: 34, sort: false, name: 'special format of characteristics'}, // Order of importance!\n {type: 'MU', start: 24, end: 29, sort: true, name: 'accompanying material'},\n {type: 'MU', start: 30, end: 31, sort: true, name: 'literary text for sound recordings'}\n];\n\nconst BIG_BAD_VALUE = 999999999;\n\nfunction processCharacterGroup(field, group) {\n const originalContent = field.value.substring(group.start, group.end + 1);\n const content = removeDuplicateValues(fixBlanks(originalContent));\n //console.info(`008/${group.start}-${group.end}: '${originalContent}'`); // eslint-disable-line no-console\n const charArray = content.split('');\n\n charArray.sort(function(a, b) {\n return scoreChar(a) - scoreChar(b);\n });\n\n const newContent = charArray.join('');\n if (originalContent === newContent) {\n return;\n }\n\n //console.info(`'${fieldToString(field)}' =>`); // eslint-disable-line no-console\n\n field.value = `${field.value.substring(0, group.start)}${newContent}${field.value.substring(group.end + 1)}`;\n //console.info(`'${fieldToString(field)}'`); // eslint-disable-line no-console\n\n function fixBlanks(str) {\n if (str.includes('|') && str.match(/[^ |]/u)) {\n return str.replaceAll('|', ' ');\n }\n return str;\n }\n\n function scoreChar(c) {\n if (c === '|' || c === ' ') {\n return BIG_BAD_VALUE; // Max value, these should code last\n }\n if (!group.sort) { // more meaningful comes first: keep the original order\n return 1;\n }\n const asciiCode = c.charCodeAt(0);\n // a-z get values 1-26:\n if (asciiCode >= 97 && asciiCode <= 122) {\n return asciiCode - 96;\n }\n // 0-9 get values 100-109\n if (asciiCode >= 48 && asciiCode <= 57) {\n return asciiCode + 52;\n }\n // Others (=crap) return something between '9' and BIG BAD VALUE\n return asciiCode + 200;\n }\n}\n\nexport function justifyAndSortField008CharacterGroups(field, typeOfMaterial) {\n if (field.tag !== '008' || field.subfields) {\n return field;\n }\n\n //console.info(typeOfMaterial); // eslint-disable-line no-console\n\n const relevantCharacterGroups = characterGroups.filter(gr => gr.type === typeOfMaterial);\n\n relevantCharacterGroups.forEach(group => processCharacterGroup(field, group)); // eslint-disable-line array-callback-return\n\n //justifyField008CharacterGroups(field, typeOfMaterial); // Oops: also sorts...\n\n // NB! add value # and | normalizations\n //fixBlanks(field, typeOfMaterial);\n\n return field;\n}\n\nfunction removeDuplicateValues(str) {\n const arr = str.split('');\n // Take only the first instance of a proper value-carrying character\n const reducedStr = arr.filter((c, i) => c === ' ' || c === '|' || arr.indexOf(c) === i).join('');\n //console.info(`I: '${str}'`); // eslint-disable-line no-console\n //console.info(`M: '${reducedStr}'`); // eslint-disable-line no-console\n const output = `${reducedStr}${' '.repeat(str.length - reducedStr.length)}`; // Had some weird trouble with str.padEnd(n)\n //console.info(`M: '${output}'`); // eslint-disable-line no-console\n return output;\n}\n"],"mappings":"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","ignoreList":[]}
@@ -34,7 +34,7 @@ function _default() {
34
34
  record.fields?.forEach(field => {
35
35
  validateField(field, res);
36
36
  });
37
- res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data
37
+ res.valid = !(res.message.length >= 1);
38
38
  return res;
39
39
  }
40
40
  function validateField(field, res) {
@@ -43,7 +43,7 @@ function _default() {
43
43
  const mod = (0, _utils.fieldToString)(normalizedField);
44
44
  if (orig !== mod) {
45
45
  // Fail as the input is "broken"/"crap"/sumthing
46
- res.message.push(`'TODO: ${orig}' => '${mod}'`); // eslint-disable-line functional/immutable-data
46
+ res.message.push(`'TODO: ${orig}' => '${mod}'`);
47
47
  return;
48
48
  }
49
49
  return;
@@ -51,20 +51,22 @@ function _default() {
51
51
  }
52
52
  function field505FixSubfieldA(field) {
53
53
  const a = field.subfields.filter(sf => sf.code === 'a');
54
- a.forEach(sf => fixSubfieldA(sf));
54
+ a.forEach(sf => fixSubfieldA(sf)); // eslint-disable-line array-callback-return
55
+
55
56
  function fixSubfieldA(a) {
56
- a.value = a.value.replace(/ ; /ug, ' -- '); // eslint-disable-line functional/immutable-data
57
+ a.value = a.value.replace(/ ; /ug, ' -- ');
57
58
  }
58
59
  }
59
60
  function field505FixSubfieldTRG(field) {
60
61
  // Modify subfield if next subfield is $t:
61
62
  const subfieldsThatWillBeModified = field.subfields.filter((sf, i) => i + 1 < field.subfields.length && field.subfields[i + 1].code === 't');
62
- subfieldsThatWillBeModified.forEach(sf => fixSubfieldThatPrecedesT(sf));
63
+ subfieldsThatWillBeModified.forEach(sf => fixSubfieldThatPrecedesT(sf)); // eslint-disable-line array-callback-return
64
+
63
65
  function fixSubfieldThatPrecedesT(sf) {
64
66
  if (!sf.value) {
65
67
  return;
66
68
  }
67
- sf.value = sf.value.replace(/ ;$/u, ' --'); // eslint-disable-line functional/immutable-data
69
+ sf.value = sf.value.replace(/ ;$/u, ' --');
68
70
  }
69
71
  }
70
72
  function fix505(field) {
@@ -1 +1 @@
1
- {"version":3,"file":"field-505-separators.js","names":["_clone","_interopRequireDefault","require","_utils","e","__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 if (!sf.value) {\n return;\n }\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":"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","ignoreList":[]}
1
+ {"version":3,"file":"field-505-separators.js","names":["_clone","_interopRequireDefault","require","_utils","e","__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);\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}'`);\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)); // eslint-disable-line array-callback-return\n\n function fixSubfieldA(a) {\n a.value = a.value.replace(/ ; /ug, ' -- ');\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)); // eslint-disable-line array-callback-return\n\n function fixSubfieldThatPrecedesT(sf) {\n if (!sf.value) {\n return;\n }\n sf.value = sf.value.replace(/ ;$/u, ' --');\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":"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","ignoreList":[]}
@@ -43,7 +43,7 @@ function _default() {
43
43
  record.fields?.forEach(field => {
44
44
  validateField(field, res);
45
45
  });
46
- res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data
46
+ res.valid = !(res.message.length >= 1);
47
47
  return res;
48
48
  }
49
49
  function validateField(field, res) {
@@ -52,7 +52,7 @@ function _default() {
52
52
  const mod = (0, _utils.fieldToString)(normalizedField);
53
53
  if (orig !== mod) {
54
54
  // Fail as the input is "broken"/"crap"/sumthing
55
- res.message.push(`'TODO: ${orig}' => '${mod}'`); // eslint-disable-line functional/immutable-data
55
+ res.message.push(`'TODO: ${orig}' => '${mod}'`);
56
56
  return;
57
57
  }
58
58
  return;
@@ -60,13 +60,12 @@ function _default() {
60
60
  }
61
61
  function fixSubfieldA(a) {
62
62
  a.value = a.value.
63
- // eslint-disable-line functional/immutable-data
64
63
  // MET-332:
65
- replace(/^(Ikäsuositus) ([0-9])/u, '$1: $2'); // eslint-disable-line prefer-named-capture-group, functional/immutable-data
64
+ replace(/^(Ikäsuositus) ([0-9])/u, '$1: $2');
66
65
  }
67
66
  function fixSubfieldAInternalPunctuation(field) {
68
67
  const a = field.subfields.filter(sf => sf.code === 'a');
69
- a.forEach(sf => fixSubfieldA(sf));
68
+ a.forEach(sf => fixSubfieldA(sf)); // eslint-disable-line array-callback-return
70
69
  }
71
70
  function getIndicator1(field) {
72
71
  const [a] = field.subfields.filter(sf => sf.code === 'a');
@@ -80,7 +79,7 @@ function getIndicator1(field) {
80
79
  function fixIndicator1(field) {
81
80
  const value = getIndicator1(field);
82
81
  if (value) {
83
- field.ind1 = value; // eslint-disable-line functional/immutable-data
82
+ field.ind1 = value;
84
83
  return;
85
84
  }
86
85
  }
@@ -1 +1 @@
1
- {"version":3,"file":"field-521-fix.js","names":["_clone","_interopRequireDefault","require","_utils","e","__esModule","default","_default","description","validate","fix","record","fields","forEach","field","fix521","res","message","valid","validateField","length","orig","fieldToString","normalizedField","clone","mod","push","fixSubfieldA","a","value","replace","fixSubfieldAInternalPunctuation","subfields","filter","sf","code","getIndicator1","match","undefined","fixIndicator1","ind1","tag"],"sources":["../src/field-521-fix.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: 'Various fixes for field 521',\n validate, fix\n };\n\n function fix(record) {\n record.fields.forEach(field => {\n fix521(field);\n });\n // Fix always succeeds (even when it really does not):\n const res = {message: [], fix: [], valid: true};\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 const orig = fieldToString(field);\n\n const normalizedField = fix521(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\nfunction fixSubfieldA(a) {\n a.value = a.value. // eslint-disable-line functional/immutable-data\n // MET-332:\n replace(/^(Ikäsuositus) ([0-9])/u, '$1: $2'); // eslint-disable-line prefer-named-capture-group, functional/immutable-data\n}\n\nfunction fixSubfieldAInternalPunctuation(field) {\n const a = field.subfields.filter(sf => sf.code === 'a');\n\n a.forEach(sf => fixSubfieldA(sf));\n}\n\nfunction getIndicator1(field) {\n const [a] = field.subfields.filter(sf => sf.code === 'a');\n if (a) {\n if (a.value.match(/^Ikäsuositus/u)) {\n return '1';\n }\n }\n return undefined;\n}\n\nfunction fixIndicator1(field) {\n const value = getIndicator1(field);\n if (value) {\n field.ind1 = value; // eslint-disable-line functional/immutable-data\n return;\n }\n\n}\n\nfunction fix521(field) {\n if (field.tag !== '521' || !field.subfields) {\n return field;\n }\n fixIndicator1(field);\n fixSubfieldAInternalPunctuation(field);\n return field;\n}\n\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"field-521-fix.js","names":["_clone","_interopRequireDefault","require","_utils","e","__esModule","default","_default","description","validate","fix","record","fields","forEach","field","fix521","res","message","valid","validateField","length","orig","fieldToString","normalizedField","clone","mod","push","fixSubfieldA","a","value","replace","fixSubfieldAInternalPunctuation","subfields","filter","sf","code","getIndicator1","match","undefined","fixIndicator1","ind1","tag"],"sources":["../src/field-521-fix.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: 'Various fixes for field 521',\n validate, fix\n };\n\n function fix(record) {\n record.fields.forEach(field => {\n fix521(field);\n });\n // Fix always succeeds (even when it really does not):\n const res = {message: [], fix: [], valid: true};\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);\n return res;\n }\n\n function validateField(field, res) {\n const orig = fieldToString(field);\n\n const normalizedField = fix521(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}'`);\n return;\n }\n return;\n }\n}\n\nfunction fixSubfieldA(a) {\n a.value = a.value.\n // MET-332:\n replace(/^(Ikäsuositus) ([0-9])/u, '$1: $2');\n}\n\nfunction fixSubfieldAInternalPunctuation(field) {\n const a = field.subfields.filter(sf => sf.code === 'a');\n\n a.forEach(sf => fixSubfieldA(sf)); // eslint-disable-line array-callback-return\n}\n\nfunction getIndicator1(field) {\n const [a] = field.subfields.filter(sf => sf.code === 'a');\n if (a) {\n if (a.value.match(/^Ikäsuositus/u)) {\n return '1';\n }\n }\n return undefined;\n}\n\nfunction fixIndicator1(field) {\n const value = getIndicator1(field);\n if (value) {\n field.ind1 = value;\n return;\n }\n\n}\n\nfunction fix521(field) {\n if (field.tag !== '521' || !field.subfields) {\n return field;\n }\n fixIndicator1(field);\n fixSubfieldAInternalPunctuation(field);\n return field;\n}\n\n"],"mappings":";;;;;;AACA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,MAAA,GAAAD,OAAA;AAAsC,SAAAD,uBAAAG,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAFtC;;AAIA;AACe,SAAAG,SAAA,EAAY;EAEzB,OAAO;IACLC,WAAW,EAAE,6BAA6B;IAC1CC,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;IACF;IACA,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;;IAEzB;IACA;AACJ;AACA;AACA;AACA;;IAEIN,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;IACtC,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,CAAC,UAAUL,IAAI,SAASI,GAAG,GAAG,CAAC;MAC/C;IACF;IACA;EACF;AACF;AAEA,SAASE,YAAYA,CAACC,CAAC,EAAE;EACvBA,CAAC,CAACC,KAAK,GAAGD,CAAC,CAACC,KAAK;EACf;EACAC,OAAO,CAAC,yBAAyB,EAAE,QAAQ,CAAC;AAChD;AAEA,SAASC,+BAA+BA,CAACjB,KAAK,EAAE;EAC9C,MAAMc,CAAC,GAAGd,KAAK,CAACkB,SAAS,CAACC,MAAM,CAACC,EAAE,IAAIA,EAAE,CAACC,IAAI,KAAK,GAAG,CAAC;EAEvDP,CAAC,CAACf,OAAO,CAACqB,EAAE,IAAIP,YAAY,CAACO,EAAE,CAAC,CAAC,CAAC,CAAC;AACrC;AAEA,SAASE,aAAaA,CAACtB,KAAK,EAAE;EAC5B,MAAM,CAACc,CAAC,CAAC,GAAGd,KAAK,CAACkB,SAAS,CAACC,MAAM,CAACC,EAAE,IAAIA,EAAE,CAACC,IAAI,KAAK,GAAG,CAAC;EACzD,IAAIP,CAAC,EAAE;IACL,IAAIA,CAAC,CAACC,KAAK,CAACQ,KAAK,CAAC,eAAe,CAAC,EAAE;MAClC,OAAO,GAAG;IACZ;EACF;EACA,OAAOC,SAAS;AAClB;AAEA,SAASC,aAAaA,CAACzB,KAAK,EAAE;EAC5B,MAAMe,KAAK,GAAGO,aAAa,CAACtB,KAAK,CAAC;EAClC,IAAIe,KAAK,EAAE;IACTf,KAAK,CAAC0B,IAAI,GAAGX,KAAK;IAClB;EACF;AAEF;AAEA,SAASd,MAAMA,CAACD,KAAK,EAAE;EACrB,IAAIA,KAAK,CAAC2B,GAAG,KAAK,KAAK,IAAI,CAAC3B,KAAK,CAACkB,SAAS,EAAE;IAC3C,OAAOlB,KAAK;EACd;EACAyB,aAAa,CAACzB,KAAK,CAAC;EACpBiB,+BAA+B,CAACjB,KAAK,CAAC;EACtC,OAAOA,KAAK;AACd","ignoreList":[]}