@natlibfi/marc-record-validators-melinda 10.3.2 → 10.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/dist/index.js +14 -0
  2. package/dist/index.js.map +1 -1
  3. package/dist/removeInferiorDataFields.js +32 -16
  4. package/dist/removeInferiorDataFields.js.map +1 -1
  5. package/dist/sanitize-vocabulary-source-codes.js +97 -0
  6. package/dist/sanitize-vocabulary-source-codes.js.map +1 -0
  7. package/dist/sanitize-vocabulary-source-codes.spec.js +51 -0
  8. package/dist/sanitize-vocabulary-source-codes.spec.js.map +1 -0
  9. package/dist/update-field-540.js +113 -0
  10. package/dist/update-field-540.js.map +1 -0
  11. package/dist/update-field-540.spec.js +51 -0
  12. package/dist/update-field-540.spec.js.map +1 -0
  13. package/package.json +1 -1
  14. package/src/index.js +4 -1
  15. package/src/removeInferiorDataFields.js +31 -15
  16. package/src/sanitize-vocabulary-source-codes.js +95 -0
  17. package/src/sanitize-vocabulary-source-codes.spec.js +52 -0
  18. package/src/update-field-540.js +98 -0
  19. package/src/update-field-540.spec.js +52 -0
  20. package/test-fixtures/remove-inferior-datafields/f04/expectedResult.json +31 -0
  21. package/test-fixtures/remove-inferior-datafields/f04/metadata.json +6 -0
  22. package/test-fixtures/remove-inferior-datafields/f04/record.json +38 -0
  23. package/test-fixtures/sanitize-vocabulary-source-codes/f01/expectedResult.json +25 -0
  24. package/test-fixtures/sanitize-vocabulary-source-codes/f01/metadata.json +6 -0
  25. package/test-fixtures/sanitize-vocabulary-source-codes/f01/record.json +25 -0
  26. package/test-fixtures/sanitize-vocabulary-source-codes/f02/expectedResult.json +24 -0
  27. package/test-fixtures/sanitize-vocabulary-source-codes/f02/metadata.json +6 -0
  28. package/test-fixtures/sanitize-vocabulary-source-codes/f02/record.json +24 -0
  29. package/test-fixtures/sanitize-vocabulary-source-codes/v01/expectedResult.json +12 -0
  30. package/test-fixtures/sanitize-vocabulary-source-codes/v01/metadata.json +6 -0
  31. package/test-fixtures/sanitize-vocabulary-source-codes/v01/record.json +24 -0
  32. package/test-fixtures/update-field-540/f01/expectedResult.json +23 -0
  33. package/test-fixtures/update-field-540/f01/metadata.json +6 -0
  34. package/test-fixtures/update-field-540/f01/record.json +23 -0
  35. package/test-fixtures/update-field-540/v01/expectedResult.json +7 -0
  36. package/test-fixtures/update-field-540/v01/metadata.json +6 -0
  37. package/test-fixtures/update-field-540/v01/record.json +23 -0
package/dist/index.js CHANGED
@@ -117,6 +117,12 @@ Object.defineProperty(exports, "ResolveOrphanedSubfield6s", {
117
117
  return _resolveOrphanedSubfield6s.default;
118
118
  }
119
119
  });
120
+ Object.defineProperty(exports, "SanitizeVocabularySourceCodes", {
121
+ enumerable: true,
122
+ get: function () {
123
+ return _sanitizeVocabularySourceCodes.default;
124
+ }
125
+ });
120
126
  Object.defineProperty(exports, "SortTags", {
121
127
  enumerable: true,
122
128
  get: function () {
@@ -135,6 +141,12 @@ Object.defineProperty(exports, "UnicodeDecomposition", {
135
141
  return _unicodeDecomposition.default;
136
142
  }
137
143
  });
144
+ Object.defineProperty(exports, "UpdateField540", {
145
+ enumerable: true,
146
+ get: function () {
147
+ return _updateField.default;
148
+ }
149
+ });
138
150
  Object.defineProperty(exports, "Urn", {
139
151
  enumerable: true,
140
152
  get: function () {
@@ -160,6 +172,8 @@ var _punctuation = _interopRequireDefault(require("./punctuation/"));
160
172
  var _resolveOrphanedSubfield6s = _interopRequireDefault(require("./resolveOrphanedSubfield6s"));
161
173
  var _reindexSubfield6OccurenceNumbers = _interopRequireDefault(require("./reindexSubfield6OccurenceNumbers"));
162
174
  var _resolvableExtReferencesMelinda = _interopRequireDefault(require("./resolvable-ext-references-melinda"));
175
+ var _sanitizeVocabularySourceCodes = _interopRequireDefault(require("./sanitize-vocabulary-source-codes"));
176
+ var _updateField = _interopRequireDefault(require("./update-field-540"));
163
177
  var _sortTags = _interopRequireDefault(require("./sort-tags"));
164
178
  var _subfieldExclusion = _interopRequireDefault(require("./subfield-exclusion"));
165
179
  var _unicodeDecomposition = _interopRequireDefault(require("./unicode-decomposition"));
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["_accessRights","_interopRequireDefault","require","_doubleCommas","_duplicatesInd","_emptyFields","_endingPunctuation","_endingWhitespace","_fieldsPresent","_fieldStructure","_fixedFields","_fieldExclusion","_identicalFields","_isbnIssn","_itemLanguage","_nonBreakingSpace","_normalizeUtf8Diacritics","_punctuation","_resolveOrphanedSubfield6s","_reindexSubfield6OccurenceNumbers","_resolvableExtReferencesMelinda","_sortTags","_subfieldExclusion","_unicodeDecomposition","_urn","obj","__esModule","default"],"sources":["../src/index.js"],"sourcesContent":["import AccessRights from './access-rights';\nimport DoubleCommas from './double-commas';\nimport DuplicatesInd1 from './duplicates-ind1';\nimport EmptyFields from './empty-fields';\nimport EndingPunctuation from './ending-punctuation';\nimport EndingWhitespace from './ending-whitespace';\nimport FieldsPresent from './fields-present';\nimport FieldStructure from './field-structure';\nimport FixedFields from './fixed-fields';\nimport FieldExclusion from './field-exclusion';\nimport IdenticalFields from './identical-fields';\nimport IsbnIssn from './isbn-issn';\nimport ItemLanguage from './item-language';\nimport NonBreakingSpace from './non-breaking-space';\nimport NormalizeUTF8Diacritics from './normalize-utf8-diacritics';\nimport Punctuation from './punctuation/';\nimport ResolveOrphanedSubfield6s from './resolveOrphanedSubfield6s'; // Do this before reindexing!\nimport ReindexSubfield6OccurenceNumbers from './reindexSubfield6OccurenceNumbers';\nimport ResolvableExtReferences from './resolvable-ext-references-melinda';\n\nimport SortTags from './sort-tags';\nimport SubfieldExclusion from './subfield-exclusion';\nimport UnicodeDecomposition from './unicode-decomposition';\nimport Urn from './urn';\n\nexport {\n AccessRights,\n DoubleCommas,\n DuplicatesInd1,\n EmptyFields,\n EndingPunctuation,\n EndingWhitespace,\n FieldExclusion,\n FieldsPresent,\n FieldStructure,\n FixedFields,\n IdenticalFields,\n IsbnIssn,\n ItemLanguage,\n NonBreakingSpace,\n NormalizeUTF8Diacritics,\n Punctuation,\n ResolveOrphanedSubfield6s,\n ReindexSubfield6OccurenceNumbers,\n ResolvableExtReferences,\n SortTags,\n SubfieldExclusion,\n UnicodeDecomposition,\n Urn\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,aAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,aAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,cAAA,GAAAH,sBAAA,CAAAC,OAAA;AACA,IAAAG,YAAA,GAAAJ,sBAAA,CAAAC,OAAA;AACA,IAAAI,kBAAA,GAAAL,sBAAA,CAAAC,OAAA;AACA,IAAAK,iBAAA,GAAAN,sBAAA,CAAAC,OAAA;AACA,IAAAM,cAAA,GAAAP,sBAAA,CAAAC,OAAA;AACA,IAAAO,eAAA,GAAAR,sBAAA,CAAAC,OAAA;AACA,IAAAQ,YAAA,GAAAT,sBAAA,CAAAC,OAAA;AACA,IAAAS,eAAA,GAAAV,sBAAA,CAAAC,OAAA;AACA,IAAAU,gBAAA,GAAAX,sBAAA,CAAAC,OAAA;AACA,IAAAW,SAAA,GAAAZ,sBAAA,CAAAC,OAAA;AACA,IAAAY,aAAA,GAAAb,sBAAA,CAAAC,OAAA;AACA,IAAAa,iBAAA,GAAAd,sBAAA,CAAAC,OAAA;AACA,IAAAc,wBAAA,GAAAf,sBAAA,CAAAC,OAAA;AACA,IAAAe,YAAA,GAAAhB,sBAAA,CAAAC,OAAA;AACA,IAAAgB,0BAAA,GAAAjB,sBAAA,CAAAC,OAAA;AACA,IAAAiB,iCAAA,GAAAlB,sBAAA,CAAAC,OAAA;AACA,IAAAkB,+BAAA,GAAAnB,sBAAA,CAAAC,OAAA;AAEA,IAAAmB,SAAA,GAAApB,sBAAA,CAAAC,OAAA;AACA,IAAAoB,kBAAA,GAAArB,sBAAA,CAAAC,OAAA;AACA,IAAAqB,qBAAA,GAAAtB,sBAAA,CAAAC,OAAA;AACA,IAAAsB,IAAA,GAAAvB,sBAAA,CAAAC,OAAA;AAAwB,SAAAD,uBAAAwB,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA"}
1
+ {"version":3,"file":"index.js","names":["_accessRights","_interopRequireDefault","require","_doubleCommas","_duplicatesInd","_emptyFields","_endingPunctuation","_endingWhitespace","_fieldsPresent","_fieldStructure","_fixedFields","_fieldExclusion","_identicalFields","_isbnIssn","_itemLanguage","_nonBreakingSpace","_normalizeUtf8Diacritics","_punctuation","_resolveOrphanedSubfield6s","_reindexSubfield6OccurenceNumbers","_resolvableExtReferencesMelinda","_sanitizeVocabularySourceCodes","_updateField","_sortTags","_subfieldExclusion","_unicodeDecomposition","_urn","obj","__esModule","default"],"sources":["../src/index.js"],"sourcesContent":["import AccessRights from './access-rights';\nimport DoubleCommas from './double-commas';\nimport DuplicatesInd1 from './duplicates-ind1';\nimport EmptyFields from './empty-fields';\nimport EndingPunctuation from './ending-punctuation';\nimport EndingWhitespace from './ending-whitespace';\nimport FieldsPresent from './fields-present';\nimport FieldStructure from './field-structure';\nimport FixedFields from './fixed-fields';\nimport FieldExclusion from './field-exclusion';\nimport IdenticalFields from './identical-fields';\nimport IsbnIssn from './isbn-issn';\nimport ItemLanguage from './item-language';\nimport NonBreakingSpace from './non-breaking-space';\nimport NormalizeUTF8Diacritics from './normalize-utf8-diacritics';\nimport Punctuation from './punctuation/';\nimport ResolveOrphanedSubfield6s from './resolveOrphanedSubfield6s'; // Do this before reindexing!\nimport ReindexSubfield6OccurenceNumbers from './reindexSubfield6OccurenceNumbers';\nimport ResolvableExtReferences from './resolvable-ext-references-melinda';\nimport SanitizeVocabularySourceCodes from './sanitize-vocabulary-source-codes';\nimport UpdateField540 from './update-field-540';\nimport SortTags from './sort-tags';\nimport SubfieldExclusion from './subfield-exclusion';\nimport UnicodeDecomposition from './unicode-decomposition';\nimport Urn from './urn';\n\nexport {\n AccessRights,\n DoubleCommas,\n DuplicatesInd1,\n EmptyFields,\n EndingPunctuation,\n EndingWhitespace,\n FieldExclusion,\n FieldsPresent,\n FieldStructure,\n FixedFields,\n IdenticalFields,\n IsbnIssn,\n ItemLanguage,\n NonBreakingSpace,\n NormalizeUTF8Diacritics,\n Punctuation,\n ResolveOrphanedSubfield6s,\n ReindexSubfield6OccurenceNumbers,\n ResolvableExtReferences,\n SanitizeVocabularySourceCodes,\n SortTags,\n SubfieldExclusion,\n UnicodeDecomposition,\n UpdateField540,\n Urn\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,aAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,aAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,cAAA,GAAAH,sBAAA,CAAAC,OAAA;AACA,IAAAG,YAAA,GAAAJ,sBAAA,CAAAC,OAAA;AACA,IAAAI,kBAAA,GAAAL,sBAAA,CAAAC,OAAA;AACA,IAAAK,iBAAA,GAAAN,sBAAA,CAAAC,OAAA;AACA,IAAAM,cAAA,GAAAP,sBAAA,CAAAC,OAAA;AACA,IAAAO,eAAA,GAAAR,sBAAA,CAAAC,OAAA;AACA,IAAAQ,YAAA,GAAAT,sBAAA,CAAAC,OAAA;AACA,IAAAS,eAAA,GAAAV,sBAAA,CAAAC,OAAA;AACA,IAAAU,gBAAA,GAAAX,sBAAA,CAAAC,OAAA;AACA,IAAAW,SAAA,GAAAZ,sBAAA,CAAAC,OAAA;AACA,IAAAY,aAAA,GAAAb,sBAAA,CAAAC,OAAA;AACA,IAAAa,iBAAA,GAAAd,sBAAA,CAAAC,OAAA;AACA,IAAAc,wBAAA,GAAAf,sBAAA,CAAAC,OAAA;AACA,IAAAe,YAAA,GAAAhB,sBAAA,CAAAC,OAAA;AACA,IAAAgB,0BAAA,GAAAjB,sBAAA,CAAAC,OAAA;AACA,IAAAiB,iCAAA,GAAAlB,sBAAA,CAAAC,OAAA;AACA,IAAAkB,+BAAA,GAAAnB,sBAAA,CAAAC,OAAA;AACA,IAAAmB,8BAAA,GAAApB,sBAAA,CAAAC,OAAA;AACA,IAAAoB,YAAA,GAAArB,sBAAA,CAAAC,OAAA;AACA,IAAAqB,SAAA,GAAAtB,sBAAA,CAAAC,OAAA;AACA,IAAAsB,kBAAA,GAAAvB,sBAAA,CAAAC,OAAA;AACA,IAAAuB,qBAAA,GAAAxB,sBAAA,CAAAC,OAAA;AACA,IAAAwB,IAAA,GAAAzB,sBAAA,CAAAC,OAAA;AAAwB,SAAAD,uBAAA0B,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA"}
@@ -5,15 +5,19 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = _default;
7
7
  exports.removeIndividualInferiorDatafields = removeIndividualInferiorDatafields;
8
+ exports.removeInferiorChains = removeInferiorChains;
8
9
  exports.removeInferiorDatafields = removeInferiorDatafields;
9
- exports.removeInferiorSubfield6Chains = removeInferiorSubfield6Chains;
10
10
  var _debug = _interopRequireDefault(require("debug"));
11
11
  var _removeDuplicateDataFields = require("./removeDuplicateDataFields");
12
12
  var _subfield6Utils = require("./subfield6Utils");
13
13
  var _utils = require("./utils");
14
+ var _subfield8Utils = require("./subfield8Utils");
14
15
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
16
  // Relocated from melinda-marc-record-merge-reducers (and renamed)
16
17
 
18
+ // NB! This validator handles only full fields, and does not support subfield $8 removal.
19
+ // Also, having multiple $8 subfields in same fields is not supported.
20
+ // If this functionality is needed, see removeDuplicateDatafields.js for examples of subfield-only stuff.
17
21
  const debug = (0, _debug.default)('@natlibfi/marc-record-validators-melinda:removeSubsetDataFields');
18
22
  function _default() {
19
23
  return {
@@ -43,12 +47,12 @@ function _default() {
43
47
  return res;
44
48
  }
45
49
  }
46
- function deriveInferiorSubfield6Chains(fields, record) {
50
+ function deriveInferiorChains(fields, record) {
47
51
  /* eslint-disable */
48
52
  let deletableStringsArray = [];
49
53
  (0, _utils.nvdebug)(`WP1: GOT ${fields.length} field(s) for potential deletable chain derivation`);
50
- fields.forEach(field => fieldDeriveSubfield6ChainDeletables(field));
51
- function fieldDeriveSubfield6ChainDeletables(field) {
54
+ fields.forEach(field => fieldDeriveChainDeletables(field));
55
+ function fieldDeriveChainDeletables(field) {
52
56
  const chain = (0, _removeDuplicateDataFields.fieldToChain)(field, record);
53
57
  if (chain.length === 0) {
54
58
  return;
@@ -56,13 +60,21 @@ function deriveInferiorSubfield6Chains(fields, record) {
56
60
  const chainAsString = (0, _subfield6Utils.fieldsToNormalizedString)(chain, 0, true, true);
57
61
  (0, _utils.nvdebug)(`666: ${chainAsString}`);
58
62
 
59
- // Fix MRA-476 (part 1): list inferior field chains as deletables
63
+ // Fix MRA-476 (part 1): one $6 value can be worse than the other
60
64
  let tmp = chainAsString;
61
65
  while (tmp.match(/ ‡6 [0-9X][0-9][0-9]-(?:XX|[0-9]+)\/[^ ]+/u)) {
62
66
  tmp = tmp.replace(/( ‡6 [0-9X][0-9][0-9]-(?:XX|[0-9]+))\/[^ ]+/u, '$1');
63
67
  (0, _utils.nvdebug)(`FFS: ${tmp}`);
64
68
  deletableStringsArray.push(tmp);
65
69
  }
70
+
71
+ // Remove keepless versions:
72
+ tmp = chainAsString;
73
+ while (tmp.match(/ ‡9 [A-Z]+<KEEP>/)) {
74
+ tmp = tmp.replace(/ ‡9 [A-Z]+<KEEP>/, '');
75
+ deletableStringsArray.push(tmp);
76
+ (0, _utils.nvdebug)(`FFS: ${tmp}`);
77
+ }
66
78
  }
67
79
 
68
80
  /* eslint-enable */
@@ -70,7 +82,7 @@ function deriveInferiorSubfield6Chains(fields, record) {
70
82
  }
71
83
  function isRelevantChain6(field, record) {
72
84
  (0, _utils.nvdebug)(`CHAIN?-WP1: ${(0, _utils.fieldToString)(field)}`);
73
- if (!(0, _subfield6Utils.fieldHasValidSubfield6)(field)) {
85
+ if (!(0, _subfield6Utils.fieldHasValidSubfield6)(field) && !(0, _subfield8Utils.fieldHasValidSubfield8)(field)) {
74
86
  return false;
75
87
  }
76
88
  (0, _utils.nvdebug)(`CHAIN?-WP2: ${(0, _utils.fieldToString)(field)}`);
@@ -78,7 +90,11 @@ function isRelevantChain6(field, record) {
78
90
  if (chain.length < 2) {
79
91
  return false;
80
92
  }
81
- (0, _utils.nvdebug)(`CHAIN?-WP3: ${(0, _utils.fieldToString)(field)}`);
93
+ (0, _utils.nvdebug)(`CHAIN?-WP4: ${(0, _utils.fieldToString)(field)}`);
94
+ if (chain.some(f => f.subfields.filter(sf => sf.code === '6').length > 1)) {
95
+ return false;
96
+ }
97
+ (0, _utils.nvdebug)(`CHAIN?-WP4: ${(0, _utils.fieldToString)(field)}`);
82
98
 
83
99
  /* eslint-disable */
84
100
  field.tmpInferiorId = 666;
@@ -87,27 +103,27 @@ function isRelevantChain6(field, record) {
87
103
  /* eslint-enable */
88
104
  return result;
89
105
  }
90
- function removeInferiorSubfield6Chains(record, fix = true) {
106
+ function removeInferiorChains(record, fix = true) {
91
107
  const fields = record.fields.filter(f => isRelevantChain6(f, record));
92
108
  (0, _utils.nvdebug)(`WP2.0: GOT ${fields.length} chain(s)`);
93
- const deletableSubfield6ChainsAsString = deriveInferiorSubfield6Chains(fields, record);
94
- (0, _utils.nvdebug)(`WP2: GOT ${deletableSubfield6ChainsAsString.length} chain(s)`);
95
- if (deletableSubfield6ChainsAsString.length === 0) {
109
+ const deletableChainsAsString = deriveInferiorChains(fields, record);
110
+ (0, _utils.nvdebug)(`WP2: GOT ${deletableChainsAsString.length} chain(s)`);
111
+ if (deletableChainsAsString.length === 0) {
96
112
  return [];
97
113
  }
98
- (0, _utils.nvdebug)(`removeInferiorSubfield6Chains() has ${fields.length} fields-in-chain(s), and a list of ${deletableSubfield6ChainsAsString.length} deletable(s)`);
114
+ (0, _utils.nvdebug)(`removeInferiorChains() has ${fields.length} fields-in-chain(s), and a list of ${deletableChainsAsString.length} deletable(s)`);
99
115
 
100
116
  /* eslint-disable */
101
117
 
102
118
  let deletedStringsArray = [];
103
- fields.forEach(f => innerRemoveInferiorSubfield6Chain(f));
104
- function innerRemoveInferiorSubfield6Chain(field) {
119
+ fields.forEach(f => innerRemoveInferiorChain(f));
120
+ function innerRemoveInferiorChain(field) {
105
121
  const chain = (0, _removeDuplicateDataFields.fieldToChain)(field, record);
106
122
  if (chain.length === 0 || !(0, _removeDuplicateDataFields.sameField)(field, chain[0])) {
107
123
  return;
108
124
  }
109
125
  const chainAsString = (0, _subfield6Utils.fieldsToNormalizedString)(chain, 0, true, true);
110
- if (deletableSubfield6ChainsAsString.includes(chainAsString)) {
126
+ if (deletableChainsAsString.includes(chainAsString)) {
111
127
  (0, _utils.nvdebug)(`iRIS6C: ${chainAsString}`);
112
128
  const deletedString = (0, _utils.fieldsToString)(chain);
113
129
  deletedStringsArray.push(`DEL: ${deletedString}`);
@@ -169,7 +185,7 @@ function removeIndividualInferiorDatafields(record, fix = true) {
169
185
  function removeInferiorDatafields(record, fix = true) {
170
186
  const removables = removeIndividualInferiorDatafields(record, fix); // Lone fields
171
187
  //const removables8 = removeDuplicateSubfield8Chains(record, fix); // Lone subfield $8 chains
172
- const removables6 = removeInferiorSubfield6Chains(record, fix); // Lone subfield $6 chains
188
+ const removables6 = removeInferiorChains(record, fix); // Lone subfield $6 chains
173
189
  // HOW TO HANDLE $6+$8 combos?
174
190
 
175
191
  (0, _utils.nvdebug)(`REMOVABLES:\n ${removables.join('\n ')}`);
@@ -1 +1 @@
1
- {"version":3,"file":"removeInferiorDataFields.js","names":["_debug","_interopRequireDefault","require","_removeDuplicateDataFields","_subfield6Utils","_utils","obj","__esModule","default","debug","createDebugLogger","_default","description","validate","fix","record","nvdebug","res","message","valid","removeInferiorDatafields","duplicates","length","deriveInferiorSubfield6Chains","fields","deletableStringsArray","forEach","field","fieldDeriveSubfield6ChainDeletables","chain","fieldToChain","chainAsString","fieldsToNormalizedString","tmp","match","replace","push","isRelevantChain6","fieldToString","fieldHasValidSubfield6","tmpInferiorId","result","removeInferiorSubfield6Chains","filter","f","deletableSubfield6ChainsAsString","deletedStringsArray","innerRemoveInferiorSubfield6Chain","sameField","includes","deletedString","fieldsToString","currField","removeField","deriveIndividualDeletables","fieldDeriveIndividualDeletables","fieldAsString","tag","removeIndividualInferiorDatafields","deletableFieldsAsStrings","hits","isDeletableField","deletedFieldsAsStrings","map","removables","removables6","join","removablesAll","concat"],"sources":["../src/removeInferiorDataFields.js"],"sourcesContent":["import createDebugLogger from 'debug';\nimport {fieldToChain, sameField} from './removeDuplicateDataFields';\nimport {fieldHasValidSubfield6, fieldsToNormalizedString} from './subfield6Utils';\nimport {fieldsToString, fieldToString, nvdebug} from './utils';\n\n// Relocated from melinda-marc-record-merge-reducers (and renamed)\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:removeSubsetDataFields');\n\nexport default function () {\n return {\n description: 'Remove subset data fields. Certain exceptions apply, mainly too complited chained fields',\n validate, fix\n };\n\n function fix(record) {\n nvdebug('Fix record: remove subset data fields', debug);\n const res = {message: [], fix: [], valid: true};\n removeInferiorDatafields(record, true);\n // This can not really fail...\n return res;\n }\n\n function validate(record) {\n // Check max, and check number of different indexes\n nvdebug('Validate record: remove subset data fields', debug);\n\n const duplicates = removeInferiorDatafields(record, false);\n\n const res = {message: duplicates};\n\n res.valid = res.message.length < 1; // eslint-disable-line functional/immutable-data\n return res;\n }\n}\n\n\nfunction deriveInferiorSubfield6Chains(fields, record) {\n /* eslint-disable */\n let deletableStringsArray = [];\n\n nvdebug(`WP1: GOT ${fields.length} field(s) for potential deletable chain derivation`);\n fields.forEach(field => fieldDeriveSubfield6ChainDeletables(field));\n\n function fieldDeriveSubfield6ChainDeletables(field) {\n const chain = fieldToChain(field, record);\n if (chain.length === 0) {\n return;\n }\n const chainAsString = fieldsToNormalizedString(chain, 0, true, true);\n\n nvdebug(`666: ${chainAsString}`);\n\n // Fix MRA-476 (part 1): list inferior field chains as deletables \n let tmp = chainAsString;\n while (tmp.match(/ ‡6 [0-9X][0-9][0-9]-(?:XX|[0-9]+)\\/[^ ]+/u)) {\n tmp = tmp.replace(/( ‡6 [0-9X][0-9][0-9]-(?:XX|[0-9]+))\\/[^ ]+/u, '$1');\n nvdebug(`FFS: ${tmp}`);\n\n deletableStringsArray.push(tmp);\n }\n }\n\n\n /* eslint-enable */\n return deletableStringsArray;\n}\n\nfunction isRelevantChain6(field, record) {\n nvdebug(`CHAIN?-WP1: ${fieldToString(field)}`);\n if (!fieldHasValidSubfield6(field)) {\n return false;\n }\n nvdebug(`CHAIN?-WP2: ${fieldToString(field)}`);\n const chain = fieldToChain(field, record);\n if (chain.length < 2) {\n return false;\n }\n nvdebug(`CHAIN?-WP3: ${fieldToString(field)}`);\n\n /* eslint-disable */\n field.tmpInferiorId = 666;\n const result = chain[0].tmpInferiorId === 666 ? true : false;\n delete field.tmpInferiorId;\n /* eslint-enable */\n return result;\n}\n\nexport function removeInferiorSubfield6Chains(record, fix = true) {\n const fields = record.fields.filter(f => isRelevantChain6(f, record));\n nvdebug(`WP2.0: GOT ${fields.length} chain(s)`);\n\n const deletableSubfield6ChainsAsString = deriveInferiorSubfield6Chains(fields, record);\n nvdebug(`WP2: GOT ${deletableSubfield6ChainsAsString.length} chain(s)`);\n if (deletableSubfield6ChainsAsString.length === 0) {\n return [];\n }\n\n nvdebug(`removeInferiorSubfield6Chains() has ${fields.length} fields-in-chain(s), and a list of ${deletableSubfield6ChainsAsString.length} deletable(s)`);\n\n\n /* eslint-disable */\n\n let deletedStringsArray = [];\n fields.forEach(f => innerRemoveInferiorSubfield6Chain(f));\n\n\n function innerRemoveInferiorSubfield6Chain(field) {\n const chain = fieldToChain(field, record);\n if (chain.length === 0 || !sameField(field, chain[0])) {\n return;\n }\n const chainAsString = fieldsToNormalizedString(chain, 0, true, true);\n if (deletableSubfield6ChainsAsString.includes(chainAsString)) {\n nvdebug(`iRIS6C: ${chainAsString}`);\n const deletedString = fieldsToString(chain);\n deletedStringsArray.push(`DEL: ${deletedString}`);\n if (fix) {\n nvdebug(`INFERIOR $6 CHAIN REMOVAL: REMOVE ${deletedString}`, debug);\n chain.forEach(currField => record.removeField(currField));\n }\n }\n }\n\n /* eslint-enable */\n return deletedStringsArray;\n}\n\nfunction deriveIndividualDeletables(record) {\n /* eslint-disable */\n let deletableStringsArray = [];\n\n record.fields.forEach(field => fieldDeriveIndividualDeletables(field));\n\n function fieldDeriveIndividualDeletables(field) {\n const fieldAsString = fieldToString(field);\n\n // Proof-of-concept rule:\n let tmp = fieldAsString;\n if (field.tag.match(/^[1678]00$/u)) {\n while (tmp.match(/, ‡e [^‡]+\\.$/)) {\n tmp = tmp.replace(/, ‡e [^‡]+\\.$/, '.');\n deletableStringsArray.push(tmp);\n }\n }\n\n\n // Remove keepless versions:\n tmp = fieldAsString;\n while (tmp.match(/ ‡9 [A-Z]+<KEEP>/)) {\n tmp = tmp.replace(/ ‡9 [A-Z]+<KEEP>/, '');\n deletableStringsArray.push(tmp);\n }\n }\n /* eslint-enable */\n return deletableStringsArray; // we should do uniq!\n\n}\n\n\nexport function removeIndividualInferiorDatafields(record, fix = true) { // No $6 nor $8 in field\n const deletableFieldsAsStrings = deriveIndividualDeletables(record);\n const hits = record.fields.filter(field => isDeletableField(field));\n\n const deletedFieldsAsStrings = hits.map(f => fieldToString(f));\n\n if (fix) { // eslint-disable-line functional/no-conditional-statements\n hits.forEach(field => {\n nvdebug(`Remove inferior field: ${fieldToString(field)}`);\n record.removeField(field);\n });\n }\n\n return deletedFieldsAsStrings;\n\n function isDeletableField(field) {\n const fieldAsString = fieldToString(field);\n return deletableFieldsAsStrings.includes(fieldAsString);\n }\n}\n\n\nexport function removeInferiorDatafields(record, fix = true) {\n const removables = removeIndividualInferiorDatafields(record, fix); // Lone fields\n //const removables8 = removeDuplicateSubfield8Chains(record, fix); // Lone subfield $8 chains\n const removables6 = removeInferiorSubfield6Chains(record, fix); // Lone subfield $6 chains\n // HOW TO HANDLE $6+$8 combos?\n\n nvdebug(`REMOVABLES:\\n ${removables.join('\\n ')}`);\n nvdebug(`REMOVABLES 6:\\n ${removables6.join('\\n ')}`);\n\n const removablesAll = removables.concat(removables6); //.concat(removables8);\n\n return removablesAll;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"removeInferiorDataFields.js","names":["_debug","_interopRequireDefault","require","_removeDuplicateDataFields","_subfield6Utils","_utils","_subfield8Utils","obj","__esModule","default","debug","createDebugLogger","_default","description","validate","fix","record","nvdebug","res","message","valid","removeInferiorDatafields","duplicates","length","deriveInferiorChains","fields","deletableStringsArray","forEach","field","fieldDeriveChainDeletables","chain","fieldToChain","chainAsString","fieldsToNormalizedString","tmp","match","replace","push","isRelevantChain6","fieldToString","fieldHasValidSubfield6","fieldHasValidSubfield8","some","f","subfields","filter","sf","code","tmpInferiorId","result","removeInferiorChains","deletableChainsAsString","deletedStringsArray","innerRemoveInferiorChain","sameField","includes","deletedString","fieldsToString","currField","removeField","deriveIndividualDeletables","fieldDeriveIndividualDeletables","fieldAsString","tag","removeIndividualInferiorDatafields","deletableFieldsAsStrings","hits","isDeletableField","deletedFieldsAsStrings","map","removables","removables6","join","removablesAll","concat"],"sources":["../src/removeInferiorDataFields.js"],"sourcesContent":["import createDebugLogger from 'debug';\nimport {fieldToChain, sameField} from './removeDuplicateDataFields';\nimport {fieldHasValidSubfield6, fieldsToNormalizedString} from './subfield6Utils';\nimport {fieldsToString, fieldToString, nvdebug} from './utils';\nimport {fieldHasValidSubfield8} from './subfield8Utils';\n\n// Relocated from melinda-marc-record-merge-reducers (and renamed)\n\n// NB! This validator handles only full fields, and does not support subfield $8 removal.\n// Also, having multiple $8 subfields in same fields is not supported.\n// If this functionality is needed, see removeDuplicateDatafields.js for examples of subfield-only stuff.\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:removeSubsetDataFields');\n\nexport default function () {\n return {\n description: 'Remove subset data fields. Certain exceptions apply, mainly too complited chained fields',\n validate, fix\n };\n\n function fix(record) {\n nvdebug('Fix record: remove subset data fields', debug);\n const res = {message: [], fix: [], valid: true};\n removeInferiorDatafields(record, true);\n // This can not really fail...\n return res;\n }\n\n function validate(record) {\n // Check max, and check number of different indexes\n nvdebug('Validate record: remove subset data fields', debug);\n\n const duplicates = removeInferiorDatafields(record, false);\n\n const res = {message: duplicates};\n\n res.valid = res.message.length < 1; // eslint-disable-line functional/immutable-data\n return res;\n }\n}\n\n\nfunction deriveInferiorChains(fields, record) {\n /* eslint-disable */\n let deletableStringsArray = [];\n\n nvdebug(`WP1: GOT ${fields.length} field(s) for potential deletable chain derivation`);\n fields.forEach(field => fieldDeriveChainDeletables(field));\n\n function fieldDeriveChainDeletables(field) {\n const chain = fieldToChain(field, record);\n if (chain.length === 0) {\n return;\n }\n const chainAsString = fieldsToNormalizedString(chain, 0, true, true);\n\n nvdebug(`666: ${chainAsString}`);\n\n // Fix MRA-476 (part 1): one $6 value can be worse than the other\n let tmp = chainAsString;\n while (tmp.match(/ ‡6 [0-9X][0-9][0-9]-(?:XX|[0-9]+)\\/[^ ]+/u)) {\n tmp = tmp.replace(/( ‡6 [0-9X][0-9][0-9]-(?:XX|[0-9]+))\\/[^ ]+/u, '$1');\n nvdebug(`FFS: ${tmp}`);\n\n deletableStringsArray.push(tmp);\n }\n\n // Remove keepless versions:\n tmp = chainAsString;\n while (tmp.match(/ ‡9 [A-Z]+<KEEP>/)) {\n tmp = tmp.replace(/ ‡9 [A-Z]+<KEEP>/, '');\n deletableStringsArray.push(tmp);\n nvdebug(`FFS: ${tmp}`);\n }\n }\n\n\n /* eslint-enable */\n return deletableStringsArray;\n}\n\nfunction isRelevantChain6(field, record) {\n nvdebug(`CHAIN?-WP1: ${fieldToString(field)}`);\n if (!fieldHasValidSubfield6(field) && !fieldHasValidSubfield8(field)) {\n return false;\n }\n nvdebug(`CHAIN?-WP2: ${fieldToString(field)}`);\n const chain = fieldToChain(field, record);\n if (chain.length < 2) {\n return false;\n }\n nvdebug(`CHAIN?-WP4: ${fieldToString(field)}`);\n if (chain.some(f => f.subfields.filter(sf => sf.code === '6').length > 1)) {\n return false;\n }\n nvdebug(`CHAIN?-WP4: ${fieldToString(field)}`);\n\n /* eslint-disable */\n field.tmpInferiorId = 666;\n const result = chain[0].tmpInferiorId === 666 ? true : false;\n delete field.tmpInferiorId;\n /* eslint-enable */\n return result;\n}\n\nexport function removeInferiorChains(record, fix = true) {\n const fields = record.fields.filter(f => isRelevantChain6(f, record));\n nvdebug(`WP2.0: GOT ${fields.length} chain(s)`);\n\n const deletableChainsAsString = deriveInferiorChains(fields, record);\n nvdebug(`WP2: GOT ${deletableChainsAsString.length} chain(s)`);\n if (deletableChainsAsString.length === 0) {\n return [];\n }\n\n nvdebug(`removeInferiorChains() has ${fields.length} fields-in-chain(s), and a list of ${deletableChainsAsString.length} deletable(s)`);\n\n\n /* eslint-disable */\n\n let deletedStringsArray = [];\n fields.forEach(f => innerRemoveInferiorChain(f));\n\n\n function innerRemoveInferiorChain(field) {\n const chain = fieldToChain(field, record);\n if (chain.length === 0 || !sameField(field, chain[0])) {\n return;\n }\n const chainAsString = fieldsToNormalizedString(chain, 0, true, true);\n if (deletableChainsAsString.includes(chainAsString)) {\n nvdebug(`iRIS6C: ${chainAsString}`);\n const deletedString = fieldsToString(chain);\n deletedStringsArray.push(`DEL: ${deletedString}`);\n if (fix) {\n nvdebug(`INFERIOR $6 CHAIN REMOVAL: REMOVE ${deletedString}`, debug);\n chain.forEach(currField => record.removeField(currField));\n }\n }\n }\n\n /* eslint-enable */\n return deletedStringsArray;\n}\n\nfunction deriveIndividualDeletables(record) {\n /* eslint-disable */\n let deletableStringsArray = [];\n\n record.fields.forEach(field => fieldDeriveIndividualDeletables(field));\n\n function fieldDeriveIndividualDeletables(field) {\n const fieldAsString = fieldToString(field);\n\n // Proof-of-concept rule:\n let tmp = fieldAsString;\n if (field.tag.match(/^[1678]00$/u)) {\n while (tmp.match(/, ‡e [^‡]+\\.$/)) {\n tmp = tmp.replace(/, ‡e [^‡]+\\.$/, '.');\n deletableStringsArray.push(tmp);\n }\n }\n\n\n // Remove keepless versions:\n tmp = fieldAsString;\n while (tmp.match(/ ‡9 [A-Z]+<KEEP>/)) {\n tmp = tmp.replace(/ ‡9 [A-Z]+<KEEP>/, '');\n deletableStringsArray.push(tmp);\n }\n }\n /* eslint-enable */\n return deletableStringsArray; // we should do uniq!\n\n}\n\n\nexport function removeIndividualInferiorDatafields(record, fix = true) { // No $6 nor $8 in field\n const deletableFieldsAsStrings = deriveIndividualDeletables(record);\n const hits = record.fields.filter(field => isDeletableField(field));\n\n const deletedFieldsAsStrings = hits.map(f => fieldToString(f));\n\n if (fix) { // eslint-disable-line functional/no-conditional-statements\n hits.forEach(field => {\n nvdebug(`Remove inferior field: ${fieldToString(field)}`);\n record.removeField(field);\n });\n }\n\n return deletedFieldsAsStrings;\n\n function isDeletableField(field) {\n const fieldAsString = fieldToString(field);\n return deletableFieldsAsStrings.includes(fieldAsString);\n }\n}\n\n\nexport function removeInferiorDatafields(record, fix = true) {\n const removables = removeIndividualInferiorDatafields(record, fix); // Lone fields\n //const removables8 = removeDuplicateSubfield8Chains(record, fix); // Lone subfield $8 chains\n const removables6 = removeInferiorChains(record, fix); // Lone subfield $6 chains\n // HOW TO HANDLE $6+$8 combos?\n\n nvdebug(`REMOVABLES:\\n ${removables.join('\\n ')}`);\n nvdebug(`REMOVABLES 6:\\n ${removables6.join('\\n ')}`);\n\n const removablesAll = removables.concat(removables6); //.concat(removables8);\n\n return removablesAll;\n}\n"],"mappings":";;;;;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,0BAAA,GAAAD,OAAA;AACA,IAAAE,eAAA,GAAAF,OAAA;AACA,IAAAG,MAAA,GAAAH,OAAA;AACA,IAAAI,eAAA,GAAAJ,OAAA;AAAwD,SAAAD,uBAAAM,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAExD;;AAEA;AACA;AACA;AACA,MAAMG,KAAK,GAAG,IAAAC,cAAiB,EAAC,iEAAiE,CAAC;AAEnF,SAAAC,SAAA,EAAY;EACzB,OAAO;IACLC,WAAW,EAAE,0FAA0F;IACvGC,QAAQ;IAAEC;EACZ,CAAC;EAED,SAASA,GAAGA,CAACC,MAAM,EAAE;IACnB,IAAAC,cAAO,EAAC,uCAAuC,EAAEP,KAAK,CAAC;IACvD,MAAMQ,GAAG,GAAG;MAACC,OAAO,EAAE,EAAE;MAAEJ,GAAG,EAAE,EAAE;MAAEK,KAAK,EAAE;IAAI,CAAC;IAC/CC,wBAAwB,CAACL,MAAM,EAAE,IAAI,CAAC;IACtC;IACA,OAAOE,GAAG;EACZ;EAEA,SAASJ,QAAQA,CAACE,MAAM,EAAE;IACxB;IACA,IAAAC,cAAO,EAAC,4CAA4C,EAAEP,KAAK,CAAC;IAE5D,MAAMY,UAAU,GAAGD,wBAAwB,CAACL,MAAM,EAAE,KAAK,CAAC;IAE1D,MAAME,GAAG,GAAG;MAACC,OAAO,EAAEG;IAAU,CAAC;IAEjCJ,GAAG,CAACE,KAAK,GAAGF,GAAG,CAACC,OAAO,CAACI,MAAM,GAAG,CAAC,CAAC,CAAC;IACpC,OAAOL,GAAG;EACZ;AACF;AAGA,SAASM,oBAAoBA,CAACC,MAAM,EAAET,MAAM,EAAE;EAC5C;EACA,IAAIU,qBAAqB,GAAG,EAAE;EAE9B,IAAAT,cAAO,EAAE,YAAWQ,MAAM,CAACF,MAAO,oDAAmD,CAAC;EACtFE,MAAM,CAACE,OAAO,CAACC,KAAK,IAAIC,0BAA0B,CAACD,KAAK,CAAC,CAAC;EAE1D,SAASC,0BAA0BA,CAACD,KAAK,EAAE;IACzC,MAAME,KAAK,GAAG,IAAAC,uCAAY,EAACH,KAAK,EAAEZ,MAAM,CAAC;IACzC,IAAIc,KAAK,CAACP,MAAM,KAAK,CAAC,EAAE;MACtB;IACF;IACA,MAAMS,aAAa,GAAG,IAAAC,wCAAwB,EAACH,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC;IAEpE,IAAAb,cAAO,EAAE,QAAOe,aAAc,EAAC,CAAC;;IAEhC;IACA,IAAIE,GAAG,GAAGF,aAAa;IACvB,OAAOE,GAAG,CAACC,KAAK,CAAC,4CAA4C,CAAC,EAAE;MAC9DD,GAAG,GAAGA,GAAG,CAACE,OAAO,CAAC,8CAA8C,EAAE,IAAI,CAAC;MACvE,IAAAnB,cAAO,EAAE,QAAOiB,GAAI,EAAC,CAAC;MAEtBR,qBAAqB,CAACW,IAAI,CAACH,GAAG,CAAC;IACjC;;IAEA;IACAA,GAAG,GAAGF,aAAa;IACnB,OAAOE,GAAG,CAACC,KAAK,CAAC,kBAAkB,CAAC,EAAE;MACpCD,GAAG,GAAGA,GAAG,CAACE,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;MACzCV,qBAAqB,CAACW,IAAI,CAACH,GAAG,CAAC;MAC/B,IAAAjB,cAAO,EAAE,QAAOiB,GAAI,EAAC,CAAC;IACxB;EACF;;EAGA;EACA,OAAOR,qBAAqB;AAC9B;AAEA,SAASY,gBAAgBA,CAACV,KAAK,EAAEZ,MAAM,EAAE;EACvC,IAAAC,cAAO,EAAE,eAAc,IAAAsB,oBAAa,EAACX,KAAK,CAAE,EAAC,CAAC;EAC9C,IAAI,CAAC,IAAAY,sCAAsB,EAACZ,KAAK,CAAC,IAAI,CAAC,IAAAa,sCAAsB,EAACb,KAAK,CAAC,EAAE;IACpE,OAAO,KAAK;EACd;EACA,IAAAX,cAAO,EAAE,eAAc,IAAAsB,oBAAa,EAACX,KAAK,CAAE,EAAC,CAAC;EAC9C,MAAME,KAAK,GAAG,IAAAC,uCAAY,EAACH,KAAK,EAAEZ,MAAM,CAAC;EACzC,IAAIc,KAAK,CAACP,MAAM,GAAG,CAAC,EAAE;IACpB,OAAO,KAAK;EACd;EACA,IAAAN,cAAO,EAAE,eAAc,IAAAsB,oBAAa,EAACX,KAAK,CAAE,EAAC,CAAC;EAC9C,IAAIE,KAAK,CAACY,IAAI,CAACC,CAAC,IAAIA,CAAC,CAACC,SAAS,CAACC,MAAM,CAACC,EAAE,IAAIA,EAAE,CAACC,IAAI,KAAK,GAAG,CAAC,CAACxB,MAAM,GAAG,CAAC,CAAC,EAAE;IACzE,OAAO,KAAK;EACd;EACA,IAAAN,cAAO,EAAE,eAAc,IAAAsB,oBAAa,EAACX,KAAK,CAAE,EAAC,CAAC;;EAE9C;EACAA,KAAK,CAACoB,aAAa,GAAG,GAAG;EACzB,MAAMC,MAAM,GAAGnB,KAAK,CAAC,CAAC,CAAC,CAACkB,aAAa,KAAK,GAAG,GAAG,IAAI,GAAG,KAAK;EAC5D,OAAOpB,KAAK,CAACoB,aAAa;EAC1B;EACA,OAAOC,MAAM;AACf;AAEO,SAASC,oBAAoBA,CAAClC,MAAM,EAAED,GAAG,GAAG,IAAI,EAAE;EACvD,MAAMU,MAAM,GAAGT,MAAM,CAACS,MAAM,CAACoB,MAAM,CAACF,CAAC,IAAIL,gBAAgB,CAACK,CAAC,EAAE3B,MAAM,CAAC,CAAC;EACrE,IAAAC,cAAO,EAAE,cAAaQ,MAAM,CAACF,MAAO,WAAU,CAAC;EAE/C,MAAM4B,uBAAuB,GAAG3B,oBAAoB,CAACC,MAAM,EAAET,MAAM,CAAC;EACpE,IAAAC,cAAO,EAAE,YAAWkC,uBAAuB,CAAC5B,MAAO,WAAU,CAAC;EAC9D,IAAI4B,uBAAuB,CAAC5B,MAAM,KAAK,CAAC,EAAE;IACxC,OAAO,EAAE;EACX;EAEA,IAAAN,cAAO,EAAE,8BAA6BQ,MAAM,CAACF,MAAO,sCAAqC4B,uBAAuB,CAAC5B,MAAO,eAAc,CAAC;;EAGvI;;EAEA,IAAI6B,mBAAmB,GAAG,EAAE;EAC5B3B,MAAM,CAACE,OAAO,CAACgB,CAAC,IAAIU,wBAAwB,CAACV,CAAC,CAAC,CAAC;EAGhD,SAASU,wBAAwBA,CAACzB,KAAK,EAAE;IACvC,MAAME,KAAK,GAAG,IAAAC,uCAAY,EAACH,KAAK,EAAEZ,MAAM,CAAC;IACzC,IAAIc,KAAK,CAACP,MAAM,KAAK,CAAC,IAAI,CAAC,IAAA+B,oCAAS,EAAC1B,KAAK,EAAEE,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;MACrD;IACF;IACA,MAAME,aAAa,GAAG,IAAAC,wCAAwB,EAACH,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC;IACpE,IAAIqB,uBAAuB,CAACI,QAAQ,CAACvB,aAAa,CAAC,EAAE;MACnD,IAAAf,cAAO,EAAE,WAAUe,aAAc,EAAC,CAAC;MACnC,MAAMwB,aAAa,GAAG,IAAAC,qBAAc,EAAC3B,KAAK,CAAC;MAC3CsB,mBAAmB,CAACf,IAAI,CAAE,QAAOmB,aAAc,EAAC,CAAC;MACjD,IAAIzC,GAAG,EAAE;QACP,IAAAE,cAAO,EAAE,qCAAoCuC,aAAc,EAAC,EAAE9C,KAAK,CAAC;QACpEoB,KAAK,CAACH,OAAO,CAAC+B,SAAS,IAAI1C,MAAM,CAAC2C,WAAW,CAACD,SAAS,CAAC,CAAC;MAC3D;IACF;EACF;;EAEA;EACA,OAAON,mBAAmB;AAC5B;AAEA,SAASQ,0BAA0BA,CAAC5C,MAAM,EAAE;EAC1C;EACA,IAAIU,qBAAqB,GAAG,EAAE;EAE9BV,MAAM,CAACS,MAAM,CAACE,OAAO,CAACC,KAAK,IAAIiC,+BAA+B,CAACjC,KAAK,CAAC,CAAC;EAEtE,SAASiC,+BAA+BA,CAACjC,KAAK,EAAE;IAC9C,MAAMkC,aAAa,GAAG,IAAAvB,oBAAa,EAACX,KAAK,CAAC;;IAE1C;IACA,IAAIM,GAAG,GAAG4B,aAAa;IACvB,IAAIlC,KAAK,CAACmC,GAAG,CAAC5B,KAAK,CAAC,aAAa,CAAC,EAAE;MAClC,OAAOD,GAAG,CAACC,KAAK,CAAC,eAAe,CAAC,EAAE;QACjCD,GAAG,GAAGA,GAAG,CAACE,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC;QACvCV,qBAAqB,CAACW,IAAI,CAACH,GAAG,CAAC;MACjC;IACF;;IAGA;IACAA,GAAG,GAAG4B,aAAa;IACnB,OAAO5B,GAAG,CAACC,KAAK,CAAC,kBAAkB,CAAC,EAAE;MACpCD,GAAG,GAAGA,GAAG,CAACE,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;MACzCV,qBAAqB,CAACW,IAAI,CAACH,GAAG,CAAC;IACjC;EACF;EACA;EACA,OAAOR,qBAAqB,CAAC,CAAC;AAEhC;;AAGO,SAASsC,kCAAkCA,CAAChD,MAAM,EAAED,GAAG,GAAG,IAAI,EAAE;EAAE;EACvE,MAAMkD,wBAAwB,GAAGL,0BAA0B,CAAC5C,MAAM,CAAC;EACnE,MAAMkD,IAAI,GAAGlD,MAAM,CAACS,MAAM,CAACoB,MAAM,CAACjB,KAAK,IAAIuC,gBAAgB,CAACvC,KAAK,CAAC,CAAC;EAEnE,MAAMwC,sBAAsB,GAAGF,IAAI,CAACG,GAAG,CAAC1B,CAAC,IAAI,IAAAJ,oBAAa,EAACI,CAAC,CAAC,CAAC;EAE9D,IAAI5B,GAAG,EAAE;IAAE;IACTmD,IAAI,CAACvC,OAAO,CAACC,KAAK,IAAI;MACpB,IAAAX,cAAO,EAAE,0BAAyB,IAAAsB,oBAAa,EAACX,KAAK,CAAE,EAAC,CAAC;MACzDZ,MAAM,CAAC2C,WAAW,CAAC/B,KAAK,CAAC;IAC3B,CAAC,CAAC;EACJ;EAEA,OAAOwC,sBAAsB;EAE7B,SAASD,gBAAgBA,CAACvC,KAAK,EAAE;IAC/B,MAAMkC,aAAa,GAAG,IAAAvB,oBAAa,EAACX,KAAK,CAAC;IAC1C,OAAOqC,wBAAwB,CAACV,QAAQ,CAACO,aAAa,CAAC;EACzD;AACF;AAGO,SAASzC,wBAAwBA,CAACL,MAAM,EAAED,GAAG,GAAG,IAAI,EAAE;EAC3D,MAAMuD,UAAU,GAAGN,kCAAkC,CAAChD,MAAM,EAAED,GAAG,CAAC,CAAC,CAAC;EACpE;EACA,MAAMwD,WAAW,GAAGrB,oBAAoB,CAAClC,MAAM,EAAED,GAAG,CAAC,CAAC,CAAC;EACvD;;EAEA,IAAAE,cAAO,EAAE,kBAAiBqD,UAAU,CAACE,IAAI,CAAC,MAAM,CAAE,EAAC,CAAC;EACpD,IAAAvD,cAAO,EAAE,oBAAmBsD,WAAW,CAACC,IAAI,CAAC,MAAM,CAAE,EAAC,CAAC;EAEvD,MAAMC,aAAa,GAAGH,UAAU,CAACI,MAAM,CAACH,WAAW,CAAC,CAAC,CAAC;;EAEtD,OAAOE,aAAa;AACtB"}
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = _default;
7
+ var _utils = require("./utils");
8
+ //import createDebugLogger from 'debug';
9
+
10
+ //const debug = createDebugLogger('@natlibfi/melinda-marc-record-merge-reducers/reducers/sanitize-vocabulary-source-codes);
11
+ // Author(s): Nicholas Volk
12
+ function _default() {
13
+ return {
14
+ description: 'Validator for sanitizing vocabulary source codes in subfield $2 (MRA-532)',
15
+ validate,
16
+ fix
17
+ };
18
+ function fix(record) {
19
+ const fixedFields = getFieldsWithCrappySubfieldCode(record, true);
20
+ const remainingBadFields = getFieldsWithCrappySubfieldCode(record, false);
21
+ const remainingBadFieldsAsStrings = remainingBadFields.map(f => (0, _utils.fieldToString)(f));
22
+ if (fixedFields.length > 0 || remainingBadFields.length === 0) {
23
+ // We are content
24
+ const fixedFieldsAsStrings = fixedFields.map(f => (0, _utils.fieldToString)(f));
25
+ return {
26
+ message: remainingBadFieldsAsStrings,
27
+ fix: fixedFieldsAsStrings,
28
+ valid: true
29
+ };
30
+ }
31
+ return {
32
+ message: remainingBadFieldsAsStrings,
33
+ fix: [],
34
+ valid: false
35
+ };
36
+ }
37
+ function validate(record) {
38
+ const badFields = getFieldsWithCrappySubfieldCode(record, false);
39
+ if (badFields.length === 0) {
40
+ return {
41
+ 'message': [],
42
+ 'valid': true
43
+ };
44
+ }
45
+ const messages = badFields.map(f => (0, _utils.fieldToString)(f));
46
+ return {
47
+ 'message': messages,
48
+ 'valid': false
49
+ };
50
+ }
51
+ }
52
+
53
+ // 'mts' is here as per specs. However, I think it should be 'mts/fin' or 'mts/swe'
54
+ const legalSubfieldCode = ['allars', 'mts', 'mts/fin', 'mts/swe', 'slm/fin', 'slm/swe', 'ysa', 'yso/fin', 'yso/swe'];
55
+ function stringFixVocabularySourceCode(value) {
56
+ // Try to remove spaces, change '//' to '/' and remove final '.' and '/':
57
+ const tmp = value.replace(/ /ug, '').replace(/\/+/ug, '/').replace(/[./]$/gu, '');
58
+ if (legalSubfieldCode.includes(tmp)) {
59
+ return tmp;
60
+ }
61
+ return value;
62
+ }
63
+ function isCrappySubfield2(subfield, fix) {
64
+ if (subfield.code !== '2' || legalSubfieldCode.includes(subfield.value)) {
65
+ return false;
66
+ }
67
+ // If fixer modifies string, it's crap:
68
+ const fixedVersion = stringFixVocabularySourceCode(subfield.value);
69
+ if (fixedVersion !== subfield.value) {
70
+ if (fix) {
71
+ subfield.value = fixedVersion; // eslint-disable-line functional/immutable-data
72
+ return true;
73
+ }
74
+ return true;
75
+ }
76
+ // As we can't fix this here, apply this yso-rule only when validating!
77
+ if (!fix && subfield.value.indexOf('yso/') === 0) {
78
+ return !['yso/eng', 'yso/fin', 'yso/swe'].includes(subfield.value);
79
+ }
80
+ if (!fix && subfield.value.indexOf('slm/') === 0) {
81
+ return !['slm/fin', 'slm/swe'].includes(subfield.value);
82
+ }
83
+ if (!fix && subfield.value.indexOf('mts/') === 0) {
84
+ return !['mts/fin', 'mts/swe'].includes(subfield.value);
85
+ }
86
+ return false;
87
+ }
88
+ function fieldHasCrappySubfield2(field, fix) {
89
+ if (!field.tag.match(/^(?:6..|257|370|38.)$/u)) {
90
+ return false;
91
+ }
92
+ return field.subfields.some(sf => isCrappySubfield2(sf, fix));
93
+ }
94
+ function getFieldsWithCrappySubfieldCode(record, fix) {
95
+ return record.get(/^6..$/u).filter(f => fieldHasCrappySubfield2(f, fix));
96
+ }
97
+ //# sourceMappingURL=sanitize-vocabulary-source-codes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitize-vocabulary-source-codes.js","names":["_utils","require","_default","description","validate","fix","record","fixedFields","getFieldsWithCrappySubfieldCode","remainingBadFields","remainingBadFieldsAsStrings","map","f","fieldToString","length","fixedFieldsAsStrings","message","valid","badFields","messages","legalSubfieldCode","stringFixVocabularySourceCode","value","tmp","replace","includes","isCrappySubfield2","subfield","code","fixedVersion","indexOf","fieldHasCrappySubfield2","field","tag","match","subfields","some","sf","get","filter"],"sources":["../src/sanitize-vocabulary-source-codes.js"],"sourcesContent":["//import createDebugLogger from 'debug';\nimport {fieldToString} from './utils';\n\n//const debug = createDebugLogger('@natlibfi/melinda-marc-record-merge-reducers/reducers/sanitize-vocabulary-source-codes);\n\n\n// Author(s): Nicholas Volk\nexport default function () {\n\n return {\n description: 'Validator for sanitizing vocabulary source codes in subfield $2 (MRA-532)',\n validate, fix\n };\n\n function fix(record) {\n const fixedFields = getFieldsWithCrappySubfieldCode(record, true);\n const remainingBadFields = getFieldsWithCrappySubfieldCode(record, false);\n\n const remainingBadFieldsAsStrings = remainingBadFields.map(f => fieldToString(f));\n\n if (fixedFields.length > 0 || remainingBadFields.length === 0) {\n // We are content\n const fixedFieldsAsStrings = fixedFields.map(f => fieldToString(f));\n\n return {message: remainingBadFieldsAsStrings, fix: fixedFieldsAsStrings, valid: true};\n }\n\n return {message: remainingBadFieldsAsStrings, fix: [], valid: false};\n\n }\n\n function validate(record) {\n const badFields = getFieldsWithCrappySubfieldCode(record, false);\n if (badFields.length === 0) {\n return {'message': [], 'valid': true};\n }\n const messages = badFields.map(f => fieldToString(f));\n\n return {'message': messages, 'valid': false};\n }\n\n}\n\n// 'mts' is here as per specs. However, I think it should be 'mts/fin' or 'mts/swe'\nconst legalSubfieldCode = ['allars', 'mts', 'mts/fin', 'mts/swe', 'slm/fin', 'slm/swe', 'ysa', 'yso/fin', 'yso/swe'];\n\n\nfunction stringFixVocabularySourceCode(value) {\n // Try to remove spaces, change '//' to '/' and remove final '.' and '/':\n const tmp = value.replace(/ /ug, '').replace(/\\/+/ug, '/').replace(/[./]$/gu, '');\n if (legalSubfieldCode.includes(tmp)) {\n return tmp;\n }\n return value;\n}\n\n\nfunction isCrappySubfield2(subfield, fix) {\n if (subfield.code !== '2' || legalSubfieldCode.includes(subfield.value)) {\n return false;\n }\n // If fixer modifies string, it's crap:\n const fixedVersion = stringFixVocabularySourceCode(subfield.value);\n if (fixedVersion !== subfield.value) {\n if (fix) {\n subfield.value = fixedVersion; // eslint-disable-line functional/immutable-data\n return true;\n }\n\n return true;\n }\n // As we can't fix this here, apply this yso-rule only when validating!\n if (!fix && subfield.value.indexOf('yso/') === 0) {\n return !['yso/eng', 'yso/fin', 'yso/swe'].includes(subfield.value);\n }\n if (!fix && subfield.value.indexOf('slm/') === 0) {\n return !['slm/fin', 'slm/swe'].includes(subfield.value);\n }\n if (!fix && subfield.value.indexOf('mts/') === 0) {\n return !['mts/fin', 'mts/swe'].includes(subfield.value);\n }\n return false;\n}\n\nfunction fieldHasCrappySubfield2(field, fix) {\n if (!field.tag.match(/^(?:6..|257|370|38.)$/u)) {\n return false;\n }\n return field.subfields.some(sf => isCrappySubfield2(sf, fix));\n}\n\nfunction getFieldsWithCrappySubfieldCode(record, fix) {\n return record.get(/^6..$/u).filter(f => fieldHasCrappySubfield2(f, fix));\n}\n\n"],"mappings":";;;;;;AACA,IAAAA,MAAA,GAAAC,OAAA;AADA;;AAGA;AAGA;AACe,SAAAC,SAAA,EAAY;EAEzB,OAAO;IACLC,WAAW,EAAE,2EAA2E;IACxFC,QAAQ;IAAEC;EACZ,CAAC;EAED,SAASA,GAAGA,CAACC,MAAM,EAAE;IACnB,MAAMC,WAAW,GAAGC,+BAA+B,CAACF,MAAM,EAAE,IAAI,CAAC;IACjE,MAAMG,kBAAkB,GAAGD,+BAA+B,CAACF,MAAM,EAAE,KAAK,CAAC;IAEzE,MAAMI,2BAA2B,GAAGD,kBAAkB,CAACE,GAAG,CAACC,CAAC,IAAI,IAAAC,oBAAa,EAACD,CAAC,CAAC,CAAC;IAEjF,IAAIL,WAAW,CAACO,MAAM,GAAG,CAAC,IAAIL,kBAAkB,CAACK,MAAM,KAAK,CAAC,EAAE;MAC7D;MACA,MAAMC,oBAAoB,GAAGR,WAAW,CAACI,GAAG,CAACC,CAAC,IAAI,IAAAC,oBAAa,EAACD,CAAC,CAAC,CAAC;MAEnE,OAAO;QAACI,OAAO,EAAEN,2BAA2B;QAAEL,GAAG,EAAEU,oBAAoB;QAAEE,KAAK,EAAE;MAAI,CAAC;IACvF;IAEA,OAAO;MAACD,OAAO,EAAEN,2BAA2B;MAAEL,GAAG,EAAE,EAAE;MAAEY,KAAK,EAAE;IAAK,CAAC;EAEtE;EAEA,SAASb,QAAQA,CAACE,MAAM,EAAE;IACxB,MAAMY,SAAS,GAAGV,+BAA+B,CAACF,MAAM,EAAE,KAAK,CAAC;IAChE,IAAIY,SAAS,CAACJ,MAAM,KAAK,CAAC,EAAE;MAC1B,OAAO;QAAC,SAAS,EAAE,EAAE;QAAE,OAAO,EAAE;MAAI,CAAC;IACvC;IACA,MAAMK,QAAQ,GAAGD,SAAS,CAACP,GAAG,CAACC,CAAC,IAAI,IAAAC,oBAAa,EAACD,CAAC,CAAC,CAAC;IAErD,OAAO;MAAC,SAAS,EAAEO,QAAQ;MAAE,OAAO,EAAE;IAAK,CAAC;EAC9C;AAEF;;AAEA;AACA,MAAMC,iBAAiB,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC;AAGpH,SAASC,6BAA6BA,CAACC,KAAK,EAAE;EAC5C;EACA,MAAMC,GAAG,GAAGD,KAAK,CAACE,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAACA,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAACA,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;EACjF,IAAIJ,iBAAiB,CAACK,QAAQ,CAACF,GAAG,CAAC,EAAE;IACnC,OAAOA,GAAG;EACZ;EACA,OAAOD,KAAK;AACd;AAGA,SAASI,iBAAiBA,CAACC,QAAQ,EAAEtB,GAAG,EAAE;EACxC,IAAIsB,QAAQ,CAACC,IAAI,KAAK,GAAG,IAAIR,iBAAiB,CAACK,QAAQ,CAACE,QAAQ,CAACL,KAAK,CAAC,EAAE;IACvE,OAAO,KAAK;EACd;EACA;EACA,MAAMO,YAAY,GAAGR,6BAA6B,CAACM,QAAQ,CAACL,KAAK,CAAC;EAClE,IAAIO,YAAY,KAAKF,QAAQ,CAACL,KAAK,EAAE;IACnC,IAAIjB,GAAG,EAAE;MACPsB,QAAQ,CAACL,KAAK,GAAGO,YAAY,CAAC,CAAC;MAC/B,OAAO,IAAI;IACb;IAEA,OAAO,IAAI;EACb;EACA;EACA,IAAI,CAACxB,GAAG,IAAIsB,QAAQ,CAACL,KAAK,CAACQ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;IAChD,OAAO,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,CAACL,QAAQ,CAACE,QAAQ,CAACL,KAAK,CAAC;EACpE;EACA,IAAI,CAACjB,GAAG,IAAIsB,QAAQ,CAACL,KAAK,CAACQ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;IAChD,OAAO,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,CAACL,QAAQ,CAACE,QAAQ,CAACL,KAAK,CAAC;EACzD;EACA,IAAI,CAACjB,GAAG,IAAIsB,QAAQ,CAACL,KAAK,CAACQ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;IAChD,OAAO,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,CAACL,QAAQ,CAACE,QAAQ,CAACL,KAAK,CAAC;EACzD;EACA,OAAO,KAAK;AACd;AAEA,SAASS,uBAAuBA,CAACC,KAAK,EAAE3B,GAAG,EAAE;EAC3C,IAAI,CAAC2B,KAAK,CAACC,GAAG,CAACC,KAAK,CAAC,wBAAwB,CAAC,EAAE;IAC9C,OAAO,KAAK;EACd;EACA,OAAOF,KAAK,CAACG,SAAS,CAACC,IAAI,CAACC,EAAE,IAAIX,iBAAiB,CAACW,EAAE,EAAEhC,GAAG,CAAC,CAAC;AAC/D;AAEA,SAASG,+BAA+BA,CAACF,MAAM,EAAED,GAAG,EAAE;EACpD,OAAOC,MAAM,CAACgC,GAAG,CAAC,QAAQ,CAAC,CAACC,MAAM,CAAC3B,CAAC,IAAImB,uBAAuB,CAACnB,CAAC,EAAEP,GAAG,CAAC,CAAC;AAC1E"}
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+
3
+ var _chai = require("chai");
4
+ var _marcRecord = require("@natlibfi/marc-record");
5
+ var _sanitizeVocabularySourceCodes = _interopRequireDefault(require("./sanitize-vocabulary-source-codes"));
6
+ var _fixura = require("@natlibfi/fixura");
7
+ var _fixugen = _interopRequireDefault(require("@natlibfi/fixugen"));
8
+ var _debug = _interopRequireDefault(require("debug"));
9
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
10
+ (0, _fixugen.default)({
11
+ callback,
12
+ path: [__dirname, '..', 'test-fixtures', 'sanitize-vocabulary-source-codes'],
13
+ useMetadataFile: true,
14
+ recurse: false,
15
+ fixura: {
16
+ reader: _fixura.READERS.JSON
17
+ },
18
+ mocha: {
19
+ before: () => testValidatorFactory()
20
+ }
21
+ });
22
+ const debug = (0, _debug.default)('@natlibfi/marc-record-validators-melinda/sanitize-vocabulary-source-codes:test');
23
+ async function testValidatorFactory() {
24
+ const validator = await (0, _sanitizeVocabularySourceCodes.default)();
25
+ (0, _chai.expect)(validator).to.be.an('object').that.has.any.keys('description', 'validate');
26
+ (0, _chai.expect)(validator.description).to.be.a('string');
27
+ (0, _chai.expect)(validator.validate).to.be.a('function');
28
+ }
29
+ async function callback({
30
+ getFixture,
31
+ enabled = true,
32
+ fix = false
33
+ }) {
34
+ if (enabled === false) {
35
+ debug('TEST SKIPPED!');
36
+ return;
37
+ }
38
+ const validator = await (0, _sanitizeVocabularySourceCodes.default)();
39
+ const record = new _marcRecord.MarcRecord(getFixture('record.json'));
40
+ const expectedResult = getFixture('expectedResult.json');
41
+ // console.log(expectedResult); // eslint-disable-line
42
+
43
+ if (!fix) {
44
+ const result = await validator.validate(record);
45
+ (0, _chai.expect)(result).to.eql(expectedResult);
46
+ return;
47
+ }
48
+ await validator.fix(record);
49
+ (0, _chai.expect)(record).to.eql(expectedResult);
50
+ }
51
+ //# sourceMappingURL=sanitize-vocabulary-source-codes.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitize-vocabulary-source-codes.spec.js","names":["_chai","require","_marcRecord","_sanitizeVocabularySourceCodes","_interopRequireDefault","_fixura","_fixugen","_debug","obj","__esModule","default","generateTests","callback","path","__dirname","useMetadataFile","recurse","fixura","reader","READERS","JSON","mocha","before","testValidatorFactory","debug","createDebugLogger","validator","validatorFactory","expect","to","be","an","that","has","any","keys","description","a","validate","getFixture","enabled","fix","record","MarcRecord","expectedResult","result","eql"],"sources":["../src/sanitize-vocabulary-source-codes.spec.js"],"sourcesContent":["import {expect} from 'chai';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './sanitize-vocabulary-source-codes';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\nimport createDebugLogger from 'debug';\n\ngenerateTests({\n callback,\n path: [__dirname, '..', 'test-fixtures', 'sanitize-vocabulary-source-codes'],\n useMetadataFile: true,\n recurse: false,\n fixura: {\n reader: READERS.JSON\n },\n mocha: {\n before: () => testValidatorFactory()\n }\n});\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/sanitize-vocabulary-source-codes:test');\n\nasync function testValidatorFactory() {\n const validator = await validatorFactory();\n\n expect(validator)\n .to.be.an('object')\n .that.has.any.keys('description', 'validate');\n\n expect(validator.description).to.be.a('string');\n expect(validator.validate).to.be.a('function');\n}\n\nasync function callback({getFixture, enabled = true, fix = false}) {\n if (enabled === false) {\n debug('TEST SKIPPED!');\n return;\n }\n\n const validator = await validatorFactory();\n const record = new MarcRecord(getFixture('record.json'));\n const expectedResult = getFixture('expectedResult.json');\n // console.log(expectedResult); // eslint-disable-line\n\n if (!fix) {\n const result = await validator.validate(record);\n expect(result).to.eql(expectedResult);\n return;\n }\n\n await validator.fix(record);\n expect(record).to.eql(expectedResult);\n}\n"],"mappings":";;AAAA,IAAAA,KAAA,GAAAC,OAAA;AACA,IAAAC,WAAA,GAAAD,OAAA;AACA,IAAAE,8BAAA,GAAAC,sBAAA,CAAAH,OAAA;AACA,IAAAI,OAAA,GAAAJ,OAAA;AACA,IAAAK,QAAA,GAAAF,sBAAA,CAAAH,OAAA;AACA,IAAAM,MAAA,GAAAH,sBAAA,CAAAH,OAAA;AAAsC,SAAAG,uBAAAI,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAEtC,IAAAG,gBAAa,EAAC;EACZC,QAAQ;EACRC,IAAI,EAAE,CAACC,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE,kCAAkC,CAAC;EAC5EC,eAAe,EAAE,IAAI;EACrBC,OAAO,EAAE,KAAK;EACdC,MAAM,EAAE;IACNC,MAAM,EAAEC,eAAO,CAACC;EAClB,CAAC;EACDC,KAAK,EAAE;IACLC,MAAM,EAAEA,CAAA,KAAMC,oBAAoB;EACpC;AACF,CAAC,CAAC;AACF,MAAMC,KAAK,GAAG,IAAAC,cAAiB,EAAC,gFAAgF,CAAC;AAEjH,eAAeF,oBAAoBA,CAAA,EAAG;EACpC,MAAMG,SAAS,GAAG,MAAM,IAAAC,sCAAgB,GAAE;EAE1C,IAAAC,YAAM,EAACF,SAAS,CAAC,CACdG,EAAE,CAACC,EAAE,CAACC,EAAE,CAAC,QAAQ,CAAC,CAClBC,IAAI,CAACC,GAAG,CAACC,GAAG,CAACC,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC;EAE/C,IAAAP,YAAM,EAACF,SAAS,CAACU,WAAW,CAAC,CAACP,EAAE,CAACC,EAAE,CAACO,CAAC,CAAC,QAAQ,CAAC;EAC/C,IAAAT,YAAM,EAACF,SAAS,CAACY,QAAQ,CAAC,CAACT,EAAE,CAACC,EAAE,CAACO,CAAC,CAAC,UAAU,CAAC;AAChD;AAEA,eAAezB,QAAQA,CAAC;EAAC2B,UAAU;EAAEC,OAAO,GAAG,IAAI;EAAEC,GAAG,GAAG;AAAK,CAAC,EAAE;EACjE,IAAID,OAAO,KAAK,KAAK,EAAE;IACrBhB,KAAK,CAAC,eAAe,CAAC;IACtB;EACF;EAEA,MAAME,SAAS,GAAG,MAAM,IAAAC,sCAAgB,GAAE;EAC1C,MAAMe,MAAM,GAAG,IAAIC,sBAAU,CAACJ,UAAU,CAAC,aAAa,CAAC,CAAC;EACxD,MAAMK,cAAc,GAAGL,UAAU,CAAC,qBAAqB,CAAC;EACxD;;EAEA,IAAI,CAACE,GAAG,EAAE;IACR,MAAMI,MAAM,GAAG,MAAMnB,SAAS,CAACY,QAAQ,CAACI,MAAM,CAAC;IAC/C,IAAAd,YAAM,EAACiB,MAAM,CAAC,CAAChB,EAAE,CAACiB,GAAG,CAACF,cAAc,CAAC;IACrC;EACF;EAEA,MAAMlB,SAAS,CAACe,GAAG,CAACC,MAAM,CAAC;EAC3B,IAAAd,YAAM,EAACc,MAAM,CAAC,CAACb,EAAE,CAACiB,GAAG,CAACF,cAAc,CAAC;AACvC"}
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = _default;
7
+ var _utils = require("./utils");
8
+ //import createDebugLogger from 'debug';
9
+
10
+ //const debug = createDebugLogger('@natlibfi/melinda-marc-record-merge-reducers/reducers/update-field-540');
11
+ // Author(s): Nicholas Volk
12
+ function _default() {
13
+ return {
14
+ description: 'Validator for field 540 (modernization as per MELKEHITYS-2431)',
15
+ validate,
16
+ fix
17
+ };
18
+ function fix(record) {
19
+ const fixedFields = getFieldsThatUseOldFormat(record, true);
20
+ const fixedFieldsAsStrings = fixedFields.map(f => (0, _utils.fieldToString)(f));
21
+ return {
22
+ message: [],
23
+ fix: fixedFieldsAsStrings,
24
+ valid: true
25
+ };
26
+ }
27
+ function validate(record) {
28
+ const yeOldeFields = getFieldsThatUseOldFormat(record, false);
29
+ if (yeOldeFields.length === 0) {
30
+ return {
31
+ 'message': [],
32
+ 'valid': true
33
+ };
34
+ }
35
+ const messages = yeOldeFields.map(f => (0, _utils.fieldToString)(f));
36
+ return {
37
+ 'message': messages,
38
+ 'valid': false
39
+ };
40
+ }
41
+ }
42
+ const licences = [{
43
+ 'license': 'CC BY 4.0',
44
+ 'url': 'https://creativecommons.org/licenses/by/4.0/deed.fi'
45
+ }, {
46
+ 'license': 'CC BY-NC 4.0',
47
+ 'url': 'https://creativecommons.org/licenses/by-nc/4.0/deed.fi'
48
+ }, {
49
+ 'license': 'CC BY-NC-ND 4.0',
50
+ 'url': 'https://creativecommons.org/licenses/by-nc-nd/4.0/deed.fi'
51
+ }, {
52
+ 'license': 'CC BY-NC-SA 4.0',
53
+ 'url': 'https://creativecommons.org/licenses/by-nc-sa/4.0/deed.fi'
54
+ }, {
55
+ 'license': 'CC BY-ND 4.0',
56
+ 'url': 'https://creativecommons.org/licenses/by-nd/4.0/deed.fi'
57
+ },
58
+ // {'license': 'CC0 1.0', 'url': ' https://creativecommons.org/publicdomain/zero/1.0/deed.fi' }, // not seen/unused
59
+ {
60
+ 'license': 'Public domain',
61
+ 'url': 'https://creativecommons.org/publicdomain/mark/1.0/deed.fi'
62
+ }];
63
+ function findSubfieldIndex(field, subfield) {
64
+ subfield.nvtmp = 1; // eslint-disable-line functional/immutable-data
65
+ const index = field.subfields.findIndex(sf => sf.nvtmp === 1);
66
+ delete subfield.nvtmp; // eslint-disable-line functional/immutable-data
67
+ return index;
68
+ }
69
+ function validLicenseInSubfieldC(subfieldC, license) {
70
+ if (subfieldC.code !== 'c') {
71
+ return false;
72
+ }
73
+ //nvdebug(`Compare ${subfieldC.value} vs ${license.license}`);
74
+ return license.license === subfieldC.value;
75
+ }
76
+ function validUrlInSubfieldU(subfieldU, license) {
77
+ if (subfieldU.code !== 'u') {
78
+ return false;
79
+ }
80
+ //nvdebug(`Compare ${subfieldU.value} vs ${license.url}`);
81
+ return license.url === subfieldU.value;
82
+ }
83
+ function fixC(field, subfieldC) {
84
+ // MELINDA-2431_
85
+ subfieldC.code = 'f'; // eslint-disable-line functional/immutable-data
86
+ const index = findSubfieldIndex(field, subfieldC);
87
+ field.subfields.splice(index + 1, 0, {
88
+ 'code': '2',
89
+ 'value': 'cc'
90
+ }); // eslint-disable-line functional/immutable-data
91
+ }
92
+
93
+ function fieldHasOldCcLicense(field, fix) {
94
+ if (field.tag !== '540') {
95
+ return false;
96
+ }
97
+ //nvdebug(`NORM 540: ${fieldToString(field)}`);
98
+ const validLicense = licences.find(license => field.subfields.some(sf => validLicenseInSubfieldC(sf, license)) && field.subfields.some(sf => validUrlInSubfieldU(sf, license)));
99
+ if (!validLicense) {
100
+ return false;
101
+ }
102
+ //nvdebug(` Found valid license`);
103
+ if (fix) {
104
+ // eslint-disable-line functional/no-conditional-statements
105
+ const subfieldsC = field.subfields.filter(sf => validLicenseInSubfieldC(sf, validLicense));
106
+ subfieldsC.forEach(c => fixC(field, c));
107
+ }
108
+ return true;
109
+ }
110
+ function getFieldsThatUseOldFormat(record, fix) {
111
+ return record.fields.filter(f => fieldHasOldCcLicense(f, fix));
112
+ }
113
+ //# sourceMappingURL=update-field-540.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-field-540.js","names":["_utils","require","_default","description","validate","fix","record","fixedFields","getFieldsThatUseOldFormat","fixedFieldsAsStrings","map","f","fieldToString","message","valid","yeOldeFields","length","messages","licences","findSubfieldIndex","field","subfield","nvtmp","index","subfields","findIndex","sf","validLicenseInSubfieldC","subfieldC","license","code","value","validUrlInSubfieldU","subfieldU","url","fixC","splice","fieldHasOldCcLicense","tag","validLicense","find","some","subfieldsC","filter","forEach","c","fields"],"sources":["../src/update-field-540.js"],"sourcesContent":["//import createDebugLogger from 'debug';\nimport {fieldToString} from './utils';\n\n//const debug = createDebugLogger('@natlibfi/melinda-marc-record-merge-reducers/reducers/update-field-540');\n\n// Author(s): Nicholas Volk\nexport default function () {\n\n return {\n description: 'Validator for field 540 (modernization as per MELKEHITYS-2431)',\n validate, fix\n };\n\n function fix(record) {\n const fixedFields = getFieldsThatUseOldFormat(record, true);\n\n const fixedFieldsAsStrings = fixedFields.map(f => fieldToString(f));\n\n return {message: [], fix: fixedFieldsAsStrings, valid: true};\n }\n\n function validate(record) {\n const yeOldeFields = getFieldsThatUseOldFormat(record, false);\n if (yeOldeFields.length === 0) {\n return {'message': [], 'valid': true};\n }\n const messages = yeOldeFields.map(f => fieldToString(f));\n\n return {'message': messages, 'valid': false};\n }\n\n}\n\n\nconst licences = [\n {'license': 'CC BY 4.0', 'url': 'https://creativecommons.org/licenses/by/4.0/deed.fi'},\n {'license': 'CC BY-NC 4.0', 'url': 'https://creativecommons.org/licenses/by-nc/4.0/deed.fi'},\n {'license': 'CC BY-NC-ND 4.0', 'url': 'https://creativecommons.org/licenses/by-nc-nd/4.0/deed.fi'},\n {'license': 'CC BY-NC-SA 4.0', 'url': 'https://creativecommons.org/licenses/by-nc-sa/4.0/deed.fi'},\n {'license': 'CC BY-ND 4.0', 'url': 'https://creativecommons.org/licenses/by-nd/4.0/deed.fi'},\n // {'license': 'CC0 1.0', 'url': ' https://creativecommons.org/publicdomain/zero/1.0/deed.fi' }, // not seen/unused\n {'license': 'Public domain', 'url': 'https://creativecommons.org/publicdomain/mark/1.0/deed.fi'}\n];\n\nfunction findSubfieldIndex(field, subfield) {\n subfield.nvtmp = 1; // eslint-disable-line functional/immutable-data\n const index = field.subfields.findIndex(sf => sf.nvtmp === 1);\n delete subfield.nvtmp; // eslint-disable-line functional/immutable-data\n return index;\n}\n\nfunction validLicenseInSubfieldC(subfieldC, license) {\n if (subfieldC.code !== 'c') {\n return false;\n }\n //nvdebug(`Compare ${subfieldC.value} vs ${license.license}`);\n return license.license === subfieldC.value;\n}\n\nfunction validUrlInSubfieldU(subfieldU, license) {\n if (subfieldU.code !== 'u') {\n return false;\n }\n //nvdebug(`Compare ${subfieldU.value} vs ${license.url}`);\n return license.url === subfieldU.value;\n}\n\n\nfunction fixC(field, subfieldC) {\n // MELINDA-2431_\n subfieldC.code = 'f'; // eslint-disable-line functional/immutable-data\n const index = findSubfieldIndex(field, subfieldC);\n field.subfields.splice(index + 1, 0, {'code': '2', 'value': 'cc'}); // eslint-disable-line functional/immutable-data\n}\n\nfunction fieldHasOldCcLicense(field, fix) {\n if (field.tag !== '540') {\n return false;\n }\n //nvdebug(`NORM 540: ${fieldToString(field)}`);\n const validLicense = licences.find(license => field.subfields.some(sf => validLicenseInSubfieldC(sf, license)) && field.subfields.some(sf => validUrlInSubfieldU(sf, license)));\n if (!validLicense) {\n return false;\n }\n //nvdebug(` Found valid license`);\n if (fix) { // eslint-disable-line functional/no-conditional-statements\n const subfieldsC = field.subfields.filter(sf => validLicenseInSubfieldC(sf, validLicense));\n subfieldsC.forEach(c => fixC(field, c));\n }\n\n return true;\n}\n\n\nfunction getFieldsThatUseOldFormat(record, fix) {\n return record.fields.filter(f => fieldHasOldCcLicense(f, fix));\n}\n\n"],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+
3
+ var _chai = require("chai");
4
+ var _marcRecord = require("@natlibfi/marc-record");
5
+ var _updateField = _interopRequireDefault(require("./update-field-540"));
6
+ var _fixura = require("@natlibfi/fixura");
7
+ var _fixugen = _interopRequireDefault(require("@natlibfi/fixugen"));
8
+ var _debug = _interopRequireDefault(require("debug"));
9
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
10
+ (0, _fixugen.default)({
11
+ callback,
12
+ path: [__dirname, '..', 'test-fixtures', 'update-field-540'],
13
+ useMetadataFile: true,
14
+ recurse: false,
15
+ fixura: {
16
+ reader: _fixura.READERS.JSON
17
+ },
18
+ mocha: {
19
+ before: () => testValidatorFactory()
20
+ }
21
+ });
22
+ const debug = (0, _debug.default)('@natlibfi/marc-record-validators-melinda/update-field-540:test');
23
+ async function testValidatorFactory() {
24
+ const validator = await (0, _updateField.default)();
25
+ (0, _chai.expect)(validator).to.be.an('object').that.has.any.keys('description', 'validate');
26
+ (0, _chai.expect)(validator.description).to.be.a('string');
27
+ (0, _chai.expect)(validator.validate).to.be.a('function');
28
+ }
29
+ async function callback({
30
+ getFixture,
31
+ enabled = true,
32
+ fix = false
33
+ }) {
34
+ if (enabled === false) {
35
+ debug('TEST SKIPPED!');
36
+ return;
37
+ }
38
+ const validator = await (0, _updateField.default)();
39
+ const record = new _marcRecord.MarcRecord(getFixture('record.json'));
40
+ const expectedResult = getFixture('expectedResult.json');
41
+ // console.log(expectedResult); // eslint-disable-line
42
+
43
+ if (!fix) {
44
+ const result = await validator.validate(record);
45
+ (0, _chai.expect)(result).to.eql(expectedResult);
46
+ return;
47
+ }
48
+ await validator.fix(record);
49
+ (0, _chai.expect)(record).to.eql(expectedResult);
50
+ }
51
+ //# sourceMappingURL=update-field-540.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-field-540.spec.js","names":["_chai","require","_marcRecord","_updateField","_interopRequireDefault","_fixura","_fixugen","_debug","obj","__esModule","default","generateTests","callback","path","__dirname","useMetadataFile","recurse","fixura","reader","READERS","JSON","mocha","before","testValidatorFactory","debug","createDebugLogger","validator","validatorFactory","expect","to","be","an","that","has","any","keys","description","a","validate","getFixture","enabled","fix","record","MarcRecord","expectedResult","result","eql"],"sources":["../src/update-field-540.spec.js"],"sourcesContent":["import {expect} from 'chai';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './update-field-540';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\nimport createDebugLogger from 'debug';\n\ngenerateTests({\n callback,\n path: [__dirname, '..', 'test-fixtures', 'update-field-540'],\n useMetadataFile: true,\n recurse: false,\n fixura: {\n reader: READERS.JSON\n },\n mocha: {\n before: () => testValidatorFactory()\n }\n});\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/update-field-540:test');\n\nasync function testValidatorFactory() {\n const validator = await validatorFactory();\n\n expect(validator)\n .to.be.an('object')\n .that.has.any.keys('description', 'validate');\n\n expect(validator.description).to.be.a('string');\n expect(validator.validate).to.be.a('function');\n}\n\nasync function callback({getFixture, enabled = true, fix = false}) {\n if (enabled === false) {\n debug('TEST SKIPPED!');\n return;\n }\n\n const validator = await validatorFactory();\n const record = new MarcRecord(getFixture('record.json'));\n const expectedResult = getFixture('expectedResult.json');\n // console.log(expectedResult); // eslint-disable-line\n\n if (!fix) {\n const result = await validator.validate(record);\n expect(result).to.eql(expectedResult);\n return;\n }\n\n await validator.fix(record);\n expect(record).to.eql(expectedResult);\n}\n"],"mappings":";;AAAA,IAAAA,KAAA,GAAAC,OAAA;AACA,IAAAC,WAAA,GAAAD,OAAA;AACA,IAAAE,YAAA,GAAAC,sBAAA,CAAAH,OAAA;AACA,IAAAI,OAAA,GAAAJ,OAAA;AACA,IAAAK,QAAA,GAAAF,sBAAA,CAAAH,OAAA;AACA,IAAAM,MAAA,GAAAH,sBAAA,CAAAH,OAAA;AAAsC,SAAAG,uBAAAI,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAEtC,IAAAG,gBAAa,EAAC;EACZC,QAAQ;EACRC,IAAI,EAAE,CAACC,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE,kBAAkB,CAAC;EAC5DC,eAAe,EAAE,IAAI;EACrBC,OAAO,EAAE,KAAK;EACdC,MAAM,EAAE;IACNC,MAAM,EAAEC,eAAO,CAACC;EAClB,CAAC;EACDC,KAAK,EAAE;IACLC,MAAM,EAAEA,CAAA,KAAMC,oBAAoB;EACpC;AACF,CAAC,CAAC;AACF,MAAMC,KAAK,GAAG,IAAAC,cAAiB,EAAC,gEAAgE,CAAC;AAEjG,eAAeF,oBAAoBA,CAAA,EAAG;EACpC,MAAMG,SAAS,GAAG,MAAM,IAAAC,oBAAgB,GAAE;EAE1C,IAAAC,YAAM,EAACF,SAAS,CAAC,CACdG,EAAE,CAACC,EAAE,CAACC,EAAE,CAAC,QAAQ,CAAC,CAClBC,IAAI,CAACC,GAAG,CAACC,GAAG,CAACC,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC;EAE/C,IAAAP,YAAM,EAACF,SAAS,CAACU,WAAW,CAAC,CAACP,EAAE,CAACC,EAAE,CAACO,CAAC,CAAC,QAAQ,CAAC;EAC/C,IAAAT,YAAM,EAACF,SAAS,CAACY,QAAQ,CAAC,CAACT,EAAE,CAACC,EAAE,CAACO,CAAC,CAAC,UAAU,CAAC;AAChD;AAEA,eAAezB,QAAQA,CAAC;EAAC2B,UAAU;EAAEC,OAAO,GAAG,IAAI;EAAEC,GAAG,GAAG;AAAK,CAAC,EAAE;EACjE,IAAID,OAAO,KAAK,KAAK,EAAE;IACrBhB,KAAK,CAAC,eAAe,CAAC;IACtB;EACF;EAEA,MAAME,SAAS,GAAG,MAAM,IAAAC,oBAAgB,GAAE;EAC1C,MAAMe,MAAM,GAAG,IAAIC,sBAAU,CAACJ,UAAU,CAAC,aAAa,CAAC,CAAC;EACxD,MAAMK,cAAc,GAAGL,UAAU,CAAC,qBAAqB,CAAC;EACxD;;EAEA,IAAI,CAACE,GAAG,EAAE;IACR,MAAMI,MAAM,GAAG,MAAMnB,SAAS,CAACY,QAAQ,CAACI,MAAM,CAAC;IAC/C,IAAAd,YAAM,EAACiB,MAAM,CAAC,CAAChB,EAAE,CAACiB,GAAG,CAACF,cAAc,CAAC;IACrC;EACF;EAEA,MAAMlB,SAAS,CAACe,GAAG,CAACC,MAAM,CAAC;EAC3B,IAAAd,YAAM,EAACc,MAAM,CAAC,CAACb,EAAE,CAACiB,GAAG,CAACF,cAAc,CAAC;AACvC"}
package/package.json CHANGED
@@ -14,7 +14,7 @@
14
14
  "url": "git@github.com:natlibfi/marc-record-validators-melinda.git"
15
15
  },
16
16
  "license": "MIT",
17
- "version": "10.3.2",
17
+ "version": "10.4.0",
18
18
  "main": "./dist/index.js",
19
19
  "publishConfig": {
20
20
  "access": "public"