@natlibfi/marc-record-merge 7.0.10 → 8.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-and-publish.yml +84 -0
- 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.js +52 -0
- package/package.json +17 -97
- 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/.github/workflows/melinda-node-tests.yml +0 -60
- 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/index.js
CHANGED
|
@@ -1,17 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
var _copy = _interopRequireDefault(require("./copy"));
|
|
8
|
-
var _select = _interopRequireWildcard(require("./select"));
|
|
9
|
-
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
10
|
-
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
11
|
-
var _default = exports.default = {
|
|
12
|
-
copy: _copy.default,
|
|
13
|
-
select: _select.default,
|
|
14
|
-
strictEquality: _select.strictEquality,
|
|
15
|
-
subsetEquality: _select.subsetEquality
|
|
16
|
-
};
|
|
17
|
-
//# sourceMappingURL=index.js.map
|
|
1
|
+
import copy from "./copy.js";
|
|
2
|
+
import select, { strictEquality, subsetEquality } from "./select.js";
|
|
3
|
+
export default { copy, select, strictEquality, subsetEquality };
|
|
4
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1,7 @@
|
|
|
1
|
-
{
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/reducers/index.js"],
|
|
4
|
+
"sourcesContent": ["import copy from './copy.js';\nimport select, {strictEquality, subsetEquality} from './select.js';\n\nexport default {copy, select, strictEquality, subsetEquality};\n"],
|
|
5
|
+
"mappings": "AAAA,OAAO,UAAU;AACjB,OAAO,UAAS,gBAAgB,sBAAqB;AAErD,eAAe,EAAC,MAAM,QAAQ,gBAAgB,eAAc;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
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
|
+
}
|
package/eslint.config.js
ADDED
|
@@ -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
|
@@ -5,121 +5,41 @@
|
|
|
5
5
|
"name": "The National Library of Finland"
|
|
6
6
|
},
|
|
7
7
|
"keywords": [],
|
|
8
|
-
"homepage": "https://
|
|
8
|
+
"homepage": "https://www.npmjs.com/package/@natlibfi/marc-record-merge-js",
|
|
9
9
|
"bugs": {
|
|
10
10
|
"url": "https://github.com/natlibfi/marc-record-merge-js/issues"
|
|
11
11
|
},
|
|
12
12
|
"repository": {
|
|
13
|
-
"
|
|
14
|
-
"url": "git@github.com:natlibfi/marc-record-merge-js.git"
|
|
13
|
+
"url": "https://github.com/NatLibFi/marc-record-merge-js"
|
|
15
14
|
},
|
|
16
15
|
"license": "MIT",
|
|
17
|
-
"version": "
|
|
16
|
+
"version": "8.0.0-alpha.2",
|
|
17
|
+
"type": "module",
|
|
18
18
|
"main": "./dist/index.js",
|
|
19
19
|
"engines": {
|
|
20
|
-
"node": ">=
|
|
20
|
+
"node": ">=22"
|
|
21
21
|
},
|
|
22
|
-
"type": "commonjs",
|
|
23
22
|
"scripts": {
|
|
24
23
|
"prepare": "npm run build",
|
|
25
|
-
"
|
|
26
|
-
"build": "npm run build:transpile",
|
|
27
|
-
"prepublishOnly": "npm run build:transpile",
|
|
24
|
+
"prepublishOnly": "npm run build",
|
|
28
25
|
"lint": "eslint ./src",
|
|
29
26
|
"lint:dev": "eslint ./src --fix",
|
|
30
|
-
"
|
|
27
|
+
"build": "esbuild \"src/**/*.js\" --sourcemap --platform=node --outdir=dist",
|
|
28
|
+
"test:base": "node --test --test-force-exit --experimental-test-coverage --test-reporter=spec './test/*.test.js' './test/**/*.test.js'",
|
|
29
|
+
"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
30
|
"test": "npm run lint && npm run test:base",
|
|
32
|
-
"test:dev": "npm run lint:dev && npm run test:base"
|
|
33
|
-
"coverage": "npm run coverage:unit && npm run coverage:report",
|
|
34
|
-
"coverage:unit": "nyc --silent npm run test:base",
|
|
35
|
-
"coverage:report": "nyc report",
|
|
36
|
-
"dev:test": "cross-env NODE_ENV=test nodemon -w src -w test-fixtures --exec 'clear && npm run test:dev'",
|
|
37
|
-
"dev:test:debug": "cross-env DEBUG=@natlibfi/* NODE_ENV=test nodemon -w src -w test-fixtures --exec 'clear && npm run test:dev'",
|
|
38
|
-
"dev": "nodemon",
|
|
39
|
-
"dev:debug": "cross-env LOG_LEVEL=debug DEBUG=@natlibfi/* NODE_ENV=test nodemon"
|
|
31
|
+
"test:dev": "npm run lint:dev && npm run test:base"
|
|
40
32
|
},
|
|
41
33
|
"dependencies": {
|
|
42
|
-
"@natlibfi/marc-record": "^
|
|
43
|
-
"debug": "^4.4.
|
|
34
|
+
"@natlibfi/marc-record": "^10.0.0",
|
|
35
|
+
"debug": "^4.4.1",
|
|
44
36
|
"normalize-diacritics": "^2.14.0"
|
|
45
37
|
},
|
|
46
38
|
"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
|
|
39
|
+
"@natlibfi/fixugen": "^3.0.0",
|
|
40
|
+
"@natlibfi/fixura": "^4.0.0",
|
|
41
|
+
"cross-env": "^10.1.0",
|
|
42
|
+
"esbuild": "^0.25.12",
|
|
43
|
+
"eslint": "^9.39.1"
|
|
124
44
|
}
|
|
125
45
|
}
|
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
|
}
|