@natlibfi/marc-record-merge 6.0.0-beta.9 → 7.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/CODEOWNERS +2 -9
- package/.github/dependabot.yml +2 -3
- package/.github/workflows/melinda-node-tests.yml +2 -2
- package/dist/index.js +49 -4
- package/dist/index.js.map +1 -1
- package/dist/index.spec.js +59 -0
- package/dist/index.spec.js.map +1 -0
- package/dist/reducers/copy.js +52 -62
- package/dist/reducers/copy.js.map +1 -1
- package/dist/reducers/copy.spec.js +6 -8
- package/dist/reducers/copy.spec.js.map +1 -1
- package/dist/reducers/copy2.spec.js +66 -0
- package/dist/reducers/copy2.spec.js.map +1 -0
- package/dist/reducers/index.js +0 -6
- package/dist/reducers/index.js.map +1 -1
- package/dist/reducers/select.js +43 -40
- package/dist/reducers/select.js.map +1 -1
- package/dist/reducers/select.spec.js +4 -15
- package/dist/reducers/select.spec.js.map +1 -1
- package/dist/reducers/select2.spec.js +58 -0
- package/dist/reducers/select2.spec.js.map +1 -0
- package/package.json +18 -18
- package/src/index.js +51 -1
- package/src/index.spec.js +45 -0
- package/src/reducers/copy.js +34 -8
- package/src/reducers/copy.spec.js +3 -1
- package/src/reducers/copy2.spec.js +55 -0
- package/src/reducers/select.js +31 -10
- package/src/reducers/select2.spec.js +49 -0
- package/test-fixtures/index/01/base.json +24 -0
- package/test-fixtures/index/01/merged.json +24 -0
- package/test-fixtures/index/01/metadata.json +8 -0
- package/test-fixtures/index/01/source.json +40 -0
- package/test-fixtures/index/02/base.json +24 -0
- package/test-fixtures/index/02/merged.json +24 -0
- package/test-fixtures/index/02/metadata.json +7 -0
- package/test-fixtures/index/02/source.json +40 -0
- package/test-fixtures/reducers/copy/04 - compareWithoutIndicators/03/metadata.json +6 -0
- package/test-fixtures/reducers/copy/04 - compareWithoutIndicators/04/base.json +20 -0
- package/test-fixtures/reducers/copy/04 - compareWithoutIndicators/04/merged.json +31 -0
- package/test-fixtures/reducers/copy/04 - compareWithoutIndicators/04/metadata.json +5 -0
- package/test-fixtures/reducers/copy/04 - compareWithoutIndicators/04/source.json +20 -0
- package/test-fixtures/reducers/copy/11 - compareWithoutTag/01/base.json +11 -0
- package/test-fixtures/reducers/copy/11 - compareWithoutTag/01/metadata.json +1 -2
- package/test-fixtures/reducers/copy/11 - compareWithoutTag/01/source.json +0 -11
- package/test-fixtures/reducers/copy/11 - compareWithoutTag/02/merged.json +11 -0
- package/test-fixtures/reducers/copy/11 - compareWithoutTag/02/metadata.json +1 -2
- package/test-fixtures/reducers/copy/11 - compareWithoutTag/02/source.json +6 -3
- package/test-fixtures/reducers/copy/11 - compareWithoutTag/04/base.json +17 -0
- package/test-fixtures/reducers/copy/11 - compareWithoutTag/04/merged.json +28 -0
- package/test-fixtures/reducers/copy/11 - compareWithoutTag/04/metadata.json +7 -0
- package/test-fixtures/reducers/copy/11 - compareWithoutTag/04/source.json +31 -0
- package/test-fixtures/reducers/copy/11 - compareWithoutTag/05/base.json +28 -0
- package/test-fixtures/reducers/copy/11 - compareWithoutTag/05/merged.json +28 -0
- package/test-fixtures/reducers/copy/11 - compareWithoutTag/05/metadata.json +7 -0
- package/test-fixtures/reducers/copy/11 - compareWithoutTag/05/source.json +28 -0
package/.github/CODEOWNERS
CHANGED
|
@@ -1,9 +1,2 @@
|
|
|
1
|
-
# With this line @NatLibFi/melinda-js-lead owns any files in
|
|
2
|
-
|
|
3
|
-
# subdirectories.
|
|
4
|
-
/.github/ @NatLibFi/melinda-js-lead
|
|
5
|
-
|
|
6
|
-
# With this line @NatLibFi/melinda-js-lead owns any files in the /src/
|
|
7
|
-
# directory at the root of the repository and any of its
|
|
8
|
-
# subdirectories.
|
|
9
|
-
/src/ @NatLibFi/melinda-js-lead
|
|
1
|
+
# With this line @NatLibFi/melinda-js-lead owns any files in this repository
|
|
2
|
+
* @NatLibFi/melinda-js-lead
|
package/.github/dependabot.yml
CHANGED
|
@@ -10,7 +10,7 @@ updates:
|
|
|
10
10
|
interval: "daily"
|
|
11
11
|
time: "06:30"
|
|
12
12
|
timezone: "Europe/Helsinki"
|
|
13
|
-
|
|
13
|
+
target-branch: "dependencies"
|
|
14
14
|
|
|
15
15
|
# Minor updates to npm production dependencies daily
|
|
16
16
|
- package-ecosystem: "npm"
|
|
@@ -20,10 +20,9 @@ updates:
|
|
|
20
20
|
time: "06:45"
|
|
21
21
|
timezone: "Europe/Helsinki"
|
|
22
22
|
versioning-strategy: lockfile-only
|
|
23
|
-
labels:
|
|
24
|
-
- "npm minor dependencies"
|
|
25
23
|
allow:
|
|
26
24
|
- dependency-type: "production"
|
|
25
|
+
target-branch: "dependencies"
|
|
27
26
|
|
|
28
27
|
# Major updates to npm dependencies weekly @tuesday
|
|
29
28
|
# Not possible yet https://github.com/dependabot/dependabot-core/issues/1778
|
|
@@ -11,7 +11,7 @@ jobs:
|
|
|
11
11
|
|
|
12
12
|
strategy:
|
|
13
13
|
matrix:
|
|
14
|
-
node-version: [
|
|
14
|
+
node-version: [16.x, 18.x, 19.x]
|
|
15
15
|
# See supported Node.js release schedule at https://nodejs.org/en/about/releases/
|
|
16
16
|
|
|
17
17
|
steps:
|
|
@@ -52,7 +52,7 @@ jobs:
|
|
|
52
52
|
# Setup .npmrc file to publish to npm
|
|
53
53
|
- uses: actions/setup-node@v3
|
|
54
54
|
with:
|
|
55
|
-
node-version: '
|
|
55
|
+
node-version: '18.x'
|
|
56
56
|
registry-url: 'https://registry.npmjs.org'
|
|
57
57
|
- run: npm ci
|
|
58
58
|
- run: npm publish
|
package/dist/index.js
CHANGED
|
@@ -10,16 +10,61 @@ Object.defineProperty(exports, "Reducers", {
|
|
|
10
10
|
}
|
|
11
11
|
});
|
|
12
12
|
exports.default = void 0;
|
|
13
|
-
|
|
14
13
|
var _reducers = _interopRequireDefault(require("./reducers"));
|
|
15
|
-
|
|
14
|
+
var _debug = _interopRequireDefault(require("debug"));
|
|
16
15
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
17
|
-
|
|
16
|
+
const debug = (0, _debug.default)('@natlibfi/melinda-marc-record-merge:index');
|
|
17
|
+
const debugData = debug.extend('data');
|
|
18
|
+
// export default ({base, source, reducers}) => reducers.reduce((base, reducer) => reducer(base, source), base);
|
|
19
|
+
// NV: Modified the reducer loop so, that not only base, but also is carried back.
|
|
20
|
+
// However, we try to be backward-compatible: normally after the reducers, only base is returned.
|
|
18
21
|
var _default = ({
|
|
19
22
|
base,
|
|
20
23
|
source,
|
|
21
24
|
reducers
|
|
22
|
-
}) =>
|
|
25
|
+
}) => {
|
|
26
|
+
const combo = {
|
|
27
|
+
base,
|
|
28
|
+
source
|
|
29
|
+
};
|
|
30
|
+
const resultCombo = reducers.reduce((combo, reducer) => {
|
|
31
|
+
const returnCombo = singleRound(reducer, combo.base, combo.source);
|
|
32
|
+
//debugData(`returnCombo after current reducer: ${JSON.stringify(returnCombo)}`);
|
|
33
|
+
return returnCombo;
|
|
34
|
+
}, combo);
|
|
35
|
+
debugData(`ResultCombo after reducers: ${JSON.stringify(resultCombo)}`);
|
|
23
36
|
|
|
37
|
+
// Hack to make my melinda-marc-record-merge-reducers single tests that expect both
|
|
38
|
+
// base and source to return them both:
|
|
39
|
+
if (reducers.length === 1 && resultCombo.base && resultCombo.source) {
|
|
40
|
+
debug('Single reducer, returning resultCombo');
|
|
41
|
+
debugData(JSON.stringify(resultCombo));
|
|
42
|
+
return resultCombo;
|
|
43
|
+
}
|
|
44
|
+
// All other tests return just base... Backward (compability) it is!
|
|
45
|
+
debug('Multiple reducers, returning just base');
|
|
46
|
+
debugData(JSON.stringify(resultCombo.base));
|
|
47
|
+
return resultCombo.base;
|
|
48
|
+
function singleRound(reducer, base, source) {
|
|
49
|
+
//debug(`SINGLE ROUND INPUT (base, source)`);
|
|
50
|
+
//debugData(base);
|
|
51
|
+
//debugData(base);
|
|
52
|
+
const reducerResult = reducer(base, source);
|
|
53
|
+
//debug(`reducerResult:`);
|
|
54
|
+
//debugData(reducerResult);
|
|
55
|
+
if (reducerResult.base !== undefined && reducerResult.source !== undefined) {
|
|
56
|
+
debug('NEW STYLE REDUCER RESULT v2');
|
|
57
|
+
const combo = reducerResult;
|
|
58
|
+
//debugData(combo);
|
|
59
|
+
return combo;
|
|
60
|
+
}
|
|
61
|
+
debug('OLD SCHOOL REDUCER RESULT v2');
|
|
62
|
+
//debugData({base: reducerResult, source});
|
|
63
|
+
return {
|
|
64
|
+
base: reducerResult,
|
|
65
|
+
source
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
};
|
|
24
69
|
exports.default = _default;
|
|
25
70
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["base","source","reducers","reduce","reducer"],"sources":["../src/index.js"],"sourcesContent":["import Reducers from './reducers';\n\nexport {Reducers};\
|
|
1
|
+
{"version":3,"file":"index.js","names":["_reducers","_interopRequireDefault","require","_debug","obj","__esModule","default","debug","createDebugLogger","debugData","extend","_default","base","source","reducers","combo","resultCombo","reduce","reducer","returnCombo","singleRound","JSON","stringify","length","reducerResult","undefined","exports"],"sources":["../src/index.js"],"sourcesContent":["import Reducers from './reducers';\nimport createDebugLogger from 'debug';\n\nconst debug = createDebugLogger('@natlibfi/melinda-marc-record-merge:index');\nconst debugData = debug.extend('data');\n\nexport {Reducers};\n// export default ({base, source, reducers}) => reducers.reduce((base, reducer) => reducer(base, source), base);\n\n// NV: Modified the reducer loop so, that not only base, but also is carried back.\n// However, we try to be backward-compatible: normally after the reducers, only base is returned.\n\nexport default ({base, source, reducers}) => {\n\n const combo = {base, source};\n const resultCombo = reducers.reduce((combo, reducer) => {\n const returnCombo = singleRound(reducer, combo.base, combo.source);\n //debugData(`returnCombo after current reducer: ${JSON.stringify(returnCombo)}`);\n return returnCombo;\n }, combo);\n\n debugData(`ResultCombo after reducers: ${JSON.stringify(resultCombo)}`);\n\n // Hack to make my melinda-marc-record-merge-reducers single tests that expect both\n // base and source to return them both:\n if (reducers.length === 1 && resultCombo.base && resultCombo.source) {\n debug('Single reducer, returning resultCombo');\n debugData(JSON.stringify(resultCombo));\n\n return resultCombo;\n }\n // All other tests return just base... Backward (compability) it is!\n debug('Multiple reducers, returning just base');\n debugData(JSON.stringify(resultCombo.base));\n return resultCombo.base;\n\n function singleRound(reducer, base, source) {\n //debug(`SINGLE ROUND INPUT (base, source)`);\n //debugData(base);\n //debugData(base);\n const reducerResult = reducer(base, source);\n //debug(`reducerResult:`);\n //debugData(reducerResult);\n if (reducerResult.base !== undefined && reducerResult.source !== undefined) {\n debug('NEW STYLE REDUCER RESULT v2');\n const combo = reducerResult;\n //debugData(combo);\n return combo;\n }\n debug('OLD SCHOOL REDUCER RESULT v2');\n //debugData({base: reducerResult, source});\n return {base: reducerResult, source};\n }\n};\n"],"mappings":";;;;;;;;;;;;AAAA,IAAAA,SAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,MAAA,GAAAF,sBAAA,CAAAC,OAAA;AAAsC,SAAAD,uBAAAG,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAEtC,MAAMG,KAAK,GAAG,IAAAC,cAAiB,EAAC,2CAA2C,CAAC;AAC5E,MAAMC,SAAS,GAAGF,KAAK,CAACG,MAAM,CAAC,MAAM,CAAC;AAGtC;AAEA;AACA;AAAA,IAAAC,QAAA,GAEeA,CAAC;EAACC,IAAI;EAAEC,MAAM;EAAEC;AAAQ,CAAC,KAAK;EAE3C,MAAMC,KAAK,GAAG;IAACH,IAAI;IAAEC;EAAM,CAAC;EAC5B,MAAMG,WAAW,GAAGF,QAAQ,CAACG,MAAM,CAAC,CAACF,KAAK,EAAEG,OAAO,KAAK;IACtD,MAAMC,WAAW,GAAGC,WAAW,CAACF,OAAO,EAAEH,KAAK,CAACH,IAAI,EAAEG,KAAK,CAACF,MAAM,CAAC;IAClE;IACA,OAAOM,WAAW;EACpB,CAAC,EAAEJ,KAAK,CAAC;EAETN,SAAS,CAAE,+BAA8BY,IAAI,CAACC,SAAS,CAACN,WAAW,CAAE,EAAC,CAAC;;EAEvE;EACA;EACA,IAAIF,QAAQ,CAACS,MAAM,KAAK,CAAC,IAAIP,WAAW,CAACJ,IAAI,IAAII,WAAW,CAACH,MAAM,EAAE;IACnEN,KAAK,CAAC,uCAAuC,CAAC;IAC9CE,SAAS,CAACY,IAAI,CAACC,SAAS,CAACN,WAAW,CAAC,CAAC;IAEtC,OAAOA,WAAW;EACpB;EACA;EACAT,KAAK,CAAC,wCAAwC,CAAC;EAC/CE,SAAS,CAACY,IAAI,CAACC,SAAS,CAACN,WAAW,CAACJ,IAAI,CAAC,CAAC;EAC3C,OAAOI,WAAW,CAACJ,IAAI;EAEvB,SAASQ,WAAWA,CAACF,OAAO,EAAEN,IAAI,EAAEC,MAAM,EAAE;IAC1C;IACA;IACA;IACA,MAAMW,aAAa,GAAGN,OAAO,CAACN,IAAI,EAAEC,MAAM,CAAC;IAC3C;IACA;IACA,IAAIW,aAAa,CAACZ,IAAI,KAAKa,SAAS,IAAID,aAAa,CAACX,MAAM,KAAKY,SAAS,EAAE;MAC1ElB,KAAK,CAAC,6BAA6B,CAAC;MACpC,MAAMQ,KAAK,GAAGS,aAAa;MAC3B;MACA,OAAOT,KAAK;IACd;IACAR,KAAK,CAAC,8BAA8B,CAAC;IACrC;IACA,OAAO;MAACK,IAAI,EAAEY,aAAa;MAAEX;IAAM,CAAC;EACtC;AACF,CAAC;AAAAa,OAAA,CAAApB,OAAA,GAAAK,QAAA"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _index = _interopRequireWildcard(require("./index"));
|
|
4
|
+
var _util = require("util");
|
|
5
|
+
var _debug = _interopRequireDefault(require("debug"));
|
|
6
|
+
var _chai = require("chai");
|
|
7
|
+
var _marcRecord = require("@natlibfi/marc-record");
|
|
8
|
+
var _fixura = require("@natlibfi/fixura");
|
|
9
|
+
var _fixugen = _interopRequireDefault(require("@natlibfi/fixugen"));
|
|
10
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
11
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
12
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
13
|
+
(0, _fixugen.default)({
|
|
14
|
+
callback,
|
|
15
|
+
path: [__dirname, '..', 'test-fixtures', 'index'],
|
|
16
|
+
recurse: false,
|
|
17
|
+
useMetadataFile: true,
|
|
18
|
+
fixura: {
|
|
19
|
+
failWhenNotFound: false,
|
|
20
|
+
reader: _fixura.READERS.JSON
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
function callback({
|
|
24
|
+
getFixture,
|
|
25
|
+
reducerConfigs = []
|
|
26
|
+
}) {
|
|
27
|
+
const base = new _marcRecord.MarcRecord(getFixture('base.json'), {
|
|
28
|
+
subfieldValues: false
|
|
29
|
+
});
|
|
30
|
+
const source = new _marcRecord.MarcRecord(getFixture('source.json'), {
|
|
31
|
+
subfieldValues: false
|
|
32
|
+
});
|
|
33
|
+
const expectedRecord = getFixture('merged.json');
|
|
34
|
+
const debug = (0, _debug.default)('@natlibfi/melinda-marc-record-merge-reducers:index:test');
|
|
35
|
+
const debugData = debug.extend('data');
|
|
36
|
+
const testReducerConfigs = reducerConfigs;
|
|
37
|
+
const reducers = [...testReducerConfigs.map(conf => _index.Reducers.copy(conf))];
|
|
38
|
+
debugData(`Reducers: ${(0, _util.inspect)(reducers, {
|
|
39
|
+
colors: true,
|
|
40
|
+
maxArrayLength: 10,
|
|
41
|
+
depth: 8
|
|
42
|
+
})})}`);
|
|
43
|
+
const result = (0, _index.default)({
|
|
44
|
+
base,
|
|
45
|
+
source,
|
|
46
|
+
reducers
|
|
47
|
+
});
|
|
48
|
+
debug(`Merge result is: ${result.constructor.name}`);
|
|
49
|
+
debugData(`${JSON.stringify(result)}`);
|
|
50
|
+
|
|
51
|
+
// Use either result.base or a plain result as resultRecord
|
|
52
|
+
// It can also be a MarcRecord or a plain object
|
|
53
|
+
const resultRecord = result.base || result;
|
|
54
|
+
const resultRecordToRecord = new _marcRecord.MarcRecord(resultRecord, {
|
|
55
|
+
subfieldValues: false
|
|
56
|
+
});
|
|
57
|
+
(0, _chai.expect)(resultRecordToRecord.toObject()).to.eql(expectedRecord);
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=index.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.spec.js","names":["_index","_interopRequireWildcard","require","_util","_debug","_interopRequireDefault","_chai","_marcRecord","_fixura","_fixugen","obj","__esModule","default","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","generateTests","callback","path","__dirname","recurse","useMetadataFile","fixura","failWhenNotFound","reader","READERS","JSON","getFixture","reducerConfigs","base","MarcRecord","subfieldValues","source","expectedRecord","debug","createDebugLogger","debugData","extend","testReducerConfigs","reducers","map","conf","Reducers","copy","inspect","colors","maxArrayLength","depth","result","merger","constructor","name","stringify","resultRecord","resultRecordToRecord","expect","toObject","to","eql"],"sources":["../src/index.spec.js"],"sourcesContent":["import merger, {Reducers} from './index';\nimport {inspect} from 'util';\nimport createDebugLogger from 'debug';\nimport {expect} from 'chai';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\n\ngenerateTests({\n callback,\n path: [__dirname, '..', 'test-fixtures', 'index'],\n recurse: false,\n useMetadataFile: true,\n fixura: {\n failWhenNotFound: false,\n reader: READERS.JSON\n }\n});\n\nfunction callback({getFixture, reducerConfigs = []}) {\n const base = new MarcRecord(getFixture('base.json'), {subfieldValues: false});\n const source = new MarcRecord(getFixture('source.json'), {subfieldValues: false});\n const expectedRecord = getFixture('merged.json');\n\n const debug = createDebugLogger('@natlibfi/melinda-marc-record-merge-reducers:index:test');\n const debugData = debug.extend('data');\n\n const testReducerConfigs = reducerConfigs;\n const reducers = [...testReducerConfigs.map(conf => Reducers.copy(conf))];\n\n debugData(`Reducers: ${inspect(reducers, {colors: true, maxArrayLength: 10, depth: 8})})}`);\n\n const result = merger({base, source, reducers});\n\n debug(`Merge result is: ${result.constructor.name}`);\n debugData(`${JSON.stringify(result)}`);\n\n // Use either result.base or a plain result as resultRecord\n // It can also be a MarcRecord or a plain object\n const resultRecord = result.base || result;\n const resultRecordToRecord = new MarcRecord(resultRecord, {subfieldValues: false});\n expect(resultRecordToRecord.toObject()).to.eql(expectedRecord);\n\n\n}\n"],"mappings":"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"}
|
package/dist/reducers/copy.js
CHANGED
|
@@ -4,21 +4,18 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
|
-
|
|
8
7
|
var _marcRecord = require("@natlibfi/marc-record");
|
|
9
|
-
|
|
10
8
|
var _debug = _interopRequireDefault(require("debug"));
|
|
11
|
-
|
|
12
9
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
13
|
-
|
|
14
10
|
/* eslint-disable max-statements */
|
|
15
|
-
|
|
16
11
|
/* eslint-disable no-unused-vars */
|
|
17
12
|
var _default = ({
|
|
18
13
|
tagPattern,
|
|
19
14
|
compareTagsOnly = false,
|
|
20
15
|
compareWithoutTag = false,
|
|
21
16
|
compareWithoutIndicators = false,
|
|
17
|
+
compareWithoutIndicator1 = false,
|
|
18
|
+
compareWithoutIndicator2 = false,
|
|
22
19
|
subfieldsMustBeIdentical = true,
|
|
23
20
|
excludeSubfields = [],
|
|
24
21
|
dropSubfields = [],
|
|
@@ -33,14 +30,40 @@ var _default = ({
|
|
|
33
30
|
swapSubfieldCode = [],
|
|
34
31
|
doNotCopyIfFieldPresent = false
|
|
35
32
|
}) => (base, source) => {
|
|
36
|
-
const
|
|
37
|
-
const
|
|
38
|
-
const debug = (0, _debug.default)('@natlibfi/marc-record-merge');
|
|
33
|
+
const debug = (0, _debug.default)('@natlibfi/marc-record-merge:copy');
|
|
34
|
+
const debugData = debug.extend('data');
|
|
39
35
|
const debugOptions = (0, _debug.default)('@natlibfi/marc-record-merge:compare-options');
|
|
40
36
|
const debugCompare = (0, _debug.default)('@natlibfi/marc-record-merge:compare');
|
|
37
|
+
debugData(`base: ${JSON.stringify(base)}`);
|
|
38
|
+
debugData(`source: ${JSON.stringify(source)}`);
|
|
39
|
+
const {
|
|
40
|
+
baseRecord,
|
|
41
|
+
sourceRecord
|
|
42
|
+
} = getRecordsFromParameters(base, source, baseValidators, sourceValidators);
|
|
43
|
+
function getRecordsFromParameters(base, source, baseValidators, sourceValidators) {
|
|
44
|
+
// records if we got an object ({base, source}) as a parameter
|
|
45
|
+
if (source === undefined && base.base !== undefined && base.source !== undefined) {
|
|
46
|
+
const baseRecord = new _marcRecord.MarcRecord(base.base, baseValidators);
|
|
47
|
+
const sourceRecord = new _marcRecord.MarcRecord(base.source, sourceValidators);
|
|
48
|
+
return {
|
|
49
|
+
baseRecord,
|
|
50
|
+
sourceRecord
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
// records if we got an non-object (base, source) as a parameter
|
|
54
|
+
const baseRecord = new _marcRecord.MarcRecord(base, baseValidators);
|
|
55
|
+
const sourceRecord = new _marcRecord.MarcRecord(source, sourceValidators);
|
|
56
|
+
return {
|
|
57
|
+
baseRecord,
|
|
58
|
+
sourceRecord
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
const ignoreInd1 = compareWithoutIndicators || compareWithoutIndicator1;
|
|
62
|
+
const ignoreInd2 = compareWithoutIndicators || compareWithoutIndicator2;
|
|
41
63
|
debugOptions(`Tag Pattern: ${tagPattern}`);
|
|
42
64
|
debugOptions(`Compare tags only: ${compareTagsOnly}`);
|
|
43
|
-
debugOptions(`
|
|
65
|
+
debugOptions(`Omit indicator 1 from comparison: ${ignoreInd1}`);
|
|
66
|
+
debugOptions(`Omit indicator 2 from comparison: ${ignoreInd2}`);
|
|
44
67
|
debugOptions(`Copy if identical: ${subfieldsMustBeIdentical}`);
|
|
45
68
|
debugOptions(`Exclude subfields: [${excludeSubfields}]`);
|
|
46
69
|
debugOptions(`Drop subfields [${dropSubfields}]`);
|
|
@@ -48,14 +71,14 @@ var _default = ({
|
|
|
48
71
|
const baseFields = baseRecord.get(tagPattern);
|
|
49
72
|
const sourceFields = sourceRecord.get(tagPattern);
|
|
50
73
|
const doNotCopy = doNotCopyIfFieldPresent ? baseRecord.get(doNotCopyIfFieldPresent).length > 0 : false;
|
|
51
|
-
|
|
52
74
|
if (doNotCopy) {
|
|
53
75
|
return baseRecord.toObject();
|
|
54
76
|
}
|
|
55
|
-
|
|
77
|
+
debug(`FFS: ${compareWithoutIndicator1}, ${compareWithoutIndicators}, ${ignoreInd1}`);
|
|
56
78
|
debug(`Base fields: `, baseFields);
|
|
57
|
-
debug(`Source fields: `, sourceFields);
|
|
79
|
+
debug(`Source fields: `, sourceFields);
|
|
58
80
|
|
|
81
|
+
// Logic steps
|
|
59
82
|
const baseCompareFields = baseFields.map(baseField => createCompareField(baseField));
|
|
60
83
|
const compareResultFields = compareFields(sourceFields, baseCompareFields);
|
|
61
84
|
const droppedUnwantedSubfield = checkDropSubfields(compareResultFields);
|
|
@@ -64,99 +87,84 @@ var _default = ({
|
|
|
64
87
|
const swappedTags = checkSwapTag(swappedSubfields);
|
|
65
88
|
const uniqueFields = [...new Set(swappedTags.map(field => JSON.stringify(field)))].map(field => JSON.parse(field));
|
|
66
89
|
debug('Fields to be copied');
|
|
67
|
-
debug(JSON.stringify(uniqueFields));
|
|
90
|
+
debug(JSON.stringify(uniqueFields));
|
|
68
91
|
|
|
92
|
+
// Add fields to base;
|
|
69
93
|
uniqueFields.forEach(field => baseRecord.insertField(field));
|
|
94
|
+
debugData(`baseRecord before return: ${JSON.stringify(baseRecord)}`);
|
|
95
|
+
//return baseRecord;
|
|
70
96
|
return baseRecord.toObject();
|
|
71
|
-
|
|
72
97
|
function compareFields(sourceFields, baseCompareFields, uniqFields = []) {
|
|
73
98
|
const [sourceField, ...rest] = sourceFields;
|
|
74
|
-
|
|
75
99
|
if (sourceField === undefined) {
|
|
76
100
|
return uniqFields;
|
|
77
101
|
}
|
|
78
|
-
|
|
79
102
|
if (baseCompareFields.length === 0) {
|
|
80
103
|
return compareFields(rest, baseCompareFields, [...uniqFields, sourceField]);
|
|
81
|
-
}
|
|
82
|
-
// Non-identical fields are copied from source to base as duplicates
|
|
83
|
-
|
|
104
|
+
}
|
|
84
105
|
|
|
106
|
+
// Source and base are also compared for identicalness
|
|
107
|
+
// Non-identical fields are copied from source to base as duplicates
|
|
85
108
|
const sourceCompareField = createCompareField(sourceField);
|
|
86
109
|
const unique = checkCompareFields(baseCompareFields, sourceCompareField);
|
|
87
110
|
debugCompare(`${JSON.stringify(sourceField)} ${unique ? 'is UNIQUE' : 'not UNIQUE'}`);
|
|
88
|
-
|
|
89
111
|
if (unique) {
|
|
90
112
|
return compareFields(rest, baseCompareFields, [...uniqFields, sourceField]);
|
|
91
113
|
}
|
|
92
|
-
|
|
93
114
|
return compareFields(rest, baseCompareFields, uniqFields);
|
|
94
|
-
|
|
95
115
|
function checkCompareFields(baseCompareFields, sourceCompareField) {
|
|
96
116
|
let unique = true; // eslint-disable-line functional/no-let
|
|
97
117
|
|
|
98
118
|
baseCompareFields.forEach(baseCompareField => {
|
|
99
119
|
debugCompare(`Comparing ${JSON.stringify(sourceCompareField)} to ${JSON.stringify(baseCompareField)}}`);
|
|
100
|
-
|
|
101
120
|
if (sourceCompareField.value !== baseCompareField.value) {
|
|
102
121
|
debugCompare(`Value is different ${sourceCompareField.value} !== ${baseCompareField.value}`);
|
|
103
122
|
return;
|
|
104
123
|
}
|
|
105
|
-
|
|
106
124
|
if (sourceCompareField.ind1 !== baseCompareField.ind1) {
|
|
107
125
|
debugCompare(`Ind1 is different ${sourceCompareField.ind1} !== ${baseCompareField.ind1}`);
|
|
108
126
|
return;
|
|
109
127
|
}
|
|
110
|
-
|
|
111
128
|
if (sourceCompareField.ind2 !== baseCompareField.ind2) {
|
|
112
129
|
debugCompare(`Ind2 is different ${sourceCompareField.ind2} !== ${baseCompareField.ind2}`);
|
|
113
130
|
return;
|
|
114
131
|
}
|
|
115
|
-
|
|
116
132
|
if ('subfields' in sourceCompareField) {
|
|
117
133
|
const allFound = checkSubfields(sourceCompareField.subfields, baseCompareField.subfields);
|
|
118
134
|
debugCompare(`Subfields are different ${!allFound}`);
|
|
119
|
-
|
|
120
135
|
if (!allFound) {
|
|
121
136
|
return;
|
|
122
137
|
}
|
|
123
|
-
|
|
124
138
|
unique = false;
|
|
125
139
|
return;
|
|
126
140
|
}
|
|
127
|
-
|
|
128
141
|
unique = false;
|
|
129
142
|
return;
|
|
130
143
|
});
|
|
131
144
|
return unique;
|
|
132
145
|
}
|
|
133
|
-
|
|
134
146
|
function checkSubfields(sourceSubfields, baseSubfields) {
|
|
135
147
|
const foundSubs = sourceSubfields.filter(sSub => baseSubfields.some(bSub => sSub.code === bSub.code && sSub.value === bSub.value));
|
|
136
|
-
|
|
137
148
|
if (subfieldsMustBeIdentical) {
|
|
138
149
|
return foundSubs.length === sourceSubfields.length && foundSubs.length === baseSubfields.length;
|
|
139
150
|
}
|
|
140
|
-
|
|
141
151
|
return foundSubs.length === sourceSubfields.length;
|
|
142
152
|
}
|
|
143
|
-
}
|
|
144
|
-
|
|
153
|
+
}
|
|
145
154
|
|
|
155
|
+
// compare objects have only fields that matter in comparison
|
|
146
156
|
function createCompareField(field) {
|
|
147
157
|
if (compareTagsOnly) {
|
|
148
158
|
return {
|
|
149
159
|
tag: field.tag
|
|
150
160
|
};
|
|
151
161
|
}
|
|
152
|
-
|
|
153
162
|
if ('value' in field) {
|
|
154
163
|
return {
|
|
155
164
|
tag: field.tag,
|
|
156
165
|
value: field.value
|
|
157
166
|
};
|
|
158
167
|
}
|
|
159
|
-
|
|
160
168
|
const [filteredField] = checkDropSubfields([field]);
|
|
161
169
|
const [foundRule] = swapTag.filter(rule => new RegExp(rule.from, 'u').test(field.tag));
|
|
162
170
|
const replacementTag = foundRule ? foundRule.to : undefined;
|
|
@@ -165,16 +173,15 @@ var _default = ({
|
|
|
165
173
|
value: compareWithoutTag ? replacementTag : field.tag
|
|
166
174
|
}, {
|
|
167
175
|
name: 'ind1',
|
|
168
|
-
value:
|
|
176
|
+
value: ignoreInd1 ? undefined : field.ind1
|
|
169
177
|
}, {
|
|
170
178
|
name: 'ind2',
|
|
171
|
-
value:
|
|
179
|
+
value: ignoreInd2 ? undefined : field.ind2
|
|
172
180
|
}, {
|
|
173
181
|
name: 'subfields',
|
|
174
182
|
value: createCompareSubfields(filteredField.subfields)
|
|
175
183
|
}].map(param => [param.name, param.value]);
|
|
176
184
|
return Object.fromEntries(params);
|
|
177
|
-
|
|
178
185
|
function createCompareSubfields(subfields) {
|
|
179
186
|
const nonExcludedSubfields = subfields.filter(sub => !excludeSubfields.some(code => code === sub.code));
|
|
180
187
|
const normalizedSubfields = nonExcludedSubfields.map(sub => ({
|
|
@@ -182,50 +189,41 @@ var _default = ({
|
|
|
182
189
|
value: normalizeSubfieldValue(sub.value)
|
|
183
190
|
}));
|
|
184
191
|
return normalizedSubfields;
|
|
185
|
-
|
|
186
192
|
function normalizeSubfieldValue(value) {
|
|
187
193
|
return value.toLowerCase().replace(/\s+/ug, '');
|
|
188
194
|
}
|
|
189
195
|
}
|
|
190
196
|
}
|
|
191
|
-
|
|
192
197
|
function checkSwapTag(fields) {
|
|
193
198
|
if (swapTag.length > 0) {
|
|
194
|
-
return fields.map(field => ({
|
|
199
|
+
return fields.map(field => ({
|
|
200
|
+
...field,
|
|
195
201
|
tag: swapTagsFunc(field.tag)
|
|
196
202
|
}));
|
|
197
203
|
}
|
|
198
|
-
|
|
199
204
|
return fields;
|
|
200
|
-
|
|
201
205
|
function swapTagsFunc(tag) {
|
|
202
206
|
const [foundRule] = swapTag.filter(rule => new RegExp(rule.from, 'u').test(tag));
|
|
203
|
-
|
|
204
207
|
if (foundRule === undefined) {
|
|
205
208
|
return tag;
|
|
206
209
|
}
|
|
207
|
-
|
|
208
210
|
return foundRule.to;
|
|
209
211
|
}
|
|
210
212
|
}
|
|
211
|
-
|
|
212
213
|
function checkSwapSubfieldCodes(fields) {
|
|
213
214
|
if (swapSubfieldCode.length > 0) {
|
|
214
|
-
return fields.map(field => ({
|
|
215
|
+
return fields.map(field => ({
|
|
216
|
+
...field,
|
|
215
217
|
subfields: swapSubfieldCodesFunc(field.subfields)
|
|
216
218
|
}));
|
|
217
219
|
}
|
|
218
|
-
|
|
219
220
|
return fields;
|
|
220
|
-
|
|
221
221
|
function swapSubfieldCodesFunc(subfields) {
|
|
222
222
|
return subfields.map(sub => {
|
|
223
223
|
const [foundRule] = swapSubfieldCode.filter(rule => rule.from === sub.code);
|
|
224
|
-
|
|
225
224
|
if (foundRule === undefined) {
|
|
226
225
|
return sub;
|
|
227
226
|
}
|
|
228
|
-
|
|
229
227
|
return {
|
|
230
228
|
code: foundRule.to,
|
|
231
229
|
value: sub.value
|
|
@@ -233,16 +231,14 @@ var _default = ({
|
|
|
233
231
|
});
|
|
234
232
|
}
|
|
235
233
|
}
|
|
236
|
-
|
|
237
234
|
function checkDropSubfields(fields) {
|
|
238
235
|
if (dropSubfields.length > 0) {
|
|
239
|
-
return fields.map(field => ({
|
|
236
|
+
return fields.map(field => ({
|
|
237
|
+
...field,
|
|
240
238
|
subfields: dropSubfieldsFunc(field.subfields)
|
|
241
239
|
})).filter(field => field.subfields.length > 0);
|
|
242
240
|
}
|
|
243
|
-
|
|
244
241
|
return fields;
|
|
245
|
-
|
|
246
242
|
function dropSubfieldsFunc(subfields) {
|
|
247
243
|
return subfields.filter(sub => {
|
|
248
244
|
// eslint-disable-line
|
|
@@ -254,31 +250,25 @@ var _default = ({
|
|
|
254
250
|
if (code !== sub.code) {
|
|
255
251
|
return false;
|
|
256
252
|
}
|
|
257
|
-
|
|
258
253
|
if (!condition && value) {
|
|
259
254
|
return value === sub.value;
|
|
260
255
|
}
|
|
261
|
-
|
|
262
256
|
if (condition === 'unless' && value) {
|
|
263
257
|
return !new RegExp(value, 'u').test(sub.value);
|
|
264
258
|
}
|
|
265
|
-
|
|
266
259
|
return true;
|
|
267
260
|
});
|
|
268
261
|
});
|
|
269
262
|
}
|
|
270
263
|
}
|
|
271
|
-
|
|
272
264
|
function checkCopyUnlessFields(fields) {
|
|
273
265
|
if (copyUnless.length > 0) {
|
|
274
266
|
return fields.filter(({
|
|
275
267
|
subfields
|
|
276
268
|
}) => copyUnless.some(filter => !subfields.some(sub => sub.code === filter.code && new RegExp(filter.value, 'u').test(sub.value))));
|
|
277
269
|
}
|
|
278
|
-
|
|
279
270
|
return fields;
|
|
280
271
|
}
|
|
281
272
|
};
|
|
282
|
-
|
|
283
273
|
exports.default = _default;
|
|
284
274
|
//# sourceMappingURL=copy.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"copy.js","names":["tagPattern","compareTagsOnly","compareWithoutTag","compareWithoutIndicators","subfieldsMustBeIdentical","excludeSubfields","dropSubfields","copyUnless","baseValidators","subfieldValues","sourceValidators","swapTag","swapSubfieldCode","doNotCopyIfFieldPresent","base","source","baseRecord","MarcRecord","sourceRecord","debug","createDebugLogger","debugOptions","debugCompare","JSON","stringify","baseFields","get","sourceFields","doNotCopy","length","toObject","baseCompareFields","map","baseField","createCompareField","compareResultFields","compareFields","droppedUnwantedSubfield","checkDropSubfields","droppedUnwantedFields","checkCopyUnlessFields","swappedSubfields","checkSwapSubfieldCodes","swappedTags","checkSwapTag","uniqueFields","Set","field","parse","forEach","insertField","uniqFields","sourceField","rest","undefined","sourceCompareField","unique","checkCompareFields","baseCompareField","value","ind1","ind2","allFound","checkSubfields","subfields","sourceSubfields","baseSubfields","foundSubs","filter","sSub","some","bSub","code","tag","filteredField","foundRule","rule","RegExp","from","test","replacementTag","to","params","name","createCompareSubfields","param","Object","fromEntries","nonExcludedSubfields","sub","normalizedSubfields","normalizeSubfieldValue","toLowerCase","replace","fields","swapTagsFunc","swapSubfieldCodesFunc","dropSubfieldsFunc","condition"],"sources":["../../src/reducers/copy.js"],"sourcesContent":["/* eslint-disable max-statements */\n/* eslint-disable no-unused-vars */\n\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport createDebugLogger from 'debug';\n\nexport default ({\n tagPattern,\n compareTagsOnly = false,\n compareWithoutTag = false,\n compareWithoutIndicators = false,\n subfieldsMustBeIdentical = true,\n excludeSubfields = [],\n dropSubfields = [],\n copyUnless = [],\n baseValidators = {subfieldValues: false},\n sourceValidators = {subfieldValues: false},\n swapTag = [],\n swapSubfieldCode = [],\n doNotCopyIfFieldPresent = false\n}) => (base, source) => {\n const baseRecord = new MarcRecord(base, baseValidators);\n const sourceRecord = new MarcRecord(source, sourceValidators);\n\n const debug = createDebugLogger('@natlibfi/marc-record-merge');\n const debugOptions = createDebugLogger('@natlibfi/marc-record-merge:compare-options');\n const debugCompare = createDebugLogger('@natlibfi/marc-record-merge:compare');\n debugOptions(`Tag Pattern: ${tagPattern}`);\n debugOptions(`Compare tags only: ${compareTagsOnly}`);\n debugOptions(`Compare without indicators ${compareWithoutIndicators}`);\n debugOptions(`Copy if identical: ${subfieldsMustBeIdentical}`);\n debugOptions(`Exclude subfields: [${excludeSubfields}]`);\n debugOptions(`Drop subfields [${dropSubfields}]`);\n debugOptions(`Copy unless contains subfields: ${JSON.stringify(copyUnless)}`);\n\n const baseFields = baseRecord.get(tagPattern);\n const sourceFields = sourceRecord.get(tagPattern);\n const doNotCopy = doNotCopyIfFieldPresent ? baseRecord.get(doNotCopyIfFieldPresent).length > 0 : false;\n\n if (doNotCopy) {\n return baseRecord.toObject();\n }\n\n debug(`Base fields: `, baseFields);\n debug(`Source fields: `, sourceFields);\n\n // Logic steps\n const baseCompareFields = baseFields.map(baseField => createCompareField(baseField));\n const compareResultFields = compareFields(sourceFields, baseCompareFields);\n const droppedUnwantedSubfield = checkDropSubfields(compareResultFields);\n const droppedUnwantedFields = checkCopyUnlessFields(droppedUnwantedSubfield);\n const swappedSubfields = checkSwapSubfieldCodes(droppedUnwantedFields);\n const swappedTags = checkSwapTag(swappedSubfields);\n const uniqueFields = [...new Set(swappedTags.map(field => JSON.stringify(field)))].map(field => JSON.parse(field));\n debug('Fields to be copied');\n debug(JSON.stringify(uniqueFields));\n\n // Add fields to base;\n uniqueFields.forEach(field => baseRecord.insertField(field));\n return baseRecord.toObject();\n\n function compareFields(sourceFields, baseCompareFields, uniqFields = []) {\n const [sourceField, ...rest] = sourceFields;\n if (sourceField === undefined) {\n return uniqFields;\n }\n\n if (baseCompareFields.length === 0) {\n return compareFields(rest, baseCompareFields, [...uniqFields, sourceField]);\n }\n\n // Source and base are also compared for identicalness\n // Non-identical fields are copied from source to base as duplicates\n const sourceCompareField = createCompareField(sourceField);\n const unique = checkCompareFields(baseCompareFields, sourceCompareField);\n\n debugCompare(`${JSON.stringify(sourceField)} ${unique ? 'is UNIQUE' : 'not UNIQUE'}`);\n\n if (unique) {\n return compareFields(rest, baseCompareFields, [...uniqFields, sourceField]);\n }\n\n return compareFields(rest, baseCompareFields, uniqFields);\n\n function checkCompareFields(baseCompareFields, sourceCompareField) {\n let unique = true; // eslint-disable-line functional/no-let\n\n baseCompareFields.forEach(baseCompareField => {\n debugCompare(`Comparing ${JSON.stringify(sourceCompareField)} to ${JSON.stringify(baseCompareField)}}`);\n\n if (sourceCompareField.value !== baseCompareField.value) {\n debugCompare(`Value is different ${sourceCompareField.value} !== ${baseCompareField.value}`);\n return;\n }\n\n if (sourceCompareField.ind1 !== baseCompareField.ind1) {\n debugCompare(`Ind1 is different ${sourceCompareField.ind1} !== ${baseCompareField.ind1}`);\n return;\n }\n\n if (sourceCompareField.ind2 !== baseCompareField.ind2) {\n debugCompare(`Ind2 is different ${sourceCompareField.ind2} !== ${baseCompareField.ind2}`);\n return;\n }\n\n if ('subfields' in sourceCompareField) {\n const allFound = checkSubfields(sourceCompareField.subfields, baseCompareField.subfields);\n debugCompare(`Subfields are different ${!allFound}`);\n if (!allFound) {\n return;\n }\n\n unique = false;\n return;\n }\n\n unique = false;\n return;\n });\n\n return unique;\n }\n\n function checkSubfields(sourceSubfields, baseSubfields) {\n const foundSubs = sourceSubfields.filter(sSub => baseSubfields.some(bSub => sSub.code === bSub.code && sSub.value === bSub.value));\n\n if (subfieldsMustBeIdentical) {\n return foundSubs.length === sourceSubfields.length && foundSubs.length === baseSubfields.length;\n }\n\n return foundSubs.length === sourceSubfields.length;\n }\n }\n\n // compare objects have only fields that matter in comparing\n function createCompareField(field) {\n if (compareTagsOnly) {\n return {tag: field.tag};\n }\n\n if ('value' in field) {\n return {tag: field.tag, value: field.value};\n }\n\n const [filteredField] = checkDropSubfields([field]);\n const [foundRule] = swapTag.filter(rule => new RegExp(rule.from, 'u').test(field.tag));\n const replacementTag = foundRule ? foundRule.to : undefined;\n\n const params = [\n {name: 'tag', value: compareWithoutTag ? replacementTag : field.tag},\n {name: 'ind1', value: compareWithoutIndicators ? undefined : field.ind1},\n {name: 'ind2', value: compareWithoutIndicators ? undefined : field.ind2},\n {name: 'subfields', value: createCompareSubfields(filteredField.subfields)}\n ].map(param => [param.name, param.value]);\n\n return Object.fromEntries(params);\n\n function createCompareSubfields(subfields) {\n const nonExcludedSubfields = subfields.filter(sub => !excludeSubfields.some(code => code === sub.code));\n const normalizedSubfields = nonExcludedSubfields.map(sub => ({code: sub.code, value: normalizeSubfieldValue(sub.value)}));\n\n return normalizedSubfields;\n\n function normalizeSubfieldValue(value) {\n return value.toLowerCase().replace(/\\s+/ug, '');\n }\n }\n }\n\n function checkSwapTag(fields) {\n if (swapTag.length > 0) {\n return fields.map(field => ({...field, tag: swapTagsFunc(field.tag)}));\n }\n\n return fields;\n\n function swapTagsFunc(tag) {\n const [foundRule] = swapTag.filter(rule => new RegExp(rule.from, 'u').test(tag));\n\n if (foundRule === undefined) {\n return tag;\n }\n\n return foundRule.to;\n }\n }\n\n function checkSwapSubfieldCodes(fields) {\n if (swapSubfieldCode.length > 0) {\n return fields.map(field => ({...field, subfields: swapSubfieldCodesFunc(field.subfields)}));\n }\n\n return fields;\n\n function swapSubfieldCodesFunc(subfields) {\n return subfields.map(sub => {\n const [foundRule] = swapSubfieldCode.filter(rule => rule.from === sub.code);\n\n if (foundRule === undefined) {\n return sub;\n }\n\n return {code: foundRule.to, value: sub.value};\n });\n }\n }\n\n function checkDropSubfields(fields) {\n if (dropSubfields.length > 0) {\n return fields.map(field => ({...field, subfields: dropSubfieldsFunc(field.subfields)}))\n .filter(field => field.subfields.length > 0);\n }\n\n return fields;\n\n function dropSubfieldsFunc(subfields) {\n return subfields.filter(sub => { // eslint-disable-line\n return !dropSubfields.some(({code, value = false, condition = false}) => {\n if (code !== sub.code) {\n return false;\n }\n\n if (!condition && value) {\n return value === sub.value;\n }\n\n if (condition === 'unless' && value) {\n return !new RegExp(value, 'u').test(sub.value);\n }\n\n return true;\n });\n });\n }\n }\n\n function checkCopyUnlessFields(fields) {\n if (copyUnless.length > 0) {\n return fields.filter(({subfields}) => copyUnless.some(filter => !subfields.some(sub => sub.code === filter.code && new RegExp(filter.value, 'u').test(sub.value))));\n }\n\n return fields;\n }\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"copy.js","names":["_marcRecord","require","_debug","_interopRequireDefault","obj","__esModule","default","_default","tagPattern","compareTagsOnly","compareWithoutTag","compareWithoutIndicators","compareWithoutIndicator1","compareWithoutIndicator2","subfieldsMustBeIdentical","excludeSubfields","dropSubfields","copyUnless","baseValidators","subfieldValues","sourceValidators","swapTag","swapSubfieldCode","doNotCopyIfFieldPresent","base","source","debug","createDebugLogger","debugData","extend","debugOptions","debugCompare","JSON","stringify","baseRecord","sourceRecord","getRecordsFromParameters","undefined","MarcRecord","ignoreInd1","ignoreInd2","baseFields","get","sourceFields","doNotCopy","length","toObject","baseCompareFields","map","baseField","createCompareField","compareResultFields","compareFields","droppedUnwantedSubfield","checkDropSubfields","droppedUnwantedFields","checkCopyUnlessFields","swappedSubfields","checkSwapSubfieldCodes","swappedTags","checkSwapTag","uniqueFields","Set","field","parse","forEach","insertField","uniqFields","sourceField","rest","sourceCompareField","unique","checkCompareFields","baseCompareField","value","ind1","ind2","allFound","checkSubfields","subfields","sourceSubfields","baseSubfields","foundSubs","filter","sSub","some","bSub","code","tag","filteredField","foundRule","rule","RegExp","from","test","replacementTag","to","params","name","createCompareSubfields","param","Object","fromEntries","nonExcludedSubfields","sub","normalizedSubfields","normalizeSubfieldValue","toLowerCase","replace","fields","swapTagsFunc","swapSubfieldCodesFunc","dropSubfieldsFunc","condition","exports"],"sources":["../../src/reducers/copy.js"],"sourcesContent":["/* eslint-disable max-statements */\n/* eslint-disable no-unused-vars */\n\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport createDebugLogger from 'debug';\n\nexport default ({\n tagPattern,\n compareTagsOnly = false,\n compareWithoutTag = false,\n compareWithoutIndicators = false,\n compareWithoutIndicator1 = false,\n compareWithoutIndicator2 = false,\n subfieldsMustBeIdentical = true,\n excludeSubfields = [],\n dropSubfields = [],\n copyUnless = [],\n baseValidators = {subfieldValues: false},\n sourceValidators = {subfieldValues: false},\n swapTag = [],\n swapSubfieldCode = [],\n doNotCopyIfFieldPresent = false\n}) => (base, source) => {\n\n const debug = createDebugLogger('@natlibfi/marc-record-merge:copy');\n const debugData = debug.extend('data');\n const debugOptions = createDebugLogger('@natlibfi/marc-record-merge:compare-options');\n const debugCompare = createDebugLogger('@natlibfi/marc-record-merge:compare');\n\n debugData(`base: ${JSON.stringify(base)}`);\n debugData(`source: ${JSON.stringify(source)}`);\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 ignoreInd1 = compareWithoutIndicators || compareWithoutIndicator1;\n const ignoreInd2 = compareWithoutIndicators || compareWithoutIndicator2;\n\n debugOptions(`Tag Pattern: ${tagPattern}`);\n debugOptions(`Compare tags only: ${compareTagsOnly}`);\n debugOptions(`Omit indicator 1 from comparison: ${ignoreInd1}`);\n debugOptions(`Omit indicator 2 from comparison: ${ignoreInd2}`);\n debugOptions(`Copy if identical: ${subfieldsMustBeIdentical}`);\n debugOptions(`Exclude subfields: [${excludeSubfields}]`);\n debugOptions(`Drop subfields [${dropSubfields}]`);\n debugOptions(`Copy unless contains subfields: ${JSON.stringify(copyUnless)}`);\n\n const baseFields = baseRecord.get(tagPattern);\n const sourceFields = sourceRecord.get(tagPattern);\n const doNotCopy = doNotCopyIfFieldPresent ? baseRecord.get(doNotCopyIfFieldPresent).length > 0 : false;\n\n if (doNotCopy) {\n return baseRecord.toObject();\n }\n debug(`FFS: ${compareWithoutIndicator1}, ${compareWithoutIndicators}, ${ignoreInd1}`);\n debug(`Base fields: `, baseFields);\n debug(`Source fields: `, sourceFields);\n\n // Logic steps\n const baseCompareFields = baseFields.map(baseField => createCompareField(baseField));\n const compareResultFields = compareFields(sourceFields, baseCompareFields);\n const droppedUnwantedSubfield = checkDropSubfields(compareResultFields);\n const droppedUnwantedFields = checkCopyUnlessFields(droppedUnwantedSubfield);\n const swappedSubfields = checkSwapSubfieldCodes(droppedUnwantedFields);\n const swappedTags = checkSwapTag(swappedSubfields);\n const uniqueFields = [...new Set(swappedTags.map(field => JSON.stringify(field)))].map(field => JSON.parse(field));\n debug('Fields to be copied');\n debug(JSON.stringify(uniqueFields));\n\n // Add fields to base;\n uniqueFields.forEach(field => baseRecord.insertField(field));\n debugData(`baseRecord before return: ${JSON.stringify(baseRecord)}`);\n //return baseRecord;\n return baseRecord.toObject();\n\n function compareFields(sourceFields, baseCompareFields, uniqFields = []) {\n const [sourceField, ...rest] = sourceFields;\n if (sourceField === undefined) {\n return uniqFields;\n }\n\n if (baseCompareFields.length === 0) {\n return compareFields(rest, baseCompareFields, [...uniqFields, sourceField]);\n }\n\n // Source and base are also compared for identicalness\n // Non-identical fields are copied from source to base as duplicates\n const sourceCompareField = createCompareField(sourceField);\n const unique = checkCompareFields(baseCompareFields, sourceCompareField);\n\n debugCompare(`${JSON.stringify(sourceField)} ${unique ? 'is UNIQUE' : 'not UNIQUE'}`);\n\n if (unique) {\n return compareFields(rest, baseCompareFields, [...uniqFields, sourceField]);\n }\n\n return compareFields(rest, baseCompareFields, uniqFields);\n\n function checkCompareFields(baseCompareFields, sourceCompareField) {\n let unique = true; // eslint-disable-line functional/no-let\n\n baseCompareFields.forEach(baseCompareField => {\n debugCompare(`Comparing ${JSON.stringify(sourceCompareField)} to ${JSON.stringify(baseCompareField)}}`);\n\n if (sourceCompareField.value !== baseCompareField.value) {\n debugCompare(`Value is different ${sourceCompareField.value} !== ${baseCompareField.value}`);\n return;\n }\n\n if (sourceCompareField.ind1 !== baseCompareField.ind1) {\n debugCompare(`Ind1 is different ${sourceCompareField.ind1} !== ${baseCompareField.ind1}`);\n return;\n }\n\n if (sourceCompareField.ind2 !== baseCompareField.ind2) {\n debugCompare(`Ind2 is different ${sourceCompareField.ind2} !== ${baseCompareField.ind2}`);\n return;\n }\n\n if ('subfields' in sourceCompareField) {\n const allFound = checkSubfields(sourceCompareField.subfields, baseCompareField.subfields);\n debugCompare(`Subfields are different ${!allFound}`);\n if (!allFound) {\n return;\n }\n\n unique = false;\n return;\n }\n\n unique = false;\n return;\n });\n\n return unique;\n }\n\n function checkSubfields(sourceSubfields, baseSubfields) {\n const foundSubs = sourceSubfields.filter(sSub => baseSubfields.some(bSub => sSub.code === bSub.code && sSub.value === bSub.value));\n\n if (subfieldsMustBeIdentical) {\n return foundSubs.length === sourceSubfields.length && foundSubs.length === baseSubfields.length;\n }\n\n return foundSubs.length === sourceSubfields.length;\n }\n }\n\n // compare objects have only fields that matter in comparison\n function createCompareField(field) {\n if (compareTagsOnly) {\n return {tag: field.tag};\n }\n\n if ('value' in field) {\n return {tag: field.tag, value: field.value};\n }\n\n const [filteredField] = checkDropSubfields([field]);\n const [foundRule] = swapTag.filter(rule => new RegExp(rule.from, 'u').test(field.tag));\n const replacementTag = foundRule ? foundRule.to : undefined;\n\n const params = [\n {name: 'tag', value: compareWithoutTag ? replacementTag : field.tag},\n {name: 'ind1', value: ignoreInd1 ? undefined : field.ind1},\n {name: 'ind2', value: ignoreInd2 ? undefined : field.ind2},\n {name: 'subfields', value: createCompareSubfields(filteredField.subfields)}\n ].map(param => [param.name, param.value]);\n\n return Object.fromEntries(params);\n\n function createCompareSubfields(subfields) {\n const nonExcludedSubfields = subfields.filter(sub => !excludeSubfields.some(code => code === sub.code));\n const normalizedSubfields = nonExcludedSubfields.map(sub => ({code: sub.code, value: normalizeSubfieldValue(sub.value)}));\n\n return normalizedSubfields;\n\n function normalizeSubfieldValue(value) {\n return value.toLowerCase().replace(/\\s+/ug, '');\n }\n }\n }\n\n function checkSwapTag(fields) {\n if (swapTag.length > 0) {\n return fields.map(field => ({...field, tag: swapTagsFunc(field.tag)}));\n }\n\n return fields;\n\n function swapTagsFunc(tag) {\n const [foundRule] = swapTag.filter(rule => new RegExp(rule.from, 'u').test(tag));\n\n if (foundRule === undefined) {\n return tag;\n }\n\n return foundRule.to;\n }\n }\n\n function checkSwapSubfieldCodes(fields) {\n if (swapSubfieldCode.length > 0) {\n return fields.map(field => ({...field, subfields: swapSubfieldCodesFunc(field.subfields)}));\n }\n\n return fields;\n\n function swapSubfieldCodesFunc(subfields) {\n return subfields.map(sub => {\n const [foundRule] = swapSubfieldCode.filter(rule => rule.from === sub.code);\n\n if (foundRule === undefined) {\n return sub;\n }\n\n return {code: foundRule.to, value: sub.value};\n });\n }\n }\n\n function checkDropSubfields(fields) {\n if (dropSubfields.length > 0) {\n return fields.map(field => ({...field, subfields: dropSubfieldsFunc(field.subfields)}))\n .filter(field => field.subfields.length > 0);\n }\n\n return fields;\n\n function dropSubfieldsFunc(subfields) {\n return subfields.filter(sub => { // eslint-disable-line\n return !dropSubfields.some(({code, value = false, condition = false}) => {\n if (code !== sub.code) {\n return false;\n }\n\n if (!condition && value) {\n return value === sub.value;\n }\n\n if (condition === 'unless' && value) {\n return !new RegExp(value, 'u').test(sub.value);\n }\n\n return true;\n });\n });\n }\n }\n\n function checkCopyUnlessFields(fields) {\n if (copyUnless.length > 0) {\n return fields.filter(({subfields}) => copyUnless.some(filter => !subfields.some(sub => sub.code === filter.code && new RegExp(filter.value, 'u').test(sub.value))));\n }\n\n return fields;\n }\n};\n"],"mappings":"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"}
|