@natlibfi/marc-record-merge 5.0.0 → 6.0.0-beta.4
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/.drone.yml +92 -0
- 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 +64 -246
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/reducers/copy.js +297 -0
- package/dist/reducers/copy.js.map +1 -0
- package/dist/reducers/copy.spec.js +68 -0
- package/dist/reducers/copy.spec.js.map +1 -0
- package/dist/reducers/index.js +25 -0
- package/dist/reducers/index.js.map +1 -0
- package/dist/reducers/select.js +130 -0
- package/dist/reducers/select.js.map +1 -0
- package/dist/reducers/select.spec.js +68 -0
- package/dist/reducers/select.spec.js.map +1 -0
- package/package.json +103 -57
- package/src/index.js +4 -0
- package/src/reducers/copy.js +274 -0
- package/src/reducers/copy.spec.js +48 -0
- package/src/reducers/index.js +4 -0
- package/src/reducers/select.js +107 -0
- package/src/reducers/select.spec.js +45 -0
- package/test-fixtures/reducers/copy/basic copy/01/base.json +9 -0
- package/test-fixtures/reducers/copy/basic copy/01/merged.json +20 -0
- package/test-fixtures/reducers/copy/basic copy/01/metadata.json +5 -0
- package/test-fixtures/reducers/copy/basic copy/01/source.json +20 -0
- package/test-fixtures/reducers/copy/basic copy/02/base.json +20 -0
- package/test-fixtures/reducers/copy/basic copy/02/merged.json +20 -0
- package/test-fixtures/reducers/copy/basic copy/02/metadata.json +5 -0
- package/test-fixtures/reducers/copy/basic copy/02/source.json +20 -0
- package/test-fixtures/reducers/copy/basic copy/03/base.json +20 -0
- package/test-fixtures/reducers/copy/basic copy/03/merged.json +28 -0
- package/test-fixtures/reducers/copy/basic copy/03/metadata.json +5 -0
- package/test-fixtures/reducers/copy/basic copy/03/source.json +24 -0
- package/test-fixtures/reducers/copy/basic copy/04/base.json +39 -0
- package/test-fixtures/reducers/copy/basic copy/04/merged.json +39 -0
- package/test-fixtures/reducers/copy/basic copy/04/metadata.json +5 -0
- package/test-fixtures/reducers/copy/basic copy/04/source.json +39 -0
- package/test-fixtures/reducers/copy/basic copy/05/base.json +39 -0
- package/test-fixtures/reducers/copy/basic copy/05/merged.json +77 -0
- package/test-fixtures/reducers/copy/basic copy/05/metadata.json +5 -0
- package/test-fixtures/reducers/copy/basic copy/05/source.json +62 -0
- package/test-fixtures/reducers/copy/basic copy/06/base.json +24 -0
- package/test-fixtures/reducers/copy/basic copy/06/merged.json +39 -0
- package/test-fixtures/reducers/copy/basic copy/06/metadata.json +5 -0
- package/test-fixtures/reducers/copy/basic copy/06/source.json +24 -0
- package/test-fixtures/reducers/copy/compareTagsOnly/01/base.json +24 -0
- package/test-fixtures/reducers/copy/compareTagsOnly/01/merged.json +24 -0
- package/test-fixtures/reducers/copy/compareTagsOnly/01/metadata.json +6 -0
- package/test-fixtures/reducers/copy/compareTagsOnly/01/source.json +24 -0
- package/test-fixtures/reducers/copy/compareTagsOnly/02/base.json +24 -0
- package/test-fixtures/reducers/copy/compareTagsOnly/02/merged.json +100 -0
- package/test-fixtures/reducers/copy/compareTagsOnly/02/metadata.json +6 -0
- package/test-fixtures/reducers/copy/compareTagsOnly/02/source.json +100 -0
- package/test-fixtures/reducers/copy/compareWithoutIndicators/01/base.json +24 -0
- package/test-fixtures/reducers/copy/compareWithoutIndicators/01/merged.json +24 -0
- package/test-fixtures/reducers/copy/compareWithoutIndicators/01/metadata.json +6 -0
- package/test-fixtures/reducers/copy/compareWithoutIndicators/01/source.json +24 -0
- package/test-fixtures/reducers/copy/compareWithoutIndicators/02/base.json +24 -0
- package/test-fixtures/reducers/copy/compareWithoutIndicators/02/merged.json +39 -0
- package/test-fixtures/reducers/copy/compareWithoutIndicators/02/metadata.json +6 -0
- package/test-fixtures/reducers/copy/compareWithoutIndicators/02/source.json +24 -0
- package/test-fixtures/reducers/copy/copyUnless/01/base.json +9 -0
- package/test-fixtures/reducers/copy/copyUnless/01/merged.json +24 -0
- package/test-fixtures/reducers/copy/copyUnless/01/metadata.json +6 -0
- package/test-fixtures/reducers/copy/copyUnless/01/source.json +47 -0
- package/test-fixtures/reducers/copy/dropSubfields/01/base.json +35 -0
- package/test-fixtures/reducers/copy/dropSubfields/01/merged.json +54 -0
- package/test-fixtures/reducers/copy/dropSubfields/01/metadata.json +6 -0
- package/test-fixtures/reducers/copy/dropSubfields/01/source.json +43 -0
- package/test-fixtures/reducers/copy/dropSubfields/02/base.json +43 -0
- package/test-fixtures/reducers/copy/dropSubfields/02/merged.json +58 -0
- package/test-fixtures/reducers/copy/dropSubfields/02/metadata.json +6 -0
- package/test-fixtures/reducers/copy/dropSubfields/02/source.json +32 -0
- package/test-fixtures/reducers/copy/dropSubfields/03/base.json +43 -0
- package/test-fixtures/reducers/copy/dropSubfields/03/merged.json +58 -0
- package/test-fixtures/reducers/copy/dropSubfields/03/metadata.json +6 -0
- package/test-fixtures/reducers/copy/dropSubfields/03/source.json +32 -0
- package/test-fixtures/reducers/copy/dropSubfields/04/base.json +43 -0
- package/test-fixtures/reducers/copy/dropSubfields/04/merged.json +43 -0
- package/test-fixtures/reducers/copy/dropSubfields/04/metadata.json +6 -0
- package/test-fixtures/reducers/copy/dropSubfields/04/source.json +32 -0
- package/test-fixtures/reducers/copy/excludeSubfields/01/base.json +39 -0
- package/test-fixtures/reducers/copy/excludeSubfields/01/merged.json +39 -0
- package/test-fixtures/reducers/copy/excludeSubfields/01/metadata.json +9 -0
- package/test-fixtures/reducers/copy/excludeSubfields/01/source.json +43 -0
- package/test-fixtures/reducers/copy/subfieldsMustBeIdentical/01/base.json +24 -0
- package/test-fixtures/reducers/copy/subfieldsMustBeIdentical/01/merged.json +39 -0
- package/test-fixtures/reducers/copy/subfieldsMustBeIdentical/01/metadata.json +6 -0
- package/test-fixtures/reducers/copy/subfieldsMustBeIdentical/01/source.json +24 -0
- package/test-fixtures/reducers/copy/subfieldsMustBeIdentical/02/base.json +24 -0
- package/test-fixtures/reducers/copy/subfieldsMustBeIdentical/02/merged.json +24 -0
- package/test-fixtures/reducers/copy/subfieldsMustBeIdentical/02/metadata.json +6 -0
- package/test-fixtures/reducers/copy/subfieldsMustBeIdentical/02/source.json +24 -0
- package/test-fixtures/reducers/copy/subfieldsMustBeIdentical/03/base.json +28 -0
- package/test-fixtures/reducers/copy/subfieldsMustBeIdentical/03/merged.json +43 -0
- package/test-fixtures/reducers/copy/subfieldsMustBeIdentical/03/metadata.json +6 -0
- package/test-fixtures/reducers/copy/subfieldsMustBeIdentical/03/source.json +24 -0
- package/test-fixtures/reducers/copy/subfieldsMustBeIdentical/04/base.json +28 -0
- package/test-fixtures/reducers/copy/subfieldsMustBeIdentical/04/merged.json +28 -0
- package/test-fixtures/reducers/copy/subfieldsMustBeIdentical/04/metadata.json +6 -0
- package/test-fixtures/reducers/copy/subfieldsMustBeIdentical/04/source.json +24 -0
- package/test-fixtures/reducers/copy/subfieldsMustBeIdentical/05/base.json +20 -0
- package/test-fixtures/reducers/copy/subfieldsMustBeIdentical/05/merged.json +35 -0
- package/test-fixtures/reducers/copy/subfieldsMustBeIdentical/05/metadata.json +6 -0
- package/test-fixtures/reducers/copy/subfieldsMustBeIdentical/05/source.json +24 -0
- package/test-fixtures/reducers/copy/subfieldsMustBeIdentical/06/base.json +20 -0
- package/test-fixtures/reducers/copy/subfieldsMustBeIdentical/06/merged.json +35 -0
- package/test-fixtures/reducers/copy/subfieldsMustBeIdentical/06/metadata.json +6 -0
- package/test-fixtures/reducers/copy/subfieldsMustBeIdentical/06/source.json +24 -0
- package/test-fixtures/reducers/metadata.json +5 -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,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _chai = require("chai");
|
|
4
|
+
|
|
5
|
+
var _marcRecord = require("@natlibfi/marc-record");
|
|
6
|
+
|
|
7
|
+
var _select = _interopRequireWildcard(require("./select"));
|
|
8
|
+
|
|
9
|
+
var _fixura = require("@natlibfi/fixura");
|
|
10
|
+
|
|
11
|
+
var _fixugen = _interopRequireDefault(require("@natlibfi/fixugen"));
|
|
12
|
+
|
|
13
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
14
|
+
|
|
15
|
+
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); }
|
|
16
|
+
|
|
17
|
+
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; }
|
|
18
|
+
|
|
19
|
+
_marcRecord.MarcRecord.setValidationOptions({
|
|
20
|
+
subfieldValues: false
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
(0, _fixugen.default)({
|
|
24
|
+
callback,
|
|
25
|
+
path: [__dirname, '..', '..', 'test-fixtures', 'reducers', 'select'],
|
|
26
|
+
useMetadataFile: true,
|
|
27
|
+
recurse: false,
|
|
28
|
+
fixura: {
|
|
29
|
+
reader: _fixura.READERS.JSON,
|
|
30
|
+
failWhenNotFound: false
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
function callback({
|
|
35
|
+
getFixture,
|
|
36
|
+
disabled = false,
|
|
37
|
+
tagPatternRegExp = false,
|
|
38
|
+
expectedError = false,
|
|
39
|
+
useSubsetEquality = false
|
|
40
|
+
}) {
|
|
41
|
+
if (disabled) {
|
|
42
|
+
console.log('TEST DISABLED!'); // eslint-disable-line no-console
|
|
43
|
+
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const base = new _marcRecord.MarcRecord(getFixture('base.json'), {
|
|
48
|
+
subfieldValues: false
|
|
49
|
+
});
|
|
50
|
+
const source = new _marcRecord.MarcRecord(getFixture('source.json'), {
|
|
51
|
+
subfieldValues: false
|
|
52
|
+
});
|
|
53
|
+
const tagPattern = new RegExp(tagPatternRegExp, 'u');
|
|
54
|
+
const expectedRecord = getFixture('merged.json');
|
|
55
|
+
const equalityFunction = useSubsetEquality ? _select.subsetEquality : undefined; // Bypass expected error in testing
|
|
56
|
+
|
|
57
|
+
if (expectedError) {
|
|
58
|
+
(0, _chai.expect)(() => _select.default.to.throw(Error, 'control field'));
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const mergedRecord = (0, _select.default)({
|
|
63
|
+
tagPattern,
|
|
64
|
+
equalityFunction
|
|
65
|
+
})(base, source);
|
|
66
|
+
(0, _chai.expect)(mergedRecord.toObject()).to.eql(expectedRecord);
|
|
67
|
+
}
|
|
68
|
+
//# 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","toObject","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 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.toObject()).to.eql(expectedRecord);\n}\n"],"mappings":";;AAAA;;AACA;;AACA;;AACA;;AACA;;;;;;;;AAEAA,sBAAA,CAAWC,oBAAX,CAAgC;EAACC,cAAc,EAAE;AAAjB,CAAhC;;AAEA,IAAAC,gBAAA,EAAc;EACZC,QADY;EAEZC,IAAI,EAAE,CAACC,SAAD,EAAY,IAAZ,EAAkB,IAAlB,EAAwB,eAAxB,EAAyC,UAAzC,EAAqD,QAArD,CAFM;EAGZC,eAAe,EAAE,IAHL;EAIZC,OAAO,EAAE,KAJG;EAKZC,MAAM,EAAE;IACNC,MAAM,EAAEC,eAAA,CAAQC,IADV;IAENC,gBAAgB,EAAE;EAFZ;AALI,CAAd;;AAWA,SAAST,QAAT,CAAkB;EAChBU,UADgB;EAEhBC,QAAQ,GAAG,KAFK;EAGhBC,gBAAgB,GAAG,KAHH;EAIhBC,aAAa,GAAG,KAJA;EAKhBC,iBAAiB,GAAG;AALJ,CAAlB,EAMG;EACD,IAAIH,QAAJ,EAAc;IACZI,OAAO,CAACC,GAAR,CAAY,gBAAZ,EADY,CACmB;;IAC/B;EACD;;EACD,MAAMC,IAAI,GAAG,IAAIrB,sBAAJ,CAAec,UAAU,CAAC,WAAD,CAAzB,EAAwC;IAACZ,cAAc,EAAE;EAAjB,CAAxC,CAAb;EACA,MAAMoB,MAAM,GAAG,IAAItB,sBAAJ,CAAec,UAAU,CAAC,aAAD,CAAzB,EAA0C;IAACZ,cAAc,EAAE;EAAjB,CAA1C,CAAf;EACA,MAAMqB,UAAU,GAAG,IAAIC,MAAJ,CAAWR,gBAAX,EAA6B,GAA7B,CAAnB;EACA,MAAMS,cAAc,GAAGX,UAAU,CAAC,aAAD,CAAjC;EACA,MAAMY,gBAAgB,GAAGR,iBAAiB,GAAGS,sBAAH,GAAoBC,SAA9D,CATC,CAWD;;EACA,IAAIX,aAAJ,EAAmB;IACjB,IAAAY,YAAA,EAAO,MAAMC,eAAA,CAAcC,EAAd,CAAiBC,KAAjB,CAAuBC,KAAvB,EAA8B,eAA9B,CAAb;IACA;EACD;;EAED,MAAMC,YAAY,GAAG,IAAAJ,eAAA,EAAc;IAACP,UAAD;IAAaG;EAAb,CAAd,EAA8CL,IAA9C,EAAoDC,MAApD,CAArB;EACA,IAAAO,YAAA,EAAOK,YAAY,CAACC,QAAb,EAAP,EAAgCJ,EAAhC,CAAmCK,GAAnC,CAAuCX,cAAvC;AACD"}
|
package/package.json
CHANGED
|
@@ -1,59 +1,105 @@
|
|
|
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.4",
|
|
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 --reporter=text",
|
|
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 DEBUG=@natlibfi/* NODE_ENV=test nodemon -w src -w test-fixtures --exec 'clear && npm run test:dev'"
|
|
37
|
+
},
|
|
38
|
+
"dependencies": {
|
|
39
|
+
"@natlibfi/fixugen": "^1.0.2",
|
|
40
|
+
"@natlibfi/fixura": "^2.2.1",
|
|
41
|
+
"@natlibfi/marc-record": "^7.1.0-alpha.1",
|
|
42
|
+
"debug": "^4.3.4",
|
|
43
|
+
"normalize-diacritics": "^2.13.2"
|
|
44
|
+
},
|
|
45
|
+
"devDependencies": {
|
|
46
|
+
"@babel/cli": "^7.17.10",
|
|
47
|
+
"@babel/core": "^7.18.0",
|
|
48
|
+
"@babel/eslint-parser": "^7.17.0",
|
|
49
|
+
"@babel/preset-env": "^7.18.0",
|
|
50
|
+
"@babel/register": "^7.17.7",
|
|
51
|
+
"@natlibfi/eslint-config-melinda-backend": "^2.0.0",
|
|
52
|
+
"babel-plugin-istanbul": "^6.1.1",
|
|
53
|
+
"babel-plugin-rewire": "^1.2.0",
|
|
54
|
+
"chai": "^4.3.4",
|
|
55
|
+
"cross-env": "^7.0.3",
|
|
56
|
+
"eslint": "^8.16.0",
|
|
57
|
+
"mocha": "^10.0.0",
|
|
58
|
+
"nodemon": "^2.0.16",
|
|
59
|
+
"nyc": "^15.1.0"
|
|
60
|
+
},
|
|
61
|
+
"eslintConfig": {
|
|
62
|
+
"extends": [
|
|
63
|
+
"@natlibfi/melinda-backend"
|
|
64
|
+
]
|
|
65
|
+
},
|
|
66
|
+
"babel": {
|
|
67
|
+
"presets": [
|
|
68
|
+
[
|
|
69
|
+
"@babel/preset-env",
|
|
70
|
+
{
|
|
71
|
+
"targets": {
|
|
72
|
+
"node": "14"
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
]
|
|
76
|
+
],
|
|
77
|
+
"env": {
|
|
78
|
+
"test": {
|
|
79
|
+
"plugins": [
|
|
80
|
+
"rewire",
|
|
81
|
+
"istanbul"
|
|
82
|
+
]
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
"nyc": {
|
|
87
|
+
"exclude": [
|
|
88
|
+
"*/*.spec.js",
|
|
89
|
+
"*/**/*.spec.js"
|
|
90
|
+
],
|
|
91
|
+
"reporter": [
|
|
92
|
+
"lcov",
|
|
93
|
+
"html"
|
|
94
|
+
],
|
|
95
|
+
"require": [
|
|
96
|
+
"@babel/register"
|
|
97
|
+
],
|
|
98
|
+
"sourceMap": false,
|
|
99
|
+
"instrument": false,
|
|
100
|
+
"lines": 80,
|
|
101
|
+
"statements": 80,
|
|
102
|
+
"functions": 80,
|
|
103
|
+
"branches": 80
|
|
104
|
+
}
|
|
59
105
|
}
|
package/src/index.js
ADDED
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
/* eslint-disable no-unused-vars */
|
|
2
|
+
|
|
3
|
+
import {MarcRecord} from '@natlibfi/marc-record';
|
|
4
|
+
import createDebugLogger from 'debug';
|
|
5
|
+
|
|
6
|
+
export default ({
|
|
7
|
+
tagPattern,
|
|
8
|
+
compareTagsOnly = false,
|
|
9
|
+
compareWithoutIndicators = false,
|
|
10
|
+
subfieldsMustBeIdentical = true,
|
|
11
|
+
excludeSubfields = [],
|
|
12
|
+
dropSubfields = [],
|
|
13
|
+
copyUnless = [],
|
|
14
|
+
baseValidators = {subfieldValues: false},
|
|
15
|
+
sourceValidators = {subfieldValues: false}
|
|
16
|
+
}) => (base, source) => {
|
|
17
|
+
const baseRecord = new MarcRecord(base, baseValidators);
|
|
18
|
+
const sourceRecord = new MarcRecord(source, sourceValidators);
|
|
19
|
+
|
|
20
|
+
const debug = createDebugLogger('@natlibfi/marc-record-merge');
|
|
21
|
+
const debugOptions = createDebugLogger('@natlibfi/marc-record-merge:compare-options');
|
|
22
|
+
const debugCompare = createDebugLogger('@natlibfi/marc-record-merge:compare');
|
|
23
|
+
debugOptions(`Tag Pattern: ${tagPattern}`);
|
|
24
|
+
debugOptions(`Compare tags only: ${compareTagsOnly}`);
|
|
25
|
+
debugOptions(`Compare without indicators ${compareWithoutIndicators}`);
|
|
26
|
+
debugOptions(`Copy if identical: ${subfieldsMustBeIdentical}`);
|
|
27
|
+
debugOptions(`Exclude subfields: [${excludeSubfields}]`);
|
|
28
|
+
debugOptions(`Drop subfields [${dropSubfields}]`);
|
|
29
|
+
debugOptions(`Copy unless contains subfields: ${JSON.stringify(copyUnless)}`);
|
|
30
|
+
|
|
31
|
+
const baseFields = baseRecord.get(tagPattern);
|
|
32
|
+
const sourceFields = sourceRecord.get(tagPattern);
|
|
33
|
+
|
|
34
|
+
debug(`Base fields: `, baseFields);
|
|
35
|
+
debug(`Source fields: `, sourceFields);
|
|
36
|
+
|
|
37
|
+
const compareResultFields = compareFields(sourceFields, baseFields);
|
|
38
|
+
const droppedUnwantedSubfield = checkDropSubfields(compareResultFields);
|
|
39
|
+
const droppedUnwantedFields = checkCopyUnlessFields(droppedUnwantedSubfield);
|
|
40
|
+
debug('Fields to be copied');
|
|
41
|
+
debug(JSON.stringify(droppedUnwantedFields));
|
|
42
|
+
|
|
43
|
+
// Add fields to base;
|
|
44
|
+
droppedUnwantedFields.forEach(field => baseRecord.insertField(field));
|
|
45
|
+
return baseRecord.toObject();
|
|
46
|
+
//return copyFields(baseFields, sourceFields);
|
|
47
|
+
|
|
48
|
+
function compareFields(sourceFields, baseFields, uniqFields = []) {
|
|
49
|
+
const [sourceField, ...rest] = sourceFields;
|
|
50
|
+
if (sourceField === undefined) {
|
|
51
|
+
return uniqFields;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
if (baseFields.length === 0) {
|
|
55
|
+
return compareFields(rest, baseFields, [...uniqFields, sourceField]);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// Source and base are also compared for identicalness
|
|
59
|
+
// Non-identical fields are copied from source to base as duplicates
|
|
60
|
+
const sourceComapareField = createCompareField(sourceField);
|
|
61
|
+
const baseCompareFields = baseFields.map(baseField => createCompareField(baseField));
|
|
62
|
+
|
|
63
|
+
const unique = checkCompareFields(baseCompareFields, sourceComapareField);
|
|
64
|
+
|
|
65
|
+
debugCompare(`${JSON.stringify(sourceField)} ${unique ? 'is UNIQUE' : 'not UNIQUE'}`);
|
|
66
|
+
|
|
67
|
+
if (unique) {
|
|
68
|
+
return compareFields(rest, baseFields, [...uniqFields, sourceField]);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
return compareFields(rest, baseFields, uniqFields);
|
|
72
|
+
|
|
73
|
+
function checkCompareFields(baseCompareFields, sourceComapareField) {
|
|
74
|
+
const [baseCompareField, ...rest] = baseCompareFields;
|
|
75
|
+
if (baseCompareField === undefined) {
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
if (sourceComapareField.value !== baseCompareField.value) {
|
|
80
|
+
debugCompare(`Value is different ${sourceComapareField.value} !== ${baseCompareField.value}`);
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
if (sourceComapareField.ind1 !== baseCompareField.ind1) {
|
|
85
|
+
debugCompare(`Ind1 is different ${sourceComapareField.ind1} !== ${baseCompareField.ind1}`);
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
if (sourceComapareField.ind2 !== baseCompareField.ind2) {
|
|
90
|
+
debugCompare(`Ind2 is different ${sourceComapareField.ind2} !== ${baseCompareField.ind2}`);
|
|
91
|
+
return true;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
if ('subfields' in sourceComapareField) {
|
|
95
|
+
const allFound = checkSubfields(sourceComapareField.subfields, baseCompareField.subfields);
|
|
96
|
+
debugCompare(`Subfields are different ${!allFound}`);
|
|
97
|
+
return allFound ? false : checkCompareFields(rest, sourceComapareField);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function checkSubfields(sourceSubfields, baseSubfields) {
|
|
104
|
+
const foundSubs = sourceSubfields.filter(sSub => baseSubfields.some(bSub => sSub.code === bSub.code && sSub.value === bSub.value));
|
|
105
|
+
|
|
106
|
+
if (subfieldsMustBeIdentical) {
|
|
107
|
+
return foundSubs.length === sourceSubfields.length && foundSubs.length === baseSubfields.length;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
return foundSubs.length === sourceSubfields.length;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function createCompareField(field) {
|
|
115
|
+
if (compareTagsOnly) {
|
|
116
|
+
return {tag: field.tag};
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
if ('value' in field) {
|
|
120
|
+
return {tag: field.tag, value: field.value};
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
const [filteredField] = checkDropSubfields([field]);
|
|
124
|
+
|
|
125
|
+
const params = [
|
|
126
|
+
{name: 'tag', value: field.tag},
|
|
127
|
+
{name: 'ind1', value: compareWithoutIndicators ? undefined : field.ind1},
|
|
128
|
+
{name: 'ind2', value: compareWithoutIndicators ? undefined : field.ind2},
|
|
129
|
+
{name: 'subfields', value: createCompareSubfields(filteredField.subfields)}
|
|
130
|
+
].map(param => [param.name, param.value]);
|
|
131
|
+
|
|
132
|
+
return Object.fromEntries(params);
|
|
133
|
+
|
|
134
|
+
function createCompareSubfields(subfields) {
|
|
135
|
+
const nonExcludedSubfields = subfields.filter(sub => !excludeSubfields.some(code => code === sub.code));
|
|
136
|
+
const normalizedSubfields = nonExcludedSubfields.map(sub => ({code: sub.code, value: normalizeSubfieldValue(sub.value)}));
|
|
137
|
+
|
|
138
|
+
return normalizedSubfields;
|
|
139
|
+
|
|
140
|
+
function normalizeSubfieldValue(value) {
|
|
141
|
+
return value.toLowerCase().replace(/\s+/ug, '');
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
function checkDropSubfields(fields) {
|
|
147
|
+
if (dropSubfields.length > 0) {
|
|
148
|
+
return fields.map(field => ({...field, subfields: dropSubfieldsFunc(field.subfields)}))
|
|
149
|
+
.filter(field => field.subfields.length > 0);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
return fields;
|
|
153
|
+
|
|
154
|
+
function dropSubfieldsFunc(subfields) {
|
|
155
|
+
return subfields.filter(sub => { // eslint-disable-line
|
|
156
|
+
return !dropSubfields.some(({code, value = false, condition = false}) => {
|
|
157
|
+
if (code !== sub.code) {
|
|
158
|
+
return false;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
if (!condition && value) {
|
|
162
|
+
return value === sub.value;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
if (condition === 'unless' && value) {
|
|
166
|
+
return !new RegExp(value, 'u').test(sub.value);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
return true;
|
|
170
|
+
});
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
function checkCopyUnlessFields(fields) {
|
|
176
|
+
if (copyUnless.length > 0) {
|
|
177
|
+
return fields.filter(({subfields}) => copyUnless.some(filter => !subfields.some(sub => sub.code === filter.code && new RegExp(filter.value, 'u').test(sub.value))));
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
return fields;
|
|
181
|
+
}
|
|
182
|
+
};
|
|
183
|
+
|
|
184
|
+
// function copyFields() { //eslint-disable-line no-unused-vars
|
|
185
|
+
// const sourceTags = sourceFields.map(field => field.tag);
|
|
186
|
+
// sourceTags.forEach(tag => debug(`Comparing field ${tag}`));
|
|
187
|
+
|
|
188
|
+
// /*
|
|
189
|
+
// if (combine.length > 0) {
|
|
190
|
+
// debug(`*** NOW Copy options: ${tagPattern}, ${compareTagsOnly}, ${compareWithoutIndicators}, ${subfieldsMustBeIdentical}, [${combine}], [${excludeSubfields}], [${dropSubfields}]`);
|
|
191
|
+
// combine.forEach(row => debug(` ### combine ${row} <- `));
|
|
192
|
+
// return [];
|
|
193
|
+
// }
|
|
194
|
+
// */
|
|
195
|
+
|
|
196
|
+
// // If compareTagsOnly = true, only this part is run
|
|
197
|
+
// // The field is copied from source only if it is missing completely from base
|
|
198
|
+
// if (compareTagsOnly && baseFields.length === 0) {
|
|
199
|
+
// sourceTags.forEach(tag => debug(`Missing field ${tag} copied from source to base`));
|
|
200
|
+
// sourceFields.forEach(f => base.insertField(f));
|
|
201
|
+
// return true;
|
|
202
|
+
// }
|
|
203
|
+
|
|
204
|
+
// // If compareTagsOnly = false (default)
|
|
205
|
+
// // Source and base are also compared for identicalness
|
|
206
|
+
// // Non-identical fields are copied from source to base as duplicates
|
|
207
|
+
// if (!compareTagsOnly) {
|
|
208
|
+
// const filterMissing = function (sourceField) {
|
|
209
|
+
// if ('value' in sourceField) {
|
|
210
|
+
// debug(`Checking control field ${sourceField.tag} for identicalness`);
|
|
211
|
+
// return baseFields.some(isIdenticalControlField) === false;
|
|
212
|
+
// }
|
|
213
|
+
// if ('subfields' in sourceField) {
|
|
214
|
+
// debug(`Checking data field ${sourceField.tag} for identicalness`);
|
|
215
|
+
// return baseFields.some(isIdenticalDataField) === false;
|
|
216
|
+
// }
|
|
217
|
+
|
|
218
|
+
// function normalizeControlField(field) {
|
|
219
|
+
// return field.value.toLowerCase().replace(/\s+/u, '');
|
|
220
|
+
// }
|
|
221
|
+
|
|
222
|
+
// function isIdenticalControlField(baseField) {
|
|
223
|
+
// const normalizedBaseField = normalizeControlField(baseField);
|
|
224
|
+
// const normalizedSourceField = normalizeControlField(sourceField);
|
|
225
|
+
// return normalizedSourceField === normalizedBaseField;
|
|
226
|
+
// }
|
|
227
|
+
|
|
228
|
+
// function isIdenticalDataField(baseField) {
|
|
229
|
+
// // If excluded subfields have been defined for this field, they must be ignored first
|
|
230
|
+
// // (i.e. source and base fields are considered identical if all non-excluded subfields are identical)
|
|
231
|
+
// if (excludeSubfields.length > 0 &&
|
|
232
|
+
// sourceField.tag === baseField.tag &&
|
|
233
|
+
// sourceField.ind1 === baseField.ind1 &&
|
|
234
|
+
// sourceField.ind2 === baseField.ind2) {
|
|
235
|
+
// excludeSubfields.forEach(sub => debug(`Subfield ${sub} excluded from identicalness comparison`));
|
|
236
|
+
// // Compare only those subfields that are not excluded
|
|
237
|
+
// const baseSubsToCompare = baseField.subfields.filter(subfield => excludeSubfields.indexOf(subfield.code) === -1);
|
|
238
|
+
// return baseSubsToCompare.every(isIdenticalSubfield);
|
|
239
|
+
// }
|
|
240
|
+
// // If there are no excluded subfields (default case)
|
|
241
|
+
// if (sourceField.tag === baseField.tag &&
|
|
242
|
+
// sourceField.ind1 === baseField.ind1 &&
|
|
243
|
+
// sourceField.ind2 === baseField.ind2 &&
|
|
244
|
+
// sourceField.subfields.length === baseField.subfields.length) {
|
|
245
|
+
// return baseField.subfields.every(isIdenticalSubfield);
|
|
246
|
+
// }
|
|
247
|
+
// function normalizeSubfield(subfield) {
|
|
248
|
+
// return subfield.value.toLowerCase().replace(/\s+/u, '');
|
|
249
|
+
// }
|
|
250
|
+
// function isIdenticalSubfield(baseSub) {
|
|
251
|
+
// const normBaseSub = normalizeSubfield(baseSub);
|
|
252
|
+
// return sourceField.subfields.some(sourceSub => {
|
|
253
|
+
// const normSourceSub = normalizeSubfield(sourceSub);
|
|
254
|
+
// return normSourceSub === normBaseSub;
|
|
255
|
+
// });
|
|
256
|
+
// }
|
|
257
|
+
// }
|
|
258
|
+
// };
|
|
259
|
+
// // Search for fields missing from base
|
|
260
|
+
// const missingFields = sourceFields.filter(filterMissing);
|
|
261
|
+
// missingFields.forEach(f => base.insertField(f));
|
|
262
|
+
// if (missingFields.length > 0) {
|
|
263
|
+
// const missingTags = missingFields.map(field => field.tag);
|
|
264
|
+
// missingTags.forEach(tag => debug(`Field ${tag} copied from source to base`));
|
|
265
|
+
// return base;
|
|
266
|
+
// }
|
|
267
|
+
// if (missingFields.length === 0) {
|
|
268
|
+
// debug(`No missing fields found`);
|
|
269
|
+
// return base;
|
|
270
|
+
// }
|
|
271
|
+
// }
|
|
272
|
+
// debug(`No missing fields found`);
|
|
273
|
+
// return base;
|
|
274
|
+
// }
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import {expect} from 'chai';
|
|
2
|
+
import {READERS} from '@natlibfi/fixura';
|
|
3
|
+
import {MarcRecord} from '@natlibfi/marc-record';
|
|
4
|
+
import createReducer from './copy';
|
|
5
|
+
import generateTests from '@natlibfi/fixugen';
|
|
6
|
+
|
|
7
|
+
// import createDebugLogger from 'debug'; // <---
|
|
8
|
+
// const debug = createDebugLogger('@natlibfi/marc-record-merge/copy.spec.js'); // <---
|
|
9
|
+
|
|
10
|
+
generateTests({
|
|
11
|
+
callback,
|
|
12
|
+
path: [__dirname, '..', '..', 'test-fixtures', 'reducers', 'copy'],
|
|
13
|
+
useMetadataFile: true,
|
|
14
|
+
recurse: true,
|
|
15
|
+
fixura: {
|
|
16
|
+
reader: READERS.JSON,
|
|
17
|
+
failWhenNotFound: false
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
function callback({
|
|
22
|
+
getFixture,
|
|
23
|
+
tagPatternRegExp,
|
|
24
|
+
compareTagsOnly = false,
|
|
25
|
+
compareWithoutIndicators = false,
|
|
26
|
+
subfieldsMustBeIdentical = false,
|
|
27
|
+
copyUnless = undefined,
|
|
28
|
+
excludeSubfields = undefined,
|
|
29
|
+
dropSubfields = undefined,
|
|
30
|
+
disabled = false
|
|
31
|
+
}) {
|
|
32
|
+
if (disabled) {
|
|
33
|
+
console.log('TEST DISABLED!'); // eslint-disable-line no-console
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const base = new MarcRecord(getFixture('base.json'), {subfieldValues: false});
|
|
38
|
+
const source = new MarcRecord(getFixture('source.json'), {subfieldValues: false});
|
|
39
|
+
const tagPattern = new RegExp(tagPatternRegExp, 'u');
|
|
40
|
+
const expectedRecord = getFixture('merged.json');
|
|
41
|
+
|
|
42
|
+
const mergedRecord = createReducer({tagPattern, compareTagsOnly, compareWithoutIndicators, copyUnless, subfieldsMustBeIdentical, excludeSubfields, dropSubfields})(base, source);
|
|
43
|
+
//debug(`*** mergedRecord: `, mergedRecord); //<--
|
|
44
|
+
//debug(`*** mergedRecord,Strfy: `, JSON.stringify(mergedRecord.toObject())); //<--
|
|
45
|
+
//debug(`*** expectedRecord: `, expectedRecord); //<--
|
|
46
|
+
//debug(`*** expectedRecord,Strfy: `, JSON.stringify(expectedRecord)); //<--
|
|
47
|
+
expect(mergedRecord).to.eql(expectedRecord);
|
|
48
|
+
}
|