@natlibfi/marc-record-merge 7.0.10 → 8.0.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/melinda-node-tests.yml +3 -3
- package/dist/index.js +20 -58
- package/dist/index.js.map +7 -1
- package/dist/reducers/copy.js +78 -148
- package/dist/reducers/copy.js.map +7 -1
- package/dist/reducers/index.js +4 -17
- package/dist/reducers/index.js.map +7 -1
- package/dist/reducers/select.js +36 -84
- package/dist/reducers/select.js.map +7 -1
- package/eslint.config.mjs +52 -0
- package/package.json +18 -87
- package/src/index.js +1 -1
- package/src/reducers/copy.js +1 -4
- package/src/reducers/index.js +2 -2
- package/src/reducers/select.js +2 -2
- package/{src/index.spec.js → test/index.test.js} +4 -5
- package/{src/reducers/copy.spec.js → test/reducers/copy.test.js} +7 -6
- package/{src/reducers/copy2.spec.js → test/reducers/copy2.test.js} +7 -6
- package/test/reducers/select.test.js +61 -0
- package/test/reducers/select2.test.js +61 -0
- package/test-fixtures/reducers/select/01/metadata.json +5 -1
- package/dist/index.spec.js +0 -58
- package/dist/index.spec.js.map +0 -1
- package/dist/reducers/copy.spec.js +0 -64
- package/dist/reducers/copy.spec.js.map +0 -1
- package/dist/reducers/copy2.spec.js +0 -67
- package/dist/reducers/copy2.spec.js.map +0 -1
- package/dist/reducers/select.spec.js +0 -54
- package/dist/reducers/select.spec.js.map +0 -1
- package/dist/reducers/select2.spec.js +0 -57
- package/dist/reducers/select2.spec.js.map +0 -1
- package/src/reducers/select.spec.js +0 -49
- package/src/reducers/select2.spec.js +0 -49
package/dist/reducers/select.js
CHANGED
|
@@ -1,59 +1,34 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
exports.strictEquality = strictEquality;
|
|
8
|
-
exports.subsetEquality = subsetEquality;
|
|
9
|
-
var _normalizeDiacritics = require("normalize-diacritics");
|
|
10
|
-
var _debug = _interopRequireDefault(require("debug"));
|
|
11
|
-
var _marcRecord = require("@natlibfi/marc-record");
|
|
12
|
-
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
13
|
-
function strictEquality(subfieldA, subfieldB) {
|
|
1
|
+
import { normalizeSync } from "normalize-diacritics";
|
|
2
|
+
import createDebugLogger from "debug";
|
|
3
|
+
import { MarcRecord } from "@natlibfi/marc-record";
|
|
4
|
+
export function strictEquality(subfieldA, subfieldB) {
|
|
14
5
|
return subfieldA.code === subfieldB.code && subfieldA.value === subfieldB.value;
|
|
15
6
|
}
|
|
16
|
-
function subsetEquality(subfieldA, subfieldB) {
|
|
7
|
+
export function subsetEquality(subfieldA, subfieldB) {
|
|
17
8
|
return subfieldA.code === subfieldB.code && (subfieldA.value.indexOf(subfieldB.value) !== -1 || subfieldB.value.indexOf(subfieldA.value) !== -1);
|
|
18
9
|
}
|
|
19
|
-
|
|
20
|
-
var _default = ({
|
|
10
|
+
export default ({
|
|
21
11
|
tagPattern,
|
|
22
12
|
equalityFunction = strictEquality,
|
|
23
|
-
baseValidators = {
|
|
24
|
-
|
|
25
|
-
},
|
|
26
|
-
sourceValidators = {
|
|
27
|
-
subfieldValues: false
|
|
28
|
-
}
|
|
13
|
+
baseValidators = { subfieldValues: false },
|
|
14
|
+
sourceValidators = { subfieldValues: false }
|
|
29
15
|
// eslint-disable-next-line max-statements
|
|
30
16
|
}) => (base, source) => {
|
|
31
|
-
const debug = (
|
|
32
|
-
const {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
if (source === undefined && base.base !== undefined && base.source !== undefined) {
|
|
39
|
-
const baseRecord = new _marcRecord.MarcRecord(base.base, baseValidators);
|
|
40
|
-
const sourceRecord = new _marcRecord.MarcRecord(base.source, sourceValidators);
|
|
41
|
-
return {
|
|
42
|
-
baseRecord,
|
|
43
|
-
sourceRecord
|
|
44
|
-
};
|
|
17
|
+
const debug = createDebugLogger("@natlibfi/marc-record-merge:select");
|
|
18
|
+
const { baseRecord, sourceRecord } = getRecordsFromParameters(base, source, baseValidators, sourceValidators);
|
|
19
|
+
function getRecordsFromParameters(base2, source2, baseValidators2, sourceValidators2) {
|
|
20
|
+
if (source2 === void 0 && base2.base !== void 0 && base2.source !== void 0) {
|
|
21
|
+
const baseRecord3 = new MarcRecord(base2.base, baseValidators2);
|
|
22
|
+
const sourceRecord3 = new MarcRecord(base2.source, sourceValidators2);
|
|
23
|
+
return { baseRecord: baseRecord3, sourceRecord: sourceRecord3 };
|
|
45
24
|
}
|
|
46
|
-
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
return {
|
|
50
|
-
baseRecord,
|
|
51
|
-
sourceRecord
|
|
52
|
-
};
|
|
25
|
+
const baseRecord2 = new MarcRecord(base2, baseValidators2);
|
|
26
|
+
const sourceRecord2 = new MarcRecord(source2, sourceValidators2);
|
|
27
|
+
return { baseRecord: baseRecord2, sourceRecord: sourceRecord2 };
|
|
53
28
|
}
|
|
54
29
|
const baseFields = baseRecord.get(tagPattern);
|
|
55
30
|
const sourceFields = sourceRecord.get(tagPattern);
|
|
56
|
-
const fieldTag = sourceFields.map(field => field.tag);
|
|
31
|
+
const fieldTag = sourceFields.map((field) => field.tag);
|
|
57
32
|
debug(`Comparing field ${fieldTag}`);
|
|
58
33
|
checkFieldType(baseFields);
|
|
59
34
|
checkFieldType(sourceFields);
|
|
@@ -71,28 +46,12 @@ var _default = ({
|
|
|
71
46
|
}
|
|
72
47
|
const baseSubs = baseField.subfields;
|
|
73
48
|
const sourceSubs = sourceField.subfields;
|
|
74
|
-
const baseSubsNormalized = baseSubs.map(({
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
})
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
}));
|
|
81
|
-
const sourceSubsNormalized = sourceSubs.map(({
|
|
82
|
-
code,
|
|
83
|
-
value
|
|
84
|
-
}) => ({
|
|
85
|
-
code,
|
|
86
|
-
value: normalizeSubfieldValue(value)
|
|
87
|
-
}));
|
|
88
|
-
|
|
89
|
-
// Returns the base subfields for which a matching source subfield is found
|
|
90
|
-
const equalSubfieldsBase = baseSubsNormalized.filter(baseSubfield => sourceSubsNormalized.some(sourceSubfield => equalityFunction(baseSubfield, sourceSubfield)));
|
|
91
|
-
debug(`equalSubfieldsBase: ${JSON.stringify(equalSubfieldsBase, undefined, 2)}`);
|
|
92
|
-
|
|
93
|
-
// Returns the source subfields for which a matching base subfield is found
|
|
94
|
-
const equalSubfieldsSource = sourceSubsNormalized.filter(sourceSubfield => baseSubsNormalized.some(baseSubfield => equalityFunction(sourceSubfield, baseSubfield)));
|
|
95
|
-
debug(`equalSubfieldsSource: ${JSON.stringify(equalSubfieldsSource, undefined, 2)}`);
|
|
49
|
+
const baseSubsNormalized = baseSubs.map(({ code, value }) => ({ code, value: normalizeSubfieldValue(value) }));
|
|
50
|
+
const sourceSubsNormalized = sourceSubs.map(({ code, value }) => ({ code, value: normalizeSubfieldValue(value) }));
|
|
51
|
+
const equalSubfieldsBase = baseSubsNormalized.filter((baseSubfield) => sourceSubsNormalized.some((sourceSubfield) => equalityFunction(baseSubfield, sourceSubfield)));
|
|
52
|
+
debug(`equalSubfieldsBase: ${JSON.stringify(equalSubfieldsBase, void 0, 2)}`);
|
|
53
|
+
const equalSubfieldsSource = sourceSubsNormalized.filter((sourceSubfield) => baseSubsNormalized.some((baseSubfield) => equalityFunction(sourceSubfield, baseSubfield)));
|
|
54
|
+
debug(`equalSubfieldsSource: ${JSON.stringify(equalSubfieldsSource, void 0, 2)}`);
|
|
96
55
|
if (baseSubs.length === sourceSubs.length && equalSubfieldsBase.length < baseSubs.length) {
|
|
97
56
|
debug(`Base and source subfields are not equal`);
|
|
98
57
|
debug(`No changes to base`);
|
|
@@ -100,12 +59,8 @@ var _default = ({
|
|
|
100
59
|
}
|
|
101
60
|
if (baseSubs.length === sourceSubs.length && equalSubfieldsBase.length === equalSubfieldsSource.length) {
|
|
102
61
|
debug(`Checking subfield equality`);
|
|
103
|
-
const totalSubfieldLengthBase = baseSubsNormalized.map(({
|
|
104
|
-
|
|
105
|
-
}) => value.length).reduce((acc, value) => acc + value);
|
|
106
|
-
const totalSubfieldLengthSource = sourceSubsNormalized.map(({
|
|
107
|
-
value
|
|
108
|
-
}) => value.length).reduce((acc, value) => acc + value);
|
|
62
|
+
const totalSubfieldLengthBase = baseSubsNormalized.map(({ value }) => value.length).reduce((acc, value) => acc + value);
|
|
63
|
+
const totalSubfieldLengthSource = sourceSubsNormalized.map(({ value }) => value.length).reduce((acc, value) => acc + value);
|
|
109
64
|
if (totalSubfieldLengthSource > totalSubfieldLengthBase) {
|
|
110
65
|
return replaceBasefieldWithSourcefield(baseRecord.toObject());
|
|
111
66
|
}
|
|
@@ -115,27 +70,24 @@ var _default = ({
|
|
|
115
70
|
}
|
|
116
71
|
debug(`No changes to base`);
|
|
117
72
|
return baseRecord.toObject();
|
|
118
|
-
function replaceBasefieldWithSourcefield(
|
|
119
|
-
const index =
|
|
120
|
-
|
|
73
|
+
function replaceBasefieldWithSourcefield(base2) {
|
|
74
|
+
const index = base2.fields.findIndex((field) => field === baseField);
|
|
75
|
+
base2.fields.splice(index, 1, sourceField);
|
|
121
76
|
debug(`Source field is longer, replacing base with source`);
|
|
122
|
-
return
|
|
77
|
+
return base2;
|
|
123
78
|
}
|
|
124
79
|
function checkFieldType(fields) {
|
|
125
|
-
const checkedFields = fields.map(field => {
|
|
126
|
-
if (
|
|
127
|
-
|
|
128
|
-
throw new Error('Invalid control field, expected data field');
|
|
80
|
+
const checkedFields = fields.map((field) => {
|
|
81
|
+
if ("value" in field) {
|
|
82
|
+
throw new Error("Invalid control field, expected data field");
|
|
129
83
|
}
|
|
130
84
|
return field;
|
|
131
85
|
});
|
|
132
86
|
return checkedFields;
|
|
133
87
|
}
|
|
134
88
|
function normalizeSubfieldValue(value) {
|
|
135
|
-
// Regexp options: g: global search, u: unicode
|
|
136
89
|
const punctuation = /[.,\-/#!?$%^&*;:{}=_`~()[\]]/gu;
|
|
137
|
-
return
|
|
90
|
+
return normalizeSync(value).toLowerCase().replace(punctuation, "", "u").replace(/\s+/gu, " ").trim();
|
|
138
91
|
}
|
|
139
92
|
};
|
|
140
|
-
|
|
141
|
-
//# sourceMappingURL=select.js.map
|
|
93
|
+
//# sourceMappingURL=select.js.map
|
|
@@ -1 +1,7 @@
|
|
|
1
|
-
{"version":3,"file":"select.js","names":["_normalizeDiacritics","require","_debug","_interopRequireDefault","_marcRecord","e","__esModule","default","strictEquality","subfieldA","subfieldB","code","value","subsetEquality","indexOf","_default","tagPattern","equalityFunction","baseValidators","subfieldValues","sourceValidators","base","source","debug","createDebugLogger","baseRecord","sourceRecord","getRecordsFromParameters","undefined","MarcRecord","baseFields","get","sourceFields","fieldTag","map","field","tag","checkFieldType","length","toObject","baseField","sourceField","baseSubs","subfields","sourceSubs","baseSubsNormalized","normalizeSubfieldValue","sourceSubsNormalized","equalSubfieldsBase","filter","baseSubfield","some","sourceSubfield","JSON","stringify","equalSubfieldsSource","totalSubfieldLengthBase","reduce","acc","totalSubfieldLengthSource","replaceBasefieldWithSourcefield","index","fields","findIndex","splice","checkedFields","Error","punctuation","normalizeSync","toLowerCase","replace","trim","exports"],"sources":["../../src/reducers/select.js"],"sourcesContent":["import {normalizeSync} from 'normalize-diacritics';\nimport createDebugLogger from 'debug';\nimport {MarcRecord} from '@natlibfi/marc-record';\n\nexport function strictEquality(subfieldA, subfieldB) {\n return subfieldA.code === subfieldB.code &&\n subfieldA.value === subfieldB.value;\n}\n\nexport function subsetEquality(subfieldA, subfieldB) {\n return subfieldA.code === subfieldB.code &&\n (subfieldA.value.indexOf(subfieldB.value) !== -1 || subfieldB.value.indexOf(subfieldA.value) !== -1);\n}\n// EqualityFunction can be either strictEquality or subsetEquality\n\nexport default ({\n tagPattern,\n equalityFunction = strictEquality,\n baseValidators = {subfieldValues: false},\n sourceValidators = {subfieldValues: false}\n// eslint-disable-next-line max-statements\n}) => (base, source) => {\n const debug = createDebugLogger('@natlibfi/marc-record-merge:select');\n\n const {baseRecord, sourceRecord} = getRecordsFromParameters(base, source, baseValidators, sourceValidators);\n\n function getRecordsFromParameters(base, source, baseValidators, sourceValidators) {\n // records if we got an object ({base, source}) as a parameter\n if (source === undefined && base.base !== undefined && base.source !== undefined) {\n const baseRecord = new MarcRecord(base.base, baseValidators);\n const sourceRecord = new MarcRecord(base.source, sourceValidators);\n return {baseRecord, sourceRecord};\n }\n // records if we got an non-object (base, source) as a parameter\n const baseRecord = new MarcRecord(base, baseValidators);\n const sourceRecord = new MarcRecord(source, sourceValidators);\n return {baseRecord, sourceRecord};\n }\n\n const baseFields = baseRecord.get(tagPattern);\n const sourceFields = sourceRecord.get(tagPattern);\n const fieldTag = sourceFields.map(field => field.tag);\n debug(`Comparing field ${fieldTag}`);\n\n checkFieldType(baseFields);\n checkFieldType(sourceFields);\n\n if (baseFields.length > 1 || sourceFields.length > 1) {\n debug(`Multiple fields in base or source`);\n debug(`No changes to base`);\n return baseRecord.toObject();\n }\n const [baseField] = baseFields;\n const [sourceField] = sourceFields;\n\n if (baseField.tag === sourceField.tag === false) {\n debug(`Base tag ${baseField.tag} is not equal to source tag ${sourceField.tag}`);\n debug(`No changes to base`);\n return baseRecord.toObject();\n }\n const baseSubs = baseField.subfields;\n const sourceSubs = sourceField.subfields;\n\n const baseSubsNormalized = baseSubs\n .map(({code, value}) => ({code, value: normalizeSubfieldValue(value)}));\n\n const sourceSubsNormalized = sourceSubs\n .map(({code, value}) => ({code, value: normalizeSubfieldValue(value)}));\n\n // Returns the base subfields for which a matching source subfield is found\n const equalSubfieldsBase = baseSubsNormalized\n .filter(baseSubfield => sourceSubsNormalized\n .some(sourceSubfield => equalityFunction(baseSubfield, sourceSubfield)));\n debug(`equalSubfieldsBase: ${JSON.stringify(equalSubfieldsBase, undefined, 2)}`);\n\n // Returns the source subfields for which a matching base subfield is found\n const equalSubfieldsSource = sourceSubsNormalized\n .filter(sourceSubfield => baseSubsNormalized\n .some(baseSubfield => equalityFunction(sourceSubfield, baseSubfield)));\n debug(`equalSubfieldsSource: ${JSON.stringify(equalSubfieldsSource, undefined, 2)}`);\n\n if (baseSubs.length === sourceSubs.length && equalSubfieldsBase.length < baseSubs.length) {\n debug(`Base and source subfields are not equal`);\n debug(`No changes to base`);\n return baseRecord.toObject();\n }\n\n if (baseSubs.length === sourceSubs.length && equalSubfieldsBase.length === equalSubfieldsSource.length) {\n debug(`Checking subfield equality`);\n const totalSubfieldLengthBase = baseSubsNormalized\n .map(({value}) => value.length)\n .reduce((acc, value) => acc + value);\n const totalSubfieldLengthSource = sourceSubsNormalized\n .map(({value}) => value.length)\n .reduce((acc, value) => acc + value);\n\n if (totalSubfieldLengthSource > totalSubfieldLengthBase) {\n return replaceBasefieldWithSourcefield(baseRecord.toObject());\n }\n }\n\n if (sourceSubs.length > baseSubs.length && equalSubfieldsBase.length === baseSubs.length) {\n return replaceBasefieldWithSourcefield(baseRecord.toObject());\n }\n\n debug(`No changes to base`);\n return baseRecord.toObject();\n\n function replaceBasefieldWithSourcefield(base) {\n const index = base.fields.findIndex(field => field === baseField);\n base.fields.splice(index, 1, sourceField); // eslint-disable-line functional/immutable-data\n debug(`Source field is longer, replacing base with source`);\n return base;\n }\n\n function checkFieldType(fields) {\n const checkedFields = fields.map(field => {\n if ('value' in field) { // eslint-disable-line functional/no-conditional-statements\n throw new Error('Invalid control field, expected data field');\n }\n return field;\n });\n return checkedFields;\n }\n\n function normalizeSubfieldValue(value) {\n // Regexp options: g: global search, u: unicode\n const punctuation = /[.,\\-/#!?$%^&*;:{}=_`~()[\\]]/gu;\n return normalizeSync(value).toLowerCase().replace(punctuation, '', 'u').replace(/\\s+/gu, ' ').trim();\n }\n};\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/reducers/select.js"],
|
|
4
|
+
"sourcesContent": ["import {normalizeSync} from 'normalize-diacritics';\nimport createDebugLogger from 'debug';\nimport {MarcRecord} from '@natlibfi/marc-record';\n\nexport function strictEquality(subfieldA, subfieldB) {\n return subfieldA.code === subfieldB.code &&\n subfieldA.value === subfieldB.value;\n}\n\nexport function subsetEquality(subfieldA, subfieldB) {\n return subfieldA.code === subfieldB.code &&\n (subfieldA.value.indexOf(subfieldB.value) !== -1 || subfieldB.value.indexOf(subfieldA.value) !== -1);\n}\n// EqualityFunction can be either strictEquality or subsetEquality\n\nexport default ({\n tagPattern,\n equalityFunction = strictEquality,\n baseValidators = {subfieldValues: false},\n sourceValidators = {subfieldValues: false}\n// eslint-disable-next-line max-statements\n}) => (base, source) => {\n const debug = createDebugLogger('@natlibfi/marc-record-merge:select');\n\n const {baseRecord, sourceRecord} = getRecordsFromParameters(base, source, baseValidators, sourceValidators);\n\n function getRecordsFromParameters(base, source, baseValidators, sourceValidators) {\n // records if we got an object ({base, source}) as a parameter\n if (source === undefined && base.base !== undefined && base.source !== undefined) {\n const baseRecord = new MarcRecord(base.base, baseValidators);\n const sourceRecord = new MarcRecord(base.source, sourceValidators);\n return {baseRecord, sourceRecord};\n }\n // records if we got an non-object (base, source) as a parameter\n const baseRecord = new MarcRecord(base, baseValidators);\n const sourceRecord = new MarcRecord(source, sourceValidators);\n return {baseRecord, sourceRecord};\n }\n\n const baseFields = baseRecord.get(tagPattern);\n const sourceFields = sourceRecord.get(tagPattern);\n const fieldTag = sourceFields.map(field => field.tag);\n debug(`Comparing field ${fieldTag}`);\n\n checkFieldType(baseFields);\n checkFieldType(sourceFields);\n\n if (baseFields.length > 1 || sourceFields.length > 1) {\n debug(`Multiple fields in base or source`);\n debug(`No changes to base`);\n return baseRecord.toObject();\n }\n const [baseField] = baseFields;\n const [sourceField] = sourceFields;\n\n if (baseField.tag === sourceField.tag === false) {\n debug(`Base tag ${baseField.tag} is not equal to source tag ${sourceField.tag}`);\n debug(`No changes to base`);\n return baseRecord.toObject();\n }\n const baseSubs = baseField.subfields;\n const sourceSubs = sourceField.subfields;\n\n const baseSubsNormalized = baseSubs\n .map(({code, value}) => ({code, value: normalizeSubfieldValue(value)}));\n\n const sourceSubsNormalized = sourceSubs\n .map(({code, value}) => ({code, value: normalizeSubfieldValue(value)}));\n\n // Returns the base subfields for which a matching source subfield is found\n const equalSubfieldsBase = baseSubsNormalized\n .filter(baseSubfield => sourceSubsNormalized\n .some(sourceSubfield => equalityFunction(baseSubfield, sourceSubfield)));\n debug(`equalSubfieldsBase: ${JSON.stringify(equalSubfieldsBase, undefined, 2)}`);\n\n // Returns the source subfields for which a matching base subfield is found\n const equalSubfieldsSource = sourceSubsNormalized\n .filter(sourceSubfield => baseSubsNormalized\n .some(baseSubfield => equalityFunction(sourceSubfield, baseSubfield)));\n debug(`equalSubfieldsSource: ${JSON.stringify(equalSubfieldsSource, undefined, 2)}`);\n\n if (baseSubs.length === sourceSubs.length && equalSubfieldsBase.length < baseSubs.length) {\n debug(`Base and source subfields are not equal`);\n debug(`No changes to base`);\n return baseRecord.toObject();\n }\n\n if (baseSubs.length === sourceSubs.length && equalSubfieldsBase.length === equalSubfieldsSource.length) {\n debug(`Checking subfield equality`);\n const totalSubfieldLengthBase = baseSubsNormalized\n .map(({value}) => value.length)\n .reduce((acc, value) => acc + value);\n const totalSubfieldLengthSource = sourceSubsNormalized\n .map(({value}) => value.length)\n .reduce((acc, value) => acc + value);\n\n if (totalSubfieldLengthSource > totalSubfieldLengthBase) {\n return replaceBasefieldWithSourcefield(baseRecord.toObject());\n }\n }\n\n if (sourceSubs.length > baseSubs.length && equalSubfieldsBase.length === baseSubs.length) {\n return replaceBasefieldWithSourcefield(baseRecord.toObject());\n }\n\n debug(`No changes to base`);\n return baseRecord.toObject();\n\n function replaceBasefieldWithSourcefield(base) {\n const index = base.fields.findIndex(field => field === baseField);\n base.fields.splice(index, 1, sourceField);\n debug(`Source field is longer, replacing base with source`);\n return base;\n }\n\n function checkFieldType(fields) {\n const checkedFields = fields.map(field => {\n if ('value' in field) {\n throw new Error('Invalid control field, expected data field');\n }\n return field;\n });\n return checkedFields;\n }\n\n function normalizeSubfieldValue(value) {\n // Regexp options: g: global search, u: unicode\n const punctuation = /[.,\\-/#!?$%^&*;:{}=_`~()[\\]]/gu;\n return normalizeSync(value).toLowerCase().replace(punctuation, '', 'u').replace(/\\s+/gu, ' ').trim();\n }\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["base", "source", "baseValidators", "sourceValidators", "baseRecord", "sourceRecord"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
// Eslint configuration object for src
|
|
2
|
+
const configSrc = {
|
|
3
|
+
files: [
|
|
4
|
+
"src/*"
|
|
5
|
+
],
|
|
6
|
+
linterOptions: {
|
|
7
|
+
reportUnusedDisableDirectives: true,
|
|
8
|
+
},
|
|
9
|
+
rules: {
|
|
10
|
+
"no-console": "warn",
|
|
11
|
+
"eqeqeq": ["error", "always"],
|
|
12
|
+
"no-const-assign": "error",
|
|
13
|
+
"max-depth": ["warn", 4],
|
|
14
|
+
"max-lines": ["warn", 500],
|
|
15
|
+
"max-lines-per-function": ["warn", {"max": 100}],
|
|
16
|
+
"no-else-return": ["error", {allowElseIf: false}],
|
|
17
|
+
"no-plusplus": [
|
|
18
|
+
"error",
|
|
19
|
+
{
|
|
20
|
+
"allowForLoopAfterthoughts": true
|
|
21
|
+
}
|
|
22
|
+
],
|
|
23
|
+
"array-callback-return": [
|
|
24
|
+
"error",
|
|
25
|
+
{
|
|
26
|
+
"checkForEach": false
|
|
27
|
+
}
|
|
28
|
+
],
|
|
29
|
+
"no-unused-vars": [
|
|
30
|
+
"error",
|
|
31
|
+
{
|
|
32
|
+
"argsIgnorePattern": "next"
|
|
33
|
+
}
|
|
34
|
+
],
|
|
35
|
+
"no-warning-comments": "off"
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
// Eslint configuration object for globally ignoring .js files
|
|
40
|
+
// - ignore all files that start with a dot
|
|
41
|
+
// - ignore all files inside directories named 'dist'
|
|
42
|
+
const configIgnores = {
|
|
43
|
+
ignores: [
|
|
44
|
+
"**/.*",
|
|
45
|
+
"**/dist/"
|
|
46
|
+
]
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
export default [
|
|
50
|
+
configSrc,
|
|
51
|
+
configIgnores
|
|
52
|
+
];
|
package/package.json
CHANGED
|
@@ -14,22 +14,25 @@
|
|
|
14
14
|
"url": "git@github.com:natlibfi/marc-record-merge-js.git"
|
|
15
15
|
},
|
|
16
16
|
"license": "MIT",
|
|
17
|
-
"version": "
|
|
17
|
+
"version": "8.0.0-alpha.1",
|
|
18
|
+
"type": "module",
|
|
18
19
|
"main": "./dist/index.js",
|
|
19
20
|
"engines": {
|
|
20
|
-
"node": ">=
|
|
21
|
+
"node": ">=22"
|
|
21
22
|
},
|
|
22
|
-
"type": "commonjs",
|
|
23
23
|
"scripts": {
|
|
24
24
|
"prepare": "npm run build",
|
|
25
|
-
"
|
|
26
|
-
"build": "npm run build:transpile",
|
|
27
|
-
"prepublishOnly": "npm run build:transpile",
|
|
25
|
+
"prepublishOnly": "npm run build",
|
|
28
26
|
"lint": "eslint ./src",
|
|
29
27
|
"lint:dev": "eslint ./src --fix",
|
|
30
|
-
"
|
|
28
|
+
"build": "esbuild \"src/**/*.js\" --sourcemap --platform=node --outdir=dist",
|
|
29
|
+
"test:base": "node --test --test-force-exit --experimental-test-coverage --test-reporter=spec './test/*.test.js' './test/**/*.test.js'",
|
|
30
|
+
"dev:test": "cross-env DEBUG=@natlibfi/* LOG_LEVEL=debug NODE_ENV=test node --watch --test --experimental-test-coverage --test-reporter=spec './test/*.test.js' './test/**/*.test.js'",
|
|
31
31
|
"test": "npm run lint && npm run test:base",
|
|
32
|
-
"test:dev": "npm run lint:dev && npm run test:base"
|
|
32
|
+
"test:dev": "npm run lint:dev && npm run test:base"
|
|
33
|
+
},
|
|
34
|
+
"old_scripts": {
|
|
35
|
+
"test:base": "cross-env NODE_ENV=test nyc mocha --package ./package.json",
|
|
33
36
|
"coverage": "npm run coverage:unit && npm run coverage:report",
|
|
34
37
|
"coverage:unit": "nyc --silent npm run test:base",
|
|
35
38
|
"coverage:report": "nyc report",
|
|
@@ -39,87 +42,15 @@
|
|
|
39
42
|
"dev:debug": "cross-env LOG_LEVEL=debug DEBUG=@natlibfi/* NODE_ENV=test nodemon"
|
|
40
43
|
},
|
|
41
44
|
"dependencies": {
|
|
42
|
-
"@natlibfi/marc-record": "^
|
|
43
|
-
"debug": "^4.4.
|
|
45
|
+
"@natlibfi/marc-record": "^10.0.0-alpha.1",
|
|
46
|
+
"debug": "^4.4.1",
|
|
44
47
|
"normalize-diacritics": "^2.14.0"
|
|
45
48
|
},
|
|
46
49
|
"devDependencies": {
|
|
47
|
-
"@
|
|
48
|
-
"@
|
|
49
|
-
"
|
|
50
|
-
"
|
|
51
|
-
"
|
|
52
|
-
"@natlibfi/eslint-config-melinda-backend": "^3.0.5",
|
|
53
|
-
"@natlibfi/fixugen": "^2.0.13",
|
|
54
|
-
"@natlibfi/fixura": "^3.0.12",
|
|
55
|
-
"babel-plugin-istanbul": "^7.0.0",
|
|
56
|
-
"babel-plugin-rewire": "^1.2.0",
|
|
57
|
-
"chai": "^4.5.0",
|
|
58
|
-
"cross-env": "^7.0.3",
|
|
59
|
-
"eslint": "^8.57.1",
|
|
60
|
-
"mocha": "^11.1.0",
|
|
61
|
-
"nodemon": "^3.1.9",
|
|
62
|
-
"nyc": "^17.1.0"
|
|
63
|
-
},
|
|
64
|
-
"eslintConfig": {
|
|
65
|
-
"extends": [
|
|
66
|
-
"@natlibfi/melinda-backend"
|
|
67
|
-
]
|
|
68
|
-
},
|
|
69
|
-
"babel": {
|
|
70
|
-
"presets": [
|
|
71
|
-
[
|
|
72
|
-
"@babel/preset-env",
|
|
73
|
-
{
|
|
74
|
-
"targets": "maintained node versions"
|
|
75
|
-
}
|
|
76
|
-
]
|
|
77
|
-
],
|
|
78
|
-
"env": {
|
|
79
|
-
"test": {
|
|
80
|
-
"plugins": [
|
|
81
|
-
"rewire",
|
|
82
|
-
"istanbul"
|
|
83
|
-
]
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
},
|
|
87
|
-
"mocha": {
|
|
88
|
-
"spec": [
|
|
89
|
-
"src/*.spec.js",
|
|
90
|
-
"src/**/*.spec.js"
|
|
91
|
-
],
|
|
92
|
-
"require": [
|
|
93
|
-
"@babel/register"
|
|
94
|
-
],
|
|
95
|
-
"inline-diffs": true,
|
|
96
|
-
"maxDiffSize": 25000,
|
|
97
|
-
"bail": true,
|
|
98
|
-
"exit": true
|
|
99
|
-
},
|
|
100
|
-
"nodemonConfig": {
|
|
101
|
-
"exec": "npm run test:dev",
|
|
102
|
-
"watch": [
|
|
103
|
-
"src/*",
|
|
104
|
-
"test-fixtures/*"
|
|
105
|
-
]
|
|
106
|
-
},
|
|
107
|
-
"nyc": {
|
|
108
|
-
"exclude": [
|
|
109
|
-
"*/*.spec.js",
|
|
110
|
-
"*/**/*.spec.js"
|
|
111
|
-
],
|
|
112
|
-
"reporter": [
|
|
113
|
-
"text"
|
|
114
|
-
],
|
|
115
|
-
"require": [
|
|
116
|
-
"@babel/register"
|
|
117
|
-
],
|
|
118
|
-
"sourceMap": false,
|
|
119
|
-
"instrument": false,
|
|
120
|
-
"lines": 80,
|
|
121
|
-
"statements": 80,
|
|
122
|
-
"functions": 80,
|
|
123
|
-
"branches": 80
|
|
50
|
+
"@natlibfi/fixugen": "^3.0.0-alpha.6",
|
|
51
|
+
"@natlibfi/fixura": "^4.0.0-alpha.13",
|
|
52
|
+
"cross-env": "^10.0.0",
|
|
53
|
+
"esbuild": "^0.25.9",
|
|
54
|
+
"eslint": "^9.34.0"
|
|
124
55
|
}
|
|
125
56
|
}
|
package/src/index.js
CHANGED
package/src/reducers/copy.js
CHANGED
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
/* eslint-disable max-statements */
|
|
2
|
-
/* eslint-disable no-unused-vars */
|
|
3
|
-
|
|
4
1
|
import {MarcRecord} from '@natlibfi/marc-record';
|
|
5
2
|
import createDebugLogger from 'debug';
|
|
6
3
|
|
|
@@ -109,7 +106,7 @@ export default ({
|
|
|
109
106
|
return compareFields(rest, baseCompareFields, uniqFields);
|
|
110
107
|
|
|
111
108
|
function checkCompareFields(baseCompareFields, sourceCompareField) {
|
|
112
|
-
let unique = true;
|
|
109
|
+
let unique = true;
|
|
113
110
|
|
|
114
111
|
baseCompareFields.forEach(baseCompareField => {
|
|
115
112
|
debugCompare(`Comparing ${JSON.stringify(sourceCompareField)} to ${JSON.stringify(baseCompareField)}}`);
|
package/src/reducers/index.js
CHANGED
package/src/reducers/select.js
CHANGED
|
@@ -108,14 +108,14 @@ export default ({
|
|
|
108
108
|
|
|
109
109
|
function replaceBasefieldWithSourcefield(base) {
|
|
110
110
|
const index = base.fields.findIndex(field => field === baseField);
|
|
111
|
-
base.fields.splice(index, 1, sourceField);
|
|
111
|
+
base.fields.splice(index, 1, sourceField);
|
|
112
112
|
debug(`Source field is longer, replacing base with source`);
|
|
113
113
|
return base;
|
|
114
114
|
}
|
|
115
115
|
|
|
116
116
|
function checkFieldType(fields) {
|
|
117
117
|
const checkedFields = fields.map(field => {
|
|
118
|
-
if ('value' in field) {
|
|
118
|
+
if ('value' in field) {
|
|
119
119
|
throw new Error('Invalid control field, expected data field');
|
|
120
120
|
}
|
|
121
121
|
return field;
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import merger, {Reducers} from '
|
|
1
|
+
import merger, {Reducers} from '../src/index.js';
|
|
2
2
|
import {inspect} from 'util';
|
|
3
3
|
import createDebugLogger from 'debug';
|
|
4
|
-
import
|
|
4
|
+
import assert from 'node:assert';
|
|
5
5
|
import {MarcRecord} from '@natlibfi/marc-record';
|
|
6
6
|
import {READERS} from '@natlibfi/fixura';
|
|
7
7
|
import generateTests from '@natlibfi/fixugen';
|
|
8
8
|
|
|
9
9
|
generateTests({
|
|
10
10
|
callback,
|
|
11
|
-
path: [
|
|
11
|
+
path: [import.meta.dirname, '..', 'test-fixtures', 'index'],
|
|
12
12
|
recurse: false,
|
|
13
13
|
useMetadataFile: true,
|
|
14
14
|
fixura: {
|
|
@@ -39,7 +39,6 @@ function callback({getFixture, reducerConfigs = []}) {
|
|
|
39
39
|
// It can also be a MarcRecord or a plain object
|
|
40
40
|
const resultRecord = result.base || result;
|
|
41
41
|
const resultRecordToRecord = new MarcRecord(resultRecord, {subfieldValues: false});
|
|
42
|
-
|
|
43
|
-
|
|
42
|
+
assert.deepEqual(resultRecordToRecord.toObject(), expectedRecord);
|
|
44
43
|
|
|
45
44
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import
|
|
1
|
+
import assert from 'node:assert';
|
|
2
2
|
import {READERS} from '@natlibfi/fixura';
|
|
3
|
-
import createReducer from '
|
|
3
|
+
import createReducer from '../../src/reducers/copy.js';
|
|
4
4
|
import generateTests from '@natlibfi/fixugen';
|
|
5
5
|
|
|
6
6
|
//import createDebugLogger from 'debug'; // <---
|
|
@@ -8,7 +8,7 @@ import generateTests from '@natlibfi/fixugen';
|
|
|
8
8
|
|
|
9
9
|
generateTests({
|
|
10
10
|
callback,
|
|
11
|
-
path: [
|
|
11
|
+
path: [import.meta.dirname, '..', '..', 'test-fixtures', 'reducers', 'copy'],
|
|
12
12
|
useMetadataFile: true,
|
|
13
13
|
recurse: true,
|
|
14
14
|
fixura: {
|
|
@@ -38,6 +38,7 @@ function callback({
|
|
|
38
38
|
const tagPattern = new RegExp(tagPatternRegExp, 'u');
|
|
39
39
|
const expectedRecord = getFixture('merged.json');
|
|
40
40
|
|
|
41
|
+
// copy2 test reducer where we have (base, source) non-object arguments as input
|
|
41
42
|
const merged = createReducer({
|
|
42
43
|
tagPattern, compareTagsOnly, compareWithoutTag, compareWithoutIndicators, compareWithoutIndicator1, compareWithoutIndicator2,
|
|
43
44
|
copyUnless, subfieldsMustBeIdentical, excludeSubfields,
|
|
@@ -48,7 +49,7 @@ function callback({
|
|
|
48
49
|
//debug(`*** mergedRecord,Strfy: `, JSON.stringify(mergedRecord)); //<--
|
|
49
50
|
//debug(`*** expectedRecord: `, expectedRecord); //<--
|
|
50
51
|
//debug(`*** expectedRecord,Strfy: `, JSON.stringify(expectedRecord)); //<--
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
52
|
+
assert.notDeepEqual(merged.constructor.name, 'MarcRecord');
|
|
53
|
+
assert.deepEqual(merged.constructor.name, 'Object');
|
|
54
|
+
assert.deepEqual(merged, expectedRecord);
|
|
54
55
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import
|
|
1
|
+
import assert from 'node:assert';
|
|
2
2
|
import {READERS} from '@natlibfi/fixura';
|
|
3
|
-
import createReducer from '
|
|
3
|
+
import createReducer from '../../src/reducers/copy.js';
|
|
4
4
|
import generateTests from '@natlibfi/fixugen';
|
|
5
5
|
|
|
6
6
|
//import createDebugLogger from 'debug'; // <---
|
|
@@ -8,7 +8,7 @@ import generateTests from '@natlibfi/fixugen';
|
|
|
8
8
|
|
|
9
9
|
generateTests({
|
|
10
10
|
callback,
|
|
11
|
-
path: [
|
|
11
|
+
path: [import.meta.dirname, '..', '..', 'test-fixtures', 'reducers', 'copy'],
|
|
12
12
|
useMetadataFile: true,
|
|
13
13
|
recurse: true,
|
|
14
14
|
fixura: {
|
|
@@ -39,6 +39,7 @@ function callback({
|
|
|
39
39
|
const tagPattern = new RegExp(tagPatternRegExp, 'u');
|
|
40
40
|
const expectedRecord = getFixture('merged.json');
|
|
41
41
|
|
|
42
|
+
// copy2 test reducer where we have ({base, source}) object argument as input
|
|
42
43
|
const merged = createReducer({
|
|
43
44
|
tagPattern, compareTagsOnly, compareWithoutTag, compareWithoutIndicators, compareWithoutIndicator1, compareWithoutIndicator2,
|
|
44
45
|
copyUnless, subfieldsMustBeIdentical, excludeSubfields,
|
|
@@ -49,7 +50,7 @@ function callback({
|
|
|
49
50
|
//debug(`*** mergedRecord,Strfy: `, JSON.stringify(mergedRecord)); //<--
|
|
50
51
|
//debug(`*** expectedRecord: `, expectedRecord); //<--
|
|
51
52
|
//debug(`*** expectedRecord,Strfy: `, JSON.stringify(expectedRecord)); //<--
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
53
|
+
assert.notDeepEqual(merged.constructor.name, 'MarcRecord');
|
|
54
|
+
assert.deepEqual(merged.constructor.name, 'Object');
|
|
55
|
+
assert.deepEqual(merged, expectedRecord);
|
|
55
56
|
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import assert from 'node:assert';
|
|
2
|
+
import {MarcRecord} from '@natlibfi/marc-record';
|
|
3
|
+
import createReducer, {subsetEquality} from '../../src/reducers/select.js';
|
|
4
|
+
import {READERS} from '@natlibfi/fixura';
|
|
5
|
+
import generateTests from '@natlibfi/fixugen';
|
|
6
|
+
import createDebugLogger from 'debug';
|
|
7
|
+
|
|
8
|
+
MarcRecord.setValidationOptions({subfieldValues: false});
|
|
9
|
+
const debug = createDebugLogger('@natlibfi/marc-record-merge:reducers:select:test');
|
|
10
|
+
const debugData = debug.extend('data');
|
|
11
|
+
|
|
12
|
+
generateTests({
|
|
13
|
+
callback,
|
|
14
|
+
path: [import.meta.dirname, '..', '..', 'test-fixtures', 'reducers', 'select'],
|
|
15
|
+
useMetadataFile: true,
|
|
16
|
+
recurse: false,
|
|
17
|
+
fixura: {
|
|
18
|
+
reader: READERS.JSON,
|
|
19
|
+
failWhenNotFound: false
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
function callback({
|
|
24
|
+
getFixture,
|
|
25
|
+
tagPatternRegExp = false,
|
|
26
|
+
expectedError = false,
|
|
27
|
+
expectedToThrow = false,
|
|
28
|
+
useSubsetEquality = false
|
|
29
|
+
}) {
|
|
30
|
+
// const base = new MarcRecord(getFixture('base.json'), {subfieldValues: false});
|
|
31
|
+
// const source = new MarcRecord(getFixture('source.json'), {subfieldValues: false});
|
|
32
|
+
|
|
33
|
+
const base = getFixture('base.json');
|
|
34
|
+
const source = getFixture('source.json');
|
|
35
|
+
|
|
36
|
+
const tagPattern = new RegExp(tagPatternRegExp, 'u');
|
|
37
|
+
const expectedRecord = getFixture('merged.json');
|
|
38
|
+
const equalityFunction = useSubsetEquality ? subsetEquality : undefined;
|
|
39
|
+
|
|
40
|
+
// Check expected error in testing
|
|
41
|
+
if (expectedToThrow || expectedError) {
|
|
42
|
+
debugData(`Expecting error: ${expectedToThrow}, ${expectedError}`);
|
|
43
|
+
try {
|
|
44
|
+
debug(`Trying to run merge`);
|
|
45
|
+
const mergedRecord = createReducer({tagPattern, equalityFunction})(base, source);
|
|
46
|
+
debugData(mergedRecord);
|
|
47
|
+
throw new Error('Expected an error');
|
|
48
|
+
} catch (err) {
|
|
49
|
+
debug(`Got error: ${err.message}`);
|
|
50
|
+
//assert.equal(typeof err, 'error');
|
|
51
|
+
assert.ok(err instanceof Error);
|
|
52
|
+
assert.match(err.message, new RegExp(expectedError, 'u'));
|
|
53
|
+
//expect(err.payload).to.match(new RegExp(expectedError, 'u'));
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// select tests reducer where we have (base, source) non-object argument as input
|
|
59
|
+
const mergedRecord = createReducer({tagPattern, equalityFunction})(base, source);
|
|
60
|
+
assert.deepEqual(mergedRecord, expectedRecord);
|
|
61
|
+
}
|