@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.
Files changed (55) hide show
  1. package/.github/workflows/melinda-node-tests.yml +9 -6
  2. package/dist/amqp.js +60 -151
  3. package/dist/amqp.js.map +7 -1
  4. package/dist/constants.js +40 -51
  5. package/dist/constants.js.map +7 -1
  6. package/dist/helpers/conversion.js +39 -57
  7. package/dist/helpers/conversion.js.map +7 -1
  8. package/dist/helpers/fix-constants.js +40 -47
  9. package/dist/helpers/fix-constants.js.map +7 -1
  10. package/dist/helpers/fix-handle-tempurns.js +23 -73
  11. package/dist/helpers/fix-handle-tempurns.js.map +7 -1
  12. package/dist/helpers/fix-strip-f884s.js +44 -94
  13. package/dist/helpers/fix-strip-f884s.js.map +7 -1
  14. package/dist/helpers/fix-utils.js +7 -22
  15. package/dist/helpers/fix-utils.js.map +7 -1
  16. package/dist/helpers/fix.js +62 -122
  17. package/dist/helpers/fix.js.map +7 -1
  18. package/dist/helpers/validation.js +12 -30
  19. package/dist/helpers/validation.js.map +7 -1
  20. package/dist/index.js +10 -109
  21. package/dist/index.js.map +7 -1
  22. package/dist/mongo.js +173 -509
  23. package/dist/mongo.js.map +7 -1
  24. package/dist/mongoLog.js +92 -317
  25. package/dist/mongoLog.js.map +7 -1
  26. package/dist/utils.js +46 -155
  27. package/dist/utils.js.map +7 -1
  28. package/eslint.config.js +53 -0
  29. package/package.json +23 -96
  30. package/tests/{amqp.health.spec.js → amqp.healthtest.js} +2 -2
  31. package/tests/{amqp.tests.spec.js → amqp.tests.localtest.js} +46 -46
  32. package/tests/helpers/{conversion.spec.js → conversion.test.js} +38 -25
  33. package/tests/helpers/{fix.spec.js → fix.test.js} +6 -6
  34. package/tests/helpers/{validation.spec.js → validation.test.js} +12 -9
  35. package/tests/{mongo-add-blob-size.spec.js → mongo-add-blob-size.test.js} +6 -6
  36. package/tests/{mongo-check-and-check-state.spec.js → mongo-check-and-check-state.test.js} +7 -7
  37. package/tests/{mongo-check-and-set-import-job-state.spec.js → mongo-check-and-set-import-job-state.test.js} +7 -7
  38. package/tests/{mongo-check-timeout.spec.js → mongo-check-timeout.test.js} +7 -7
  39. package/tests/{mongo-create-bulk.spec.js → mongo-create-bulk.test.js} +5 -5
  40. package/tests/{mongo-create-prio.spec.js → mongo-create-prio.test.js} +6 -6
  41. package/tests/{mongo-get-one.spec.js → mongo-get-one.test.js} +7 -7
  42. package/tests/{mongo-get-stream.spec.js → mongo-get-stream.test.js} +7 -7
  43. package/tests/{mongo-push-ids.spec.js → mongo-push-ids.test.js} +5 -5
  44. package/tests/{mongo-push-messages.spec.js → mongo-push-messages.test.js} +6 -6
  45. package/tests/{mongo-query-by-id.spec.js → mongo-query-by-id.test.js} +7 -7
  46. package/tests/{mongo-query.spec.js → mongo-query.test.js} +7 -7
  47. package/tests/{mongo-read-content.spec.js → mongo-read-content.test.js} +8 -8
  48. package/tests/{mongo-remove.spec.js → mongo-remove.test.js} +6 -6
  49. package/tests/{mongo-set-blob-size.spec.js → mongo-set-blob-size.test.js} +6 -6
  50. package/tests/{mongo-set-import-job-state.spec.js → mongo-set-import-job-state.test.js} +6 -6
  51. package/tests/{mongo-set-operation.spec.js → mongo-set-operation.test.js} +6 -6
  52. package/tests/{mongo-set-operations.spec.js → mongo-set-operations.test.js} +6 -6
  53. package/tests/{mongo-set-state.spec.js → mongo-set-state.test.js} +7 -7
  54. package/tests/{mongoLog.spec.js → mongoLog.test.js} +10 -11
  55. package/tests/testUtils.js +9 -8
@@ -1,58 +1,33 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- Object.defineProperty(exports, "__esModule", {
5
- value: true
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}) \n ${JSON.stringify(f884Melindas)}`);
30
- //debugData(`Melinda's f884s (${f884Melindas.length}) \n ${inspect(f884Melindas, {depth: 3})}`);
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 !== '00000000' ? firstDate : currResult.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 !== '00000000' && hash !== '0000000000000000000000000000000000000000000000000000000000000000' ? hash : currResult.hash
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 && results[convSource]) {
100
- debugData(`Found: ${JSON.stringify(results[convSource])}`);
101
- const firstDate = results[convSource].firstDate && results[convSource].firstDate !== '00000000' ? results[convSource].firstDate : '';
102
- const lastDate = results[convSource].lastDate && results[convSource].lastDate !== '00000000' ? results[convSource].lastDate : '';
103
- const source = results[convSource].source && results[convSource].source !== 'NO_SOURCE' ? results[convSource].source : '';
104
- const hash = results[convSource].hash && results[convSource].hash !== '0000000000000000000000000000000000000000000000000000000000000000' ? results[convSource].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, '').replace(/ - $/u, '');
109
- const sfK = sfKAll.replace(/^:/u, '').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
- // we don't get $g or $k if the original field doesn't have them
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 === 'k') {
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((0, _util.inspect)(uniq884s, {
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 => _marcRecord.MarcRecord.isEqual(f, field))) {
146
- // eslint-disable-line functional/no-conditional-statements
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 === 'a').map(subfield => subfield.value);
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 === 'k').map(subfield => subfield.value);
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 = 'NO_SOURCE';
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 === 'k').map(subfield => subfield.value);
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 = '0000000000000000000000000000000000000000000000000000000000000000';
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 === 'g').map(subfield => subfield.value);
147
+ const [sfG] = f884.subfields.filter((subfield) => subfield.code === "g").map((subfield) => subfield.value);
192
148
  if (sfG && / - /u.test(sfG)) {
193
- const firstDate = sfG.replace(/ - .*$/u, '').padStart(8, '0');
194
- const lastDate = sfG.replace(/^.* - /u, '').padStart(8, '0');
195
- debugData(`FirstDate: "${firstDate}", LastDate: "${lastDate}"`);
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, '0') : '00000000';
202
- const lastDate = sfG ? sfG.padStart(8, '0') : '00000000';
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
- "use strict";
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
- // get value for the for instance of subfield with subfieldCode
49
- function getFirstSubfieldValue(field, subfieldCode) {
50
- const subs = field.subfields ? field.subfields.filter(subf => subf.code === subfieldCode) : [];
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
- {"version":3,"file":"fix-utils.js","names":["removeSubfield","field","code","isNaN","tag","parseInt","filteredSubfields","subfields","filter","sf","length","ind1","ind2","sortFieldsBySubfieldValue","fields","subfieldCode","sort","a","b","a1value","getFirstSubfieldValue","b1value","subs","subf","value"],"sources":["../../src/helpers/fix-utils.js"],"sourcesContent":["\n\nexport 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"],"mappings":";;;;;;;AAEO,SAASA,cAAcA,CAACC,KAAK,EAAEC,IAAI,EAAE;EAE1C;EACA;EACA,IAAI,CAACC,KAAK,CAACF,KAAK,CAACG,GAAG,CAAC,IAAIC,QAAQ,CAACJ,KAAK,CAACG,GAAG,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE;IAEtD,MAAME,iBAAiB,GAAGL,KAAK,CAACM,SAAS,CAACC,MAAM,CAACC,EAAE,IAAIA,EAAE,CAACP,IAAI,KAAKA,IAAI,CAAC;;IAExE;IACA,IAAII,iBAAiB,CAACI,MAAM,GAAG,CAAC,EAAE;MAChC,OAAO,KAAK;IACd;IAEA,OAAO;MACLN,GAAG,EAAEH,KAAK,CAACG,GAAG;MACdO,IAAI,EAAEV,KAAK,CAACU,IAAI;MAChBC,IAAI,EAAEX,KAAK,CAACW,IAAI;MAChBL,SAAS,EAAED;IACb,CAAC;EACH;EACA;EACA,OAAOL,KAAK;AACd;;AAGA;AACO,SAASY,yBAAyBA,CAACC,MAAM,EAAEC,YAAY,EAAE;EAC9D,OAAO,CAAC,GAAGD,MAAM,CAAC,CAACE,IAAI,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAK;IAChC,MAAMC,OAAO,GAAGC,qBAAqB,CAACH,CAAC,EAAEF,YAAY,CAAC;IACtD,MAAMM,OAAO,GAAGD,qBAAqB,CAACF,CAAC,EAAEH,YAAY,CAAC;IACtD,IAAII,OAAO,IAAI,CAACE,OAAO,EAAE;MACvB,OAAO,CAAC,CAAC;IACX;IACA,IAAI,CAACF,OAAO,IAAIE,OAAO,EAAE;MACvB,OAAO,CAAC;IACV;IACA,IAAIF,OAAO,GAAGE,OAAO,EAAE;MACrB,OAAO,CAAC;IACV;IACA,IAAIA,OAAO,GAAGF,OAAO,EAAE;MACrB,OAAO,CAAC,CAAC;IACX;IACA,OAAO,CAAC;EACV,CAAC,CAAC;EACF;EACA,SAASC,qBAAqBA,CAACnB,KAAK,EAAEc,YAAY,EAAE;IAClD,MAAMO,IAAI,GAAGrB,KAAK,CAACM,SAAS,GAAGN,KAAK,CAACM,SAAS,CAACC,MAAM,CAACe,IAAI,IAAIA,IAAI,CAACrB,IAAI,KAAKa,YAAY,CAAC,GAAG,EAAE;IAC9F,OAAOO,IAAI,CAACZ,MAAM,GAAG,CAAC,GAAGY,IAAI,CAAC,CAAC,CAAC,CAACE,KAAK,GAAG,EAAE;EAC7C;AACF","ignoreList":[]}
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
+ }
@@ -1,61 +1,24 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- Object.defineProperty(exports, "__esModule", {
5
- value: true
6
- });
7
- var _exportNames = {
8
- fixRecord: true
9
- };
10
- exports.fixRecord = fixRecord;
11
- var _marcRecord = require("@natlibfi/marc-record");
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 = _marcRecord.MarcRecord.clone(record, {
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
- // Fix 3, handle temporary URNs from legal deposit record import
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
- code
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(sidsToBeAdded) {
115
- return sidsToBeAdded.map(sidInfo => ({
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 undefined;
141
- }).filter(value => value !== undefined);
78
+ return void 0;
79
+ }).filter((value) => value !== void 0);
142
80
  }
143
- function f035ToSidInfo(f035s) {
144
- return f035s.flatMap(({
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(')') + 1)
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 undefined;
155
- }).filter(value => value !== undefined);
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
- tag: /^984$/u,
162
- subfields: [{
163
- code: /a/u,
164
- value: F984A_PATTERN
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('984').length < 1) {
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
- // eslint-disable-next-line new-cap
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
- tag: tagPattern,
190
- subfields: [{
191
- code: subfieldCodePattern,
192
- value: subfieldValuePattern
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