@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.
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -1
- package/dist/removeInferiorDataFields.js +32 -16
- package/dist/removeInferiorDataFields.js.map +1 -1
- package/dist/sanitize-vocabulary-source-codes.js +97 -0
- package/dist/sanitize-vocabulary-source-codes.js.map +1 -0
- package/dist/sanitize-vocabulary-source-codes.spec.js +51 -0
- package/dist/sanitize-vocabulary-source-codes.spec.js.map +1 -0
- package/dist/update-field-540.js +113 -0
- package/dist/update-field-540.js.map +1 -0
- package/dist/update-field-540.spec.js +51 -0
- package/dist/update-field-540.spec.js.map +1 -0
- package/package.json +1 -1
- package/src/index.js +4 -1
- package/src/removeInferiorDataFields.js +31 -15
- package/src/sanitize-vocabulary-source-codes.js +95 -0
- package/src/sanitize-vocabulary-source-codes.spec.js +52 -0
- package/src/update-field-540.js +98 -0
- package/src/update-field-540.spec.js +52 -0
- package/test-fixtures/remove-inferior-datafields/f04/expectedResult.json +31 -0
- package/test-fixtures/remove-inferior-datafields/f04/metadata.json +6 -0
- package/test-fixtures/remove-inferior-datafields/f04/record.json +38 -0
- package/test-fixtures/sanitize-vocabulary-source-codes/f01/expectedResult.json +25 -0
- package/test-fixtures/sanitize-vocabulary-source-codes/f01/metadata.json +6 -0
- package/test-fixtures/sanitize-vocabulary-source-codes/f01/record.json +25 -0
- package/test-fixtures/sanitize-vocabulary-source-codes/f02/expectedResult.json +24 -0
- package/test-fixtures/sanitize-vocabulary-source-codes/f02/metadata.json +6 -0
- package/test-fixtures/sanitize-vocabulary-source-codes/f02/record.json +24 -0
- package/test-fixtures/sanitize-vocabulary-source-codes/v01/expectedResult.json +12 -0
- package/test-fixtures/sanitize-vocabulary-source-codes/v01/metadata.json +6 -0
- package/test-fixtures/sanitize-vocabulary-source-codes/v01/record.json +24 -0
- package/test-fixtures/update-field-540/f01/expectedResult.json +23 -0
- package/test-fixtures/update-field-540/f01/metadata.json +6 -0
- package/test-fixtures/update-field-540/f01/record.json +23 -0
- package/test-fixtures/update-field-540/v01/expectedResult.json +7 -0
- package/test-fixtures/update-field-540/v01/metadata.json +6 -0
- 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';\
|
|
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
|
|
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 =>
|
|
51
|
-
function
|
|
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):
|
|
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?-
|
|
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
|
|
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
|
|
94
|
-
(0, _utils.nvdebug)(`WP2: GOT ${
|
|
95
|
-
if (
|
|
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)(`
|
|
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 =>
|
|
104
|
-
function
|
|
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 (
|
|
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 =
|
|
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":";;;;;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,0BAAA,GAAAD,OAAA;AACA,IAAAE,eAAA,GAAAF,OAAA;AACA,IAAAG,MAAA,GAAAH,OAAA;AAA+D,SAAAD,uBAAAK,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAE/D;;AAEA,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,6BAA6BA,CAACC,MAAM,EAAET,MAAM,EAAE;EACrD;EACA,IAAIU,qBAAqB,GAAG,EAAE;EAE9B,IAAAT,cAAO,EAAE,YAAWQ,MAAM,CAACF,MAAO,oDAAmD,CAAC;EACtFE,MAAM,CAACE,OAAO,CAACC,KAAK,IAAIC,mCAAmC,CAACD,KAAK,CAAC,CAAC;EAEnE,SAASC,mCAAmCA,CAACD,KAAK,EAAE;IAClD,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;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,EAAE;IAClC,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;;EAE9C;EACAA,KAAK,CAACa,aAAa,GAAG,GAAG;EACzB,MAAMC,MAAM,GAAGZ,KAAK,CAAC,CAAC,CAAC,CAACW,aAAa,KAAK,GAAG,GAAG,IAAI,GAAG,KAAK;EAC5D,OAAOb,KAAK,CAACa,aAAa;EAC1B;EACA,OAAOC,MAAM;AACf;AAEO,SAASC,6BAA6BA,CAAC3B,MAAM,EAAED,GAAG,GAAG,IAAI,EAAE;EAChE,MAAMU,MAAM,GAAGT,MAAM,CAACS,MAAM,CAACmB,MAAM,CAACC,CAAC,IAAIP,gBAAgB,CAACO,CAAC,EAAE7B,MAAM,CAAC,CAAC;EACrE,IAAAC,cAAO,EAAE,cAAaQ,MAAM,CAACF,MAAO,WAAU,CAAC;EAE/C,MAAMuB,gCAAgC,GAAGtB,6BAA6B,CAACC,MAAM,EAAET,MAAM,CAAC;EACtF,IAAAC,cAAO,EAAE,YAAW6B,gCAAgC,CAACvB,MAAO,WAAU,CAAC;EACvE,IAAIuB,gCAAgC,CAACvB,MAAM,KAAK,CAAC,EAAE;IACjD,OAAO,EAAE;EACX;EAEA,IAAAN,cAAO,EAAE,uCAAsCQ,MAAM,CAACF,MAAO,sCAAqCuB,gCAAgC,CAACvB,MAAO,eAAc,CAAC;;EAGzJ;;EAEA,IAAIwB,mBAAmB,GAAG,EAAE;EAC5BtB,MAAM,CAACE,OAAO,CAACkB,CAAC,IAAIG,iCAAiC,CAACH,CAAC,CAAC,CAAC;EAGzD,SAASG,iCAAiCA,CAACpB,KAAK,EAAE;IAChD,MAAME,KAAK,GAAG,IAAAC,uCAAY,EAACH,KAAK,EAAEZ,MAAM,CAAC;IACzC,IAAIc,KAAK,CAACP,MAAM,KAAK,CAAC,IAAI,CAAC,IAAA0B,oCAAS,EAACrB,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,IAAIgB,gCAAgC,CAACI,QAAQ,CAAClB,aAAa,CAAC,EAAE;MAC5D,IAAAf,cAAO,EAAE,WAAUe,aAAc,EAAC,CAAC;MACnC,MAAMmB,aAAa,GAAG,IAAAC,qBAAc,EAACtB,KAAK,CAAC;MAC3CiB,mBAAmB,CAACV,IAAI,CAAE,QAAOc,aAAc,EAAC,CAAC;MACjD,IAAIpC,GAAG,EAAE;QACP,IAAAE,cAAO,EAAE,qCAAoCkC,aAAc,EAAC,EAAEzC,KAAK,CAAC;QACpEoB,KAAK,CAACH,OAAO,CAAC0B,SAAS,IAAIrC,MAAM,CAACsC,WAAW,CAACD,SAAS,CAAC,CAAC;MAC3D;IACF;EACF;;EAEA;EACA,OAAON,mBAAmB;AAC5B;AAEA,SAASQ,0BAA0BA,CAACvC,MAAM,EAAE;EAC1C;EACA,IAAIU,qBAAqB,GAAG,EAAE;EAE9BV,MAAM,CAACS,MAAM,CAACE,OAAO,CAACC,KAAK,IAAI4B,+BAA+B,CAAC5B,KAAK,CAAC,CAAC;EAEtE,SAAS4B,+BAA+BA,CAAC5B,KAAK,EAAE;IAC9C,MAAM6B,aAAa,GAAG,IAAAlB,oBAAa,EAACX,KAAK,CAAC;;IAE1C;IACA,IAAIM,GAAG,GAAGuB,aAAa;IACvB,IAAI7B,KAAK,CAAC8B,GAAG,CAACvB,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,GAAGuB,aAAa;IACnB,OAAOvB,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,SAASiC,kCAAkCA,CAAC3C,MAAM,EAAED,GAAG,GAAG,IAAI,EAAE;EAAE;EACvE,MAAM6C,wBAAwB,GAAGL,0BAA0B,CAACvC,MAAM,CAAC;EACnE,MAAM6C,IAAI,GAAG7C,MAAM,CAACS,MAAM,CAACmB,MAAM,CAAChB,KAAK,IAAIkC,gBAAgB,CAAClC,KAAK,CAAC,CAAC;EAEnE,MAAMmC,sBAAsB,GAAGF,IAAI,CAACG,GAAG,CAACnB,CAAC,IAAI,IAAAN,oBAAa,EAACM,CAAC,CAAC,CAAC;EAE9D,IAAI9B,GAAG,EAAE;IAAE;IACT8C,IAAI,CAAClC,OAAO,CAACC,KAAK,IAAI;MACpB,IAAAX,cAAO,EAAE,0BAAyB,IAAAsB,oBAAa,EAACX,KAAK,CAAE,EAAC,CAAC;MACzDZ,MAAM,CAACsC,WAAW,CAAC1B,KAAK,CAAC;IAC3B,CAAC,CAAC;EACJ;EAEA,OAAOmC,sBAAsB;EAE7B,SAASD,gBAAgBA,CAAClC,KAAK,EAAE;IAC/B,MAAM6B,aAAa,GAAG,IAAAlB,oBAAa,EAACX,KAAK,CAAC;IAC1C,OAAOgC,wBAAwB,CAACV,QAAQ,CAACO,aAAa,CAAC;EACzD;AACF;AAGO,SAASpC,wBAAwBA,CAACL,MAAM,EAAED,GAAG,GAAG,IAAI,EAAE;EAC3D,MAAMkD,UAAU,GAAGN,kCAAkC,CAAC3C,MAAM,EAAED,GAAG,CAAC,CAAC,CAAC;EACpE;EACA,MAAMmD,WAAW,GAAGvB,6BAA6B,CAAC3B,MAAM,EAAED,GAAG,CAAC,CAAC,CAAC;EAChE;;EAEA,IAAAE,cAAO,EAAE,kBAAiBgD,UAAU,CAACE,IAAI,CAAC,MAAM,CAAE,EAAC,CAAC;EACpD,IAAAlD,cAAO,EAAE,oBAAmBiD,WAAW,CAACC,IAAI,CAAC,MAAM,CAAE,EAAC,CAAC;EAEvD,MAAMC,aAAa,GAAGH,UAAU,CAACI,MAAM,CAACH,WAAW,CAAC,CAAC,CAAC;;EAEtD,OAAOE,aAAa;AACtB"}
|
|
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":"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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 _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"}
|