@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
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _marcRecord = require("@natlibfi/marc-record");
|
|
8
|
+
var _debug = _interopRequireDefault(require("debug"));
|
|
9
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
10
|
+
/* eslint-disable max-statements */
|
|
11
|
+
/* eslint-disable no-unused-vars */
|
|
12
|
+
var _default = ({
|
|
13
|
+
tagPattern,
|
|
14
|
+
compareTagsOnly = false,
|
|
15
|
+
compareWithoutTag = false,
|
|
16
|
+
compareWithoutIndicators = false,
|
|
17
|
+
compareWithoutIndicator1 = false,
|
|
18
|
+
compareWithoutIndicator2 = false,
|
|
19
|
+
subfieldsMustBeIdentical = true,
|
|
20
|
+
excludeSubfields = [],
|
|
21
|
+
dropSubfields = [],
|
|
22
|
+
copyUnless = [],
|
|
23
|
+
baseValidators = {
|
|
24
|
+
subfieldValues: false
|
|
25
|
+
},
|
|
26
|
+
sourceValidators = {
|
|
27
|
+
subfieldValues: false
|
|
28
|
+
},
|
|
29
|
+
swapTag = [],
|
|
30
|
+
swapSubfieldCode = [],
|
|
31
|
+
doNotCopyIfFieldPresent = false
|
|
32
|
+
}) => (base, source) => {
|
|
33
|
+
const baseRecord = new _marcRecord.MarcRecord(base, baseValidators);
|
|
34
|
+
const sourceRecord = new _marcRecord.MarcRecord(source, sourceValidators);
|
|
35
|
+
const debug = (0, _debug.default)('@natlibfi/marc-record-merge');
|
|
36
|
+
const debugOptions = (0, _debug.default)('@natlibfi/marc-record-merge:compare-options');
|
|
37
|
+
const debugCompare = (0, _debug.default)('@natlibfi/marc-record-merge:compare');
|
|
38
|
+
const ignoreInd1 = compareWithoutIndicators || compareWithoutIndicator1;
|
|
39
|
+
const ignoreInd2 = compareWithoutIndicators || compareWithoutIndicator2;
|
|
40
|
+
debugOptions(`Tag Pattern: ${tagPattern}`);
|
|
41
|
+
debugOptions(`Compare tags only: ${compareTagsOnly}`);
|
|
42
|
+
debugOptions(`Omit indicator 1 from comparison: ${ignoreInd1}`);
|
|
43
|
+
debugOptions(`Omit indicator 2 from comparison: ${ignoreInd2}`);
|
|
44
|
+
debugOptions(`Copy if identical: ${subfieldsMustBeIdentical}`);
|
|
45
|
+
debugOptions(`Exclude subfields: [${excludeSubfields}]`);
|
|
46
|
+
debugOptions(`Drop subfields [${dropSubfields}]`);
|
|
47
|
+
debugOptions(`Copy unless contains subfields: ${JSON.stringify(copyUnless)}`);
|
|
48
|
+
const baseFields = baseRecord.get(tagPattern);
|
|
49
|
+
const sourceFields = sourceRecord.get(tagPattern);
|
|
50
|
+
const doNotCopy = doNotCopyIfFieldPresent ? baseRecord.get(doNotCopyIfFieldPresent).length > 0 : false;
|
|
51
|
+
if (doNotCopy) {
|
|
52
|
+
return baseRecord.toObject();
|
|
53
|
+
}
|
|
54
|
+
debug(`FFS: ${compareWithoutIndicator1}, ${compareWithoutIndicators}, ${ignoreInd1}`);
|
|
55
|
+
debug(`Base fields: `, baseFields);
|
|
56
|
+
debug(`Source fields: `, sourceFields);
|
|
57
|
+
|
|
58
|
+
// Logic steps
|
|
59
|
+
const baseCompareFields = baseFields.map(baseField => createCompareField(baseField));
|
|
60
|
+
const compareResultFields = compareFields(sourceFields, baseCompareFields);
|
|
61
|
+
const droppedUnwantedSubfield = checkDropSubfields(compareResultFields);
|
|
62
|
+
const droppedUnwantedFields = checkCopyUnlessFields(droppedUnwantedSubfield);
|
|
63
|
+
const swappedSubfields = checkSwapSubfieldCodes(droppedUnwantedFields);
|
|
64
|
+
const swappedTags = checkSwapTag(swappedSubfields);
|
|
65
|
+
const uniqueFields = [...new Set(swappedTags.map(field => JSON.stringify(field)))].map(field => JSON.parse(field));
|
|
66
|
+
debug('Fields to be copied');
|
|
67
|
+
debug(JSON.stringify(uniqueFields));
|
|
68
|
+
|
|
69
|
+
// Add fields to base;
|
|
70
|
+
uniqueFields.forEach(field => baseRecord.insertField(field));
|
|
71
|
+
return baseRecord.toObject();
|
|
72
|
+
function compareFields(sourceFields, baseCompareFields, uniqFields = []) {
|
|
73
|
+
const [sourceField, ...rest] = sourceFields;
|
|
74
|
+
if (sourceField === undefined) {
|
|
75
|
+
return uniqFields;
|
|
76
|
+
}
|
|
77
|
+
if (baseCompareFields.length === 0) {
|
|
78
|
+
return compareFields(rest, baseCompareFields, [...uniqFields, sourceField]);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Source and base are also compared for identicalness
|
|
82
|
+
// Non-identical fields are copied from source to base as duplicates
|
|
83
|
+
const sourceCompareField = createCompareField(sourceField);
|
|
84
|
+
const unique = checkCompareFields(baseCompareFields, sourceCompareField);
|
|
85
|
+
debugCompare(`${JSON.stringify(sourceField)} ${unique ? 'is UNIQUE' : 'not UNIQUE'}`);
|
|
86
|
+
if (unique) {
|
|
87
|
+
return compareFields(rest, baseCompareFields, [...uniqFields, sourceField]);
|
|
88
|
+
}
|
|
89
|
+
return compareFields(rest, baseCompareFields, uniqFields);
|
|
90
|
+
function checkCompareFields(baseCompareFields, sourceCompareField) {
|
|
91
|
+
let unique = true; // eslint-disable-line functional/no-let
|
|
92
|
+
|
|
93
|
+
baseCompareFields.forEach(baseCompareField => {
|
|
94
|
+
debugCompare(`Comparing ${JSON.stringify(sourceCompareField)} to ${JSON.stringify(baseCompareField)}}`);
|
|
95
|
+
if (sourceCompareField.value !== baseCompareField.value) {
|
|
96
|
+
debugCompare(`Value is different ${sourceCompareField.value} !== ${baseCompareField.value}`);
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
if (sourceCompareField.ind1 !== baseCompareField.ind1) {
|
|
100
|
+
debugCompare(`Ind1 is different ${sourceCompareField.ind1} !== ${baseCompareField.ind1}`);
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
if (sourceCompareField.ind2 !== baseCompareField.ind2) {
|
|
104
|
+
debugCompare(`Ind2 is different ${sourceCompareField.ind2} !== ${baseCompareField.ind2}`);
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
if ('subfields' in sourceCompareField) {
|
|
108
|
+
const allFound = checkSubfields(sourceCompareField.subfields, baseCompareField.subfields);
|
|
109
|
+
debugCompare(`Subfields are different ${!allFound}`);
|
|
110
|
+
if (!allFound) {
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
unique = false;
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
unique = false;
|
|
117
|
+
return;
|
|
118
|
+
});
|
|
119
|
+
return unique;
|
|
120
|
+
}
|
|
121
|
+
function checkSubfields(sourceSubfields, baseSubfields) {
|
|
122
|
+
const foundSubs = sourceSubfields.filter(sSub => baseSubfields.some(bSub => sSub.code === bSub.code && sSub.value === bSub.value));
|
|
123
|
+
if (subfieldsMustBeIdentical) {
|
|
124
|
+
return foundSubs.length === sourceSubfields.length && foundSubs.length === baseSubfields.length;
|
|
125
|
+
}
|
|
126
|
+
return foundSubs.length === sourceSubfields.length;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// compare objects have only fields that matter in comparison
|
|
131
|
+
function createCompareField(field) {
|
|
132
|
+
if (compareTagsOnly) {
|
|
133
|
+
return {
|
|
134
|
+
tag: field.tag
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
if ('value' in field) {
|
|
138
|
+
return {
|
|
139
|
+
tag: field.tag,
|
|
140
|
+
value: field.value
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
const [filteredField] = checkDropSubfields([field]);
|
|
144
|
+
const [foundRule] = swapTag.filter(rule => new RegExp(rule.from, 'u').test(field.tag));
|
|
145
|
+
const replacementTag = foundRule ? foundRule.to : undefined;
|
|
146
|
+
const params = [{
|
|
147
|
+
name: 'tag',
|
|
148
|
+
value: compareWithoutTag ? replacementTag : field.tag
|
|
149
|
+
}, {
|
|
150
|
+
name: 'ind1',
|
|
151
|
+
value: ignoreInd1 ? undefined : field.ind1
|
|
152
|
+
}, {
|
|
153
|
+
name: 'ind2',
|
|
154
|
+
value: ignoreInd2 ? undefined : field.ind2
|
|
155
|
+
}, {
|
|
156
|
+
name: 'subfields',
|
|
157
|
+
value: createCompareSubfields(filteredField.subfields)
|
|
158
|
+
}].map(param => [param.name, param.value]);
|
|
159
|
+
return Object.fromEntries(params);
|
|
160
|
+
function createCompareSubfields(subfields) {
|
|
161
|
+
const nonExcludedSubfields = subfields.filter(sub => !excludeSubfields.some(code => code === sub.code));
|
|
162
|
+
const normalizedSubfields = nonExcludedSubfields.map(sub => ({
|
|
163
|
+
code: sub.code,
|
|
164
|
+
value: normalizeSubfieldValue(sub.value)
|
|
165
|
+
}));
|
|
166
|
+
return normalizedSubfields;
|
|
167
|
+
function normalizeSubfieldValue(value) {
|
|
168
|
+
return value.toLowerCase().replace(/\s+/ug, '');
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
function checkSwapTag(fields) {
|
|
173
|
+
if (swapTag.length > 0) {
|
|
174
|
+
return fields.map(field => ({
|
|
175
|
+
...field,
|
|
176
|
+
tag: swapTagsFunc(field.tag)
|
|
177
|
+
}));
|
|
178
|
+
}
|
|
179
|
+
return fields;
|
|
180
|
+
function swapTagsFunc(tag) {
|
|
181
|
+
const [foundRule] = swapTag.filter(rule => new RegExp(rule.from, 'u').test(tag));
|
|
182
|
+
if (foundRule === undefined) {
|
|
183
|
+
return tag;
|
|
184
|
+
}
|
|
185
|
+
return foundRule.to;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
function checkSwapSubfieldCodes(fields) {
|
|
189
|
+
if (swapSubfieldCode.length > 0) {
|
|
190
|
+
return fields.map(field => ({
|
|
191
|
+
...field,
|
|
192
|
+
subfields: swapSubfieldCodesFunc(field.subfields)
|
|
193
|
+
}));
|
|
194
|
+
}
|
|
195
|
+
return fields;
|
|
196
|
+
function swapSubfieldCodesFunc(subfields) {
|
|
197
|
+
return subfields.map(sub => {
|
|
198
|
+
const [foundRule] = swapSubfieldCode.filter(rule => rule.from === sub.code);
|
|
199
|
+
if (foundRule === undefined) {
|
|
200
|
+
return sub;
|
|
201
|
+
}
|
|
202
|
+
return {
|
|
203
|
+
code: foundRule.to,
|
|
204
|
+
value: sub.value
|
|
205
|
+
};
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
function checkDropSubfields(fields) {
|
|
210
|
+
if (dropSubfields.length > 0) {
|
|
211
|
+
return fields.map(field => ({
|
|
212
|
+
...field,
|
|
213
|
+
subfields: dropSubfieldsFunc(field.subfields)
|
|
214
|
+
})).filter(field => field.subfields.length > 0);
|
|
215
|
+
}
|
|
216
|
+
return fields;
|
|
217
|
+
function dropSubfieldsFunc(subfields) {
|
|
218
|
+
return subfields.filter(sub => {
|
|
219
|
+
// eslint-disable-line
|
|
220
|
+
return !dropSubfields.some(({
|
|
221
|
+
code,
|
|
222
|
+
value = false,
|
|
223
|
+
condition = false
|
|
224
|
+
}) => {
|
|
225
|
+
if (code !== sub.code) {
|
|
226
|
+
return false;
|
|
227
|
+
}
|
|
228
|
+
if (!condition && value) {
|
|
229
|
+
return value === sub.value;
|
|
230
|
+
}
|
|
231
|
+
if (condition === 'unless' && value) {
|
|
232
|
+
return !new RegExp(value, 'u').test(sub.value);
|
|
233
|
+
}
|
|
234
|
+
return true;
|
|
235
|
+
});
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
function checkCopyUnlessFields(fields) {
|
|
240
|
+
if (copyUnless.length > 0) {
|
|
241
|
+
return fields.filter(({
|
|
242
|
+
subfields
|
|
243
|
+
}) => copyUnless.some(filter => !subfields.some(sub => sub.code === filter.code && new RegExp(filter.value, 'u').test(sub.value))));
|
|
244
|
+
}
|
|
245
|
+
return fields;
|
|
246
|
+
}
|
|
247
|
+
};
|
|
248
|
+
exports.default = _default;
|
|
249
|
+
//# sourceMappingURL=copy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copy.js","names":["tagPattern","compareTagsOnly","compareWithoutTag","compareWithoutIndicators","compareWithoutIndicator1","compareWithoutIndicator2","subfieldsMustBeIdentical","excludeSubfields","dropSubfields","copyUnless","baseValidators","subfieldValues","sourceValidators","swapTag","swapSubfieldCode","doNotCopyIfFieldPresent","base","source","baseRecord","MarcRecord","sourceRecord","debug","createDebugLogger","debugOptions","debugCompare","ignoreInd1","ignoreInd2","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 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 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\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 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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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _chai = require("chai");
|
|
4
|
+
var _fixura = require("@natlibfi/fixura");
|
|
5
|
+
var _copy = _interopRequireDefault(require("./copy"));
|
|
6
|
+
var _fixugen = _interopRequireDefault(require("@natlibfi/fixugen"));
|
|
7
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
8
|
+
//import createDebugLogger from 'debug'; // <---
|
|
9
|
+
//const debug = createDebugLogger('@natlibfi/marc-record-merge/copy.spec.js'); // <---
|
|
10
|
+
|
|
11
|
+
(0, _fixugen.default)({
|
|
12
|
+
callback,
|
|
13
|
+
path: [__dirname, '..', '..', 'test-fixtures', 'reducers', 'copy'],
|
|
14
|
+
useMetadataFile: true,
|
|
15
|
+
recurse: true,
|
|
16
|
+
fixura: {
|
|
17
|
+
reader: _fixura.READERS.JSON,
|
|
18
|
+
failWhenNotFound: false
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
function callback({
|
|
22
|
+
getFixture,
|
|
23
|
+
tagPatternRegExp,
|
|
24
|
+
compareTagsOnly = false,
|
|
25
|
+
compareWithoutTag = false,
|
|
26
|
+
compareWithoutIndicators = false,
|
|
27
|
+
compareWithoutIndicator1 = false,
|
|
28
|
+
compareWithoutIndicator2 = false,
|
|
29
|
+
subfieldsMustBeIdentical = false,
|
|
30
|
+
copyUnless = undefined,
|
|
31
|
+
excludeSubfields = undefined,
|
|
32
|
+
dropSubfields = undefined,
|
|
33
|
+
swapSubfieldCode = [],
|
|
34
|
+
swapTag = [],
|
|
35
|
+
doNotCopyIfFieldPresent = false
|
|
36
|
+
}) {
|
|
37
|
+
const base = getFixture('base.json');
|
|
38
|
+
const source = getFixture('source.json');
|
|
39
|
+
const tagPattern = new RegExp(tagPatternRegExp, 'u');
|
|
40
|
+
const expectedRecord = getFixture('merged.json');
|
|
41
|
+
const merged = (0, _copy.default)({
|
|
42
|
+
tagPattern,
|
|
43
|
+
compareTagsOnly,
|
|
44
|
+
compareWithoutTag,
|
|
45
|
+
compareWithoutIndicators,
|
|
46
|
+
compareWithoutIndicator1,
|
|
47
|
+
compareWithoutIndicator2,
|
|
48
|
+
copyUnless,
|
|
49
|
+
subfieldsMustBeIdentical,
|
|
50
|
+
excludeSubfields,
|
|
51
|
+
dropSubfields,
|
|
52
|
+
swapSubfieldCode,
|
|
53
|
+
swapTag,
|
|
54
|
+
doNotCopyIfFieldPresent
|
|
55
|
+
})(base, source);
|
|
56
|
+
//debug(`*** mergedRecord: `, mergedRecord); //<--
|
|
57
|
+
//debug(`*** mergedRecord,Strfy: `, JSON.stringify(mergedRecord)); //<--
|
|
58
|
+
//debug(`*** expectedRecord: `, expectedRecord); //<--
|
|
59
|
+
//debug(`*** expectedRecord,Strfy: `, JSON.stringify(expectedRecord)); //<--
|
|
60
|
+
(0, _chai.expect)(merged.constructor.name).not.to.eql('MarcRecord');
|
|
61
|
+
(0, _chai.expect)(merged.constructor.name).to.eql('Object');
|
|
62
|
+
(0, _chai.expect)(merged).to.eql(expectedRecord);
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=copy.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copy.spec.js","names":["generateTests","callback","path","__dirname","useMetadataFile","recurse","fixura","reader","READERS","JSON","failWhenNotFound","getFixture","tagPatternRegExp","compareTagsOnly","compareWithoutTag","compareWithoutIndicators","compareWithoutIndicator1","compareWithoutIndicator2","subfieldsMustBeIdentical","copyUnless","undefined","excludeSubfields","dropSubfields","swapSubfieldCode","swapTag","doNotCopyIfFieldPresent","base","source","tagPattern","RegExp","expectedRecord","merged","createReducer","expect","constructor","name","not","to","eql"],"sources":["../../src/reducers/copy.spec.js"],"sourcesContent":["import {expect} from 'chai';\nimport {READERS} from '@natlibfi/fixura';\nimport createReducer from './copy';\nimport generateTests from '@natlibfi/fixugen';\n\n//import createDebugLogger from 'debug'; // <---\n//const debug = createDebugLogger('@natlibfi/marc-record-merge/copy.spec.js'); // <---\n\ngenerateTests({\n callback,\n path: [__dirname, '..', '..', 'test-fixtures', 'reducers', 'copy'],\n useMetadataFile: true,\n recurse: true,\n fixura: {\n reader: READERS.JSON,\n failWhenNotFound: false\n }\n});\n\nfunction callback({\n getFixture,\n tagPatternRegExp,\n compareTagsOnly = false,\n compareWithoutTag = false,\n compareWithoutIndicators = false,\n compareWithoutIndicator1 = false,\n compareWithoutIndicator2 = false,\n subfieldsMustBeIdentical = false,\n copyUnless = undefined,\n excludeSubfields = undefined,\n dropSubfields = undefined,\n swapSubfieldCode = [],\n swapTag = [],\n doNotCopyIfFieldPresent = false\n}) {\n const base = getFixture('base.json');\n const source = getFixture('source.json');\n const tagPattern = new RegExp(tagPatternRegExp, 'u');\n const expectedRecord = getFixture('merged.json');\n\n const merged = createReducer({\n tagPattern, compareTagsOnly, compareWithoutTag, compareWithoutIndicators, compareWithoutIndicator1, compareWithoutIndicator2,\n copyUnless, subfieldsMustBeIdentical, excludeSubfields,\n dropSubfields, swapSubfieldCode, swapTag,\n doNotCopyIfFieldPresent\n })(base, source);\n //debug(`*** mergedRecord: `, mergedRecord); //<--\n //debug(`*** mergedRecord,Strfy: `, JSON.stringify(mergedRecord)); //<--\n //debug(`*** expectedRecord: `, expectedRecord); //<--\n //debug(`*** expectedRecord,Strfy: `, JSON.stringify(expectedRecord)); //<--\n expect(merged.constructor.name).not.to.eql('MarcRecord');\n expect(merged.constructor.name).to.eql('Object');\n expect(merged).to.eql(expectedRecord);\n}\n"],"mappings":";;AAAA;AACA;AACA;AACA;AAA8C;AAE9C;AACA;;AAEA,IAAAA,gBAAa,EAAC;EACZC,QAAQ;EACRC,IAAI,EAAE,CAACC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,CAAC;EAClEC,eAAe,EAAE,IAAI;EACrBC,OAAO,EAAE,IAAI;EACbC,MAAM,EAAE;IACNC,MAAM,EAAEC,eAAO,CAACC,IAAI;IACpBC,gBAAgB,EAAE;EACpB;AACF,CAAC,CAAC;AAEF,SAAST,QAAQ,CAAC;EAChBU,UAAU;EACVC,gBAAgB;EAChBC,eAAe,GAAG,KAAK;EACvBC,iBAAiB,GAAG,KAAK;EACzBC,wBAAwB,GAAG,KAAK;EAChCC,wBAAwB,GAAG,KAAK;EAChCC,wBAAwB,GAAG,KAAK;EAChCC,wBAAwB,GAAG,KAAK;EAChCC,UAAU,GAAGC,SAAS;EACtBC,gBAAgB,GAAGD,SAAS;EAC5BE,aAAa,GAAGF,SAAS;EACzBG,gBAAgB,GAAG,EAAE;EACrBC,OAAO,GAAG,EAAE;EACZC,uBAAuB,GAAG;AAC5B,CAAC,EAAE;EACD,MAAMC,IAAI,GAAGf,UAAU,CAAC,WAAW,CAAC;EACpC,MAAMgB,MAAM,GAAGhB,UAAU,CAAC,aAAa,CAAC;EACxC,MAAMiB,UAAU,GAAG,IAAIC,MAAM,CAACjB,gBAAgB,EAAE,GAAG,CAAC;EACpD,MAAMkB,cAAc,GAAGnB,UAAU,CAAC,aAAa,CAAC;EAEhD,MAAMoB,MAAM,GAAG,IAAAC,aAAa,EAAC;IAC3BJ,UAAU;IAAEf,eAAe;IAAEC,iBAAiB;IAAEC,wBAAwB;IAAEC,wBAAwB;IAAEC,wBAAwB;IAC5HE,UAAU;IAAED,wBAAwB;IAAEG,gBAAgB;IACtDC,aAAa;IAAEC,gBAAgB;IAAEC,OAAO;IACxCC;EACF,CAAC,CAAC,CAACC,IAAI,EAAEC,MAAM,CAAC;EAChB;EACA;EACA;EACA;EACA,IAAAM,YAAM,EAACF,MAAM,CAACG,WAAW,CAACC,IAAI,CAAC,CAACC,GAAG,CAACC,EAAE,CAACC,GAAG,CAAC,YAAY,CAAC;EACxD,IAAAL,YAAM,EAACF,MAAM,CAACG,WAAW,CAACC,IAAI,CAAC,CAACE,EAAE,CAACC,GAAG,CAAC,QAAQ,CAAC;EAChD,IAAAL,YAAM,EAACF,MAAM,CAAC,CAACM,EAAE,CAACC,GAAG,CAACR,cAAc,CAAC;AACvC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _copy = _interopRequireDefault(require("./copy"));
|
|
8
|
+
var _select = _interopRequireWildcard(require("./select"));
|
|
9
|
+
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); }
|
|
10
|
+
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; }
|
|
11
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
12
|
+
var _default = {
|
|
13
|
+
copy: _copy.default,
|
|
14
|
+
select: _select.default,
|
|
15
|
+
strictEquality: _select.strictEquality,
|
|
16
|
+
subsetEquality: _select.subsetEquality
|
|
17
|
+
};
|
|
18
|
+
exports.default = _default;
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["copy","select","strictEquality","subsetEquality"],"sources":["../../src/reducers/index.js"],"sourcesContent":["import copy from './copy';\nimport select, {strictEquality, subsetEquality} from './select';\n\nexport default {copy, select, strictEquality, subsetEquality};\n"],"mappings":";;;;;;AAAA;AACA;AAAgE;AAAA;AAAA;AAAA,eAEjD;EAACA,IAAI,EAAJA,aAAI;EAAEC,MAAM,EAANA,eAAM;EAAEC,cAAc,EAAdA,sBAAc;EAAEC,cAAc,EAAdA;AAAc,CAAC;AAAA"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
exports.strictEquality = strictEquality;
|
|
8
|
+
exports.subsetEquality = subsetEquality;
|
|
9
|
+
var _normalizeDiacritics = require("normalize-diacritics");
|
|
10
|
+
var _debug = _interopRequireDefault(require("debug"));
|
|
11
|
+
var _marcRecord = require("@natlibfi/marc-record");
|
|
12
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
13
|
+
function strictEquality(subfieldA, subfieldB) {
|
|
14
|
+
return subfieldA.code === subfieldB.code && subfieldA.value === subfieldB.value;
|
|
15
|
+
}
|
|
16
|
+
function subsetEquality(subfieldA, subfieldB) {
|
|
17
|
+
return subfieldA.code === subfieldB.code && (subfieldA.value.indexOf(subfieldB.value) !== -1 || subfieldB.value.indexOf(subfieldA.value) !== -1);
|
|
18
|
+
}
|
|
19
|
+
// EqualityFunction can be either strictEquality or subsetEquality
|
|
20
|
+
var _default = ({
|
|
21
|
+
tagPattern,
|
|
22
|
+
equalityFunction = strictEquality
|
|
23
|
+
}) => (base, source) => {
|
|
24
|
+
const debug = (0, _debug.default)('@natlibfi/marc-record-merge:select');
|
|
25
|
+
const baseRecord = new _marcRecord.MarcRecord(base, {
|
|
26
|
+
subfieldValues: false
|
|
27
|
+
});
|
|
28
|
+
const sourceRecord = new _marcRecord.MarcRecord(source, {
|
|
29
|
+
subfieldValues: false
|
|
30
|
+
});
|
|
31
|
+
const baseFields = baseRecord.get(tagPattern);
|
|
32
|
+
const sourceFields = sourceRecord.get(tagPattern);
|
|
33
|
+
const fieldTag = sourceFields.map(field => field.tag);
|
|
34
|
+
debug(`Comparing field ${fieldTag}`);
|
|
35
|
+
checkFieldType(baseFields);
|
|
36
|
+
checkFieldType(sourceFields);
|
|
37
|
+
if (baseFields.length > 1 || sourceFields.length > 1) {
|
|
38
|
+
debug(`Multiple fields in base or source`);
|
|
39
|
+
debug(`No changes to base`);
|
|
40
|
+
return base;
|
|
41
|
+
}
|
|
42
|
+
const [baseField] = baseFields;
|
|
43
|
+
const [sourceField] = sourceFields;
|
|
44
|
+
if (baseField.tag === sourceField.tag === false) {
|
|
45
|
+
debug(`Base tag ${baseField.tag} is not equal to source tag ${sourceField.tag}`);
|
|
46
|
+
debug(`No changes to base`);
|
|
47
|
+
return base;
|
|
48
|
+
}
|
|
49
|
+
const baseSubs = baseField.subfields;
|
|
50
|
+
const sourceSubs = sourceField.subfields;
|
|
51
|
+
const baseSubsNormalized = baseSubs.map(({
|
|
52
|
+
code,
|
|
53
|
+
value
|
|
54
|
+
}) => ({
|
|
55
|
+
code,
|
|
56
|
+
value: normalizeSubfieldValue(value)
|
|
57
|
+
}));
|
|
58
|
+
const sourceSubsNormalized = sourceSubs.map(({
|
|
59
|
+
code,
|
|
60
|
+
value
|
|
61
|
+
}) => ({
|
|
62
|
+
code,
|
|
63
|
+
value: normalizeSubfieldValue(value)
|
|
64
|
+
}));
|
|
65
|
+
|
|
66
|
+
// Returns the base subfields for which a matching source subfield is found
|
|
67
|
+
const equalSubfieldsBase = baseSubsNormalized.filter(baseSubfield => sourceSubsNormalized.some(sourceSubfield => equalityFunction(baseSubfield, sourceSubfield)));
|
|
68
|
+
debug(`equalSubfieldsBase: ${JSON.stringify(equalSubfieldsBase, undefined, 2)}`);
|
|
69
|
+
|
|
70
|
+
// Returns the source subfields for which a matching base subfield is found
|
|
71
|
+
const equalSubfieldsSource = sourceSubsNormalized.filter(sourceSubfield => baseSubsNormalized.some(baseSubfield => equalityFunction(sourceSubfield, baseSubfield)));
|
|
72
|
+
debug(`equalSubfieldsSource: ${JSON.stringify(equalSubfieldsSource, undefined, 2)}`);
|
|
73
|
+
if (baseSubs.length === sourceSubs.length && equalSubfieldsBase.length < baseSubs.length) {
|
|
74
|
+
debug(`Base and source subfields are not equal`);
|
|
75
|
+
debug(`No changes to base`);
|
|
76
|
+
return base;
|
|
77
|
+
}
|
|
78
|
+
if (baseSubs.length === sourceSubs.length && equalSubfieldsBase.length === equalSubfieldsSource.length) {
|
|
79
|
+
debug(`Checking subfield equality`);
|
|
80
|
+
const totalSubfieldLengthBase = baseSubsNormalized.map(({
|
|
81
|
+
value
|
|
82
|
+
}) => value.length).reduce((acc, value) => acc + value);
|
|
83
|
+
const totalSubfieldLengthSource = sourceSubsNormalized.map(({
|
|
84
|
+
value
|
|
85
|
+
}) => value.length).reduce((acc, value) => acc + value);
|
|
86
|
+
if (totalSubfieldLengthSource > totalSubfieldLengthBase) {
|
|
87
|
+
return replaceBasefieldWithSourcefield(base);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
if (sourceSubs.length > baseSubs.length && equalSubfieldsBase.length === baseSubs.length) {
|
|
91
|
+
return replaceBasefieldWithSourcefield(base);
|
|
92
|
+
}
|
|
93
|
+
debug(`No changes to base`);
|
|
94
|
+
return base;
|
|
95
|
+
function replaceBasefieldWithSourcefield(base) {
|
|
96
|
+
const index = base.fields.findIndex(field => field === baseField);
|
|
97
|
+
base.fields.splice(index, 1, sourceField); // eslint-disable-line functional/immutable-data
|
|
98
|
+
debug(`Source field is longer, replacing base with source`);
|
|
99
|
+
return base;
|
|
100
|
+
}
|
|
101
|
+
function checkFieldType(fields) {
|
|
102
|
+
const checkedFields = fields.map(field => {
|
|
103
|
+
if ('value' in field) {
|
|
104
|
+
// eslint-disable-line functional/no-conditional-statement
|
|
105
|
+
throw new Error('Invalid control field, expected data field');
|
|
106
|
+
}
|
|
107
|
+
return field;
|
|
108
|
+
});
|
|
109
|
+
return checkedFields;
|
|
110
|
+
}
|
|
111
|
+
function normalizeSubfieldValue(value) {
|
|
112
|
+
// Regexp options: g: global search, u: unicode
|
|
113
|
+
const punctuation = /[.,\-/#!?$%^&*;:{}=_`~()[\]]/gu;
|
|
114
|
+
return (0, _normalizeDiacritics.normalizeSync)(value).toLowerCase().replace(punctuation, '', 'u').replace(/\s+/gu, ' ').trim();
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
exports.default = _default;
|
|
118
|
+
//# sourceMappingURL=select.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"select.js","names":["strictEquality","subfieldA","subfieldB","code","value","subsetEquality","indexOf","tagPattern","equalityFunction","base","source","debug","createDebugLogger","baseRecord","MarcRecord","subfieldValues","sourceRecord","baseFields","get","sourceFields","fieldTag","map","field","tag","checkFieldType","length","baseField","sourceField","baseSubs","subfields","sourceSubs","baseSubsNormalized","normalizeSubfieldValue","sourceSubsNormalized","equalSubfieldsBase","filter","baseSubfield","some","sourceSubfield","JSON","stringify","undefined","equalSubfieldsSource","totalSubfieldLengthBase","reduce","acc","totalSubfieldLengthSource","replaceBasefieldWithSourcefield","index","fields","findIndex","splice","checkedFields","Error","punctuation","normalizeSync","toLowerCase","replace","trim"],"sources":["../../src/reducers/select.js"],"sourcesContent":["import {normalizeSync} from 'normalize-diacritics';\nimport createDebugLogger from 'debug';\nimport {MarcRecord} from '@natlibfi/marc-record';\n\nexport function strictEquality(subfieldA, subfieldB) {\n return subfieldA.code === subfieldB.code &&\n subfieldA.value === subfieldB.value;\n}\n\nexport function subsetEquality(subfieldA, subfieldB) {\n return subfieldA.code === subfieldB.code &&\n (subfieldA.value.indexOf(subfieldB.value) !== -1 || subfieldB.value.indexOf(subfieldA.value) !== -1);\n}\n// EqualityFunction can be either strictEquality or subsetEquality\nexport default ({tagPattern, equalityFunction = strictEquality}) => (base, source) => {\n const debug = createDebugLogger('@natlibfi/marc-record-merge:select');\n const baseRecord = new MarcRecord(base, {subfieldValues: false});\n const sourceRecord = new MarcRecord(source, {subfieldValues: false});\n const baseFields = baseRecord.get(tagPattern);\n const sourceFields = sourceRecord.get(tagPattern);\n const fieldTag = sourceFields.map(field => field.tag);\n debug(`Comparing field ${fieldTag}`);\n\n checkFieldType(baseFields);\n checkFieldType(sourceFields);\n\n if (baseFields.length > 1 || sourceFields.length > 1) {\n debug(`Multiple fields in base or source`);\n debug(`No changes to base`);\n return base;\n }\n const [baseField] = baseFields;\n const [sourceField] = sourceFields;\n\n if (baseField.tag === sourceField.tag === false) {\n debug(`Base tag ${baseField.tag} is not equal to source tag ${sourceField.tag}`);\n debug(`No changes to base`);\n return base;\n }\n const baseSubs = baseField.subfields;\n const sourceSubs = sourceField.subfields;\n\n const baseSubsNormalized = baseSubs\n .map(({code, value}) => ({code, value: normalizeSubfieldValue(value)}));\n\n const sourceSubsNormalized = sourceSubs\n .map(({code, value}) => ({code, value: normalizeSubfieldValue(value)}));\n\n // Returns the base subfields for which a matching source subfield is found\n const equalSubfieldsBase = baseSubsNormalized\n .filter(baseSubfield => sourceSubsNormalized\n .some(sourceSubfield => equalityFunction(baseSubfield, sourceSubfield)));\n debug(`equalSubfieldsBase: ${JSON.stringify(equalSubfieldsBase, undefined, 2)}`);\n\n // Returns the source subfields for which a matching base subfield is found\n const equalSubfieldsSource = sourceSubsNormalized\n .filter(sourceSubfield => baseSubsNormalized\n .some(baseSubfield => equalityFunction(sourceSubfield, baseSubfield)));\n debug(`equalSubfieldsSource: ${JSON.stringify(equalSubfieldsSource, undefined, 2)}`);\n\n if (baseSubs.length === sourceSubs.length && equalSubfieldsBase.length < baseSubs.length) {\n debug(`Base and source subfields are not equal`);\n debug(`No changes to base`);\n return base;\n }\n\n if (baseSubs.length === sourceSubs.length && equalSubfieldsBase.length === equalSubfieldsSource.length) {\n debug(`Checking subfield equality`);\n const totalSubfieldLengthBase = baseSubsNormalized\n .map(({value}) => value.length)\n .reduce((acc, value) => acc + value);\n const totalSubfieldLengthSource = sourceSubsNormalized\n .map(({value}) => value.length)\n .reduce((acc, value) => acc + value);\n\n if (totalSubfieldLengthSource > totalSubfieldLengthBase) {\n return replaceBasefieldWithSourcefield(base);\n }\n }\n\n if (sourceSubs.length > baseSubs.length && equalSubfieldsBase.length === baseSubs.length) {\n return replaceBasefieldWithSourcefield(base);\n }\n\n debug(`No changes to base`);\n return base;\n\n function replaceBasefieldWithSourcefield(base) {\n const index = base.fields.findIndex(field => field === baseField);\n base.fields.splice(index, 1, sourceField); // eslint-disable-line functional/immutable-data\n debug(`Source field is longer, replacing base with source`);\n return base;\n }\n\n function checkFieldType(fields) {\n const checkedFields = fields.map(field => {\n if ('value' in field) { // eslint-disable-line functional/no-conditional-statement\n throw new Error('Invalid control field, expected data field');\n }\n return field;\n });\n return checkedFields;\n }\n\n function normalizeSubfieldValue(value) {\n // Regexp options: g: global search, u: unicode\n const punctuation = /[.,\\-/#!?$%^&*;:{}=_`~()[\\]]/gu;\n return normalizeSync(value).toLowerCase().replace(punctuation, '', 'u').replace(/\\s+/gu, ' ').trim();\n }\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _chai = require("chai");
|
|
4
|
+
var _marcRecord = require("@natlibfi/marc-record");
|
|
5
|
+
var _select = _interopRequireWildcard(require("./select"));
|
|
6
|
+
var _fixura = require("@natlibfi/fixura");
|
|
7
|
+
var _fixugen = _interopRequireDefault(require("@natlibfi/fixugen"));
|
|
8
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
9
|
+
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); }
|
|
10
|
+
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; }
|
|
11
|
+
_marcRecord.MarcRecord.setValidationOptions({
|
|
12
|
+
subfieldValues: false
|
|
13
|
+
});
|
|
14
|
+
(0, _fixugen.default)({
|
|
15
|
+
callback,
|
|
16
|
+
path: [__dirname, '..', '..', 'test-fixtures', 'reducers', 'select'],
|
|
17
|
+
useMetadataFile: true,
|
|
18
|
+
recurse: false,
|
|
19
|
+
fixura: {
|
|
20
|
+
reader: _fixura.READERS.JSON,
|
|
21
|
+
failWhenNotFound: false
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
function callback({
|
|
25
|
+
getFixture,
|
|
26
|
+
disabled = false,
|
|
27
|
+
tagPatternRegExp = false,
|
|
28
|
+
expectedError = false,
|
|
29
|
+
useSubsetEquality = false
|
|
30
|
+
}) {
|
|
31
|
+
if (disabled) {
|
|
32
|
+
console.log('TEST DISABLED!'); // eslint-disable-line no-console
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
// const base = new MarcRecord(getFixture('base.json'), {subfieldValues: false});
|
|
36
|
+
// const source = new MarcRecord(getFixture('source.json'), {subfieldValues: false});
|
|
37
|
+
|
|
38
|
+
const base = getFixture('base.json');
|
|
39
|
+
const source = getFixture('source.json');
|
|
40
|
+
const tagPattern = new RegExp(tagPatternRegExp, 'u');
|
|
41
|
+
const expectedRecord = getFixture('merged.json');
|
|
42
|
+
const equalityFunction = useSubsetEquality ? _select.subsetEquality : undefined;
|
|
43
|
+
|
|
44
|
+
// Bypass expected error in testing
|
|
45
|
+
if (expectedError) {
|
|
46
|
+
(0, _chai.expect)(() => _select.default.to.throw(Error, 'control field'));
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const mergedRecord = (0, _select.default)({
|
|
50
|
+
tagPattern,
|
|
51
|
+
equalityFunction
|
|
52
|
+
})(base, source);
|
|
53
|
+
(0, _chai.expect)(mergedRecord).to.eql(expectedRecord);
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=select.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"select.spec.js","names":["MarcRecord","setValidationOptions","subfieldValues","generateTests","callback","path","__dirname","useMetadataFile","recurse","fixura","reader","READERS","JSON","failWhenNotFound","getFixture","disabled","tagPatternRegExp","expectedError","useSubsetEquality","console","log","base","source","tagPattern","RegExp","expectedRecord","equalityFunction","subsetEquality","undefined","expect","createReducer","to","throw","Error","mergedRecord","eql"],"sources":["../../src/reducers/select.spec.js"],"sourcesContent":["import {expect} from 'chai';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport createReducer, {subsetEquality} from './select';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\n\nMarcRecord.setValidationOptions({subfieldValues: false});\n\ngenerateTests({\n callback,\n path: [__dirname, '..', '..', 'test-fixtures', 'reducers', 'select'],\n useMetadataFile: true,\n recurse: false,\n fixura: {\n reader: READERS.JSON,\n failWhenNotFound: false\n }\n});\n\nfunction callback({\n getFixture,\n disabled = false,\n tagPatternRegExp = false,\n expectedError = false,\n useSubsetEquality = false\n}) {\n if (disabled) {\n console.log('TEST DISABLED!'); // eslint-disable-line no-console\n return;\n }\n // const base = new MarcRecord(getFixture('base.json'), {subfieldValues: false});\n // const source = new MarcRecord(getFixture('source.json'), {subfieldValues: false});\n\n const base = getFixture('base.json');\n const source = getFixture('source.json');\n\n const tagPattern = new RegExp(tagPatternRegExp, 'u');\n const expectedRecord = getFixture('merged.json');\n const equalityFunction = useSubsetEquality ? subsetEquality : undefined;\n\n // Bypass expected error in testing\n if (expectedError) {\n expect(() => createReducer.to.throw(Error, 'control field'));\n return;\n }\n\n const mergedRecord = createReducer({tagPattern, equalityFunction})(base, source);\n expect(mergedRecord).to.eql(expectedRecord);\n}\n"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AAA8C;AAAA;AAAA;AAE9CA,sBAAU,CAACC,oBAAoB,CAAC;EAACC,cAAc,EAAE;AAAK,CAAC,CAAC;AAExD,IAAAC,gBAAa,EAAC;EACZC,QAAQ;EACRC,IAAI,EAAE,CAACC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,eAAe,EAAE,UAAU,EAAE,QAAQ,CAAC;EACpEC,eAAe,EAAE,IAAI;EACrBC,OAAO,EAAE,KAAK;EACdC,MAAM,EAAE;IACNC,MAAM,EAAEC,eAAO,CAACC,IAAI;IACpBC,gBAAgB,EAAE;EACpB;AACF,CAAC,CAAC;AAEF,SAAST,QAAQ,CAAC;EAChBU,UAAU;EACVC,QAAQ,GAAG,KAAK;EAChBC,gBAAgB,GAAG,KAAK;EACxBC,aAAa,GAAG,KAAK;EACrBC,iBAAiB,GAAG;AACtB,CAAC,EAAE;EACD,IAAIH,QAAQ,EAAE;IACZI,OAAO,CAACC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAC/B;EACF;EACA;EACA;;EAEA,MAAMC,IAAI,GAAGP,UAAU,CAAC,WAAW,CAAC;EACpC,MAAMQ,MAAM,GAAGR,UAAU,CAAC,aAAa,CAAC;EAExC,MAAMS,UAAU,GAAG,IAAIC,MAAM,CAACR,gBAAgB,EAAE,GAAG,CAAC;EACpD,MAAMS,cAAc,GAAGX,UAAU,CAAC,aAAa,CAAC;EAChD,MAAMY,gBAAgB,GAAGR,iBAAiB,GAAGS,sBAAc,GAAGC,SAAS;;EAEvE;EACA,IAAIX,aAAa,EAAE;IACjB,IAAAY,YAAM,EAAC,MAAMC,eAAa,CAACC,EAAE,CAACC,KAAK,CAACC,KAAK,EAAE,eAAe,CAAC,CAAC;IAC5D;EACF;EAEA,MAAMC,YAAY,GAAG,IAAAJ,eAAa,EAAC;IAACP,UAAU;IAAEG;EAAgB,CAAC,CAAC,CAACL,IAAI,EAAEC,MAAM,CAAC;EAChF,IAAAO,YAAM,EAACK,YAAY,CAAC,CAACH,EAAE,CAACI,GAAG,CAACV,cAAc,CAAC;AAC7C"}
|