@natlibfi/melinda-rest-api-commons 4.2.5 → 5.0.0-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/melinda-node-tests.yml +9 -6
- package/dist/amqp.js +60 -151
- package/dist/amqp.js.map +7 -1
- package/dist/constants.js +40 -51
- package/dist/constants.js.map +7 -1
- package/dist/helpers/conversion.js +39 -57
- package/dist/helpers/conversion.js.map +7 -1
- package/dist/helpers/fix-constants.js +40 -47
- package/dist/helpers/fix-constants.js.map +7 -1
- package/dist/helpers/fix-handle-tempurns.js +23 -73
- package/dist/helpers/fix-handle-tempurns.js.map +7 -1
- package/dist/helpers/fix-strip-f884s.js +44 -94
- package/dist/helpers/fix-strip-f884s.js.map +7 -1
- package/dist/helpers/fix-utils.js +7 -22
- package/dist/helpers/fix-utils.js.map +7 -1
- package/dist/helpers/fix.js +62 -122
- package/dist/helpers/fix.js.map +7 -1
- package/dist/helpers/validation.js +12 -30
- package/dist/helpers/validation.js.map +7 -1
- package/dist/index.js +10 -109
- package/dist/index.js.map +7 -1
- package/dist/mongo.js +173 -509
- package/dist/mongo.js.map +7 -1
- package/dist/mongoLog.js +92 -317
- package/dist/mongoLog.js.map +7 -1
- package/dist/utils.js +46 -155
- package/dist/utils.js.map +7 -1
- package/eslint.config.js +53 -0
- package/package.json +23 -96
- package/tests/{amqp.health.spec.js → amqp.healthtest.js} +2 -2
- package/tests/{amqp.tests.spec.js → amqp.tests.localtest.js} +46 -46
- package/tests/helpers/{conversion.spec.js → conversion.test.js} +38 -25
- package/tests/helpers/{fix.spec.js → fix.test.js} +6 -6
- package/tests/helpers/{validation.spec.js → validation.test.js} +12 -9
- package/tests/{mongo-add-blob-size.spec.js → mongo-add-blob-size.test.js} +6 -6
- package/tests/{mongo-check-and-check-state.spec.js → mongo-check-and-check-state.test.js} +7 -7
- package/tests/{mongo-check-and-set-import-job-state.spec.js → mongo-check-and-set-import-job-state.test.js} +7 -7
- package/tests/{mongo-check-timeout.spec.js → mongo-check-timeout.test.js} +7 -7
- package/tests/{mongo-create-bulk.spec.js → mongo-create-bulk.test.js} +5 -5
- package/tests/{mongo-create-prio.spec.js → mongo-create-prio.test.js} +6 -6
- package/tests/{mongo-get-one.spec.js → mongo-get-one.test.js} +7 -7
- package/tests/{mongo-get-stream.spec.js → mongo-get-stream.test.js} +7 -7
- package/tests/{mongo-push-ids.spec.js → mongo-push-ids.test.js} +5 -5
- package/tests/{mongo-push-messages.spec.js → mongo-push-messages.test.js} +6 -6
- package/tests/{mongo-query-by-id.spec.js → mongo-query-by-id.test.js} +7 -7
- package/tests/{mongo-query.spec.js → mongo-query.test.js} +7 -7
- package/tests/{mongo-read-content.spec.js → mongo-read-content.test.js} +8 -8
- package/tests/{mongo-remove.spec.js → mongo-remove.test.js} +6 -6
- package/tests/{mongo-set-blob-size.spec.js → mongo-set-blob-size.test.js} +6 -6
- package/tests/{mongo-set-import-job-state.spec.js → mongo-set-import-job-state.test.js} +6 -6
- package/tests/{mongo-set-operation.spec.js → mongo-set-operation.test.js} +6 -6
- package/tests/{mongo-set-operations.spec.js → mongo-set-operations.test.js} +6 -6
- package/tests/{mongo-set-state.spec.js → mongo-set-state.test.js} +7 -7
- package/tests/{mongoLog.spec.js → mongoLog.test.js} +10 -11
- package/tests/testUtils.js +9 -8
|
@@ -1,58 +1,33 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
exports.stripF884s = stripF884s;
|
|
8
|
-
var _marcRecord = require("@natlibfi/marc-record");
|
|
9
|
-
var _debug = _interopRequireDefault(require("debug"));
|
|
10
|
-
var _util = require("util");
|
|
11
|
-
//import {sortFieldsBySubfieldValue, removeSubfield} from './fix-utils';
|
|
12
|
-
|
|
13
|
-
function stripF884s(newRecord, options) {
|
|
14
|
-
const debug = (0, _debug.default)('@natlibfi/melinda-rest-api-commons:fixRecord:stripF884s');
|
|
15
|
-
const debugData = debug.extend('data');
|
|
1
|
+
import createDebugLogger from "debug";
|
|
2
|
+
import { inspect } from "util";
|
|
3
|
+
import { MarcRecord } from "@natlibfi/marc-record";
|
|
4
|
+
export function stripF884s(newRecord, options) {
|
|
5
|
+
const debug = createDebugLogger("@natlibfi/melinda-rest-api-commons:fixRecord:stripF884s");
|
|
6
|
+
const debugData = debug.extend("data");
|
|
16
7
|
if (options !== true) {
|
|
17
8
|
debug(`NOT running stripF884s fixer, no options`);
|
|
18
9
|
return newRecord;
|
|
19
10
|
}
|
|
20
11
|
debug(`Running stripF884s fixer`);
|
|
21
12
|
debugData(`Options for stripF884s: ${JSON.stringify(options)}`);
|
|
22
|
-
|
|
23
|
-
// Handle only f884 with $5 MELINDA - let's no remove random f884s
|
|
24
|
-
const isMelindaf884 = f => f.tag === '884' && f.subfields.some(({
|
|
25
|
-
code,
|
|
26
|
-
value
|
|
27
|
-
}) => code === '5' && value === 'MELINDA');
|
|
13
|
+
const isMelindaf884 = (f) => f.tag === "884" && f.subfields.some(({ code, value }) => code === "5" && value === "MELINDA");
|
|
28
14
|
const f884Melindas = newRecord.fields.filter(isMelindaf884);
|
|
29
|
-
debugData(`Melinda's f884s (${f884Melindas.length})
|
|
30
|
-
|
|
31
|
-
|
|
15
|
+
debugData(`Melinda's f884s (${f884Melindas.length})
|
|
16
|
+
${JSON.stringify(f884Melindas)}`);
|
|
32
17
|
if (f884Melindas.length < 2) {
|
|
33
18
|
debug(`Not enough Melinda's f884s to filter (${f884Melindas.length})`);
|
|
34
19
|
return newRecord;
|
|
35
20
|
}
|
|
36
|
-
|
|
37
|
-
// Pick data (firstDate, lastDate, hash with latest date) for all conversion : source combinations
|
|
38
21
|
const results = f884Melindas.reduce((allResults, f884, index) => {
|
|
39
22
|
debugData(`All results: ${JSON.stringify(allResults)}`);
|
|
40
|
-
//debugData(`Handling field (${index}): ${inspect(f884, {depth: 3})}`);
|
|
41
23
|
debugData(`Handling field *(${index})*: ${JSON.stringify(f884)}`);
|
|
42
24
|
const conversion = findConversion(f884);
|
|
43
25
|
const source = findSource(f884);
|
|
44
26
|
const convSource = `${conversion}:${source}`;
|
|
45
|
-
const {
|
|
46
|
-
firstDate,
|
|
47
|
-
lastDate
|
|
48
|
-
} = findDates(f884);
|
|
27
|
+
const { firstDate, lastDate } = findDates(f884);
|
|
49
28
|
const hash = findHash(f884);
|
|
50
|
-
|
|
51
|
-
// Find currently existing data for conversion : source combination
|
|
52
29
|
const currResult = allResults[convSource];
|
|
53
30
|
debugData(JSON.stringify(currResult));
|
|
54
|
-
|
|
55
|
-
// If we do not have any current data, add data from field
|
|
56
31
|
if (!currResult) {
|
|
57
32
|
debug(`Add a new convSource ${convSource} to results`);
|
|
58
33
|
const newResult = {
|
|
@@ -68,14 +43,13 @@ function stripF884s(newRecord, options) {
|
|
|
68
43
|
[convSource]: newResult
|
|
69
44
|
};
|
|
70
45
|
}
|
|
71
|
-
// If we have current data, update it from the data from field, if needed
|
|
72
46
|
debug(`Update result for ${convSource}`);
|
|
73
47
|
debugData(`- Current result: ${JSON.stringify(currResult)}`);
|
|
74
48
|
const updatedResult = {
|
|
75
49
|
...currResult,
|
|
76
|
-
firstDate: currResult.firstDate > firstDate && firstDate !==
|
|
50
|
+
firstDate: currResult.firstDate > firstDate && firstDate !== "00000000" ? firstDate : currResult.firstDate,
|
|
77
51
|
lastDate: currResult.lastDate < lastDate ? lastDate : currResult.lastDate,
|
|
78
|
-
hash: currResult.lastDate < lastDate && lastDate !==
|
|
52
|
+
hash: currResult.lastDate < lastDate && lastDate !== "00000000" && hash !== "0000000000000000000000000000000000000000000000000000000000000000" ? hash : currResult.hash
|
|
79
53
|
};
|
|
80
54
|
debugData(`- Updated result: ${JSON.stringify(updatedResult)}`);
|
|
81
55
|
return {
|
|
@@ -86,38 +60,33 @@ function stripF884s(newRecord, options) {
|
|
|
86
60
|
debugData(`RESULTS: ${JSON.stringify(results)}`);
|
|
87
61
|
const editedf884s = editFields(f884Melindas, results);
|
|
88
62
|
debug(`Edited fields (${editedf884s.length})`);
|
|
89
|
-
//debugData(inspect(editedf884s, {depth: 3}));
|
|
90
63
|
debugData(`${JSON.stringify(editedf884s)}`);
|
|
91
|
-
|
|
92
|
-
// We update each field based on the results we got from fields
|
|
93
|
-
// Note: we do not add $g:s or $k:s if the field doesn't have them
|
|
94
|
-
function editFields(fields, results) {
|
|
64
|
+
function editFields(fields, results2) {
|
|
95
65
|
debug(`EDITING FIELDS (${fields.length})`);
|
|
96
|
-
const editedFields = fields.map(field => {
|
|
66
|
+
const editedFields = fields.map((field) => {
|
|
97
67
|
const convSource = `${findConversion(field)}:${findSource(field)}`;
|
|
98
68
|
debug(`Looking for: ${convSource}`);
|
|
99
|
-
if (convSource &&
|
|
100
|
-
debugData(`Found: ${JSON.stringify(
|
|
101
|
-
const firstDate =
|
|
102
|
-
const lastDate =
|
|
103
|
-
const source =
|
|
104
|
-
const hash =
|
|
69
|
+
if (convSource && results2[convSource]) {
|
|
70
|
+
debugData(`Found: ${JSON.stringify(results2[convSource])}`);
|
|
71
|
+
const firstDate = results2[convSource].firstDate && results2[convSource].firstDate !== "00000000" ? results2[convSource].firstDate : "";
|
|
72
|
+
const lastDate = results2[convSource].lastDate && results2[convSource].lastDate !== "00000000" ? results2[convSource].lastDate : "";
|
|
73
|
+
const source = results2[convSource].source && results2[convSource].source !== "NO_SOURCE" ? results2[convSource].source : "";
|
|
74
|
+
const hash = results2[convSource].hash && results2[convSource].hash !== "0000000000000000000000000000000000000000000000000000000000000000" ? results2[convSource].hash : "";
|
|
105
75
|
const sfGAll = firstDate === lastDate ? `${firstDate}` : `${firstDate} - ${lastDate}`;
|
|
106
76
|
debugData(`EditedDates: ${sfGAll}`);
|
|
107
77
|
const sfKAll = `${source}:${hash}`;
|
|
108
|
-
const sfG = sfGAll.replace(/^ - /u,
|
|
109
|
-
const sfK = sfKAll.replace(/^:/u,
|
|
78
|
+
const sfG = sfGAll.replace(/^ - /u, "").replace(/ - $/u, "");
|
|
79
|
+
const sfK = sfKAll.replace(/^:/u, "").replace(/:$/u, "");
|
|
110
80
|
return {
|
|
111
81
|
...field,
|
|
112
|
-
subfields: field.subfields.map(subfield => {
|
|
113
|
-
|
|
114
|
-
if (subfield.code === 'g') {
|
|
82
|
+
subfields: field.subfields.map((subfield) => {
|
|
83
|
+
if (subfield.code === "g") {
|
|
115
84
|
return {
|
|
116
85
|
code: subfield.code,
|
|
117
86
|
value: sfG
|
|
118
87
|
};
|
|
119
88
|
}
|
|
120
|
-
if (subfield.code ===
|
|
89
|
+
if (subfield.code === "k") {
|
|
121
90
|
return {
|
|
122
91
|
code: subfield.code,
|
|
123
92
|
value: sfK
|
|
@@ -132,79 +101,60 @@ function stripF884s(newRecord, options) {
|
|
|
132
101
|
});
|
|
133
102
|
return editedFields;
|
|
134
103
|
}
|
|
135
|
-
|
|
136
|
-
// we'll need to uniq these too
|
|
137
|
-
|
|
138
104
|
const uniq884s = uniqFields(editedf884s);
|
|
139
105
|
debug(`UniqFields (${uniq884s.length})`);
|
|
140
|
-
debugData(
|
|
141
|
-
depth: 3
|
|
142
|
-
}));
|
|
106
|
+
debugData(inspect(uniq884s, { depth: 3 }));
|
|
143
107
|
function uniqFields(fields) {
|
|
144
108
|
return fields.reduce((uniq, field) => {
|
|
145
|
-
if (!uniq.some(f =>
|
|
146
|
-
|
|
147
|
-
uniq.push(field); // eslint-disable-line functional/immutable-data
|
|
109
|
+
if (!uniq.some((f) => MarcRecord.isEqual(f, field))) {
|
|
110
|
+
uniq.push(field);
|
|
148
111
|
}
|
|
149
112
|
return uniq;
|
|
150
113
|
}, []);
|
|
151
114
|
}
|
|
152
|
-
// Replace original Melinda-f884s with remaining Melinda-f884s
|
|
153
|
-
// NOTE: this sorts MELINDA-f884s after possible other f884s
|
|
154
115
|
newRecord.removeFields(f884Melindas);
|
|
155
116
|
newRecord.insertFields(uniq884s);
|
|
156
117
|
return newRecord;
|
|
157
|
-
|
|
158
|
-
// Find conversion:source pairs
|
|
159
|
-
// Find first date
|
|
160
|
-
// Find last date and last hash
|
|
161
|
-
|
|
162
118
|
function findConversion(f884) {
|
|
163
|
-
const [sfA] = f884.subfields.filter(subfield => subfield.code ===
|
|
119
|
+
const [sfA] = f884.subfields.filter((subfield) => subfield.code === "a").map((subfield) => subfield.value);
|
|
164
120
|
const conversion = sfA;
|
|
165
121
|
debugData(`Conversion: "${conversion}"`);
|
|
166
122
|
return conversion;
|
|
167
123
|
}
|
|
168
124
|
function findSource(f884) {
|
|
169
|
-
const [sfK] = f884.subfields.filter(subfield => subfield.code ===
|
|
170
|
-
const source = sfK.replace(/:.*$/u,
|
|
125
|
+
const [sfK] = f884.subfields.filter((subfield) => subfield.code === "k").map((subfield) => subfield.value);
|
|
126
|
+
const source = sfK.replace(/:.*$/u, "");
|
|
171
127
|
if (source && source.length !== 64) {
|
|
172
128
|
debugData(`Source: "${source}"`);
|
|
173
129
|
return source;
|
|
174
130
|
}
|
|
175
|
-
const emptySource =
|
|
131
|
+
const emptySource = "NO_SOURCE";
|
|
176
132
|
debugData(`Source: "${emptySource}"`);
|
|
177
133
|
return emptySource;
|
|
178
134
|
}
|
|
179
135
|
function findHash(f884) {
|
|
180
|
-
const [sfK] = f884.subfields.filter(subfield => subfield.code ===
|
|
181
|
-
const hash = sfK.replace(/^.*:/u,
|
|
136
|
+
const [sfK] = f884.subfields.filter((subfield) => subfield.code === "k").map((subfield) => subfield.value);
|
|
137
|
+
const hash = sfK.replace(/^.*:/u, "");
|
|
182
138
|
if (hash && hash.length === 64) {
|
|
183
139
|
debugData(`Hash: "${hash}"`);
|
|
184
140
|
return hash;
|
|
185
141
|
}
|
|
186
|
-
const emptyHash =
|
|
142
|
+
const emptyHash = "0000000000000000000000000000000000000000000000000000000000000000";
|
|
187
143
|
debugData(`Hash: "${emptyHash}"`);
|
|
188
144
|
return emptyHash;
|
|
189
145
|
}
|
|
190
146
|
function findDates(f884) {
|
|
191
|
-
const [sfG] = f884.subfields.filter(subfield => subfield.code ===
|
|
147
|
+
const [sfG] = f884.subfields.filter((subfield) => subfield.code === "g").map((subfield) => subfield.value);
|
|
192
148
|
if (sfG && / - /u.test(sfG)) {
|
|
193
|
-
const
|
|
194
|
-
const
|
|
195
|
-
debugData(`FirstDate: "${
|
|
196
|
-
return {
|
|
197
|
-
firstDate,
|
|
198
|
-
lastDate
|
|
199
|
-
};
|
|
149
|
+
const firstDate2 = sfG.replace(/ - .*$/u, "").padStart(8, "0");
|
|
150
|
+
const lastDate2 = sfG.replace(/^.* - /u, "").padStart(8, "0");
|
|
151
|
+
debugData(`FirstDate: "${firstDate2}", LastDate: "${lastDate2}"`);
|
|
152
|
+
return { firstDate: firstDate2, lastDate: lastDate2 };
|
|
200
153
|
}
|
|
201
|
-
const firstDate = sfG ? sfG.padStart(8,
|
|
202
|
-
const lastDate = sfG ? sfG.padStart(8,
|
|
154
|
+
const firstDate = sfG ? sfG.padStart(8, "0") : "00000000";
|
|
155
|
+
const lastDate = sfG ? sfG.padStart(8, "0") : "00000000";
|
|
203
156
|
debugData(`FirstDate: "${firstDate}", LastDate: "${lastDate}"`);
|
|
204
|
-
return {
|
|
205
|
-
firstDate,
|
|
206
|
-
lastDate
|
|
207
|
-
};
|
|
157
|
+
return { firstDate, lastDate };
|
|
208
158
|
}
|
|
209
159
|
}
|
|
210
|
-
//# sourceMappingURL=fix-strip-f884s.js.map
|
|
160
|
+
//# sourceMappingURL=fix-strip-f884s.js.map
|
|
@@ -1 +1,7 @@
|
|
|
1
|
-
{"version":3,"file":"fix-strip-f884s.js","names":["_marcRecord","require","_debug","_interopRequireDefault","_util","stripF884s","newRecord","options","debug","createDebugLogger","debugData","extend","JSON","stringify","isMelindaf884","f","tag","subfields","some","code","value","f884Melindas","fields","filter","length","results","reduce","allResults","f884","index","conversion","findConversion","source","findSource","convSource","firstDate","lastDate","findDates","hash","findHash","currResult","newResult","updatedResult","editedf884s","editFields","editedFields","map","field","sfGAll","sfKAll","sfG","replace","sfK","subfield","uniq884s","uniqFields","inspect","depth","uniq","MarcRecord","isEqual","push","removeFields","insertFields","sfA","emptySource","emptyHash","test","padStart"],"sources":["../../src/helpers/fix-strip-f884s.js"],"sourcesContent":["import {MarcRecord} from '@natlibfi/marc-record';\nimport createDebugLogger from 'debug';\n//import {sortFieldsBySubfieldValue, removeSubfield} from './fix-utils';\nimport {inspect} from 'util';\n\nexport function stripF884s(newRecord, options) {\n const debug = createDebugLogger('@natlibfi/melinda-rest-api-commons:fixRecord:stripF884s');\n const debugData = debug.extend('data');\n\n if (options !== true) {\n debug(`NOT running stripF884s fixer, no options`);\n return newRecord;\n }\n\n debug(`Running stripF884s fixer`);\n debugData(`Options for stripF884s: ${JSON.stringify(options)}`);\n\n // Handle only f884 with $5 MELINDA - let's no remove random f884s\n const isMelindaf884 = f => f.tag === '884' && f.subfields.some(({code, value}) => code === '5' && value === 'MELINDA');\n\n const f884Melindas = newRecord.fields.filter(isMelindaf884);\n debugData(`Melinda's f884s (${f884Melindas.length}) \\n ${JSON.stringify(f884Melindas)}`);\n //debugData(`Melinda's f884s (${f884Melindas.length}) \\n ${inspect(f884Melindas, {depth: 3})}`);\n\n if (f884Melindas.length < 2) {\n debug(`Not enough Melinda's f884s to filter (${f884Melindas.length})`);\n return newRecord;\n }\n\n // Pick data (firstDate, lastDate, hash with latest date) for all conversion : source combinations\n const results = f884Melindas.reduce((allResults, f884, index) => {\n debugData(`All results: ${JSON.stringify(allResults)}`);\n //debugData(`Handling field (${index}): ${inspect(f884, {depth: 3})}`);\n debugData(`Handling field *(${index})*: ${JSON.stringify(f884)}`);\n\n const conversion = findConversion(f884);\n const source = findSource(f884);\n const convSource = `${conversion}:${source}`;\n const {firstDate, lastDate} = findDates(f884);\n const hash = findHash(f884);\n\n // Find currently existing data for conversion : source combination\n const currResult = allResults[convSource];\n debugData(JSON.stringify(currResult));\n\n // If we do not have any current data, add data from field\n if (!currResult) {\n debug(`Add a new convSource ${convSource} to results`);\n const newResult = {\n conversion,\n source,\n firstDate,\n lastDate,\n hash\n };\n debugData(`- New result: ${JSON.stringify(newResult)}`);\n return {\n ...allResults,\n [convSource]: newResult\n };\n }\n // If we have current data, update it from the data from field, if needed\n debug(`Update result for ${convSource}`);\n debugData(`- Current result: ${JSON.stringify(currResult)}`);\n\n const updatedResult = {\n ...currResult,\n firstDate: currResult.firstDate > firstDate && firstDate !== '00000000' ? firstDate : currResult.firstDate,\n lastDate: currResult.lastDate < lastDate ? lastDate : currResult.lastDate,\n hash: currResult.lastDate < lastDate && lastDate !== '00000000' && hash !== '0000000000000000000000000000000000000000000000000000000000000000' ? hash : currResult.hash\n };\n debugData(`- Updated result: ${JSON.stringify(updatedResult)}`);\n return {\n ...allResults,\n [convSource]: updatedResult\n };\n }, {});\n\n debugData(`RESULTS: ${JSON.stringify(results)}`);\n const editedf884s = editFields(f884Melindas, results);\n\n debug(`Edited fields (${editedf884s.length})`);\n //debugData(inspect(editedf884s, {depth: 3}));\n debugData(`${JSON.stringify(editedf884s)}`);\n\n // We update each field based on the results we got from fields\n // Note: we do not add $g:s or $k:s if the field doesn't have them\n function editFields(fields, results) {\n debug(`EDITING FIELDS (${fields.length})`);\n const editedFields = fields.map((field) => {\n const convSource = `${findConversion(field)}:${findSource(field)}`;\n debug(`Looking for: ${convSource}`);\n\n if (convSource && results[convSource]) {\n debugData(`Found: ${JSON.stringify(results[convSource])}`);\n const firstDate = results[convSource].firstDate && results[convSource].firstDate !== '00000000' ? results[convSource].firstDate : '';\n const lastDate = results[convSource].lastDate && results[convSource].lastDate !== '00000000' ? results[convSource].lastDate : '';\n\n const source = results[convSource].source && results[convSource].source !== 'NO_SOURCE' ? results[convSource].source : '';\n const hash = results[convSource].hash && results[convSource].hash !== '0000000000000000000000000000000000000000000000000000000000000000' ? results[convSource].hash : '';\n\n const sfGAll = firstDate === lastDate ? `${firstDate}` : `${firstDate} - ${lastDate}`;\n debugData(`EditedDates: ${sfGAll}`);\n const sfKAll = `${source}:${hash}`;\n\n const sfG = sfGAll.replace(/^ - /u, '').replace(/ - $/u, '');\n const sfK = sfKAll.replace(/^:/u, '').replace(/:$/u, '');\n\n return {\n ...field,\n subfields: field.subfields.map(subfield => {\n\n // we don't get $g or $k if the original field doesn't have them\n if (subfield.code === 'g') {\n return {\n code: subfield.code,\n value: sfG\n };\n }\n\n if (subfield.code === 'k') {\n return {\n code: subfield.code,\n value: sfK\n };\n }\n\n return subfield;\n })\n\n };\n }\n debug(`Not found: ${convSource}`);\n return field;\n });\n return editedFields;\n }\n\n // we'll need to uniq these too\n\n const uniq884s = uniqFields(editedf884s);\n debug(`UniqFields (${uniq884s.length})`);\n debugData(inspect(uniq884s, {depth: 3}));\n\n\n function uniqFields(fields) {\n return fields.reduce((uniq, field) => {\n if (!uniq.some(f => MarcRecord.isEqual(f, field))) { // eslint-disable-line functional/no-conditional-statements\n uniq.push(field); // eslint-disable-line functional/immutable-data\n }\n\n return uniq;\n }, []);\n }\n // Replace original Melinda-f884s with remaining Melinda-f884s\n // NOTE: this sorts MELINDA-f884s after possible other f884s\n newRecord.removeFields(f884Melindas);\n newRecord.insertFields(uniq884s);\n\n return newRecord;\n\n\n // Find conversion:source pairs\n // Find first date\n // Find last date and last hash\n\n\n function findConversion(f884) {\n const [sfA] = f884.subfields.filter((subfield) => subfield.code === 'a').map(subfield => subfield.value);\n const conversion = sfA;\n debugData(`Conversion: \"${conversion}\"`);\n return conversion;\n }\n\n function findSource(f884) {\n const [sfK] = f884.subfields.filter((subfield) => subfield.code === 'k').map(subfield => subfield.value);\n const source = sfK.replace(/:.*$/u, '');\n if (source && source.length !== 64) {\n debugData(`Source: \"${source}\"`);\n return source;\n }\n const emptySource = 'NO_SOURCE';\n debugData(`Source: \"${emptySource}\"`);\n return emptySource;\n }\n\n function findHash(f884) {\n const [sfK] = f884.subfields.filter((subfield) => subfield.code === 'k').map(subfield => subfield.value);\n const hash = sfK.replace(/^.*:/u, '');\n if (hash && hash.length === 64) {\n debugData(`Hash: \"${hash}\"`);\n return hash;\n }\n const emptyHash = '0000000000000000000000000000000000000000000000000000000000000000';\n debugData(`Hash: \"${emptyHash}\"`);\n return emptyHash;\n }\n\n function findDates(f884) {\n const [sfG] = f884.subfields.filter((subfield) => subfield.code === 'g').map(subfield => subfield.value);\n if (sfG && (/ - /u).test(sfG)) {\n const firstDate = sfG.replace(/ - .*$/u, '').padStart(8, '0');\n const lastDate = sfG.replace(/^.* - /u, '').padStart(8, '0');\n debugData(`FirstDate: \"${firstDate}\", LastDate: \"${lastDate}\"`);\n return {firstDate, lastDate};\n }\n const firstDate = sfG ? sfG.padStart(8, '0') : '00000000';\n const lastDate = sfG ? sfG.padStart(8, '0') : '00000000';\n\n debugData(`FirstDate: \"${firstDate}\", LastDate: \"${lastDate}\"`);\n return {firstDate, lastDate};\n }\n\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/helpers/fix-strip-f884s.js"],
|
|
4
|
+
"sourcesContent": ["import createDebugLogger from 'debug';\n//import {sortFieldsBySubfieldValue, removeSubfield} from './fix-utils';\nimport {inspect} from 'util';\nimport {MarcRecord} from '@natlibfi/marc-record';\n\nexport function stripF884s(newRecord, options) {\n const debug = createDebugLogger('@natlibfi/melinda-rest-api-commons:fixRecord:stripF884s');\n const debugData = debug.extend('data');\n\n if (options !== true) {\n debug(`NOT running stripF884s fixer, no options`);\n return newRecord;\n }\n\n debug(`Running stripF884s fixer`);\n debugData(`Options for stripF884s: ${JSON.stringify(options)}`);\n\n // Handle only f884 with $5 MELINDA - let's no remove random f884s\n const isMelindaf884 = f => f.tag === '884' && f.subfields.some(({code, value}) => code === '5' && value === 'MELINDA');\n\n const f884Melindas = newRecord.fields.filter(isMelindaf884);\n debugData(`Melinda's f884s (${f884Melindas.length}) \\n ${JSON.stringify(f884Melindas)}`);\n //debugData(`Melinda's f884s (${f884Melindas.length}) \\n ${inspect(f884Melindas, {depth: 3})}`);\n\n if (f884Melindas.length < 2) {\n debug(`Not enough Melinda's f884s to filter (${f884Melindas.length})`);\n return newRecord;\n }\n\n // Pick data (firstDate, lastDate, hash with latest date) for all conversion : source combinations\n const results = f884Melindas.reduce((allResults, f884, index) => {\n debugData(`All results: ${JSON.stringify(allResults)}`);\n //debugData(`Handling field (${index}): ${inspect(f884, {depth: 3})}`);\n debugData(`Handling field *(${index})*: ${JSON.stringify(f884)}`);\n\n const conversion = findConversion(f884);\n const source = findSource(f884);\n const convSource = `${conversion}:${source}`;\n const {firstDate, lastDate} = findDates(f884);\n const hash = findHash(f884);\n\n // Find currently existing data for conversion : source combination\n const currResult = allResults[convSource];\n debugData(JSON.stringify(currResult));\n\n // If we do not have any current data, add data from field\n if (!currResult) {\n debug(`Add a new convSource ${convSource} to results`);\n const newResult = {\n conversion,\n source,\n firstDate,\n lastDate,\n hash\n };\n debugData(`- New result: ${JSON.stringify(newResult)}`);\n return {\n ...allResults,\n [convSource]: newResult\n };\n }\n // If we have current data, update it from the data from field, if needed\n debug(`Update result for ${convSource}`);\n debugData(`- Current result: ${JSON.stringify(currResult)}`);\n\n const updatedResult = {\n ...currResult,\n firstDate: currResult.firstDate > firstDate && firstDate !== '00000000' ? firstDate : currResult.firstDate,\n lastDate: currResult.lastDate < lastDate ? lastDate : currResult.lastDate,\n hash: currResult.lastDate < lastDate && lastDate !== '00000000' && hash !== '0000000000000000000000000000000000000000000000000000000000000000' ? hash : currResult.hash\n };\n debugData(`- Updated result: ${JSON.stringify(updatedResult)}`);\n return {\n ...allResults,\n [convSource]: updatedResult\n };\n }, {});\n\n debugData(`RESULTS: ${JSON.stringify(results)}`);\n const editedf884s = editFields(f884Melindas, results);\n\n debug(`Edited fields (${editedf884s.length})`);\n //debugData(inspect(editedf884s, {depth: 3}));\n debugData(`${JSON.stringify(editedf884s)}`);\n\n // We update each field based on the results we got from fields\n // Note: we do not add $g:s or $k:s if the field doesn't have them\n function editFields(fields, results) {\n debug(`EDITING FIELDS (${fields.length})`);\n const editedFields = fields.map((field) => {\n const convSource = `${findConversion(field)}:${findSource(field)}`;\n debug(`Looking for: ${convSource}`);\n\n if (convSource && results[convSource]) {\n debugData(`Found: ${JSON.stringify(results[convSource])}`);\n const firstDate = results[convSource].firstDate && results[convSource].firstDate !== '00000000' ? results[convSource].firstDate : '';\n const lastDate = results[convSource].lastDate && results[convSource].lastDate !== '00000000' ? results[convSource].lastDate : '';\n\n const source = results[convSource].source && results[convSource].source !== 'NO_SOURCE' ? results[convSource].source : '';\n const hash = results[convSource].hash && results[convSource].hash !== '0000000000000000000000000000000000000000000000000000000000000000' ? results[convSource].hash : '';\n\n const sfGAll = firstDate === lastDate ? `${firstDate}` : `${firstDate} - ${lastDate}`;\n debugData(`EditedDates: ${sfGAll}`);\n const sfKAll = `${source}:${hash}`;\n\n const sfG = sfGAll.replace(/^ - /u, '').replace(/ - $/u, '');\n const sfK = sfKAll.replace(/^:/u, '').replace(/:$/u, '');\n\n return {\n ...field,\n subfields: field.subfields.map(subfield => {\n\n // we don't get $g or $k if the original field doesn't have them\n if (subfield.code === 'g') {\n return {\n code: subfield.code,\n value: sfG\n };\n }\n\n if (subfield.code === 'k') {\n return {\n code: subfield.code,\n value: sfK\n };\n }\n\n return subfield;\n })\n\n };\n }\n debug(`Not found: ${convSource}`);\n return field;\n });\n return editedFields;\n }\n\n // we'll need to uniq these too\n\n const uniq884s = uniqFields(editedf884s);\n debug(`UniqFields (${uniq884s.length})`);\n debugData(inspect(uniq884s, {depth: 3}));\n\n\n function uniqFields(fields) {\n return fields.reduce((uniq, field) => {\n if (!uniq.some(f => MarcRecord.isEqual(f, field))) {\n uniq.push(field);\n }\n\n return uniq;\n }, []);\n }\n // Replace original Melinda-f884s with remaining Melinda-f884s\n // NOTE: this sorts MELINDA-f884s after possible other f884s\n newRecord.removeFields(f884Melindas);\n newRecord.insertFields(uniq884s);\n\n return newRecord;\n\n\n // Find conversion:source pairs\n // Find first date\n // Find last date and last hash\n\n\n function findConversion(f884) {\n const [sfA] = f884.subfields.filter((subfield) => subfield.code === 'a').map(subfield => subfield.value);\n const conversion = sfA;\n debugData(`Conversion: \"${conversion}\"`);\n return conversion;\n }\n\n function findSource(f884) {\n const [sfK] = f884.subfields.filter((subfield) => subfield.code === 'k').map(subfield => subfield.value);\n const source = sfK.replace(/:.*$/u, '');\n if (source && source.length !== 64) {\n debugData(`Source: \"${source}\"`);\n return source;\n }\n const emptySource = 'NO_SOURCE';\n debugData(`Source: \"${emptySource}\"`);\n return emptySource;\n }\n\n function findHash(f884) {\n const [sfK] = f884.subfields.filter((subfield) => subfield.code === 'k').map(subfield => subfield.value);\n const hash = sfK.replace(/^.*:/u, '');\n if (hash && hash.length === 64) {\n debugData(`Hash: \"${hash}\"`);\n return hash;\n }\n const emptyHash = '0000000000000000000000000000000000000000000000000000000000000000';\n debugData(`Hash: \"${emptyHash}\"`);\n return emptyHash;\n }\n\n function findDates(f884) {\n const [sfG] = f884.subfields.filter((subfield) => subfield.code === 'g').map(subfield => subfield.value);\n if (sfG && (/ - /u).test(sfG)) {\n const firstDate = sfG.replace(/ - .*$/u, '').padStart(8, '0');\n const lastDate = sfG.replace(/^.* - /u, '').padStart(8, '0');\n debugData(`FirstDate: \"${firstDate}\", LastDate: \"${lastDate}\"`);\n return {firstDate, lastDate};\n }\n const firstDate = sfG ? sfG.padStart(8, '0') : '00000000';\n const lastDate = sfG ? sfG.padStart(8, '0') : '00000000';\n\n debugData(`FirstDate: \"${firstDate}\", LastDate: \"${lastDate}\"`);\n return {firstDate, lastDate};\n }\n\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["results", "firstDate", "lastDate"]
|
|
7
|
+
}
|
|
@@ -1,17 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.removeSubfield = removeSubfield;
|
|
7
|
-
exports.sortFieldsBySubfieldValue = sortFieldsBySubfieldValue;
|
|
8
|
-
function removeSubfield(field, code) {
|
|
9
|
-
// Handle non-numeric fields, and fields with a numeric tag of 010 and greater
|
|
10
|
-
// Aleph's FMT as a controlfield might be a problem
|
|
1
|
+
export function removeSubfield(field, code) {
|
|
11
2
|
if (!isNaN(field.tag) && parseInt(field.tag, 10) >= 10) {
|
|
12
|
-
const filteredSubfields = field.subfields.filter(sf => sf.code !== code);
|
|
13
|
-
|
|
14
|
-
// Remove whole field if there are no subfields left
|
|
3
|
+
const filteredSubfields = field.subfields.filter((sf) => sf.code !== code);
|
|
15
4
|
if (filteredSubfields.length < 1) {
|
|
16
5
|
return false;
|
|
17
6
|
}
|
|
@@ -22,12 +11,9 @@ function removeSubfield(field, code) {
|
|
|
22
11
|
subfields: filteredSubfields
|
|
23
12
|
};
|
|
24
13
|
}
|
|
25
|
-
// return controlFields as is
|
|
26
14
|
return field;
|
|
27
15
|
}
|
|
28
|
-
|
|
29
|
-
// sort fields by value of each fields first subfield with subfielCode
|
|
30
|
-
function sortFieldsBySubfieldValue(fields, subfieldCode) {
|
|
16
|
+
export function sortFieldsBySubfieldValue(fields, subfieldCode) {
|
|
31
17
|
return [...fields].sort((a, b) => {
|
|
32
18
|
const a1value = getFirstSubfieldValue(a, subfieldCode);
|
|
33
19
|
const b1value = getFirstSubfieldValue(b, subfieldCode);
|
|
@@ -45,10 +31,9 @@ function sortFieldsBySubfieldValue(fields, subfieldCode) {
|
|
|
45
31
|
}
|
|
46
32
|
return 0;
|
|
47
33
|
});
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
return subs.length > 0 ? subs[0].value : '';
|
|
34
|
+
function getFirstSubfieldValue(field, subfieldCode2) {
|
|
35
|
+
const subs = field.subfields ? field.subfields.filter((subf) => subf.code === subfieldCode2) : [];
|
|
36
|
+
return subs.length > 0 ? subs[0].value : "";
|
|
52
37
|
}
|
|
53
38
|
}
|
|
54
|
-
//# sourceMappingURL=fix-utils.js.map
|
|
39
|
+
//# sourceMappingURL=fix-utils.js.map
|
|
@@ -1 +1,7 @@
|
|
|
1
|
-
{
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/helpers/fix-utils.js"],
|
|
4
|
+
"sourcesContent": ["export function removeSubfield(field, code) {\n\n // Handle non-numeric fields, and fields with a numeric tag of 010 and greater\n // Aleph's FMT as a controlfield might be a problem\n if (!isNaN(field.tag) && parseInt(field.tag, 10) >= 10) {\n\n const filteredSubfields = field.subfields.filter(sf => sf.code !== code);\n\n // Remove whole field if there are no subfields left\n if (filteredSubfields.length < 1) {\n return false;\n }\n\n return {\n tag: field.tag,\n ind1: field.ind1,\n ind2: field.ind2,\n subfields: filteredSubfields\n };\n }\n // return controlFields as is\n return field;\n}\n\n\n// sort fields by value of each fields first subfield with subfielCode\nexport function sortFieldsBySubfieldValue(fields, subfieldCode) {\n return [...fields].sort((a, b) => {\n const a1value = getFirstSubfieldValue(a, subfieldCode);\n const b1value = getFirstSubfieldValue(b, subfieldCode);\n if (a1value && !b1value) {\n return -1;\n }\n if (!a1value && b1value) {\n return 1;\n }\n if (a1value > b1value) {\n return 1;\n }\n if (b1value > a1value) {\n return -1;\n }\n return 0;\n });\n // get value for the for instance of subfield with subfieldCode\n function getFirstSubfieldValue(field, subfieldCode) {\n const subs = field.subfields ? field.subfields.filter(subf => subf.code === subfieldCode) : [];\n return subs.length > 0 ? subs[0].value : '';\n }\n}\n"],
|
|
5
|
+
"mappings": "AAAO,gBAAS,eAAe,OAAO,MAAM;AAI1C,MAAI,CAAC,MAAM,MAAM,GAAG,KAAK,SAAS,MAAM,KAAK,EAAE,KAAK,IAAI;AAEtD,UAAM,oBAAoB,MAAM,UAAU,OAAO,QAAM,GAAG,SAAS,IAAI;AAGvE,QAAI,kBAAkB,SAAS,GAAG;AAChC,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL,KAAK,MAAM;AAAA,MACX,MAAM,MAAM;AAAA,MACZ,MAAM,MAAM;AAAA,MACZ,WAAW;AAAA,IACb;AAAA,EACF;AAEA,SAAO;AACT;AAIO,gBAAS,0BAA0B,QAAQ,cAAc;AAC9D,SAAO,CAAC,GAAG,MAAM,EAAE,KAAK,CAAC,GAAG,MAAM;AAChC,UAAM,UAAU,sBAAsB,GAAG,YAAY;AACrD,UAAM,UAAU,sBAAsB,GAAG,YAAY;AACrD,QAAI,WAAW,CAAC,SAAS;AACvB,aAAO;AAAA,IACT;AACA,QAAI,CAAC,WAAW,SAAS;AACvB,aAAO;AAAA,IACT;AACA,QAAI,UAAU,SAAS;AACrB,aAAO;AAAA,IACT;AACA,QAAI,UAAU,SAAS;AACrB,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT,CAAC;AAED,WAAS,sBAAsB,OAAOA,eAAc;AAClD,UAAM,OAAO,MAAM,YAAY,MAAM,UAAU,OAAO,UAAQ,KAAK,SAASA,aAAY,IAAI,CAAC;AAC7F,WAAO,KAAK,SAAS,IAAI,KAAK,CAAC,EAAE,QAAQ;AAAA,EAC3C;AACF;",
|
|
6
|
+
"names": ["subfieldCode"]
|
|
7
|
+
}
|
package/dist/helpers/fix.js
CHANGED
|
@@ -1,61 +1,24 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
var _melindaBackendCommons = require("@natlibfi/melinda-backend-commons");
|
|
13
|
-
var _debug = _interopRequireDefault(require("debug"));
|
|
14
|
-
var _fixHandleTempurns = require("./fix-handle-tempurns");
|
|
15
|
-
var _fixStripF884s = require("./fix-strip-f884s");
|
|
16
|
-
var _marcRecordValidatorsMelinda = require("@natlibfi/marc-record-validators-melinda");
|
|
17
|
-
var _fixConstants = require("./fix-constants");
|
|
18
|
-
Object.keys(_fixConstants).forEach(function (key) {
|
|
19
|
-
if (key === "default" || key === "__esModule") return;
|
|
20
|
-
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
|
21
|
-
if (key in exports && exports[key] === _fixConstants[key]) return;
|
|
22
|
-
Object.defineProperty(exports, key, {
|
|
23
|
-
enumerable: true,
|
|
24
|
-
get: function () {
|
|
25
|
-
return _fixConstants[key];
|
|
26
|
-
}
|
|
27
|
-
});
|
|
28
|
-
});
|
|
29
|
-
const logger = (0, _melindaBackendCommons.createLogger)();
|
|
30
|
-
const debug = (0, _debug.default)('@natlibfi/melinda-rest-api-commons:fixRecord');
|
|
31
|
-
const debugData = debug.extend('data');
|
|
32
|
-
function fixRecord(record, settings = {}) {
|
|
1
|
+
import createDebugLogger from "debug";
|
|
2
|
+
import { MarcRecord } from "@natlibfi/marc-record";
|
|
3
|
+
import { createLogger } from "@natlibfi/melinda-backend-commons";
|
|
4
|
+
import { FieldExclusion, SubfieldExclusion } from "@natlibfi/marc-record-validators-melinda";
|
|
5
|
+
import { handleTempUrns } from "./fix-handle-tempurns.js";
|
|
6
|
+
import { stripF884s } from "./fix-strip-f884s.js";
|
|
7
|
+
export * from "./fix-constants.js";
|
|
8
|
+
const logger = createLogger();
|
|
9
|
+
const debug = createDebugLogger("@natlibfi/melinda-rest-api-commons:fixRecord");
|
|
10
|
+
const debugData = debug.extend("data");
|
|
11
|
+
export function fixRecord(record, settings = {}) {
|
|
33
12
|
logger.verbose(`We will apply formatting to the record according to settings: ${JSON.stringify(settings)}`);
|
|
34
|
-
const newRecord =
|
|
35
|
-
subfieldValues: false
|
|
36
|
-
});
|
|
13
|
+
const newRecord = MarcRecord.clone(record, { subfieldValues: false });
|
|
37
14
|
debugData(`settings: ${JSON.stringify(settings)}`);
|
|
38
|
-
|
|
39
|
-
// We should handle these in some prettier way ...
|
|
40
|
-
|
|
41
|
-
// Fix 1, generate SIDs
|
|
42
|
-
const generateMissingSIDsOptions = settings.generateMissingSIDs || undefined;
|
|
15
|
+
const generateMissingSIDsOptions = settings.generateMissingSIDs || void 0;
|
|
43
16
|
const newRecord1 = generateMissingSIDs(newRecord, generateMissingSIDsOptions);
|
|
44
|
-
|
|
45
|
-
// Fix 2, replace identifier prefixes
|
|
46
17
|
const replacePrefixesOptions = settings.replacePrefixes || [];
|
|
47
18
|
const newRecord2 = replaceAllPrefixes(newRecord1, replacePrefixesOptions);
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
const newRecord3 = (0, _fixHandleTempurns.handleTempUrns)(newRecord2, settings.handleTempUrns);
|
|
51
|
-
|
|
52
|
-
// Fix 4, strip extra field 884s
|
|
53
|
-
const newRecord4 = (0, _fixStripF884s.stripF884s)(newRecord3, settings.stripF884s);
|
|
54
|
-
|
|
55
|
-
// Fix 5, strip extra field 984s
|
|
19
|
+
const newRecord3 = handleTempUrns(newRecord2, settings.handleTempUrns);
|
|
20
|
+
const newRecord4 = stripF884s(newRecord3, settings.stripF884s);
|
|
56
21
|
const newRecord5 = stripF984s(newRecord4, settings.stripF984s || false);
|
|
57
|
-
|
|
58
|
-
// Fix 6, strip $9 MELINDA<TEMP> subfields
|
|
59
22
|
const newRecord6 = stripMelindaTempSubfields(newRecord5, settings.stripMelindaTempSubfields || false);
|
|
60
23
|
debugData(newRecord6);
|
|
61
24
|
return newRecord6.toObject();
|
|
@@ -67,27 +30,19 @@ function replaceAllPrefixes(record, replacePrefixesOptions) {
|
|
|
67
30
|
}
|
|
68
31
|
debug(`Running replacePrefixes fixer`);
|
|
69
32
|
debugData(`replacePrefixesOptions: ${JSON.stringify(replacePrefixesOptions)}`);
|
|
70
|
-
replacePrefixesOptions.forEach(options => {
|
|
33
|
+
replacePrefixesOptions.forEach((options) => {
|
|
71
34
|
replacePrefix(record, options);
|
|
72
35
|
});
|
|
73
36
|
return record;
|
|
74
37
|
}
|
|
75
|
-
|
|
76
|
-
// Replace prefix in all specified subfields
|
|
77
38
|
function replacePrefix(record, options) {
|
|
78
|
-
const {
|
|
79
|
-
oldPrefix,
|
|
80
|
-
newPrefix,
|
|
81
|
-
prefixReplaceCodes
|
|
82
|
-
} = options;
|
|
39
|
+
const { oldPrefix, newPrefix, prefixReplaceCodes } = options;
|
|
83
40
|
debug(`Replacing ${oldPrefix} with ${newPrefix} in subfields ${prefixReplaceCodes}`);
|
|
84
41
|
const pattern = `(${oldPrefix})`;
|
|
85
42
|
const replacement = `(${newPrefix})`;
|
|
86
|
-
record.getDatafields().forEach(field => {
|
|
87
|
-
field.subfields.filter(({
|
|
88
|
-
|
|
89
|
-
}) => prefixReplaceCodes.includes(code)).forEach(subfield => {
|
|
90
|
-
subfield.value = subfield.value.replace(pattern, replacement); // eslint-disable-line functional/immutable-data
|
|
43
|
+
record.getDatafields().forEach((field) => {
|
|
44
|
+
field.subfields.filter(({ code }) => prefixReplaceCodes.includes(code)).forEach((subfield) => {
|
|
45
|
+
subfield.value = subfield.value.replace(pattern, replacement);
|
|
91
46
|
});
|
|
92
47
|
});
|
|
93
48
|
return record;
|
|
@@ -103,76 +58,60 @@ function generateMissingSIDs(record, options) {
|
|
|
103
58
|
debugData(`generateMissingSIDs options: ${JSON.stringify(options)}`);
|
|
104
59
|
const f035s = f035ToSidInfo(record.get(/^035$/u));
|
|
105
60
|
const fSIDs = sidsToSidInfo(record.get(/^SID$/u));
|
|
106
|
-
const sidsToBeAdded = genNewSids(fSIDs.length === 0 ? f035s
|
|
107
|
-
// test that SIDs are not there yet
|
|
108
|
-
: f035s.filter(f035SidInfo => !fSIDs.some(fSIDInfo => f035SidInfo.SID === fSIDInfo.SID && f035SidInfo.value === fSIDInfo.value)));
|
|
61
|
+
const sidsToBeAdded = genNewSids(fSIDs.length === 0 ? f035s : f035s.filter((f035SidInfo) => !fSIDs.some((fSIDInfo) => f035SidInfo.SID === fSIDInfo.SID && f035SidInfo.value === fSIDInfo.value)));
|
|
109
62
|
debugData(`Adding (${sidsToBeAdded.length}) SIDs: ${JSON.stringify(sidsToBeAdded)}`);
|
|
110
|
-
|
|
111
|
-
// Add new SIDs
|
|
112
|
-
sidsToBeAdded.forEach(sidField => record.insertField(sidField));
|
|
63
|
+
sidsToBeAdded.forEach((sidField) => record.insertField(sidField));
|
|
113
64
|
return record;
|
|
114
|
-
function genNewSids(
|
|
115
|
-
return
|
|
116
|
-
tag: 'SID',
|
|
117
|
-
ind1: ' ',
|
|
118
|
-
ind2: ' ',
|
|
119
|
-
subfields: [{
|
|
120
|
-
code: 'c',
|
|
121
|
-
value: sidInfo.value
|
|
122
|
-
}, {
|
|
123
|
-
code: 'b',
|
|
124
|
-
value: sidInfo.SID
|
|
125
|
-
}]
|
|
126
|
-
}));
|
|
65
|
+
function genNewSids(sidsToBeAdded2) {
|
|
66
|
+
return sidsToBeAdded2.map((sidInfo) => ({ tag: "SID", ind1: " ", ind2: " ", subfields: [{ code: "c", value: sidInfo.value }, { code: "b", value: sidInfo.SID }] }));
|
|
127
67
|
}
|
|
128
68
|
function sidsToSidInfo(SIDs) {
|
|
129
|
-
return SIDs.flatMap(({
|
|
130
|
-
subfields
|
|
131
|
-
|
|
132
|
-
const [SID] = subfields.filter(sub => sub.code === 'b' && fSIDFilters.includes(sub.value)).map(sub => sub.value);
|
|
133
|
-
const [value] = subfields.filter(sub => sub.code === 'c' && sub.value !== undefined).map(sub => sub.value);
|
|
69
|
+
return SIDs.flatMap(({ subfields }) => {
|
|
70
|
+
const [SID] = subfields.filter((sub) => sub.code === "b" && fSIDFilters.includes(sub.value)).map((sub) => sub.value);
|
|
71
|
+
const [value] = subfields.filter((sub) => sub.code === "c" && sub.value !== void 0).map((sub) => sub.value);
|
|
134
72
|
if (SID && value) {
|
|
135
73
|
return {
|
|
136
74
|
SID,
|
|
137
75
|
value
|
|
138
76
|
};
|
|
139
77
|
}
|
|
140
|
-
return
|
|
141
|
-
}).filter(value => value !==
|
|
78
|
+
return void 0;
|
|
79
|
+
}).filter((value) => value !== void 0);
|
|
142
80
|
}
|
|
143
|
-
function f035ToSidInfo(
|
|
144
|
-
return
|
|
145
|
-
subfields
|
|
146
|
-
}) => {
|
|
147
|
-
const [wantedSub] = subfields.filter(sub => sub.code === 'a' && f035Filters.some(regexp => regexp.test(sub.value)));
|
|
81
|
+
function f035ToSidInfo(f035s2) {
|
|
82
|
+
return f035s2.flatMap(({ subfields }) => {
|
|
83
|
+
const [wantedSub] = subfields.filter((sub) => sub.code === "a" && f035Filters.some((regexp) => regexp.test(sub.value)));
|
|
148
84
|
if (wantedSub) {
|
|
149
85
|
return {
|
|
150
|
-
SID: fSIDFilters[f035Filters.findIndex(regexp => regexp.test(wantedSub.value))],
|
|
151
|
-
value: wantedSub.value.slice(wantedSub.value.indexOf(
|
|
86
|
+
SID: fSIDFilters[f035Filters.findIndex((regexp) => regexp.test(wantedSub.value))],
|
|
87
|
+
value: wantedSub.value.slice(wantedSub.value.indexOf(")") + 1)
|
|
152
88
|
};
|
|
153
89
|
}
|
|
154
|
-
return
|
|
155
|
-
}).filter(value => value !==
|
|
90
|
+
return void 0;
|
|
91
|
+
}).filter((value) => value !== void 0);
|
|
156
92
|
}
|
|
157
93
|
}
|
|
158
94
|
function stripF984s(record, stripF984sSettings) {
|
|
159
95
|
const F984A_PATTERN = /^(?:ALWAYS|NEVER)-PREFER-IN-MERGE$/u;
|
|
160
|
-
const config = [
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
96
|
+
const config = [
|
|
97
|
+
{
|
|
98
|
+
tag: /^984$/u,
|
|
99
|
+
subfields: [
|
|
100
|
+
{
|
|
101
|
+
code: /a/u,
|
|
102
|
+
value: F984A_PATTERN
|
|
103
|
+
}
|
|
104
|
+
]
|
|
105
|
+
}
|
|
106
|
+
];
|
|
167
107
|
debug(`Running removeF984AFields`);
|
|
168
108
|
debugData(`removeF984AFieldsSettings: ${JSON.stringify(stripF984sSettings)}`);
|
|
169
|
-
if (!stripF984sSettings || !F984A_PATTERN || record.get(
|
|
109
|
+
if (!stripF984sSettings || !F984A_PATTERN || record.get("984").length < 1) {
|
|
170
110
|
debug(`No settings or pattern for removeF984AFields or f984 in record`);
|
|
171
111
|
return record;
|
|
172
112
|
}
|
|
173
113
|
debug(`Removing f984 fields with subfield $a consisting values ${F984A_PATTERN.toString()}`);
|
|
174
|
-
|
|
175
|
-
const validator = (0, _marcRecordValidatorsMelinda.FieldExclusion)(config);
|
|
114
|
+
const validator = FieldExclusion(config);
|
|
176
115
|
validator.fix(record);
|
|
177
116
|
return record;
|
|
178
117
|
}
|
|
@@ -181,22 +120,23 @@ function stripMelindaTempSubfields(record, stripMelindaTempSubfieldsSettings) {
|
|
|
181
120
|
debug(`No settings for stripMelindaTempSubfields`);
|
|
182
121
|
return record;
|
|
183
122
|
}
|
|
184
|
-
// NOTE: we remove $9 MELINDA<TEMP> subfields only from f856
|
|
185
123
|
const tagPattern = /856/u;
|
|
186
124
|
const subfieldCodePattern = /9/u;
|
|
187
125
|
const subfieldValuePattern = /^MELINDA<TEMP>$/u;
|
|
188
|
-
const config = [
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
126
|
+
const config = [
|
|
127
|
+
{
|
|
128
|
+
tag: tagPattern,
|
|
129
|
+
subfields: [
|
|
130
|
+
{
|
|
131
|
+
code: subfieldCodePattern,
|
|
132
|
+
value: subfieldValuePattern
|
|
133
|
+
}
|
|
134
|
+
]
|
|
135
|
+
}
|
|
136
|
+
];
|
|
195
137
|
debug(`Running stripMelindaTempSubfields`);
|
|
196
|
-
|
|
197
|
-
// eslint-disable-next-line new-cap
|
|
198
|
-
const validator = (0, _marcRecordValidatorsMelinda.SubfieldExclusion)(config);
|
|
138
|
+
const validator = SubfieldExclusion(config);
|
|
199
139
|
validator.fix(record);
|
|
200
140
|
return record;
|
|
201
141
|
}
|
|
202
|
-
//# sourceMappingURL=fix.js.map
|
|
142
|
+
//# sourceMappingURL=fix.js.map
|