@natlibfi/marc-record-merge 5.0.0 → 6.0.0-beta.10
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 +9 -0
- package/.github/dependabot.yml +41 -0
- package/.github/workflows/melinda-node-tests.yml +60 -0
- package/LICENSE +21 -0
- package/README.md +90 -242
- package/dist/index.js +55 -0
- package/dist/index.js.map +1 -0
- package/dist/reducers/copy.js +249 -0
- package/dist/reducers/copy.js.map +1 -0
- package/dist/reducers/copy.spec.js +64 -0
- package/dist/reducers/copy.spec.js.map +1 -0
- package/dist/reducers/index.js +19 -0
- package/dist/reducers/index.js.map +1 -0
- package/dist/reducers/select.js +118 -0
- package/dist/reducers/select.js.map +1 -0
- package/dist/reducers/select.spec.js +55 -0
- package/dist/reducers/select.spec.js.map +1 -0
- package/package.json +101 -57
- package/src/index.js +34 -0
- package/src/reducers/copy.js +251 -0
- package/src/reducers/copy.spec.js +54 -0
- package/src/reducers/index.js +4 -0
- package/src/reducers/select.js +110 -0
- package/src/reducers/select.spec.js +49 -0
- package/test-fixtures/reducers/copy/01 - copy/01/base.json +9 -0
- package/test-fixtures/reducers/copy/01 - copy/01/merged.json +20 -0
- package/test-fixtures/reducers/copy/01 - copy/01/metadata.json +4 -0
- package/test-fixtures/reducers/copy/01 - copy/01/source.json +20 -0
- package/test-fixtures/reducers/copy/01 - copy/02/base.json +20 -0
- package/test-fixtures/reducers/copy/01 - copy/02/merged.json +20 -0
- package/test-fixtures/reducers/copy/01 - copy/02/metadata.json +4 -0
- package/test-fixtures/reducers/copy/01 - copy/02/source.json +20 -0
- package/test-fixtures/reducers/copy/01 - copy/03/base.json +20 -0
- package/test-fixtures/reducers/copy/01 - copy/03/merged.json +28 -0
- package/test-fixtures/reducers/copy/01 - copy/03/metadata.json +4 -0
- package/test-fixtures/reducers/copy/01 - copy/03/source.json +24 -0
- package/test-fixtures/reducers/copy/01 - copy/04/base.json +39 -0
- package/test-fixtures/reducers/copy/01 - copy/04/merged.json +39 -0
- package/test-fixtures/reducers/copy/01 - copy/04/metadata.json +4 -0
- package/test-fixtures/reducers/copy/01 - copy/04/source.json +39 -0
- package/test-fixtures/reducers/copy/01 - copy/05/base.json +39 -0
- package/test-fixtures/reducers/copy/01 - copy/05/merged.json +77 -0
- package/test-fixtures/reducers/copy/01 - copy/05/metadata.json +4 -0
- package/test-fixtures/reducers/copy/01 - copy/05/source.json +62 -0
- package/test-fixtures/reducers/copy/01 - copy/06/base.json +24 -0
- package/test-fixtures/reducers/copy/01 - copy/06/merged.json +39 -0
- package/test-fixtures/reducers/copy/01 - copy/06/metadata.json +4 -0
- package/test-fixtures/reducers/copy/01 - copy/06/source.json +24 -0
- package/test-fixtures/reducers/copy/01 - copy/07/base.json +39 -0
- package/test-fixtures/reducers/copy/01 - copy/07/merged.json +39 -0
- package/test-fixtures/reducers/copy/01 - copy/07/metadata.json +5 -0
- package/test-fixtures/reducers/copy/01 - copy/07/source.json +24 -0
- package/test-fixtures/reducers/copy/01 - copy/08/base.json +28 -0
- package/test-fixtures/reducers/copy/01 - copy/08/merged.json +28 -0
- package/test-fixtures/reducers/copy/01 - copy/08/metadata.json +4 -0
- package/test-fixtures/reducers/copy/01 - copy/08/source.json +24 -0
- package/test-fixtures/reducers/copy/02 - doNotCopyIfFieldPresent/01/base.json +17 -0
- package/test-fixtures/reducers/copy/02 - doNotCopyIfFieldPresent/01/merged.json +20 -0
- package/test-fixtures/reducers/copy/02 - doNotCopyIfFieldPresent/01/metadata.json +6 -0
- package/test-fixtures/reducers/copy/02 - doNotCopyIfFieldPresent/01/source.json +20 -0
- package/test-fixtures/reducers/copy/02 - doNotCopyIfFieldPresent/02/base.json +9 -0
- package/test-fixtures/reducers/copy/02 - doNotCopyIfFieldPresent/02/merged.json +20 -0
- package/test-fixtures/reducers/copy/02 - doNotCopyIfFieldPresent/02/metadata.json +6 -0
- package/test-fixtures/reducers/copy/02 - doNotCopyIfFieldPresent/02/source.json +20 -0
- package/test-fixtures/reducers/copy/03 - compareTagsOnly/01/base.json +24 -0
- package/test-fixtures/reducers/copy/03 - compareTagsOnly/01/merged.json +24 -0
- package/test-fixtures/reducers/copy/03 - compareTagsOnly/01/metadata.json +5 -0
- package/test-fixtures/reducers/copy/03 - compareTagsOnly/01/source.json +24 -0
- package/test-fixtures/reducers/copy/03 - compareTagsOnly/02/base.json +24 -0
- package/test-fixtures/reducers/copy/03 - compareTagsOnly/02/merged.json +100 -0
- package/test-fixtures/reducers/copy/03 - compareTagsOnly/02/metadata.json +5 -0
- package/test-fixtures/reducers/copy/03 - compareTagsOnly/02/source.json +100 -0
- package/test-fixtures/reducers/copy/04 - compareWithoutIndicators/01/base.json +24 -0
- package/test-fixtures/reducers/copy/04 - compareWithoutIndicators/01/merged.json +24 -0
- package/test-fixtures/reducers/copy/04 - compareWithoutIndicators/01/metadata.json +5 -0
- package/test-fixtures/reducers/copy/04 - compareWithoutIndicators/01/source.json +24 -0
- package/test-fixtures/reducers/copy/04 - compareWithoutIndicators/02/base.json +24 -0
- package/test-fixtures/reducers/copy/04 - compareWithoutIndicators/02/merged.json +39 -0
- package/test-fixtures/reducers/copy/04 - compareWithoutIndicators/02/metadata.json +5 -0
- package/test-fixtures/reducers/copy/04 - compareWithoutIndicators/02/source.json +24 -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/05 - copyUnless/01/base.json +9 -0
- package/test-fixtures/reducers/copy/05 - copyUnless/01/merged.json +24 -0
- package/test-fixtures/reducers/copy/05 - copyUnless/01/metadata.json +5 -0
- package/test-fixtures/reducers/copy/05 - copyUnless/01/source.json +47 -0
- package/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/01/base.json +24 -0
- package/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/01/merged.json +39 -0
- package/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/01/metadata.json +5 -0
- package/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/01/source.json +24 -0
- package/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/02/base.json +24 -0
- package/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/02/merged.json +24 -0
- package/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/02/metadata.json +5 -0
- package/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/02/source.json +24 -0
- package/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/03/base.json +28 -0
- package/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/03/merged.json +43 -0
- package/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/03/metadata.json +5 -0
- package/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/03/source.json +24 -0
- package/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/04/base.json +28 -0
- package/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/04/merged.json +28 -0
- package/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/04/metadata.json +5 -0
- package/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/04/source.json +24 -0
- package/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/05/base.json +20 -0
- package/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/05/merged.json +35 -0
- package/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/05/metadata.json +5 -0
- package/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/05/source.json +24 -0
- package/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/06/base.json +20 -0
- package/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/06/merged.json +35 -0
- package/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/06/metadata.json +5 -0
- package/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/06/source.json +24 -0
- package/test-fixtures/reducers/copy/07 - excludeSubfields/01/base.json +39 -0
- package/test-fixtures/reducers/copy/07 - excludeSubfields/01/merged.json +39 -0
- package/test-fixtures/reducers/copy/07 - excludeSubfields/01/metadata.json +8 -0
- package/test-fixtures/reducers/copy/07 - excludeSubfields/01/source.json +43 -0
- package/test-fixtures/reducers/copy/07 - excludeSubfields/02/base.json +39 -0
- package/test-fixtures/reducers/copy/07 - excludeSubfields/02/merged.json +58 -0
- package/test-fixtures/reducers/copy/07 - excludeSubfields/02/metadata.json +5 -0
- package/test-fixtures/reducers/copy/07 - excludeSubfields/02/source.json +43 -0
- package/test-fixtures/reducers/copy/08 - dropSubfields/01/base.json +35 -0
- package/test-fixtures/reducers/copy/08 - dropSubfields/01/merged.json +54 -0
- package/test-fixtures/reducers/copy/08 - dropSubfields/01/metadata.json +5 -0
- package/test-fixtures/reducers/copy/08 - dropSubfields/01/source.json +43 -0
- package/test-fixtures/reducers/copy/08 - dropSubfields/02/base.json +43 -0
- package/test-fixtures/reducers/copy/08 - dropSubfields/02/merged.json +58 -0
- package/test-fixtures/reducers/copy/08 - dropSubfields/02/metadata.json +5 -0
- package/test-fixtures/reducers/copy/08 - dropSubfields/02/source.json +32 -0
- package/test-fixtures/reducers/copy/08 - dropSubfields/03/base.json +43 -0
- package/test-fixtures/reducers/copy/08 - dropSubfields/03/merged.json +58 -0
- package/test-fixtures/reducers/copy/08 - dropSubfields/03/metadata.json +5 -0
- package/test-fixtures/reducers/copy/08 - dropSubfields/03/source.json +32 -0
- package/test-fixtures/reducers/copy/08 - dropSubfields/04/base.json +43 -0
- package/test-fixtures/reducers/copy/08 - dropSubfields/04/merged.json +43 -0
- package/test-fixtures/reducers/copy/08 - dropSubfields/04/metadata.json +5 -0
- package/test-fixtures/reducers/copy/08 - dropSubfields/04/source.json +32 -0
- package/test-fixtures/reducers/copy/09 - swapSubfieldCode/01/base.json +9 -0
- package/test-fixtures/reducers/copy/09 - swapSubfieldCode/01/merged.json +20 -0
- package/test-fixtures/reducers/copy/09 - swapSubfieldCode/01/metadata.json +6 -0
- package/test-fixtures/reducers/copy/09 - swapSubfieldCode/01/source.json +20 -0
- package/test-fixtures/reducers/copy/09 - swapSubfieldCode/02/base.json +9 -0
- package/test-fixtures/reducers/copy/09 - swapSubfieldCode/02/merged.json +20 -0
- package/test-fixtures/reducers/copy/09 - swapSubfieldCode/02/metadata.json +6 -0
- package/test-fixtures/reducers/copy/09 - swapSubfieldCode/02/source.json +20 -0
- package/test-fixtures/reducers/copy/09 - swapSubfieldCode/03/base.json +9 -0
- package/test-fixtures/reducers/copy/09 - swapSubfieldCode/03/merged.json +31 -0
- package/test-fixtures/reducers/copy/09 - swapSubfieldCode/03/metadata.json +6 -0
- package/test-fixtures/reducers/copy/09 - swapSubfieldCode/03/source.json +31 -0
- package/test-fixtures/reducers/copy/09 - swapSubfieldCode/04/base.json +9 -0
- package/test-fixtures/reducers/copy/09 - swapSubfieldCode/04/merged.json +42 -0
- package/test-fixtures/reducers/copy/09 - swapSubfieldCode/04/metadata.json +6 -0
- package/test-fixtures/reducers/copy/09 - swapSubfieldCode/04/source.json +42 -0
- package/test-fixtures/reducers/copy/10 - swapTag/01/base.json +17 -0
- package/test-fixtures/reducers/copy/10 - swapTag/01/merged.json +28 -0
- package/test-fixtures/reducers/copy/10 - swapTag/01/metadata.json +6 -0
- package/test-fixtures/reducers/copy/10 - swapTag/01/source.json +20 -0
- package/test-fixtures/reducers/copy/11 - compareWithoutTag/01/base.json +28 -0
- package/test-fixtures/reducers/copy/11 - compareWithoutTag/01/merged.json +28 -0
- package/test-fixtures/reducers/copy/11 - compareWithoutTag/01/metadata.json +6 -0
- package/test-fixtures/reducers/copy/11 - compareWithoutTag/01/source.json +20 -0
- package/test-fixtures/reducers/copy/11 - compareWithoutTag/02/base.json +28 -0
- package/test-fixtures/reducers/copy/11 - compareWithoutTag/02/merged.json +39 -0
- package/test-fixtures/reducers/copy/11 - compareWithoutTag/02/metadata.json +6 -0
- package/test-fixtures/reducers/copy/11 - compareWithoutTag/02/source.json +31 -0
- package/test-fixtures/reducers/copy/11 - compareWithoutTag/03/base.json +28 -0
- package/test-fixtures/reducers/copy/11 - compareWithoutTag/03/merged.json +28 -0
- package/test-fixtures/reducers/copy/11 - compareWithoutTag/03/metadata.json +7 -0
- package/test-fixtures/reducers/copy/11 - compareWithoutTag/03/source.json +20 -0
- 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/test-fixtures/reducers/metadata.json +4 -0
- package/test-fixtures/reducers/select/01/base.json +21 -0
- package/test-fixtures/reducers/select/01/merged.json +20 -0
- package/test-fixtures/reducers/select/01/metadata.json +5 -0
- package/test-fixtures/reducers/select/01/source.json +20 -0
- package/test-fixtures/reducers/select/02/base.json +31 -0
- package/test-fixtures/reducers/select/02/merged.json +31 -0
- package/test-fixtures/reducers/select/02/metadata.json +4 -0
- package/test-fixtures/reducers/select/02/source.json +42 -0
- package/test-fixtures/reducers/select/03/base.json +20 -0
- package/test-fixtures/reducers/select/03/merged.json +20 -0
- package/test-fixtures/reducers/select/03/metadata.json +4 -0
- package/test-fixtures/reducers/select/03/source.json +20 -0
- package/test-fixtures/reducers/select/04/base.json +20 -0
- package/test-fixtures/reducers/select/04/merged.json +20 -0
- package/test-fixtures/reducers/select/04/metadata.json +5 -0
- package/test-fixtures/reducers/select/04/source.json +20 -0
- package/test-fixtures/reducers/select/05/base.json +24 -0
- package/test-fixtures/reducers/select/05/merged.json +24 -0
- package/test-fixtures/reducers/select/05/metadata.json +4 -0
- package/test-fixtures/reducers/select/05/source.json +24 -0
- package/test-fixtures/reducers/select/06/base.json +28 -0
- package/test-fixtures/reducers/select/06/merged.json +28 -0
- package/test-fixtures/reducers/select/06/metadata.json +4 -0
- package/test-fixtures/reducers/select/06/source.json +28 -0
- package/test-fixtures/reducers/select/07/base.json +24 -0
- package/test-fixtures/reducers/select/07/merged.json +24 -0
- package/test-fixtures/reducers/select/07/metadata.json +5 -0
- package/test-fixtures/reducers/select/07/source.json +24 -0
- package/test-fixtures/reducers/select/08/base.json +24 -0
- package/test-fixtures/reducers/select/08/merged.json +24 -0
- package/test-fixtures/reducers/select/08/metadata.json +4 -0
- package/test-fixtures/reducers/select/08/source.json +24 -0
- package/test-fixtures/reducers/select/09/base.json +24 -0
- package/test-fixtures/reducers/select/09/merged.json +24 -0
- package/test-fixtures/reducers/select/09/metadata.json +4 -0
- package/test-fixtures/reducers/select/09/source.json +24 -0
- package/test-fixtures/reducers/select/10/base.json +24 -0
- package/test-fixtures/reducers/select/10/merged.json +28 -0
- package/test-fixtures/reducers/select/10/metadata.json +5 -0
- package/test-fixtures/reducers/select/10/source.json +28 -0
- package/test-fixtures/reducers/select/11/base.json +24 -0
- package/test-fixtures/reducers/select/11/merged.json +24 -0
- package/test-fixtures/reducers/select/11/metadata.json +4 -0
- package/test-fixtures/reducers/select/11/source.json +28 -0
- package/test-fixtures/reducers/select/12/base.json +24 -0
- package/test-fixtures/reducers/select/12/merged.json +28 -0
- package/test-fixtures/reducers/select/12/metadata.json +5 -0
- package/test-fixtures/reducers/select/12/source.json +28 -0
- package/test-fixtures/reducers/select/13/base.json +28 -0
- package/test-fixtures/reducers/select/13/merged.json +28 -0
- package/test-fixtures/reducers/select/13/metadata.json +4 -0
- package/test-fixtures/reducers/select/13/source.json +24 -0
- package/test-fixtures/reducers/select/14/base.json +24 -0
- package/test-fixtures/reducers/select/14/merged.json +24 -0
- package/test-fixtures/reducers/select/14/metadata.json +4 -0
- package/test-fixtures/reducers/select/14/source.json +24 -0
- package/.editorconfig +0 -10
- package/.istanbul.yml +0 -6
- package/.jshintignore +0 -2
- package/.jshintrc +0 -3
- package/.travis.yml +0 -16
- package/LICENSE.txt +0 -661
- package/karma.conf.js +0 -39
- package/lib/main.js +0 -1215
- package/resources/action-copy-options-schema.json +0 -81
- package/resources/action-select-better-options-schema.json +0 -34
- package/resources/configuration-schema.json +0 -46
- package/test/browser/main.spec.js +0 -96
- package/test/nodejs/main.spec.js +0 -71
- package/test/suites/74.json +0 -10
- package/test/suites/config/1to3.json +0 -10
- package/test/suites/config/27to28.json +0 -10
- package/test/suites/config/29to31.json +0 -10
- package/test/suites/config/32to40.json +0 -16
- package/test/suites/config/41to43.json +0 -10
- package/test/suites/config/44to56.json +0 -15
- package/test/suites/config/4to26.json +0 -81
- package/test/suites/config/57to63.json +0 -63
- package/test/suites/config/64.json +0 -7
- package/test/suites/config/65.json +0 -19
- package/test/suites/config/66.json +0 -13
- package/test/suites/config/67.json +0 -14
- package/test/suites/config/68.json +0 -12
- package/test/suites/config/69.json +0 -12
- package/test/suites/config/70.json +0 -13
- package/test/suites/config/71.json +0 -10
- package/test/suites/config/72.json +0 -12
- package/test/suites/config/73.json +0 -10
- package/test/suites/config/76.json +0 -13
- package/test/suites/config/77.json +0 -11
- package/test/suites/config/78to79.json +0 -12
- package/test/suites/config/80to81.json +0 -12
- package/test/suites/config/82.json +0 -10
- package/test/suites/config/83to85.json +0 -15
- package/test/suites/config/86.json +0 -16
- package/test/suites/config/87.json +0 -15
- package/test/suites/config/88.json +0 -16
- package/test/suites/data/1/merged +0 -3
- package/test/suites/data/1/other +0 -3
- package/test/suites/data/1/preferred +0 -2
- package/test/suites/data/10/descr +0 -1
- package/test/suites/data/10/merged +0 -2
- package/test/suites/data/10/other +0 -2
- package/test/suites/data/10/preferred +0 -2
- package/test/suites/data/11/descr +0 -1
- package/test/suites/data/11/merged +0 -2
- package/test/suites/data/11/other +0 -2
- package/test/suites/data/11/preferred +0 -2
- package/test/suites/data/12/descr +0 -1
- package/test/suites/data/12/merged +0 -2
- package/test/suites/data/12/other +0 -2
- package/test/suites/data/12/preferred +0 -2
- package/test/suites/data/13/descr +0 -1
- package/test/suites/data/13/merged +0 -3
- package/test/suites/data/13/other +0 -2
- package/test/suites/data/13/preferred +0 -3
- package/test/suites/data/14/descr +0 -1
- package/test/suites/data/14/merged +0 -2
- package/test/suites/data/14/other +0 -2
- package/test/suites/data/14/preferred +0 -2
- package/test/suites/data/15/descr +0 -1
- package/test/suites/data/15/merged +0 -2
- package/test/suites/data/15/other +0 -2
- package/test/suites/data/15/preferred +0 -2
- package/test/suites/data/16/descr +0 -1
- package/test/suites/data/16/merged +0 -2
- package/test/suites/data/16/other +0 -2
- package/test/suites/data/16/preferred +0 -2
- package/test/suites/data/17/descr +0 -1
- package/test/suites/data/17/merged +0 -2
- package/test/suites/data/17/other +0 -2
- package/test/suites/data/17/preferred +0 -2
- package/test/suites/data/18/descr +0 -1
- package/test/suites/data/18/merged +0 -2
- package/test/suites/data/18/other +0 -2
- package/test/suites/data/18/preferred +0 -2
- package/test/suites/data/19/descr +0 -1
- package/test/suites/data/19/merged +0 -2
- package/test/suites/data/19/other +0 -2
- package/test/suites/data/19/preferred +0 -2
- package/test/suites/data/2/merged +0 -3
- package/test/suites/data/2/other +0 -2
- package/test/suites/data/2/preferred +0 -3
- package/test/suites/data/20/descr +0 -1
- package/test/suites/data/20/merged +0 -3
- package/test/suites/data/20/other +0 -2
- package/test/suites/data/20/preferred +0 -2
- package/test/suites/data/21/descr +0 -1
- package/test/suites/data/21/merged +0 -4
- package/test/suites/data/21/other +0 -4
- package/test/suites/data/21/preferred +0 -3
- package/test/suites/data/22/descr +0 -1
- package/test/suites/data/22/merged +0 -10
- package/test/suites/data/22/other +0 -7
- package/test/suites/data/22/preferred +0 -10
- package/test/suites/data/23/descr +0 -1
- package/test/suites/data/23/merged +0 -2
- package/test/suites/data/23/other +0 -2
- package/test/suites/data/23/preferred +0 -2
- package/test/suites/data/24/descr +0 -1
- package/test/suites/data/24/merged +0 -2
- package/test/suites/data/24/other +0 -2
- package/test/suites/data/24/preferred +0 -2
- package/test/suites/data/25/descr +0 -1
- package/test/suites/data/25/merged +0 -2
- package/test/suites/data/25/other +0 -2
- package/test/suites/data/25/preferred +0 -2
- package/test/suites/data/26/descr +0 -1
- package/test/suites/data/26/merged +0 -3
- package/test/suites/data/26/other +0 -3
- package/test/suites/data/26/preferred +0 -3
- package/test/suites/data/27/merged +0 -3
- package/test/suites/data/27/other +0 -2
- package/test/suites/data/27/preferred +0 -2
- package/test/suites/data/28/merged +0 -3
- package/test/suites/data/28/other +0 -2
- package/test/suites/data/28/preferred +0 -2
- package/test/suites/data/29/merged +0 -2
- package/test/suites/data/29/other +0 -2
- package/test/suites/data/29/preferred +0 -2
- package/test/suites/data/3/merged +0 -3
- package/test/suites/data/3/other +0 -3
- package/test/suites/data/3/preferred +0 -3
- package/test/suites/data/30/merged +0 -3
- package/test/suites/data/30/other +0 -2
- package/test/suites/data/30/preferred +0 -2
- package/test/suites/data/31/merged +0 -3
- package/test/suites/data/31/other +0 -2
- package/test/suites/data/31/preferred +0 -3
- package/test/suites/data/32/other +0 -2
- package/test/suites/data/32/preferred +0 -3
- package/test/suites/data/33/merged +0 -2
- package/test/suites/data/33/other +0 -2
- package/test/suites/data/33/preferred +0 -2
- package/test/suites/data/34/merged +0 -2
- package/test/suites/data/34/other +0 -2
- package/test/suites/data/34/preferred +0 -2
- package/test/suites/data/35/merged +0 -2
- package/test/suites/data/35/other +0 -2
- package/test/suites/data/35/preferred +0 -2
- package/test/suites/data/36/merged +0 -2
- package/test/suites/data/36/other +0 -2
- package/test/suites/data/36/preferred +0 -2
- package/test/suites/data/37/merged +0 -3
- package/test/suites/data/37/other +0 -2
- package/test/suites/data/37/preferred +0 -2
- package/test/suites/data/38/merged +0 -3
- package/test/suites/data/38/other +0 -2
- package/test/suites/data/38/preferred +0 -2
- package/test/suites/data/39/merged +0 -2
- package/test/suites/data/39/other +0 -2
- package/test/suites/data/39/preferred +0 -2
- package/test/suites/data/4/descr +0 -1
- package/test/suites/data/4/merged +0 -2
- package/test/suites/data/4/other +0 -2
- package/test/suites/data/4/preferred +0 -2
- package/test/suites/data/40/merged +0 -2
- package/test/suites/data/40/other +0 -2
- package/test/suites/data/40/preferred +0 -2
- package/test/suites/data/41/merged +0 -2
- package/test/suites/data/41/other +0 -2
- package/test/suites/data/41/preferred +0 -2
- package/test/suites/data/42/merged +0 -2
- package/test/suites/data/42/other +0 -2
- package/test/suites/data/42/preferred +0 -2
- package/test/suites/data/43/merged +0 -2
- package/test/suites/data/43/other +0 -2
- package/test/suites/data/43/preferred +0 -2
- package/test/suites/data/44/merged +0 -2
- package/test/suites/data/44/other +0 -2
- package/test/suites/data/44/preferred +0 -2
- package/test/suites/data/45/merged +0 -2
- package/test/suites/data/45/other +0 -2
- package/test/suites/data/45/preferred +0 -2
- package/test/suites/data/46/merged +0 -2
- package/test/suites/data/46/other +0 -2
- package/test/suites/data/46/preferred +0 -2
- package/test/suites/data/47/merged +0 -2
- package/test/suites/data/47/other +0 -2
- package/test/suites/data/47/preferred +0 -2
- package/test/suites/data/48/merged +0 -2
- package/test/suites/data/48/other +0 -2
- package/test/suites/data/48/preferred +0 -2
- package/test/suites/data/49/merged +0 -3
- package/test/suites/data/49/other +0 -2
- package/test/suites/data/49/preferred +0 -2
- package/test/suites/data/5/descr +0 -1
- package/test/suites/data/5/merged +0 -2
- package/test/suites/data/5/other +0 -2
- package/test/suites/data/5/preferred +0 -2
- package/test/suites/data/50/merged +0 -3
- package/test/suites/data/50/other +0 -2
- package/test/suites/data/50/preferred +0 -2
- package/test/suites/data/51/merged +0 -3
- package/test/suites/data/51/other +0 -2
- package/test/suites/data/51/preferred +0 -2
- package/test/suites/data/52/merged +0 -2
- package/test/suites/data/52/other +0 -2
- package/test/suites/data/52/preferred +0 -2
- package/test/suites/data/53/merged +0 -3
- package/test/suites/data/53/other +0 -2
- package/test/suites/data/53/preferred +0 -2
- package/test/suites/data/54/merged +0 -3
- package/test/suites/data/54/other +0 -2
- package/test/suites/data/54/preferred +0 -2
- package/test/suites/data/55/merged +0 -3
- package/test/suites/data/55/other +0 -2
- package/test/suites/data/55/preferred +0 -2
- package/test/suites/data/56/merged +0 -2
- package/test/suites/data/56/other +0 -2
- package/test/suites/data/56/preferred +0 -2
- package/test/suites/data/57/descr +0 -1
- package/test/suites/data/57/merged +0 -4
- package/test/suites/data/57/other +0 -4
- package/test/suites/data/57/preferred +0 -4
- package/test/suites/data/58/descr +0 -1
- package/test/suites/data/58/merged +0 -2
- package/test/suites/data/58/other +0 -2
- package/test/suites/data/58/preferred +0 -2
- package/test/suites/data/59/descr +0 -1
- package/test/suites/data/59/merged +0 -2
- package/test/suites/data/59/other +0 -2
- package/test/suites/data/59/preferred +0 -2
- package/test/suites/data/6/descr +0 -1
- package/test/suites/data/6/merged +0 -2
- package/test/suites/data/6/other +0 -3
- package/test/suites/data/6/preferred +0 -2
- package/test/suites/data/60/descr +0 -1
- package/test/suites/data/60/merged +0 -2
- package/test/suites/data/60/other +0 -2
- package/test/suites/data/60/preferred +0 -2
- package/test/suites/data/61/descr +0 -1
- package/test/suites/data/61/merged +0 -2
- package/test/suites/data/61/other +0 -2
- package/test/suites/data/61/preferred +0 -2
- package/test/suites/data/62/descr +0 -1
- package/test/suites/data/62/merged +0 -3
- package/test/suites/data/62/other +0 -2
- package/test/suites/data/62/preferred +0 -2
- package/test/suites/data/63/descr +0 -1
- package/test/suites/data/63/merged +0 -3
- package/test/suites/data/63/other +0 -2
- package/test/suites/data/63/preferred +0 -2
- package/test/suites/data/64/merged +0 -2
- package/test/suites/data/64/other +0 -2
- package/test/suites/data/64/preferred +0 -2
- package/test/suites/data/65/merged +0 -3
- package/test/suites/data/65/other +0 -2
- package/test/suites/data/65/preferred +0 -2
- package/test/suites/data/66/merged +0 -2
- package/test/suites/data/66/other +0 -2
- package/test/suites/data/66/preferred +0 -2
- package/test/suites/data/67/merged +0 -2
- package/test/suites/data/67/other +0 -2
- package/test/suites/data/67/preferred +0 -2
- package/test/suites/data/68/merged +0 -2
- package/test/suites/data/68/other +0 -2
- package/test/suites/data/68/preferred +0 -2
- package/test/suites/data/69/merged +0 -2
- package/test/suites/data/69/other +0 -2
- package/test/suites/data/69/preferred +0 -2
- package/test/suites/data/7/descr +0 -1
- package/test/suites/data/7/merged +0 -4
- package/test/suites/data/7/other +0 -3
- package/test/suites/data/7/preferred +0 -3
- package/test/suites/data/70/merged +0 -2
- package/test/suites/data/70/other +0 -2
- package/test/suites/data/70/preferred +0 -2
- package/test/suites/data/71/merged +0 -3
- package/test/suites/data/71/other +0 -2
- package/test/suites/data/71/preferred +0 -2
- package/test/suites/data/72/merged +0 -5
- package/test/suites/data/72/other +0 -2
- package/test/suites/data/72/preferred +0 -4
- package/test/suites/data/73/merged +0 -3
- package/test/suites/data/73/other +0 -3
- package/test/suites/data/73/preferred +0 -3
- package/test/suites/data/74/1/merged +0 -3
- package/test/suites/data/74/1/other +0 -3
- package/test/suites/data/74/1/preferred +0 -2
- package/test/suites/data/74/merged +0 -4
- package/test/suites/data/74/other +0 -4
- package/test/suites/data/74/preferred +0 -2
- package/test/suites/data/75/74/1/merged +0 -3
- package/test/suites/data/75/74/1/other +0 -3
- package/test/suites/data/75/74/1/preferred +0 -2
- package/test/suites/data/75/74/merged +0 -4
- package/test/suites/data/75/74/other +0 -4
- package/test/suites/data/75/74/preferred +0 -2
- package/test/suites/data/75/merged +0 -4
- package/test/suites/data/75/other +0 -3
- package/test/suites/data/75/preferred +0 -2
- package/test/suites/data/76/merged +0 -2
- package/test/suites/data/76/other +0 -2
- package/test/suites/data/76/preferred +0 -2
- package/test/suites/data/77/descr +0 -1
- package/test/suites/data/77/merged +0 -2
- package/test/suites/data/77/other +0 -2
- package/test/suites/data/77/preferred +0 -2
- package/test/suites/data/78/merged +0 -3
- package/test/suites/data/78/other +0 -2
- package/test/suites/data/78/preferred +0 -2
- package/test/suites/data/79/merged +0 -2
- package/test/suites/data/79/other +0 -2
- package/test/suites/data/79/preferred +0 -2
- package/test/suites/data/8/descr +0 -1
- package/test/suites/data/8/merged +0 -3
- package/test/suites/data/8/other +0 -3
- package/test/suites/data/8/preferred +0 -3
- package/test/suites/data/80/merged +0 -3
- package/test/suites/data/80/other +0 -2
- package/test/suites/data/80/preferred +0 -2
- package/test/suites/data/81/merged +0 -2
- package/test/suites/data/81/other +0 -2
- package/test/suites/data/81/preferred +0 -2
- package/test/suites/data/82/merged +0 -2
- package/test/suites/data/82/other +0 -2
- package/test/suites/data/82/preferred +0 -2
- package/test/suites/data/83/merged +0 -2
- package/test/suites/data/83/other +0 -2
- package/test/suites/data/83/preferred +0 -1
- package/test/suites/data/84/merged +0 -2
- package/test/suites/data/84/other +0 -2
- package/test/suites/data/84/preferred +0 -1
- package/test/suites/data/85/merged +0 -2
- package/test/suites/data/85/other +0 -2
- package/test/suites/data/85/preferred +0 -2
- package/test/suites/data/86/merged +0 -2
- package/test/suites/data/86/other +0 -2
- package/test/suites/data/86/preferred +0 -1
- package/test/suites/data/87/merged +0 -2
- package/test/suites/data/87/other +0 -2
- package/test/suites/data/87/preferred +0 -1
- package/test/suites/data/88/merged +0 -2
- package/test/suites/data/88/other +0 -2
- package/test/suites/data/88/preferred +0 -1
- package/test/suites/data/9/descr +0 -1
- package/test/suites/data/9/merged +0 -2
- package/test/suites/data/9/other +0 -2
- package/test/suites/data/9/preferred +0 -2
- package/test/test.js +0 -1001
package/package.json
CHANGED
|
@@ -1,59 +1,103 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
2
|
+
"name": "@natlibfi/marc-record-merge",
|
|
3
|
+
"description": "Merge MARC records",
|
|
4
|
+
"author": {
|
|
5
|
+
"name": "The National Library of Finland"
|
|
6
|
+
},
|
|
7
|
+
"keywords": [],
|
|
8
|
+
"homepage": "https://github.com/natlibfi/marc-record-merge-js",
|
|
9
|
+
"bugs": {
|
|
10
|
+
"url": "https://github.com/natlibfi/marc-record-merge-js/issues"
|
|
11
|
+
},
|
|
12
|
+
"repository": {
|
|
13
|
+
"type": "git",
|
|
14
|
+
"url": "git@github.com:natlibfi/marc-record-merge-js.git"
|
|
15
|
+
},
|
|
16
|
+
"license": "MIT",
|
|
17
|
+
"version": "6.0.0-beta.10",
|
|
18
|
+
"main": "./dist/index.js",
|
|
19
|
+
"engines": {
|
|
20
|
+
"node": ">=14"
|
|
21
|
+
},
|
|
22
|
+
"type": "commonjs",
|
|
23
|
+
"scripts": {
|
|
24
|
+
"prepare": "npm run build",
|
|
25
|
+
"prepublishOnly": "npm run build:transpile",
|
|
26
|
+
"lint": "eslint ./src",
|
|
27
|
+
"lint:dev": "eslint ./src --fix",
|
|
28
|
+
"test:base": "cross-env NODE_ENV=test mocha --require @babel/register --reporter-option maxDiffSize=15000 src/reducers/*.spec.js",
|
|
29
|
+
"test": "npm run lint && npm run test:base",
|
|
30
|
+
"test:dev": "npm run lint:dev && npm run coverage",
|
|
31
|
+
"coverage": "npm run coverage:unit && npm run coverage:report",
|
|
32
|
+
"coverage:unit": "nyc --silent npm run test:base",
|
|
33
|
+
"coverage:report": "nyc report",
|
|
34
|
+
"build:transpile": "babel src --copy-files --source-maps --delete-dir-on-start --out-dir=dist",
|
|
35
|
+
"build": "npm run build:transpile",
|
|
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
|
+
},
|
|
39
|
+
"dependencies": {
|
|
40
|
+
"@natlibfi/fixugen": "1.1.0",
|
|
41
|
+
"@natlibfi/fixura": "^2.2.1",
|
|
42
|
+
"@natlibfi/marc-record": "^7.1.0-alpha.2",
|
|
43
|
+
"debug": "^4.3.4",
|
|
44
|
+
"normalize-diacritics": "2.14.0"
|
|
45
|
+
},
|
|
46
|
+
"devDependencies": {
|
|
47
|
+
"@babel/cli": "^7.17.10",
|
|
48
|
+
"@babel/core": "^7.18.5",
|
|
49
|
+
"@babel/eslint-parser": "^7.18.2",
|
|
50
|
+
"@babel/preset-env": "^7.18.2",
|
|
51
|
+
"@babel/register": "^7.17.7",
|
|
52
|
+
"@natlibfi/eslint-config-melinda-backend": "^2.0.0",
|
|
53
|
+
"babel-plugin-istanbul": "^6.1.1",
|
|
54
|
+
"babel-plugin-rewire": "^1.2.0",
|
|
55
|
+
"chai": "^4.3.6",
|
|
56
|
+
"cross-env": "^7.0.3",
|
|
57
|
+
"eslint": "^8.17.0",
|
|
58
|
+
"mocha": "^10.0.0",
|
|
59
|
+
"nodemon": "^2.0.16",
|
|
60
|
+
"nyc": "^15.1.0"
|
|
61
|
+
},
|
|
62
|
+
"eslintConfig": {
|
|
63
|
+
"extends": [
|
|
64
|
+
"@natlibfi/melinda-backend"
|
|
65
|
+
]
|
|
66
|
+
},
|
|
67
|
+
"babel": {
|
|
68
|
+
"presets": [
|
|
69
|
+
[
|
|
70
|
+
"@babel/preset-env",
|
|
71
|
+
{
|
|
72
|
+
"targets": "maintained node versions"
|
|
73
|
+
}
|
|
74
|
+
]
|
|
75
|
+
],
|
|
76
|
+
"env": {
|
|
77
|
+
"test": {
|
|
78
|
+
"plugins": [
|
|
79
|
+
"rewire",
|
|
80
|
+
"istanbul"
|
|
81
|
+
]
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
"nyc": {
|
|
86
|
+
"exclude": [
|
|
87
|
+
"*/*.spec.js",
|
|
88
|
+
"*/**/*.spec.js"
|
|
89
|
+
],
|
|
90
|
+
"reporter": [
|
|
91
|
+
"text"
|
|
92
|
+
],
|
|
93
|
+
"require": [
|
|
94
|
+
"@babel/register"
|
|
95
|
+
],
|
|
96
|
+
"sourceMap": false,
|
|
97
|
+
"instrument": false,
|
|
98
|
+
"lines": 80,
|
|
99
|
+
"statements": 80,
|
|
100
|
+
"functions": 80,
|
|
101
|
+
"branches": 80
|
|
102
|
+
}
|
|
59
103
|
}
|
package/src/index.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import Reducers from './reducers';
|
|
2
|
+
|
|
3
|
+
export {Reducers};
|
|
4
|
+
// export default ({base, source, reducers}) => reducers.reduce((base, reducer) => reducer(base, source), base);
|
|
5
|
+
|
|
6
|
+
// NV: Modified the reducer loop so, that not only base, but also is carried back.
|
|
7
|
+
// However, we try to be backward-compatible: normally after the reducers, only base is returned.
|
|
8
|
+
export default ({base, source, reducers}) => {
|
|
9
|
+
const combo = {base, source}; // eslint-disable-line functional/no-let
|
|
10
|
+
|
|
11
|
+
reducers.reduce((combo, reducer) => {
|
|
12
|
+
combo = singleRound(reducer, combo.base, combo.source); // eslint-disable-line no-param-reassign
|
|
13
|
+
|
|
14
|
+
return combo;
|
|
15
|
+
}, combo);
|
|
16
|
+
|
|
17
|
+
// Hack to make my melinda-marc-record-merge-reducers single tests that expect both
|
|
18
|
+
// base and source to return them both:
|
|
19
|
+
if (reducers.length === 1 && combo.base && combo.source) {
|
|
20
|
+
return combo;
|
|
21
|
+
}
|
|
22
|
+
// All other tests return just base... Backward (compability) it is!
|
|
23
|
+
return combo.base;
|
|
24
|
+
|
|
25
|
+
function singleRound(reducer, base, source) {
|
|
26
|
+
const combo = reducer(base, source);
|
|
27
|
+
if (combo.base !== undefined && combo.source !== undefined) {
|
|
28
|
+
//console.info('NEW STYLE REDUCER RESULT v2'); // eslint-disable-line no-console
|
|
29
|
+
return combo;
|
|
30
|
+
}
|
|
31
|
+
//console.info('OLD SCHOOL REDUCER RESULT v2'); // eslint-disable-line no-console
|
|
32
|
+
return {base: combo.base, source};
|
|
33
|
+
}
|
|
34
|
+
};
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
/* eslint-disable max-statements */
|
|
2
|
+
/* eslint-disable no-unused-vars */
|
|
3
|
+
|
|
4
|
+
import {MarcRecord} from '@natlibfi/marc-record';
|
|
5
|
+
import createDebugLogger from 'debug';
|
|
6
|
+
|
|
7
|
+
export default ({
|
|
8
|
+
tagPattern,
|
|
9
|
+
compareTagsOnly = false,
|
|
10
|
+
compareWithoutTag = false,
|
|
11
|
+
compareWithoutIndicators = false,
|
|
12
|
+
compareWithoutIndicator1 = false,
|
|
13
|
+
compareWithoutIndicator2 = false,
|
|
14
|
+
subfieldsMustBeIdentical = true,
|
|
15
|
+
excludeSubfields = [],
|
|
16
|
+
dropSubfields = [],
|
|
17
|
+
copyUnless = [],
|
|
18
|
+
baseValidators = {subfieldValues: false},
|
|
19
|
+
sourceValidators = {subfieldValues: false},
|
|
20
|
+
swapTag = [],
|
|
21
|
+
swapSubfieldCode = [],
|
|
22
|
+
doNotCopyIfFieldPresent = false
|
|
23
|
+
}) => (base, source) => {
|
|
24
|
+
const baseRecord = new MarcRecord(base, baseValidators);
|
|
25
|
+
const sourceRecord = new MarcRecord(source, sourceValidators);
|
|
26
|
+
|
|
27
|
+
const debug = createDebugLogger('@natlibfi/marc-record-merge');
|
|
28
|
+
const debugOptions = createDebugLogger('@natlibfi/marc-record-merge:compare-options');
|
|
29
|
+
const debugCompare = createDebugLogger('@natlibfi/marc-record-merge:compare');
|
|
30
|
+
|
|
31
|
+
const ignoreInd1 = compareWithoutIndicators || compareWithoutIndicator1;
|
|
32
|
+
const ignoreInd2 = compareWithoutIndicators || compareWithoutIndicator2;
|
|
33
|
+
|
|
34
|
+
debugOptions(`Tag Pattern: ${tagPattern}`);
|
|
35
|
+
debugOptions(`Compare tags only: ${compareTagsOnly}`);
|
|
36
|
+
debugOptions(`Omit indicator 1 from comparison: ${ignoreInd1}`);
|
|
37
|
+
debugOptions(`Omit indicator 2 from comparison: ${ignoreInd2}`);
|
|
38
|
+
debugOptions(`Copy if identical: ${subfieldsMustBeIdentical}`);
|
|
39
|
+
debugOptions(`Exclude subfields: [${excludeSubfields}]`);
|
|
40
|
+
debugOptions(`Drop subfields [${dropSubfields}]`);
|
|
41
|
+
debugOptions(`Copy unless contains subfields: ${JSON.stringify(copyUnless)}`);
|
|
42
|
+
|
|
43
|
+
const baseFields = baseRecord.get(tagPattern);
|
|
44
|
+
const sourceFields = sourceRecord.get(tagPattern);
|
|
45
|
+
const doNotCopy = doNotCopyIfFieldPresent ? baseRecord.get(doNotCopyIfFieldPresent).length > 0 : false;
|
|
46
|
+
|
|
47
|
+
if (doNotCopy) {
|
|
48
|
+
return baseRecord.toObject();
|
|
49
|
+
}
|
|
50
|
+
debug(`FFS: ${compareWithoutIndicator1}, ${compareWithoutIndicators}, ${ignoreInd1}`);
|
|
51
|
+
debug(`Base fields: `, baseFields);
|
|
52
|
+
debug(`Source fields: `, sourceFields);
|
|
53
|
+
|
|
54
|
+
// Logic steps
|
|
55
|
+
const baseCompareFields = baseFields.map(baseField => createCompareField(baseField));
|
|
56
|
+
const compareResultFields = compareFields(sourceFields, baseCompareFields);
|
|
57
|
+
const droppedUnwantedSubfield = checkDropSubfields(compareResultFields);
|
|
58
|
+
const droppedUnwantedFields = checkCopyUnlessFields(droppedUnwantedSubfield);
|
|
59
|
+
const swappedSubfields = checkSwapSubfieldCodes(droppedUnwantedFields);
|
|
60
|
+
const swappedTags = checkSwapTag(swappedSubfields);
|
|
61
|
+
const uniqueFields = [...new Set(swappedTags.map(field => JSON.stringify(field)))].map(field => JSON.parse(field));
|
|
62
|
+
debug('Fields to be copied');
|
|
63
|
+
debug(JSON.stringify(uniqueFields));
|
|
64
|
+
|
|
65
|
+
// Add fields to base;
|
|
66
|
+
uniqueFields.forEach(field => baseRecord.insertField(field));
|
|
67
|
+
return baseRecord.toObject();
|
|
68
|
+
|
|
69
|
+
function compareFields(sourceFields, baseCompareFields, uniqFields = []) {
|
|
70
|
+
const [sourceField, ...rest] = sourceFields;
|
|
71
|
+
if (sourceField === undefined) {
|
|
72
|
+
return uniqFields;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
if (baseCompareFields.length === 0) {
|
|
76
|
+
return compareFields(rest, baseCompareFields, [...uniqFields, sourceField]);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Source and base are also compared for identicalness
|
|
80
|
+
// Non-identical fields are copied from source to base as duplicates
|
|
81
|
+
const sourceCompareField = createCompareField(sourceField);
|
|
82
|
+
const unique = checkCompareFields(baseCompareFields, sourceCompareField);
|
|
83
|
+
|
|
84
|
+
debugCompare(`${JSON.stringify(sourceField)} ${unique ? 'is UNIQUE' : 'not UNIQUE'}`);
|
|
85
|
+
|
|
86
|
+
if (unique) {
|
|
87
|
+
return compareFields(rest, baseCompareFields, [...uniqFields, sourceField]);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
return compareFields(rest, baseCompareFields, uniqFields);
|
|
91
|
+
|
|
92
|
+
function checkCompareFields(baseCompareFields, sourceCompareField) {
|
|
93
|
+
let unique = true; // eslint-disable-line functional/no-let
|
|
94
|
+
|
|
95
|
+
baseCompareFields.forEach(baseCompareField => {
|
|
96
|
+
debugCompare(`Comparing ${JSON.stringify(sourceCompareField)} to ${JSON.stringify(baseCompareField)}}`);
|
|
97
|
+
|
|
98
|
+
if (sourceCompareField.value !== baseCompareField.value) {
|
|
99
|
+
debugCompare(`Value is different ${sourceCompareField.value} !== ${baseCompareField.value}`);
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
if (sourceCompareField.ind1 !== baseCompareField.ind1) {
|
|
104
|
+
debugCompare(`Ind1 is different ${sourceCompareField.ind1} !== ${baseCompareField.ind1}`);
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
if (sourceCompareField.ind2 !== baseCompareField.ind2) {
|
|
109
|
+
debugCompare(`Ind2 is different ${sourceCompareField.ind2} !== ${baseCompareField.ind2}`);
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
if ('subfields' in sourceCompareField) {
|
|
114
|
+
const allFound = checkSubfields(sourceCompareField.subfields, baseCompareField.subfields);
|
|
115
|
+
debugCompare(`Subfields are different ${!allFound}`);
|
|
116
|
+
if (!allFound) {
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
unique = false;
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
unique = false;
|
|
125
|
+
return;
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
return unique;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function checkSubfields(sourceSubfields, baseSubfields) {
|
|
132
|
+
const foundSubs = sourceSubfields.filter(sSub => baseSubfields.some(bSub => sSub.code === bSub.code && sSub.value === bSub.value));
|
|
133
|
+
|
|
134
|
+
if (subfieldsMustBeIdentical) {
|
|
135
|
+
return foundSubs.length === sourceSubfields.length && foundSubs.length === baseSubfields.length;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
return foundSubs.length === sourceSubfields.length;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// compare objects have only fields that matter in comparison
|
|
143
|
+
function createCompareField(field) {
|
|
144
|
+
if (compareTagsOnly) {
|
|
145
|
+
return {tag: field.tag};
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
if ('value' in field) {
|
|
149
|
+
return {tag: field.tag, value: field.value};
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
const [filteredField] = checkDropSubfields([field]);
|
|
153
|
+
const [foundRule] = swapTag.filter(rule => new RegExp(rule.from, 'u').test(field.tag));
|
|
154
|
+
const replacementTag = foundRule ? foundRule.to : undefined;
|
|
155
|
+
|
|
156
|
+
const params = [
|
|
157
|
+
{name: 'tag', value: compareWithoutTag ? replacementTag : field.tag},
|
|
158
|
+
{name: 'ind1', value: ignoreInd1 ? undefined : field.ind1},
|
|
159
|
+
{name: 'ind2', value: ignoreInd2 ? undefined : field.ind2},
|
|
160
|
+
{name: 'subfields', value: createCompareSubfields(filteredField.subfields)}
|
|
161
|
+
].map(param => [param.name, param.value]);
|
|
162
|
+
|
|
163
|
+
return Object.fromEntries(params);
|
|
164
|
+
|
|
165
|
+
function createCompareSubfields(subfields) {
|
|
166
|
+
const nonExcludedSubfields = subfields.filter(sub => !excludeSubfields.some(code => code === sub.code));
|
|
167
|
+
const normalizedSubfields = nonExcludedSubfields.map(sub => ({code: sub.code, value: normalizeSubfieldValue(sub.value)}));
|
|
168
|
+
|
|
169
|
+
return normalizedSubfields;
|
|
170
|
+
|
|
171
|
+
function normalizeSubfieldValue(value) {
|
|
172
|
+
return value.toLowerCase().replace(/\s+/ug, '');
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
function checkSwapTag(fields) {
|
|
178
|
+
if (swapTag.length > 0) {
|
|
179
|
+
return fields.map(field => ({...field, tag: swapTagsFunc(field.tag)}));
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
return fields;
|
|
183
|
+
|
|
184
|
+
function swapTagsFunc(tag) {
|
|
185
|
+
const [foundRule] = swapTag.filter(rule => new RegExp(rule.from, 'u').test(tag));
|
|
186
|
+
|
|
187
|
+
if (foundRule === undefined) {
|
|
188
|
+
return tag;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
return foundRule.to;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
function checkSwapSubfieldCodes(fields) {
|
|
196
|
+
if (swapSubfieldCode.length > 0) {
|
|
197
|
+
return fields.map(field => ({...field, subfields: swapSubfieldCodesFunc(field.subfields)}));
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
return fields;
|
|
201
|
+
|
|
202
|
+
function swapSubfieldCodesFunc(subfields) {
|
|
203
|
+
return subfields.map(sub => {
|
|
204
|
+
const [foundRule] = swapSubfieldCode.filter(rule => rule.from === sub.code);
|
|
205
|
+
|
|
206
|
+
if (foundRule === undefined) {
|
|
207
|
+
return sub;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
return {code: foundRule.to, value: sub.value};
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
function checkDropSubfields(fields) {
|
|
216
|
+
if (dropSubfields.length > 0) {
|
|
217
|
+
return fields.map(field => ({...field, subfields: dropSubfieldsFunc(field.subfields)}))
|
|
218
|
+
.filter(field => field.subfields.length > 0);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
return fields;
|
|
222
|
+
|
|
223
|
+
function dropSubfieldsFunc(subfields) {
|
|
224
|
+
return subfields.filter(sub => { // eslint-disable-line
|
|
225
|
+
return !dropSubfields.some(({code, value = false, condition = false}) => {
|
|
226
|
+
if (code !== sub.code) {
|
|
227
|
+
return false;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
if (!condition && value) {
|
|
231
|
+
return value === sub.value;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
if (condition === 'unless' && value) {
|
|
235
|
+
return !new RegExp(value, 'u').test(sub.value);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
return true;
|
|
239
|
+
});
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
function checkCopyUnlessFields(fields) {
|
|
245
|
+
if (copyUnless.length > 0) {
|
|
246
|
+
return fields.filter(({subfields}) => copyUnless.some(filter => !subfields.some(sub => sub.code === filter.code && new RegExp(filter.value, 'u').test(sub.value))));
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
return fields;
|
|
250
|
+
}
|
|
251
|
+
};
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import {expect} from 'chai';
|
|
2
|
+
import {READERS} from '@natlibfi/fixura';
|
|
3
|
+
import createReducer from './copy';
|
|
4
|
+
import generateTests from '@natlibfi/fixugen';
|
|
5
|
+
|
|
6
|
+
//import createDebugLogger from 'debug'; // <---
|
|
7
|
+
//const debug = createDebugLogger('@natlibfi/marc-record-merge/copy.spec.js'); // <---
|
|
8
|
+
|
|
9
|
+
generateTests({
|
|
10
|
+
callback,
|
|
11
|
+
path: [__dirname, '..', '..', 'test-fixtures', 'reducers', 'copy'],
|
|
12
|
+
useMetadataFile: true,
|
|
13
|
+
recurse: true,
|
|
14
|
+
fixura: {
|
|
15
|
+
reader: READERS.JSON,
|
|
16
|
+
failWhenNotFound: false
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
function callback({
|
|
21
|
+
getFixture,
|
|
22
|
+
tagPatternRegExp,
|
|
23
|
+
compareTagsOnly = false,
|
|
24
|
+
compareWithoutTag = false,
|
|
25
|
+
compareWithoutIndicators = false,
|
|
26
|
+
compareWithoutIndicator1 = false,
|
|
27
|
+
compareWithoutIndicator2 = false,
|
|
28
|
+
subfieldsMustBeIdentical = false,
|
|
29
|
+
copyUnless = undefined,
|
|
30
|
+
excludeSubfields = undefined,
|
|
31
|
+
dropSubfields = undefined,
|
|
32
|
+
swapSubfieldCode = [],
|
|
33
|
+
swapTag = [],
|
|
34
|
+
doNotCopyIfFieldPresent = false
|
|
35
|
+
}) {
|
|
36
|
+
const base = getFixture('base.json');
|
|
37
|
+
const source = getFixture('source.json');
|
|
38
|
+
const tagPattern = new RegExp(tagPatternRegExp, 'u');
|
|
39
|
+
const expectedRecord = getFixture('merged.json');
|
|
40
|
+
|
|
41
|
+
const merged = createReducer({
|
|
42
|
+
tagPattern, compareTagsOnly, compareWithoutTag, compareWithoutIndicators, compareWithoutIndicator1, compareWithoutIndicator2,
|
|
43
|
+
copyUnless, subfieldsMustBeIdentical, excludeSubfields,
|
|
44
|
+
dropSubfields, swapSubfieldCode, swapTag,
|
|
45
|
+
doNotCopyIfFieldPresent
|
|
46
|
+
})(base, source);
|
|
47
|
+
//debug(`*** mergedRecord: `, mergedRecord); //<--
|
|
48
|
+
//debug(`*** mergedRecord,Strfy: `, JSON.stringify(mergedRecord)); //<--
|
|
49
|
+
//debug(`*** expectedRecord: `, expectedRecord); //<--
|
|
50
|
+
//debug(`*** expectedRecord,Strfy: `, JSON.stringify(expectedRecord)); //<--
|
|
51
|
+
expect(merged.constructor.name).not.to.eql('MarcRecord');
|
|
52
|
+
expect(merged.constructor.name).to.eql('Object');
|
|
53
|
+
expect(merged).to.eql(expectedRecord);
|
|
54
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import {normalizeSync} from 'normalize-diacritics';
|
|
2
|
+
import createDebugLogger from 'debug';
|
|
3
|
+
import {MarcRecord} from '@natlibfi/marc-record';
|
|
4
|
+
|
|
5
|
+
export function strictEquality(subfieldA, subfieldB) {
|
|
6
|
+
return subfieldA.code === subfieldB.code &&
|
|
7
|
+
subfieldA.value === subfieldB.value;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export function subsetEquality(subfieldA, subfieldB) {
|
|
11
|
+
return subfieldA.code === subfieldB.code &&
|
|
12
|
+
(subfieldA.value.indexOf(subfieldB.value) !== -1 || subfieldB.value.indexOf(subfieldA.value) !== -1);
|
|
13
|
+
}
|
|
14
|
+
// EqualityFunction can be either strictEquality or subsetEquality
|
|
15
|
+
export default ({tagPattern, equalityFunction = strictEquality}) => (base, source) => {
|
|
16
|
+
const debug = createDebugLogger('@natlibfi/marc-record-merge:select');
|
|
17
|
+
const baseRecord = new MarcRecord(base, {subfieldValues: false});
|
|
18
|
+
const sourceRecord = new MarcRecord(source, {subfieldValues: false});
|
|
19
|
+
const baseFields = baseRecord.get(tagPattern);
|
|
20
|
+
const sourceFields = sourceRecord.get(tagPattern);
|
|
21
|
+
const fieldTag = sourceFields.map(field => field.tag);
|
|
22
|
+
debug(`Comparing field ${fieldTag}`);
|
|
23
|
+
|
|
24
|
+
checkFieldType(baseFields);
|
|
25
|
+
checkFieldType(sourceFields);
|
|
26
|
+
|
|
27
|
+
if (baseFields.length > 1 || sourceFields.length > 1) {
|
|
28
|
+
debug(`Multiple fields in base or source`);
|
|
29
|
+
debug(`No changes to base`);
|
|
30
|
+
return base;
|
|
31
|
+
}
|
|
32
|
+
const [baseField] = baseFields;
|
|
33
|
+
const [sourceField] = sourceFields;
|
|
34
|
+
|
|
35
|
+
if (baseField.tag === sourceField.tag === false) {
|
|
36
|
+
debug(`Base tag ${baseField.tag} is not equal to source tag ${sourceField.tag}`);
|
|
37
|
+
debug(`No changes to base`);
|
|
38
|
+
return base;
|
|
39
|
+
}
|
|
40
|
+
const baseSubs = baseField.subfields;
|
|
41
|
+
const sourceSubs = sourceField.subfields;
|
|
42
|
+
|
|
43
|
+
const baseSubsNormalized = baseSubs
|
|
44
|
+
.map(({code, value}) => ({code, value: normalizeSubfieldValue(value)}));
|
|
45
|
+
|
|
46
|
+
const sourceSubsNormalized = sourceSubs
|
|
47
|
+
.map(({code, value}) => ({code, value: normalizeSubfieldValue(value)}));
|
|
48
|
+
|
|
49
|
+
// Returns the base subfields for which a matching source subfield is found
|
|
50
|
+
const equalSubfieldsBase = baseSubsNormalized
|
|
51
|
+
.filter(baseSubfield => sourceSubsNormalized
|
|
52
|
+
.some(sourceSubfield => equalityFunction(baseSubfield, sourceSubfield)));
|
|
53
|
+
debug(`equalSubfieldsBase: ${JSON.stringify(equalSubfieldsBase, undefined, 2)}`);
|
|
54
|
+
|
|
55
|
+
// Returns the source subfields for which a matching base subfield is found
|
|
56
|
+
const equalSubfieldsSource = sourceSubsNormalized
|
|
57
|
+
.filter(sourceSubfield => baseSubsNormalized
|
|
58
|
+
.some(baseSubfield => equalityFunction(sourceSubfield, baseSubfield)));
|
|
59
|
+
debug(`equalSubfieldsSource: ${JSON.stringify(equalSubfieldsSource, undefined, 2)}`);
|
|
60
|
+
|
|
61
|
+
if (baseSubs.length === sourceSubs.length && equalSubfieldsBase.length < baseSubs.length) {
|
|
62
|
+
debug(`Base and source subfields are not equal`);
|
|
63
|
+
debug(`No changes to base`);
|
|
64
|
+
return base;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
if (baseSubs.length === sourceSubs.length && equalSubfieldsBase.length === equalSubfieldsSource.length) {
|
|
68
|
+
debug(`Checking subfield equality`);
|
|
69
|
+
const totalSubfieldLengthBase = baseSubsNormalized
|
|
70
|
+
.map(({value}) => value.length)
|
|
71
|
+
.reduce((acc, value) => acc + value);
|
|
72
|
+
const totalSubfieldLengthSource = sourceSubsNormalized
|
|
73
|
+
.map(({value}) => value.length)
|
|
74
|
+
.reduce((acc, value) => acc + value);
|
|
75
|
+
|
|
76
|
+
if (totalSubfieldLengthSource > totalSubfieldLengthBase) {
|
|
77
|
+
return replaceBasefieldWithSourcefield(base);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
if (sourceSubs.length > baseSubs.length && equalSubfieldsBase.length === baseSubs.length) {
|
|
82
|
+
return replaceBasefieldWithSourcefield(base);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
debug(`No changes to base`);
|
|
86
|
+
return base;
|
|
87
|
+
|
|
88
|
+
function replaceBasefieldWithSourcefield(base) {
|
|
89
|
+
const index = base.fields.findIndex(field => field === baseField);
|
|
90
|
+
base.fields.splice(index, 1, sourceField); // eslint-disable-line functional/immutable-data
|
|
91
|
+
debug(`Source field is longer, replacing base with source`);
|
|
92
|
+
return base;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function checkFieldType(fields) {
|
|
96
|
+
const checkedFields = fields.map(field => {
|
|
97
|
+
if ('value' in field) { // eslint-disable-line functional/no-conditional-statement
|
|
98
|
+
throw new Error('Invalid control field, expected data field');
|
|
99
|
+
}
|
|
100
|
+
return field;
|
|
101
|
+
});
|
|
102
|
+
return checkedFields;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function normalizeSubfieldValue(value) {
|
|
106
|
+
// Regexp options: g: global search, u: unicode
|
|
107
|
+
const punctuation = /[.,\-/#!?$%^&*;:{}=_`~()[\]]/gu;
|
|
108
|
+
return normalizeSync(value).toLowerCase().replace(punctuation, '', 'u').replace(/\s+/gu, ' ').trim();
|
|
109
|
+
}
|
|
110
|
+
};
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import {expect} from 'chai';
|
|
2
|
+
import {MarcRecord} from '@natlibfi/marc-record';
|
|
3
|
+
import createReducer, {subsetEquality} from './select';
|
|
4
|
+
import {READERS} from '@natlibfi/fixura';
|
|
5
|
+
import generateTests from '@natlibfi/fixugen';
|
|
6
|
+
|
|
7
|
+
MarcRecord.setValidationOptions({subfieldValues: false});
|
|
8
|
+
|
|
9
|
+
generateTests({
|
|
10
|
+
callback,
|
|
11
|
+
path: [__dirname, '..', '..', 'test-fixtures', 'reducers', 'select'],
|
|
12
|
+
useMetadataFile: true,
|
|
13
|
+
recurse: false,
|
|
14
|
+
fixura: {
|
|
15
|
+
reader: READERS.JSON,
|
|
16
|
+
failWhenNotFound: false
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
function callback({
|
|
21
|
+
getFixture,
|
|
22
|
+
disabled = false,
|
|
23
|
+
tagPatternRegExp = false,
|
|
24
|
+
expectedError = false,
|
|
25
|
+
useSubsetEquality = false
|
|
26
|
+
}) {
|
|
27
|
+
if (disabled) {
|
|
28
|
+
console.log('TEST DISABLED!'); // eslint-disable-line no-console
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
// const base = new MarcRecord(getFixture('base.json'), {subfieldValues: false});
|
|
32
|
+
// const source = new MarcRecord(getFixture('source.json'), {subfieldValues: false});
|
|
33
|
+
|
|
34
|
+
const base = getFixture('base.json');
|
|
35
|
+
const source = getFixture('source.json');
|
|
36
|
+
|
|
37
|
+
const tagPattern = new RegExp(tagPatternRegExp, 'u');
|
|
38
|
+
const expectedRecord = getFixture('merged.json');
|
|
39
|
+
const equalityFunction = useSubsetEquality ? subsetEquality : undefined;
|
|
40
|
+
|
|
41
|
+
// Bypass expected error in testing
|
|
42
|
+
if (expectedError) {
|
|
43
|
+
expect(() => createReducer.to.throw(Error, 'control field'));
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const mergedRecord = createReducer({tagPattern, equalityFunction})(base, source);
|
|
48
|
+
expect(mergedRecord).to.eql(expectedRecord);
|
|
49
|
+
}
|