diff --git a/.editorconfig b/.editorconfig
deleted file mode 100644
index 1ed453a..0000000
--- a/.editorconfig
+++ /dev/null
@@ -1,10 +0,0 @@
-root = true
-
-[*]
-end_of_line = lf
-insert_final_newline = true
-
-[*.{js,json,yml}]
-charset = utf-8
-indent_style = space
-indent_size = 2
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
new file mode 100644
index 0000000..122a4d0
--- /dev/null
+++ b/.github/CODEOWNERS
@@ -0,0 +1,2 @@
+# With this line @NatLibFi/melinda-js-lead owns any files in this repository
+* @NatLibFi/melinda-js-lead
\ No newline at end of file
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
new file mode 100644
index 0000000..ed7fa26
--- /dev/null
+++ b/.github/dependabot.yml
@@ -0,0 +1,40 @@
+# NatLibFi/Melinda maintenance strategy
+# https://docs.github.com/en/code-security/supply-chain-security/keeping-your-dependencies-updated-automatically/configuration-options-for-dependency-updates
+
+version: 2
+updates:
+ # Maintain dependencies for GitHub Actions
+ - package-ecosystem: "github-actions"
+ directory: "/"
+ schedule:
+ interval: "daily"
+ time: "06:30"
+ timezone: "Europe/Helsinki"
+ target-branch: "dependencies"
+
+ # Minor updates to npm production dependencies daily
+ - package-ecosystem: "npm"
+ directory: "/"
+ schedule:
+ interval: "daily"
+ time: "06:45"
+ timezone: "Europe/Helsinki"
+ versioning-strategy: lockfile-only
+ allow:
+ - dependency-type: "production"
+ target-branch: "dependencies"
+
+ # Major updates to npm dependencies weekly @tuesday
+ # Not possible yet https://github.com/dependabot/dependabot-core/issues/1778
+ # - package-ecosystem: "npm"
+ # directory: "/"
+ # schedule:
+ # interval: "weekly"
+ # day: "tuesday"
+ # time: "07:00"
+ # timezone: "Europe/Helsinki"
+ # versioning-strategy: increase-if-necessary
+ # labels:
+ # - "npm major dependencies"
+ # reviewers:
+ # - "natlibfi/melinda-js-lead"
diff --git a/.github/workflows/melinda-node-tests.yml b/.github/workflows/melinda-node-tests.yml
new file mode 100644
index 0000000..19aabde
--- /dev/null
+++ b/.github/workflows/melinda-node-tests.yml
@@ -0,0 +1,60 @@
+# Melinda node tests
+
+name: Melinda node tests
+
+on: push
+
+jobs:
+ build-node-versions:
+ name: Node version matrix
+ runs-on: ubuntu-latest
+
+ strategy:
+ matrix:
+ node-version: [16.x, 18.x, 20.x]
+ # See supported Node.js release schedule at https://nodejs.org/en/about/releases/
+
+ steps:
+ - name: Checkout the code
+ uses: actions/checkout@v3
+ - name: Use Node.js ${{ matrix.node-version }}
+ uses: actions/setup-node@v3
+ with:
+ node-version: ${{ matrix.node-version }}
+ cache: 'npm'
+ env:
+ NPM_CONFIG_IGNORE_SCRIPTS: true
+ - run: npm audit --package-lock-only --production --audit-level=moderate
+ - run: npm ci
+ - run: npm test
+ - run: npm run build --if-present
+
+ njsscan:
+ name: Njsscan check
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout the code
+ uses: actions/checkout@v3
+ - name: nodejsscan scan
+ id: njsscan
+ uses: ajinabraham/njsscan-action@master
+ with:
+ args: '.'
+
+ publish:
+ runs-on: ubuntu-latest
+ needs: [build-node-versions, njsscan]
+ if: contains(github.ref, 'refs/tags/')
+
+ steps:
+ - uses: actions/checkout@v3
+ # Setup .npmrc file to publish to npm
+ - uses: actions/setup-node@v3
+ with:
+ node-version: '18.x'
+ registry-url: 'https://registry.npmjs.org'
+ - run: npm ci
+ - run: npm publish
+ env:
+ NODE_AUTH_TOKEN: ${{ secrets.MARC_RECORD_MERGE_JS_NPM_TOKEN }}
diff --git a/.gitignore b/.gitignore
index 850d7fe..ff1691f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,7 @@
+npm-debug.log
node_modules
+dist
coverage
-npm-debug.log
-test/browser/main.js
+.nyc_output
+.vscode/launch.json
+.DS_Store
diff --git a/.istanbul.yml b/.istanbul.yml
deleted file mode 100644
index aaca3eb..0000000
--- a/.istanbul.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-check:
- each:
- statements: 88
- lines: 88
- branches: 88
- functions: 88
diff --git a/.jshintignore b/.jshintignore
deleted file mode 100644
index 7826450..0000000
--- a/.jshintignore
+++ /dev/null
@@ -1,2 +0,0 @@
-node_modules/**
-coverage/**
\ No newline at end of file
diff --git a/.jshintrc b/.jshintrc
deleted file mode 100644
index 1b3086c..0000000
--- a/.jshintrc
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "laxbreak": true
-}
\ No newline at end of file
diff --git a/.npmignore b/.npmignore
index c9b306b..688ef23 100644
--- a/.npmignore
+++ b/.npmignore
@@ -1,2 +1,2 @@
-coverage
-test/browser/main.js
+npm-debug.log
+node_modules
\ No newline at end of file
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 91b4130..0000000
--- a/.travis.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-language: node_js
-node_js:
- - "0.12"
- - "7"
-before_script:
- - if [ "$TRAVIS_NODE_VERSION" == "7" ]; then npm install karma-phantomjs-launcher; fi
-script:
- - if [ "$TRAVIS_NODE_VERSION" == "0.12" ]; then npm run check; fi
- - if [ "$TRAVIS_NODE_VERSION" == "7" ]; then npm run test-browser; fi
-
-after_script:
- - codeclimate-test-reporter < coverage/lcov.info
-addons:
- code_climate:
- repo_token:
- secure: "cFaqGqnzXG2aNUA/vNxK3qJQrgpQg6kzD5BqI3RRhbjj4eF0yPONzcvys3bBEWdyxdVY6fRVGgPsWrC0F/lmuP4P8fZVli5nStbkHeMq8UxAh2suqx5hqGfCYyF7Xqz4Wx3bzg31iDoosi3wNV3XVSZE+g0Z2Eh2bW5/q/heAbE="
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..0061452
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2022-current University of Helsinki (National Library of Finland)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/LICENSE.txt b/LICENSE.txt
deleted file mode 100644
index dba13ed..0000000
--- a/LICENSE.txt
+++ /dev/null
@@ -1,661 +0,0 @@
- GNU AFFERO GENERAL PUBLIC LICENSE
- Version 3, 19 November 2007
-
- Copyright (C) 2007 Free Software Foundation, Inc.
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- Preamble
-
- The GNU Affero General Public License is a free, copyleft license for
-software and other kinds of works, specifically designed to ensure
-cooperation with the community in the case of network server software.
-
- The licenses for most software and other practical works are designed
-to take away your freedom to share and change the works. By contrast,
-our General Public Licenses are intended to guarantee your freedom to
-share and change all versions of a program--to make sure it remains free
-software for all its users.
-
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-them if you wish), that you receive source code or can get it if you
-want it, that you can change the software or use pieces of it in new
-free programs, and that you know you can do these things.
-
- Developers that use our General Public Licenses protect your rights
-with two steps: (1) assert copyright on the software, and (2) offer
-you this License which gives you legal permission to copy, distribute
-and/or modify the software.
-
- A secondary benefit of defending all users' freedom is that
-improvements made in alternate versions of the program, if they
-receive widespread use, become available for other developers to
-incorporate. Many developers of free software are heartened and
-encouraged by the resulting cooperation. However, in the case of
-software used on network servers, this result may fail to come about.
-The GNU General Public License permits making a modified version and
-letting the public access it on a server without ever releasing its
-source code to the public.
-
- The GNU Affero General Public License is designed specifically to
-ensure that, in such cases, the modified source code becomes available
-to the community. It requires the operator of a network server to
-provide the source code of the modified version running there to the
-users of that server. Therefore, public use of a modified version, on
-a publicly accessible server, gives the public access to the source
-code of the modified version.
-
- An older license, called the Affero General Public License and
-published by Affero, was designed to accomplish similar goals. This is
-a different license, not a version of the Affero GPL, but Affero has
-released a new version of the Affero GPL which permits relicensing under
-this license.
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
- TERMS AND CONDITIONS
-
- 0. Definitions.
-
- "This License" refers to version 3 of the GNU Affero General Public License.
-
- "Copyright" also means copyright-like laws that apply to other kinds of
-works, such as semiconductor masks.
-
- "The Program" refers to any copyrightable work licensed under this
-License. Each licensee is addressed as "you". "Licensees" and
-"recipients" may be individuals or organizations.
-
- To "modify" a work means to copy from or adapt all or part of the work
-in a fashion requiring copyright permission, other than the making of an
-exact copy. The resulting work is called a "modified version" of the
-earlier work or a work "based on" the earlier work.
-
- A "covered work" means either the unmodified Program or a work based
-on the Program.
-
- To "propagate" a work means to do anything with it that, without
-permission, would make you directly or secondarily liable for
-infringement under applicable copyright law, except executing it on a
-computer or modifying a private copy. Propagation includes copying,
-distribution (with or without modification), making available to the
-public, and in some countries other activities as well.
-
- To "convey" a work means any kind of propagation that enables other
-parties to make or receive copies. Mere interaction with a user through
-a computer network, with no transfer of a copy, is not conveying.
-
- An interactive user interface displays "Appropriate Legal Notices"
-to the extent that it includes a convenient and prominently visible
-feature that (1) displays an appropriate copyright notice, and (2)
-tells the user that there is no warranty for the work (except to the
-extent that warranties are provided), that licensees may convey the
-work under this License, and how to view a copy of this License. If
-the interface presents a list of user commands or options, such as a
-menu, a prominent item in the list meets this criterion.
-
- 1. Source Code.
-
- The "source code" for a work means the preferred form of the work
-for making modifications to it. "Object code" means any non-source
-form of a work.
-
- A "Standard Interface" means an interface that either is an official
-standard defined by a recognized standards body, or, in the case of
-interfaces specified for a particular programming language, one that
-is widely used among developers working in that language.
-
- The "System Libraries" of an executable work include anything, other
-than the work as a whole, that (a) is included in the normal form of
-packaging a Major Component, but which is not part of that Major
-Component, and (b) serves only to enable use of the work with that
-Major Component, or to implement a Standard Interface for which an
-implementation is available to the public in source code form. A
-"Major Component", in this context, means a major essential component
-(kernel, window system, and so on) of the specific operating system
-(if any) on which the executable work runs, or a compiler used to
-produce the work, or an object code interpreter used to run it.
-
- The "Corresponding Source" for a work in object code form means all
-the source code needed to generate, install, and (for an executable
-work) run the object code and to modify the work, including scripts to
-control those activities. However, it does not include the work's
-System Libraries, or general-purpose tools or generally available free
-programs which are used unmodified in performing those activities but
-which are not part of the work. For example, Corresponding Source
-includes interface definition files associated with source files for
-the work, and the source code for shared libraries and dynamically
-linked subprograms that the work is specifically designed to require,
-such as by intimate data communication or control flow between those
-subprograms and other parts of the work.
-
- The Corresponding Source need not include anything that users
-can regenerate automatically from other parts of the Corresponding
-Source.
-
- The Corresponding Source for a work in source code form is that
-same work.
-
- 2. Basic Permissions.
-
- All rights granted under this License are granted for the term of
-copyright on the Program, and are irrevocable provided the stated
-conditions are met. This License explicitly affirms your unlimited
-permission to run the unmodified Program. The output from running a
-covered work is covered by this License only if the output, given its
-content, constitutes a covered work. This License acknowledges your
-rights of fair use or other equivalent, as provided by copyright law.
-
- You may make, run and propagate covered works that you do not
-convey, without conditions so long as your license otherwise remains
-in force. You may convey covered works to others for the sole purpose
-of having them make modifications exclusively for you, or provide you
-with facilities for running those works, provided that you comply with
-the terms of this License in conveying all material for which you do
-not control copyright. Those thus making or running the covered works
-for you must do so exclusively on your behalf, under your direction
-and control, on terms that prohibit them from making any copies of
-your copyrighted material outside their relationship with you.
-
- Conveying under any other circumstances is permitted solely under
-the conditions stated below. Sublicensing is not allowed; section 10
-makes it unnecessary.
-
- 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
-
- No covered work shall be deemed part of an effective technological
-measure under any applicable law fulfilling obligations under article
-11 of the WIPO copyright treaty adopted on 20 December 1996, or
-similar laws prohibiting or restricting circumvention of such
-measures.
-
- When you convey a covered work, you waive any legal power to forbid
-circumvention of technological measures to the extent such circumvention
-is effected by exercising rights under this License with respect to
-the covered work, and you disclaim any intention to limit operation or
-modification of the work as a means of enforcing, against the work's
-users, your or third parties' legal rights to forbid circumvention of
-technological measures.
-
- 4. Conveying Verbatim Copies.
-
- You may convey verbatim copies of the Program's source code as you
-receive it, in any medium, provided that you conspicuously and
-appropriately publish on each copy an appropriate copyright notice;
-keep intact all notices stating that this License and any
-non-permissive terms added in accord with section 7 apply to the code;
-keep intact all notices of the absence of any warranty; and give all
-recipients a copy of this License along with the Program.
-
- You may charge any price or no price for each copy that you convey,
-and you may offer support or warranty protection for a fee.
-
- 5. Conveying Modified Source Versions.
-
- You may convey a work based on the Program, or the modifications to
-produce it from the Program, in the form of source code under the
-terms of section 4, provided that you also meet all of these conditions:
-
- a) The work must carry prominent notices stating that you modified
- it, and giving a relevant date.
-
- b) The work must carry prominent notices stating that it is
- released under this License and any conditions added under section
- 7. This requirement modifies the requirement in section 4 to
- "keep intact all notices".
-
- c) You must license the entire work, as a whole, under this
- License to anyone who comes into possession of a copy. This
- License will therefore apply, along with any applicable section 7
- additional terms, to the whole of the work, and all its parts,
- regardless of how they are packaged. This License gives no
- permission to license the work in any other way, but it does not
- invalidate such permission if you have separately received it.
-
- d) If the work has interactive user interfaces, each must display
- Appropriate Legal Notices; however, if the Program has interactive
- interfaces that do not display Appropriate Legal Notices, your
- work need not make them do so.
-
- A compilation of a covered work with other separate and independent
-works, which are not by their nature extensions of the covered work,
-and which are not combined with it such as to form a larger program,
-in or on a volume of a storage or distribution medium, is called an
-"aggregate" if the compilation and its resulting copyright are not
-used to limit the access or legal rights of the compilation's users
-beyond what the individual works permit. Inclusion of a covered work
-in an aggregate does not cause this License to apply to the other
-parts of the aggregate.
-
- 6. Conveying Non-Source Forms.
-
- You may convey a covered work in object code form under the terms
-of sections 4 and 5, provided that you also convey the
-machine-readable Corresponding Source under the terms of this License,
-in one of these ways:
-
- a) Convey the object code in, or embodied in, a physical product
- (including a physical distribution medium), accompanied by the
- Corresponding Source fixed on a durable physical medium
- customarily used for software interchange.
-
- b) Convey the object code in, or embodied in, a physical product
- (including a physical distribution medium), accompanied by a
- written offer, valid for at least three years and valid for as
- long as you offer spare parts or customer support for that product
- model, to give anyone who possesses the object code either (1) a
- copy of the Corresponding Source for all the software in the
- product that is covered by this License, on a durable physical
- medium customarily used for software interchange, for a price no
- more than your reasonable cost of physically performing this
- conveying of source, or (2) access to copy the
- Corresponding Source from a network server at no charge.
-
- c) Convey individual copies of the object code with a copy of the
- written offer to provide the Corresponding Source. This
- alternative is allowed only occasionally and noncommercially, and
- only if you received the object code with such an offer, in accord
- with subsection 6b.
-
- d) Convey the object code by offering access from a designated
- place (gratis or for a charge), and offer equivalent access to the
- Corresponding Source in the same way through the same place at no
- further charge. You need not require recipients to copy the
- Corresponding Source along with the object code. If the place to
- copy the object code is a network server, the Corresponding Source
- may be on a different server (operated by you or a third party)
- that supports equivalent copying facilities, provided you maintain
- clear directions next to the object code saying where to find the
- Corresponding Source. Regardless of what server hosts the
- Corresponding Source, you remain obligated to ensure that it is
- available for as long as needed to satisfy these requirements.
-
- e) Convey the object code using peer-to-peer transmission, provided
- you inform other peers where the object code and Corresponding
- Source of the work are being offered to the general public at no
- charge under subsection 6d.
-
- A separable portion of the object code, whose source code is excluded
-from the Corresponding Source as a System Library, need not be
-included in conveying the object code work.
-
- A "User Product" is either (1) a "consumer product", which means any
-tangible personal property which is normally used for personal, family,
-or household purposes, or (2) anything designed or sold for incorporation
-into a dwelling. In determining whether a product is a consumer product,
-doubtful cases shall be resolved in favor of coverage. For a particular
-product received by a particular user, "normally used" refers to a
-typical or common use of that class of product, regardless of the status
-of the particular user or of the way in which the particular user
-actually uses, or expects or is expected to use, the product. A product
-is a consumer product regardless of whether the product has substantial
-commercial, industrial or non-consumer uses, unless such uses represent
-the only significant mode of use of the product.
-
- "Installation Information" for a User Product means any methods,
-procedures, authorization keys, or other information required to install
-and execute modified versions of a covered work in that User Product from
-a modified version of its Corresponding Source. The information must
-suffice to ensure that the continued functioning of the modified object
-code is in no case prevented or interfered with solely because
-modification has been made.
-
- If you convey an object code work under this section in, or with, or
-specifically for use in, a User Product, and the conveying occurs as
-part of a transaction in which the right of possession and use of the
-User Product is transferred to the recipient in perpetuity or for a
-fixed term (regardless of how the transaction is characterized), the
-Corresponding Source conveyed under this section must be accompanied
-by the Installation Information. But this requirement does not apply
-if neither you nor any third party retains the ability to install
-modified object code on the User Product (for example, the work has
-been installed in ROM).
-
- The requirement to provide Installation Information does not include a
-requirement to continue to provide support service, warranty, or updates
-for a work that has been modified or installed by the recipient, or for
-the User Product in which it has been modified or installed. Access to a
-network may be denied when the modification itself materially and
-adversely affects the operation of the network or violates the rules and
-protocols for communication across the network.
-
- Corresponding Source conveyed, and Installation Information provided,
-in accord with this section must be in a format that is publicly
-documented (and with an implementation available to the public in
-source code form), and must require no special password or key for
-unpacking, reading or copying.
-
- 7. Additional Terms.
-
- "Additional permissions" are terms that supplement the terms of this
-License by making exceptions from one or more of its conditions.
-Additional permissions that are applicable to the entire Program shall
-be treated as though they were included in this License, to the extent
-that they are valid under applicable law. If additional permissions
-apply only to part of the Program, that part may be used separately
-under those permissions, but the entire Program remains governed by
-this License without regard to the additional permissions.
-
- When you convey a copy of a covered work, you may at your option
-remove any additional permissions from that copy, or from any part of
-it. (Additional permissions may be written to require their own
-removal in certain cases when you modify the work.) You may place
-additional permissions on material, added by you to a covered work,
-for which you have or can give appropriate copyright permission.
-
- Notwithstanding any other provision of this License, for material you
-add to a covered work, you may (if authorized by the copyright holders of
-that material) supplement the terms of this License with terms:
-
- a) Disclaiming warranty or limiting liability differently from the
- terms of sections 15 and 16 of this License; or
-
- b) Requiring preservation of specified reasonable legal notices or
- author attributions in that material or in the Appropriate Legal
- Notices displayed by works containing it; or
-
- c) Prohibiting misrepresentation of the origin of that material, or
- requiring that modified versions of such material be marked in
- reasonable ways as different from the original version; or
-
- d) Limiting the use for publicity purposes of names of licensors or
- authors of the material; or
-
- e) Declining to grant rights under trademark law for use of some
- trade names, trademarks, or service marks; or
-
- f) Requiring indemnification of licensors and authors of that
- material by anyone who conveys the material (or modified versions of
- it) with contractual assumptions of liability to the recipient, for
- any liability that these contractual assumptions directly impose on
- those licensors and authors.
-
- All other non-permissive additional terms are considered "further
-restrictions" within the meaning of section 10. If the Program as you
-received it, or any part of it, contains a notice stating that it is
-governed by this License along with a term that is a further
-restriction, you may remove that term. If a license document contains
-a further restriction but permits relicensing or conveying under this
-License, you may add to a covered work material governed by the terms
-of that license document, provided that the further restriction does
-not survive such relicensing or conveying.
-
- If you add terms to a covered work in accord with this section, you
-must place, in the relevant source files, a statement of the
-additional terms that apply to those files, or a notice indicating
-where to find the applicable terms.
-
- Additional terms, permissive or non-permissive, may be stated in the
-form of a separately written license, or stated as exceptions;
-the above requirements apply either way.
-
- 8. Termination.
-
- You may not propagate or modify a covered work except as expressly
-provided under this License. Any attempt otherwise to propagate or
-modify it is void, and will automatically terminate your rights under
-this License (including any patent licenses granted under the third
-paragraph of section 11).
-
- However, if you cease all violation of this License, then your
-license from a particular copyright holder is reinstated (a)
-provisionally, unless and until the copyright holder explicitly and
-finally terminates your license, and (b) permanently, if the copyright
-holder fails to notify you of the violation by some reasonable means
-prior to 60 days after the cessation.
-
- Moreover, your license from a particular copyright holder is
-reinstated permanently if the copyright holder notifies you of the
-violation by some reasonable means, this is the first time you have
-received notice of violation of this License (for any work) from that
-copyright holder, and you cure the violation prior to 30 days after
-your receipt of the notice.
-
- Termination of your rights under this section does not terminate the
-licenses of parties who have received copies or rights from you under
-this License. If your rights have been terminated and not permanently
-reinstated, you do not qualify to receive new licenses for the same
-material under section 10.
-
- 9. Acceptance Not Required for Having Copies.
-
- You are not required to accept this License in order to receive or
-run a copy of the Program. Ancillary propagation of a covered work
-occurring solely as a consequence of using peer-to-peer transmission
-to receive a copy likewise does not require acceptance. However,
-nothing other than this License grants you permission to propagate or
-modify any covered work. These actions infringe copyright if you do
-not accept this License. Therefore, by modifying or propagating a
-covered work, you indicate your acceptance of this License to do so.
-
- 10. Automatic Licensing of Downstream Recipients.
-
- Each time you convey a covered work, the recipient automatically
-receives a license from the original licensors, to run, modify and
-propagate that work, subject to this License. You are not responsible
-for enforcing compliance by third parties with this License.
-
- An "entity transaction" is a transaction transferring control of an
-organization, or substantially all assets of one, or subdividing an
-organization, or merging organizations. If propagation of a covered
-work results from an entity transaction, each party to that
-transaction who receives a copy of the work also receives whatever
-licenses to the work the party's predecessor in interest had or could
-give under the previous paragraph, plus a right to possession of the
-Corresponding Source of the work from the predecessor in interest, if
-the predecessor has it or can get it with reasonable efforts.
-
- You may not impose any further restrictions on the exercise of the
-rights granted or affirmed under this License. For example, you may
-not impose a license fee, royalty, or other charge for exercise of
-rights granted under this License, and you may not initiate litigation
-(including a cross-claim or counterclaim in a lawsuit) alleging that
-any patent claim is infringed by making, using, selling, offering for
-sale, or importing the Program or any portion of it.
-
- 11. Patents.
-
- A "contributor" is a copyright holder who authorizes use under this
-License of the Program or a work on which the Program is based. The
-work thus licensed is called the contributor's "contributor version".
-
- A contributor's "essential patent claims" are all patent claims
-owned or controlled by the contributor, whether already acquired or
-hereafter acquired, that would be infringed by some manner, permitted
-by this License, of making, using, or selling its contributor version,
-but do not include claims that would be infringed only as a
-consequence of further modification of the contributor version. For
-purposes of this definition, "control" includes the right to grant
-patent sublicenses in a manner consistent with the requirements of
-this License.
-
- Each contributor grants you a non-exclusive, worldwide, royalty-free
-patent license under the contributor's essential patent claims, to
-make, use, sell, offer for sale, import and otherwise run, modify and
-propagate the contents of its contributor version.
-
- In the following three paragraphs, a "patent license" is any express
-agreement or commitment, however denominated, not to enforce a patent
-(such as an express permission to practice a patent or covenant not to
-sue for patent infringement). To "grant" such a patent license to a
-party means to make such an agreement or commitment not to enforce a
-patent against the party.
-
- If you convey a covered work, knowingly relying on a patent license,
-and the Corresponding Source of the work is not available for anyone
-to copy, free of charge and under the terms of this License, through a
-publicly available network server or other readily accessible means,
-then you must either (1) cause the Corresponding Source to be so
-available, or (2) arrange to deprive yourself of the benefit of the
-patent license for this particular work, or (3) arrange, in a manner
-consistent with the requirements of this License, to extend the patent
-license to downstream recipients. "Knowingly relying" means you have
-actual knowledge that, but for the patent license, your conveying the
-covered work in a country, or your recipient's use of the covered work
-in a country, would infringe one or more identifiable patents in that
-country that you have reason to believe are valid.
-
- If, pursuant to or in connection with a single transaction or
-arrangement, you convey, or propagate by procuring conveyance of, a
-covered work, and grant a patent license to some of the parties
-receiving the covered work authorizing them to use, propagate, modify
-or convey a specific copy of the covered work, then the patent license
-you grant is automatically extended to all recipients of the covered
-work and works based on it.
-
- A patent license is "discriminatory" if it does not include within
-the scope of its coverage, prohibits the exercise of, or is
-conditioned on the non-exercise of one or more of the rights that are
-specifically granted under this License. You may not convey a covered
-work if you are a party to an arrangement with a third party that is
-in the business of distributing software, under which you make payment
-to the third party based on the extent of your activity of conveying
-the work, and under which the third party grants, to any of the
-parties who would receive the covered work from you, a discriminatory
-patent license (a) in connection with copies of the covered work
-conveyed by you (or copies made from those copies), or (b) primarily
-for and in connection with specific products or compilations that
-contain the covered work, unless you entered into that arrangement,
-or that patent license was granted, prior to 28 March 2007.
-
- Nothing in this License shall be construed as excluding or limiting
-any implied license or other defenses to infringement that may
-otherwise be available to you under applicable patent law.
-
- 12. No Surrender of Others' Freedom.
-
- If conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot convey a
-covered work so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you may
-not convey it at all. For example, if you agree to terms that obligate you
-to collect a royalty for further conveying from those to whom you convey
-the Program, the only way you could satisfy both those terms and this
-License would be to refrain entirely from conveying the Program.
-
- 13. Remote Network Interaction; Use with the GNU General Public License.
-
- Notwithstanding any other provision of this License, if you modify the
-Program, your modified version must prominently offer all users
-interacting with it remotely through a computer network (if your version
-supports such interaction) an opportunity to receive the Corresponding
-Source of your version by providing access to the Corresponding Source
-from a network server at no charge, through some standard or customary
-means of facilitating copying of software. This Corresponding Source
-shall include the Corresponding Source for any work covered by version 3
-of the GNU General Public License that is incorporated pursuant to the
-following paragraph.
-
- Notwithstanding any other provision of this License, you have
-permission to link or combine any covered work with a work licensed
-under version 3 of the GNU General Public License into a single
-combined work, and to convey the resulting work. The terms of this
-License will continue to apply to the part which is the covered work,
-but the work with which it is combined will remain governed by version
-3 of the GNU General Public License.
-
- 14. Revised Versions of this License.
-
- The Free Software Foundation may publish revised and/or new versions of
-the GNU Affero General Public License from time to time. Such new versions
-will be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
- Each version is given a distinguishing version number. If the
-Program specifies that a certain numbered version of the GNU Affero General
-Public License "or any later version" applies to it, you have the
-option of following the terms and conditions either of that numbered
-version or of any later version published by the Free Software
-Foundation. If the Program does not specify a version number of the
-GNU Affero General Public License, you may choose any version ever published
-by the Free Software Foundation.
-
- If the Program specifies that a proxy can decide which future
-versions of the GNU Affero General Public License can be used, that proxy's
-public statement of acceptance of a version permanently authorizes you
-to choose that version for the Program.
-
- Later license versions may give you additional or different
-permissions. However, no additional obligations are imposed on any
-author or copyright holder as a result of your choosing to follow a
-later version.
-
- 15. Disclaimer of Warranty.
-
- THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
-APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
-HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
-OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
-THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
-IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
-ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. Limitation of Liability.
-
- IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
-THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
-GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
-USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
-DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
-PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
-EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGES.
-
- 17. Interpretation of Sections 15 and 16.
-
- If the disclaimer of warranty and limitation of liability provided
-above cannot be given local legal effect according to their terms,
-reviewing courts shall apply local law that most closely approximates
-an absolute waiver of all civil liability in connection with the
-Program, unless a warranty or assumption of liability accompanies a
-copy of the Program in return for a fee.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Programs
-
- If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
- To do so, attach the following notices to the program. It is safest
-to attach them to the start of each source file to most effectively
-state the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-
- Copyright (C)
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU Affero General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see .
-
-Also add information on how to contact you by electronic and paper mail.
-
- If your software can interact with users remotely through a computer
-network, you should also make sure that it provides a way for users to
-get its source. For example, if your program is a web application, its
-interface could display a "Source" link that leads users to an archive
-of the code. There are many ways you could offer source, and different
-solutions will be better for different programs; see section 13 for the
-specific requirements.
-
- You should also get your employer (if you work as a programmer) or school,
-if any, to sign a "copyright disclaimer" for the program, if necessary.
-For more information on this, and how to apply and follow the GNU AGPL, see
- .
diff --git a/README.md b/README.md
index 6385035..3895847 100644
--- a/README.md
+++ b/README.md
@@ -1,283 +1,131 @@
-# MARC record merge [![NPM Version](https://img.shields.io/npm/v/@natlibfi/marc-record-merge.svg)](https://npmjs.org/package/marc-record-merge) [![Build Status](https://travis-ci.org/NatLibFi/marc-record-merge.svg)](https://travis-ci.org/NatLibFi/marc-record-merge) [![Test Coverage](https://codeclimate.com/github/NatLibFi/marc-record-merge/badges/coverage.svg)](https://codeclimate.com/github/NatLibFi/marc-record-merge/coverage)
+# Merge MARC records [![NPM Version](https://img.shields.io/npm/v/@natlibfi/marc-record-merge.svg)](https://npmjs.org/package/@natlibfi/marc-record-merge)
-A configurable Javascript module for merging [MARC](https://en.wikipedia.org/wiki/MARC_standards) records.
+Merge MARC records
-## Installation
+## Usage
+### COPY
-Clone the sources and install the package (In the source directory) on command line using `npm`:
+Chosing fields for reducer:
+```
+const copyReducerConfigs = [
+ {tagPattern: /010/u},
+ {tagPattern: /010|020/u},
+ {tagPattern: new RegExp('010', 'u')},
+ {tagPattern: new RegExp(String((/^(?010|020$)/u').source))},
+ ]
+```
-```sh
-npm install
+### compareTagsOnly (Defaults false)
+```
+{tagPattern: /010/u, compareTagsOnly: false}
```
-## Testing
+If base has field with that tag source field is ignored
+
+### doNotCopyIfFieldPresent (Defaults false)
+```
+{tagPattern: /010/u, doNotCopyIfFieldPresent: "^011$"}
+```
-Run the following NPM script to lint, test and check coverage of the code:
+If base has field with that tag 011 source field is ignored
-```javascript
+### compareWithoutIndicators (Defaults false)
+```
+{tagPattern: /010/u, compareWithoutIndicators: false}
+```
-npm run check
+When base and source fields are compared, indicator differences are ignored
+### compareWithoutTag (Defaults false)
+```
+{tagPattern: /^(100|700)$/u, compareWithoutTag: false}
+{tagPattern: /^(100|700)$/u, compareWithoutTag: false, swapTag: [{"from": "^100$", "to": "700"}]}
```
-To run browser test run following npm commands:
+When base and source fields are compared, tag differences are ignored
+### subfieldsMustBeIdentical (Defaults true)
```
-npm install karma-phantomjs-launcher
-npm run test-browser
+{tagPattern: /010/u, subfieldsMustBeIdentical: true}
```
-## Usage
+If source subfields are subset of base subfields this option says if it is copied
+| subfieldsMustBeIdentical | base | source | copy |
+|--------------------------|---------------|---------------|-------|
+| true or false | $a foo | $a foo | false |
+| true or false | $a foo | $b bar | true |
+| true | $a foo | $a foo,$b bar | true |
+| false | $a foo | $a foo,$b bar | true |
+| true | $a foo,$b bar | $a foo | true |
+| false | $a foo,$b bar | $a foo | false |
+
+### excludeSubfields (Defaults [ ])
+```
+{tagPattern: /010/u, excludeSubfields: ['a']}
+```
-The module returns a factory function that takes configuration object as the first (mandatory) argument. The second argument (optional) is an object specifying plugin functions. The factory returns a function that takes two MARC records (Instances of [marc-record-js](https://github.com/petuomin/marc-record-js)) as arguments. The first one is the preferred record which will be used as a base records (All fields are taken from this record unless otherwise specified).
+When base and source fields are compared, excluded subfields are ignored
-### Node.js
-```js
-var mergeRecords = require('marc-record-merge')(config),
-record_merged = mergeRecords(record_preferred, record_other);
+### swapTag (Defaults [ ])
+```
+{tagPattern: /^100$/u, swapTag: [{"from": "^100$", "to": "700"}]}
+{tagPattern: /^(100|700)$/u, compareWithoutTag: false, swapTag: [{"from": "^100$", "to": "700"}]}
```
-### AMD
-```js
-define(['marc-record-merge'], function(mergeFactory) {
+When fields are copied, tags are swapped. From is Regexp filter and to is string value.
- var mergeRecords = mergeFactory(config),
- record_merged = mergeRecords(record_preferred, record_other);
+### swapSubfieldCode (Defaults [ ])
+```
+{tagPattern: /010/u, swapSubfieldCode: [{"from": "a", "to": "b"}]}
+```
-});
+When source fields are copied, subfields are checkked and if subfield.code match to 'from' value is that code swapped to 'to' value
+
+### dropSubfields (Defaults [ ])
+```
+{tagPattern: /010/u, dropSubfields: [{"code": "9"}]}
```
+Drops subfields 9's from all fields tagged 010
-### Browser globals
-```js
-var mergeRecords = mergeMarcRecordsFactory(config),
-record_merged = mergeRecords(record_preferred, record_other);
```
+{tagPattern: /010/u, dropSubfields: [{"code": "9", "value": "FENNI"}]}
+```
+Drops subfields 9's that have "FENNI" from all fields tagged 010
-## Configuration
-
-The configuration object is a document conforming to the [schema](https://github.com/natlibfi/marc-record-merge/blob/master/resources/configuration-schema.json). The document looks like this:
-
-```js
-{
- "fields": {
- "005": {
- "action": "controlfield"
- },
- "008": {
- "action": "mergeControlfield",
- "options": {
- "actions": [
- {
- "formats": ["BK", "CF", "CR", "MU", "MX", "VM", "MP"],
- "range": [15, 17],
- "significantCaret": false,
- "type": "selectNonEmpty"
- },
- {
- "formats": ["BK", "CF", "CR", "MU", "MX", "VM", "MP"],
- "range": [35, 37],
- "significantCaret": false,
- "type": "selectNonEmpty"
- },
- {
- "formats": ["BK"],
- "range": [18, 21],
- "significantCaret": true,
- "type": "combine"
- },
- {
- "formats": ["BK"],
- "range": [29, 29],
- "significantCaret": false,
- "type": "selectNonEmpty"
- }
- ]
- }
- },
- "7..": {
- "action": "copy",
- "options": {
- "compareWithoutIndicators": true
- }
- },
-
-
- }
-}
```
-
-Each property of **fields** is a MARC field name or pattern (*..5*, *700*). The value of the **field** property is an object which must contain a **action** property. Action-specific options are defined in **options** property.
-
-The specified action is executed for each field in the other record that matches the field tag pattern.
-
-### Predefined actions
-
-**controlfield**: Copy missing control fields from the other record.
-
-**mergeControlfield**: Merge controlfields. The rules are set using options:
-- _**formats**_: Array of formats to apply the rule. Available formats: `["BK", "CF", "CR", "MU", "MX", "VM", "MP"]`
-- _**range**_: character range of the controlfield fragment (start, end). One character range requires same number in both.
-- _**significantCaret**_: whether the ^ is significant or not.
-- _**type**_: either `combine` or `selectNonEmpty`. `selectNonEmpty` selects value from preferred, or if it's missing the from other. `combine` merges and sorts values from both fragments.
-
-**copy**: Copy fields from other record. The following options are supported:
-
-- _**mustBeIdentical**_: A boolean determing whether all subfields must be identical
-- _**compareWithoutIndicators**_: A boolean determing whether field indicators must be identical
-- _**compareWithout**_: An array of subfield codes. These subfields are filtered out from the comparison
-- _**compareSubfieldsNormalized**_: A boolean determing whether the subfields included in _compareWithout_ should be compared as normalized
-- _**combine**_: An array of subfields codes. These subfields will be combined into a single subfield
-- _**dropOriginal**_: Drop matching original field taken from preferred record.
-- _**copyIf/copyUnless**_: Object with subfields as keys containing conditions for copying. Each condition are defined as follows:
- - _**value**_: Required value for subfield
- - _**comparator**_: A subfield comparator function name
-- _**pick**_: Include subfields from the field that is not preserved.
- - _**subfields**_: An array of subfield codes (*Mandatory*)
- - _**missingOnly**_: A boolean determing whether only subfields missing from the target field should be picked
-- _**reduce**_: Drop defined subfield from other record
- - _**subfields**_: An array of subfield codes (*Mandatory*)
- - _**condition**_: Condition used to determine if field should be dropped. If undefined drops all subfields of type. Possible values _if_ and _unless_.
- - _**value**_: Value for comparison. Can be regular expression if exact is option is not set.
- - _**exact**_: If set requires subfield value match exactly. Defaults to false.
-- _**transformOnInequality**_: An object describing how to transform an inequal field. For this option to take effect the preferred record must have at least one field with the same tag name as the other record. The following properties are supported:
- - _**tag**_: Tag name of the new field (*Mandatory*)
- - _**drop**_: An array of subfields codes. These subfields are not included in the new field.
- - _**add**_: An object with subfield codes as keys and subfield values as values.
- - _**map**_: An object with new subfield codes as keys and the old subfield codes as values.
-
-The action copies only fields that have no match in the preferred record:
-
-1. Attempt to find a corresponding field from preferred record
- 1. Attempt to find an identical field (All options are applied to comparison)
- - [Normalize fields](#field-normalization)
- - Tag names must be identical
- - Indicators must be identical
- - Values must be identical
- 1. Variable fields: Each subfield must have a matching subfield in the opposite record (Code and value identical).
- 1. Control fields: The values must be identical
- 1. Attempt to find a similar field if an identical field was not found (All options are applied to comparison)
- - [Normalize fields](#field-normalization)
- - Tag names must be identical
- - Indicators must be identical
- - Values comparison
- 1. Variable fields: Either field's subfields must be a subset of the opposite subfields (There is a match for all of the opposite field's subfields)
- 1. Control fields: The values must be identical
-1. Copy or do nothing
- 1. No corresponding field was found
- 1. If no fields in the preferred record with the same tag name were found, copy the field
- 1. If fields with the same tag were found and option *transformOnInequality* is enabled, copy the other field using the specified transformations. Otherwise do nothing.
-
- 1. Corresponding field was found. Check if the other field is deemed different and should be copied to the merged record (All options are applied to comparison)
- 1. [Normalize fields](#field-normalization)
- 1. Check if the other field is a "proper" subset of the preferred field (Preferred field contains all of the other field's subfields and more)
- 1. If it is, copy the field
- 1. If it's not, keep the preferred field
- 1. In both cases, merge the subfields that were not included in comparison by removing identical subfields
-
-**selectBetter**: Selects the **"better"** of the two fields of each record. Cannot be used if the tag has multiple fields. The following options are supported:
-
-- _**requireFieldInBoth**_: A boolean determing whether the field must exist in both records to make changes
-- _**onlyIfMissing**_: A boolean determing whether the field will be selected from the other record only if it missing from preferred record
-- _**skipOnMultiple**_: A boolean determing whether to skip the action (And keep the preferred fields) if the are multiple fields of the same tag. Default behavior is to fail the processing
-- _**pick**_: Include subfields from the field that is not preserved.
- - _**subfields**_: An array of subfield codes (*Mandatory*)
- - _**missingOnly**_: A boolean determing whether only subfields missing from the target field should be picked
-- _**comparator**_: A subfield comparator function name
-
-The better field is selected as follows:
-
-1. [Normalize fields](#field-normalization)
-1. Check if both fields' subfields are considered equal (Using the comparator function)
- 1. If equal, select the field that gets the most points (Fields get points for each subfield that has more characters than the corresponding subfield in the opposite field)
- 1. If not equal, check if the other field is a "proper" subset of the preferred field (Preferred field contains all of the other field's subfields and more)
- 1. If the other field is a subset of the preferred field, select the other field
- 1. Otherwise select the preferred field
-
-**createFrom**: Creates new field based on field other record. The following options are supported:
-- _**convertTag**_: Converts field tag to another.
-- _**ind[1-2]**_: Converts indicator in created field.
-- _**skipIfExists**_: Skip creating new field if target field is found in preferred.
-- _**useExisting**_: Use existing field from preferred as base copying all subrecords.
-- _**keepExisting**_: Keep existing field from preferred and create new field.
-- _**subfields**_: Object of subfields as keys to be included in created field. Each subfield object can have following properties:
- - _**convertCode**_: Converts subfield code to another.
- - _**convertValue**_: Converts value to another.
- - _**append**_: Append value to existing subfield. If subfield does not exists create as new.
- - _**replace**_: Replace existing subfield.
- - _**modifications**_: Array of modifications for value. Can be either function or following object:
- - _**type**_: Type of operation. Possible values are: _copy_, _replace_, _wrap_, _prepend_, _append_
- - _**args**_: Array of arguments for operation
-
- If subfield object is empty subfield is copied as is.
-
-## Field normalization
-
-Field values (Variable field subfields or control field value) are normalized as follows:
-
-1. String is converted to lower case
-1. Punctuation (See the function _**removePunctuation**_ in [lib/main.js](https://github.com/NatLibFi/marc-record-merge/blob/master/lib/main.js) for the characters replaced) is replaced with whitespace. The resulting string is trimmed (Whitespace removed from both ends) and subsequent whitespace is reduced to single whitespace.
-1. Diacritics are replaced with their corresponding ASCII characters (See the variable __*DIACRITICS_REMOVAL_MAP*__ in [lib/main.js](https://github.com/NatLibFi/marc-record-merge/blob/master/lib/main.js) for mapping)
-
-## Predefined comparators
-
-- **substring**: Require both subfields to have equal codes and that at least one value is a substring of the other subfield's value
-- **equality**: Require both subfields to have stricly equal codes and values
-
-### Plugins
-
-The second argument to the factory function is a optional object specifying plugin functions. The object can have one or both of the following properties:
-
-#### actions
-
-An object with action names as keys and functions as values. The action is a function which alters the merged record. It has the following signature:
-
-```js
-function (record_merge, field_other, options, return_details) {}
+{tagPattern: /010/u, dropSubfields: [{"code": "9", "condition": "unless", "value": "^FENNI<(?KEEP|DROP)>$"}]}
```
-**Parameters:**
-- *record_merge*: The merged record which is to be modified (Based on the preferred record)
-- *field_other*: The field from the other record which is the subject of the action
-- *options*: Action specific options
-- *return_details*: If this is defined, return action specific details about processing
+Drops all subfield 9's unless they have "FENNI" or "FENNI" from all fields tagged 010
-The function's return value is not used unless *return_detail* is defined.
-#### comparators
+When comparing or copying field dropped fields are ignored
-An object with comparator names as keys and functions as values. The comparator is a function which returns a boolean denoting whether two subfields are deemed equal. It has the following signature:
+### copyUnless (Defaults [ ])
+```
+{tagPattern: /010/u, copyUnless: [{"code": "9", "value": "FENNI"}]}
+```
+
+When field is otherwise ok to be copied, if it contains given subfield whole field is ignored
-```js
-function (subfield1, subfield2) {}
+### baseValidators (Defaults {subfieldValues: false})
+```
+{tagPattern: /010/u, baseValidators: {fields: true, subfields: true, subfieldValues: true}}
```
-### Sorting
-
-By default, new fields are added after the similar fields. This can be changed with the **sort** property:
-
-```js
-{
- "fields": {
- "020": {
- "action": "copy"
- }
- },
- "sort": {
- "insert": "before",
- "indexes": {
- "CAT": 995
- }
- }
-}
+Marc record validators for base record while reducer is working.
+More info can be read here: https://github.com/NatLibFi/marc-record-js
+
+### sourceValidators (Defaults {subfieldValues: false})
+```
+{tagPattern: /010/u, sourceValidators: {fields: true, subfields: true, subfieldValues: true}}
```
-### Properties
-- **insert**: Defines whether new fields are inserted before or after similar fields. Defaults to *after*.
-- **indexes**: An object with field tag patterns as keys and static sort indexes as values. By default, new fields are inserted by the tag's numeric index (If similar fields don't exist)
+Marc record validators for source record while reducer is working.
+More info can be read here: https://github.com/NatLibFi/marc-record-js
## License and copyright
-Copyright (c) 2015-2017 **University Of Helsinki (The National Library Of Finland)**
-
+Copyright (c) 2020-2023 **University Of Helsinki (The National Library Of Finland)**
-This project's source code is licensed under the terms of **GNU Affero General Public License Version 3**.
+This project's source code is licensed under the terms of **MIT** or any later version.
diff --git a/karma.conf.js b/karma.conf.js
deleted file mode 100644
index 91667f1..0000000
--- a/karma.conf.js
+++ /dev/null
@@ -1,39 +0,0 @@
-module.exports = function(config) {
- config.set({
- singleRun: true,
- frameworks: ['mocha', 'requirejs'],
- browsers: ['PhantomJS'],
- preprocessors: {
- 'test/browser/main.js': 'requirejs'
- },
- requirejsPreprocessor: {
- config: {
- baseUrl: '/base'
- },
- testRegexp: '^/base/test/(?!nodejs/).+\.spec\.js$'
- },
- files: [
- 'test/browser/main.js',
- {
- pattern: 'test/*.js',
- included: false
- },
- {
- pattern: 'test/browser/*.spec.js',
- included: false
- },
- {
- pattern: 'test/suites/**/*',
- included: false
- },
- {
- pattern: 'lib/**/*.js',
- included: false
- },
- {
- pattern: 'node_modules/**/*.js',
- included: false
- }
- ]
- });
-};
diff --git a/lib/main.js b/lib/main.js
deleted file mode 100644
index 00df662..0000000
--- a/lib/main.js
+++ /dev/null
@@ -1,1215 +0,0 @@
-/**
- *
- * @licstart The following is the entire license notice for the JavaScript code in this file.
- *
- * A configurable Javascript module for merging MARC records
- *
- * Copyright (c) 2015-2017 University Of Helsinki (The National Library Of Finland)
- *
- * This file is part of marc-record-merge
- *
- * marc-record-merge is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- *
- * @licend The above is the entire license notice
- * for the JavaScript code in this file.
- *
- **/
-
-/* istanbul ignore next: umd wrapper */
-(function (root, factory) {
-
- 'use strict';
-
- if (typeof define === 'function' && define.amd) {
- define([
- '@natlibfi/es6-polyfills/lib/polyfills/object',
- '@natlibfi/es6-shims/lib/shims/array',
- 'marc-record-js'
- ], factory);
- } else if (typeof module === 'object' && module.exports) {
- module.exports = factory(
- require('@natlibfi/es6-polyfills/lib/polyfills/object'),
- require('@natlibfi/es6-shims/lib/shims/array'),
- require('marc-record-js')
- );
- } else {
- root.mergeMarcRecordsFactory = factory(
- root.Object,
- root.es6_array_shim,
- root.MarcRecord
- );
- }
-
-}(this, factory));
-
-function factory(Object, shim_array, MarcRecord)
-{
-
- "use strict";
-
- var DEFAULT_OPTIONS = {
- sort: {
- insert: 'after'
- }
- },
- DIACRITICS_REMOVAL_MAP = [
- {'base':'A', 'letters':'\u0041\u24B6\uFF21\u00C0\u00C1\u00C2\u1EA6\u1EA4\u1EAA\u1EA8\u00C3\u0100\u0102\u1EB0\u1EAE\u1EB4\u1EB2\u0226\u01E0\u00C4\u01DE\u1EA2\u00C5\u01FA\u01CD\u0200\u0202\u1EA0\u1EAC\u1EB6\u1E00\u0104\u023A\u2C6F'},
- {'base':'AA','letters':'\uA732'},
- {'base':'AE','letters':'\u00C6\u01FC\u01E2'},
- {'base':'AO','letters':'\uA734'},
- {'base':'AU','letters':'\uA736'},
- {'base':'AV','letters':'\uA738\uA73A'},
- {'base':'AY','letters':'\uA73C'},
- {'base':'B', 'letters':'\u0042\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0182\u0181'},
- {'base':'C', 'letters':'\u0043\u24B8\uFF23\u0106\u0108\u010A\u010C\u00C7\u1E08\u0187\u023B\uA73E'},
- {'base':'D', 'letters':'\u0044\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018B\u018A\u0189\uA779'},
- {'base':'DZ','letters':'\u01F1\u01C4'},
- {'base':'Dz','letters':'\u01F2\u01C5'},
- {'base':'E', 'letters':'\u0045\u24BA\uFF25\u00C8\u00C9\u00CA\u1EC0\u1EBE\u1EC4\u1EC2\u1EBC\u0112\u1E14\u1E16\u0114\u0116\u00CB\u1EBA\u011A\u0204\u0206\u1EB8\u1EC6\u0228\u1E1C\u0118\u1E18\u1E1A\u0190\u018E'},
- {'base':'F', 'letters':'\u0046\u24BB\uFF26\u1E1E\u0191\uA77B'},
- {'base':'G', 'letters':'\u0047\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E'},
- {'base':'H', 'letters':'\u0048\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D'},
- {'base':'I', 'letters':'\u0049\u24BE\uFF29\u00CC\u00CD\u00CE\u0128\u012A\u012C\u0130\u00CF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197'},
- {'base':'J', 'letters':'\u004A\u24BF\uFF2A\u0134\u0248'},
- {'base':'K', 'letters':'\u004B\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2'},
- {'base':'L', 'letters':'\u004C\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780'},
- {'base':'LJ','letters':'\u01C7'},
- {'base':'Lj','letters':'\u01C8'},
- {'base':'M', 'letters':'\u004D\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C'},
- {'base':'N', 'letters':'\u004E\u24C3\uFF2E\u01F8\u0143\u00D1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u0220\u019D\uA790\uA7A4'},
- {'base':'NJ','letters':'\u01CA'},
- {'base':'Nj','letters':'\u01CB'},
- {'base':'O', 'letters':'\u004F\u24C4\uFF2F\u00D2\u00D3\u00D4\u1ED2\u1ED0\u1ED6\u1ED4\u00D5\u1E4C\u022C\u1E4E\u014C\u1E50\u1E52\u014E\u022E\u0230\u00D6\u022A\u1ECE\u0150\u01D1\u020C\u020E\u01A0\u1EDC\u1EDA\u1EE0\u1EDE\u1EE2\u1ECC\u1ED8\u01EA\u01EC\u00D8\u01FE\u0186\u019F\uA74A\uA74C'},
- {'base':'OI','letters':'\u01A2'},
- {'base':'OO','letters':'\uA74E'},
- {'base':'OU','letters':'\u0222'},
- {'base':'OE','letters':'\u008C\u0152'},
- {'base':'oe','letters':'\u009C\u0153'},
- {'base':'P', 'letters':'\u0050\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754'},
- {'base':'Q', 'letters':'\u0051\u24C6\uFF31\uA756\uA758\u024A'},
- {'base':'R', 'letters':'\u0052\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782'},
- {'base':'S', 'letters':'\u0053\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784'},
- {'base':'T', 'letters':'\u0054\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786'},
- {'base':'TZ','letters':'\uA728'},
- {'base':'U', 'letters':'\u0055\u24CA\uFF35\u00D9\u00DA\u00DB\u0168\u1E78\u016A\u1E7A\u016C\u00DC\u01DB\u01D7\u01D5\u01D9\u1EE6\u016E\u0170\u01D3\u0214\u0216\u01AF\u1EEA\u1EE8\u1EEE\u1EEC\u1EF0\u1EE4\u1E72\u0172\u1E76\u1E74\u0244'},
- {'base':'V', 'letters':'\u0056\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245'},
- {'base':'VY','letters':'\uA760'},
- {'base':'W', 'letters':'\u0057\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72'},
- {'base':'X', 'letters':'\u0058\u24CD\uFF38\u1E8A\u1E8C'},
- {'base':'Y', 'letters':'\u0059\u24CE\uFF39\u1EF2\u00DD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE'},
- {'base':'Z', 'letters':'\u005A\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762'},
- {'base':'a', 'letters':'\u0061\u24D0\uFF41\u1E9A\u00E0\u00E1\u00E2\u1EA7\u1EA5\u1EAB\u1EA9\u00E3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\u00E4\u01DF\u1EA3\u00E5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250'},
- {'base':'aa','letters':'\uA733'},
- {'base':'ae','letters':'\u00E6\u01FD\u01E3'},
- {'base':'ao','letters':'\uA735'},
- {'base':'au','letters':'\uA737'},
- {'base':'av','letters':'\uA739\uA73B'},
- {'base':'ay','letters':'\uA73D'},
- {'base':'b', 'letters':'\u0062\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253'},
- {'base':'c', 'letters':'\u0063\u24D2\uFF43\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184'},
- {'base':'d', 'letters':'\u0064\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\uA77A'},
- {'base':'dz','letters':'\u01F3\u01C6'},
- {'base':'e', 'letters':'\u0065\u24D4\uFF45\u00E8\u00E9\u00EA\u1EC1\u1EBF\u1EC5\u1EC3\u1EBD\u0113\u1E15\u1E17\u0115\u0117\u00EB\u1EBB\u011B\u0205\u0207\u1EB9\u1EC7\u0229\u1E1D\u0119\u1E19\u1E1B\u0247\u025B\u01DD'},
- {'base':'f', 'letters':'\u0066\u24D5\uFF46\u1E1F\u0192\uA77C'},
- {'base':'g', 'letters':'\u0067\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\u1D79\uA77F'},
- {'base':'h', 'letters':'\u0068\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265'},
- {'base':'hv','letters':'\u0195'},
- {'base':'i', 'letters':'\u0069\u24D8\uFF49\u00EC\u00ED\u00EE\u0129\u012B\u012D\u00EF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131'},
- {'base':'j', 'letters':'\u006A\u24D9\uFF4A\u0135\u01F0\u0249'},
- {'base':'k', 'letters':'\u006B\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3'},
- {'base':'l', 'letters':'\u006C\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747'},
- {'base':'lj','letters':'\u01C9'},
- {'base':'m', 'letters':'\u006D\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F'},
- {'base':'n', 'letters':'\u006E\u24DD\uFF4E\u01F9\u0144\u00F1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5'},
- {'base':'nj','letters':'\u01CC'},
- {'base':'o', 'letters':'\u006F\u24DE\uFF4F\u00F2\u00F3\u00F4\u1ED3\u1ED1\u1ED7\u1ED5\u00F5\u1E4D\u022D\u1E4F\u014D\u1E51\u1E53\u014F\u022F\u0231\u00F6\u022B\u1ECF\u0151\u01D2\u020D\u020F\u01A1\u1EDD\u1EDB\u1EE1\u1EDF\u1EE3\u1ECD\u1ED9\u01EB\u01ED\u00F8\u01FF\u0254\uA74B\uA74D\u0275'},
- {'base':'oi','letters':'\u01A3'},
- {'base':'ou','letters':'\u0223'},
- {'base':'oo','letters':'\uA74F'},
- {'base':'p','letters':'\u0070\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755'},
- {'base':'q','letters':'\u0071\u24E0\uFF51\u024B\uA757\uA759'},
- {'base':'r','letters':'\u0072\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783'},
- {'base':'s','letters':'\u0073\u24E2\uFF53\u00DF\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B'},
- {'base':'t','letters':'\u0074\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787'},
- {'base':'tz','letters':'\uA729'},
- {'base':'u','letters': '\u0075\u24E4\uFF55\u00F9\u00FA\u00FB\u0169\u1E79\u016B\u1E7B\u016D\u00FC\u01DC\u01D8\u01D6\u01DA\u1EE7\u016F\u0171\u01D4\u0215\u0217\u01B0\u1EEB\u1EE9\u1EEF\u1EED\u1EF1\u1EE5\u1E73\u0173\u1E77\u1E75\u0289'},
- {'base':'v','letters':'\u0076\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C'},
- {'base':'vy','letters':'\uA761'},
- {'base':'w','letters':'\u0077\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73'},
- {'base':'x','letters':'\u0078\u24E7\uFF58\u1E8B\u1E8D'},
- {'base':'y','letters':'\u0079\u24E8\uFF59\u1EF3\u00FD\u0177\u1EF9\u0233\u1E8F\u00FF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF'},
- {'base':'z','letters':'\u007A\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763'}
- ];
-
- var diacritics_removal_map = DIACRITICS_REMOVAL_MAP.reduce(function(result, element) {
-
- element.letters.split('').forEach(function(letter) {
- result[letter] = element.base;
- });
-
- return result;
-
- }, {});
-
- return function(configuration, plugins)
- {
-
- var actions = {
- controlfield: actionControlfield,
- copy: actionCopy,
- selectBetter: actionSelectBetter,
- mergeControlfield: actionMergeControlfield,
- createFrom: actionCreateFrom
- },
- comparators = {
- substring: subfieldSubstringComparator,
- equality: subfieldEquality
- },
- stringOperations = {
- copy: stringOperationCopy,
- replace: stringOperationReplace,
- wrap: stringOperationWrap,
- prepend: stringOperationPrepend,
- append: stringOperationAppend
- };
-
- function applyPlugins(obj, name)
- {
- if (typeof plugins === 'object') {
-
- if (typeof plugins.actions === 'object') {
- Object.keys(plugins.actions).filter(function(key) {
- return typeof plugins.actions[key] === 'function';
- }).forEach(function(key) {
- actions[key] = plugins.actions[key];
- });
- }
-
- if (typeof plugins.comparators === 'object') {
- Object.keys(plugins.comparators).filter(function(key) {
- return typeof plugins.comparators[key] === 'function';
- }).forEach(function(key) {
- comparators[key] = plugins.comparators[key];
- });
- }
-
- if (typeof plugins.comparators === 'object') {
- Object.keys(plugins.comparators).filter(function(key) {
- return typeof plugins.comparators[key] === 'function';
- }).forEach(function(key) {
- comparators[key] = plugins.comparators[key];
- });
- }
- }
- }
-
- function stringOperationCopy(value) {
- return value;
- }
-
- function stringOperationReplace(value, args) {
- return value.replace(args[0], args[1]);
- }
-
- function stringOperationWrap(value, args) {
- return args[0] + value + args[1];
- }
-
- function stringOperationPrepend(value, args) {
- return args[0] + value;
- }
-
- function stringOperationAppend(value, args) {
- return value + args[0];
- }
-
- function subfieldSubstringComparator(subfield1, subfield2) {
- return subfield1.code == subfield2.code && (subfield1.value.indexOf(subfield2.value) >= 0 || subfield2.value.indexOf(subfield1.value) >= 0);
- }
-
- function subfieldEquality(subfield1, subfield2) {
- return subfield1.code == subfield2.code && subfield1.value == subfield2.value;
- }
-
- function arrayDifference(a1, a2, equalityFunction)
- {
-
- equalityFunction = typeof equalityFunction === 'function' ? equalityFunction : function(a, b) {
- return a === b;
- };
-
- return a1.filter(function(element) {
- return shim_array.find(a2, function(element2) {
- return equalityFunction(element, element2);
- }) === undefined;
- });
-
- }
-
- function arraysIdentical(a1, a2, equalityFunction)
- {
- return arrayDifference(a1, a2, equalityFunction).length === 0 && arrayDifference(a2, a1, equalityFunction).length === 0;
- }
-
- function clone(obj)
- {
- return JSON.parse(JSON.stringify(obj));
- }
-
- function getCompareWithoutSubfields(field, options) {
-
- var subfields = [];
-
- if (options.compareWithout) {
-
- subfields = field.subfields.filter(function(subfield) {
- return options.compareWithout.indexOf(subfield.code) !== -1;
- });
-
- }
-
- return subfields;
- }
-
- /**
- * Try to make a list of equal pairs from both subfield arrays using a comparator function
- **/
- function makeSubfieldPairs(subfields1, subfields2, fn_comparator) {
-
- var pairs = [];
-
- if (subfields1.length === subfields2.length) {
-
- subfields2.forEach(function(subfield2) {
- return subfields1.some(function(subfield1) {
- if (fn_comparator(subfield1, subfield2)) {
-
- pairs.push([subfield1, subfield2]);
- return true;
-
- }
- });
- });
-
- } else {
- throw new Error('Number of subfields are not equal');
- }
-
- return pairs;
-
- }
-
- function combineSubfields(code, field) {
-
- var subfields, value_combined,
- first_subfield_index = shim_array.findIndex(field.subfields, function(subfield) {
- return subfield.code === code;
- });
-
- if (first_subfield_index >= 0) {
-
- subfields = field.subfields.filter(function(subfield) {
- return subfield.code === code;
- });
-
- if (subfields.length > 1) {
-
- value_combined = subfields.reduce(function(result, subfield) {
- return result.length > 0 ? result + ', ' + subfield.value : result + subfield.value;
- }, '');
-
- /**
- * @internal Remove subfields with the code that is to be combined
- */
- field.subfields = field.subfields.filter(function(subfield) {
- return subfield.code !== code;
- });
-
- field.subfields.splice(first_subfield_index, 0, {
- code: code,
- value: '[' + value_combined + ']'
- });
-
- }
-
- }
-
- }
-
- function normalizeSubfield(subfield, no_clone) {
- var ctx = no_clone ? subfield : clone(subfield);
- ctx.value = normalizeString(ctx.value);
- return ctx;
- }
-
- function normalizeField(field) {
- var normalized = clone(field);
- normalized.subfields = normalized.subfields.map(function(subfield) {
- return normalizeSubfield(subfield, 1);
- });
- return normalized;
- }
-
- function fieldsSimilar(field1, field2, options) {
-
- var field1_normalized = normalizeField(field1);
- var field2_normalized = normalizeField(field2);
-
- if (options.compareWithout !== undefined) {
-
- options.compareWithout.forEach(function(code_filter) {
-
- [field1_normalized, field2_normalized].forEach(function(field) {
- field.subfields = arrayDifference(field.subfields, field.subfields.filter(function(subfield) {
- return subfield.code == code_filter;
- }));
- });
-
- });
-
- }
-
- if (options.compareWithoutIndicators !== true) {
-
- if (field1_normalized.ind1 !== field2_normalized.ind1) {
- return false;
- }
-
- if (field1_normalized.ind2 !== field2_normalized.ind2) {
- return false;
- }
-
- }
-
- /**
- * @internal If fields have 0 subfields (f.ex. because of comparewithout), then fields are not deemed identical.
- **/
- if (field1_normalized.subfields.length === 0 ||
- field2_normalized.subfields.length === 0) {
- return false;
- }
-
- if (options.mustBeIdentical === true) {
-
- if (!arraysIdentical(field1_normalized.subfields, field2_normalized.subfields, subfieldEquality)) {
- return false;
- }
- }
-
- /**
- * @internal Neither is subset
- **/
- if (arrayDifference(field1_normalized.subfields, field2_normalized.subfields, subfieldEquality).length !== 0 &&
- arrayDifference(field2_normalized.subfields, field1_normalized.subfields, subfieldEquality).length !== 0) {
-
- return false;
-
- }
-
- return true;
-
- }
-
- function normalizeString(str)
- {
-
- function removeCase(str)
- {
- return str.toLowerCase();
- }
-
- function removePunctuation(str)
- {
- return str.replace(/[\.,-\/#!$%\^&\*;:{}=\-_`~()]/g," ")
- .replace(/\s{2,}/g, " ")
- .trim();
- }
-
- function removeDiacritics(str)
- {
- return str.split('').reduce(function(result, letter) {
- return diacritics_removal_map.hasOwnProperty(letter) ? result + diacritics_removal_map[letter] : result + letter;
- }, '');
- }
-
- return removePunctuation(removeCase(removeDiacritics(str)));
-
- }
-
- function pickSubfields(field_to, field_from, subfield_codes, missing_only)
- {
- field_from.subfields
- .filter(function(subfield) {
- return subfield_codes.indexOf(subfield.code) >= 0;
- })
- .forEach(function(subfield) {
-
- if (missing_only === true) {
- if (!field_to.subfields.some(function(subfield_to) {
- return subfield_to.code === subfield.code;
- })) {
- field_to.subfields.push(clone(subfield));
- }
- } else {
- field_to.subfields.push(clone(subfield));
- }
-
- });
- }
-
- function insertField(record, field)
- {
-
- function getSortIndex(tag)
- {
-
- var index;
-
- if (configuration.sort.indexes) {
-
- Object.keys(configuration.sort.indexes).some(function(pattern_index) {
- if (new RegExp('^' + pattern_index + '$').test(tag)) {
-
- index = configuration.sort.indexes[pattern_index];
- return 1;
-
- }
- });
-
- }
-
- return index === undefined ? parseInt(tag, 10) : index;
-
- }
-
- function beforeCallback(field_record, index)
- {
- if (field.tag == field_record.tag) {
- index_insert = index;
- return 1;
- }
- }
-
- function afterCallback(field_record, index)
- {
- if (field.tag == field_record.tag) {
- index_insert = index;
- } else if (index_insert !== undefined) {
- index_insert = index;
- return 1;
- }
- }
-
- var index_insert, index_sort;
-
- if (!record.fields.some(configuration.sort.insert === 'before' ? beforeCallback : afterCallback) && index_insert !== undefined && configuration.sort.insert === 'after') {
- index_insert++;
- }
-
- if (index_insert === undefined) {
-
- index_sort = getSortIndex(field.tag);
-
- record.fields.some(function(field_record, index) {
-
- if ((index_sort - getSortIndex(field_record.tag)) < 0) {
- index_insert = index;
- return 1;
- }
-
- });
-
- }
-
- record.fields.splice(index_insert === undefined ? record.fields.length : index_insert, 0, field);
-
- }
-
- function actionControlfield(record_merged, field_other, options, comparators, return_details) {
-
- if (!record_merged.fields.some(function(field_merged) {
- return field_merged.tag == field_other.tag;
- })) {
-
- field_other.wasUsed = true;
- field_other.fromOther = true;
- record_merged.fields.push(clone(field_other));
-
- return !return_details ? undefined : {
- index: record_merged.fields.length - 1
- };
-
- }
-
- }
-
- function extractFormat(record) {
-
- var l6 = record.leader.substr(6,1);
- var l7 = record.leader.substr(7,1);
-
- var isBK = function(l6, l7) { return ['a', 't'].indexOf(l6) !== -1 && ['b', 'i', 's'].indexOf(l7) === -1; };
- var isCR = function(l6, l7) { return ['a', 't'].indexOf(l6) !== -1 && ['b', 'i', 's'].indexOf(l7) !== -1; };
- var isMP = function(l6) { return ['e', 'f'].indexOf(l6) !== -1; };
- var isMU = function(l6) { return ['c', 'd', 'i', 'j'].indexOf(l6) !== -1; };
- var isCF = function(l6) { return 'm' === l6; };
- var isMX = function(l6) { return 'p' === l6; };
- var isVM = function(l6) { return ['g', 'k', 'o', 'r'].indexOf(l6) !== -1; };
-
- switch(true) {
- case isBK(l6, l7): return 'BK';
- case isCR(l6, l7): return 'CR';
- case isMP(l6): return 'MP';
- case isMU(l6): return 'MU';
- case isCF(l6): return 'CF';
- case isMX(l6): return 'MX';
- case isVM(l6): return 'VM';
- }
- }
-
-
- function getRange(action) {
- if (typeof action.range === 'object') {
- return {
- index: action.range[0],
- length: action.range[1] - action.range[0] + 1
- };
- } else {
- return {
- index: action.range,
- length: 1
- };
- }
- }
-
- function actionMergeControlfield(record_merged, field_other, options, comparators, return_details, record_other) {
- // get formats of record_merged, record_other
- var formatMerged = extractFormat(record_merged);
- var formatOther = extractFormat(record_other);
-
- var field_merged = shim_array.find(record_merged.fields, function(field) { return field.tag === field_other.tag; });
-
- // merged record does not contain the given field
- if (field_merged === undefined) {
- return;
- }
-
- // if formats are not the same, then do nothing
- if (formatMerged !== formatOther) {
- return;
- }
-
- options.actions
- .filter(function(action) { return action.formats.indexOf(formatMerged) !== -1; })
- .forEach(function(action) {
-
- var range = getRange(action);
- var index = range.index;
- var length = range.length;
-
- var extractFragment = function(index, length) {
- return function(field) {
- return field.value.substr(index, length);
- };
- };
-
- var insertText = function(index, length) {
- return function(str, text) {
- return str.substr(0,index) + text.substr(0, length) + str.substr(index+length);
- };
- };
-
- var extractor = extractFragment(index, length);
- var updateFragment = insertText(index, length);
-
- var mergedValue = extractor(field_merged);
- var otherValue = extractor(field_other);
-
- var uncodedRE = /^\|+$/;
- var uncodedOrEmpty = /^[\|^]+$/;
- var isEmptyFragment = function(significantCaret) {
- return function(value) {
- return significantCaret ? uncodedRE.test(value) : uncodedOrEmpty.test(value);
- };
- };
-
- var isEmpty = isEmptyFragment(action.significantCaret);
-
- if (action.type === 'selectNonEmpty') {
-
- if (isEmpty(mergedValue) && !isEmpty(otherValue)) {
- field_merged.value = updateFragment(field_merged.value, otherValue);
- }
- }
-
- if (action.type === 'combine') {
- if (!isEmpty(mergedValue) || !isEmpty(otherValue)) {
-
- var selectParts = function(value) { return value.replace(/[\|^]/g, '').split(''); };
- var uniq = function(array) {
- return array.reduce(function(acc, item) {
- if (!shim_array.find(acc, function(val) { return val === item; })) {
- acc.push(item);
- }
- return acc;
- }, []);
- };
-
- var padEnd = function(str, length, char) {
- while (str.length < length) {
- str = str + char;
- }
- return str;
- };
-
- var mergedParts = selectParts(mergedValue);
- var otherParts = selectParts(otherValue);
-
- var combinedValue = padEnd(uniq(mergedParts.concat(otherParts).sort()).slice(0,length).join(''), length, '^');
-
- field_merged.value = updateFragment(field_merged.value, combinedValue);
- }
-
- }
-
- });
-
- }
-
- function actionCopy(record_merged, field_other, options, comparators, return_details) {
- var subfields_compare_without, removed_subfields_preferred, removed_subfields_other, fields_preferred, field_preferred, field_preferred_normalized, field_other_copy_normalized, field_other_copy, field_preferred_copy, field_transformed,
- details = return_details ? {} : undefined,
- shouldMerge = true;
-
- options = typeof options === 'object' ? options : {};
-
- fields_preferred = record_merged.fields.filter(function(field) {
- return field.tag == field_other.tag;
- });
-
- field_preferred = shim_array.find(fields_preferred, function(field) {
-
- return fieldsSimilar(field, field_other, Object.assign(clone(options), {
- mustBeIdentical: true
- }));
-
- });
-
- if (field_preferred === undefined) {
- field_preferred = shim_array.find(fields_preferred, function(field) {
- return fieldsSimilar(field, field_other, options);
- });
- }
-
- if (options.hasOwnProperty('copyIf') && typeof options.copyIf == 'object') {
- shouldMerge = false;
-
- Object.keys(options.copyIf).forEach(function(code) {
- var properties = options.copyIf[code];
-
- var fn_comparator = comparators.hasOwnProperty(properties.comparator) ? comparators[properties.comparator] : comparators.equality;
-
- var field_other_subfields = field_other.subfields.filter(function (subfield) {
- return subfield.code == code;
- });
-
- var compared_subfield = {
- code: code,
- value: properties.value
- };
-
- field_other_subfields.forEach(function (subfield) {
- if (fn_comparator(subfield, compared_subfield)) shouldMerge = true;
- });
- });
- }
-
- if (options.hasOwnProperty('copyUnless') && typeof options.copyUnless == 'object') {
- Object.keys(options.copyUnless).forEach(function(code) {
- var properties = options.copyUnless[code];
-
- var fn_comparator = comparators.hasOwnProperty(properties.comparator) ? comparators[properties.comparator] : comparators.equality;
-
- var field_other_subfields = field_other.subfields.filter(function (subfield) {
- return subfield.code == code;
- });
-
- var compared_subfield = {
- code: code,
- value: properties.value
- };
-
- field_other_subfields.forEach(function (subfield) {
- if (fn_comparator(subfield, compared_subfield)) shouldMerge = false;
- });
- });
- }
-
- if (!shouldMerge) return details;
-
- field_other_copy = clone(field_other);
-
- if (options.reduce) {
- var properties = options.reduce;
-
- field_other_copy.subfields = field_other_copy.subfields.filter(function(subfield) {
- if (properties.subfields.indexOf(subfield.code) === -1) return true;
-
- if (properties.condition) {
- if (properties.exact) {
- if (properties.condition == 'unless' && subfield.value !== properties.value) return false;
- else if (properties.condition == 'if' && subfield.value === properties.value) return false;
- else return true;
- }
- else {
- if (properties.condition == 'unless' && !subfield.value.match(properties.value)) return false;
- else if (properties.condition == 'if' && subfield.value.match(properties.value)) return false;
- else return true;
- }
- }
- else return false;
- });
- }
-
- if (options.dropOriginal || field_preferred === undefined) {
- if (options.dropOriginal) {
- fields_preferred.forEach(function(dropped_field) {
- record_merged.fields.splice(record_merged.fields.indexOf(dropped_field), 1);
- });
- }
-
- if (fields_preferred.length > 0 && typeof options.transformOnInequality === 'object') {
-
- field_other_copy.tag = options.transformOnInequality.tag;
-
- if (options.transformOnInequality.drop) {
- field_other_copy.subfields = field_other_copy.subfields.filter(function(subfield) {
- return options.transformOnInequality.drop.indexOf(subfield.code) < 0;
- });
- }
-
- if (options.transformOnInequality.map) {
-
- field_other_copy.subfields = field_other_copy.subfields.map(function(subfield) {
-
- Object.keys(options.transformOnInequality.map).some(function(key) {
- if (options.transformOnInequality.map[key] === subfield.code) {
- subfield.code = key;
- return true;
- }
- });
-
- return subfield;
-
- });
-
- }
-
- if (options.transformOnInequality.add) {
- Object.keys(options.transformOnInequality.add).forEach(function(key) {
- field_other_copy.subfields.push({
- code: key,
- value: options.transformOnInequality.add[key]
- });
- });
- }
-
- insertField(record_merged, field_other_copy);
-
- } else {
-
- field_other.wasUsed = true;
- field_other.fromOther = true;
-
- field_other_copy.wasUsed = true;
- field_other_copy.fromOther = true;
- insertField(record_merged, field_other_copy);
-
- }
-
- } else {
-
- removed_subfields_preferred = getCompareWithoutSubfields(field_preferred, options);
- removed_subfields_other = getCompareWithoutSubfields(field_other_copy, options);
-
- field_preferred.subfields = arrayDifference(field_preferred.subfields, removed_subfields_preferred);
- field_other_copy.subfields = arrayDifference(field_other_copy.subfields, removed_subfields_other);
-
- subfields_compare_without = removed_subfields_preferred.concat(removed_subfields_other).reduce(function(result, subfield) {
- return result.some(function(element) {
- if (options.compareSubfieldsNormalized) {
- return subfieldEquality(normalizeSubfield(element), normalizeSubfield(subfield));
- } else {
- return subfieldEquality(element, subfield);
- }
- }) ? result : result.concat(subfield);
- }, []);
-
- /**
- * @internal Determine which record's field to use, the preferred or the other one
- */
- field_preferred_normalized = normalizeField(field_preferred);
- field_other_copy_normalized = normalizeField(field_other_copy);
-
- /**
- * @internal Preferred record's subfields are a "proper" subset of other record's fields.
- **/
- if (arrayDifference(field_preferred_normalized.subfields, field_other_copy_normalized.subfields, subfieldEquality).length === 0 &&
- arrayDifference(field_other_copy_normalized.subfields, field_preferred_normalized.subfields, subfieldEquality).length > 0) {
-
- if (options.compareWithoutIndicators === true) {
- field_other_copy.ind1 = field_other_copy.ind1 === ' ' ? field_preferred.ind1 : field_other_copy.ind1;
- field_other_copy.ind2 = field_other_copy.ind2 === ' ' ? field_preferred.ind2 : field_other_copy.ind2;
- }
-
- /**
- * @internal The field that will be copied will contain subfields that are not using in comparison from both records
- */
- field_other_copy.subfields = field_other_copy.subfields.concat(subfields_compare_without);
-
- field_other.wasUsed = true;
- field_other_copy.fromOther = true;
-
- /**
- * @internal Combine any subfields
- **/
- if (options.combine) {
- options.combine.forEach(function(code) {
- combineSubfields(code, field_other_copy);
- });
- }
-
- if (options.pick) {
- pickSubfields(field_other_copy, field_preferred, options.pick.subfields, options.pick.missingOnly);
- }
-
- record_merged.fields.splice(record_merged.fields.indexOf(field_preferred), 1, field_other_copy);
-
- /**
- * @internal Add back the subfields that are not used in comparisons
- **/
- } else {
- /**
- * @internal Note: field_preferred is actually the the field in merged record (which is a copy of preferred)
- **/
- field_preferred.subfields = field_preferred.subfields.concat(subfields_compare_without);
-
- if (options.compareWithoutIndicators === true) {
- field_preferred.ind1 = field_preferred.ind1 === ' ' ? field_other.ind1 : field_preferred.ind1;
- field_preferred.ind2 = field_preferred.ind2 === ' ' ? field_other.ind2 : field_preferred.ind2;
- }
-
- /**
- * @internal Combine any subfields
- **/
- if (options.combine) {
- options.combine.forEach(function(code) {
- combineSubfields(code, field_preferred);
- });
- }
-
- if (options.pick) {
- pickSubfields(field_preferred, field_other_copy, options.pick.subfields, options.pick.missingOnly);
- }
-
- }
-
- }
-
- return details;
-
- }
-
- function actionSelectBetter(record_merged, field_other, options, comparators, return_details) {
-
-
- var error_invalid_record, field_merged, field_merged_normalized, field_other_normalized, field_other_copy, subfield_pairs_sizes, subfield_pairs_scores, fn_comparator, index_better, subfields_picked,
- details = return_details ? {} : undefined,
- fields_merged = record_merged.fields.filter(function(field) {
- return field.tag == field_other.tag;
- });
-
- options = typeof options === 'object' ? options : {};
- fn_comparator = comparators.hasOwnProperty(options.comparator) ? comparators[options.comparator] : comparators.equality;
-
- if (fields_merged.length > 1 && !options.skipOnMultiple) {
-
- error_invalid_record = new Error('selectBetter cannot be used if there are multiple fields of same tag.');
- error_invalid_record.name = 'InvalidRecordError';
-
- throw error_invalid_record;
-
- } else if (fields_merged.length === 0) {
-
- if (!options.requireFieldInBoth) {
-
- field_other.wasUsed = true;
- field_other.fromOther = true;
- insertField(record_merged, clone(field_other));
-
- }
-
- } else if (!options.onlyIfMissing) {
-
- field_merged = fields_merged[0];
- field_merged_normalized = normalizeField(field_merged);
- field_other_normalized = normalizeField(field_other);
-
- if (arraysIdentical(field_merged_normalized.subfields, field_other_normalized.subfields, fn_comparator)) {
-
- subfield_pairs_sizes = makeSubfieldPairs(field_merged_normalized.subfields, field_other_normalized.subfields, fn_comparator).map(function(pair) {
-
- var len1 = pair[0].value.length;
- var len2 = pair[1].value.length;
-
- return [len1 > len2, len2 > len1];
-
- });
- subfield_pairs_scores = subfield_pairs_sizes.reduce(function(result, size) {
-
- return [
- size[0] === true ? result[0] + 1 : result[0],
- size[1] === true ? result[1] + 1 : result[1]
- ];
-
- }, [0, 0]);
-
- /**
- * @internal Field in other record is considered better
- **/
- if (subfield_pairs_scores[0] < subfield_pairs_scores[1]) {
-
- field_other_copy = clone(field_other);
- field_other.wasUsed = true;
- field_other_copy.fromOther = true;
-
- record_merged.fields.splice(record_merged.fields.indexOf(field_merged), 1, field_other_copy);
-
- if (options.pickMissing) {
- pickMissingSubfields(field_other_copy, fields_merged[0], options.pickMissing);
- subfields_picked = 1;
- }
-
- }
-
- }
-
- if (arrayDifference(field_merged_normalized.subfields, field_other_normalized.subfields, fn_comparator).length === 0 && arrayDifference(field_other_normalized.subfields, field_merged_normalized.subfields, fn_comparator).length > 0) {
-
- /**
- * @internal Use field from other record
- **/
- field_other_copy = clone(field_other);
- field_other.wasUsed = true;
- field_other_copy.fromOther = true;
-
- record_merged.fields.splice(record_merged.fields.indexOf(field_merged), 1, field_other_copy);
-
- if (options.pick) {
- pickSubfields(field_other_copy, fields_merged[0], options.pick.subfields, options.pick.missingOnly);
- subfields_picked = 1;
- }
-
- }
-
- }
-
- if (subfields_picked === undefined && options.pick) {
- pickSubfields(fields_merged[0], field_other, options.pick.subfields, options.pick.missingOnly);
- }
-
- return details;
-
- }
-
- function actionCreateFrom(record_merged, field_other, options, comparators, return_details) {
- var error_invalid_record, error_invalid_transform_type,
- target_tag = options.convertTag || field_other.tag,
- details = return_details ? {} : undefined,
- fields_merged;
-
- fields_merged = record_merged.fields.filter(function(field) {
- return field.tag == target_tag;
- });
-
- if (options.skipIfExists && fields_merged.length > 0) return details;
-
- var field_other_copy;
-
- if (options.useExisting && fields_merged.length > 0) {
- field_other_copy = clone(fields_merged[0]);
- }
- else {
- field_other_copy = clone(field_other);
-
- field_other_copy.subfields = [];
- }
-
- if (options.ind1) field_other_copy.ind1 = options.ind1;
- if (options.ind2) field_other_copy.ind2 = options.ind2;
-
- if (field_other.subfields && options.subfields) {
- Object.keys(options.subfields).forEach(function(code) {
- var subfield_options = options.subfields[code], new_subfield = false;
-
- var field_other_copy_subfields = field_other.subfields.map(function(subfield, index) {
- return {
- index: index,
- subfield: clone(subfield)
- };
- }).filter(function(obj) {
- return obj.subfield.code == code;
- });
-
- if (field_other_copy_subfields.length == 0 && subfield_options.replaceValue) {
- field_other_copy_subfields = [ { subfield: { code: code, value: '' } } ];
- }
-
- field_other_copy_subfields.forEach(function(field_other_copy_subfield_obj) {
- var subfield_modifications = subfield_options.modifications || [];
-
- if (subfield_options.convertCode) field_other_copy_subfield_obj.subfield.code = subfield_options.convertCode;
- if (subfield_options.replaceValue) field_other_copy_subfield_obj.subfield.value = subfield_options.replaceValue;
-
- subfield_modifications.forEach(function(subfield_modifications_step) {
- if (typeof subfield_modifications_step === 'function') {
- field_other_copy_subfield_obj.subfield.value = subfield_modifications_step(field_other_copy_subfield_obj.subfield.value);
- } else if (stringOperations.hasOwnProperty(subfield_modifications_step.type)) {
- var args = subfield_modifications_step.args;
-
- field_other_copy_subfield_obj.subfield.value = stringOperations[subfield_modifications_step.type](field_other_copy_subfield_obj.subfield.value, subfield_modifications_step.args);
- } else {
- throw new Error("Undefined string operation '" + subfield_modifications_step.type + "'");
- }
- });
- });
-
- if (subfield_options.append) {
- var field_other_copy_target_subfields = field_other_copy.subfields.filter(function(subfield) {
- return subfield.code === subfield_options.convertCode;
- });
-
- if (field_other_copy_target_subfields.length > 1) {
- error_invalid_record = new Error('append option cannot be used if there are multiple subfields of same code.');
- error_invalid_record.name = 'InvalidRecordError';
-
- throw error_invalid_record;
- }
- else if (field_other_copy_target_subfields.length === 1) {
- var field_other_copy_target_subfield = field_other_copy_target_subfields[0];
-
- field_other_copy_target_subfield.value = field_other_copy_target_subfield.value + field_other_copy_subfields.reduce(function(str, obj) {
- return str + obj.subfield.value;
- }, '');
- }
- else field_other_copy_subfields.forEach(function(obj) {
- field_other_copy.subfields.push(obj.subfield);
- });
- }
- else {
- if (subfield_options.replace) {
- field_other_copy.subfields = field_other_copy.subfields.filter(function(subfield) {
- return subfield.code !== (subfield_options.convertCode || code);
- });
- }
-
- field_other_copy_subfields.forEach(function(obj) {
- var subfield = obj.subfield;
- var index = obj.index;
-
- if (options.useExisting && fields_merged.length > 0) {
- index += fields_merged[0].subfields.length;
- }
-
- field_other_copy.subfields.splice(index === undefined ? field_other_copy.subfields.length : index, 0, subfield);
- });
- }
- });
- }
-
- field_other.wasUsed = true;
- field_other_copy.fromOther = true;
-
- if (options.convertTag) {
- field_other_copy.tag = options.convertTag;
- }
-
- if (options.useExisting || !options.keepExisting) {
- fields_merged.forEach(function(field) {
- record_merged.fields.splice(record_merged.fields.indexOf(field), 1);
- });
- }
-
- insertField(record_merged, field_other_copy);
-
- return details;
- }
-
- configuration = Object.assign(JSON.parse(JSON.stringify(DEFAULT_OPTIONS)), typeof configuration === 'object' ? configuration : {});
-
- applyPlugins();
-
- return function(record_preferred, record_other, return_details)
- {
-
- var details = return_details ? {} : undefined,
- record_merged = new MarcRecord(record_preferred);
-
- record_merged.fields.forEach(function(field) {
- field.wasUsed = true;
- field.fromPreferred = true;
- });
-
- record_other.fields.forEach(function(field) {
-
-
- var result,
- config = configuration.fields[shim_array.find(Object.keys(configuration.fields), function(key) {
- return new RegExp('^' + key +'$').test(field.tag);
- })];
-
- if (config !== undefined) {
- if (actions.hasOwnProperty(config.action)) {
-
- result = actions[config.action](record_merged, field, config.options, comparators, return_details, record_other);
-
- if (return_details && typeof result === 'object') {
-
- if (!details.hasOwnProperty(field.tag)) {
- details[field.tag] = [];
- }
-
- details[field.tag].push(Object.assign({
- action: config.action
- }, result));
-
- }
-
- } else {
- throw new Error("Undefined action '" + config.action + "'");
- }
- }
-
- });
-
- return !return_details ? record_merged : {
- record: record_merged,
- details: details
- };
-
- };
-
- };
-
-}
diff --git a/package-lock.json b/package-lock.json
index 2eb6c63..0a0659b 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,2898 +1,6232 @@
{
- "name": "@natlibfi/marc-record-merge",
- "version": "5.0.0",
- "lockfileVersion": 1,
- "requires": true,
- "dependencies": {
- "@natlibfi/es6-polyfills": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/@natlibfi/es6-polyfills/-/es6-polyfills-2.0.1.tgz",
- "integrity": "sha1-NyCTRdmgeW3oR0pqr8nvXlR6k34=",
- "requires": {
- "es6-object-assign": "1.1.0",
- "es6-promise-polyfill": "1.2.0"
- }
- },
- "@natlibfi/es6-shims": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/@natlibfi/es6-shims/-/es6-shims-2.0.2.tgz",
- "integrity": "sha1-C1z365VI/6u6AYR45bcxE62IZ/M="
- },
- "abbrev": {
- "version": "1.0.9",
- "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz",
- "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=",
- "dev": true
- },
- "accepts": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz",
- "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=",
- "dev": true,
- "requires": {
- "mime-types": "2.1.17",
- "negotiator": "0.6.1"
- }
- },
- "after": {
- "version": "0.8.2",
- "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz",
- "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=",
- "dev": true
- },
- "align-text": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
- "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
- "dev": true,
- "requires": {
- "kind-of": "3.2.2",
- "longest": "1.0.1",
- "repeat-string": "1.6.1"
- }
- },
- "amdefine": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
- "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
- "dev": true
- },
- "ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
- "dev": true
- },
- "ansi-styles": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
- "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
- "dev": true
- },
- "anymatch": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz",
- "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==",
- "dev": true,
- "requires": {
- "micromatch": "2.3.11",
- "normalize-path": "2.1.1"
- }
- },
- "argparse": {
- "version": "1.0.9",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz",
- "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=",
- "dev": true,
- "requires": {
- "sprintf-js": "1.0.3"
- }
- },
- "arr-diff": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
- "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
- "dev": true,
- "requires": {
- "arr-flatten": "1.1.0"
- }
- },
- "arr-flatten": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
- "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
- "dev": true
- },
- "array-slice": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz",
- "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=",
- "dev": true
- },
- "array-unique": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
- "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=",
- "dev": true
- },
- "arraybuffer.slice": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz",
- "integrity": "sha1-8zshWfBTKj8xB6JywMz70a0peco=",
- "dev": true
- },
- "asn1": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz",
- "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=",
- "dev": true
- },
- "assert-plus": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz",
- "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=",
- "dev": true
- },
- "assertion-error": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.2.tgz",
- "integrity": "sha1-E8pRXYYgbaC6xm6DTdOX2HWBCUw=",
- "dev": true
- },
- "async": {
- "version": "1.5.2",
- "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
- "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
- "dev": true
- },
- "async-each": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz",
- "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=",
- "dev": true
- },
- "aws-sign2": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz",
- "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=",
- "dev": true
- },
- "aws4": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz",
- "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=",
- "dev": true
- },
- "backo2": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz",
- "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=",
- "dev": true
- },
- "balanced-match": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
- "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
- "dev": true
- },
- "base64-arraybuffer": {
- "version": "0.1.5",
- "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz",
- "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=",
- "dev": true
- },
- "base64id": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz",
- "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=",
- "dev": true
- },
- "bcrypt-pbkdf": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz",
- "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=",
- "dev": true,
- "optional": true,
- "requires": {
- "tweetnacl": "0.14.5"
- }
- },
- "better-assert": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz",
- "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=",
- "dev": true,
- "requires": {
- "callsite": "1.0.0"
- }
- },
- "binary-extensions": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.10.0.tgz",
- "integrity": "sha1-muuabF6IY4qtFx4Wf1kAq+JINdA=",
- "dev": true
- },
- "bl": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/bl/-/bl-1.1.2.tgz",
- "integrity": "sha1-/cqHGplxOqANGeO7ukHER4emU5g=",
- "dev": true,
- "requires": {
- "readable-stream": "2.0.6"
- }
- },
- "blob": {
- "version": "0.0.4",
- "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz",
- "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=",
- "dev": true
- },
- "bluebird": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz",
- "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=",
- "dev": true
- },
- "body-parser": {
- "version": "1.18.2",
- "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz",
- "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=",
- "dev": true,
- "requires": {
- "bytes": "3.0.0",
- "content-type": "1.0.4",
- "debug": "2.6.9",
- "depd": "1.1.1",
- "http-errors": "1.6.2",
- "iconv-lite": "0.4.19",
- "on-finished": "2.3.0",
- "qs": "6.5.1",
- "raw-body": "2.3.2",
- "type-is": "1.6.15"
- },
- "dependencies": {
- "qs": {
- "version": "6.5.1",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz",
- "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==",
- "dev": true
- }
- }
- },
- "boom": {
- "version": "2.10.1",
- "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz",
- "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=",
- "dev": true,
- "requires": {
- "hoek": "2.16.3"
- }
- },
- "brace-expansion": {
- "version": "1.1.8",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz",
- "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=",
- "dev": true,
- "requires": {
- "balanced-match": "1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "braces": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
- "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
- "dev": true,
- "requires": {
- "expand-range": "1.8.2",
- "preserve": "0.2.0",
- "repeat-element": "1.1.2"
- }
- },
- "browser-stdout": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz",
- "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=",
- "dev": true
- },
- "bytes": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
- "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=",
- "dev": true
- },
- "callsite": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz",
- "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=",
- "dev": true
- },
- "camelcase": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
- "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=",
- "dev": true,
- "optional": true
- },
- "caseless": {
- "version": "0.11.0",
- "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz",
- "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=",
- "dev": true
- },
- "center-align": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
- "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
- "dev": true,
- "optional": true,
- "requires": {
- "align-text": "0.1.4",
- "lazy-cache": "1.0.4"
- }
- },
- "chai": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz",
- "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=",
- "dev": true,
- "requires": {
- "assertion-error": "1.0.2",
- "deep-eql": "0.1.3",
- "type-detect": "1.0.0"
- }
- },
- "chalk": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
- "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
- "dev": true,
- "requires": {
- "ansi-styles": "2.2.1",
- "escape-string-regexp": "1.0.5",
- "has-ansi": "2.0.0",
- "strip-ansi": "3.0.1",
- "supports-color": "2.0.0"
- }
- },
- "chokidar": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz",
- "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=",
- "dev": true,
- "requires": {
- "anymatch": "1.3.2",
- "async-each": "1.0.1",
- "glob-parent": "2.0.0",
- "inherits": "2.0.3",
- "is-binary-path": "1.0.1",
- "is-glob": "2.0.1",
- "path-is-absolute": "1.0.1",
- "readdirp": "2.1.0"
- }
- },
- "cli": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz",
- "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=",
- "dev": true,
- "requires": {
- "exit": "0.1.2",
- "glob": "7.1.2"
- },
- "dependencies": {
- "glob": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
- "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
- "dev": true,
- "requires": {
- "fs.realpath": "1.0.0",
- "inflight": "1.0.6",
- "inherits": "2.0.3",
- "minimatch": "3.0.4",
- "once": "1.4.0",
- "path-is-absolute": "1.0.1"
- }
- }
- }
- },
- "cliui": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
- "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
- "dev": true,
- "optional": true,
- "requires": {
- "center-align": "0.1.3",
- "right-align": "0.1.3",
- "wordwrap": "0.0.2"
- },
- "dependencies": {
- "wordwrap": {
- "version": "0.0.2",
- "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
- "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=",
- "dev": true,
- "optional": true
- }
- }
- },
- "codeclimate-test-reporter": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/codeclimate-test-reporter/-/codeclimate-test-reporter-0.3.3.tgz",
- "integrity": "sha1-JtI/Q6N9c4AqZqTnbTpTP3h9fqU=",
- "dev": true,
- "requires": {
- "async": "1.5.2",
- "lcov-parse": "0.0.10",
- "request": "2.72.0"
- }
- },
- "colors": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
- "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=",
- "dev": true
- },
- "combine-lists": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/combine-lists/-/combine-lists-1.0.1.tgz",
- "integrity": "sha1-RYwH4J4NkA/Ci3Cj/sLazR0st/Y=",
- "dev": true,
- "requires": {
- "lodash": "4.17.4"
- }
- },
- "combined-stream": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz",
- "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=",
- "dev": true,
- "requires": {
- "delayed-stream": "1.0.0"
- }
- },
- "commander": {
- "version": "2.11.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz",
- "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==",
- "dev": true
- },
- "component-bind": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz",
- "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=",
- "dev": true
- },
- "component-emitter": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz",
- "integrity": "sha1-KWWU8nU9qmOZbSrwjRWpURbJrsM=",
- "dev": true
- },
- "component-inherit": {
- "version": "0.0.3",
- "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz",
- "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=",
- "dev": true
- },
- "concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
- "dev": true
- },
- "connect": {
- "version": "3.6.5",
- "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.5.tgz",
- "integrity": "sha1-+43ee6B2OHfQ7J352sC0tA5yx9o=",
- "dev": true,
- "requires": {
- "debug": "2.6.9",
- "finalhandler": "1.0.6",
- "parseurl": "1.3.2",
- "utils-merge": "1.0.1"
- }
- },
- "console-browserify": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz",
- "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=",
- "dev": true,
- "requires": {
- "date-now": "0.1.4"
- }
- },
- "content-type": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
- "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
- "dev": true
- },
- "cookie": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
- "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=",
- "dev": true
- },
- "core-js": {
- "version": "2.5.1",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.1.tgz",
- "integrity": "sha1-rmh03GaTd4m4B1T/VCjfZoGcpQs=",
- "dev": true
- },
- "core-util-is": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
- "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
- "dev": true
- },
- "cryptiles": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz",
- "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=",
- "dev": true,
- "requires": {
- "boom": "2.10.1"
- }
- },
- "custom-event": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz",
- "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=",
- "dev": true
- },
- "dashdash": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
- "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
- "dev": true,
- "requires": {
- "assert-plus": "1.0.0"
- },
- "dependencies": {
- "assert-plus": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
- "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
- "dev": true
- }
- }
- },
- "date-now": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz",
- "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=",
- "dev": true
- },
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "requires": {
- "ms": "2.0.0"
- }
- },
- "decamelize": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
- "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
- "dev": true,
- "optional": true
- },
- "deep-eql": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz",
- "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=",
- "dev": true,
- "requires": {
- "type-detect": "0.1.1"
- },
- "dependencies": {
- "type-detect": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz",
- "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=",
- "dev": true
- }
- }
- },
- "deep-is": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
- "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
- "dev": true
- },
- "delayed-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
- "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
- "dev": true
- },
- "depd": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz",
- "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=",
- "dev": true
- },
- "di": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz",
- "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=",
- "dev": true
- },
- "diff": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz",
- "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=",
- "dev": true
- },
- "dom-serialize": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz",
- "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=",
- "dev": true,
- "requires": {
- "custom-event": "1.0.1",
- "ent": "2.2.0",
- "extend": "3.0.1",
- "void-elements": "2.0.1"
- }
- },
- "dom-serializer": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz",
- "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=",
- "dev": true,
- "requires": {
- "domelementtype": "1.1.3",
- "entities": "1.1.1"
- },
- "dependencies": {
- "domelementtype": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz",
- "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=",
- "dev": true
- },
- "entities": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz",
- "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=",
- "dev": true
- }
- }
- },
- "domelementtype": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz",
- "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=",
- "dev": true
- },
- "domhandler": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz",
- "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=",
- "dev": true,
- "requires": {
- "domelementtype": "1.3.0"
- }
- },
- "domutils": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz",
- "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=",
- "dev": true,
- "requires": {
- "dom-serializer": "0.1.0",
- "domelementtype": "1.3.0"
- }
- },
- "ecc-jsbn": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz",
- "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=",
- "dev": true,
- "optional": true,
- "requires": {
- "jsbn": "0.1.1"
- }
- },
- "ee-first": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
- "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
- "dev": true
- },
- "encodeurl": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz",
- "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=",
- "dev": true
- },
- "engine.io": {
- "version": "1.8.3",
- "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-1.8.3.tgz",
- "integrity": "sha1-jef5eJXSDTm4X4ju7nd7K9QrE9Q=",
- "dev": true,
- "requires": {
- "accepts": "1.3.3",
- "base64id": "1.0.0",
- "cookie": "0.3.1",
- "debug": "2.3.3",
- "engine.io-parser": "1.3.2",
- "ws": "1.1.2"
- },
- "dependencies": {
- "debug": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz",
- "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=",
- "dev": true,
- "requires": {
- "ms": "0.7.2"
- }
- },
- "ms": {
- "version": "0.7.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz",
- "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=",
- "dev": true
- }
- }
- },
- "engine.io-client": {
- "version": "1.8.3",
- "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-1.8.3.tgz",
- "integrity": "sha1-F5jtk0USRkU9TG9jXXogH+lA1as=",
- "dev": true,
- "requires": {
- "component-emitter": "1.2.1",
- "component-inherit": "0.0.3",
- "debug": "2.3.3",
- "engine.io-parser": "1.3.2",
- "has-cors": "1.1.0",
- "indexof": "0.0.1",
- "parsejson": "0.0.3",
- "parseqs": "0.0.5",
- "parseuri": "0.0.5",
- "ws": "1.1.2",
- "xmlhttprequest-ssl": "1.5.3",
- "yeast": "0.1.2"
- },
- "dependencies": {
- "component-emitter": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
- "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
- "dev": true
- },
- "debug": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz",
- "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=",
- "dev": true,
- "requires": {
- "ms": "0.7.2"
- }
- },
- "ms": {
- "version": "0.7.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz",
- "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=",
- "dev": true
- }
- }
- },
- "engine.io-parser": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.3.2.tgz",
- "integrity": "sha1-k3sHnwAH0Ik+xW1GyyILjLQ1Igo=",
- "dev": true,
- "requires": {
- "after": "0.8.2",
- "arraybuffer.slice": "0.0.6",
- "base64-arraybuffer": "0.1.5",
- "blob": "0.0.4",
- "has-binary": "0.1.7",
- "wtf-8": "1.0.0"
- }
- },
- "ent": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz",
- "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=",
- "dev": true
- },
- "entities": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz",
- "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=",
- "dev": true
- },
- "es6-object-assign": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz",
- "integrity": "sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw="
- },
- "es6-promise-polyfill": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/es6-promise-polyfill/-/es6-promise-polyfill-1.2.0.tgz",
- "integrity": "sha1-84kl8jyz4+jObNqP93T867sJDN4="
- },
- "escape-html": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
- "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
- "dev": true
- },
- "escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
- "dev": true
- },
- "escodegen": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz",
- "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=",
- "dev": true,
- "requires": {
- "esprima": "2.7.3",
- "estraverse": "1.9.3",
- "esutils": "2.0.2",
- "optionator": "0.8.2",
- "source-map": "0.2.0"
- }
- },
- "esprima": {
- "version": "2.7.3",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
- "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=",
- "dev": true
- },
- "estraverse": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz",
- "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=",
- "dev": true
- },
- "esutils": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
- "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
- "dev": true
- },
- "eventemitter3": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz",
- "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=",
- "dev": true
- },
- "exit": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
- "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=",
- "dev": true
- },
- "expand-braces": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/expand-braces/-/expand-braces-0.1.2.tgz",
- "integrity": "sha1-SIsdHSRRyz06axks/AMPRMWFX+o=",
- "dev": true,
- "requires": {
- "array-slice": "0.2.3",
- "array-unique": "0.2.1",
- "braces": "0.1.5"
- },
- "dependencies": {
- "braces": {
- "version": "0.1.5",
- "resolved": "https://registry.npmjs.org/braces/-/braces-0.1.5.tgz",
- "integrity": "sha1-wIVxEIUpHYt1/ddOqw+FlygHEeY=",
- "dev": true,
- "requires": {
- "expand-range": "0.1.1"
- }
- },
- "expand-range": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-0.1.1.tgz",
- "integrity": "sha1-TLjtoJk8pW+k9B/ELzy7TMrf8EQ=",
- "dev": true,
- "requires": {
- "is-number": "0.1.1",
- "repeat-string": "0.2.2"
- }
- },
- "is-number": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-0.1.1.tgz",
- "integrity": "sha1-aaevEWlj1HIG7JvZtIoUIW8eOAY=",
- "dev": true
- },
- "repeat-string": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-0.2.2.tgz",
- "integrity": "sha1-x6jTI2BoNiBZp+RlH8aITosftK4=",
- "dev": true
- }
- }
- },
- "expand-brackets": {
- "version": "0.1.5",
- "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
- "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
- "dev": true,
- "requires": {
- "is-posix-bracket": "0.1.1"
- }
- },
- "expand-range": {
- "version": "1.8.2",
- "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
- "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
- "dev": true,
- "requires": {
- "fill-range": "2.2.3"
- }
- },
- "extend": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz",
- "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=",
- "dev": true
- },
- "extglob": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
- "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
- "dev": true,
- "requires": {
- "is-extglob": "1.0.0"
- }
- },
- "extsprintf": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
- "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
- "dev": true
- },
- "fast-levenshtein": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
- "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
- "dev": true
- },
- "filename-regex": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz",
- "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=",
- "dev": true
- },
- "fill-range": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz",
- "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=",
- "dev": true,
- "requires": {
- "is-number": "2.1.0",
- "isobject": "2.1.0",
- "randomatic": "1.1.7",
- "repeat-element": "1.1.2",
- "repeat-string": "1.6.1"
- }
- },
- "finalhandler": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.0.6.tgz",
- "integrity": "sha1-AHrqM9Gk0+QgF/YkhIrVjSEvgU8=",
- "dev": true,
- "requires": {
- "debug": "2.6.9",
- "encodeurl": "1.0.1",
- "escape-html": "1.0.3",
- "on-finished": "2.3.0",
- "parseurl": "1.3.2",
- "statuses": "1.3.1",
- "unpipe": "1.0.0"
- }
- },
- "for-in": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
- "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
- "dev": true
- },
- "for-own": {
- "version": "0.1.5",
- "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
- "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
- "dev": true,
- "requires": {
- "for-in": "1.0.2"
- }
- },
- "forever-agent": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
- "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
- "dev": true
- },
- "form-data": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.1.tgz",
- "integrity": "sha1-rjFduaSQf6BlUCMEpm13M0de43w=",
- "dev": true,
- "requires": {
- "async": "2.5.0",
- "combined-stream": "1.0.5",
- "mime-types": "2.1.17"
- },
- "dependencies": {
- "async": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/async/-/async-2.5.0.tgz",
- "integrity": "sha512-e+lJAJeNWuPCNyxZKOBdaJGyLGHugXVQtrAwtuAe2vhxTYxFTKE73p8JuTmdH0qdQZtDvI4dhJwjZc5zsfIsYw==",
- "dev": true,
- "requires": {
- "lodash": "4.17.4"
- }
- }
- }
- },
- "fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
- "dev": true
- },
- "generate-function": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz",
- "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=",
- "dev": true
- },
- "generate-object-property": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz",
- "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=",
- "dev": true,
- "requires": {
- "is-property": "1.0.2"
- }
- },
- "getpass": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
- "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
- "dev": true,
- "requires": {
- "assert-plus": "1.0.0"
- },
- "dependencies": {
- "assert-plus": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
- "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
- "dev": true
- }
- }
- },
- "glob": {
- "version": "5.0.15",
- "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
- "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
- "dev": true,
- "requires": {
- "inflight": "1.0.6",
- "inherits": "2.0.3",
- "minimatch": "3.0.4",
- "once": "1.4.0",
- "path-is-absolute": "1.0.1"
- }
- },
- "glob-base": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz",
- "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
- "dev": true,
- "requires": {
- "glob-parent": "2.0.0",
- "is-glob": "2.0.1"
- }
- },
- "glob-parent": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
- "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
- "dev": true,
- "requires": {
- "is-glob": "2.0.1"
- }
- },
- "graceful-fs": {
- "version": "4.1.11",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
- "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
- "dev": true
- },
- "graceful-readlink": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz",
- "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=",
- "dev": true
- },
- "growl": {
- "version": "1.9.2",
- "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz",
- "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=",
- "dev": true
- },
- "handlebars": {
- "version": "4.0.10",
- "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.10.tgz",
- "integrity": "sha1-PTDHGLCaPZbyPqTMH0A8TTup/08=",
- "dev": true,
- "requires": {
- "async": "1.5.2",
- "optimist": "0.6.1",
- "source-map": "0.4.4",
- "uglify-js": "2.8.29"
- },
- "dependencies": {
- "source-map": {
- "version": "0.4.4",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
- "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
- "dev": true,
- "requires": {
- "amdefine": "1.0.1"
- }
- }
- }
- },
- "har-validator": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz",
- "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=",
- "dev": true,
- "requires": {
- "chalk": "1.1.3",
- "commander": "2.11.0",
- "is-my-json-valid": "2.16.1",
- "pinkie-promise": "2.0.1"
- }
- },
- "has-ansi": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
- "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
- "dev": true,
- "requires": {
- "ansi-regex": "2.1.1"
- }
- },
- "has-binary": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.7.tgz",
- "integrity": "sha1-aOYesWIQyVRaClzOBqhzkS/h5ow=",
- "dev": true,
- "requires": {
- "isarray": "0.0.1"
- },
- "dependencies": {
- "isarray": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
- "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
- "dev": true
- }
- }
- },
- "has-cors": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz",
- "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=",
- "dev": true
- },
- "has-flag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
- "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
- "dev": true
- },
- "hawk": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz",
- "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=",
- "dev": true,
- "requires": {
- "boom": "2.10.1",
- "cryptiles": "2.0.5",
- "hoek": "2.16.3",
- "sntp": "1.0.9"
- }
- },
- "he": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz",
- "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=",
- "dev": true
- },
- "hoek": {
- "version": "2.16.3",
- "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz",
- "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=",
- "dev": true
- },
- "htmlparser2": {
- "version": "3.8.3",
- "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz",
- "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=",
- "dev": true,
- "requires": {
- "domelementtype": "1.3.0",
- "domhandler": "2.3.0",
- "domutils": "1.5.1",
- "entities": "1.0.0",
- "readable-stream": "1.1.14"
- },
- "dependencies": {
- "isarray": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
- "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
- "dev": true
- },
- "readable-stream": {
- "version": "1.1.14",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
- "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
- "dev": true,
- "requires": {
- "core-util-is": "1.0.2",
- "inherits": "2.0.3",
- "isarray": "0.0.1",
- "string_decoder": "0.10.31"
- }
- }
- }
- },
- "http-errors": {
- "version": "1.6.2",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz",
- "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=",
- "dev": true,
- "requires": {
- "depd": "1.1.1",
- "inherits": "2.0.3",
- "setprototypeof": "1.0.3",
- "statuses": "1.3.1"
- }
- },
- "http-proxy": {
- "version": "1.16.2",
- "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.16.2.tgz",
- "integrity": "sha1-Bt/ykpUr9k2+hHH6nfcwZtTzd0I=",
- "dev": true,
- "requires": {
- "eventemitter3": "1.2.0",
- "requires-port": "1.0.0"
- }
- },
- "http-signature": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz",
- "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=",
- "dev": true,
- "requires": {
- "assert-plus": "0.2.0",
- "jsprim": "1.4.1",
- "sshpk": "1.13.1"
- }
- },
- "iconv-lite": {
- "version": "0.4.19",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz",
- "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==",
- "dev": true
- },
- "indexof": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz",
- "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=",
- "dev": true
- },
- "inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
- "dev": true,
- "requires": {
- "once": "1.4.0",
- "wrappy": "1.0.2"
- }
- },
- "inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
- "dev": true
- },
- "is-binary-path": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
- "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
- "dev": true,
- "requires": {
- "binary-extensions": "1.10.0"
- }
- },
- "is-buffer": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz",
- "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=",
- "dev": true
- },
- "is-dotfile": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz",
- "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=",
- "dev": true
- },
- "is-equal-shallow": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz",
- "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=",
- "dev": true,
- "requires": {
- "is-primitive": "2.0.0"
- }
- },
- "is-extendable": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
- "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
- "dev": true
- },
- "is-extglob": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
- "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
- "dev": true
- },
- "is-glob": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
- "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
- "dev": true,
- "requires": {
- "is-extglob": "1.0.0"
- }
- },
- "is-my-json-valid": {
- "version": "2.16.1",
- "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.1.tgz",
- "integrity": "sha512-ochPsqWS1WXj8ZnMIV0vnNXooaMhp7cyL4FMSIPKTtnV0Ha/T19G2b9kkhcNsabV9bxYkze7/aLZJb/bYuFduQ==",
- "dev": true,
- "requires": {
- "generate-function": "2.0.0",
- "generate-object-property": "1.2.0",
- "jsonpointer": "4.0.1",
- "xtend": "4.0.1"
- }
- },
- "is-number": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
- "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
- "dev": true,
- "requires": {
- "kind-of": "3.2.2"
- }
- },
- "is-posix-bracket": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz",
- "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=",
- "dev": true
- },
- "is-primitive": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz",
- "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=",
- "dev": true
- },
- "is-property": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",
- "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=",
- "dev": true
- },
- "is-typedarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
- "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
- "dev": true
- },
- "isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
- "dev": true
- },
- "isbinaryfile": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.2.tgz",
- "integrity": "sha1-Sj6XTsDLqQBNP8bN5yCeppNopiE=",
- "dev": true
- },
- "isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
- "dev": true
- },
- "isobject": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
- "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
- "dev": true,
- "requires": {
- "isarray": "1.0.0"
- }
- },
- "isstream": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
- "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
- "dev": true
- },
- "istanbul": {
- "version": "0.4.5",
- "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz",
- "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=",
- "dev": true,
- "requires": {
- "abbrev": "1.0.9",
- "async": "1.5.2",
- "escodegen": "1.8.1",
- "esprima": "2.7.3",
- "glob": "5.0.15",
- "handlebars": "4.0.10",
- "js-yaml": "3.10.0",
- "mkdirp": "0.5.1",
- "nopt": "3.0.6",
- "once": "1.4.0",
- "resolve": "1.1.7",
- "supports-color": "3.2.3",
- "which": "1.3.0",
- "wordwrap": "1.0.0"
- },
- "dependencies": {
- "supports-color": {
- "version": "3.2.3",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
- "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
- "dev": true,
- "requires": {
- "has-flag": "1.0.0"
- }
- }
- }
- },
- "js-yaml": {
- "version": "3.10.0",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz",
- "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==",
- "dev": true,
- "requires": {
- "argparse": "1.0.9",
- "esprima": "4.0.0"
- },
- "dependencies": {
- "esprima": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz",
- "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==",
- "dev": true
- }
- }
- },
- "jsbn": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
- "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
- "dev": true,
- "optional": true
- },
- "jshint": {
- "version": "2.9.5",
- "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.9.5.tgz",
- "integrity": "sha1-HnJSkVzmgbQIJ+4UJIxG006apiw=",
- "dev": true,
- "requires": {
- "cli": "1.0.1",
- "console-browserify": "1.1.0",
- "exit": "0.1.2",
- "htmlparser2": "3.8.3",
- "lodash": "3.7.0",
- "minimatch": "3.0.4",
- "shelljs": "0.3.0",
- "strip-json-comments": "1.0.4"
- },
- "dependencies": {
- "lodash": {
- "version": "3.7.0",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.7.0.tgz",
- "integrity": "sha1-Nni9irmVBXwHreg27S7wh9qBHUU=",
- "dev": true
- }
- }
- },
- "json-schema": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
- "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
- "dev": true
- },
- "json-stringify-safe": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
- "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
- "dev": true
- },
- "json3": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz",
- "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=",
- "dev": true
- },
- "jsonpointer": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz",
- "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=",
- "dev": true
- },
- "jsprim": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
- "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
- "dev": true,
- "requires": {
- "assert-plus": "1.0.0",
- "extsprintf": "1.3.0",
- "json-schema": "0.2.3",
- "verror": "1.10.0"
- },
- "dependencies": {
- "assert-plus": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
- "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
- "dev": true
- }
- }
- },
- "karma": {
- "version": "1.7.1",
- "resolved": "https://registry.npmjs.org/karma/-/karma-1.7.1.tgz",
- "integrity": "sha512-k5pBjHDhmkdaUccnC7gE3mBzZjcxyxYsYVaqiL2G5AqlfLyBO5nw2VdNK+O16cveEPd/gIOWULH7gkiYYwVNHg==",
- "dev": true,
- "requires": {
- "bluebird": "3.5.0",
- "body-parser": "1.18.2",
- "chokidar": "1.7.0",
- "colors": "1.1.2",
- "combine-lists": "1.0.1",
- "connect": "3.6.5",
- "core-js": "2.5.1",
- "di": "0.0.1",
- "dom-serialize": "2.2.1",
- "expand-braces": "0.1.2",
- "glob": "7.1.2",
- "graceful-fs": "4.1.11",
- "http-proxy": "1.16.2",
- "isbinaryfile": "3.0.2",
- "lodash": "3.10.1",
- "log4js": "0.6.38",
- "mime": "1.4.1",
- "minimatch": "3.0.4",
- "optimist": "0.6.1",
- "qjobs": "1.1.5",
- "range-parser": "1.2.0",
- "rimraf": "2.6.2",
- "safe-buffer": "5.1.1",
- "socket.io": "1.7.3",
- "source-map": "0.5.7",
- "tmp": "0.0.31",
- "useragent": "2.2.1"
- },
- "dependencies": {
- "glob": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
- "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
- "dev": true,
- "requires": {
- "fs.realpath": "1.0.0",
- "inflight": "1.0.6",
- "inherits": "2.0.3",
- "minimatch": "3.0.4",
- "once": "1.4.0",
- "path-is-absolute": "1.0.1"
- }
- },
- "lodash": {
- "version": "3.10.1",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
- "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=",
- "dev": true
- },
- "source-map": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
- "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
- "dev": true
- }
- }
- },
- "karma-mocha": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/karma-mocha/-/karma-mocha-1.3.0.tgz",
- "integrity": "sha1-7qrH/8DiAetjxGdEDStpx883eL8=",
- "dev": true,
- "requires": {
- "minimist": "1.2.0"
- },
- "dependencies": {
- "minimist": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
- "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
- "dev": true
- }
- }
- },
- "karma-requirejs": {
- "version": "git+https://github.com/natlibfi-arlehiko/karma-requirejs.git#0b905362f3ed6802112a6fc0863cf3496ad6fc35",
- "dev": true,
- "requires": {
- "requirejs": "2.3.5"
- }
- },
- "karma-requirejs-preprocessor": {
- "version": "0.0.2",
- "resolved": "https://registry.npmjs.org/karma-requirejs-preprocessor/-/karma-requirejs-preprocessor-0.0.2.tgz",
- "integrity": "sha1-UXs7UnHaD2rS/lr0U9K6AV98ibE=",
- "dev": true
- },
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "requires": {
- "is-buffer": "1.1.5"
- }
- },
- "lazy-cache": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
- "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=",
- "dev": true,
- "optional": true
- },
- "lcov-parse": {
- "version": "0.0.10",
- "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz",
- "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=",
- "dev": true
- },
- "levn": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
- "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
- "dev": true,
- "requires": {
- "prelude-ls": "1.1.2",
- "type-check": "0.3.2"
- }
- },
- "lodash": {
- "version": "4.17.4",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz",
- "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=",
- "dev": true
- },
- "lodash._baseassign": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz",
- "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=",
- "dev": true,
- "requires": {
- "lodash._basecopy": "3.0.1",
- "lodash.keys": "3.1.2"
- }
- },
- "lodash._basecopy": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz",
- "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=",
- "dev": true
- },
- "lodash._basecreate": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz",
- "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=",
- "dev": true
- },
- "lodash._getnative": {
- "version": "3.9.1",
- "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz",
- "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=",
- "dev": true
- },
- "lodash._isiterateecall": {
- "version": "3.0.9",
- "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz",
- "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=",
- "dev": true
- },
- "lodash.create": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz",
- "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=",
- "dev": true,
- "requires": {
- "lodash._baseassign": "3.2.0",
- "lodash._basecreate": "3.0.3",
- "lodash._isiterateecall": "3.0.9"
- }
- },
- "lodash.isarguments": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz",
- "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=",
- "dev": true
- },
- "lodash.isarray": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz",
- "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=",
- "dev": true
- },
- "lodash.keys": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz",
- "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=",
- "dev": true,
- "requires": {
- "lodash._getnative": "3.9.1",
- "lodash.isarguments": "3.1.0",
- "lodash.isarray": "3.0.4"
- }
- },
- "log4js": {
- "version": "0.6.38",
- "resolved": "https://registry.npmjs.org/log4js/-/log4js-0.6.38.tgz",
- "integrity": "sha1-LElBFmldb7JUgJQ9P8hy5mKlIv0=",
- "dev": true,
- "requires": {
- "readable-stream": "1.0.34",
- "semver": "4.3.6"
- },
- "dependencies": {
- "isarray": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
- "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
- "dev": true
- },
- "readable-stream": {
- "version": "1.0.34",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
- "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
- "dev": true,
- "requires": {
- "core-util-is": "1.0.2",
- "inherits": "2.0.3",
- "isarray": "0.0.1",
- "string_decoder": "0.10.31"
- }
- }
- }
- },
- "longest": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
- "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=",
- "dev": true
- },
- "lru-cache": {
- "version": "2.2.4",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.2.4.tgz",
- "integrity": "sha1-bGWGGb7PFAMdDQtZSxYELOTcBj0=",
- "dev": true
- },
- "marc-record-js": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/marc-record-js/-/marc-record-js-0.1.1.tgz",
- "integrity": "sha1-XNORdo/BeL/RI60fZddwVsBw4mU="
- },
- "media-typer": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
- "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
- "dev": true
- },
- "micromatch": {
- "version": "2.3.11",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
- "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
- "dev": true,
- "requires": {
- "arr-diff": "2.0.0",
- "array-unique": "0.2.1",
- "braces": "1.8.5",
- "expand-brackets": "0.1.5",
- "extglob": "0.3.2",
- "filename-regex": "2.0.1",
- "is-extglob": "1.0.0",
- "is-glob": "2.0.1",
- "kind-of": "3.2.2",
- "normalize-path": "2.1.1",
- "object.omit": "2.0.1",
- "parse-glob": "3.0.4",
- "regex-cache": "0.4.4"
- }
- },
- "mime": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz",
- "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==",
- "dev": true
- },
- "mime-db": {
- "version": "1.30.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz",
- "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=",
- "dev": true
- },
- "mime-types": {
- "version": "2.1.17",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz",
- "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=",
- "dev": true,
- "requires": {
- "mime-db": "1.30.0"
- }
- },
- "minimatch": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
- "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
- "dev": true,
- "requires": {
- "brace-expansion": "1.1.8"
- }
- },
- "minimist": {
- "version": "0.0.10",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
- "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=",
- "dev": true
- },
- "mkdirp": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
- "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
- "dev": true,
- "requires": {
- "minimist": "0.0.8"
- },
- "dependencies": {
- "minimist": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
- "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
- "dev": true
- }
- }
- },
- "mocha": {
- "version": "3.5.3",
- "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.3.tgz",
- "integrity": "sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg==",
- "dev": true,
- "requires": {
- "browser-stdout": "1.3.0",
- "commander": "2.9.0",
- "debug": "2.6.8",
- "diff": "3.2.0",
- "escape-string-regexp": "1.0.5",
- "glob": "7.1.1",
- "growl": "1.9.2",
- "he": "1.1.1",
- "json3": "3.3.2",
- "lodash.create": "3.1.1",
- "mkdirp": "0.5.1",
- "supports-color": "3.1.2"
- },
- "dependencies": {
- "commander": {
- "version": "2.9.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz",
- "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=",
- "dev": true,
- "requires": {
- "graceful-readlink": "1.0.1"
- }
- },
- "debug": {
- "version": "2.6.8",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz",
- "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=",
- "dev": true,
- "requires": {
- "ms": "2.0.0"
- }
- },
- "glob": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz",
- "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=",
- "dev": true,
- "requires": {
- "fs.realpath": "1.0.0",
- "inflight": "1.0.6",
- "inherits": "2.0.3",
- "minimatch": "3.0.4",
- "once": "1.4.0",
- "path-is-absolute": "1.0.1"
- }
- },
- "supports-color": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz",
- "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=",
- "dev": true,
- "requires": {
- "has-flag": "1.0.0"
- }
- }
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
- "dev": true
- },
- "negotiator": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
- "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=",
- "dev": true
- },
- "node-uuid": {
- "version": "1.4.8",
- "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz",
- "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=",
- "dev": true
- },
- "nopt": {
- "version": "3.0.6",
- "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
- "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
- "dev": true,
- "requires": {
- "abbrev": "1.0.9"
- }
- },
- "normalize-path": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
- "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
- "dev": true,
- "requires": {
- "remove-trailing-separator": "1.1.0"
- }
- },
- "oauth-sign": {
- "version": "0.8.2",
- "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz",
- "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=",
- "dev": true
- },
- "object-assign": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz",
- "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=",
- "dev": true
- },
- "object-component": {
- "version": "0.0.3",
- "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz",
- "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=",
- "dev": true
- },
- "object.omit": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz",
- "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=",
- "dev": true,
- "requires": {
- "for-own": "0.1.5",
- "is-extendable": "0.1.1"
- }
- },
- "on-finished": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
- "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
- "dev": true,
- "requires": {
- "ee-first": "1.1.1"
- }
- },
- "once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
- "dev": true,
- "requires": {
- "wrappy": "1.0.2"
- }
- },
- "optimist": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
- "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
- "dev": true,
- "requires": {
- "minimist": "0.0.10",
- "wordwrap": "0.0.3"
- },
- "dependencies": {
- "wordwrap": {
- "version": "0.0.3",
- "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
- "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=",
- "dev": true
- }
- }
- },
- "optionator": {
- "version": "0.8.2",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
- "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
- "dev": true,
- "requires": {
- "deep-is": "0.1.3",
- "fast-levenshtein": "2.0.6",
- "levn": "0.3.0",
- "prelude-ls": "1.1.2",
- "type-check": "0.3.2",
- "wordwrap": "1.0.0"
- }
- },
- "options": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz",
- "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=",
- "dev": true
- },
- "os-tmpdir": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
- "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
- "dev": true
- },
- "parse-glob": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz",
- "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
- "dev": true,
- "requires": {
- "glob-base": "0.3.0",
- "is-dotfile": "1.0.3",
- "is-extglob": "1.0.0",
- "is-glob": "2.0.1"
- }
- },
- "parsejson": {
- "version": "0.0.3",
- "resolved": "https://registry.npmjs.org/parsejson/-/parsejson-0.0.3.tgz",
- "integrity": "sha1-q343WfIJ7OmUN5c/fQ8fZK4OZKs=",
- "dev": true,
- "requires": {
- "better-assert": "1.0.2"
- }
- },
- "parseqs": {
- "version": "0.0.5",
- "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz",
- "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=",
- "dev": true,
- "requires": {
- "better-assert": "1.0.2"
- }
- },
- "parseuri": {
- "version": "0.0.5",
- "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz",
- "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=",
- "dev": true,
- "requires": {
- "better-assert": "1.0.2"
- }
- },
- "parseurl": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz",
- "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=",
- "dev": true
- },
- "path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
- "dev": true
- },
- "pinkie": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
- "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
- "dev": true
- },
- "pinkie-promise": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
- "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
- "dev": true,
- "requires": {
- "pinkie": "2.0.4"
- }
- },
- "pkguid": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/pkguid/-/pkguid-1.1.1.tgz",
- "integrity": "sha1-4ONtwmik/gzDOeX1t3Ral9BW7xw=",
- "dev": true
- },
- "prelude-ls": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
- "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
- "dev": true
- },
- "preserve": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
- "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=",
- "dev": true
- },
- "process-nextick-args": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
- "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=",
- "dev": true
- },
- "qjobs": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.1.5.tgz",
- "integrity": "sha1-ZZ3p8s+NzCehSBJ28gU3cnI4LnM=",
- "dev": true
- },
- "qs": {
- "version": "6.1.2",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.1.2.tgz",
- "integrity": "sha1-tZ2JJdDJme9tY6z0rFq7CtqiS1Q=",
- "dev": true
- },
- "ramda": {
- "version": "0.4.3",
- "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.4.3.tgz",
- "integrity": "sha1-Wut42/HIZOolqIvQXscbSx/nr1I=",
- "dev": true
- },
- "randomatic": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz",
- "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==",
- "dev": true,
- "requires": {
- "is-number": "3.0.0",
- "kind-of": "4.0.0"
- },
- "dependencies": {
- "is-number": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
- "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
- "dev": true,
- "requires": {
- "kind-of": "3.2.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "requires": {
- "is-buffer": "1.1.5"
- }
- }
- }
- },
- "kind-of": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
- "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
- "dev": true,
- "requires": {
- "is-buffer": "1.1.5"
- }
- }
- }
- },
- "range-parser": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
- "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=",
- "dev": true
- },
- "raw-body": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz",
- "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=",
- "dev": true,
- "requires": {
- "bytes": "3.0.0",
- "http-errors": "1.6.2",
- "iconv-lite": "0.4.19",
- "unpipe": "1.0.0"
- }
- },
- "readable-stream": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz",
- "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=",
- "dev": true,
- "requires": {
- "core-util-is": "1.0.2",
- "inherits": "2.0.3",
- "isarray": "1.0.0",
- "process-nextick-args": "1.0.7",
- "string_decoder": "0.10.31",
- "util-deprecate": "1.0.2"
- }
- },
- "readdirp": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz",
- "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=",
- "dev": true,
- "requires": {
- "graceful-fs": "4.1.11",
- "minimatch": "3.0.4",
- "readable-stream": "2.0.6",
- "set-immediate-shim": "1.0.1"
- }
- },
- "regex-cache": {
- "version": "0.4.4",
- "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz",
- "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==",
- "dev": true,
- "requires": {
- "is-equal-shallow": "0.1.3"
- }
- },
- "remove-trailing-separator": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
- "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
- "dev": true
- },
- "repeat-element": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
- "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=",
- "dev": true
- },
- "repeat-string": {
- "version": "1.6.1",
- "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
- "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
- "dev": true
- },
- "request": {
- "version": "2.72.0",
- "resolved": "https://registry.npmjs.org/request/-/request-2.72.0.tgz",
- "integrity": "sha1-DOOheVEmILEEQfFMguIcEsDdtOE=",
- "dev": true,
- "requires": {
- "aws-sign2": "0.6.0",
- "aws4": "1.6.0",
- "bl": "1.1.2",
- "caseless": "0.11.0",
- "combined-stream": "1.0.5",
- "extend": "3.0.1",
- "forever-agent": "0.6.1",
- "form-data": "1.0.1",
- "har-validator": "2.0.6",
- "hawk": "3.1.3",
- "http-signature": "1.1.1",
- "is-typedarray": "1.0.0",
- "isstream": "0.1.2",
- "json-stringify-safe": "5.0.1",
- "mime-types": "2.1.17",
- "node-uuid": "1.4.8",
- "oauth-sign": "0.8.2",
- "qs": "6.1.2",
- "stringstream": "0.0.5",
- "tough-cookie": "2.2.2",
- "tunnel-agent": "0.4.3"
- }
- },
- "requirejs": {
- "version": "2.3.5",
- "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.3.5.tgz",
- "integrity": "sha512-svnO+aNcR/an9Dpi44C7KSAy5fFGLtmPbaaCeQaklUz8BQhS64tWWIIlvEA5jrWICzlO/X9KSzSeXFnZdBu8nw==",
- "dev": true
- },
- "requirejs-configurator": {
- "version": "git+https://github.com/natlibfi-arlehiko/requirejs-configurator.git#087cfd7f5e2677a1e842ed7d908c629254db7ec3",
- "dev": true,
- "requires": {
- "lodash": "2.4.2",
- "pkguid": "1.1.1",
- "ramda": "0.4.3",
- "resolve": "1.1.7",
- "when": "3.7.8"
- },
- "dependencies": {
- "lodash": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz",
- "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=",
- "dev": true
- }
- }
- },
- "requires-port": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
- "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
- "dev": true
- },
- "resolve": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
- "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=",
- "dev": true
- },
- "right-align": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
- "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
- "dev": true,
- "optional": true,
- "requires": {
- "align-text": "0.1.4"
- }
- },
- "rimraf": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
- "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
- "dev": true,
- "requires": {
- "glob": "7.1.2"
- },
- "dependencies": {
- "glob": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
- "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
- "dev": true,
- "requires": {
- "fs.realpath": "1.0.0",
- "inflight": "1.0.6",
- "inherits": "2.0.3",
- "minimatch": "3.0.4",
- "once": "1.4.0",
- "path-is-absolute": "1.0.1"
- }
- }
- }
- },
- "safe-buffer": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
- "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==",
- "dev": true
- },
- "semver": {
- "version": "4.3.6",
- "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz",
- "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=",
- "dev": true
- },
- "set-immediate-shim": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz",
- "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=",
- "dev": true
- },
- "setprototypeof": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz",
- "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=",
- "dev": true
- },
- "shelljs": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz",
- "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=",
- "dev": true
- },
- "sntp": {
- "version": "1.0.9",
- "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz",
- "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=",
- "dev": true,
- "requires": {
- "hoek": "2.16.3"
- }
- },
- "socket.io": {
- "version": "1.7.3",
- "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-1.7.3.tgz",
- "integrity": "sha1-uK+cq6AJSeVo42nxMn6pvp6iRhs=",
- "dev": true,
- "requires": {
- "debug": "2.3.3",
- "engine.io": "1.8.3",
- "has-binary": "0.1.7",
- "object-assign": "4.1.0",
- "socket.io-adapter": "0.5.0",
- "socket.io-client": "1.7.3",
- "socket.io-parser": "2.3.1"
- },
- "dependencies": {
- "debug": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz",
- "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=",
- "dev": true,
- "requires": {
- "ms": "0.7.2"
- }
- },
- "ms": {
- "version": "0.7.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz",
- "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=",
- "dev": true
- }
- }
- },
- "socket.io-adapter": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz",
- "integrity": "sha1-y21LuL7IHhB4uZZ3+c7QBGBmu4s=",
- "dev": true,
- "requires": {
- "debug": "2.3.3",
- "socket.io-parser": "2.3.1"
- },
- "dependencies": {
- "debug": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz",
- "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=",
- "dev": true,
- "requires": {
- "ms": "0.7.2"
- }
- },
- "ms": {
- "version": "0.7.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz",
- "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=",
- "dev": true
- }
- }
- },
- "socket.io-client": {
- "version": "1.7.3",
- "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-1.7.3.tgz",
- "integrity": "sha1-sw6GqhDV7zVGYBwJzeR2Xjgdo3c=",
- "dev": true,
- "requires": {
- "backo2": "1.0.2",
- "component-bind": "1.0.0",
- "component-emitter": "1.2.1",
- "debug": "2.3.3",
- "engine.io-client": "1.8.3",
- "has-binary": "0.1.7",
- "indexof": "0.0.1",
- "object-component": "0.0.3",
- "parseuri": "0.0.5",
- "socket.io-parser": "2.3.1",
- "to-array": "0.1.4"
- },
- "dependencies": {
- "component-emitter": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
- "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
- "dev": true
- },
- "debug": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz",
- "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=",
- "dev": true,
- "requires": {
- "ms": "0.7.2"
- }
- },
- "ms": {
- "version": "0.7.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz",
- "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=",
- "dev": true
- }
- }
- },
- "socket.io-parser": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.3.1.tgz",
- "integrity": "sha1-3VMgJRA85Clpcya+/WQAX8/ltKA=",
- "dev": true,
- "requires": {
- "component-emitter": "1.1.2",
- "debug": "2.2.0",
- "isarray": "0.0.1",
- "json3": "3.3.2"
- },
- "dependencies": {
- "debug": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz",
- "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=",
- "dev": true,
- "requires": {
- "ms": "0.7.1"
- }
- },
- "isarray": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
- "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
- "dev": true
- },
- "ms": {
- "version": "0.7.1",
- "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz",
- "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=",
- "dev": true
- }
- }
- },
- "source-map": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz",
- "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=",
- "dev": true,
- "optional": true,
- "requires": {
- "amdefine": "1.0.1"
- }
- },
- "sprintf-js": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
- "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
- "dev": true
- },
- "sshpk": {
- "version": "1.13.1",
- "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz",
- "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=",
- "dev": true,
- "requires": {
- "asn1": "0.2.3",
- "assert-plus": "1.0.0",
- "bcrypt-pbkdf": "1.0.1",
- "dashdash": "1.14.1",
- "ecc-jsbn": "0.1.1",
- "getpass": "0.1.7",
- "jsbn": "0.1.1",
- "tweetnacl": "0.14.5"
- },
- "dependencies": {
- "assert-plus": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
- "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
- "dev": true
- }
- }
- },
- "statuses": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz",
- "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=",
- "dev": true
- },
- "string_decoder": {
- "version": "0.10.31",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
- "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
- "dev": true
- },
- "stringstream": {
- "version": "0.0.5",
- "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz",
- "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=",
- "dev": true
- },
- "strip-ansi": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
- "dev": true,
- "requires": {
- "ansi-regex": "2.1.1"
- }
- },
- "strip-json-comments": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz",
- "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=",
- "dev": true
- },
- "supports-color": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
- "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
- "dev": true
- },
- "tmp": {
- "version": "0.0.31",
- "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz",
- "integrity": "sha1-jzirlDjhcxXl29izZX6L+yd65Kc=",
- "dev": true,
- "requires": {
- "os-tmpdir": "1.0.2"
- }
- },
- "to-array": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz",
- "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=",
- "dev": true
- },
- "tough-cookie": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.2.2.tgz",
- "integrity": "sha1-yDoYMPTl7wuT7yo0iOck+N4Basc=",
- "dev": true
- },
- "tunnel-agent": {
- "version": "0.4.3",
- "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz",
- "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=",
- "dev": true
- },
- "tweetnacl": {
- "version": "0.14.5",
- "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
- "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
- "dev": true,
- "optional": true
- },
- "type-check": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
- "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
- "dev": true,
- "requires": {
- "prelude-ls": "1.1.2"
- }
- },
- "type-detect": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz",
- "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=",
- "dev": true
- },
- "type-is": {
- "version": "1.6.15",
- "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz",
- "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=",
- "dev": true,
- "requires": {
- "media-typer": "0.3.0",
- "mime-types": "2.1.17"
- }
- },
- "uglify-js": {
- "version": "2.8.29",
- "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz",
- "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=",
- "dev": true,
- "optional": true,
- "requires": {
- "source-map": "0.5.7",
- "uglify-to-browserify": "1.0.2",
- "yargs": "3.10.0"
- },
- "dependencies": {
- "source-map": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
- "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
- "dev": true,
- "optional": true
- }
- }
- },
- "uglify-to-browserify": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz",
- "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=",
- "dev": true,
- "optional": true
- },
- "ultron": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz",
- "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=",
- "dev": true
- },
- "unpipe": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
- "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
- "dev": true
- },
- "useragent": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.2.1.tgz",
- "integrity": "sha1-z1k+9PLRdYdei7ZY6pLhik/QbY4=",
- "dev": true,
- "requires": {
- "lru-cache": "2.2.4",
- "tmp": "0.0.31"
- }
- },
- "util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
- "dev": true
- },
- "utils-merge": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
- "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
- "dev": true
- },
- "verror": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
- "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
- "dev": true,
- "requires": {
- "assert-plus": "1.0.0",
- "core-util-is": "1.0.2",
- "extsprintf": "1.3.0"
- },
- "dependencies": {
- "assert-plus": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
- "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
- "dev": true
- }
- }
- },
- "void-elements": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz",
- "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=",
- "dev": true
- },
- "when": {
- "version": "3.7.8",
- "resolved": "https://registry.npmjs.org/when/-/when-3.7.8.tgz",
- "integrity": "sha1-xxMLan6gRpPoQs3J56Hyqjmjn4I=",
- "dev": true
- },
- "which": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz",
- "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==",
- "dev": true,
- "requires": {
- "isexe": "2.0.0"
- }
- },
- "window-size": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
- "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=",
- "dev": true,
- "optional": true
- },
- "wordwrap": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
- "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
- "dev": true
- },
- "wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
- "dev": true
- },
- "ws": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.2.tgz",
- "integrity": "sha1-iiRPoFJAHgjJiGz0SoUYnh/UBn8=",
- "dev": true,
- "requires": {
- "options": "0.0.6",
- "ultron": "1.0.2"
- }
- },
- "wtf-8": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/wtf-8/-/wtf-8-1.0.0.tgz",
- "integrity": "sha1-OS2LotDxw00e4tYw8V0O+2jhBIo=",
- "dev": true
- },
- "xmlhttprequest-ssl": {
- "version": "1.5.3",
- "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz",
- "integrity": "sha1-GFqIjATspGw+QHDZn3tJ3jUomS0=",
- "dev": true
- },
- "xtend": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
- "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=",
- "dev": true
- },
- "yargs": {
- "version": "3.10.0",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
- "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
- "dev": true,
- "optional": true,
- "requires": {
- "camelcase": "1.2.1",
- "cliui": "2.1.0",
- "decamelize": "1.2.0",
- "window-size": "0.1.0"
- }
- },
- "yeast": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz",
- "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=",
- "dev": true
- }
- }
+ "name": "@natlibfi/marc-record-merge",
+ "version": "7.0.0-alpha.4",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "@natlibfi/marc-record-merge",
+ "version": "7.0.0-alpha.4",
+ "license": "MIT",
+ "dependencies": {
+ "@natlibfi/marc-record": "^7.2.4",
+ "debug": "^4.3.4",
+ "normalize-diacritics": "^2.13.2"
+ },
+ "devDependencies": {
+ "@babel/cli": "^7.22.9",
+ "@babel/core": "^7.22.9",
+ "@babel/eslint-parser": "^7.22.9",
+ "@babel/preset-env": "^7.22.9",
+ "@babel/register": "^7.22.5",
+ "@natlibfi/eslint-config-melinda-backend": "^3.0.1",
+ "@natlibfi/fixugen": "2.0.1",
+ "@natlibfi/fixura": "^3.0.1",
+ "babel-plugin-istanbul": "^6.1.1",
+ "babel-plugin-rewire": "^1.2.0",
+ "chai": "^4.3.7",
+ "cross-env": "^7.0.3",
+ "eslint": "^8.46.0",
+ "mocha": "^10.2.0",
+ "nodemon": "^3.0.1",
+ "nyc": "^15.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@aashutoshrathi/word-wrap": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz",
+ "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@ampproject/remapping": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz",
+ "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.0",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/cli": {
+ "version": "7.22.9",
+ "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.22.9.tgz",
+ "integrity": "sha512-nb2O7AThqRo7/E53EGiuAkMaRbb7J5Qp3RvN+dmua1U+kydm0oznkhqbTEG15yk26G/C3yL6OdZjzgl+DMXVVA==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.17",
+ "commander": "^4.0.1",
+ "convert-source-map": "^1.1.0",
+ "fs-readdir-recursive": "^1.1.0",
+ "glob": "^7.2.0",
+ "make-dir": "^2.1.0",
+ "slash": "^2.0.0"
+ },
+ "bin": {
+ "babel": "bin/babel.js",
+ "babel-external-helpers": "bin/babel-external-helpers.js"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "optionalDependencies": {
+ "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.3",
+ "chokidar": "^3.4.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz",
+ "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/highlight": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/compat-data": {
+ "version": "7.22.9",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz",
+ "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core": {
+ "version": "7.22.9",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.9.tgz",
+ "integrity": "sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==",
+ "dev": true,
+ "dependencies": {
+ "@ampproject/remapping": "^2.2.0",
+ "@babel/code-frame": "^7.22.5",
+ "@babel/generator": "^7.22.9",
+ "@babel/helper-compilation-targets": "^7.22.9",
+ "@babel/helper-module-transforms": "^7.22.9",
+ "@babel/helpers": "^7.22.6",
+ "@babel/parser": "^7.22.7",
+ "@babel/template": "^7.22.5",
+ "@babel/traverse": "^7.22.8",
+ "@babel/types": "^7.22.5",
+ "convert-source-map": "^1.7.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.2",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/@babel/eslint-parser": {
+ "version": "7.22.9",
+ "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.22.9.tgz",
+ "integrity": "sha512-xdMkt39/nviO/4vpVdrEYPwXCsYIXSSAr6mC7WQsNIlGnuxKyKE7GZjalcnbSWiC4OXGNNN3UQPeHfjSC6sTDA==",
+ "dev": true,
+ "dependencies": {
+ "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1",
+ "eslint-visitor-keys": "^2.1.0",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || >=14.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": ">=7.11.0",
+ "eslint": "^7.5.0 || ^8.0.0"
+ }
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.22.9",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz",
+ "integrity": "sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.22.5",
+ "@jridgewell/gen-mapping": "^0.3.2",
+ "@jridgewell/trace-mapping": "^0.3.17",
+ "jsesc": "^2.5.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-annotate-as-pure": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz",
+ "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.5.tgz",
+ "integrity": "sha512-m1EP3lVOPptR+2DwD125gziZNcmoNSHGmJROKoy87loWUQyJaVXDgpmruWqDARZSmtYQ+Dl25okU8+qhVzuykw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.22.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz",
+ "integrity": "sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/compat-data": "^7.22.9",
+ "@babel/helper-validator-option": "^7.22.5",
+ "browserslist": "^4.21.9",
+ "lru-cache": "^5.1.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-create-class-features-plugin": {
+ "version": "7.22.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.9.tgz",
+ "integrity": "sha512-Pwyi89uO4YrGKxL/eNJ8lfEH55DnRloGPOseaA8NFNL6jAUnn+KccaISiFazCj5IolPPDjGSdzQzXVzODVRqUQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.22.5",
+ "@babel/helper-environment-visitor": "^7.22.5",
+ "@babel/helper-function-name": "^7.22.5",
+ "@babel/helper-member-expression-to-functions": "^7.22.5",
+ "@babel/helper-optimise-call-expression": "^7.22.5",
+ "@babel/helper-replace-supers": "^7.22.9",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5",
+ "@babel/helper-split-export-declaration": "^7.22.6",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-create-regexp-features-plugin": {
+ "version": "7.22.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.9.tgz",
+ "integrity": "sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.22.5",
+ "regexpu-core": "^5.3.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-define-polyfill-provider": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz",
+ "integrity": "sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.22.6",
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "debug": "^4.1.1",
+ "lodash.debounce": "^4.0.8",
+ "resolve": "^1.14.2"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/@babel/helper-environment-visitor": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz",
+ "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-function-name": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz",
+ "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/template": "^7.22.5",
+ "@babel/types": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-hoist-variables": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz",
+ "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-member-expression-to-functions": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz",
+ "integrity": "sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz",
+ "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.22.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz",
+ "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-environment-visitor": "^7.22.5",
+ "@babel/helper-module-imports": "^7.22.5",
+ "@babel/helper-simple-access": "^7.22.5",
+ "@babel/helper-split-export-declaration": "^7.22.6",
+ "@babel/helper-validator-identifier": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-optimise-call-expression": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz",
+ "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-plugin-utils": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz",
+ "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-remap-async-to-generator": {
+ "version": "7.22.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz",
+ "integrity": "sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.22.5",
+ "@babel/helper-environment-visitor": "^7.22.5",
+ "@babel/helper-wrap-function": "^7.22.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-replace-supers": {
+ "version": "7.22.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz",
+ "integrity": "sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-environment-visitor": "^7.22.5",
+ "@babel/helper-member-expression-to-functions": "^7.22.5",
+ "@babel/helper-optimise-call-expression": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-simple-access": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz",
+ "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz",
+ "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-split-export-declaration": {
+ "version": "7.22.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz",
+ "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz",
+ "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz",
+ "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-option": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz",
+ "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-wrap-function": {
+ "version": "7.22.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.9.tgz",
+ "integrity": "sha512-sZ+QzfauuUEfxSEjKFmi3qDSHgLsTPK/pEpoD/qonZKOtTPTLbf59oabPQ4rKekt9lFcj/hTZaOhWwFYrgjk+Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-function-name": "^7.22.5",
+ "@babel/template": "^7.22.5",
+ "@babel/types": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helpers": {
+ "version": "7.22.6",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz",
+ "integrity": "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/template": "^7.22.5",
+ "@babel/traverse": "^7.22.6",
+ "@babel/types": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/highlight": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz",
+ "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.22.5",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.22.7",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz",
+ "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==",
+ "dev": true,
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz",
+ "integrity": "sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz",
+ "integrity": "sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5",
+ "@babel/plugin-transform-optional-chaining": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.13.0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-private-property-in-object": {
+ "version": "7.21.0-placeholder-for-preset-env.2",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz",
+ "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-unicode-property-regex": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz",
+ "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-async-generators": {
+ "version": "7.8.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
+ "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-class-properties": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
+ "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.12.13"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-class-static-block": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz",
+ "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-dynamic-import": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz",
+ "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-export-namespace-from": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz",
+ "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.3"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-import-assertions": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz",
+ "integrity": "sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-import-attributes": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz",
+ "integrity": "sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-import-meta": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
+ "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-json-strings": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
+ "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-logical-assignment-operators": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
+ "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
+ "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-numeric-separator": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
+ "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-object-rest-spread": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
+ "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-optional-catch-binding": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
+ "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-optional-chaining": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
+ "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-private-property-in-object": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz",
+ "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-top-level-await": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
+ "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-unicode-sets-regex": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz",
+ "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-arrow-functions": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz",
+ "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-async-generator-functions": {
+ "version": "7.22.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.7.tgz",
+ "integrity": "sha512-7HmE7pk/Fmke45TODvxvkxRMV9RazV+ZZzhOL9AG8G29TLrr3jkjwF7uJfxZ30EoXpO+LJkq4oA8NjO2DTnEDg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-environment-visitor": "^7.22.5",
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/helper-remap-async-to-generator": "^7.22.5",
+ "@babel/plugin-syntax-async-generators": "^7.8.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-async-to-generator": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz",
+ "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.22.5",
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/helper-remap-async-to-generator": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-block-scoped-functions": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz",
+ "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-block-scoping": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.5.tgz",
+ "integrity": "sha512-EcACl1i5fSQ6bt+YGuU/XGCeZKStLmyVGytWkpyhCLeQVA0eu6Wtiw92V+I1T/hnezUv7j74dA/Ro69gWcU+hg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-class-properties": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz",
+ "integrity": "sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.22.5",
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-class-static-block": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.5.tgz",
+ "integrity": "sha512-SPToJ5eYZLxlnp1UzdARpOGeC2GbHvr9d/UV0EukuVx8atktg194oe+C5BqQ8jRTkgLRVOPYeXRSBg1IlMoVRA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.22.5",
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/plugin-syntax-class-static-block": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.12.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-classes": {
+ "version": "7.22.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz",
+ "integrity": "sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.22.5",
+ "@babel/helper-compilation-targets": "^7.22.6",
+ "@babel/helper-environment-visitor": "^7.22.5",
+ "@babel/helper-function-name": "^7.22.5",
+ "@babel/helper-optimise-call-expression": "^7.22.5",
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/helper-replace-supers": "^7.22.5",
+ "@babel/helper-split-export-declaration": "^7.22.6",
+ "globals": "^11.1.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-computed-properties": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz",
+ "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/template": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-destructuring": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.5.tgz",
+ "integrity": "sha512-GfqcFuGW8vnEqTUBM7UtPd5A4q797LTvvwKxXTgRsFjoqaJiEg9deBG6kWeQYkVEL569NpnmpC0Pkr/8BLKGnQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-dotall-regex": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz",
+ "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.22.5",
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-duplicate-keys": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz",
+ "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-dynamic-import": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.5.tgz",
+ "integrity": "sha512-0MC3ppTB1AMxd8fXjSrbPa7LT9hrImt+/fcj+Pg5YMD7UQyWp/02+JWpdnCymmsXwIx5Z+sYn1bwCn4ZJNvhqQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/plugin-syntax-dynamic-import": "^7.8.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-exponentiation-operator": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz",
+ "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5",
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-export-namespace-from": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.5.tgz",
+ "integrity": "sha512-X4hhm7FRnPgd4nDA4b/5V280xCx6oL7Oob5+9qVS5C13Zq4bh1qq7LU0GgRU6b5dBWBvhGaXYVB4AcN6+ol6vg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/plugin-syntax-export-namespace-from": "^7.8.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-for-of": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz",
+ "integrity": "sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-function-name": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz",
+ "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.22.5",
+ "@babel/helper-function-name": "^7.22.5",
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-json-strings": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.5.tgz",
+ "integrity": "sha512-DuCRB7fu8MyTLbEQd1ew3R85nx/88yMoqo2uPSjevMj3yoN7CDM8jkgrY0wmVxfJZyJ/B9fE1iq7EQppWQmR5A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/plugin-syntax-json-strings": "^7.8.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-literals": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz",
+ "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-logical-assignment-operators": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.5.tgz",
+ "integrity": "sha512-MQQOUW1KL8X0cDWfbwYP+TbVbZm16QmQXJQ+vndPtH/BoO0lOKpVoEDMI7+PskYxH+IiE0tS8xZye0qr1lGzSA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-member-expression-literals": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz",
+ "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-amd": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz",
+ "integrity": "sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.22.5",
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-commonjs": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz",
+ "integrity": "sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.22.5",
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/helper-simple-access": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-systemjs": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz",
+ "integrity": "sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-hoist-variables": "^7.22.5",
+ "@babel/helper-module-transforms": "^7.22.5",
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/helper-validator-identifier": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-umd": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz",
+ "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.22.5",
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz",
+ "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.22.5",
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-new-target": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz",
+ "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-nullish-coalescing-operator": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.5.tgz",
+ "integrity": "sha512-6CF8g6z1dNYZ/VXok5uYkkBBICHZPiGEl7oDnAx2Mt1hlHVHOSIKWJaXHjQJA5VB43KZnXZDIexMchY4y2PGdA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-numeric-separator": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.5.tgz",
+ "integrity": "sha512-NbslED1/6M+sXiwwtcAB/nieypGw02Ejf4KtDeMkCEpP6gWFMX1wI9WKYua+4oBneCCEmulOkRpwywypVZzs/g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/plugin-syntax-numeric-separator": "^7.10.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-object-rest-spread": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.5.tgz",
+ "integrity": "sha512-Kk3lyDmEslH9DnvCDA1s1kkd3YWQITiBOHngOtDL9Pt6BZjzqb6hiOlb8VfjiiQJ2unmegBqZu0rx5RxJb5vmQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/compat-data": "^7.22.5",
+ "@babel/helper-compilation-targets": "^7.22.5",
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+ "@babel/plugin-transform-parameters": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-object-super": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz",
+ "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/helper-replace-supers": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-optional-catch-binding": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.5.tgz",
+ "integrity": "sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/plugin-syntax-optional-catch-binding": "^7.8.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-optional-chaining": {
+ "version": "7.22.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.6.tgz",
+ "integrity": "sha512-Vd5HiWml0mDVtcLHIoEU5sw6HOUW/Zk0acLs/SAeuLzkGNOPc9DB4nkUajemhCmTIz3eiaKREZn2hQQqF79YTg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5",
+ "@babel/plugin-syntax-optional-chaining": "^7.8.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-parameters": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz",
+ "integrity": "sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-private-methods": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz",
+ "integrity": "sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.22.5",
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-private-property-in-object": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.5.tgz",
+ "integrity": "sha512-/9xnaTTJcVoBtSSmrVyhtSvO3kbqS2ODoh2juEU72c3aYonNF0OMGiaz2gjukyKM2wBBYJP38S4JiE0Wfb5VMQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.22.5",
+ "@babel/helper-create-class-features-plugin": "^7.22.5",
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/plugin-syntax-private-property-in-object": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-property-literals": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz",
+ "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-regenerator": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.5.tgz",
+ "integrity": "sha512-rR7KePOE7gfEtNTh9Qw+iO3Q/e4DEsoQ+hdvM6QUDH7JRJ5qxq5AA52ZzBWbI5i9lfNuvySgOGP8ZN7LAmaiPw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "regenerator-transform": "^0.15.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-reserved-words": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz",
+ "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-shorthand-properties": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz",
+ "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-spread": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz",
+ "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-sticky-regex": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz",
+ "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-template-literals": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz",
+ "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-typeof-symbol": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz",
+ "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-escapes": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.5.tgz",
+ "integrity": "sha512-biEmVg1IYB/raUO5wT1tgfacCef15Fbzhkx493D3urBI++6hpJ+RFG4SrWMn0NEZLfvilqKf3QDrRVZHo08FYg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-property-regex": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz",
+ "integrity": "sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.22.5",
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-regex": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz",
+ "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.22.5",
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-sets-regex": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz",
+ "integrity": "sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.22.5",
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/preset-env": {
+ "version": "7.22.9",
+ "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.9.tgz",
+ "integrity": "sha512-wNi5H/Emkhll/bqPjsjQorSykrlfY5OWakd6AulLvMEytpKasMVUpVy8RL4qBIBs5Ac6/5i0/Rv0b/Fg6Eag/g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/compat-data": "^7.22.9",
+ "@babel/helper-compilation-targets": "^7.22.9",
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/helper-validator-option": "^7.22.5",
+ "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.5",
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.5",
+ "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2",
+ "@babel/plugin-syntax-async-generators": "^7.8.4",
+ "@babel/plugin-syntax-class-properties": "^7.12.13",
+ "@babel/plugin-syntax-class-static-block": "^7.14.5",
+ "@babel/plugin-syntax-dynamic-import": "^7.8.3",
+ "@babel/plugin-syntax-export-namespace-from": "^7.8.3",
+ "@babel/plugin-syntax-import-assertions": "^7.22.5",
+ "@babel/plugin-syntax-import-attributes": "^7.22.5",
+ "@babel/plugin-syntax-import-meta": "^7.10.4",
+ "@babel/plugin-syntax-json-strings": "^7.8.3",
+ "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
+ "@babel/plugin-syntax-numeric-separator": "^7.10.4",
+ "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+ "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
+ "@babel/plugin-syntax-optional-chaining": "^7.8.3",
+ "@babel/plugin-syntax-private-property-in-object": "^7.14.5",
+ "@babel/plugin-syntax-top-level-await": "^7.14.5",
+ "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6",
+ "@babel/plugin-transform-arrow-functions": "^7.22.5",
+ "@babel/plugin-transform-async-generator-functions": "^7.22.7",
+ "@babel/plugin-transform-async-to-generator": "^7.22.5",
+ "@babel/plugin-transform-block-scoped-functions": "^7.22.5",
+ "@babel/plugin-transform-block-scoping": "^7.22.5",
+ "@babel/plugin-transform-class-properties": "^7.22.5",
+ "@babel/plugin-transform-class-static-block": "^7.22.5",
+ "@babel/plugin-transform-classes": "^7.22.6",
+ "@babel/plugin-transform-computed-properties": "^7.22.5",
+ "@babel/plugin-transform-destructuring": "^7.22.5",
+ "@babel/plugin-transform-dotall-regex": "^7.22.5",
+ "@babel/plugin-transform-duplicate-keys": "^7.22.5",
+ "@babel/plugin-transform-dynamic-import": "^7.22.5",
+ "@babel/plugin-transform-exponentiation-operator": "^7.22.5",
+ "@babel/plugin-transform-export-namespace-from": "^7.22.5",
+ "@babel/plugin-transform-for-of": "^7.22.5",
+ "@babel/plugin-transform-function-name": "^7.22.5",
+ "@babel/plugin-transform-json-strings": "^7.22.5",
+ "@babel/plugin-transform-literals": "^7.22.5",
+ "@babel/plugin-transform-logical-assignment-operators": "^7.22.5",
+ "@babel/plugin-transform-member-expression-literals": "^7.22.5",
+ "@babel/plugin-transform-modules-amd": "^7.22.5",
+ "@babel/plugin-transform-modules-commonjs": "^7.22.5",
+ "@babel/plugin-transform-modules-systemjs": "^7.22.5",
+ "@babel/plugin-transform-modules-umd": "^7.22.5",
+ "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5",
+ "@babel/plugin-transform-new-target": "^7.22.5",
+ "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.5",
+ "@babel/plugin-transform-numeric-separator": "^7.22.5",
+ "@babel/plugin-transform-object-rest-spread": "^7.22.5",
+ "@babel/plugin-transform-object-super": "^7.22.5",
+ "@babel/plugin-transform-optional-catch-binding": "^7.22.5",
+ "@babel/plugin-transform-optional-chaining": "^7.22.6",
+ "@babel/plugin-transform-parameters": "^7.22.5",
+ "@babel/plugin-transform-private-methods": "^7.22.5",
+ "@babel/plugin-transform-private-property-in-object": "^7.22.5",
+ "@babel/plugin-transform-property-literals": "^7.22.5",
+ "@babel/plugin-transform-regenerator": "^7.22.5",
+ "@babel/plugin-transform-reserved-words": "^7.22.5",
+ "@babel/plugin-transform-shorthand-properties": "^7.22.5",
+ "@babel/plugin-transform-spread": "^7.22.5",
+ "@babel/plugin-transform-sticky-regex": "^7.22.5",
+ "@babel/plugin-transform-template-literals": "^7.22.5",
+ "@babel/plugin-transform-typeof-symbol": "^7.22.5",
+ "@babel/plugin-transform-unicode-escapes": "^7.22.5",
+ "@babel/plugin-transform-unicode-property-regex": "^7.22.5",
+ "@babel/plugin-transform-unicode-regex": "^7.22.5",
+ "@babel/plugin-transform-unicode-sets-regex": "^7.22.5",
+ "@babel/preset-modules": "^0.1.5",
+ "@babel/types": "^7.22.5",
+ "babel-plugin-polyfill-corejs2": "^0.4.4",
+ "babel-plugin-polyfill-corejs3": "^0.8.2",
+ "babel-plugin-polyfill-regenerator": "^0.5.1",
+ "core-js-compat": "^3.31.0",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/preset-modules": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz",
+ "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@babel/plugin-proposal-unicode-property-regex": "^7.4.4",
+ "@babel/plugin-transform-dotall-regex": "^7.4.4",
+ "@babel/types": "^7.4.4",
+ "esutils": "^2.0.2"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/register": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.22.5.tgz",
+ "integrity": "sha512-vV6pm/4CijSQ8Y47RH5SopXzursN35RQINfGJkmOlcpAtGuf94miFvIPhCKGQN7WGIcsgG1BHEX2KVdTYwTwUQ==",
+ "dev": true,
+ "dependencies": {
+ "clone-deep": "^4.0.1",
+ "find-cache-dir": "^2.0.0",
+ "make-dir": "^2.1.0",
+ "pirates": "^4.0.5",
+ "source-map-support": "^0.5.16"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/regjsgen": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz",
+ "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==",
+ "dev": true
+ },
+ "node_modules/@babel/runtime": {
+ "version": "7.22.6",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz",
+ "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==",
+ "dev": true,
+ "dependencies": {
+ "regenerator-runtime": "^0.13.11"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/template": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz",
+ "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.22.5",
+ "@babel/parser": "^7.22.5",
+ "@babel/types": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.22.8",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.8.tgz",
+ "integrity": "sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.22.5",
+ "@babel/generator": "^7.22.7",
+ "@babel/helper-environment-visitor": "^7.22.5",
+ "@babel/helper-function-name": "^7.22.5",
+ "@babel/helper-hoist-variables": "^7.22.5",
+ "@babel/helper-split-export-declaration": "^7.22.6",
+ "@babel/parser": "^7.22.7",
+ "@babel/types": "^7.22.5",
+ "debug": "^4.1.0",
+ "globals": "^11.1.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz",
+ "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.22.5",
+ "@babel/helper-validator-identifier": "^7.22.5",
+ "to-fast-properties": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
+ "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==",
+ "dev": true,
+ "dependencies": {
+ "eslint-visitor-keys": "^3.3.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz",
+ "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint-community/regexpp": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz",
+ "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==",
+ "dev": true,
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.1.tgz",
+ "integrity": "sha512-9t7ZA7NGGK8ckelF0PQCfcxIUzs1Md5rrO6U/c+FIQNanea5UZC0wqKXH4vHBccmu4ZJgZ2idtPeW7+Q2npOEA==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^9.6.0",
+ "globals": "^13.19.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "node_modules/@eslint/eslintrc/node_modules/globals": {
+ "version": "13.20.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
+ "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@eslint/js": {
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.46.0.tgz",
+ "integrity": "sha512-a8TLtmPi8xzPkCbp/OGFUo5yhRkHM2Ko9kOWP4znJr0WAhWyThaw3PnwX4vOTWOAMsV2uRt32PPDcEz63esSaA==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@humanwhocodes/config-array": {
+ "version": "0.11.10",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz",
+ "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==",
+ "dev": true,
+ "dependencies": {
+ "@humanwhocodes/object-schema": "^1.2.1",
+ "debug": "^4.1.1",
+ "minimatch": "^3.0.5"
+ },
+ "engines": {
+ "node": ">=10.10.0"
+ }
+ },
+ "node_modules/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/object-schema": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
+ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
+ "dev": true
+ },
+ "node_modules/@istanbuljs/load-nyc-config": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
+ "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==",
+ "dev": true,
+ "dependencies": {
+ "camelcase": "^5.3.1",
+ "find-up": "^4.1.0",
+ "get-package-type": "^0.1.0",
+ "js-yaml": "^3.13.1",
+ "resolve-from": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@istanbuljs/schema": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
+ "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz",
+ "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/set-array": "^1.0.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
+ "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/set-array": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
+ "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.4.15",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
+ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
+ "dev": true
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.18",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz",
+ "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/resolve-uri": "3.1.0",
+ "@jridgewell/sourcemap-codec": "1.4.14"
+ }
+ },
+ "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.4.14",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
+ "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
+ "dev": true
+ },
+ "node_modules/@natlibfi/eslint-config-melinda-backend": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@natlibfi/eslint-config-melinda-backend/-/eslint-config-melinda-backend-3.0.1.tgz",
+ "integrity": "sha512-9DLr4o0hoSR7YToevR9IIES5btPr83ZvYqbzI6vMRkrcQKjQLCVBTGKKBQA4z7e2ZhI45grbN61tj7m4sNV3+Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/eslint-parser": "^7.21.3",
+ "@typescript-eslint/type-utils": "^5.58.0",
+ "@typescript-eslint/utils": "^5.58.0",
+ "eslint-plugin-functional": "^5.0.7"
+ },
+ "engines": {
+ "node": ">=16"
+ },
+ "peerDependencies": {
+ "eslint": "^8.38.0"
+ }
+ },
+ "node_modules/@natlibfi/fixugen": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@natlibfi/fixugen/-/fixugen-2.0.1.tgz",
+ "integrity": "sha512-FU0+VsnPBwaTDh8zXvyaCgr2U9/zqZ252ZldCB26kZIpNsWIgzZBYNJd3VPfH/GRQPAjLjmfi4m8VVTmnwW4TQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@natlibfi/fixura": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@natlibfi/fixura/-/fixura-3.0.1.tgz",
+ "integrity": "sha512-hLzWz3UMTzOfa4NxEMaWnp39I7SNKu/fYyJJJHhHVwWWjnw4PKuZATJSstGo9u3j2VBYg7Izp+3Bg14EdLCAtA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/register": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@natlibfi/marc-record": {
+ "version": "7.2.4",
+ "resolved": "https://registry.npmjs.org/@natlibfi/marc-record/-/marc-record-7.2.4.tgz",
+ "integrity": "sha512-dB/MEp+oiDgQ800pUucO6NcT0WFMrtG3uwO4Cgge3giQpTM0IJ4Ca6NWDvRKfYMqEiU6pBA1nDh91kFczA8KLA==",
+ "dependencies": {
+ "debug": "^4.3.4",
+ "jsonschema": "^1.4.1"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@nicolo-ribaudo/chokidar-2": {
+ "version": "2.1.8-no-fsevents.3",
+ "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz",
+ "integrity": "sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==",
+ "dev": true,
+ "optional": true
+ },
+ "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": {
+ "version": "5.1.1-v1",
+ "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz",
+ "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==",
+ "dev": true,
+ "dependencies": {
+ "eslint-scope": "5.1.1"
+ }
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.11",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz",
+ "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==",
+ "dev": true
+ },
+ "node_modules/@types/semver": {
+ "version": "7.3.13",
+ "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz",
+ "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==",
+ "dev": true
+ },
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "5.59.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.0.tgz",
+ "integrity": "sha512-tsoldKaMh7izN6BvkK6zRMINj4Z2d6gGhO2UsI8zGZY3XhLq1DndP3Ycjhi1JwdwPRwtLMW4EFPgpuKhbCGOvQ==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "5.59.0",
+ "@typescript-eslint/visitor-keys": "5.59.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils": {
+ "version": "5.59.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.0.tgz",
+ "integrity": "sha512-d/B6VSWnZwu70kcKQSCqjcXpVH+7ABKH8P1KNn4K7j5PXXuycZTPXF44Nui0TEm6rbWGi8kc78xRgOC4n7xFgA==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/typescript-estree": "5.59.0",
+ "@typescript-eslint/utils": "5.59.0",
+ "debug": "^4.3.4",
+ "tsutils": "^3.21.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "*"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/types": {
+ "version": "5.59.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.0.tgz",
+ "integrity": "sha512-yR2h1NotF23xFFYKHZs17QJnB51J/s+ud4PYU4MqdZbzeNxpgUr05+dNeCN/bb6raslHvGdd6BFCkVhpPk/ZeA==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "5.59.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.0.tgz",
+ "integrity": "sha512-sUNnktjmI8DyGzPdZ8dRwW741zopGxltGs/SAPgGL/AAgDpiLsCFLcMNSpbfXfmnNeHmK9h3wGmCkGRGAoUZAg==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "5.59.0",
+ "@typescript-eslint/visitor-keys": "5.59.0",
+ "debug": "^4.3.4",
+ "globby": "^11.1.0",
+ "is-glob": "^4.0.3",
+ "semver": "^7.3.7",
+ "tsutils": "^3.21.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ },
+ "node_modules/@typescript-eslint/utils": {
+ "version": "5.59.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.0.tgz",
+ "integrity": "sha512-GGLFd+86drlHSvPgN/el6dRQNYYGOvRSDVydsUaQluwIW3HvbXuxyuD5JETvBt/9qGYe+lOrDk6gRrWOHb/FvA==",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@types/json-schema": "^7.0.9",
+ "@types/semver": "^7.3.12",
+ "@typescript-eslint/scope-manager": "5.59.0",
+ "@typescript-eslint/types": "5.59.0",
+ "@typescript-eslint/typescript-estree": "5.59.0",
+ "eslint-scope": "^5.1.1",
+ "semver": "^7.3.7"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/utils/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@typescript-eslint/utils/node_modules/semver": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@typescript-eslint/utils/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ },
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "5.59.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.0.tgz",
+ "integrity": "sha512-qZ3iXxQhanchCeaExlKPV3gDQFxMUmU35xfd5eCXB6+kUw1TUAbIy2n7QIrwz9s98DQLzNWyHp61fY0da4ZcbA==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "5.59.0",
+ "eslint-visitor-keys": "^3.3.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz",
+ "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/abbrev": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
+ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
+ "dev": true
+ },
+ "node_modules/acorn": {
+ "version": "8.10.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz",
+ "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==",
+ "dev": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/aggregate-error": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
+ "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
+ "dev": true,
+ "dependencies": {
+ "clean-stack": "^2.0.0",
+ "indent-string": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
+ "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "dev": true,
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/append-transform": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz",
+ "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==",
+ "dev": true,
+ "dependencies": {
+ "default-require-extensions": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/archy": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz",
+ "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==",
+ "dev": true
+ },
+ "node_modules/argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "dependencies": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "node_modules/array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/assertion-error": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
+ "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/babel-plugin-istanbul": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz",
+ "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@istanbuljs/load-nyc-config": "^1.0.0",
+ "@istanbuljs/schema": "^0.1.2",
+ "istanbul-lib-instrument": "^5.0.4",
+ "test-exclude": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-corejs2": {
+ "version": "0.4.5",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz",
+ "integrity": "sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/compat-data": "^7.22.6",
+ "@babel/helper-define-polyfill-provider": "^0.4.2",
+ "semver": "^6.3.1"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-corejs3": {
+ "version": "0.8.3",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz",
+ "integrity": "sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-define-polyfill-provider": "^0.4.2",
+ "core-js-compat": "^3.31.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-regenerator": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz",
+ "integrity": "sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-define-polyfill-provider": "^0.4.2"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/babel-plugin-rewire": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-rewire/-/babel-plugin-rewire-1.2.0.tgz",
+ "integrity": "sha512-JBZxczHw3tScS+djy6JPLMjblchGhLI89ep15H3SyjujIzlxo5nr6Yjo7AXotdeVczeBmWs0tF8PgJWDdgzAkQ==",
+ "dev": true
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dev": true,
+ "dependencies": {
+ "fill-range": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browser-stdout": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
+ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
+ "dev": true
+ },
+ "node_modules/browserslist": {
+ "version": "4.21.10",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz",
+ "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "caniuse-lite": "^1.0.30001517",
+ "electron-to-chromium": "^1.4.477",
+ "node-releases": "^2.0.13",
+ "update-browserslist-db": "^1.0.11"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+ "dev": true
+ },
+ "node_modules/caching-transform": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz",
+ "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==",
+ "dev": true,
+ "dependencies": {
+ "hasha": "^5.0.0",
+ "make-dir": "^3.0.0",
+ "package-hash": "^4.0.0",
+ "write-file-atomic": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/caching-transform/node_modules/make-dir": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+ "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+ "dev": true,
+ "dependencies": {
+ "semver": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001519",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001519.tgz",
+ "integrity": "sha512-0QHgqR+Jv4bxHMp8kZ1Kn8CH55OikjKJ6JmKkZYP1F3D7w+lnFXF70nG5eNfsZS89jadi5Ywy5UCSKLAglIRkg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ]
+ },
+ "node_modules/chai": {
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz",
+ "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==",
+ "dev": true,
+ "dependencies": {
+ "assertion-error": "^1.1.0",
+ "check-error": "^1.0.2",
+ "deep-eql": "^4.1.2",
+ "get-func-name": "^2.0.0",
+ "loupe": "^2.3.1",
+ "pathval": "^1.1.1",
+ "type-detect": "^4.0.5"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/check-error": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
+ "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/clean-stack": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
+ "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/cliui": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "node_modules/clone-deep": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
+ "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==",
+ "dev": true,
+ "dependencies": {
+ "is-plain-object": "^2.0.4",
+ "kind-of": "^6.0.2",
+ "shallow-clone": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+ "dev": true
+ },
+ "node_modules/commander": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
+ "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/commondir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
+ "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==",
+ "dev": true
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true
+ },
+ "node_modules/convert-source-map": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
+ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
+ "dev": true
+ },
+ "node_modules/core-js-compat": {
+ "version": "3.32.0",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.32.0.tgz",
+ "integrity": "sha512-7a9a3D1k4UCVKnLhrgALyFcP7YCsLOQIxPd0dKjf/6GuPcgyiGP70ewWdCGrSK7evyhymi0qO4EqCmSJofDeYw==",
+ "dev": true,
+ "dependencies": {
+ "browserslist": "^4.21.9"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
+ },
+ "node_modules/cross-env": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz",
+ "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==",
+ "dev": true,
+ "dependencies": {
+ "cross-spawn": "^7.0.1"
+ },
+ "bin": {
+ "cross-env": "src/bin/cross-env.js",
+ "cross-env-shell": "src/bin/cross-env-shell.js"
+ },
+ "engines": {
+ "node": ">=10.14",
+ "npm": ">=6",
+ "yarn": ">=1"
+ }
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/deep-eql": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz",
+ "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==",
+ "dev": true,
+ "dependencies": {
+ "type-detect": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true
+ },
+ "node_modules/deepmerge-ts": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-5.1.0.tgz",
+ "integrity": "sha512-eS8dRJOckyo9maw9Tu5O5RUi/4inFLrnoLkBe3cPfDMx3WZioXtmOew4TXQaxq7Rhl4xjDtR7c6x8nNTxOvbFw==",
+ "dev": true,
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/default-require-extensions": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz",
+ "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==",
+ "dev": true,
+ "dependencies": {
+ "strip-bom": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/diff": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz",
+ "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "node_modules/dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "dev": true,
+ "dependencies": {
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "dev": true,
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.4.482",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.482.tgz",
+ "integrity": "sha512-h+UqpfmEr1Qkk0zp7ej/jid7CXoq4m4QzW6wNTb0ELJ/BZCpA4wgUylBIMGCe621tnr4l5VmoHjdoSx2lbnNJA==",
+ "dev": true
+ },
+ "node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "node_modules/es6-error": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz",
+ "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==",
+ "dev": true
+ },
+ "node_modules/escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.46.0.tgz",
+ "integrity": "sha512-cIO74PvbW0qU8e0mIvk5IV3ToWdCq5FYG6gWPHHkx6gNdjlbAYvtfHmlCMXxjcoVaIdwy/IAt3+mDkZkfvb2Dg==",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@eslint-community/regexpp": "^4.6.1",
+ "@eslint/eslintrc": "^2.1.1",
+ "@eslint/js": "^8.46.0",
+ "@humanwhocodes/config-array": "^0.11.10",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@nodelib/fs.walk": "^1.2.8",
+ "ajv": "^6.12.4",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.3.2",
+ "doctrine": "^3.0.0",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^7.2.2",
+ "eslint-visitor-keys": "^3.4.2",
+ "espree": "^9.6.1",
+ "esquery": "^1.4.2",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^6.0.1",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "globals": "^13.19.0",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "is-path-inside": "^3.0.3",
+ "js-yaml": "^4.1.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3",
+ "strip-ansi": "^6.0.1",
+ "text-table": "^0.2.0"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-plugin-functional": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-functional/-/eslint-plugin-functional-5.0.8.tgz",
+ "integrity": "sha512-rXC5THzqqSXUrbTBG+dLLYn10Af0C9Df+N4TT3onPrOz+kgInshLJdRAvEcV+8HHNsZyDrNLcgWh5jzVaAnleQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "ko-fi",
+ "url": "https://ko-fi.com/rebeccastevens"
+ }
+ ],
+ "dependencies": {
+ "@typescript-eslint/type-utils": "^5.50.0",
+ "@typescript-eslint/utils": "^5.50.0",
+ "deepmerge-ts": "^5.0.0",
+ "escape-string-regexp": "^4.0.0",
+ "is-immutable-type": "^1.2.5",
+ "semver": "^7.3.8"
+ },
+ "engines": {
+ "node": ">=16.10.0"
+ },
+ "peerDependencies": {
+ "eslint": "^8.0.0",
+ "typescript": ">=4.0.2"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-plugin-functional/node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint-plugin-functional/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/eslint-plugin-functional/node_modules/semver": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/eslint-plugin-functional/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ },
+ "node_modules/eslint-scope": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+ "dev": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+ "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/eslint/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/eslint/node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "node_modules/eslint/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/eslint/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/eslint/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/eslint/node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/eslint-scope": {
+ "version": "7.2.2",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
+ "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
+ "dev": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint/node_modules/eslint-visitor-keys": {
+ "version": "3.4.2",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.2.tgz",
+ "integrity": "sha512-8drBzUEyZ2llkpCA67iYrgEssKDUu68V8ChqqOfFupIaG/LCVPUT+CoGJpT77zJprs4T/W7p07LP7zAIMuweVw==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint/node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/eslint/node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/eslint/node_modules/globals": {
+ "version": "13.20.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
+ "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/eslint/node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/eslint/node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/eslint/node_modules/type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/espree": {
+ "version": "9.6.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
+ "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.9.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^3.4.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/espree/node_modules/eslint-visitor-keys": {
+ "version": "3.4.2",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.2.tgz",
+ "integrity": "sha512-8drBzUEyZ2llkpCA67iYrgEssKDUu68V8ChqqOfFupIaG/LCVPUT+CoGJpT77zJprs4T/W7p07LP7zAIMuweVw==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true,
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz",
+ "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esquery/node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esrecurse/node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true
+ },
+ "node_modules/fast-glob": {
+ "version": "3.2.12",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz",
+ "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "dev": true
+ },
+ "node_modules/fastq": {
+ "version": "1.15.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
+ "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==",
+ "dev": true,
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/file-entry-cache": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "dev": true,
+ "dependencies": {
+ "flat-cache": "^3.0.4"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dev": true,
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/find-cache-dir": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz",
+ "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==",
+ "dev": true,
+ "dependencies": {
+ "commondir": "^1.0.1",
+ "make-dir": "^2.0.0",
+ "pkg-dir": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/flat": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
+ "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
+ "dev": true,
+ "bin": {
+ "flat": "cli.js"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+ "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
+ "dev": true,
+ "dependencies": {
+ "flatted": "^3.1.0",
+ "rimraf": "^3.0.2"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz",
+ "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==",
+ "dev": true
+ },
+ "node_modules/foreground-child": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz",
+ "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==",
+ "dev": true,
+ "dependencies": {
+ "cross-spawn": "^7.0.0",
+ "signal-exit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/fromentries": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz",
+ "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/fs-readdir-recursive": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz",
+ "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==",
+ "dev": true
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+ "dev": true
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "dev": true,
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+ "dev": true
+ },
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true,
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/get-func-name": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz",
+ "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/get-package-type": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
+ "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "dev": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "dev": true,
+ "dependencies": {
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.2.9",
+ "ignore": "^5.2.0",
+ "merge2": "^1.4.1",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/globby/node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "dev": true
+ },
+ "node_modules/graphemer": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
+ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
+ "dev": true
+ },
+ "node_modules/has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "dev": true,
+ "dependencies": {
+ "function-bind": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/hasha": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz",
+ "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==",
+ "dev": true,
+ "dependencies": {
+ "is-stream": "^2.0.0",
+ "type-fest": "^0.8.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/he": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
+ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+ "dev": true,
+ "bin": {
+ "he": "bin/he"
+ }
+ },
+ "node_modules/html-escaper": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
+ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
+ "dev": true
+ },
+ "node_modules/ignore": {
+ "version": "5.2.4",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz",
+ "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/ignore-by-default": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
+ "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==",
+ "dev": true
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+ "dev": true,
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/import-fresh/node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/indent-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "dev": true,
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.12.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz",
+ "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==",
+ "dev": true,
+ "dependencies": {
+ "has": "^1.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-immutable-type": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/is-immutable-type/-/is-immutable-type-1.2.9.tgz",
+ "integrity": "sha512-DDx04RjLpGNT4vtF49vGW5CECP6lAx8SL2keq99ogIxwLvJPBvgThdhb43ED5uYO4nq0kZ51tMj7VdCCQgdZ5Q==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/type-utils": "^5.55.0"
+ },
+ "peerDependencies": {
+ "eslint": "*",
+ "typescript": ">=4.7.4"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-path-inside": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-plain-obj": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
+ "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "dev": true,
+ "dependencies": {
+ "isobject": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
+ "dev": true
+ },
+ "node_modules/is-unicode-supported": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
+ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true
+ },
+ "node_modules/isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/istanbul-lib-coverage": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz",
+ "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-hook": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz",
+ "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==",
+ "dev": true,
+ "dependencies": {
+ "append-transform": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-instrument": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz",
+ "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/core": "^7.12.3",
+ "@babel/parser": "^7.14.7",
+ "@istanbuljs/schema": "^0.1.2",
+ "istanbul-lib-coverage": "^3.2.0",
+ "semver": "^6.3.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-processinfo": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz",
+ "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==",
+ "dev": true,
+ "dependencies": {
+ "archy": "^1.0.0",
+ "cross-spawn": "^7.0.3",
+ "istanbul-lib-coverage": "^3.2.0",
+ "p-map": "^3.0.0",
+ "rimraf": "^3.0.0",
+ "uuid": "^8.3.2"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-report": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
+ "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==",
+ "dev": true,
+ "dependencies": {
+ "istanbul-lib-coverage": "^3.0.0",
+ "make-dir": "^3.0.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-report/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-report/node_modules/make-dir": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+ "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+ "dev": true,
+ "dependencies": {
+ "semver": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/istanbul-lib-report/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-source-maps": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz",
+ "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^4.1.1",
+ "istanbul-lib-coverage": "^3.0.0",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/istanbul-reports": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz",
+ "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==",
+ "dev": true,
+ "dependencies": {
+ "html-escaper": "^2.0.0",
+ "istanbul-lib-report": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true
+ },
+ "node_modules/js-yaml": {
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/jsesc": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+ "dev": true,
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "dev": true
+ },
+ "node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "dev": true,
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/jsonschema": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz",
+ "integrity": "sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/kind-of": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/lodash.debounce": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
+ "dev": true
+ },
+ "node_modules/lodash.flattendeep": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz",
+ "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==",
+ "dev": true
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true
+ },
+ "node_modules/log-symbols": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
+ "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^4.1.0",
+ "is-unicode-supported": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/log-symbols/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/log-symbols/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/log-symbols/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/log-symbols/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/log-symbols/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/log-symbols/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/loupe": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz",
+ "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==",
+ "dev": true,
+ "dependencies": {
+ "get-func-name": "^2.0.0"
+ }
+ },
+ "node_modules/lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^3.0.2"
+ }
+ },
+ "node_modules/make-dir": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
+ "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
+ "dev": true,
+ "dependencies": {
+ "pify": "^4.0.1",
+ "semver": "^5.6.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/make-dir/node_modules/semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
+ "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+ "dev": true,
+ "dependencies": {
+ "braces": "^3.0.2",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/mocha": {
+ "version": "10.2.0",
+ "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz",
+ "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==",
+ "dev": true,
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "7.2.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "nanoid": "3.3.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mochajs"
+ }
+ },
+ "node_modules/mocha/node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "node_modules/mocha/node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/mocha/node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/mocha/node_modules/glob": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
+ "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
+ "dev": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/mocha/node_modules/glob/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/mocha/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/mocha/node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/mocha/node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/mocha/node_modules/minimatch": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz",
+ "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/mocha/node_modules/minimatch/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/mocha/node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true
+ },
+ "node_modules/mocha/node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/mocha/node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/mocha/node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz",
+ "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==",
+ "dev": true,
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true
+ },
+ "node_modules/node-preload": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz",
+ "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==",
+ "dev": true,
+ "dependencies": {
+ "process-on-spawn": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.13",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz",
+ "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==",
+ "dev": true
+ },
+ "node_modules/nodemon": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.1.tgz",
+ "integrity": "sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==",
+ "dev": true,
+ "dependencies": {
+ "chokidar": "^3.5.2",
+ "debug": "^3.2.7",
+ "ignore-by-default": "^1.0.1",
+ "minimatch": "^3.1.2",
+ "pstree.remy": "^1.1.8",
+ "semver": "^7.5.3",
+ "simple-update-notifier": "^2.0.0",
+ "supports-color": "^5.5.0",
+ "touch": "^3.1.0",
+ "undefsafe": "^2.0.5"
+ },
+ "bin": {
+ "nodemon": "bin/nodemon.js"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/nodemon"
+ }
+ },
+ "node_modules/nodemon/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/nodemon/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/nodemon/node_modules/semver": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/nodemon/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ },
+ "node_modules/nopt": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
+ "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==",
+ "dev": true,
+ "dependencies": {
+ "abbrev": "1"
+ },
+ "bin": {
+ "nopt": "bin/nopt.js"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/normalize-diacritics": {
+ "version": "2.14.0",
+ "resolved": "https://registry.npmjs.org/normalize-diacritics/-/normalize-diacritics-2.14.0.tgz",
+ "integrity": "sha512-8VRFMqjFvAMJpIloYQvNXF5ZMcs5JqHMYvbP+04FPjGCWvQo5PybsfFt1wCztyBW0xXfRPsux1tGe7bERaRLZg==",
+ "hasInstallScript": true,
+ "dependencies": {
+ "tslib": "^2.1.0"
+ },
+ "engines": {
+ "node": ">= 10.18.1",
+ "npm": ">= 6.13.4"
+ }
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/nyc": {
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz",
+ "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==",
+ "dev": true,
+ "dependencies": {
+ "@istanbuljs/load-nyc-config": "^1.0.0",
+ "@istanbuljs/schema": "^0.1.2",
+ "caching-transform": "^4.0.0",
+ "convert-source-map": "^1.7.0",
+ "decamelize": "^1.2.0",
+ "find-cache-dir": "^3.2.0",
+ "find-up": "^4.1.0",
+ "foreground-child": "^2.0.0",
+ "get-package-type": "^0.1.0",
+ "glob": "^7.1.6",
+ "istanbul-lib-coverage": "^3.0.0",
+ "istanbul-lib-hook": "^3.0.0",
+ "istanbul-lib-instrument": "^4.0.0",
+ "istanbul-lib-processinfo": "^2.0.2",
+ "istanbul-lib-report": "^3.0.0",
+ "istanbul-lib-source-maps": "^4.0.0",
+ "istanbul-reports": "^3.0.2",
+ "make-dir": "^3.0.0",
+ "node-preload": "^0.2.1",
+ "p-map": "^3.0.0",
+ "process-on-spawn": "^1.0.0",
+ "resolve-from": "^5.0.0",
+ "rimraf": "^3.0.0",
+ "signal-exit": "^3.0.2",
+ "spawn-wrap": "^2.0.0",
+ "test-exclude": "^6.0.0",
+ "yargs": "^15.0.2"
+ },
+ "bin": {
+ "nyc": "bin/nyc.js"
+ },
+ "engines": {
+ "node": ">=8.9"
+ }
+ },
+ "node_modules/nyc/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/nyc/node_modules/cliui": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
+ "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^6.2.0"
+ }
+ },
+ "node_modules/nyc/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/nyc/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/nyc/node_modules/find-cache-dir": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz",
+ "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==",
+ "dev": true,
+ "dependencies": {
+ "commondir": "^1.0.1",
+ "make-dir": "^3.0.2",
+ "pkg-dir": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/avajs/find-cache-dir?sponsor=1"
+ }
+ },
+ "node_modules/nyc/node_modules/istanbul-lib-instrument": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz",
+ "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/core": "^7.7.5",
+ "@istanbuljs/schema": "^0.1.2",
+ "istanbul-lib-coverage": "^3.0.0",
+ "semver": "^6.3.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/nyc/node_modules/make-dir": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+ "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+ "dev": true,
+ "dependencies": {
+ "semver": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/nyc/node_modules/pkg-dir": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+ "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+ "dev": true,
+ "dependencies": {
+ "find-up": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/nyc/node_modules/wrap-ansi": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+ "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/nyc/node_modules/y18n": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
+ "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
+ "dev": true
+ },
+ "node_modules/nyc/node_modules/yargs": {
+ "version": "15.4.1",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
+ "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
+ "dev": true,
+ "dependencies": {
+ "cliui": "^6.0.0",
+ "decamelize": "^1.2.0",
+ "find-up": "^4.1.0",
+ "get-caller-file": "^2.0.1",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^2.0.0",
+ "set-blocking": "^2.0.0",
+ "string-width": "^4.2.0",
+ "which-module": "^2.0.0",
+ "y18n": "^4.0.0",
+ "yargs-parser": "^18.1.2"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/nyc/node_modules/yargs-parser": {
+ "version": "18.1.3",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
+ "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
+ "dev": true,
+ "dependencies": {
+ "camelcase": "^5.0.0",
+ "decamelize": "^1.2.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dev": true,
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/optionator": {
+ "version": "0.9.3",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz",
+ "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==",
+ "dev": true,
+ "dependencies": {
+ "@aashutoshrathi/word-wrap": "^1.2.3",
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/p-map": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz",
+ "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==",
+ "dev": true,
+ "dependencies": {
+ "aggregate-error": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/package-hash": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz",
+ "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.1.15",
+ "hasha": "^5.0.0",
+ "lodash.flattendeep": "^4.4.0",
+ "release-zalgo": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "dev": true
+ },
+ "node_modules/path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pathval": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz",
+ "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/picocolors": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
+ "dev": true
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pify": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/pirates": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz",
+ "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/pkg-dir": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz",
+ "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==",
+ "dev": true,
+ "dependencies": {
+ "find-up": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/pkg-dir/node_modules/find-up": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/pkg-dir/node_modules/locate-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+ "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^3.0.0",
+ "path-exists": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/pkg-dir/node_modules/p-locate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/pkg-dir/node_modules/path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/process-on-spawn": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz",
+ "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==",
+ "dev": true,
+ "dependencies": {
+ "fromentries": "^1.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pstree.remy": {
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
+ "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==",
+ "dev": true
+ },
+ "node_modules/punycode": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
+ "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/randombytes": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/regenerate": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
+ "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==",
+ "dev": true
+ },
+ "node_modules/regenerate-unicode-properties": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz",
+ "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==",
+ "dev": true,
+ "dependencies": {
+ "regenerate": "^1.4.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/regenerator-runtime": {
+ "version": "0.13.11",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
+ "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==",
+ "dev": true
+ },
+ "node_modules/regenerator-transform": {
+ "version": "0.15.1",
+ "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz",
+ "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/runtime": "^7.8.4"
+ }
+ },
+ "node_modules/regexpu-core": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz",
+ "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/regjsgen": "^0.8.0",
+ "regenerate": "^1.4.2",
+ "regenerate-unicode-properties": "^10.1.0",
+ "regjsparser": "^0.9.1",
+ "unicode-match-property-ecmascript": "^2.0.0",
+ "unicode-match-property-value-ecmascript": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/regjsparser": {
+ "version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz",
+ "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==",
+ "dev": true,
+ "dependencies": {
+ "jsesc": "~0.5.0"
+ },
+ "bin": {
+ "regjsparser": "bin/parser"
+ }
+ },
+ "node_modules/regjsparser/node_modules/jsesc": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
+ "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==",
+ "dev": true,
+ "bin": {
+ "jsesc": "bin/jsesc"
+ }
+ },
+ "node_modules/release-zalgo": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz",
+ "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==",
+ "dev": true,
+ "dependencies": {
+ "es6-error": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/require-main-filename": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
+ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
+ "dev": true
+ },
+ "node_modules/resolve": {
+ "version": "1.22.2",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz",
+ "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==",
+ "dev": true,
+ "dependencies": {
+ "is-core-module": "^2.11.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "dev": true,
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
+ "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
+ "dev": true,
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "node_modules/set-blocking": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+ "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==",
+ "dev": true
+ },
+ "node_modules/shallow-clone": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
+ "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
+ "dev": true,
+ "dependencies": {
+ "kind-of": "^6.0.2"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "dev": true
+ },
+ "node_modules/simple-update-notifier": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz",
+ "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==",
+ "dev": true,
+ "dependencies": {
+ "semver": "^7.5.3"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/simple-update-notifier/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/simple-update-notifier/node_modules/semver": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/simple-update-notifier/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ },
+ "node_modules/slash": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
+ "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-support": {
+ "version": "0.5.21",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+ "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+ "dev": true,
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
+ "node_modules/spawn-wrap": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz",
+ "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==",
+ "dev": true,
+ "dependencies": {
+ "foreground-child": "^2.0.0",
+ "is-windows": "^1.0.2",
+ "make-dir": "^3.0.0",
+ "rimraf": "^3.0.0",
+ "signal-exit": "^3.0.2",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/spawn-wrap/node_modules/make-dir": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+ "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+ "dev": true,
+ "dependencies": {
+ "semver": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
+ "dev": true
+ },
+ "node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-bom": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
+ "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/test-exclude": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
+ "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
+ "dev": true,
+ "dependencies": {
+ "@istanbuljs/schema": "^0.1.2",
+ "glob": "^7.1.4",
+ "minimatch": "^3.0.4"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
+ "dev": true
+ },
+ "node_modules/to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/touch": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz",
+ "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==",
+ "dev": true,
+ "dependencies": {
+ "nopt": "~1.0.10"
+ },
+ "bin": {
+ "nodetouch": "bin/nodetouch.js"
+ }
+ },
+ "node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg=="
+ },
+ "node_modules/tsutils": {
+ "version": "3.21.0",
+ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
+ "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
+ "dev": true,
+ "dependencies": {
+ "tslib": "^1.8.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ },
+ "peerDependencies": {
+ "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta"
+ }
+ },
+ "node_modules/tsutils/node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+ "dev": true
+ },
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/type-detect": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
+ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/type-fest": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+ "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/typedarray-to-buffer": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
+ "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
+ "dev": true,
+ "dependencies": {
+ "is-typedarray": "^1.0.0"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz",
+ "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==",
+ "dev": true,
+ "peer": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=12.20"
+ }
+ },
+ "node_modules/undefsafe": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz",
+ "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==",
+ "dev": true
+ },
+ "node_modules/unicode-canonical-property-names-ecmascript": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz",
+ "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-match-property-ecmascript": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz",
+ "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==",
+ "dev": true,
+ "dependencies": {
+ "unicode-canonical-property-names-ecmascript": "^2.0.0",
+ "unicode-property-aliases-ecmascript": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-match-property-value-ecmascript": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz",
+ "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-property-aliases-ecmascript": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz",
+ "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz",
+ "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "escalade": "^3.1.1",
+ "picocolors": "^1.0.0"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "dev": true,
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/which-module": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
+ "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==",
+ "dev": true
+ },
+ "node_modules/workerpool": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz",
+ "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==",
+ "dev": true
+ },
+ "node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "dev": true
+ },
+ "node_modules/write-file-atomic": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
+ "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
+ "dev": true,
+ "dependencies": {
+ "imurmurhash": "^0.1.4",
+ "is-typedarray": "^1.0.0",
+ "signal-exit": "^3.0.2",
+ "typedarray-to-buffer": "^3.1.5"
+ }
+ },
+ "node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "dev": true
+ },
+ "node_modules/yargs": {
+ "version": "16.2.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+ "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+ "dev": true,
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz",
+ "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yargs-unparser": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz",
+ "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==",
+ "dev": true,
+ "dependencies": {
+ "camelcase": "^6.0.0",
+ "decamelize": "^4.0.0",
+ "flat": "^5.0.2",
+ "is-plain-obj": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yargs-unparser/node_modules/camelcase": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
+ "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/yargs-unparser/node_modules/decamelize": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz",
+ "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ }
+ }
}
diff --git a/package.json b/package.json
index d589b4e..44f856c 100644
--- a/package.json
+++ b/package.json
@@ -1,59 +1,103 @@
{
- "name": "@natlibfi/marc-record-merge",
- "description": "A configurable Javascript module for merging MARC records",
- "author": {
- "name": "The National Library of Finland"
- },
- "keywords": [
- "marc",
- "record",
- "merge",
- "merging",
- "combine",
- "combining",
- "bibliography",
- "bibliographic",
- "catalog",
- "library",
- "libraries"
- ],
- "homepage": "https://github.com/NatLibFi/marc-record-merge",
- "bugs": {
- "url": "https://github.com/NatLibFi/marc-record-merge/issues"
- },
- "repository": {
- "type": "git",
- "url": "git@github.com:NatLibFi/marc-record-merge.git"
- },
- "license": "AGPL-3.0",
- "version": "5.0.0",
- "main": "./lib/main.js",
- "scripts": {
- "lint": "jshint .",
- "test": "istanbul cover _mocha test/nodejs/*.spec.js",
- "test:watch": "mocha test/nodejs/*.spec.js -w",
- "test-browser": "npm run generate-requirejs-config && karma start",
- "cover": "npm run test && istanbul check-coverage",
- "check": "npm run lint && npm run cover",
- "generate-requirejs-config": "requirejs-configurator --npm --include-dev-dependencies --exclude-peer-dependencies > test/browser/main.js",
- "publish-to-npm": "npm install && npm run check && npm publish --access=public"
- },
- "dependencies": {
- "marc-record-js": "^0.1.1",
- "@natlibfi/es6-polyfills": "^2.0.0",
- "@natlibfi/es6-shims": "^2.0.0"
- },
- "devDependencies": {
- "chai": "^3.5.0",
- "jshint": "^2.9.3",
- "mocha": "^3.0.2",
- "istanbul": "^0.4.5",
- "karma": "^1.2.0",
- "karma-mocha": "^1.1.1",
- "karma-requirejs": "https://github.com/natlibfi-arlehiko/karma-requirejs#fix-npm3-dist",
- "karma-requirejs-preprocessor": "^0.0.2",
- "requirejs": "^2.3.2",
- "requirejs-configurator": "https://github.com/natlibfi-arlehiko/requirejs-configurator#peer-deps",
- "codeclimate-test-reporter": "^0.3.3"
- }
+ "name": "@natlibfi/marc-record-merge",
+ "description": "Merge MARC records",
+ "author": {
+ "name": "The National Library of Finland"
+ },
+ "keywords": [],
+ "homepage": "https://github.com/natlibfi/marc-record-merge-js",
+ "bugs": {
+ "url": "https://github.com/natlibfi/marc-record-merge-js/issues"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git@github.com:natlibfi/marc-record-merge-js.git"
+ },
+ "license": "MIT",
+ "version": "7.0.0-alpha.4",
+ "main": "./dist/index.js",
+ "engines": {
+ "node": ">=18"
+ },
+ "type": "commonjs",
+ "scripts": {
+ "prepare": "npm run build",
+ "prepublishOnly": "npm run build:transpile",
+ "lint": "eslint ./src",
+ "lint:dev": "eslint ./src --fix",
+ "test:base": "cross-env NODE_ENV=test mocha --require @babel/register --reporter-option maxDiffSize=15000",
+ "test": "npm run lint && npm run test:base -- --recursive src",
+ "test:dev": "npm run lint:dev && npm run coverage",
+ "coverage": "npm run coverage:unit && npm run coverage:report",
+ "coverage:unit": "nyc --silent npm run test:base",
+ "coverage:report": "nyc report",
+ "build:transpile": "babel src --copy-files --source-maps --delete-dir-on-start --out-dir=dist",
+ "build": "npm run build:transpile",
+ "dev:test": "cross-env NODE_ENV=test nodemon -w src -w test-fixtures --exec 'clear && npm run test:dev'",
+ "dev:test:debug": "cross-env DEBUG=@natlibfi/* NODE_ENV=test nodemon -w src -w test-fixtures --exec 'clear && npm run test:dev'"
+ },
+ "dependencies": {
+ "@natlibfi/marc-record": "^7.2.4",
+ "debug": "^4.3.4",
+ "normalize-diacritics": "^2.13.2"
+ },
+ "devDependencies": {
+ "@babel/cli": "^7.22.9",
+ "@babel/core": "^7.22.9",
+ "@babel/eslint-parser": "^7.22.9",
+ "@babel/preset-env": "^7.22.9",
+ "@babel/register": "^7.22.5",
+ "@natlibfi/eslint-config-melinda-backend": "^3.0.1",
+ "babel-plugin-istanbul": "^6.1.1",
+ "babel-plugin-rewire": "^1.2.0",
+ "chai": "^4.3.7",
+ "cross-env": "^7.0.3",
+ "eslint": "^8.46.0",
+ "mocha": "^10.2.0",
+ "@natlibfi/fixugen": "2.0.1",
+ "@natlibfi/fixura": "^3.0.1",
+ "nodemon": "^3.0.1",
+ "nyc": "^15.1.0"
+ },
+ "eslintConfig": {
+ "extends": [
+ "@natlibfi/melinda-backend"
+ ]
+ },
+ "babel": {
+ "presets": [
+ [
+ "@babel/preset-env",
+ {
+ "targets": "maintained node versions"
+ }
+ ]
+ ],
+ "env": {
+ "test": {
+ "plugins": [
+ "rewire",
+ "istanbul"
+ ]
+ }
+ }
+ },
+ "nyc": {
+ "exclude": [
+ "*/*.spec.js",
+ "*/**/*.spec.js"
+ ],
+ "reporter": [
+ "text"
+ ],
+ "require": [
+ "@babel/register"
+ ],
+ "sourceMap": false,
+ "instrument": false,
+ "lines": 80,
+ "statements": 80,
+ "functions": 80,
+ "branches": 80
+ }
}
diff --git a/resources/action-copy-options-schema.json b/resources/action-copy-options-schema.json
deleted file mode 100644
index 6c39fa1..0000000
--- a/resources/action-copy-options-schema.json
+++ /dev/null
@@ -1,81 +0,0 @@
-{
- "type": "object",
- "properties": {
- "mustBeIdentical": {
- "type": "boolean"
- },
- "compareWithoutIndicators": {
- "type": "boolean"
- },
- "compareWithout": {
- "type": "array",
- "items": {
- "type": "string"
- }
- },
- "combine": {
- "type": "array",
- "items": {
- "type": "string"
- }
- },
- "pick": {
- "type": "object",
- "properties": {
- "subfields": {
- "type": "array",
- "items": {
- "type": "string"
- }
- },
- "missingOnly": {
- "type": "boolean"
- }
- },
- "required": ["subfields"],
- "additionalProperties": false
- },
- "transformOnInequality": {
- "type": "object",
- "properties": {
- "tag": {
- "type": "string"
- },
- "ind1": {
- "type": "string"
- },
- "ind2": {
- "type": "string"
- },
- "map": {
- "description": "Map of subfield codes of the merged record that are mapped to the subfields of the other record",
- "type": "object",
- "patternProperties": {
- "\\w": {
- "type": "string"
- }
- }
- },
- "drop": {
- "description": "Array of subfield codes to drop",
- "type": "array",
- "items": {
- "type": "string"
- }
- },
- "add": {
- "description": "Map of subfields codes that are to be added to the merged record with static values",
- "type": "object",
- "patternProperties": {
- "\\w": {
- "type": "string"
- }
- }
- }
- },
- "required": ["tag"],
- "additionalProperties": false
- }
- },
- "additionalProperties": false
-}
\ No newline at end of file
diff --git a/resources/action-select-better-options-schema.json b/resources/action-select-better-options-schema.json
deleted file mode 100644
index 270510d..0000000
--- a/resources/action-select-better-options-schema.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "type": "object",
- "properties": {
- "requireFieldInBoth": {
- "type": "boolean"
- },
- "onlyIfMissing": {
- "type": "boolean"
- },
- "skipOnMultiple": {
- "type": "boolean"
- },
- "comparator": {
- "type": "string"
- },
- "pick": {
- "type": "object",
- "properties": {
- "subfields": {
- "type": "array",
- "items": {
- "type": "string"
- }
- },
- "missingOnly": {
- "type": "boolean"
- }
- },
- "required": ["subfields"],
- "additionalProperties": false
- }
- },
- "additionalProperties": false
-}
\ No newline at end of file
diff --git a/resources/configuration-schema.json b/resources/configuration-schema.json
deleted file mode 100644
index acc5d57..0000000
--- a/resources/configuration-schema.json
+++ /dev/null
@@ -1,46 +0,0 @@
-{
- "type": "object",
- "properties": {
- "fields": {
- "type": "object",
- "patternProperties": {
- ".+": {
- "type": "object",
- "properties": {
- "action": {
- "type": "string"
- },
- "options": {}
- },
- "required": ["action"],
- "additionalProperties": false
- }
- },
- "additionalProperties": false
- },
- "sort": {
- "type": "object",
- "properties": {
- "insert": {
- "enum": ["before", "after"],
- "default": "after"
- },
- "indexes": {
- "type": "object",
- "patternProperties": {
- ".+": {
- "type": "number"
- }
- },
- "additionalProperties": false
- }
- },
- "additionalProperties": false,
- "default": {
- "insert": "after"
- }
- }
- },
- "required": ["fields"],
- "additionalProperties": false
-}
\ No newline at end of file
diff --git a/src/index.js b/src/index.js
new file mode 100644
index 0000000..378d343
--- /dev/null
+++ b/src/index.js
@@ -0,0 +1,54 @@
+import Reducers from './reducers';
+import createDebugLogger from 'debug';
+
+const debug = createDebugLogger('@natlibfi/melinda-marc-record-merge:index');
+const debugData = debug.extend('data');
+
+export {Reducers};
+// export default ({base, source, reducers}) => reducers.reduce((base, reducer) => reducer(base, source), base);
+
+// NV: Modified the reducer loop so, that not only base, but also is carried back.
+// However, we try to be backward-compatible: normally after the reducers, only base is returned.
+
+export default ({base, source, reducers}) => {
+
+ const combo = {base, source};
+ const resultCombo = reducers.reduce((combo, reducer) => {
+ const returnCombo = singleRound(reducer, combo.base, combo.source);
+ //debugData(`returnCombo after current reducer: ${JSON.stringify(returnCombo)}`);
+ return returnCombo;
+ }, combo);
+
+ debugData(`ResultCombo after reducers: ${JSON.stringify(resultCombo)}`);
+
+ // Hack to make my melinda-marc-record-merge-reducers single tests that expect both
+ // base and source to return them both:
+ if (reducers.length === 1 && resultCombo.base && resultCombo.source) {
+ debug('Single reducer, returning resultCombo');
+ debugData(JSON.stringify(resultCombo));
+
+ return resultCombo;
+ }
+ // All other tests return just base... Backward (compability) it is!
+ debug('Multiple reducers, returning just base');
+ debugData(JSON.stringify(resultCombo.base));
+ return resultCombo.base;
+
+ function singleRound(reducer, base, source) {
+ //debug(`SINGLE ROUND INPUT (base, source)`);
+ //debugData(base);
+ //debugData(base);
+ const reducerResult = reducer(base, source);
+ //debug(`reducerResult:`);
+ //debugData(reducerResult);
+ if (reducerResult.base !== undefined && reducerResult.source !== undefined) {
+ debug('NEW STYLE REDUCER RESULT v2');
+ const combo = reducerResult;
+ //debugData(combo);
+ return combo;
+ }
+ debug('OLD SCHOOL REDUCER RESULT v2');
+ //debugData({base: reducerResult, source});
+ return {base: reducerResult, source};
+ }
+};
diff --git a/src/index.spec.js b/src/index.spec.js
new file mode 100644
index 0000000..5bc1e98
--- /dev/null
+++ b/src/index.spec.js
@@ -0,0 +1,45 @@
+import merger, {Reducers} from './index';
+import {inspect} from 'util';
+import createDebugLogger from 'debug';
+import {expect} from 'chai';
+import {MarcRecord} from '@natlibfi/marc-record';
+import {READERS} from '@natlibfi/fixura';
+import generateTests from '@natlibfi/fixugen';
+
+generateTests({
+ callback,
+ path: [__dirname, '..', 'test-fixtures', 'index'],
+ recurse: false,
+ useMetadataFile: true,
+ fixura: {
+ failWhenNotFound: false,
+ reader: READERS.JSON
+ }
+});
+
+function callback({getFixture, reducerConfigs = []}) {
+ const base = new MarcRecord(getFixture('base.json'), {subfieldValues: false});
+ const source = new MarcRecord(getFixture('source.json'), {subfieldValues: false});
+ const expectedRecord = getFixture('merged.json');
+
+ const debug = createDebugLogger('@natlibfi/melinda-marc-record-merge-reducers:index:test');
+ const debugData = debug.extend('data');
+
+ const testReducerConfigs = reducerConfigs;
+ const reducers = [...testReducerConfigs.map(conf => Reducers.copy(conf))];
+
+ debugData(`Reducers: ${inspect(reducers, {colors: true, maxArrayLength: 10, depth: 8})})}`);
+
+ const result = merger({base, source, reducers});
+
+ debug(`Merge result is: ${result.constructor.name}`);
+ debugData(`${JSON.stringify(result)}`);
+
+ // Use either result.base or a plain result as resultRecord
+ // It can also be a MarcRecord or a plain object
+ const resultRecord = result.base || result;
+ const resultRecordToRecord = new MarcRecord(resultRecord, {subfieldValues: false});
+ expect(resultRecordToRecord.toObject()).to.eql(expectedRecord);
+
+
+}
diff --git a/src/reducers/copy.js b/src/reducers/copy.js
new file mode 100644
index 0000000..5bfba8c
--- /dev/null
+++ b/src/reducers/copy.js
@@ -0,0 +1,270 @@
+/* eslint-disable max-statements */
+/* eslint-disable no-unused-vars */
+
+import {MarcRecord} from '@natlibfi/marc-record';
+import createDebugLogger from 'debug';
+
+export default ({
+ tagPattern,
+ compareTagsOnly = false,
+ compareWithoutTag = false,
+ compareWithoutIndicators = false,
+ compareWithoutIndicator1 = false,
+ compareWithoutIndicator2 = false,
+ subfieldsMustBeIdentical = true,
+ excludeSubfields = [],
+ dropSubfields = [],
+ copyUnless = [],
+ baseValidators = {subfieldValues: false},
+ sourceValidators = {subfieldValues: false},
+ swapTag = [],
+ swapSubfieldCode = [],
+ doNotCopyIfFieldPresent = false
+}) => (base, source) => {
+
+ const debug = createDebugLogger('@natlibfi/marc-record-merge:copy');
+ const debugData = debug.extend('data');
+ const debugOptions = createDebugLogger('@natlibfi/marc-record-merge:compare-options');
+ const debugCompare = createDebugLogger('@natlibfi/marc-record-merge:compare');
+
+ debugData(`base: ${JSON.stringify(base)}`);
+ debugData(`source: ${JSON.stringify(source)}`);
+
+ const {baseRecord, sourceRecord} = getRecordsFromParameters(base, source, baseValidators, sourceValidators);
+
+ function getRecordsFromParameters(base, source, baseValidators, sourceValidators) {
+ // records if we got an object ({base, source}) as a parameter
+ if (source === undefined && base.base !== undefined && base.source !== undefined) {
+ const baseRecord = new MarcRecord(base.base, baseValidators);
+ const sourceRecord = new MarcRecord(base.source, sourceValidators);
+ return {baseRecord, sourceRecord};
+ }
+ // records if we got an non-object (base, source) as a parameter
+ const baseRecord = new MarcRecord(base, baseValidators);
+ const sourceRecord = new MarcRecord(source, sourceValidators);
+ return {baseRecord, sourceRecord};
+ }
+
+ const ignoreInd1 = compareWithoutIndicators || compareWithoutIndicator1;
+ const ignoreInd2 = compareWithoutIndicators || compareWithoutIndicator2;
+
+ debugOptions(`Tag Pattern: ${tagPattern}`);
+ debugOptions(`Compare tags only: ${compareTagsOnly}`);
+ debugOptions(`Omit indicator 1 from comparison: ${ignoreInd1}`);
+ debugOptions(`Omit indicator 2 from comparison: ${ignoreInd2}`);
+ debugOptions(`Copy if identical: ${subfieldsMustBeIdentical}`);
+ debugOptions(`Exclude subfields: [${excludeSubfields}]`);
+ debugOptions(`Drop subfields [${dropSubfields}]`);
+ debugOptions(`Copy unless contains subfields: ${JSON.stringify(copyUnless)}`);
+
+ const baseFields = baseRecord.get(tagPattern);
+ const sourceFields = sourceRecord.get(tagPattern);
+ const doNotCopy = doNotCopyIfFieldPresent ? baseRecord.get(doNotCopyIfFieldPresent).length > 0 : false;
+
+ if (doNotCopy) {
+ return baseRecord.toObject();
+ }
+ debug(`FFS: ${compareWithoutIndicator1}, ${compareWithoutIndicators}, ${ignoreInd1}`);
+ debug(`Base fields: `, baseFields);
+ debug(`Source fields: `, sourceFields);
+
+ // Logic steps
+ const baseCompareFields = baseFields.map(baseField => createCompareField(baseField));
+ const compareResultFields = compareFields(sourceFields, baseCompareFields);
+ const droppedUnwantedSubfield = checkDropSubfields(compareResultFields);
+ const droppedUnwantedFields = checkCopyUnlessFields(droppedUnwantedSubfield);
+ const swappedSubfields = checkSwapSubfieldCodes(droppedUnwantedFields);
+ const swappedTags = checkSwapTag(swappedSubfields);
+ const uniqueFields = [...new Set(swappedTags.map(field => JSON.stringify(field)))].map(field => JSON.parse(field));
+ debug('Fields to be copied');
+ debug(JSON.stringify(uniqueFields));
+
+ // Add fields to base;
+ uniqueFields.forEach(field => baseRecord.insertField(field));
+ debugData(`baseRecord before return: ${JSON.stringify(baseRecord)}`);
+ //return baseRecord;
+ return baseRecord.toObject();
+
+ function compareFields(sourceFields, baseCompareFields, uniqFields = []) {
+ const [sourceField, ...rest] = sourceFields;
+ if (sourceField === undefined) {
+ return uniqFields;
+ }
+
+ if (baseCompareFields.length === 0) {
+ return compareFields(rest, baseCompareFields, [...uniqFields, sourceField]);
+ }
+
+ // Source and base are also compared for identicalness
+ // Non-identical fields are copied from source to base as duplicates
+ const sourceCompareField = createCompareField(sourceField);
+ const unique = checkCompareFields(baseCompareFields, sourceCompareField);
+
+ debugCompare(`${JSON.stringify(sourceField)} ${unique ? 'is UNIQUE' : 'not UNIQUE'}`);
+
+ if (unique) {
+ return compareFields(rest, baseCompareFields, [...uniqFields, sourceField]);
+ }
+
+ return compareFields(rest, baseCompareFields, uniqFields);
+
+ function checkCompareFields(baseCompareFields, sourceCompareField) {
+ let unique = true; // eslint-disable-line functional/no-let
+
+ baseCompareFields.forEach(baseCompareField => {
+ debugCompare(`Comparing ${JSON.stringify(sourceCompareField)} to ${JSON.stringify(baseCompareField)}}`);
+
+ if (sourceCompareField.value !== baseCompareField.value) {
+ debugCompare(`Value is different ${sourceCompareField.value} !== ${baseCompareField.value}`);
+ return;
+ }
+
+ if (sourceCompareField.ind1 !== baseCompareField.ind1) {
+ debugCompare(`Ind1 is different ${sourceCompareField.ind1} !== ${baseCompareField.ind1}`);
+ return;
+ }
+
+ if (sourceCompareField.ind2 !== baseCompareField.ind2) {
+ debugCompare(`Ind2 is different ${sourceCompareField.ind2} !== ${baseCompareField.ind2}`);
+ return;
+ }
+
+ if ('subfields' in sourceCompareField) {
+ const allFound = checkSubfields(sourceCompareField.subfields, baseCompareField.subfields);
+ debugCompare(`Subfields are different ${!allFound}`);
+ if (!allFound) {
+ return;
+ }
+
+ unique = false;
+ return;
+ }
+
+ unique = false;
+ return;
+ });
+
+ return unique;
+ }
+
+ function checkSubfields(sourceSubfields, baseSubfields) {
+ const foundSubs = sourceSubfields.filter(sSub => baseSubfields.some(bSub => sSub.code === bSub.code && sSub.value === bSub.value));
+
+ if (subfieldsMustBeIdentical) {
+ return foundSubs.length === sourceSubfields.length && foundSubs.length === baseSubfields.length;
+ }
+
+ return foundSubs.length === sourceSubfields.length;
+ }
+ }
+
+ // compare objects have only fields that matter in comparison
+ function createCompareField(field) {
+ if (compareTagsOnly) {
+ return {tag: field.tag};
+ }
+
+ if ('value' in field) {
+ return {tag: field.tag, value: field.value};
+ }
+
+ const [filteredField] = checkDropSubfields([field]);
+ const [foundRule] = swapTag.filter(rule => new RegExp(rule.from, 'u').test(field.tag));
+ const replacementTag = foundRule ? foundRule.to : undefined;
+
+ const params = [
+ {name: 'tag', value: compareWithoutTag ? replacementTag : field.tag},
+ {name: 'ind1', value: ignoreInd1 ? undefined : field.ind1},
+ {name: 'ind2', value: ignoreInd2 ? undefined : field.ind2},
+ {name: 'subfields', value: createCompareSubfields(filteredField.subfields)}
+ ].map(param => [param.name, param.value]);
+
+ return Object.fromEntries(params);
+
+ function createCompareSubfields(subfields) {
+ const nonExcludedSubfields = subfields.filter(sub => !excludeSubfields.some(code => code === sub.code));
+ const normalizedSubfields = nonExcludedSubfields.map(sub => ({code: sub.code, value: normalizeSubfieldValue(sub.value)}));
+
+ return normalizedSubfields;
+
+ function normalizeSubfieldValue(value) {
+ return value.toLowerCase().replace(/\s+/ug, '');
+ }
+ }
+ }
+
+ function checkSwapTag(fields) {
+ if (swapTag.length > 0) {
+ return fields.map(field => ({...field, tag: swapTagsFunc(field.tag)}));
+ }
+
+ return fields;
+
+ function swapTagsFunc(tag) {
+ const [foundRule] = swapTag.filter(rule => new RegExp(rule.from, 'u').test(tag));
+
+ if (foundRule === undefined) {
+ return tag;
+ }
+
+ return foundRule.to;
+ }
+ }
+
+ function checkSwapSubfieldCodes(fields) {
+ if (swapSubfieldCode.length > 0) {
+ return fields.map(field => ({...field, subfields: swapSubfieldCodesFunc(field.subfields)}));
+ }
+
+ return fields;
+
+ function swapSubfieldCodesFunc(subfields) {
+ return subfields.map(sub => {
+ const [foundRule] = swapSubfieldCode.filter(rule => rule.from === sub.code);
+
+ if (foundRule === undefined) {
+ return sub;
+ }
+
+ return {code: foundRule.to, value: sub.value};
+ });
+ }
+ }
+
+ function checkDropSubfields(fields) {
+ if (dropSubfields.length > 0) {
+ return fields.map(field => ({...field, subfields: dropSubfieldsFunc(field.subfields)}))
+ .filter(field => field.subfields.length > 0);
+ }
+
+ return fields;
+
+ function dropSubfieldsFunc(subfields) {
+ return subfields.filter(sub => { // eslint-disable-line
+ return !dropSubfields.some(({code, value = false, condition = false}) => {
+ if (code !== sub.code) {
+ return false;
+ }
+
+ if (!condition && value) {
+ return value === sub.value;
+ }
+
+ if (condition === 'unless' && value) {
+ return !new RegExp(value, 'u').test(sub.value);
+ }
+
+ return true;
+ });
+ });
+ }
+ }
+
+ function checkCopyUnlessFields(fields) {
+ if (copyUnless.length > 0) {
+ return fields.filter(({subfields}) => copyUnless.some(filter => !subfields.some(sub => sub.code === filter.code && new RegExp(filter.value, 'u').test(sub.value))));
+ }
+
+ return fields;
+ }
+};
diff --git a/src/reducers/copy.spec.js b/src/reducers/copy.spec.js
new file mode 100644
index 0000000..814c29f
--- /dev/null
+++ b/src/reducers/copy.spec.js
@@ -0,0 +1,54 @@
+import {expect} from 'chai';
+import {READERS} from '@natlibfi/fixura';
+import createReducer from './copy';
+import generateTests from '@natlibfi/fixugen';
+
+//import createDebugLogger from 'debug'; // <---
+//const debug = createDebugLogger('@natlibfi/marc-record-merge/copy.spec.js'); // <---
+
+generateTests({
+ callback,
+ path: [__dirname, '..', '..', 'test-fixtures', 'reducers', 'copy'],
+ useMetadataFile: true,
+ recurse: true,
+ fixura: {
+ reader: READERS.JSON,
+ failWhenNotFound: false
+ }
+});
+
+function callback({
+ getFixture,
+ tagPatternRegExp,
+ compareTagsOnly = false,
+ compareWithoutTag = false,
+ compareWithoutIndicators = false,
+ compareWithoutIndicator1 = false,
+ compareWithoutIndicator2 = false,
+ subfieldsMustBeIdentical = false,
+ copyUnless = undefined,
+ excludeSubfields = undefined,
+ dropSubfields = undefined,
+ swapSubfieldCode = [],
+ swapTag = [],
+ doNotCopyIfFieldPresent = false
+}) {
+ const base = getFixture('base.json');
+ const source = getFixture('source.json');
+ const tagPattern = new RegExp(tagPatternRegExp, 'u');
+ const expectedRecord = getFixture('merged.json');
+
+ const merged = createReducer({
+ tagPattern, compareTagsOnly, compareWithoutTag, compareWithoutIndicators, compareWithoutIndicator1, compareWithoutIndicator2,
+ copyUnless, subfieldsMustBeIdentical, excludeSubfields,
+ dropSubfields, swapSubfieldCode, swapTag,
+ doNotCopyIfFieldPresent
+ })(base, source);
+ //debug(`*** mergedRecord: `, mergedRecord); //<--
+ //debug(`*** mergedRecord,Strfy: `, JSON.stringify(mergedRecord)); //<--
+ //debug(`*** expectedRecord: `, expectedRecord); //<--
+ //debug(`*** expectedRecord,Strfy: `, JSON.stringify(expectedRecord)); //<--
+ expect(merged.constructor.name).not.to.eql('MarcRecord');
+ expect(merged.constructor.name).to.eql('Object');
+ expect(merged).to.eql(expectedRecord);
+}
diff --git a/src/reducers/copy2.spec.js b/src/reducers/copy2.spec.js
new file mode 100644
index 0000000..3b91e9e
--- /dev/null
+++ b/src/reducers/copy2.spec.js
@@ -0,0 +1,55 @@
+import {expect} from 'chai';
+import {READERS} from '@natlibfi/fixura';
+import createReducer from './copy';
+import generateTests from '@natlibfi/fixugen';
+
+//import createDebugLogger from 'debug'; // <---
+//const debug = createDebugLogger('@natlibfi/marc-record-merge/copy.spec.js'); // <---
+
+generateTests({
+ callback,
+ path: [__dirname, '..', '..', 'test-fixtures', 'reducers', 'copy'],
+ useMetadataFile: true,
+ recurse: true,
+ fixura: {
+ reader: READERS.JSON,
+ failWhenNotFound: false
+ }
+});
+
+
+function callback({
+ getFixture,
+ tagPatternRegExp,
+ compareTagsOnly = false,
+ compareWithoutTag = false,
+ compareWithoutIndicators = false,
+ compareWithoutIndicator1 = false,
+ compareWithoutIndicator2 = false,
+ subfieldsMustBeIdentical = false,
+ copyUnless = undefined,
+ excludeSubfields = undefined,
+ dropSubfields = undefined,
+ swapSubfieldCode = [],
+ swapTag = [],
+ doNotCopyIfFieldPresent = false
+}) {
+ const base = getFixture('base.json');
+ const source = getFixture('source.json');
+ const tagPattern = new RegExp(tagPatternRegExp, 'u');
+ const expectedRecord = getFixture('merged.json');
+
+ const merged = createReducer({
+ tagPattern, compareTagsOnly, compareWithoutTag, compareWithoutIndicators, compareWithoutIndicator1, compareWithoutIndicator2,
+ copyUnless, subfieldsMustBeIdentical, excludeSubfields,
+ dropSubfields, swapSubfieldCode, swapTag,
+ doNotCopyIfFieldPresent
+ })({base, source});
+ //debug(`*** mergedRecord: `, mergedRecord); //<--
+ //debug(`*** mergedRecord,Strfy: `, JSON.stringify(mergedRecord)); //<--
+ //debug(`*** expectedRecord: `, expectedRecord); //<--
+ //debug(`*** expectedRecord,Strfy: `, JSON.stringify(expectedRecord)); //<--
+ expect(merged.constructor.name).not.to.eql('MarcRecord');
+ expect(merged.constructor.name).to.eql('Object');
+ expect(merged).to.eql(expectedRecord);
+}
diff --git a/src/reducers/index.js b/src/reducers/index.js
new file mode 100644
index 0000000..6e38865
--- /dev/null
+++ b/src/reducers/index.js
@@ -0,0 +1,4 @@
+import copy from './copy';
+import select, {strictEquality, subsetEquality} from './select';
+
+export default {copy, select, strictEquality, subsetEquality};
diff --git a/src/reducers/select.js b/src/reducers/select.js
new file mode 100644
index 0000000..6584c2b
--- /dev/null
+++ b/src/reducers/select.js
@@ -0,0 +1,131 @@
+import {normalizeSync} from 'normalize-diacritics';
+import createDebugLogger from 'debug';
+import {MarcRecord} from '@natlibfi/marc-record';
+
+export function strictEquality(subfieldA, subfieldB) {
+ return subfieldA.code === subfieldB.code &&
+ subfieldA.value === subfieldB.value;
+}
+
+export function subsetEquality(subfieldA, subfieldB) {
+ return subfieldA.code === subfieldB.code &&
+ (subfieldA.value.indexOf(subfieldB.value) !== -1 || subfieldB.value.indexOf(subfieldA.value) !== -1);
+}
+// EqualityFunction can be either strictEquality or subsetEquality
+
+export default ({
+ tagPattern,
+ equalityFunction = strictEquality,
+ baseValidators = {subfieldValues: false},
+ sourceValidators = {subfieldValues: false}
+// eslint-disable-next-line max-statements
+}) => (base, source) => {
+ const debug = createDebugLogger('@natlibfi/marc-record-merge:select');
+
+ const {baseRecord, sourceRecord} = getRecordsFromParameters(base, source, baseValidators, sourceValidators);
+
+ function getRecordsFromParameters(base, source, baseValidators, sourceValidators) {
+ // records if we got an object ({base, source}) as a parameter
+ if (source === undefined && base.base !== undefined && base.source !== undefined) {
+ const baseRecord = new MarcRecord(base.base, baseValidators);
+ const sourceRecord = new MarcRecord(base.source, sourceValidators);
+ return {baseRecord, sourceRecord};
+ }
+ // records if we got an non-object (base, source) as a parameter
+ const baseRecord = new MarcRecord(base, baseValidators);
+ const sourceRecord = new MarcRecord(source, sourceValidators);
+ return {baseRecord, sourceRecord};
+ }
+
+ const baseFields = baseRecord.get(tagPattern);
+ const sourceFields = sourceRecord.get(tagPattern);
+ const fieldTag = sourceFields.map(field => field.tag);
+ debug(`Comparing field ${fieldTag}`);
+
+ checkFieldType(baseFields);
+ checkFieldType(sourceFields);
+
+ if (baseFields.length > 1 || sourceFields.length > 1) {
+ debug(`Multiple fields in base or source`);
+ debug(`No changes to base`);
+ return baseRecord.toObject();
+ }
+ const [baseField] = baseFields;
+ const [sourceField] = sourceFields;
+
+ if (baseField.tag === sourceField.tag === false) {
+ debug(`Base tag ${baseField.tag} is not equal to source tag ${sourceField.tag}`);
+ debug(`No changes to base`);
+ return baseRecord.toObject();
+ }
+ const baseSubs = baseField.subfields;
+ const sourceSubs = sourceField.subfields;
+
+ const baseSubsNormalized = baseSubs
+ .map(({code, value}) => ({code, value: normalizeSubfieldValue(value)}));
+
+ const sourceSubsNormalized = sourceSubs
+ .map(({code, value}) => ({code, value: normalizeSubfieldValue(value)}));
+
+ // Returns the base subfields for which a matching source subfield is found
+ const equalSubfieldsBase = baseSubsNormalized
+ .filter(baseSubfield => sourceSubsNormalized
+ .some(sourceSubfield => equalityFunction(baseSubfield, sourceSubfield)));
+ debug(`equalSubfieldsBase: ${JSON.stringify(equalSubfieldsBase, undefined, 2)}`);
+
+ // Returns the source subfields for which a matching base subfield is found
+ const equalSubfieldsSource = sourceSubsNormalized
+ .filter(sourceSubfield => baseSubsNormalized
+ .some(baseSubfield => equalityFunction(sourceSubfield, baseSubfield)));
+ debug(`equalSubfieldsSource: ${JSON.stringify(equalSubfieldsSource, undefined, 2)}`);
+
+ if (baseSubs.length === sourceSubs.length && equalSubfieldsBase.length < baseSubs.length) {
+ debug(`Base and source subfields are not equal`);
+ debug(`No changes to base`);
+ return baseRecord.toObject();
+ }
+
+ if (baseSubs.length === sourceSubs.length && equalSubfieldsBase.length === equalSubfieldsSource.length) {
+ debug(`Checking subfield equality`);
+ const totalSubfieldLengthBase = baseSubsNormalized
+ .map(({value}) => value.length)
+ .reduce((acc, value) => acc + value);
+ const totalSubfieldLengthSource = sourceSubsNormalized
+ .map(({value}) => value.length)
+ .reduce((acc, value) => acc + value);
+
+ if (totalSubfieldLengthSource > totalSubfieldLengthBase) {
+ return replaceBasefieldWithSourcefield(baseRecord.toObject());
+ }
+ }
+
+ if (sourceSubs.length > baseSubs.length && equalSubfieldsBase.length === baseSubs.length) {
+ return replaceBasefieldWithSourcefield(baseRecord.toObject());
+ }
+
+ debug(`No changes to base`);
+ return baseRecord.toObject();
+
+ function replaceBasefieldWithSourcefield(base) {
+ const index = base.fields.findIndex(field => field === baseField);
+ base.fields.splice(index, 1, sourceField); // eslint-disable-line functional/immutable-data
+ debug(`Source field is longer, replacing base with source`);
+ return base;
+ }
+
+ function checkFieldType(fields) {
+ const checkedFields = fields.map(field => {
+ if ('value' in field) { // eslint-disable-line functional/no-conditional-statements
+ throw new Error('Invalid control field, expected data field');
+ }
+ return field;
+ });
+ return checkedFields;
+ }
+
+ function normalizeSubfieldValue(value) {
+ // Regexp options: g: global search, u: unicode
+ const punctuation = /[.,\-/#!?$%^&*;:{}=_`~()[\]]/gu;
+ return normalizeSync(value).toLowerCase().replace(punctuation, '', 'u').replace(/\s+/gu, ' ').trim();
+ }
+};
diff --git a/src/reducers/select.spec.js b/src/reducers/select.spec.js
new file mode 100644
index 0000000..5110546
--- /dev/null
+++ b/src/reducers/select.spec.js
@@ -0,0 +1,49 @@
+import {expect} from 'chai';
+import {MarcRecord} from '@natlibfi/marc-record';
+import createReducer, {subsetEquality} from './select';
+import {READERS} from '@natlibfi/fixura';
+import generateTests from '@natlibfi/fixugen';
+
+MarcRecord.setValidationOptions({subfieldValues: false});
+
+generateTests({
+ callback,
+ path: [__dirname, '..', '..', 'test-fixtures', 'reducers', 'select'],
+ useMetadataFile: true,
+ recurse: false,
+ fixura: {
+ reader: READERS.JSON,
+ failWhenNotFound: false
+ }
+});
+
+function callback({
+ getFixture,
+ disabled = false,
+ tagPatternRegExp = false,
+ expectedError = false,
+ useSubsetEquality = false
+}) {
+ if (disabled) {
+ console.log('TEST DISABLED!'); // eslint-disable-line no-console
+ return;
+ }
+ // const base = new MarcRecord(getFixture('base.json'), {subfieldValues: false});
+ // const source = new MarcRecord(getFixture('source.json'), {subfieldValues: false});
+
+ const base = getFixture('base.json');
+ const source = getFixture('source.json');
+
+ const tagPattern = new RegExp(tagPatternRegExp, 'u');
+ const expectedRecord = getFixture('merged.json');
+ const equalityFunction = useSubsetEquality ? subsetEquality : undefined;
+
+ // Bypass expected error in testing
+ if (expectedError) {
+ expect(() => createReducer.to.throw(Error, 'control field'));
+ return;
+ }
+
+ const mergedRecord = createReducer({tagPattern, equalityFunction})(base, source);
+ expect(mergedRecord).to.eql(expectedRecord);
+}
diff --git a/src/reducers/select2.spec.js b/src/reducers/select2.spec.js
new file mode 100644
index 0000000..4f1341a
--- /dev/null
+++ b/src/reducers/select2.spec.js
@@ -0,0 +1,49 @@
+import {expect} from 'chai';
+import {MarcRecord} from '@natlibfi/marc-record';
+import createReducer, {subsetEquality} from './select';
+import {READERS} from '@natlibfi/fixura';
+import generateTests from '@natlibfi/fixugen';
+
+MarcRecord.setValidationOptions({subfieldValues: false});
+
+generateTests({
+ callback,
+ path: [__dirname, '..', '..', 'test-fixtures', 'reducers', 'select'],
+ useMetadataFile: true,
+ recurse: false,
+ fixura: {
+ reader: READERS.JSON,
+ failWhenNotFound: false
+ }
+});
+
+function callback({
+ getFixture,
+ disabled = false,
+ tagPatternRegExp = false,
+ expectedError = false,
+ useSubsetEquality = false
+}) {
+ if (disabled) {
+ console.log('TEST DISABLED!'); // eslint-disable-line no-console
+ return;
+ }
+ // const base = new MarcRecord(getFixture('base.json'), {subfieldValues: false});
+ // const source = new MarcRecord(getFixture('source.json'), {subfieldValues: false});
+
+ const base = getFixture('base.json');
+ const source = getFixture('source.json');
+
+ const tagPattern = new RegExp(tagPatternRegExp, 'u');
+ const expectedRecord = getFixture('merged.json');
+ const equalityFunction = useSubsetEquality ? subsetEquality : undefined;
+
+ // Bypass expected error in testing
+ if (expectedError) {
+ expect(() => createReducer.to.throw(Error, 'control field'));
+ return;
+ }
+
+ const mergedRecord = createReducer({tagPattern, equalityFunction})({base, source});
+ expect(mergedRecord).to.eql(expectedRecord);
+}
diff --git a/test-fixtures/index/01/base.json b/test-fixtures/index/01/base.json
new file mode 100644
index 0000000..f883033
--- /dev/null
+++ b/test-fixtures/index/01/base.json
@@ -0,0 +1,24 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "001_base"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "010a_base"
+ },
+ {
+ "code": "b",
+ "value": "010b_base"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/index/01/merged.json b/test-fixtures/index/01/merged.json
new file mode 100644
index 0000000..f883033
--- /dev/null
+++ b/test-fixtures/index/01/merged.json
@@ -0,0 +1,24 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "001_base"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "010a_base"
+ },
+ {
+ "code": "b",
+ "value": "010b_base"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/index/01/metadata.json b/test-fixtures/index/01/metadata.json
new file mode 100644
index 0000000..c501cdd
--- /dev/null
+++ b/test-fixtures/index/01/metadata.json
@@ -0,0 +1,8 @@
+{
+ "description":"Reducers should run after each another - two reducers",
+ "reducerConfigs": [
+ {"tagPattern": "/010/u", "compareTagsOnly": true},
+ {"tagPattern": "/33./u"}
+
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/index/01/source.json b/test-fixtures/index/01/source.json
new file mode 100644
index 0000000..eb19deb
--- /dev/null
+++ b/test-fixtures/index/01/source.json
@@ -0,0 +1,40 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "001_sorsa"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "010a_sorsa"
+ },
+ {
+ "code": "b",
+ "value": "010b_sorsa"
+ }
+ ]
+ },
+ {
+ "tag": "650",
+ "ind1": " ",
+ "ind2": "7",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "poista mut"
+ },
+ {
+ "code": "2",
+ "value": "ysa"
+ }
+ ]
+ }
+
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/index/02/base.json b/test-fixtures/index/02/base.json
new file mode 100644
index 0000000..f883033
--- /dev/null
+++ b/test-fixtures/index/02/base.json
@@ -0,0 +1,24 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "001_base"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "010a_base"
+ },
+ {
+ "code": "b",
+ "value": "010b_base"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/index/02/merged.json b/test-fixtures/index/02/merged.json
new file mode 100644
index 0000000..f883033
--- /dev/null
+++ b/test-fixtures/index/02/merged.json
@@ -0,0 +1,24 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "001_base"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "010a_base"
+ },
+ {
+ "code": "b",
+ "value": "010b_base"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/index/02/metadata.json b/test-fixtures/index/02/metadata.json
new file mode 100644
index 0000000..4809906
--- /dev/null
+++ b/test-fixtures/index/02/metadata.json
@@ -0,0 +1,7 @@
+{
+ "description":"Reducers should run after each another - single reducer",
+ "reducerConfigs": [
+ {"tagPattern": "/33./u"}
+ ],
+ "skip": false
+}
\ No newline at end of file
diff --git a/test-fixtures/index/02/source.json b/test-fixtures/index/02/source.json
new file mode 100644
index 0000000..eb19deb
--- /dev/null
+++ b/test-fixtures/index/02/source.json
@@ -0,0 +1,40 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "001_sorsa"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "010a_sorsa"
+ },
+ {
+ "code": "b",
+ "value": "010b_sorsa"
+ }
+ ]
+ },
+ {
+ "tag": "650",
+ "ind1": " ",
+ "ind2": "7",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "poista mut"
+ },
+ {
+ "code": "2",
+ "value": "ysa"
+ }
+ ]
+ }
+
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/01 - copy/01/base.json b/test-fixtures/reducers/copy/01 - copy/01/base.json
new file mode 100644
index 0000000..348982c
--- /dev/null
+++ b/test-fixtures/reducers/copy/01 - copy/01/base.json
@@ -0,0 +1,9 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/01 - copy/01/merged.json b/test-fixtures/reducers/copy/01 - copy/01/merged.json
new file mode 100644
index 0000000..cdf41c8
--- /dev/null
+++ b/test-fixtures/reducers/copy/01 - copy/01/merged.json
@@ -0,0 +1,20 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "##2002021346"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/01 - copy/01/metadata.json b/test-fixtures/reducers/copy/01 - copy/01/metadata.json
new file mode 100644
index 0000000..3f5197e
--- /dev/null
+++ b/test-fixtures/reducers/copy/01 - copy/01/metadata.json
@@ -0,0 +1,4 @@
+{
+ "description": "If base does not contain the field at all, it is copied from source to base",
+ "tagPatternRegExp": "^010$"
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/01 - copy/01/source.json b/test-fixtures/reducers/copy/01 - copy/01/source.json
new file mode 100644
index 0000000..a803cf7
--- /dev/null
+++ b/test-fixtures/reducers/copy/01 - copy/01/source.json
@@ -0,0 +1,20 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "##2002021346"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/01 - copy/02/base.json b/test-fixtures/reducers/copy/01 - copy/02/base.json
new file mode 100644
index 0000000..a803cf7
--- /dev/null
+++ b/test-fixtures/reducers/copy/01 - copy/02/base.json
@@ -0,0 +1,20 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "##2002021346"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/01 - copy/02/merged.json b/test-fixtures/reducers/copy/01 - copy/02/merged.json
new file mode 100644
index 0000000..cdf41c8
--- /dev/null
+++ b/test-fixtures/reducers/copy/01 - copy/02/merged.json
@@ -0,0 +1,20 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "##2002021346"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/01 - copy/02/metadata.json b/test-fixtures/reducers/copy/01 - copy/02/metadata.json
new file mode 100644
index 0000000..1ebc320
--- /dev/null
+++ b/test-fixtures/reducers/copy/01 - copy/02/metadata.json
@@ -0,0 +1,4 @@
+{
+ "description": "Identical control fields are not copied",
+ "tagPatternRegExp": "^001$"
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/01 - copy/02/source.json b/test-fixtures/reducers/copy/01 - copy/02/source.json
new file mode 100644
index 0000000..a803cf7
--- /dev/null
+++ b/test-fixtures/reducers/copy/01 - copy/02/source.json
@@ -0,0 +1,20 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "##2002021346"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/01 - copy/03/base.json b/test-fixtures/reducers/copy/01 - copy/03/base.json
new file mode 100644
index 0000000..a803cf7
--- /dev/null
+++ b/test-fixtures/reducers/copy/01 - copy/03/base.json
@@ -0,0 +1,20 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "##2002021346"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/01 - copy/03/merged.json b/test-fixtures/reducers/copy/01 - copy/03/merged.json
new file mode 100644
index 0000000..e7b0a35
--- /dev/null
+++ b/test-fixtures/reducers/copy/01 - copy/03/merged.json
@@ -0,0 +1,28 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "001",
+ "value": "007346735"
+ },
+ {
+ "tag": "001",
+ "value": "007346736"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "##2002021346"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/01 - copy/03/metadata.json b/test-fixtures/reducers/copy/01 - copy/03/metadata.json
new file mode 100644
index 0000000..2b7c89b
--- /dev/null
+++ b/test-fixtures/reducers/copy/01 - copy/03/metadata.json
@@ -0,0 +1,4 @@
+{
+ "description": "Add missing control field to base",
+ "tagPatternRegExp": "^001$"
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/01 - copy/03/source.json b/test-fixtures/reducers/copy/01 - copy/03/source.json
new file mode 100644
index 0000000..319864d
--- /dev/null
+++ b/test-fixtures/reducers/copy/01 - copy/03/source.json
@@ -0,0 +1,24 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346735"
+ },
+ {
+ "tag": "001",
+ "value": "007346736"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "##2002021346"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/01 - copy/04/base.json b/test-fixtures/reducers/copy/01 - copy/04/base.json
new file mode 100644
index 0000000..0fcda80
--- /dev/null
+++ b/test-fixtures/reducers/copy/01 - copy/04/base.json
@@ -0,0 +1,39 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "##2002021346"
+ },
+ {
+ "code": "b",
+ "value": "##2002021356"
+ }
+ ]
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "c",
+ "value": "##2002021347"
+ },
+ {
+ "code": "d",
+ "value": "##2002021357"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/01 - copy/04/merged.json b/test-fixtures/reducers/copy/01 - copy/04/merged.json
new file mode 100644
index 0000000..0fcda80
--- /dev/null
+++ b/test-fixtures/reducers/copy/01 - copy/04/merged.json
@@ -0,0 +1,39 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "##2002021346"
+ },
+ {
+ "code": "b",
+ "value": "##2002021356"
+ }
+ ]
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "c",
+ "value": "##2002021347"
+ },
+ {
+ "code": "d",
+ "value": "##2002021357"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/01 - copy/04/metadata.json b/test-fixtures/reducers/copy/01 - copy/04/metadata.json
new file mode 100644
index 0000000..86541d6
--- /dev/null
+++ b/test-fixtures/reducers/copy/01 - copy/04/metadata.json
@@ -0,0 +1,4 @@
+{
+ "description": "Identical data fields in base and source, not copied",
+ "tagPatternRegExp": "^010$"
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/01 - copy/04/source.json b/test-fixtures/reducers/copy/01 - copy/04/source.json
new file mode 100644
index 0000000..0fcda80
--- /dev/null
+++ b/test-fixtures/reducers/copy/01 - copy/04/source.json
@@ -0,0 +1,39 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "##2002021346"
+ },
+ {
+ "code": "b",
+ "value": "##2002021356"
+ }
+ ]
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "c",
+ "value": "##2002021347"
+ },
+ {
+ "code": "d",
+ "value": "##2002021357"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/01 - copy/05/base.json b/test-fixtures/reducers/copy/01 - copy/05/base.json
new file mode 100644
index 0000000..0fcda80
--- /dev/null
+++ b/test-fixtures/reducers/copy/01 - copy/05/base.json
@@ -0,0 +1,39 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "##2002021346"
+ },
+ {
+ "code": "b",
+ "value": "##2002021356"
+ }
+ ]
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "c",
+ "value": "##2002021347"
+ },
+ {
+ "code": "d",
+ "value": "##2002021357"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/01 - copy/05/merged.json b/test-fixtures/reducers/copy/01 - copy/05/merged.json
new file mode 100644
index 0000000..b37b4b0
--- /dev/null
+++ b/test-fixtures/reducers/copy/01 - copy/05/merged.json
@@ -0,0 +1,77 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "##2002021346"
+ },
+ {
+ "code": "b",
+ "value": "##2002021356"
+ }
+ ]
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "c",
+ "value": "##2002021347"
+ },
+ {
+ "code": "d",
+ "value": "##2002021357"
+ }
+ ]
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "c",
+ "value": "##2002021348"
+ },
+ {
+ "code": "d",
+ "value": "##2002021358"
+ },
+ {
+ "code": "e",
+ "value": "##2002021359"
+ }
+ ]
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "f",
+ "value": "##2002021311"
+ },
+ {
+ "code": "g",
+ "value": "##2002021322"
+ },
+ {
+ "code": "h",
+ "value": "##2002021333"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/01 - copy/05/metadata.json b/test-fixtures/reducers/copy/01 - copy/05/metadata.json
new file mode 100644
index 0000000..b5bb2de
--- /dev/null
+++ b/test-fixtures/reducers/copy/01 - copy/05/metadata.json
@@ -0,0 +1,4 @@
+{
+ "description": "Different data fields are copied from source to base (multiple fields)",
+ "tagPatternRegExp": "^010$"
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/01 - copy/05/source.json b/test-fixtures/reducers/copy/01 - copy/05/source.json
new file mode 100644
index 0000000..2f30a5b
--- /dev/null
+++ b/test-fixtures/reducers/copy/01 - copy/05/source.json
@@ -0,0 +1,62 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "##2002021346"
+ },
+ {
+ "code": "b",
+ "value": "##2002021356"
+ }
+ ]
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "c",
+ "value": "##2002021348"
+ },
+ {
+ "code": "d",
+ "value": "##2002021358"
+ },
+ {
+ "code": "e",
+ "value": "##2002021359"
+ }
+ ]
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "f",
+ "value": "##2002021311"
+ },
+ {
+ "code": "g",
+ "value": "##2002021322"
+ },
+ {
+ "code": "h",
+ "value": "##2002021333"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/01 - copy/06/base.json b/test-fixtures/reducers/copy/01 - copy/06/base.json
new file mode 100644
index 0000000..7acc745
--- /dev/null
+++ b/test-fixtures/reducers/copy/01 - copy/06/base.json
@@ -0,0 +1,24 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "##2002021346"
+ },
+ {
+ "code": "b",
+ "value": "##2002021356"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/01 - copy/06/merged.json b/test-fixtures/reducers/copy/01 - copy/06/merged.json
new file mode 100644
index 0000000..707a912
--- /dev/null
+++ b/test-fixtures/reducers/copy/01 - copy/06/merged.json
@@ -0,0 +1,39 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "##2002021346"
+ },
+ {
+ "code": "b",
+ "value": "##2002021356"
+ }
+ ]
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": "1",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "##2002021346"
+ },
+ {
+ "code": "b",
+ "value": "##2002021356"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/01 - copy/06/metadata.json b/test-fixtures/reducers/copy/01 - copy/06/metadata.json
new file mode 100644
index 0000000..9d1df16
--- /dev/null
+++ b/test-fixtures/reducers/copy/01 - copy/06/metadata.json
@@ -0,0 +1,4 @@
+{
+ "description": "Different data fields are copied from source to base (Ind2 diff)",
+ "tagPatternRegExp": "^010$"
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/01 - copy/06/source.json b/test-fixtures/reducers/copy/01 - copy/06/source.json
new file mode 100644
index 0000000..b37c956
--- /dev/null
+++ b/test-fixtures/reducers/copy/01 - copy/06/source.json
@@ -0,0 +1,24 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": "1",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "##2002021346"
+ },
+ {
+ "code": "b",
+ "value": "##2002021356"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/01 - copy/07/base.json b/test-fixtures/reducers/copy/01 - copy/07/base.json
new file mode 100644
index 0000000..707a912
--- /dev/null
+++ b/test-fixtures/reducers/copy/01 - copy/07/base.json
@@ -0,0 +1,39 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "##2002021346"
+ },
+ {
+ "code": "b",
+ "value": "##2002021356"
+ }
+ ]
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": "1",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "##2002021346"
+ },
+ {
+ "code": "b",
+ "value": "##2002021356"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/01 - copy/07/merged.json b/test-fixtures/reducers/copy/01 - copy/07/merged.json
new file mode 100644
index 0000000..707a912
--- /dev/null
+++ b/test-fixtures/reducers/copy/01 - copy/07/merged.json
@@ -0,0 +1,39 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "##2002021346"
+ },
+ {
+ "code": "b",
+ "value": "##2002021356"
+ }
+ ]
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": "1",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "##2002021346"
+ },
+ {
+ "code": "b",
+ "value": "##2002021356"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/01 - copy/07/metadata.json b/test-fixtures/reducers/copy/01 - copy/07/metadata.json
new file mode 100644
index 0000000..43ce0ab
--- /dev/null
+++ b/test-fixtures/reducers/copy/01 - copy/07/metadata.json
@@ -0,0 +1,5 @@
+{
+ "description": "Different data fields are copied from source to base (Ind2 diff, multiple fields in base)",
+ "tagPatternRegExp": "^010$",
+ "only": false
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/01 - copy/07/source.json b/test-fixtures/reducers/copy/01 - copy/07/source.json
new file mode 100644
index 0000000..b37c956
--- /dev/null
+++ b/test-fixtures/reducers/copy/01 - copy/07/source.json
@@ -0,0 +1,24 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": "1",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "##2002021346"
+ },
+ {
+ "code": "b",
+ "value": "##2002021356"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/01 - copy/08/base.json b/test-fixtures/reducers/copy/01 - copy/08/base.json
new file mode 100644
index 0000000..0eb9cea
--- /dev/null
+++ b/test-fixtures/reducers/copy/01 - copy/08/base.json
@@ -0,0 +1,28 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "007",
+ "value": "ou"
+ },
+ {
+ "tag": "007",
+ "value": "vf^cbaho|"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "##2002021346"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/01 - copy/08/merged.json b/test-fixtures/reducers/copy/01 - copy/08/merged.json
new file mode 100644
index 0000000..11010ee
--- /dev/null
+++ b/test-fixtures/reducers/copy/01 - copy/08/merged.json
@@ -0,0 +1,28 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "007",
+ "value": "ou"
+ },
+ {
+ "tag": "007",
+ "value": "vf^cbaho|"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "##2002021346"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/01 - copy/08/metadata.json b/test-fixtures/reducers/copy/01 - copy/08/metadata.json
new file mode 100644
index 0000000..f7a85e3
--- /dev/null
+++ b/test-fixtures/reducers/copy/01 - copy/08/metadata.json
@@ -0,0 +1,4 @@
+{
+ "description": "Identical control fields are not copied (multiple fields)",
+ "tagPatternRegExp": "^007$"
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/01 - copy/08/source.json b/test-fixtures/reducers/copy/01 - copy/08/source.json
new file mode 100644
index 0000000..1e96286
--- /dev/null
+++ b/test-fixtures/reducers/copy/01 - copy/08/source.json
@@ -0,0 +1,24 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "007",
+ "value": "vf^cbaho|"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "##2002021346"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/02 - doNotCopyIfFieldPresent/01/base.json b/test-fixtures/reducers/copy/02 - doNotCopyIfFieldPresent/01/base.json
new file mode 100644
index 0000000..c0c00ed
--- /dev/null
+++ b/test-fixtures/reducers/copy/02 - doNotCopyIfFieldPresent/01/base.json
@@ -0,0 +1,17 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "100",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {"code": "a", "value": "test"}
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/02 - doNotCopyIfFieldPresent/01/merged.json b/test-fixtures/reducers/copy/02 - doNotCopyIfFieldPresent/01/merged.json
new file mode 100644
index 0000000..e14d5ec
--- /dev/null
+++ b/test-fixtures/reducers/copy/02 - doNotCopyIfFieldPresent/01/merged.json
@@ -0,0 +1,20 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "100",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "test"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/02 - doNotCopyIfFieldPresent/01/metadata.json b/test-fixtures/reducers/copy/02 - doNotCopyIfFieldPresent/01/metadata.json
new file mode 100644
index 0000000..c399a89
--- /dev/null
+++ b/test-fixtures/reducers/copy/02 - doNotCopyIfFieldPresent/01/metadata.json
@@ -0,0 +1,6 @@
+{
+ "description": "Copy field 010 if f100 not present: f100 present",
+ "tagPatternRegExp": "^010$",
+ "doNotCopyIfFieldPresent": "^100$",
+ "only": false
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/02 - doNotCopyIfFieldPresent/01/source.json b/test-fixtures/reducers/copy/02 - doNotCopyIfFieldPresent/01/source.json
new file mode 100644
index 0000000..a803cf7
--- /dev/null
+++ b/test-fixtures/reducers/copy/02 - doNotCopyIfFieldPresent/01/source.json
@@ -0,0 +1,20 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "##2002021346"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/02 - doNotCopyIfFieldPresent/02/base.json b/test-fixtures/reducers/copy/02 - doNotCopyIfFieldPresent/02/base.json
new file mode 100644
index 0000000..348982c
--- /dev/null
+++ b/test-fixtures/reducers/copy/02 - doNotCopyIfFieldPresent/02/base.json
@@ -0,0 +1,9 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/02 - doNotCopyIfFieldPresent/02/merged.json b/test-fixtures/reducers/copy/02 - doNotCopyIfFieldPresent/02/merged.json
new file mode 100644
index 0000000..cdf41c8
--- /dev/null
+++ b/test-fixtures/reducers/copy/02 - doNotCopyIfFieldPresent/02/merged.json
@@ -0,0 +1,20 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "##2002021346"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/02 - doNotCopyIfFieldPresent/02/metadata.json b/test-fixtures/reducers/copy/02 - doNotCopyIfFieldPresent/02/metadata.json
new file mode 100644
index 0000000..47301a4
--- /dev/null
+++ b/test-fixtures/reducers/copy/02 - doNotCopyIfFieldPresent/02/metadata.json
@@ -0,0 +1,6 @@
+{
+ "description": "Copy field 010 if f100 not present: f100 not present",
+ "tagPatternRegExp": "^010$",
+ "doNotCopyIfFieldPresent": "^100$",
+ "only": false
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/02 - doNotCopyIfFieldPresent/02/source.json b/test-fixtures/reducers/copy/02 - doNotCopyIfFieldPresent/02/source.json
new file mode 100644
index 0000000..a803cf7
--- /dev/null
+++ b/test-fixtures/reducers/copy/02 - doNotCopyIfFieldPresent/02/source.json
@@ -0,0 +1,20 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "##2002021346"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/03 - compareTagsOnly/01/base.json b/test-fixtures/reducers/copy/03 - compareTagsOnly/01/base.json
new file mode 100644
index 0000000..1b9a0cd
--- /dev/null
+++ b/test-fixtures/reducers/copy/03 - compareTagsOnly/01/base.json
@@ -0,0 +1,24 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "018",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "##2002021346"
+ },
+ {
+ "code": "b",
+ "value": "##2002021356"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/03 - compareTagsOnly/01/merged.json b/test-fixtures/reducers/copy/03 - compareTagsOnly/01/merged.json
new file mode 100644
index 0000000..1b9a0cd
--- /dev/null
+++ b/test-fixtures/reducers/copy/03 - compareTagsOnly/01/merged.json
@@ -0,0 +1,24 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "018",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "##2002021346"
+ },
+ {
+ "code": "b",
+ "value": "##2002021356"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/03 - compareTagsOnly/01/metadata.json b/test-fixtures/reducers/copy/03 - compareTagsOnly/01/metadata.json
new file mode 100644
index 0000000..cfc5735
--- /dev/null
+++ b/test-fixtures/reducers/copy/03 - compareTagsOnly/01/metadata.json
@@ -0,0 +1,5 @@
+{
+ "description": "Field is copied from source only if it is missing in base, a different instance is not copied",
+ "tagPatternRegExp": "^018$",
+ "compareTagsOnly": true
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/03 - compareTagsOnly/01/source.json b/test-fixtures/reducers/copy/03 - compareTagsOnly/01/source.json
new file mode 100644
index 0000000..6000312
--- /dev/null
+++ b/test-fixtures/reducers/copy/03 - compareTagsOnly/01/source.json
@@ -0,0 +1,24 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "018",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "c",
+ "value": "##2002021348"
+ },
+ {
+ "code": "d",
+ "value": "##2002021358"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/03 - compareTagsOnly/02/base.json b/test-fixtures/reducers/copy/03 - compareTagsOnly/02/base.json
new file mode 100644
index 0000000..b90bae6
--- /dev/null
+++ b/test-fixtures/reducers/copy/03 - compareTagsOnly/02/base.json
@@ -0,0 +1,24 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "010a_base"
+ },
+ {
+ "code": "b",
+ "value": "010b_base"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/03 - compareTagsOnly/02/merged.json b/test-fixtures/reducers/copy/03 - compareTagsOnly/02/merged.json
new file mode 100644
index 0000000..ad75a85
--- /dev/null
+++ b/test-fixtures/reducers/copy/03 - compareTagsOnly/02/merged.json
@@ -0,0 +1,100 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "010a_base"
+ },
+ {
+ "code": "b",
+ "value": "010b_base"
+ }
+ ]
+ },
+ {
+ "tag": "260",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "[Åbo] :"
+ },
+ {
+ "code": "b",
+ "value": "[Åbo akademi],"
+ },
+ {
+ "code": "c",
+ "value": "1985."
+ }
+ ]
+ },
+ {
+ "tag": "260",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "Västerås :"
+ },
+ {
+ "code": "b",
+ "value": "Byggpaul,"
+ },
+ {
+ "code": "c",
+ "value": "cop. 1985."
+ }
+ ]
+ },
+ {
+ "tag": "264",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "[Stockholm] :"
+ },
+ {
+ "code": "b",
+ "value": "Rabén & Sjögren,"
+ },
+ {
+ "code": "c",
+ "value": "1982."
+ }
+ ]
+ },
+ {
+ "tag": "264",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "Hki :"
+ },
+ {
+ "code": "b",
+ "value": "Maanmittaushallitus :"
+ },
+ {
+ "code": "c",
+ "value": "1988."
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/03 - compareTagsOnly/02/metadata.json b/test-fixtures/reducers/copy/03 - compareTagsOnly/02/metadata.json
new file mode 100644
index 0000000..d942ce4
--- /dev/null
+++ b/test-fixtures/reducers/copy/03 - compareTagsOnly/02/metadata.json
@@ -0,0 +1,5 @@
+{
+ "description": "for repeatable fields, 2x each 260/264",
+ "tagPatternRegExp": "^(260|264)$",
+ "compareTagsOnly": true
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/03 - compareTagsOnly/02/source.json b/test-fixtures/reducers/copy/03 - compareTagsOnly/02/source.json
new file mode 100644
index 0000000..60a5a73
--- /dev/null
+++ b/test-fixtures/reducers/copy/03 - compareTagsOnly/02/source.json
@@ -0,0 +1,100 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "010a_source"
+ },
+ {
+ "code": "b",
+ "value": "010b_source"
+ }
+ ]
+ },
+ {
+ "tag": "260",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "[Åbo] :"
+ },
+ {
+ "code": "b",
+ "value": "[Åbo akademi],"
+ },
+ {
+ "code": "c",
+ "value": "1985."
+ }
+ ]
+ },
+ {
+ "tag": "260",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "Västerås :"
+ },
+ {
+ "code": "b",
+ "value": "Byggpaul,"
+ },
+ {
+ "code": "c",
+ "value": "cop. 1985."
+ }
+ ]
+ },
+ {
+ "tag": "264",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "[Stockholm] :"
+ },
+ {
+ "code": "b",
+ "value": "Rabén & Sjögren,"
+ },
+ {
+ "code": "c",
+ "value": "1982."
+ }
+ ]
+ },
+ {
+ "tag": "264",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "Hki :"
+ },
+ {
+ "code": "b",
+ "value": "Maanmittaushallitus :"
+ },
+ {
+ "code": "c",
+ "value": "1988."
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/04 - compareWithoutIndicators/01/base.json b/test-fixtures/reducers/copy/04 - compareWithoutIndicators/01/base.json
new file mode 100644
index 0000000..878c664
--- /dev/null
+++ b/test-fixtures/reducers/copy/04 - compareWithoutIndicators/01/base.json
@@ -0,0 +1,24 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "foo"
+ },
+ {
+ "code": "b",
+ "value": "bar"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/04 - compareWithoutIndicators/01/merged.json b/test-fixtures/reducers/copy/04 - compareWithoutIndicators/01/merged.json
new file mode 100644
index 0000000..878c664
--- /dev/null
+++ b/test-fixtures/reducers/copy/04 - compareWithoutIndicators/01/merged.json
@@ -0,0 +1,24 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "foo"
+ },
+ {
+ "code": "b",
+ "value": "bar"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/04 - compareWithoutIndicators/01/metadata.json b/test-fixtures/reducers/copy/04 - compareWithoutIndicators/01/metadata.json
new file mode 100644
index 0000000..0586fe5
--- /dev/null
+++ b/test-fixtures/reducers/copy/04 - compareWithoutIndicators/01/metadata.json
@@ -0,0 +1,5 @@
+{
+ "description": "Copy fields 010 compare without indicators - same field no copy",
+ "tagPatternRegExp": "^010$",
+ "compareWithoutIndicators": true
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/04 - compareWithoutIndicators/01/source.json b/test-fixtures/reducers/copy/04 - compareWithoutIndicators/01/source.json
new file mode 100644
index 0000000..e6221d8
--- /dev/null
+++ b/test-fixtures/reducers/copy/04 - compareWithoutIndicators/01/source.json
@@ -0,0 +1,24 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": "1",
+ "ind2": "2",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "foo"
+ },
+ {
+ "code": "b",
+ "value": "bar"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/04 - compareWithoutIndicators/02/base.json b/test-fixtures/reducers/copy/04 - compareWithoutIndicators/02/base.json
new file mode 100644
index 0000000..b7d9182
--- /dev/null
+++ b/test-fixtures/reducers/copy/04 - compareWithoutIndicators/02/base.json
@@ -0,0 +1,24 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": "1",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "foo"
+ },
+ {
+ "code": "b",
+ "value": "bar"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/04 - compareWithoutIndicators/02/merged.json b/test-fixtures/reducers/copy/04 - compareWithoutIndicators/02/merged.json
new file mode 100644
index 0000000..dcc6ec3
--- /dev/null
+++ b/test-fixtures/reducers/copy/04 - compareWithoutIndicators/02/merged.json
@@ -0,0 +1,39 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": "1",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "foo"
+ },
+ {
+ "code": "b",
+ "value": "bar"
+ }
+ ]
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": "2",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "foo"
+ },
+ {
+ "code": "b",
+ "value": "bar"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/04 - compareWithoutIndicators/02/metadata.json b/test-fixtures/reducers/copy/04 - compareWithoutIndicators/02/metadata.json
new file mode 100644
index 0000000..e1c560b
--- /dev/null
+++ b/test-fixtures/reducers/copy/04 - compareWithoutIndicators/02/metadata.json
@@ -0,0 +1,5 @@
+{
+ "description": "Copy fields 010 compare with indicators - different field copy",
+ "tagPatternRegExp": "^010$",
+ "compareWithoutIndicators": false
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/04 - compareWithoutIndicators/02/source.json b/test-fixtures/reducers/copy/04 - compareWithoutIndicators/02/source.json
new file mode 100644
index 0000000..3193b70
--- /dev/null
+++ b/test-fixtures/reducers/copy/04 - compareWithoutIndicators/02/source.json
@@ -0,0 +1,24 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": "2",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "foo"
+ },
+ {
+ "code": "b",
+ "value": "bar"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/04 - compareWithoutIndicators/03/metadata.json b/test-fixtures/reducers/copy/04 - compareWithoutIndicators/03/metadata.json
new file mode 100644
index 0000000..b7c69d2
--- /dev/null
+++ b/test-fixtures/reducers/copy/04 - compareWithoutIndicators/03/metadata.json
@@ -0,0 +1,6 @@
+{
+ "description": "Copy fields 730: omit ind 1 from comparison - same field no copy",
+ "tagPatternRegExp": "^730$",
+ "compareWithoutIndicator1": true,
+ "skip": true
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/04 - compareWithoutIndicators/04/base.json b/test-fixtures/reducers/copy/04 - compareWithoutIndicators/04/base.json
new file mode 100644
index 0000000..1c4ec8d
--- /dev/null
+++ b/test-fixtures/reducers/copy/04 - compareWithoutIndicators/04/base.json
@@ -0,0 +1,20 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "730",
+ "ind1": "4",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "The End"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/04 - compareWithoutIndicators/04/merged.json b/test-fixtures/reducers/copy/04 - compareWithoutIndicators/04/merged.json
new file mode 100644
index 0000000..824fcea
--- /dev/null
+++ b/test-fixtures/reducers/copy/04 - compareWithoutIndicators/04/merged.json
@@ -0,0 +1,31 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "730",
+ "ind1": "4",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "The End"
+ }
+ ]
+ },
+ {
+ "tag": "730",
+ "ind1": "0",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "The End"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/04 - compareWithoutIndicators/04/metadata.json b/test-fixtures/reducers/copy/04 - compareWithoutIndicators/04/metadata.json
new file mode 100644
index 0000000..f4aeaef
--- /dev/null
+++ b/test-fixtures/reducers/copy/04 - compareWithoutIndicators/04/metadata.json
@@ -0,0 +1,5 @@
+{
+ "description": "Copy fields 730: omit ind 2 from comparison - different field -> copy",
+ "tagPatternRegExp": "^730$",
+ "compareWithoutIndicator2foo": true
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/04 - compareWithoutIndicators/04/source.json b/test-fixtures/reducers/copy/04 - compareWithoutIndicators/04/source.json
new file mode 100644
index 0000000..b663934
--- /dev/null
+++ b/test-fixtures/reducers/copy/04 - compareWithoutIndicators/04/source.json
@@ -0,0 +1,20 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "730",
+ "ind1": "0",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "The End"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/05 - copyUnless/01/base.json b/test-fixtures/reducers/copy/05 - copyUnless/01/base.json
new file mode 100644
index 0000000..348982c
--- /dev/null
+++ b/test-fixtures/reducers/copy/05 - copyUnless/01/base.json
@@ -0,0 +1,9 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/05 - copyUnless/01/merged.json b/test-fixtures/reducers/copy/05 - copyUnless/01/merged.json
new file mode 100644
index 0000000..7acc745
--- /dev/null
+++ b/test-fixtures/reducers/copy/05 - copyUnless/01/merged.json
@@ -0,0 +1,24 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "##2002021346"
+ },
+ {
+ "code": "b",
+ "value": "##2002021356"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/05 - copyUnless/01/metadata.json b/test-fixtures/reducers/copy/05 - copyUnless/01/metadata.json
new file mode 100644
index 0000000..1d21896
--- /dev/null
+++ b/test-fixtures/reducers/copy/05 - copyUnless/01/metadata.json
@@ -0,0 +1,5 @@
+{
+ "description": "Copy fields unless contains subfields - {code: 9, value: MALLI}",
+ "tagPatternRegExp": "^010$",
+ "copyUnless": [{"code": "9", "value": "MALLI"}]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/05 - copyUnless/01/source.json b/test-fixtures/reducers/copy/05 - copyUnless/01/source.json
new file mode 100644
index 0000000..68c9c29
--- /dev/null
+++ b/test-fixtures/reducers/copy/05 - copyUnless/01/source.json
@@ -0,0 +1,47 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "##2002021346"
+ },
+ {
+ "code": "b",
+ "value": "##2002021356"
+ }
+ ]
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "c",
+ "value": "##2002021348"
+ },
+ {
+ "code": "d",
+ "value": "##2002021358"
+ },
+ {
+ "code": "e",
+ "value": "##2002021359"
+ },
+ {
+ "code": "9",
+ "value": "MALLI"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/01/base.json b/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/01/base.json
new file mode 100644
index 0000000..878c664
--- /dev/null
+++ b/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/01/base.json
@@ -0,0 +1,24 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "foo"
+ },
+ {
+ "code": "b",
+ "value": "bar"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/01/merged.json b/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/01/merged.json
new file mode 100644
index 0000000..640451a
--- /dev/null
+++ b/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/01/merged.json
@@ -0,0 +1,39 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "foo"
+ },
+ {
+ "code": "b",
+ "value": "bar"
+ }
+ ]
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "foo"
+ },
+ {
+ "code": "b",
+ "value": "bars"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/01/metadata.json b/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/01/metadata.json
new file mode 100644
index 0000000..cbe2e87
--- /dev/null
+++ b/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/01/metadata.json
@@ -0,0 +1,5 @@
+{
+ "description": "subfieldsMustBeIdentical: true - fields 010 are not identical => fields are copied",
+ "tagPatternRegExp": "^010$",
+ "subfieldsMustBeIdentical": true
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/01/source.json b/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/01/source.json
new file mode 100644
index 0000000..86a76da
--- /dev/null
+++ b/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/01/source.json
@@ -0,0 +1,24 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "foo"
+ },
+ {
+ "code": "b",
+ "value": "bars"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/02/base.json b/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/02/base.json
new file mode 100644
index 0000000..878c664
--- /dev/null
+++ b/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/02/base.json
@@ -0,0 +1,24 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "foo"
+ },
+ {
+ "code": "b",
+ "value": "bar"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/02/merged.json b/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/02/merged.json
new file mode 100644
index 0000000..878c664
--- /dev/null
+++ b/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/02/merged.json
@@ -0,0 +1,24 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "foo"
+ },
+ {
+ "code": "b",
+ "value": "bar"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/02/metadata.json b/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/02/metadata.json
new file mode 100644
index 0000000..828b539
--- /dev/null
+++ b/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/02/metadata.json
@@ -0,0 +1,5 @@
+{
+ "description": "subfieldsMustBeIdentical: true - fields 010 identical => fields are not copied",
+ "tagPatternRegExp": "^010$",
+ "subfieldsMustBeIdentical": true
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/02/source.json b/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/02/source.json
new file mode 100644
index 0000000..878c664
--- /dev/null
+++ b/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/02/source.json
@@ -0,0 +1,24 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "foo"
+ },
+ {
+ "code": "b",
+ "value": "bar"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/03/base.json b/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/03/base.json
new file mode 100644
index 0000000..013238f
--- /dev/null
+++ b/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/03/base.json
@@ -0,0 +1,28 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "foo"
+ },
+ {
+ "code": "b",
+ "value": "bar"
+ },
+ {
+ "code": "c",
+ "value": "foobar"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/03/merged.json b/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/03/merged.json
new file mode 100644
index 0000000..fe10157
--- /dev/null
+++ b/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/03/merged.json
@@ -0,0 +1,43 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "foo"
+ },
+ {
+ "code": "b",
+ "value": "bar"
+ },
+ {
+ "code": "c",
+ "value": "foobar"
+ }
+ ]
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "foo"
+ },
+ {
+ "code": "b",
+ "value": "bar"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/03/metadata.json b/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/03/metadata.json
new file mode 100644
index 0000000..e77d315
--- /dev/null
+++ b/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/03/metadata.json
@@ -0,0 +1,5 @@
+{
+ "description": "subfieldsMustBeIdentical: true - source subfields are subset of base subfields",
+ "tagPatternRegExp": "^010$",
+ "subfieldsMustBeIdentical": true
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/03/source.json b/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/03/source.json
new file mode 100644
index 0000000..878c664
--- /dev/null
+++ b/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/03/source.json
@@ -0,0 +1,24 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "foo"
+ },
+ {
+ "code": "b",
+ "value": "bar"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/04/base.json b/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/04/base.json
new file mode 100644
index 0000000..013238f
--- /dev/null
+++ b/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/04/base.json
@@ -0,0 +1,28 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "foo"
+ },
+ {
+ "code": "b",
+ "value": "bar"
+ },
+ {
+ "code": "c",
+ "value": "foobar"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/04/merged.json b/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/04/merged.json
new file mode 100644
index 0000000..013238f
--- /dev/null
+++ b/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/04/merged.json
@@ -0,0 +1,28 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "foo"
+ },
+ {
+ "code": "b",
+ "value": "bar"
+ },
+ {
+ "code": "c",
+ "value": "foobar"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/04/metadata.json b/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/04/metadata.json
new file mode 100644
index 0000000..47e9e32
--- /dev/null
+++ b/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/04/metadata.json
@@ -0,0 +1,5 @@
+{
+ "description": "subfieldsMustBeIdentical: false - source subfields are subset of base subfields",
+ "tagPatternRegExp": "^010$",
+ "subfieldsMustBeIdentical": false
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/04/source.json b/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/04/source.json
new file mode 100644
index 0000000..878c664
--- /dev/null
+++ b/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/04/source.json
@@ -0,0 +1,24 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "foo"
+ },
+ {
+ "code": "b",
+ "value": "bar"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/05/base.json b/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/05/base.json
new file mode 100644
index 0000000..2a0c822
--- /dev/null
+++ b/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/05/base.json
@@ -0,0 +1,20 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "foo"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/05/merged.json b/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/05/merged.json
new file mode 100644
index 0000000..71b4714
--- /dev/null
+++ b/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/05/merged.json
@@ -0,0 +1,35 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "foo"
+ }
+ ]
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "foo"
+ },
+ {
+ "code": "b",
+ "value": "bar"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/05/metadata.json b/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/05/metadata.json
new file mode 100644
index 0000000..fe3f028
--- /dev/null
+++ b/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/05/metadata.json
@@ -0,0 +1,5 @@
+{
+ "description": "subfieldsMustBeIdentical: true - base subfields are subset of source subfields",
+ "tagPatternRegExp": "^010$",
+ "subfieldsMustBeIdentical": true
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/05/source.json b/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/05/source.json
new file mode 100644
index 0000000..878c664
--- /dev/null
+++ b/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/05/source.json
@@ -0,0 +1,24 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "foo"
+ },
+ {
+ "code": "b",
+ "value": "bar"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/06/base.json b/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/06/base.json
new file mode 100644
index 0000000..2a0c822
--- /dev/null
+++ b/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/06/base.json
@@ -0,0 +1,20 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "foo"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/06/merged.json b/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/06/merged.json
new file mode 100644
index 0000000..71b4714
--- /dev/null
+++ b/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/06/merged.json
@@ -0,0 +1,35 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "foo"
+ }
+ ]
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "foo"
+ },
+ {
+ "code": "b",
+ "value": "bar"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/06/metadata.json b/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/06/metadata.json
new file mode 100644
index 0000000..e350423
--- /dev/null
+++ b/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/06/metadata.json
@@ -0,0 +1,5 @@
+{
+ "description": "subfieldsMustBeIdentical: false - base subfields are subset of source subfields",
+ "tagPatternRegExp": "^010$",
+ "subfieldsMustBeIdentical": false
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/06/source.json b/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/06/source.json
new file mode 100644
index 0000000..878c664
--- /dev/null
+++ b/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/06/source.json
@@ -0,0 +1,24 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "foo"
+ },
+ {
+ "code": "b",
+ "value": "bar"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/07 - excludeSubfields/01/base.json b/test-fixtures/reducers/copy/07 - excludeSubfields/01/base.json
new file mode 100644
index 0000000..390a4ac
--- /dev/null
+++ b/test-fixtures/reducers/copy/07 - excludeSubfields/01/base.json
@@ -0,0 +1,39 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "##2002021346"
+ },
+ {
+ "code": "b",
+ "value": "##2002021356"
+ }
+ ]
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "d",
+ "value": "##2002021357"
+ },
+ {
+ "code": "e",
+ "value": "##2002021359"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/07 - excludeSubfields/01/merged.json b/test-fixtures/reducers/copy/07 - excludeSubfields/01/merged.json
new file mode 100644
index 0000000..390a4ac
--- /dev/null
+++ b/test-fixtures/reducers/copy/07 - excludeSubfields/01/merged.json
@@ -0,0 +1,39 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "##2002021346"
+ },
+ {
+ "code": "b",
+ "value": "##2002021356"
+ }
+ ]
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "d",
+ "value": "##2002021357"
+ },
+ {
+ "code": "e",
+ "value": "##2002021359"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/07 - excludeSubfields/01/metadata.json b/test-fixtures/reducers/copy/07 - excludeSubfields/01/metadata.json
new file mode 100644
index 0000000..2d08e8a
--- /dev/null
+++ b/test-fixtures/reducers/copy/07 - excludeSubfields/01/metadata.json
@@ -0,0 +1,8 @@
+{
+ "description": "Ignore subfields c and d in comparing identicalness - ignore one field",
+ "tagPatternRegExp": "^010$",
+ "excludeSubfields": [
+ "c",
+ "d"
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/07 - excludeSubfields/01/source.json b/test-fixtures/reducers/copy/07 - excludeSubfields/01/source.json
new file mode 100644
index 0000000..b5ef24d
--- /dev/null
+++ b/test-fixtures/reducers/copy/07 - excludeSubfields/01/source.json
@@ -0,0 +1,43 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "##2002021346"
+ },
+ {
+ "code": "b",
+ "value": "##2002021356"
+ }
+ ]
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "c",
+ "value": "##2002021348"
+ },
+ {
+ "code": "d",
+ "value": "##2002021358"
+ },
+ {
+ "code": "e",
+ "value": "##2002021359"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/07 - excludeSubfields/02/base.json b/test-fixtures/reducers/copy/07 - excludeSubfields/02/base.json
new file mode 100644
index 0000000..390a4ac
--- /dev/null
+++ b/test-fixtures/reducers/copy/07 - excludeSubfields/02/base.json
@@ -0,0 +1,39 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "##2002021346"
+ },
+ {
+ "code": "b",
+ "value": "##2002021356"
+ }
+ ]
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "d",
+ "value": "##2002021357"
+ },
+ {
+ "code": "e",
+ "value": "##2002021359"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/07 - excludeSubfields/02/merged.json b/test-fixtures/reducers/copy/07 - excludeSubfields/02/merged.json
new file mode 100644
index 0000000..5d47b7a
--- /dev/null
+++ b/test-fixtures/reducers/copy/07 - excludeSubfields/02/merged.json
@@ -0,0 +1,58 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "##2002021346"
+ },
+ {
+ "code": "b",
+ "value": "##2002021356"
+ }
+ ]
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "d",
+ "value": "##2002021357"
+ },
+ {
+ "code": "e",
+ "value": "##2002021359"
+ }
+ ]
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "c",
+ "value": "##2002021348"
+ },
+ {
+ "code": "d",
+ "value": "##2002021358"
+ },
+ {
+ "code": "e",
+ "value": "##2002021359"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/07 - excludeSubfields/02/metadata.json b/test-fixtures/reducers/copy/07 - excludeSubfields/02/metadata.json
new file mode 100644
index 0000000..fe63935
--- /dev/null
+++ b/test-fixtures/reducers/copy/07 - excludeSubfields/02/metadata.json
@@ -0,0 +1,5 @@
+{
+ "description": "Empty array - no exclusion",
+ "tagPatternRegExp": "^010$",
+ "excludeSubfields": []
+}
diff --git a/test-fixtures/reducers/copy/07 - excludeSubfields/02/source.json b/test-fixtures/reducers/copy/07 - excludeSubfields/02/source.json
new file mode 100644
index 0000000..b5ef24d
--- /dev/null
+++ b/test-fixtures/reducers/copy/07 - excludeSubfields/02/source.json
@@ -0,0 +1,43 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "##2002021346"
+ },
+ {
+ "code": "b",
+ "value": "##2002021356"
+ }
+ ]
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "c",
+ "value": "##2002021348"
+ },
+ {
+ "code": "d",
+ "value": "##2002021358"
+ },
+ {
+ "code": "e",
+ "value": "##2002021359"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/08 - dropSubfields/01/base.json b/test-fixtures/reducers/copy/08 - dropSubfields/01/base.json
new file mode 100644
index 0000000..6bc17f8
--- /dev/null
+++ b/test-fixtures/reducers/copy/08 - dropSubfields/01/base.json
@@ -0,0 +1,35 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "##2002021346"
+ },
+ {
+ "code": "b",
+ "value": "##2002021356"
+ }
+ ]
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "e",
+ "value": "##2002021359"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/08 - dropSubfields/01/merged.json b/test-fixtures/reducers/copy/08 - dropSubfields/01/merged.json
new file mode 100644
index 0000000..2bab3f4
--- /dev/null
+++ b/test-fixtures/reducers/copy/08 - dropSubfields/01/merged.json
@@ -0,0 +1,54 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "##2002021346"
+ },
+ {
+ "code": "b",
+ "value": "##2002021356"
+ }
+ ]
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "e",
+ "value": "##2002021359"
+ }
+ ]
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "c",
+ "value": "##2002021348"
+ },
+ {
+ "code": "d",
+ "value": "##2002021358"
+ },
+ {
+ "code": "f",
+ "value": "##2002021361"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/08 - dropSubfields/01/metadata.json b/test-fixtures/reducers/copy/08 - dropSubfields/01/metadata.json
new file mode 100644
index 0000000..0f2a19a
--- /dev/null
+++ b/test-fixtures/reducers/copy/08 - dropSubfields/01/metadata.json
@@ -0,0 +1,5 @@
+{
+ "description": "Drop subfields from source before copying",
+ "tagPatternRegExp": "^010$",
+ "dropSubfields": ["c", "d"]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/08 - dropSubfields/01/source.json b/test-fixtures/reducers/copy/08 - dropSubfields/01/source.json
new file mode 100644
index 0000000..955481b
--- /dev/null
+++ b/test-fixtures/reducers/copy/08 - dropSubfields/01/source.json
@@ -0,0 +1,43 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "##2002021346"
+ },
+ {
+ "code": "b",
+ "value": "##2002021356"
+ }
+ ]
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "c",
+ "value": "##2002021348"
+ },
+ {
+ "code": "d",
+ "value": "##2002021358"
+ },
+ {
+ "code": "f",
+ "value": "##2002021361"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/08 - dropSubfields/02/base.json b/test-fixtures/reducers/copy/08 - dropSubfields/02/base.json
new file mode 100644
index 0000000..955481b
--- /dev/null
+++ b/test-fixtures/reducers/copy/08 - dropSubfields/02/base.json
@@ -0,0 +1,43 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "##2002021346"
+ },
+ {
+ "code": "b",
+ "value": "##2002021356"
+ }
+ ]
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "c",
+ "value": "##2002021348"
+ },
+ {
+ "code": "d",
+ "value": "##2002021358"
+ },
+ {
+ "code": "f",
+ "value": "##2002021361"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/08 - dropSubfields/02/merged.json b/test-fixtures/reducers/copy/08 - dropSubfields/02/merged.json
new file mode 100644
index 0000000..6af3255
--- /dev/null
+++ b/test-fixtures/reducers/copy/08 - dropSubfields/02/merged.json
@@ -0,0 +1,58 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "##2002021346"
+ },
+ {
+ "code": "b",
+ "value": "##2002021356"
+ }
+ ]
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "c",
+ "value": "##2002021348"
+ },
+ {
+ "code": "d",
+ "value": "##2002021358"
+ },
+ {
+ "code": "f",
+ "value": "##2002021361"
+ }
+ ]
+ },
+ {
+ "tag": "250",
+ "ind1": "0",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "9",
+ "value": "FENNI"
+ },
+ {
+ "code": "9",
+ "value": "FENNI"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/08 - dropSubfields/02/metadata.json b/test-fixtures/reducers/copy/08 - dropSubfields/02/metadata.json
new file mode 100644
index 0000000..60013d0
--- /dev/null
+++ b/test-fixtures/reducers/copy/08 - dropSubfields/02/metadata.json
@@ -0,0 +1,5 @@
+{
+ "description": "Copy fields 250 drop subfields 9 unless FENNI or FENNI",
+ "tagPatternRegExp": "^250$",
+ "dropSubfields": [{"code": "9", "condition": "unless", "value": "^FENNI<(?KEEP|DROP)>$"}]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/08 - dropSubfields/02/source.json b/test-fixtures/reducers/copy/08 - dropSubfields/02/source.json
new file mode 100644
index 0000000..b1cd7f6
--- /dev/null
+++ b/test-fixtures/reducers/copy/08 - dropSubfields/02/source.json
@@ -0,0 +1,32 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "250",
+ "ind1": "0",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "9",
+ "value": "FENNI"
+ },
+ {
+ "code": "9",
+ "value": "FENNI"
+ },
+ {
+ "code": "9",
+ "value": "TESTI"
+ },
+ {
+ "code": "9",
+ "value": "MALLI"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/08 - dropSubfields/03/base.json b/test-fixtures/reducers/copy/08 - dropSubfields/03/base.json
new file mode 100644
index 0000000..955481b
--- /dev/null
+++ b/test-fixtures/reducers/copy/08 - dropSubfields/03/base.json
@@ -0,0 +1,43 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "##2002021346"
+ },
+ {
+ "code": "b",
+ "value": "##2002021356"
+ }
+ ]
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "c",
+ "value": "##2002021348"
+ },
+ {
+ "code": "d",
+ "value": "##2002021358"
+ },
+ {
+ "code": "f",
+ "value": "##2002021361"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/08 - dropSubfields/03/merged.json b/test-fixtures/reducers/copy/08 - dropSubfields/03/merged.json
new file mode 100644
index 0000000..6af3255
--- /dev/null
+++ b/test-fixtures/reducers/copy/08 - dropSubfields/03/merged.json
@@ -0,0 +1,58 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "##2002021346"
+ },
+ {
+ "code": "b",
+ "value": "##2002021356"
+ }
+ ]
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "c",
+ "value": "##2002021348"
+ },
+ {
+ "code": "d",
+ "value": "##2002021358"
+ },
+ {
+ "code": "f",
+ "value": "##2002021361"
+ }
+ ]
+ },
+ {
+ "tag": "250",
+ "ind1": "0",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "9",
+ "value": "FENNI"
+ },
+ {
+ "code": "9",
+ "value": "FENNI"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/08 - dropSubfields/03/metadata.json b/test-fixtures/reducers/copy/08 - dropSubfields/03/metadata.json
new file mode 100644
index 0000000..ceaf433
--- /dev/null
+++ b/test-fixtures/reducers/copy/08 - dropSubfields/03/metadata.json
@@ -0,0 +1,5 @@
+{
+ "description": "Copy fields 250 drop subfields 9 TESTI and 9 MALLI",
+ "tagPatternRegExp": "^250$",
+ "dropSubfields": [{"code": "9", "value": "TESTI"}, {"code": "9", "value": "MALLI"}]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/08 - dropSubfields/03/source.json b/test-fixtures/reducers/copy/08 - dropSubfields/03/source.json
new file mode 100644
index 0000000..b1cd7f6
--- /dev/null
+++ b/test-fixtures/reducers/copy/08 - dropSubfields/03/source.json
@@ -0,0 +1,32 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "250",
+ "ind1": "0",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "9",
+ "value": "FENNI"
+ },
+ {
+ "code": "9",
+ "value": "FENNI"
+ },
+ {
+ "code": "9",
+ "value": "TESTI"
+ },
+ {
+ "code": "9",
+ "value": "MALLI"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/08 - dropSubfields/04/base.json b/test-fixtures/reducers/copy/08 - dropSubfields/04/base.json
new file mode 100644
index 0000000..955481b
--- /dev/null
+++ b/test-fixtures/reducers/copy/08 - dropSubfields/04/base.json
@@ -0,0 +1,43 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "##2002021346"
+ },
+ {
+ "code": "b",
+ "value": "##2002021356"
+ }
+ ]
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "c",
+ "value": "##2002021348"
+ },
+ {
+ "code": "d",
+ "value": "##2002021358"
+ },
+ {
+ "code": "f",
+ "value": "##2002021361"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/08 - dropSubfields/04/merged.json b/test-fixtures/reducers/copy/08 - dropSubfields/04/merged.json
new file mode 100644
index 0000000..955481b
--- /dev/null
+++ b/test-fixtures/reducers/copy/08 - dropSubfields/04/merged.json
@@ -0,0 +1,43 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "##2002021346"
+ },
+ {
+ "code": "b",
+ "value": "##2002021356"
+ }
+ ]
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "c",
+ "value": "##2002021348"
+ },
+ {
+ "code": "d",
+ "value": "##2002021358"
+ },
+ {
+ "code": "f",
+ "value": "##2002021361"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/08 - dropSubfields/04/metadata.json b/test-fixtures/reducers/copy/08 - dropSubfields/04/metadata.json
new file mode 100644
index 0000000..31e0f76
--- /dev/null
+++ b/test-fixtures/reducers/copy/08 - dropSubfields/04/metadata.json
@@ -0,0 +1,5 @@
+{
+ "description": "Copy fields 250 drop subfields all 9 - Does not copy 250 with no subfields left",
+ "tagPatternRegExp": "^250$",
+ "dropSubfields": [{"code": "9"}]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/08 - dropSubfields/04/source.json b/test-fixtures/reducers/copy/08 - dropSubfields/04/source.json
new file mode 100644
index 0000000..b1cd7f6
--- /dev/null
+++ b/test-fixtures/reducers/copy/08 - dropSubfields/04/source.json
@@ -0,0 +1,32 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "250",
+ "ind1": "0",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "9",
+ "value": "FENNI"
+ },
+ {
+ "code": "9",
+ "value": "FENNI"
+ },
+ {
+ "code": "9",
+ "value": "TESTI"
+ },
+ {
+ "code": "9",
+ "value": "MALLI"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/09 - swapSubfieldCode/01/base.json b/test-fixtures/reducers/copy/09 - swapSubfieldCode/01/base.json
new file mode 100644
index 0000000..348982c
--- /dev/null
+++ b/test-fixtures/reducers/copy/09 - swapSubfieldCode/01/base.json
@@ -0,0 +1,9 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/09 - swapSubfieldCode/01/merged.json b/test-fixtures/reducers/copy/09 - swapSubfieldCode/01/merged.json
new file mode 100644
index 0000000..e6f93d7
--- /dev/null
+++ b/test-fixtures/reducers/copy/09 - swapSubfieldCode/01/merged.json
@@ -0,0 +1,20 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "b",
+ "value": "##2002021346"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/09 - swapSubfieldCode/01/metadata.json b/test-fixtures/reducers/copy/09 - swapSubfieldCode/01/metadata.json
new file mode 100644
index 0000000..c83d622
--- /dev/null
+++ b/test-fixtures/reducers/copy/09 - swapSubfieldCode/01/metadata.json
@@ -0,0 +1,6 @@
+{
+ "description": "Swap subfield code from a to b if copied: swapped",
+ "tagPatternRegExp": "^010$",
+ "swapSubfieldCode": [{"from": "a", "to": "b"}],
+ "only": false
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/09 - swapSubfieldCode/01/source.json b/test-fixtures/reducers/copy/09 - swapSubfieldCode/01/source.json
new file mode 100644
index 0000000..a803cf7
--- /dev/null
+++ b/test-fixtures/reducers/copy/09 - swapSubfieldCode/01/source.json
@@ -0,0 +1,20 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "##2002021346"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/09 - swapSubfieldCode/02/base.json b/test-fixtures/reducers/copy/09 - swapSubfieldCode/02/base.json
new file mode 100644
index 0000000..348982c
--- /dev/null
+++ b/test-fixtures/reducers/copy/09 - swapSubfieldCode/02/base.json
@@ -0,0 +1,9 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/09 - swapSubfieldCode/02/merged.json b/test-fixtures/reducers/copy/09 - swapSubfieldCode/02/merged.json
new file mode 100644
index 0000000..596407b
--- /dev/null
+++ b/test-fixtures/reducers/copy/09 - swapSubfieldCode/02/merged.json
@@ -0,0 +1,20 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "c",
+ "value": "##2002021346"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/09 - swapSubfieldCode/02/metadata.json b/test-fixtures/reducers/copy/09 - swapSubfieldCode/02/metadata.json
new file mode 100644
index 0000000..9f26bc8
--- /dev/null
+++ b/test-fixtures/reducers/copy/09 - swapSubfieldCode/02/metadata.json
@@ -0,0 +1,6 @@
+{
+ "description": "Swap subfield code from a to b if copied: no 'a' found",
+ "tagPatternRegExp": "^010$",
+ "swapSubfieldCode": [{"from": "a", "to": "b"}],
+ "only": false
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/09 - swapSubfieldCode/02/source.json b/test-fixtures/reducers/copy/09 - swapSubfieldCode/02/source.json
new file mode 100644
index 0000000..768b9d2
--- /dev/null
+++ b/test-fixtures/reducers/copy/09 - swapSubfieldCode/02/source.json
@@ -0,0 +1,20 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "c",
+ "value": "##2002021346"
+ }
+ ]
+ }
+ ]
+}
diff --git a/test-fixtures/reducers/copy/09 - swapSubfieldCode/03/base.json b/test-fixtures/reducers/copy/09 - swapSubfieldCode/03/base.json
new file mode 100644
index 0000000..348982c
--- /dev/null
+++ b/test-fixtures/reducers/copy/09 - swapSubfieldCode/03/base.json
@@ -0,0 +1,9 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/09 - swapSubfieldCode/03/merged.json b/test-fixtures/reducers/copy/09 - swapSubfieldCode/03/merged.json
new file mode 100644
index 0000000..02561e8
--- /dev/null
+++ b/test-fixtures/reducers/copy/09 - swapSubfieldCode/03/merged.json
@@ -0,0 +1,31 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "b",
+ "value": "##2002021346"
+ }
+ ]
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "b",
+ "value": "##2002021f46"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/09 - swapSubfieldCode/03/metadata.json b/test-fixtures/reducers/copy/09 - swapSubfieldCode/03/metadata.json
new file mode 100644
index 0000000..fce9a51
--- /dev/null
+++ b/test-fixtures/reducers/copy/09 - swapSubfieldCode/03/metadata.json
@@ -0,0 +1,6 @@
+{
+ "description": "Swap subfield code from a to b if copied: multiple 'a' swapped",
+ "tagPatternRegExp": "^010$",
+ "swapSubfieldCode": [{"from": "a", "to": "b"}],
+ "only": false
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/09 - swapSubfieldCode/03/source.json b/test-fixtures/reducers/copy/09 - swapSubfieldCode/03/source.json
new file mode 100644
index 0000000..a4b85b4
--- /dev/null
+++ b/test-fixtures/reducers/copy/09 - swapSubfieldCode/03/source.json
@@ -0,0 +1,31 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "##2002021346"
+ }
+ ]
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "##2002021f46"
+ }
+ ]
+ }
+ ]
+}
diff --git a/test-fixtures/reducers/copy/09 - swapSubfieldCode/04/base.json b/test-fixtures/reducers/copy/09 - swapSubfieldCode/04/base.json
new file mode 100644
index 0000000..348982c
--- /dev/null
+++ b/test-fixtures/reducers/copy/09 - swapSubfieldCode/04/base.json
@@ -0,0 +1,9 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/09 - swapSubfieldCode/04/merged.json b/test-fixtures/reducers/copy/09 - swapSubfieldCode/04/merged.json
new file mode 100644
index 0000000..6a5d38c
--- /dev/null
+++ b/test-fixtures/reducers/copy/09 - swapSubfieldCode/04/merged.json
@@ -0,0 +1,42 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "##2002021a46"
+ }
+ ]
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "b",
+ "value": "##2002021b46"
+ }
+ ]
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "c",
+ "value": "##2002021c46"
+ }
+ ]
+ }
+ ]
+}
diff --git a/test-fixtures/reducers/copy/09 - swapSubfieldCode/04/metadata.json b/test-fixtures/reducers/copy/09 - swapSubfieldCode/04/metadata.json
new file mode 100644
index 0000000..1edfcc0
--- /dev/null
+++ b/test-fixtures/reducers/copy/09 - swapSubfieldCode/04/metadata.json
@@ -0,0 +1,6 @@
+{
+ "description": "Swap subfield code from x to a if copied: swaps x to a, does not change b or c",
+ "tagPatternRegExp": "^010$",
+ "swapSubfieldCode": [{"from": "x", "to": "a"}],
+ "only": false
+}
diff --git a/test-fixtures/reducers/copy/09 - swapSubfieldCode/04/source.json b/test-fixtures/reducers/copy/09 - swapSubfieldCode/04/source.json
new file mode 100644
index 0000000..ff98af2
--- /dev/null
+++ b/test-fixtures/reducers/copy/09 - swapSubfieldCode/04/source.json
@@ -0,0 +1,42 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "x",
+ "value": "##2002021a46"
+ }
+ ]
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "b",
+ "value": "##2002021b46"
+ }
+ ]
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "c",
+ "value": "##2002021c46"
+ }
+ ]
+ }
+ ]
+}
diff --git a/test-fixtures/reducers/copy/10 - swapTag/01/base.json b/test-fixtures/reducers/copy/10 - swapTag/01/base.json
new file mode 100644
index 0000000..4df566d
--- /dev/null
+++ b/test-fixtures/reducers/copy/10 - swapTag/01/base.json
@@ -0,0 +1,17 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "100",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {"code": "a", "value": "original"}
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/10 - swapTag/01/merged.json b/test-fixtures/reducers/copy/10 - swapTag/01/merged.json
new file mode 100644
index 0000000..0bf1936
--- /dev/null
+++ b/test-fixtures/reducers/copy/10 - swapTag/01/merged.json
@@ -0,0 +1,28 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "100",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {"code": "a", "value": "original"}
+ ]
+ },
+ {
+ "tag": "700",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "test"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/10 - swapTag/01/metadata.json b/test-fixtures/reducers/copy/10 - swapTag/01/metadata.json
new file mode 100644
index 0000000..889377e
--- /dev/null
+++ b/test-fixtures/reducers/copy/10 - swapTag/01/metadata.json
@@ -0,0 +1,6 @@
+{
+ "description": "Swap tag from 100 to 700 if copied: swapped",
+ "tagPatternRegExp": "^100$",
+ "swapTag": [{"from": "^100$", "to": "700"}],
+ "only": false
+}
diff --git a/test-fixtures/reducers/copy/10 - swapTag/01/source.json b/test-fixtures/reducers/copy/10 - swapTag/01/source.json
new file mode 100644
index 0000000..58a70ee
--- /dev/null
+++ b/test-fixtures/reducers/copy/10 - swapTag/01/source.json
@@ -0,0 +1,20 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "100",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "test"
+ }
+ ]
+ }
+ ]
+}
diff --git a/test-fixtures/reducers/copy/11 - compareWithoutTag/01/base.json b/test-fixtures/reducers/copy/11 - compareWithoutTag/01/base.json
new file mode 100644
index 0000000..0bf1936
--- /dev/null
+++ b/test-fixtures/reducers/copy/11 - compareWithoutTag/01/base.json
@@ -0,0 +1,28 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "100",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {"code": "a", "value": "original"}
+ ]
+ },
+ {
+ "tag": "700",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "test"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/11 - compareWithoutTag/01/merged.json b/test-fixtures/reducers/copy/11 - compareWithoutTag/01/merged.json
new file mode 100644
index 0000000..0bf1936
--- /dev/null
+++ b/test-fixtures/reducers/copy/11 - compareWithoutTag/01/merged.json
@@ -0,0 +1,28 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "100",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {"code": "a", "value": "original"}
+ ]
+ },
+ {
+ "tag": "700",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "test"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/11 - compareWithoutTag/01/metadata.json b/test-fixtures/reducers/copy/11 - compareWithoutTag/01/metadata.json
new file mode 100644
index 0000000..172554a
--- /dev/null
+++ b/test-fixtures/reducers/copy/11 - compareWithoutTag/01/metadata.json
@@ -0,0 +1,6 @@
+{
+ "description": "compare fields 100 and 700, compareWithoutTag, source 100 found as 700 in base: no copy",
+ "tagPatternRegExp": "^(?100|700)$",
+ "compareWithoutTag": true,
+ "only": false
+}
diff --git a/test-fixtures/reducers/copy/11 - compareWithoutTag/01/source.json b/test-fixtures/reducers/copy/11 - compareWithoutTag/01/source.json
new file mode 100644
index 0000000..58a70ee
--- /dev/null
+++ b/test-fixtures/reducers/copy/11 - compareWithoutTag/01/source.json
@@ -0,0 +1,20 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "100",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "test"
+ }
+ ]
+ }
+ ]
+}
diff --git a/test-fixtures/reducers/copy/11 - compareWithoutTag/02/base.json b/test-fixtures/reducers/copy/11 - compareWithoutTag/02/base.json
new file mode 100644
index 0000000..0bf1936
--- /dev/null
+++ b/test-fixtures/reducers/copy/11 - compareWithoutTag/02/base.json
@@ -0,0 +1,28 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "100",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {"code": "a", "value": "original"}
+ ]
+ },
+ {
+ "tag": "700",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "test"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/11 - compareWithoutTag/02/merged.json b/test-fixtures/reducers/copy/11 - compareWithoutTag/02/merged.json
new file mode 100644
index 0000000..c738492
--- /dev/null
+++ b/test-fixtures/reducers/copy/11 - compareWithoutTag/02/merged.json
@@ -0,0 +1,39 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "100",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {"code": "a", "value": "original"}
+ ]
+ },
+ {
+ "tag": "700",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "test"
+ }
+ ]
+ },
+ {
+ "tag": "700",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "test2"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/11 - compareWithoutTag/02/metadata.json b/test-fixtures/reducers/copy/11 - compareWithoutTag/02/metadata.json
new file mode 100644
index 0000000..cfdb079
--- /dev/null
+++ b/test-fixtures/reducers/copy/11 - compareWithoutTag/02/metadata.json
@@ -0,0 +1,6 @@
+{
+ "description": "compare fields 100 and 700, compareWithoutTag, adds missing 700 from source to base",
+ "tagPatternRegExp": "^(?100|700)$",
+ "compareWithoutTag": true,
+ "only": false
+}
diff --git a/test-fixtures/reducers/copy/11 - compareWithoutTag/02/source.json b/test-fixtures/reducers/copy/11 - compareWithoutTag/02/source.json
new file mode 100644
index 0000000..eaa7857
--- /dev/null
+++ b/test-fixtures/reducers/copy/11 - compareWithoutTag/02/source.json
@@ -0,0 +1,31 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "100",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "test"
+ }
+ ]
+ },
+ {
+ "tag": "700",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "test2"
+ }
+ ]
+ }
+ ]
+}
diff --git a/test-fixtures/reducers/copy/11 - compareWithoutTag/03/base.json b/test-fixtures/reducers/copy/11 - compareWithoutTag/03/base.json
new file mode 100644
index 0000000..0bf1936
--- /dev/null
+++ b/test-fixtures/reducers/copy/11 - compareWithoutTag/03/base.json
@@ -0,0 +1,28 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "100",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {"code": "a", "value": "original"}
+ ]
+ },
+ {
+ "tag": "700",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "test"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/11 - compareWithoutTag/03/merged.json b/test-fixtures/reducers/copy/11 - compareWithoutTag/03/merged.json
new file mode 100644
index 0000000..0bf1936
--- /dev/null
+++ b/test-fixtures/reducers/copy/11 - compareWithoutTag/03/merged.json
@@ -0,0 +1,28 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "100",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {"code": "a", "value": "original"}
+ ]
+ },
+ {
+ "tag": "700",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "test"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/11 - compareWithoutTag/03/metadata.json b/test-fixtures/reducers/copy/11 - compareWithoutTag/03/metadata.json
new file mode 100644
index 0000000..10b0aae
--- /dev/null
+++ b/test-fixtures/reducers/copy/11 - compareWithoutTag/03/metadata.json
@@ -0,0 +1,7 @@
+{
+ "description": "compare fields 100 and 700, compareWithoutTag, if copied: swapTag 700: base has 700 allready",
+ "tagPatternRegExp": "^(?100|700)$",
+ "compareWithoutTag": true,
+ "swapTag": [{"from": "^100$", "to": "700"}],
+ "only": false
+}
diff --git a/test-fixtures/reducers/copy/11 - compareWithoutTag/03/source.json b/test-fixtures/reducers/copy/11 - compareWithoutTag/03/source.json
new file mode 100644
index 0000000..58a70ee
--- /dev/null
+++ b/test-fixtures/reducers/copy/11 - compareWithoutTag/03/source.json
@@ -0,0 +1,20 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "100",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "test"
+ }
+ ]
+ }
+ ]
+}
diff --git a/test-fixtures/reducers/copy/11 - compareWithoutTag/04/base.json b/test-fixtures/reducers/copy/11 - compareWithoutTag/04/base.json
new file mode 100644
index 0000000..4df566d
--- /dev/null
+++ b/test-fixtures/reducers/copy/11 - compareWithoutTag/04/base.json
@@ -0,0 +1,17 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "100",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {"code": "a", "value": "original"}
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/11 - compareWithoutTag/04/merged.json b/test-fixtures/reducers/copy/11 - compareWithoutTag/04/merged.json
new file mode 100644
index 0000000..0bf1936
--- /dev/null
+++ b/test-fixtures/reducers/copy/11 - compareWithoutTag/04/merged.json
@@ -0,0 +1,28 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "100",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {"code": "a", "value": "original"}
+ ]
+ },
+ {
+ "tag": "700",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "test"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/11 - compareWithoutTag/04/metadata.json b/test-fixtures/reducers/copy/11 - compareWithoutTag/04/metadata.json
new file mode 100644
index 0000000..7bf506d
--- /dev/null
+++ b/test-fixtures/reducers/copy/11 - compareWithoutTag/04/metadata.json
@@ -0,0 +1,7 @@
+{
+ "description": "compare fields 100 and 700, compareWithoutTag, if copied: swapTag 700: copy source 700 just once",
+ "tagPatternRegExp": "^(?100|700)$",
+ "compareWithoutTag": true,
+ "swapTag": [{"from": "^100$", "to": "700"}],
+ "only": false
+}
diff --git a/test-fixtures/reducers/copy/11 - compareWithoutTag/04/source.json b/test-fixtures/reducers/copy/11 - compareWithoutTag/04/source.json
new file mode 100644
index 0000000..9c942c0
--- /dev/null
+++ b/test-fixtures/reducers/copy/11 - compareWithoutTag/04/source.json
@@ -0,0 +1,31 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "100",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "test"
+ }
+ ]
+ },
+ {
+ "tag": "700",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "test"
+ }
+ ]
+ }
+ ]
+}
diff --git a/test-fixtures/reducers/copy/11 - compareWithoutTag/05/base.json b/test-fixtures/reducers/copy/11 - compareWithoutTag/05/base.json
new file mode 100644
index 0000000..0bf1936
--- /dev/null
+++ b/test-fixtures/reducers/copy/11 - compareWithoutTag/05/base.json
@@ -0,0 +1,28 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "100",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {"code": "a", "value": "original"}
+ ]
+ },
+ {
+ "tag": "700",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "test"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/11 - compareWithoutTag/05/merged.json b/test-fixtures/reducers/copy/11 - compareWithoutTag/05/merged.json
new file mode 100644
index 0000000..0bf1936
--- /dev/null
+++ b/test-fixtures/reducers/copy/11 - compareWithoutTag/05/merged.json
@@ -0,0 +1,28 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "100",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {"code": "a", "value": "original"}
+ ]
+ },
+ {
+ "tag": "700",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "test"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/copy/11 - compareWithoutTag/05/metadata.json b/test-fixtures/reducers/copy/11 - compareWithoutTag/05/metadata.json
new file mode 100644
index 0000000..10b0aae
--- /dev/null
+++ b/test-fixtures/reducers/copy/11 - compareWithoutTag/05/metadata.json
@@ -0,0 +1,7 @@
+{
+ "description": "compare fields 100 and 700, compareWithoutTag, if copied: swapTag 700: base has 700 allready",
+ "tagPatternRegExp": "^(?100|700)$",
+ "compareWithoutTag": true,
+ "swapTag": [{"from": "^100$", "to": "700"}],
+ "only": false
+}
diff --git a/test-fixtures/reducers/copy/11 - compareWithoutTag/05/source.json b/test-fixtures/reducers/copy/11 - compareWithoutTag/05/source.json
new file mode 100644
index 0000000..7a86a30
--- /dev/null
+++ b/test-fixtures/reducers/copy/11 - compareWithoutTag/05/source.json
@@ -0,0 +1,28 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "100",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {"code": "a", "value": "original"}
+ ]
+ },
+ {
+ "tag": "100",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "test"
+ }
+ ]
+ }
+ ]
+}
diff --git a/test-fixtures/reducers/metadata.json b/test-fixtures/reducers/metadata.json
new file mode 100644
index 0000000..ec864af
--- /dev/null
+++ b/test-fixtures/reducers/metadata.json
@@ -0,0 +1,4 @@
+{
+ "description": "",
+ "tagPatternRegExp": "^$"
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/select/01/base.json b/test-fixtures/reducers/select/01/base.json
new file mode 100644
index 0000000..11156dc
--- /dev/null
+++ b/test-fixtures/reducers/select/01/base.json
@@ -0,0 +1,21 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "value": "this is wrong",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "hello world"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/select/01/merged.json b/test-fixtures/reducers/select/01/merged.json
new file mode 100644
index 0000000..51f3ea0
--- /dev/null
+++ b/test-fixtures/reducers/select/01/merged.json
@@ -0,0 +1,20 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "hello world"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/select/01/metadata.json b/test-fixtures/reducers/select/01/metadata.json
new file mode 100644
index 0000000..f7641ef
--- /dev/null
+++ b/test-fixtures/reducers/select/01/metadata.json
@@ -0,0 +1,5 @@
+{
+ "description": "The field is a control field (contains 'value') --> error message",
+ "tagPatternRegExp": "^010$",
+ "expectedError": "Invalid control field, expected data field"
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/select/01/source.json b/test-fixtures/reducers/select/01/source.json
new file mode 100644
index 0000000..51f3ea0
--- /dev/null
+++ b/test-fixtures/reducers/select/01/source.json
@@ -0,0 +1,20 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "hello world"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/select/02/base.json b/test-fixtures/reducers/select/02/base.json
new file mode 100644
index 0000000..1e0d580
--- /dev/null
+++ b/test-fixtures/reducers/select/02/base.json
@@ -0,0 +1,31 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "Hello world"
+ }
+ ]
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "b",
+ "value": "goodbye world"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/select/02/merged.json b/test-fixtures/reducers/select/02/merged.json
new file mode 100644
index 0000000..1e0d580
--- /dev/null
+++ b/test-fixtures/reducers/select/02/merged.json
@@ -0,0 +1,31 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "Hello world"
+ }
+ ]
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "b",
+ "value": "goodbye world"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/select/02/metadata.json b/test-fixtures/reducers/select/02/metadata.json
new file mode 100644
index 0000000..40f3db6
--- /dev/null
+++ b/test-fixtures/reducers/select/02/metadata.json
@@ -0,0 +1,4 @@
+{
+ "description": "If there are multiple fields, return base",
+ "tagPatternRegExp": "^010$"
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/select/02/source.json b/test-fixtures/reducers/select/02/source.json
new file mode 100644
index 0000000..dab3bec
--- /dev/null
+++ b/test-fixtures/reducers/select/02/source.json
@@ -0,0 +1,42 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "hello world"
+ }
+ ]
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "b",
+ "value": "goodbye world"
+ }
+ ]
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "c",
+ "value": "have a nice day"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/select/03/base.json b/test-fixtures/reducers/select/03/base.json
new file mode 100644
index 0000000..01bd9af
--- /dev/null
+++ b/test-fixtures/reducers/select/03/base.json
@@ -0,0 +1,20 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "Hello world"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/select/03/merged.json b/test-fixtures/reducers/select/03/merged.json
new file mode 100644
index 0000000..01bd9af
--- /dev/null
+++ b/test-fixtures/reducers/select/03/merged.json
@@ -0,0 +1,20 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "Hello world"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/select/03/metadata.json b/test-fixtures/reducers/select/03/metadata.json
new file mode 100644
index 0000000..f87da79
--- /dev/null
+++ b/test-fixtures/reducers/select/03/metadata.json
@@ -0,0 +1,4 @@
+{
+ "description": "Base and source tags are equal for one field --> return base",
+ "tagPatternRegExp": "^010$"
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/select/03/source.json b/test-fixtures/reducers/select/03/source.json
new file mode 100644
index 0000000..01bd9af
--- /dev/null
+++ b/test-fixtures/reducers/select/03/source.json
@@ -0,0 +1,20 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "Hello world"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/select/04/base.json b/test-fixtures/reducers/select/04/base.json
new file mode 100644
index 0000000..01bd9af
--- /dev/null
+++ b/test-fixtures/reducers/select/04/base.json
@@ -0,0 +1,20 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "Hello world"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/select/04/merged.json b/test-fixtures/reducers/select/04/merged.json
new file mode 100644
index 0000000..01bd9af
--- /dev/null
+++ b/test-fixtures/reducers/select/04/merged.json
@@ -0,0 +1,20 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "Hello world"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/select/04/metadata.json b/test-fixtures/reducers/select/04/metadata.json
new file mode 100644
index 0000000..af1b759
--- /dev/null
+++ b/test-fixtures/reducers/select/04/metadata.json
@@ -0,0 +1,5 @@
+{
+ "description": "Base and source tags are not equal --> return base",
+ "note": "to test for this, tagPattern has to allow two tags, otherwise the unequal tag does not even pass source.get(tagPattern)",
+ "tagPatternRegExp": "^(010|020)$"
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/select/04/source.json b/test-fixtures/reducers/select/04/source.json
new file mode 100644
index 0000000..70096b3
--- /dev/null
+++ b/test-fixtures/reducers/select/04/source.json
@@ -0,0 +1,20 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "020",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "hello world"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/select/05/base.json b/test-fixtures/reducers/select/05/base.json
new file mode 100644
index 0000000..38a8713
--- /dev/null
+++ b/test-fixtures/reducers/select/05/base.json
@@ -0,0 +1,24 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "Héllõ .,-/ Wörld .,-/#!$%^&*;:{}=_`~()[]"
+ },
+ {
+ "code": "b",
+ "value": " çšŕ#!$%ňŭųœ #!$%ËÑĶãýğĝŧŵ"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/select/05/merged.json b/test-fixtures/reducers/select/05/merged.json
new file mode 100644
index 0000000..38a8713
--- /dev/null
+++ b/test-fixtures/reducers/select/05/merged.json
@@ -0,0 +1,24 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "Héllõ .,-/ Wörld .,-/#!$%^&*;:{}=_`~()[]"
+ },
+ {
+ "code": "b",
+ "value": " çšŕ#!$%ňŭųœ #!$%ËÑĶãýğĝŧŵ"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/select/05/metadata.json b/test-fixtures/reducers/select/05/metadata.json
new file mode 100644
index 0000000..08fe906
--- /dev/null
+++ b/test-fixtures/reducers/select/05/metadata.json
@@ -0,0 +1,4 @@
+{
+ "description": "Normalize subfield values (base and source are equal) --> return base",
+ "tagPatternRegExp": "^010$"
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/select/05/source.json b/test-fixtures/reducers/select/05/source.json
new file mode 100644
index 0000000..38a8713
--- /dev/null
+++ b/test-fixtures/reducers/select/05/source.json
@@ -0,0 +1,24 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "Héllõ .,-/ Wörld .,-/#!$%^&*;:{}=_`~()[]"
+ },
+ {
+ "code": "b",
+ "value": " çšŕ#!$%ňŭųœ #!$%ËÑĶãýğĝŧŵ"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/select/06/base.json b/test-fixtures/reducers/select/06/base.json
new file mode 100644
index 0000000..e578e80
--- /dev/null
+++ b/test-fixtures/reducers/select/06/base.json
@@ -0,0 +1,28 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "Héllõ .,-/ Wörld .,-/#!$%^&*;:{}=_`~()[]"
+ },
+ {
+ "code": "a",
+ "value": "jotain"
+ },
+ {
+ "code": "b",
+ "value": " çšŕ#!$%ňŭųœ #!$%ËÑĶãýğĝŧŵ"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/select/06/merged.json b/test-fixtures/reducers/select/06/merged.json
new file mode 100644
index 0000000..e578e80
--- /dev/null
+++ b/test-fixtures/reducers/select/06/merged.json
@@ -0,0 +1,28 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "Héllõ .,-/ Wörld .,-/#!$%^&*;:{}=_`~()[]"
+ },
+ {
+ "code": "a",
+ "value": "jotain"
+ },
+ {
+ "code": "b",
+ "value": " çšŕ#!$%ňŭųœ #!$%ËÑĶãýğĝŧŵ"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/select/06/metadata.json b/test-fixtures/reducers/select/06/metadata.json
new file mode 100644
index 0000000..7ec92f5
--- /dev/null
+++ b/test-fixtures/reducers/select/06/metadata.json
@@ -0,0 +1,4 @@
+{
+ "description": "Two subfields, both equal --> return base",
+ "tagPatternRegExp": "^010$"
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/select/06/source.json b/test-fixtures/reducers/select/06/source.json
new file mode 100644
index 0000000..e644825
--- /dev/null
+++ b/test-fixtures/reducers/select/06/source.json
@@ -0,0 +1,28 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "jotain"
+ },
+ {
+ "code": "a",
+ "value": "Héllõ .,-/ Wörld .,-/#!$%^&*;:{}=_`~()[]"
+ },
+ {
+ "code": "b",
+ "value": " çšŕ#!$%ňŭųœ #!$%ËÑĶãýğĝŧŵ"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/select/07/base.json b/test-fixtures/reducers/select/07/base.json
new file mode 100644
index 0000000..116e53c
--- /dev/null
+++ b/test-fixtures/reducers/select/07/base.json
@@ -0,0 +1,24 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "Héllõ .,-/"
+ },
+ {
+ "code": "b",
+ "value": " çšŕ#!$%ňŭųœ "
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/select/07/merged.json b/test-fixtures/reducers/select/07/merged.json
new file mode 100644
index 0000000..38a8713
--- /dev/null
+++ b/test-fixtures/reducers/select/07/merged.json
@@ -0,0 +1,24 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "Héllõ .,-/ Wörld .,-/#!$%^&*;:{}=_`~()[]"
+ },
+ {
+ "code": "b",
+ "value": " çšŕ#!$%ňŭųœ #!$%ËÑĶãýğĝŧŵ"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/select/07/metadata.json b/test-fixtures/reducers/select/07/metadata.json
new file mode 100644
index 0000000..6c3a423
--- /dev/null
+++ b/test-fixtures/reducers/select/07/metadata.json
@@ -0,0 +1,5 @@
+{
+ "description": "Two subfields, same codes, values of source are subsets of values of base --> replaceBasefieldWithSourcefield",
+ "tagPatternRegExp": "^010$",
+ "useSubsetEquality": true
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/select/07/source.json b/test-fixtures/reducers/select/07/source.json
new file mode 100644
index 0000000..38a8713
--- /dev/null
+++ b/test-fixtures/reducers/select/07/source.json
@@ -0,0 +1,24 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "Héllõ .,-/ Wörld .,-/#!$%^&*;:{}=_`~()[]"
+ },
+ {
+ "code": "b",
+ "value": " çšŕ#!$%ňŭųœ #!$%ËÑĶãýğĝŧŵ"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/select/08/base.json b/test-fixtures/reducers/select/08/base.json
new file mode 100644
index 0000000..38a8713
--- /dev/null
+++ b/test-fixtures/reducers/select/08/base.json
@@ -0,0 +1,24 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "Héllõ .,-/ Wörld .,-/#!$%^&*;:{}=_`~()[]"
+ },
+ {
+ "code": "b",
+ "value": " çšŕ#!$%ňŭųœ #!$%ËÑĶãýğĝŧŵ"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/select/08/merged.json b/test-fixtures/reducers/select/08/merged.json
new file mode 100644
index 0000000..38a8713
--- /dev/null
+++ b/test-fixtures/reducers/select/08/merged.json
@@ -0,0 +1,24 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "Héllõ .,-/ Wörld .,-/#!$%^&*;:{}=_`~()[]"
+ },
+ {
+ "code": "b",
+ "value": " çšŕ#!$%ňŭųœ #!$%ËÑĶãýğĝŧŵ"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/select/08/metadata.json b/test-fixtures/reducers/select/08/metadata.json
new file mode 100644
index 0000000..e7831b4
--- /dev/null
+++ b/test-fixtures/reducers/select/08/metadata.json
@@ -0,0 +1,4 @@
+{
+ "description": "Two subfields, one is a subset, one has a different code --> return base",
+ "tagPatternRegExp": "^010"
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/select/08/source.json b/test-fixtures/reducers/select/08/source.json
new file mode 100644
index 0000000..2c1f2fe
--- /dev/null
+++ b/test-fixtures/reducers/select/08/source.json
@@ -0,0 +1,24 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "c",
+ "value": "And now for something completely different"
+ },
+ {
+ "code": "b",
+ "value": " çšŕ#!$%ňŭųœ #!$%ËÑĶãýğĝŧŵ"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/select/09/base.json b/test-fixtures/reducers/select/09/base.json
new file mode 100644
index 0000000..f173ff2
--- /dev/null
+++ b/test-fixtures/reducers/select/09/base.json
@@ -0,0 +1,24 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "Héllõ .,-/ Wörld .,-/#!$%^&*;:{}=_`~()[]"
+ },
+ {
+ "code": "b",
+ "value": "Boo"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/select/09/merged.json b/test-fixtures/reducers/select/09/merged.json
new file mode 100644
index 0000000..f173ff2
--- /dev/null
+++ b/test-fixtures/reducers/select/09/merged.json
@@ -0,0 +1,24 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "Héllõ .,-/ Wörld .,-/#!$%^&*;:{}=_`~()[]"
+ },
+ {
+ "code": "b",
+ "value": "Boo"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/select/09/metadata.json b/test-fixtures/reducers/select/09/metadata.json
new file mode 100644
index 0000000..8b1b7fe
--- /dev/null
+++ b/test-fixtures/reducers/select/09/metadata.json
@@ -0,0 +1,4 @@
+{
+ "description": "Two subfields, same codes, values are not subsets --> return base",
+ "tagPatternRegExp": "^010$"
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/select/09/source.json b/test-fixtures/reducers/select/09/source.json
new file mode 100644
index 0000000..25e4c25
--- /dev/null
+++ b/test-fixtures/reducers/select/09/source.json
@@ -0,0 +1,24 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "Höwdy Êárth"
+ },
+ {
+ "code": "b",
+ "value": " çšŕ#!$%ňŭųœ #!$%ËÑĶãýğĝŧŵ"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/select/10/base.json b/test-fixtures/reducers/select/10/base.json
new file mode 100644
index 0000000..38a8713
--- /dev/null
+++ b/test-fixtures/reducers/select/10/base.json
@@ -0,0 +1,24 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "Héllõ .,-/ Wörld .,-/#!$%^&*;:{}=_`~()[]"
+ },
+ {
+ "code": "b",
+ "value": " çšŕ#!$%ňŭųœ #!$%ËÑĶãýğĝŧŵ"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/select/10/merged.json b/test-fixtures/reducers/select/10/merged.json
new file mode 100644
index 0000000..790826f
--- /dev/null
+++ b/test-fixtures/reducers/select/10/merged.json
@@ -0,0 +1,28 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "Héllõ .,-/ Wörld .,-/#!$%^&*;:{}=_`~()[]"
+ },
+ {
+ "code": "b",
+ "value": " çšŕ#!$%ňŭųœ #!$%ËÑĶãýğĝŧŵ"
+ },
+ {
+ "code": "c",
+ "value": "And now for something completely different"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/select/10/metadata.json b/test-fixtures/reducers/select/10/metadata.json
new file mode 100644
index 0000000..d69fcc7
--- /dev/null
+++ b/test-fixtures/reducers/select/10/metadata.json
@@ -0,0 +1,5 @@
+{
+ "description": "SourceField is a proper superset of baseField (subfields a and b are equal, c is new) --> replaceBasefieldWithSourcefield",
+ "tagPatternRegExp": "^010$",
+ "useSubsetEquality": true
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/select/10/source.json b/test-fixtures/reducers/select/10/source.json
new file mode 100644
index 0000000..790826f
--- /dev/null
+++ b/test-fixtures/reducers/select/10/source.json
@@ -0,0 +1,28 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "Héllõ .,-/ Wörld .,-/#!$%^&*;:{}=_`~()[]"
+ },
+ {
+ "code": "b",
+ "value": " çšŕ#!$%ňŭųœ #!$%ËÑĶãýğĝŧŵ"
+ },
+ {
+ "code": "c",
+ "value": "And now for something completely different"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/select/11/base.json b/test-fixtures/reducers/select/11/base.json
new file mode 100644
index 0000000..f173ff2
--- /dev/null
+++ b/test-fixtures/reducers/select/11/base.json
@@ -0,0 +1,24 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "Héllõ .,-/ Wörld .,-/#!$%^&*;:{}=_`~()[]"
+ },
+ {
+ "code": "b",
+ "value": "Boo"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/select/11/merged.json b/test-fixtures/reducers/select/11/merged.json
new file mode 100644
index 0000000..f173ff2
--- /dev/null
+++ b/test-fixtures/reducers/select/11/merged.json
@@ -0,0 +1,24 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "Héllõ .,-/ Wörld .,-/#!$%^&*;:{}=_`~()[]"
+ },
+ {
+ "code": "b",
+ "value": "Boo"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/select/11/metadata.json b/test-fixtures/reducers/select/11/metadata.json
new file mode 100644
index 0000000..bb965a2
--- /dev/null
+++ b/test-fixtures/reducers/select/11/metadata.json
@@ -0,0 +1,4 @@
+{
+ "description": "SourceField is not a proper superset of baseField (different values in a and b, also new subfield c) --> return base",
+ "tagPatternRegExp": "^010$"
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/select/11/source.json b/test-fixtures/reducers/select/11/source.json
new file mode 100644
index 0000000..857e6ac
--- /dev/null
+++ b/test-fixtures/reducers/select/11/source.json
@@ -0,0 +1,28 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "Höwdy Êárth"
+ },
+ {
+ "code": "b",
+ "value": " çšŕ#!$%ňŭųœ #!$%ËÑĶãýğĝŧŵ"
+ },
+ {
+ "code": "c",
+ "value": "And now for something completely different"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/select/12/base.json b/test-fixtures/reducers/select/12/base.json
new file mode 100644
index 0000000..8448a2a
--- /dev/null
+++ b/test-fixtures/reducers/select/12/base.json
@@ -0,0 +1,24 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "Héllõ"
+ },
+ {
+ "code": "b",
+ "value": " çšŕ#!$%ňŭųœ "
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/select/12/merged.json b/test-fixtures/reducers/select/12/merged.json
new file mode 100644
index 0000000..790826f
--- /dev/null
+++ b/test-fixtures/reducers/select/12/merged.json
@@ -0,0 +1,28 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "Héllõ .,-/ Wörld .,-/#!$%^&*;:{}=_`~()[]"
+ },
+ {
+ "code": "b",
+ "value": " çšŕ#!$%ňŭųœ #!$%ËÑĶãýğĝŧŵ"
+ },
+ {
+ "code": "c",
+ "value": "And now for something completely different"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/select/12/metadata.json b/test-fixtures/reducers/select/12/metadata.json
new file mode 100644
index 0000000..06851f4
--- /dev/null
+++ b/test-fixtures/reducers/select/12/metadata.json
@@ -0,0 +1,5 @@
+{
+ "description": "SourceField is a proper superset of baseField (base values a and b are subsets of source values a and b, c is new in source) --> replaceBasefieldWithSourcefield",
+ "tagPatternRegExp": "^010$",
+ "useSubsetEquality": true
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/select/12/source.json b/test-fixtures/reducers/select/12/source.json
new file mode 100644
index 0000000..790826f
--- /dev/null
+++ b/test-fixtures/reducers/select/12/source.json
@@ -0,0 +1,28 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "Héllõ .,-/ Wörld .,-/#!$%^&*;:{}=_`~()[]"
+ },
+ {
+ "code": "b",
+ "value": " çšŕ#!$%ňŭųœ #!$%ËÑĶãýğĝŧŵ"
+ },
+ {
+ "code": "c",
+ "value": "And now for something completely different"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/select/13/base.json b/test-fixtures/reducers/select/13/base.json
new file mode 100644
index 0000000..790826f
--- /dev/null
+++ b/test-fixtures/reducers/select/13/base.json
@@ -0,0 +1,28 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "Héllõ .,-/ Wörld .,-/#!$%^&*;:{}=_`~()[]"
+ },
+ {
+ "code": "b",
+ "value": " çšŕ#!$%ňŭųœ #!$%ËÑĶãýğĝŧŵ"
+ },
+ {
+ "code": "c",
+ "value": "And now for something completely different"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/select/13/merged.json b/test-fixtures/reducers/select/13/merged.json
new file mode 100644
index 0000000..790826f
--- /dev/null
+++ b/test-fixtures/reducers/select/13/merged.json
@@ -0,0 +1,28 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "Héllõ .,-/ Wörld .,-/#!$%^&*;:{}=_`~()[]"
+ },
+ {
+ "code": "b",
+ "value": " çšŕ#!$%ňŭųœ #!$%ËÑĶãýğĝŧŵ"
+ },
+ {
+ "code": "c",
+ "value": "And now for something completely different"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/select/13/metadata.json b/test-fixtures/reducers/select/13/metadata.json
new file mode 100644
index 0000000..7b5ff8c
--- /dev/null
+++ b/test-fixtures/reducers/select/13/metadata.json
@@ -0,0 +1,4 @@
+{
+ "description": "Opposite of test 12, baseField is a proper superset of sourceField --> return base",
+ "tagPatternRegExp": "^010$"
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/select/13/source.json b/test-fixtures/reducers/select/13/source.json
new file mode 100644
index 0000000..8448a2a
--- /dev/null
+++ b/test-fixtures/reducers/select/13/source.json
@@ -0,0 +1,24 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "Héllõ"
+ },
+ {
+ "code": "b",
+ "value": " çšŕ#!$%ňŭųœ "
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/select/14/base.json b/test-fixtures/reducers/select/14/base.json
new file mode 100644
index 0000000..fcd6ad8
--- /dev/null
+++ b/test-fixtures/reducers/select/14/base.json
@@ -0,0 +1,24 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "Москва !?&"
+ },
+ {
+ "code": "b",
+ "value": "Академия %&?, наук СССР"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/select/14/merged.json b/test-fixtures/reducers/select/14/merged.json
new file mode 100644
index 0000000..fcd6ad8
--- /dev/null
+++ b/test-fixtures/reducers/select/14/merged.json
@@ -0,0 +1,24 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "Москва !?&"
+ },
+ {
+ "code": "b",
+ "value": "Академия %&?, наук СССР"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/select/14/metadata.json b/test-fixtures/reducers/select/14/metadata.json
new file mode 100644
index 0000000..bb9cedf
--- /dev/null
+++ b/test-fixtures/reducers/select/14/metadata.json
@@ -0,0 +1,4 @@
+{
+ "description": "Normalization test with Cyrillic characters",
+ "tagPatternRegExp": "^010$"
+}
\ No newline at end of file
diff --git a/test-fixtures/reducers/select/14/source.json b/test-fixtures/reducers/select/14/source.json
new file mode 100644
index 0000000..fcd6ad8
--- /dev/null
+++ b/test-fixtures/reducers/select/14/source.json
@@ -0,0 +1,24 @@
+{
+ "leader": "01331cam a22003494i 4500",
+ "fields": [
+ {
+ "tag": "001",
+ "value": "007346734"
+ },
+ {
+ "tag": "010",
+ "ind1": " ",
+ "ind2": " ",
+ "subfields": [
+ {
+ "code": "a",
+ "value": "Москва !?&"
+ },
+ {
+ "code": "b",
+ "value": "Академия %&?, наук СССР"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test/browser/main.spec.js b/test/browser/main.spec.js
deleted file mode 100644
index 7d13e65..0000000
--- a/test/browser/main.spec.js
+++ /dev/null
@@ -1,96 +0,0 @@
-/**
- *
- * @licstart The following is the entire license notice for the JavaScript code in this file.
- *
- * A configurable Javascript module for merging MARC records
- *
- * Copyright (c) 2015-2017 University Of Helsinki (The National Library Of Finland)
- *
- * This file is part of marc-record-merge
- *
- * marc-record-merge is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- *
- * @licend The above is the entire license notice
- * for the JavaScript code in this file.
- *
- **/
-
-(function (root, factory) {
-
- 'use strict';
-
- define([
- '../test',
- '@natlibfi/es6-polyfills/lib/polyfills/promise',
- 'require'
- ], factory);
-
-}(this, factory));
-
-function factory(runTests, Promise, require)
-{
-
- function xhrGetPromise(path)
- {
- return new Promise(function(resolve, reject) {
-
- var xhr = new XMLHttpRequest();
- xhr.open('GET', path);
-
- xhr.addEventListener('load', function() {
- if (xhr.status >= 200 && xhr.status < 300 || xhr.status === 404) {
- resolve(xhr.responseText);
- } else {
- reject(new Error(xhr.status+' : '+xhr.statusText));
- }
- });
- xhr.addEventListener('error', function() {
- reject(new Error(xhr.status+' : '+xhr.statusText));
- });
-
- xhr.send(null);
-
- });
- }
-
- function getResources(name_data, name_config)
- {
- return Promise.all([
- xhrGetPromise('/base/test/suites/config/' + name_config + '.json').then(function(data) {return JSON.parse(data);}),
- xhrGetPromise('/base/test/suites/data/' + name_data + '/preferred'),
- xhrGetPromise('/base/test/suites/data/' + name_data + '/other'),
- xhrGetPromise('/base/test/suites/data/' + name_data + '/merged'),
- ]).then(function(resources) {
-
- var obj = {
- config: resources[0],
- data: {
- preferred: resources[1],
- other: resources[2]
- }
- };
-
- if (resources[3]) {
- obj.data.merged = resources[3];
- }
-
- return obj;
-
- });
- }
-
- runTests(getResources);
-
-}
-
diff --git a/test/nodejs/main.spec.js b/test/nodejs/main.spec.js
deleted file mode 100644
index 9ce9b41..0000000
--- a/test/nodejs/main.spec.js
+++ /dev/null
@@ -1,71 +0,0 @@
-/**
- *
- * @licstart The following is the entire license notice for the JavaScript code in this file.
- *
- * A configurable Javascript module for merging MARC records
- *
- * Copyright (c) 2015-2017 University Of Helsinki (The National Library Of Finland)
- *
- * This file is part of marc-record-merge
- *
- * marc-record-merge is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- *
- * @licend The above is the entire license notice
- * for the JavaScript code in this file.
- *
- **/
-
-(function (root, factory) {
-
- 'use strict';
-
- module.exports = factory(
- require('../test'),
- require('@natlibfi/es6-polyfills/lib/polyfills/promise'),
- require('fs'),
- require('path')
- );
-
-}(this, factory));
-
-function factory(runTests, Promise, fs, path)
-{
-
- function getResources(name_data, name_config)
- {
-
- var obj = {},
- path_base = path.join(path.dirname(module.filename), '..', 'suites');
-
- obj.config = JSON.parse(fs.readFileSync(path.join(path_base, 'config', name_config + '.json'), {
- encoding: 'utf8'
- }));
-
- obj.data = {
- preferred: fs.readFileSync(path.join(path_base, 'data', name_data, 'preferred'), {encoding: 'utf8'}),
- other: fs.readFileSync(path.join(path_base, 'data', name_data, 'other'), {encoding: 'utf8'})
- };
-
- if (fs.existsSync(path.join(path_base, 'data', name_data, 'merged'))) {
- obj.data.merged = fs.readFileSync(path.join(path_base, 'data', name_data, 'merged'), {encoding: 'utf8'});
- }
-
- return Promise.resolve(obj);
-
- }
-
- runTests(getResources);
-
-}
-
diff --git a/test/suites/74.json b/test/suites/74.json
deleted file mode 100644
index 9246fa1..0000000
--- a/test/suites/74.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "fields": {
- "007": {
- "action": "controlfield"
- },
- "100": {
- "action": "copy"
- }
- }
-}
diff --git a/test/suites/config/1to3.json b/test/suites/config/1to3.json
deleted file mode 100644
index 9246fa1..0000000
--- a/test/suites/config/1to3.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "fields": {
- "007": {
- "action": "controlfield"
- },
- "100": {
- "action": "copy"
- }
- }
-}
diff --git a/test/suites/config/27to28.json b/test/suites/config/27to28.json
deleted file mode 100644
index ce50593..0000000
--- a/test/suites/config/27to28.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "fields": {
- "5..": {
- "action": "copy"
- },
- "6[1-4].": {
- "action": "copy"
- }
- }
-}
diff --git a/test/suites/config/29to31.json b/test/suites/config/29to31.json
deleted file mode 100644
index 2477fc8..0000000
--- a/test/suites/config/29to31.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "fields": {
- "041": {
- "action": "selectBetter",
- "options": {
- "onlyIfMissing": true
- }
- }
- }
-}
diff --git a/test/suites/config/32to40.json b/test/suites/config/32to40.json
deleted file mode 100644
index 2a9f544..0000000
--- a/test/suites/config/32to40.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- "fields": {
- "300": {
- "action": "selectBetter"
- },
- "500": {
- "action": "copy"
- },
- "260": {
- "action": "selectBetter",
- "options": {
- "comparator" : "substring"
- }
- }
- }
-}
diff --git a/test/suites/config/41to43.json b/test/suites/config/41to43.json
deleted file mode 100644
index af20170..0000000
--- a/test/suites/config/41to43.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "fields": {
- "250": {
- "action": "selectBetter",
- "options": {
- "requireFieldInBoth": true
- }
- }
- }
-}
diff --git a/test/suites/config/44to56.json b/test/suites/config/44to56.json
deleted file mode 100644
index 8c206fe..0000000
--- a/test/suites/config/44to56.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
- "fields": {
- "020": {
- "action": "copy",
- "options": {
- "compareWithout": [
- "z",
- "c",
- "q"
- ],
- "combine": ["c"]
- }
- }
- }
-}
diff --git a/test/suites/config/4to26.json b/test/suites/config/4to26.json
deleted file mode 100644
index d2cd62c..0000000
--- a/test/suites/config/4to26.json
+++ /dev/null
@@ -1,81 +0,0 @@
-{
- "fields": {
- "022": {
- "action": "copy",
- "options": {
- "compareWithoutIndicators": true
- }
- },
- "300": {
- "action": "copy"
- },
- "500": {
- "action": "copy"
- },
- "490": {
- "action": "copy",
- "options": {
- "compareWithout": ["9"],
- "mustBeIdentical": true
- }
- },
- "6..": {
- "action": "copy",
- "options": {
- "compareWithout": ["9"],
- "mustBeIdentical": true
- }
- },
- "600": {
- "action": "copy",
- "options": {
- "compareWithout": [
- "9",
- "e",
- "4"
- ]
- }
- },
- "610": {
- "action": "copy",
- "options": {
- "compareWithout": [
- "9",
- "e",
- "4"
- ]
- }
- },
- "611": {
- "action": "copy",
- "options": {
- "compareWithout": [
- "9",
- "e",
- "4"
- ]
- }
- },
- "700": {
- "action": "copy",
- "options": {
- "compareWithout": [
- "9",
- "4",
- "e"
- ]
- }
- },
- "710": {
- "action": "copy",
- "options": {
- "compareWithout": [
- "9",
- "e",
- "4"
- ]
- }
- }
- }
-}
-
diff --git a/test/suites/config/57to63.json b/test/suites/config/57to63.json
deleted file mode 100644
index 605aede..0000000
--- a/test/suites/config/57to63.json
+++ /dev/null
@@ -1,63 +0,0 @@
-{
- "fields": {
- "300": {
- "action": "selectBetter"
- },
- "500": {
- "action": "copy"
- },
- "490": {
- "action": "moveSubfields",
- "options": {
- "subfields": ["9"]
- }
- },
- "6..": {
- "action": "copy",
- "options": {
- "compareWithout": ["9"],
- "mustBeIdentical": false
- }
- },
- "600": {
- "action": "copy",
- "options": {
- "compareWithout": [
- "9",
- "e",
- "4"
- ]
- }
- },
- "610": {
- "action": "copy",
- "options": {
- "compareWithout": [
- "9",
- "e",
- "4"
- ]
- }
- },
- "611": {
- "action": "copy",
- "options": {
- "compareWithout": [
- "9",
- "e",
- "4"
- ]
- }
- },
- "700": {
- "action": "copy",
- "options": {
- "compareWithout": [
- "9",
- "4",
- "e"
- ]
- }
- }
- }
-}
diff --git a/test/suites/config/64.json b/test/suites/config/64.json
deleted file mode 100644
index c86b821..0000000
--- a/test/suites/config/64.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "fields": {
- "100": {
- "action": "chooseField100FromOther"
- }
- }
-}
diff --git a/test/suites/config/65.json b/test/suites/config/65.json
deleted file mode 100644
index 7b00c2e..0000000
--- a/test/suites/config/65.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
- "fields": {
- "130": {
- "action": "copy",
- "options": {
- "transformOnInequality": {
- "tag": "930",
- "add": {
- "z": "fubar"
- },
- "map": {
- "b": "a"
- },
- "drop": ["b"]
- }
- }
- }
- }
-}
diff --git a/test/suites/config/66.json b/test/suites/config/66.json
deleted file mode 100644
index 4ab4d15..0000000
--- a/test/suites/config/66.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "fields": {
- "773": {
- "action": "copy",
- "options": {
- "compareWithout": ["z"],
- "pick": {
- "subfields": ["z"]
- }
- }
- }
- }
-}
diff --git a/test/suites/config/67.json b/test/suites/config/67.json
deleted file mode 100644
index 8a6eece..0000000
--- a/test/suites/config/67.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
- "fields": {
- "773": {
- "action": "copy",
- "options": {
- "compareWithout": ["z", "q", "g"],
- "pick": {
- "subfields": ["b", "g", "q"],
- "missingOnly": true
- }
- }
- }
- }
-}
diff --git a/test/suites/config/68.json b/test/suites/config/68.json
deleted file mode 100644
index fcb6786..0000000
--- a/test/suites/config/68.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "fields": {
- "773": {
- "action": "selectBetter",
- "options": {
- "pick": {
- "subfields": ["g", "q"]
- }
- }
- }
- }
-}
\ No newline at end of file
diff --git a/test/suites/config/69.json b/test/suites/config/69.json
deleted file mode 100644
index fcb6786..0000000
--- a/test/suites/config/69.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "fields": {
- "773": {
- "action": "selectBetter",
- "options": {
- "pick": {
- "subfields": ["g", "q"]
- }
- }
- }
- }
-}
\ No newline at end of file
diff --git a/test/suites/config/70.json b/test/suites/config/70.json
deleted file mode 100644
index 5a96a0c..0000000
--- a/test/suites/config/70.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "fields": {
- "773": {
- "action": "selectBetter",
- "options": {
- "pick": {
- "subfields": ["g", "q"],
- "missingOnly": true
- }
- }
- }
- }
-}
\ No newline at end of file
diff --git a/test/suites/config/71.json b/test/suites/config/71.json
deleted file mode 100644
index c8317ec..0000000
--- a/test/suites/config/71.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "fields": {
- "100": {
- "action": "copy"
- }
- },
- "sort": {
- "insert": "before"
- }
-}
\ No newline at end of file
diff --git a/test/suites/config/72.json b/test/suites/config/72.json
deleted file mode 100644
index 0e76823..0000000
--- a/test/suites/config/72.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "fields": {
- "FOO": {
- "action": "copy"
- }
- },
- "sort": {
- "indexes": {
- "FOO": 150
- }
- }
-}
\ No newline at end of file
diff --git a/test/suites/config/73.json b/test/suites/config/73.json
deleted file mode 100644
index 4408e78..0000000
--- a/test/suites/config/73.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "fields": {
- "773": {
- "action": "selectBetter",
- "options": {
- "skipMissing": true
- }
- }
- }
-}
\ No newline at end of file
diff --git a/test/suites/config/76.json b/test/suites/config/76.json
deleted file mode 100644
index 9fac99b..0000000
--- a/test/suites/config/76.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "fields": {
- "773": {
- "action": "copy",
- "options": {
- "compareWithout": ["z", "q", "g"],
- "pick": {
- "subfields": ["g", "q"]
- }
- }
- }
- }
-}
diff --git a/test/suites/config/77.json b/test/suites/config/77.json
deleted file mode 100644
index fbd54c3..0000000
--- a/test/suites/config/77.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
- "fields": {
- "500": {
- "action": "copy",
- "options": {
- "compareWithout": ["b"],
- "compareSubfieldsNormalized": true
- }
- }
- }
-}
diff --git a/test/suites/config/78to79.json b/test/suites/config/78to79.json
deleted file mode 100644
index 40c78ee..0000000
--- a/test/suites/config/78to79.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "fields": {
- "500": {
- "action": "copy",
- "options": {
- "copyIf": {
- "a": { "value": "keep" }
- }
- }
- }
- }
-}
diff --git a/test/suites/config/80to81.json b/test/suites/config/80to81.json
deleted file mode 100644
index cf4e9c4..0000000
--- a/test/suites/config/80to81.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "fields": {
- "500": {
- "action": "copy",
- "options": {
- "copyUnless": {
- "a": { "value": "drop" }
- }
- }
- }
- }
-}
diff --git a/test/suites/config/82.json b/test/suites/config/82.json
deleted file mode 100644
index 4cff5c8..0000000
--- a/test/suites/config/82.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "fields": {
- "500": {
- "action": "copy",
- "options": {
- "dropOriginal": true
- }
- }
- }
-}
diff --git a/test/suites/config/83to85.json b/test/suites/config/83to85.json
deleted file mode 100644
index df9405d..0000000
--- a/test/suites/config/83to85.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
- "fields": {
- "650": {
- "action": "copy",
- "options": {
- "reduce": {
- "subfields": ["9"],
- "condition": "unless",
- "value": "FENNI"
- },
- "compareWithout": ["9"]
- }
- }
- }
-}
diff --git a/test/suites/config/86.json b/test/suites/config/86.json
deleted file mode 100644
index fd76e60..0000000
--- a/test/suites/config/86.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- "fields": {
- "650": {
- "action": "copy",
- "options": {
- "reduce": {
- "subfields": ["9"],
- "condition": "unless",
- "value": "FENNI",
- "exact": true
- },
- "compareWithout": ["9"]
- }
- }
- }
-}
diff --git a/test/suites/config/87.json b/test/suites/config/87.json
deleted file mode 100644
index 396a4b6..0000000
--- a/test/suites/config/87.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
- "fields": {
- "650": {
- "action": "copy",
- "options": {
- "reduce": {
- "subfields": ["9"],
- "condition": "if",
- "value": "FENNI"
- },
- "compareWithout": ["9"]
- }
- }
- }
-}
diff --git a/test/suites/config/88.json b/test/suites/config/88.json
deleted file mode 100644
index 49de6f4..0000000
--- a/test/suites/config/88.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- "fields": {
- "650": {
- "action": "copy",
- "options": {
- "reduce": {
- "subfields": ["9"],
- "condition": "if",
- "value": "FENNI",
- "exact": true
- },
- "compareWithout": ["9"]
- }
- }
- }
-}
diff --git a/test/suites/data/1/merged b/test/suites/data/1/merged
deleted file mode 100644
index 174632e..0000000
--- a/test/suites/data/1/merged
+++ /dev/null
@@ -1,3 +0,0 @@
-LDR
-007 tu
-100 __ ‡aThis is data
\ No newline at end of file
diff --git a/test/suites/data/1/other b/test/suites/data/1/other
deleted file mode 100644
index 174632e..0000000
--- a/test/suites/data/1/other
+++ /dev/null
@@ -1,3 +0,0 @@
-LDR
-007 tu
-100 __ ‡aThis is data
\ No newline at end of file
diff --git a/test/suites/data/1/preferred b/test/suites/data/1/preferred
deleted file mode 100644
index f092ee3..0000000
--- a/test/suites/data/1/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-100 __ ‡aThis is data
\ No newline at end of file
diff --git a/test/suites/data/10/descr b/test/suites/data/10/descr
deleted file mode 100644
index dd85e4d..0000000
--- a/test/suites/data/10/descr
+++ /dev/null
@@ -1 +0,0 @@
-should normalize for comparison but preserve diacritics in move subfields action
diff --git a/test/suites/data/10/merged b/test/suites/data/10/merged
deleted file mode 100644
index 68da78a..0000000
--- a/test/suites/data/10/merged
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-490 #_ ‡aCafé
\ No newline at end of file
diff --git a/test/suites/data/10/other b/test/suites/data/10/other
deleted file mode 100644
index dc5c55d..0000000
--- a/test/suites/data/10/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-490 #_ ‡aCafe
\ No newline at end of file
diff --git a/test/suites/data/10/preferred b/test/suites/data/10/preferred
deleted file mode 100644
index 68da78a..0000000
--- a/test/suites/data/10/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-490 #_ ‡aCafé
\ No newline at end of file
diff --git a/test/suites/data/11/descr b/test/suites/data/11/descr
deleted file mode 100644
index 5c2f4c3..0000000
--- a/test/suites/data/11/descr
+++ /dev/null
@@ -1 +0,0 @@
-should normalize case for comparison but preserve it in copy action
diff --git a/test/suites/data/11/merged b/test/suites/data/11/merged
deleted file mode 100644
index 650fe10..0000000
--- a/test/suites/data/11/merged
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-500 #_ ‡aCafe
\ No newline at end of file
diff --git a/test/suites/data/11/other b/test/suites/data/11/other
deleted file mode 100644
index ef13dbc..0000000
--- a/test/suites/data/11/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-500 #_ ‡acaFE
\ No newline at end of file
diff --git a/test/suites/data/11/preferred b/test/suites/data/11/preferred
deleted file mode 100644
index 650fe10..0000000
--- a/test/suites/data/11/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-500 #_ ‡aCafe
\ No newline at end of file
diff --git a/test/suites/data/12/descr b/test/suites/data/12/descr
deleted file mode 100644
index 2a7f0f4..0000000
--- a/test/suites/data/12/descr
+++ /dev/null
@@ -1 +0,0 @@
-should normalize punctuation for comparison but preserve it in move subfields action
diff --git a/test/suites/data/12/merged b/test/suites/data/12/merged
deleted file mode 100644
index b27822c..0000000
--- a/test/suites/data/12/merged
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-490 #_ ‡aCafe.,-/#!$%^&*;:{}=-_`~()
\ No newline at end of file
diff --git a/test/suites/data/12/other b/test/suites/data/12/other
deleted file mode 100644
index 6321b1b..0000000
--- a/test/suites/data/12/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-490 #_ ‡aCafe$%^&*;:
\ No newline at end of file
diff --git a/test/suites/data/12/preferred b/test/suites/data/12/preferred
deleted file mode 100644
index b27822c..0000000
--- a/test/suites/data/12/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-490 #_ ‡aCafe.,-/#!$%^&*;:{}=-_`~()
\ No newline at end of file
diff --git a/test/suites/data/13/descr b/test/suites/data/13/descr
deleted file mode 100644
index 9ea2c3c..0000000
--- a/test/suites/data/13/descr
+++ /dev/null
@@ -1 +0,0 @@
-should handle controlfields correctly
diff --git a/test/suites/data/13/merged b/test/suites/data/13/merged
deleted file mode 100644
index 1a9a1a7..0000000
--- a/test/suites/data/13/merged
+++ /dev/null
@@ -1,3 +0,0 @@
-LDR
-008 861000s1972^^^^xxu|||||||||||||||||eng||
-490 #_ ‡aCafe.,-/#!$%^&*;:{}=-_`~()
\ No newline at end of file
diff --git a/test/suites/data/13/other b/test/suites/data/13/other
deleted file mode 100644
index 6321b1b..0000000
--- a/test/suites/data/13/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-490 #_ ‡aCafe$%^&*;:
\ No newline at end of file
diff --git a/test/suites/data/13/preferred b/test/suites/data/13/preferred
deleted file mode 100644
index 1a9a1a7..0000000
--- a/test/suites/data/13/preferred
+++ /dev/null
@@ -1,3 +0,0 @@
-LDR
-008 861000s1972^^^^xxu|||||||||||||||||eng||
-490 #_ ‡aCafe.,-/#!$%^&*;:{}=-_`~()
\ No newline at end of file
diff --git a/test/suites/data/14/descr b/test/suites/data/14/descr
deleted file mode 100644
index eca71e7..0000000
--- a/test/suites/data/14/descr
+++ /dev/null
@@ -1 +0,0 @@
-should select better field from preferred record
diff --git a/test/suites/data/14/merged b/test/suites/data/14/merged
deleted file mode 100644
index e159b0d..0000000
--- a/test/suites/data/14/merged
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-700 1_ ‡aRouhiainen, Veikko,‡d1952-
\ No newline at end of file
diff --git a/test/suites/data/14/other b/test/suites/data/14/other
deleted file mode 100644
index af42f1a..0000000
--- a/test/suites/data/14/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-700 1_ ‡aRouhiainen, Veikko.
\ No newline at end of file
diff --git a/test/suites/data/14/preferred b/test/suites/data/14/preferred
deleted file mode 100644
index e159b0d..0000000
--- a/test/suites/data/14/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-700 1_ ‡aRouhiainen, Veikko,‡d1952-
\ No newline at end of file
diff --git a/test/suites/data/15/descr b/test/suites/data/15/descr
deleted file mode 100644
index 262bb98..0000000
--- a/test/suites/data/15/descr
+++ /dev/null
@@ -1 +0,0 @@
-should select better field from other record
diff --git a/test/suites/data/15/merged b/test/suites/data/15/merged
deleted file mode 100644
index e159b0d..0000000
--- a/test/suites/data/15/merged
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-700 1_ ‡aRouhiainen, Veikko,‡d1952-
\ No newline at end of file
diff --git a/test/suites/data/15/other b/test/suites/data/15/other
deleted file mode 100644
index e159b0d..0000000
--- a/test/suites/data/15/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-700 1_ ‡aRouhiainen, Veikko,‡d1952-
\ No newline at end of file
diff --git a/test/suites/data/15/preferred b/test/suites/data/15/preferred
deleted file mode 100644
index af42f1a..0000000
--- a/test/suites/data/15/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-700 1_ ‡aRouhiainen, Veikko.
\ No newline at end of file
diff --git a/test/suites/data/16/descr b/test/suites/data/16/descr
deleted file mode 100644
index 81886cb..0000000
--- a/test/suites/data/16/descr
+++ /dev/null
@@ -1 +0,0 @@
-should select better field from other record, making comparison without 'compareWithout' subfields.
diff --git a/test/suites/data/16/merged b/test/suites/data/16/merged
deleted file mode 100644
index 1e1a687..0000000
--- a/test/suites/data/16/merged
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-700 1_ ‡aRouhiainen, Veikko,‡d1952-‡9FENNI‡9OULA
\ No newline at end of file
diff --git a/test/suites/data/16/other b/test/suites/data/16/other
deleted file mode 100644
index 98b2b2c..0000000
--- a/test/suites/data/16/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-700 1_ ‡aRouhiainen, Veikko,‡d1952-‡9OULA
\ No newline at end of file
diff --git a/test/suites/data/16/preferred b/test/suites/data/16/preferred
deleted file mode 100644
index 00c2f36..0000000
--- a/test/suites/data/16/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-700 1_ ‡aRouhiainen, Veikko.‡9FENNI
\ No newline at end of file
diff --git a/test/suites/data/17/descr b/test/suites/data/17/descr
deleted file mode 100644
index 64b2f93..0000000
--- a/test/suites/data/17/descr
+++ /dev/null
@@ -1 +0,0 @@
-should move only one instance of 'compareWithout' fields to merged
diff --git a/test/suites/data/17/merged b/test/suites/data/17/merged
deleted file mode 100644
index 1e1a687..0000000
--- a/test/suites/data/17/merged
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-700 1_ ‡aRouhiainen, Veikko,‡d1952-‡9FENNI‡9OULA
\ No newline at end of file
diff --git a/test/suites/data/17/other b/test/suites/data/17/other
deleted file mode 100644
index b2c2d0a..0000000
--- a/test/suites/data/17/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-700 1_ ‡aRouhiainen, Veikko,‡d1952-‡9OULA‡9FENNI
\ No newline at end of file
diff --git a/test/suites/data/17/preferred b/test/suites/data/17/preferred
deleted file mode 100644
index 00c2f36..0000000
--- a/test/suites/data/17/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-700 1_ ‡aRouhiainen, Veikko.‡9FENNI
\ No newline at end of file
diff --git a/test/suites/data/18/descr b/test/suites/data/18/descr
deleted file mode 100644
index c617622..0000000
--- a/test/suites/data/18/descr
+++ /dev/null
@@ -1 +0,0 @@
-should select better field from preferred record, making comparison without 'compareWithout' subfields.
diff --git a/test/suites/data/18/merged b/test/suites/data/18/merged
deleted file mode 100644
index 1e1a687..0000000
--- a/test/suites/data/18/merged
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-700 1_ ‡aRouhiainen, Veikko,‡d1952-‡9FENNI‡9OULA
\ No newline at end of file
diff --git a/test/suites/data/18/other b/test/suites/data/18/other
deleted file mode 100644
index 70178bb..0000000
--- a/test/suites/data/18/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-700 1_ ‡aRouhiainen, Veikko.‡9OULA
\ No newline at end of file
diff --git a/test/suites/data/18/preferred b/test/suites/data/18/preferred
deleted file mode 100644
index 7c74bab..0000000
--- a/test/suites/data/18/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-700 1_ ‡aRouhiainen, Veikko,‡d1952-‡9FENNI
\ No newline at end of file
diff --git a/test/suites/data/19/descr b/test/suites/data/19/descr
deleted file mode 100644
index f348805..0000000
--- a/test/suites/data/19/descr
+++ /dev/null
@@ -1 +0,0 @@
-should handle e subfields in field 700 with compareWithout setting.
diff --git a/test/suites/data/19/merged b/test/suites/data/19/merged
deleted file mode 100644
index e59d89a..0000000
--- a/test/suites/data/19/merged
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-700 1_ ‡aRouhiainen, Veikko,‡d1952-‡esov.‡esäv.
\ No newline at end of file
diff --git a/test/suites/data/19/other b/test/suites/data/19/other
deleted file mode 100644
index 4bf4f5e..0000000
--- a/test/suites/data/19/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-700 1_ ‡aRouhiainen, Veikko.‡esäv.
\ No newline at end of file
diff --git a/test/suites/data/19/preferred b/test/suites/data/19/preferred
deleted file mode 100644
index 8d1e717..0000000
--- a/test/suites/data/19/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-700 1_ ‡aRouhiainen, Veikko,‡d1952-‡esov.
\ No newline at end of file
diff --git a/test/suites/data/2/merged b/test/suites/data/2/merged
deleted file mode 100644
index 174632e..0000000
--- a/test/suites/data/2/merged
+++ /dev/null
@@ -1,3 +0,0 @@
-LDR
-007 tu
-100 __ ‡aThis is data
\ No newline at end of file
diff --git a/test/suites/data/2/other b/test/suites/data/2/other
deleted file mode 100644
index f092ee3..0000000
--- a/test/suites/data/2/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-100 __ ‡aThis is data
\ No newline at end of file
diff --git a/test/suites/data/2/preferred b/test/suites/data/2/preferred
deleted file mode 100644
index 174632e..0000000
--- a/test/suites/data/2/preferred
+++ /dev/null
@@ -1,3 +0,0 @@
-LDR
-007 tu
-100 __ ‡aThis is data
\ No newline at end of file
diff --git a/test/suites/data/20/descr b/test/suites/data/20/descr
deleted file mode 100644
index 4055b6b..0000000
--- a/test/suites/data/20/descr
+++ /dev/null
@@ -1 +0,0 @@
-should handle e subfields with compareWithout setting.
diff --git a/test/suites/data/20/merged b/test/suites/data/20/merged
deleted file mode 100644
index 0d2486d..0000000
--- a/test/suites/data/20/merged
+++ /dev/null
@@ -1,3 +0,0 @@
-LDR
-700 1_ ‡aRouhiainen, Heikki,‡d1952-‡esov.‡4zzk
-700 1_ ‡aRouhiainen, Veikko.‡esäv.‡9KEEP
\ No newline at end of file
diff --git a/test/suites/data/20/other b/test/suites/data/20/other
deleted file mode 100644
index 34df7c6..0000000
--- a/test/suites/data/20/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-700 1_ ‡aRouhiainen, Veikko.‡esäv.‡9KEEP
\ No newline at end of file
diff --git a/test/suites/data/20/preferred b/test/suites/data/20/preferred
deleted file mode 100644
index 6993965..0000000
--- a/test/suites/data/20/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-700 1_ ‡aRouhiainen, Heikki,‡d1952-‡esov.‡4zzk
\ No newline at end of file
diff --git a/test/suites/data/21/descr b/test/suites/data/21/descr
deleted file mode 100644
index e665193..0000000
--- a/test/suites/data/21/descr
+++ /dev/null
@@ -1 +0,0 @@
-should not mess up any fields.
diff --git a/test/suites/data/21/merged b/test/suites/data/21/merged
deleted file mode 100644
index 47b3d5b..0000000
--- a/test/suites/data/21/merged
+++ /dev/null
@@ -1,4 +0,0 @@
-LDR
-500 ‡aSelkänimeke: Ruotsi.
-650 7 ‡asanakirjat‡xsuomen kieli‡xruotsin kieli‡2ysa
-700 1 ‡aCantell, Ilse.
\ No newline at end of file
diff --git a/test/suites/data/21/other b/test/suites/data/21/other
deleted file mode 100644
index 47b3d5b..0000000
--- a/test/suites/data/21/other
+++ /dev/null
@@ -1,4 +0,0 @@
-LDR
-500 ‡aSelkänimeke: Ruotsi.
-650 7 ‡asanakirjat‡xsuomen kieli‡xruotsin kieli‡2ysa
-700 1 ‡aCantell, Ilse.
\ No newline at end of file
diff --git a/test/suites/data/21/preferred b/test/suites/data/21/preferred
deleted file mode 100644
index f54ad05..0000000
--- a/test/suites/data/21/preferred
+++ /dev/null
@@ -1,3 +0,0 @@
-LDR
-500 ‡aSelkänimeke: Ruotsi.
-700 1 ‡aCantell, Ilse.
\ No newline at end of file
diff --git a/test/suites/data/22/descr b/test/suites/data/22/descr
deleted file mode 100644
index e665193..0000000
--- a/test/suites/data/22/descr
+++ /dev/null
@@ -1 +0,0 @@
-should not mess up any fields.
diff --git a/test/suites/data/22/merged b/test/suites/data/22/merged
deleted file mode 100644
index 2f5f086..0000000
--- a/test/suites/data/22/merged
+++ /dev/null
@@ -1,10 +0,0 @@
-LDR
-500 ‡aSelkänimeke: Ruotsi.‡9FENNI
-650 7 ‡asanakirjat‡2ysa‡9FENNI
-650 7 ‡asuomen kieli‡2ysa‡9FENNI
-650 7 ‡aruotsin kieli‡2ysa‡9FENNI
-650 7 ‡asanakirjat‡xsuomen kieli‡xruotsin kieli‡2ysa
-650 7 ‡asanakirjat‡xruotsin kieli‡xsuomen kieli‡2ysa
-650 7 ‡aordböcker‡xfinska‡xsvenska‡2allars
-650 7 ‡aordböcker‡xsvenska‡xfinska‡2allars
-700 1 ‡aCantell, Ilse.
\ No newline at end of file
diff --git a/test/suites/data/22/other b/test/suites/data/22/other
deleted file mode 100644
index 15040f0..0000000
--- a/test/suites/data/22/other
+++ /dev/null
@@ -1,7 +0,0 @@
-LDR
-500 ‡aSelkänimeke: Ruotsi.
-650 7 ‡asanakirjat‡xsuomen kieli‡xruotsin kieli‡2ysa
-650 7 ‡asanakirjat‡xruotsin kieli‡xsuomen kieli‡2ysa
-650 7 ‡aordböcker‡xfinska‡xsvenska‡2allars
-650 7 ‡aordböcker‡xsvenska‡xfinska‡2allars
-700 1 ‡aCantell, Ilse.
\ No newline at end of file
diff --git a/test/suites/data/22/preferred b/test/suites/data/22/preferred
deleted file mode 100644
index 2f5f086..0000000
--- a/test/suites/data/22/preferred
+++ /dev/null
@@ -1,10 +0,0 @@
-LDR
-500 ‡aSelkänimeke: Ruotsi.‡9FENNI
-650 7 ‡asanakirjat‡2ysa‡9FENNI
-650 7 ‡asuomen kieli‡2ysa‡9FENNI
-650 7 ‡aruotsin kieli‡2ysa‡9FENNI
-650 7 ‡asanakirjat‡xsuomen kieli‡xruotsin kieli‡2ysa
-650 7 ‡asanakirjat‡xruotsin kieli‡xsuomen kieli‡2ysa
-650 7 ‡aordböcker‡xfinska‡xsvenska‡2allars
-650 7 ‡aordböcker‡xsvenska‡xfinska‡2allars
-700 1 ‡aCantell, Ilse.
\ No newline at end of file
diff --git a/test/suites/data/23/descr b/test/suites/data/23/descr
deleted file mode 100644
index 697493b..0000000
--- a/test/suites/data/23/descr
+++ /dev/null
@@ -1 +0,0 @@
-should use field from other record if the preferred record is proper subset. Note that only fields that have been marked in config will be handled.
diff --git a/test/suites/data/23/merged b/test/suites/data/23/merged
deleted file mode 100644
index 37a88ce..0000000
--- a/test/suites/data/23/merged
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-300 ‡a186 s. :‡bkuv.
\ No newline at end of file
diff --git a/test/suites/data/23/other b/test/suites/data/23/other
deleted file mode 100644
index 37a88ce..0000000
--- a/test/suites/data/23/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-300 ‡a186 s. :‡bkuv.
\ No newline at end of file
diff --git a/test/suites/data/23/preferred b/test/suites/data/23/preferred
deleted file mode 100644
index c5f164f..0000000
--- a/test/suites/data/23/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-300 ‡a186 s.
\ No newline at end of file
diff --git a/test/suites/data/24/descr b/test/suites/data/24/descr
deleted file mode 100644
index 770a2e3..0000000
--- a/test/suites/data/24/descr
+++ /dev/null
@@ -1 +0,0 @@
-should compare without indicators if compareWithoutIndicators options is true. Selects the field with most indicators.
diff --git a/test/suites/data/24/merged b/test/suites/data/24/merged
deleted file mode 100644
index d022fe5..0000000
--- a/test/suites/data/24/merged
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-022 0 ‡a0780-6922‡2a
\ No newline at end of file
diff --git a/test/suites/data/24/other b/test/suites/data/24/other
deleted file mode 100644
index ed1b179..0000000
--- a/test/suites/data/24/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-022 ‡a0780-6922‡2a
\ No newline at end of file
diff --git a/test/suites/data/24/preferred b/test/suites/data/24/preferred
deleted file mode 100644
index d022fe5..0000000
--- a/test/suites/data/24/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-022 0 ‡a0780-6922‡2a
\ No newline at end of file
diff --git a/test/suites/data/25/descr b/test/suites/data/25/descr
deleted file mode 100644
index 770a2e3..0000000
--- a/test/suites/data/25/descr
+++ /dev/null
@@ -1 +0,0 @@
-should compare without indicators if compareWithoutIndicators options is true. Selects the field with most indicators.
diff --git a/test/suites/data/25/merged b/test/suites/data/25/merged
deleted file mode 100644
index d022fe5..0000000
--- a/test/suites/data/25/merged
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-022 0 ‡a0780-6922‡2a
\ No newline at end of file
diff --git a/test/suites/data/25/other b/test/suites/data/25/other
deleted file mode 100644
index d022fe5..0000000
--- a/test/suites/data/25/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-022 0 ‡a0780-6922‡2a
\ No newline at end of file
diff --git a/test/suites/data/25/preferred b/test/suites/data/25/preferred
deleted file mode 100644
index ed1b179..0000000
--- a/test/suites/data/25/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-022 ‡a0780-6922‡2a
\ No newline at end of file
diff --git a/test/suites/data/26/descr b/test/suites/data/26/descr
deleted file mode 100644
index e5594b2..0000000
--- a/test/suites/data/26/descr
+++ /dev/null
@@ -1 +0,0 @@
-should only make superset comparisons when identical fields are not present.
diff --git a/test/suites/data/26/merged b/test/suites/data/26/merged
deleted file mode 100644
index 34f0f4d..0000000
--- a/test/suites/data/26/merged
+++ /dev/null
@@ -1,3 +0,0 @@
-LDR
-710 2 ‡aUnited Nations.‡bStatistical Office.
-710 2 ‡aUnited Nations.‡bDepartment of International Economic and Social Affairs.‡bStatistical Office.
\ No newline at end of file
diff --git a/test/suites/data/26/other b/test/suites/data/26/other
deleted file mode 100644
index 09968e8..0000000
--- a/test/suites/data/26/other
+++ /dev/null
@@ -1,3 +0,0 @@
-LDR
-710 2 ‡aUnited Nations.‡bDepartment of International Economic and Social Affairs.‡bStatistical Office.
-710 2 ‡aUnited Nations.‡bStatistical Office.
\ No newline at end of file
diff --git a/test/suites/data/26/preferred b/test/suites/data/26/preferred
deleted file mode 100644
index 34f0f4d..0000000
--- a/test/suites/data/26/preferred
+++ /dev/null
@@ -1,3 +0,0 @@
-LDR
-710 2 ‡aUnited Nations.‡bStatistical Office.
-710 2 ‡aUnited Nations.‡bDepartment of International Economic and Social Affairs.‡bStatistical Office.
\ No newline at end of file
diff --git a/test/suites/data/27/merged b/test/suites/data/27/merged
deleted file mode 100644
index 6e6da0b..0000000
--- a/test/suites/data/27/merged
+++ /dev/null
@@ -1,3 +0,0 @@
-LDR
-400 #_ ‡aNote‡bSecond subfield
-500 #_ ‡aNote
\ No newline at end of file
diff --git a/test/suites/data/27/other b/test/suites/data/27/other
deleted file mode 100644
index 22116ac..0000000
--- a/test/suites/data/27/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-500 #_ ‡aNote
\ No newline at end of file
diff --git a/test/suites/data/27/preferred b/test/suites/data/27/preferred
deleted file mode 100644
index fff2893..0000000
--- a/test/suites/data/27/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-400 #_ ‡aNote‡bSecond subfield
\ No newline at end of file
diff --git a/test/suites/data/28/merged b/test/suites/data/28/merged
deleted file mode 100644
index 0b9fbdc..0000000
--- a/test/suites/data/28/merged
+++ /dev/null
@@ -1,3 +0,0 @@
-LDR
-400 #_ ‡aNote‡bSecond subfield
-610 #_ ‡aNote
\ No newline at end of file
diff --git a/test/suites/data/28/other b/test/suites/data/28/other
deleted file mode 100644
index eb5f3bd..0000000
--- a/test/suites/data/28/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-610 #_ ‡aNote
\ No newline at end of file
diff --git a/test/suites/data/28/preferred b/test/suites/data/28/preferred
deleted file mode 100644
index fff2893..0000000
--- a/test/suites/data/28/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-400 #_ ‡aNote‡bSecond subfield
\ No newline at end of file
diff --git a/test/suites/data/29/merged b/test/suites/data/29/merged
deleted file mode 100644
index 87eb555..0000000
--- a/test/suites/data/29/merged
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-041 ‡aeng
\ No newline at end of file
diff --git a/test/suites/data/29/other b/test/suites/data/29/other
deleted file mode 100644
index 4307d97..0000000
--- a/test/suites/data/29/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-041 ‡afin
\ No newline at end of file
diff --git a/test/suites/data/29/preferred b/test/suites/data/29/preferred
deleted file mode 100644
index 87eb555..0000000
--- a/test/suites/data/29/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-041 ‡aeng
\ No newline at end of file
diff --git a/test/suites/data/3/merged b/test/suites/data/3/merged
deleted file mode 100644
index 174632e..0000000
--- a/test/suites/data/3/merged
+++ /dev/null
@@ -1,3 +0,0 @@
-LDR
-007 tu
-100 __ ‡aThis is data
\ No newline at end of file
diff --git a/test/suites/data/3/other b/test/suites/data/3/other
deleted file mode 100644
index 8a18e4d..0000000
--- a/test/suites/data/3/other
+++ /dev/null
@@ -1,3 +0,0 @@
-LDR
-007 tux
-100 __ ‡aThis is data
\ No newline at end of file
diff --git a/test/suites/data/3/preferred b/test/suites/data/3/preferred
deleted file mode 100644
index 174632e..0000000
--- a/test/suites/data/3/preferred
+++ /dev/null
@@ -1,3 +0,0 @@
-LDR
-007 tu
-100 __ ‡aThis is data
\ No newline at end of file
diff --git a/test/suites/data/30/merged b/test/suites/data/30/merged
deleted file mode 100644
index 14137dd..0000000
--- a/test/suites/data/30/merged
+++ /dev/null
@@ -1,3 +0,0 @@
-LDR
-041 ‡afin
-100 ‡aSomedata
\ No newline at end of file
diff --git a/test/suites/data/30/other b/test/suites/data/30/other
deleted file mode 100644
index 4307d97..0000000
--- a/test/suites/data/30/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-041 ‡afin
\ No newline at end of file
diff --git a/test/suites/data/30/preferred b/test/suites/data/30/preferred
deleted file mode 100644
index e2afc92..0000000
--- a/test/suites/data/30/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-100 ‡aSomedata
\ No newline at end of file
diff --git a/test/suites/data/31/merged b/test/suites/data/31/merged
deleted file mode 100644
index 14137dd..0000000
--- a/test/suites/data/31/merged
+++ /dev/null
@@ -1,3 +0,0 @@
-LDR
-041 ‡afin
-100 ‡aSomedata
\ No newline at end of file
diff --git a/test/suites/data/31/other b/test/suites/data/31/other
deleted file mode 100644
index e2afc92..0000000
--- a/test/suites/data/31/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-100 ‡aSomedata
\ No newline at end of file
diff --git a/test/suites/data/31/preferred b/test/suites/data/31/preferred
deleted file mode 100644
index 14137dd..0000000
--- a/test/suites/data/31/preferred
+++ /dev/null
@@ -1,3 +0,0 @@
-LDR
-041 ‡afin
-100 ‡aSomedata
\ No newline at end of file
diff --git a/test/suites/data/32/other b/test/suites/data/32/other
deleted file mode 100644
index 078f5b9..0000000
--- a/test/suites/data/32/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-260 ‡aLondon :‡c1989.
\ No newline at end of file
diff --git a/test/suites/data/32/preferred b/test/suites/data/32/preferred
deleted file mode 100644
index b224c43..0000000
--- a/test/suites/data/32/preferred
+++ /dev/null
@@ -1,3 +0,0 @@
-LDR
-260 ‡aLondon :‡bPinter,‡ccop. 1989.
-260 ‡aLondon :‡bPinter,‡ccop. 1989.
\ No newline at end of file
diff --git a/test/suites/data/33/merged b/test/suites/data/33/merged
deleted file mode 100644
index d913477..0000000
--- a/test/suites/data/33/merged
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-300 ‡a62, [59] s. :‡bkuv. ;‡c25 cm.
\ No newline at end of file
diff --git a/test/suites/data/33/other b/test/suites/data/33/other
deleted file mode 100644
index d913477..0000000
--- a/test/suites/data/33/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-300 ‡a62, [59] s. :‡bkuv. ;‡c25 cm.
\ No newline at end of file
diff --git a/test/suites/data/33/preferred b/test/suites/data/33/preferred
deleted file mode 100644
index d913477..0000000
--- a/test/suites/data/33/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-300 ‡a62, [59] s. :‡bkuv. ;‡c25 cm.
\ No newline at end of file
diff --git a/test/suites/data/34/merged b/test/suites/data/34/merged
deleted file mode 100644
index d913477..0000000
--- a/test/suites/data/34/merged
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-300 ‡a62, [59] s. :‡bkuv. ;‡c25 cm.
\ No newline at end of file
diff --git a/test/suites/data/34/other b/test/suites/data/34/other
deleted file mode 100644
index 68d192b..0000000
--- a/test/suites/data/34/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-300 ‡a62, [59] s. :‡bill. ;‡c25 cm.
\ No newline at end of file
diff --git a/test/suites/data/34/preferred b/test/suites/data/34/preferred
deleted file mode 100644
index d913477..0000000
--- a/test/suites/data/34/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-300 ‡a62, [59] s. :‡bkuv. ;‡c25 cm.
\ No newline at end of file
diff --git a/test/suites/data/35/merged b/test/suites/data/35/merged
deleted file mode 100644
index d913477..0000000
--- a/test/suites/data/35/merged
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-300 ‡a62, [59] s. :‡bkuv. ;‡c25 cm.
\ No newline at end of file
diff --git a/test/suites/data/35/other b/test/suites/data/35/other
deleted file mode 100644
index d913477..0000000
--- a/test/suites/data/35/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-300 ‡a62, [59] s. :‡bkuv. ;‡c25 cm.
\ No newline at end of file
diff --git a/test/suites/data/35/preferred b/test/suites/data/35/preferred
deleted file mode 100644
index 1c2f8f0..0000000
--- a/test/suites/data/35/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-300 ‡a62, [59] s. :‡c25 cm.
\ No newline at end of file
diff --git a/test/suites/data/36/merged b/test/suites/data/36/merged
deleted file mode 100644
index d913477..0000000
--- a/test/suites/data/36/merged
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-300 ‡a62, [59] s. :‡bkuv. ;‡c25 cm.
\ No newline at end of file
diff --git a/test/suites/data/36/other b/test/suites/data/36/other
deleted file mode 100644
index 1c2f8f0..0000000
--- a/test/suites/data/36/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-300 ‡a62, [59] s. :‡c25 cm.
\ No newline at end of file
diff --git a/test/suites/data/36/preferred b/test/suites/data/36/preferred
deleted file mode 100644
index d913477..0000000
--- a/test/suites/data/36/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-300 ‡a62, [59] s. :‡bkuv. ;‡c25 cm.
\ No newline at end of file
diff --git a/test/suites/data/37/merged b/test/suites/data/37/merged
deleted file mode 100644
index 0568801..0000000
--- a/test/suites/data/37/merged
+++ /dev/null
@@ -1,3 +0,0 @@
-LDR
-300 ‡a62, [59] s. :‡c25 cm.
-500 ‡aNote
\ No newline at end of file
diff --git a/test/suites/data/37/other b/test/suites/data/37/other
deleted file mode 100644
index 1c2f8f0..0000000
--- a/test/suites/data/37/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-300 ‡a62, [59] s. :‡c25 cm.
\ No newline at end of file
diff --git a/test/suites/data/37/preferred b/test/suites/data/37/preferred
deleted file mode 100644
index 0e77b67..0000000
--- a/test/suites/data/37/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-500 ‡aNote
\ No newline at end of file
diff --git a/test/suites/data/38/merged b/test/suites/data/38/merged
deleted file mode 100644
index 0568801..0000000
--- a/test/suites/data/38/merged
+++ /dev/null
@@ -1,3 +0,0 @@
-LDR
-300 ‡a62, [59] s. :‡c25 cm.
-500 ‡aNote
\ No newline at end of file
diff --git a/test/suites/data/38/other b/test/suites/data/38/other
deleted file mode 100644
index 0e77b67..0000000
--- a/test/suites/data/38/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-500 ‡aNote
\ No newline at end of file
diff --git a/test/suites/data/38/preferred b/test/suites/data/38/preferred
deleted file mode 100644
index 1c2f8f0..0000000
--- a/test/suites/data/38/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-300 ‡a62, [59] s. :‡c25 cm.
\ No newline at end of file
diff --git a/test/suites/data/39/merged b/test/suites/data/39/merged
deleted file mode 100644
index d325cee..0000000
--- a/test/suites/data/39/merged
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-260 ‡aLondon :‡bPinter,‡ccop. 1989.
\ No newline at end of file
diff --git a/test/suites/data/39/other b/test/suites/data/39/other
deleted file mode 100644
index d325cee..0000000
--- a/test/suites/data/39/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-260 ‡aLondon :‡bPinter,‡ccop. 1989.
\ No newline at end of file
diff --git a/test/suites/data/39/preferred b/test/suites/data/39/preferred
deleted file mode 100644
index 078f5b9..0000000
--- a/test/suites/data/39/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-260 ‡aLondon :‡c1989.
\ No newline at end of file
diff --git a/test/suites/data/4/descr b/test/suites/data/4/descr
deleted file mode 100644
index bfc64c2..0000000
--- a/test/suites/data/4/descr
+++ /dev/null
@@ -1 +0,0 @@
-should use the field with more information is used
diff --git a/test/suites/data/4/merged b/test/suites/data/4/merged
deleted file mode 100644
index 856726f..0000000
--- a/test/suites/data/4/merged
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-500 #_ ‡aNote‡bSecond subfield
\ No newline at end of file
diff --git a/test/suites/data/4/other b/test/suites/data/4/other
deleted file mode 100644
index 22116ac..0000000
--- a/test/suites/data/4/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-500 #_ ‡aNote
\ No newline at end of file
diff --git a/test/suites/data/4/preferred b/test/suites/data/4/preferred
deleted file mode 100644
index 856726f..0000000
--- a/test/suites/data/4/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-500 #_ ‡aNote‡bSecond subfield
\ No newline at end of file
diff --git a/test/suites/data/40/merged b/test/suites/data/40/merged
deleted file mode 100644
index 74f0072..0000000
--- a/test/suites/data/40/merged
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-260 ‡aLondon :‡bPinter,‡ccop. 1989-1990.
\ No newline at end of file
diff --git a/test/suites/data/40/other b/test/suites/data/40/other
deleted file mode 100644
index d325cee..0000000
--- a/test/suites/data/40/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-260 ‡aLondon :‡bPinter,‡ccop. 1989.
\ No newline at end of file
diff --git a/test/suites/data/40/preferred b/test/suites/data/40/preferred
deleted file mode 100644
index 74f0072..0000000
--- a/test/suites/data/40/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-260 ‡aLondon :‡bPinter,‡ccop. 1989-1990.
\ No newline at end of file
diff --git a/test/suites/data/41/merged b/test/suites/data/41/merged
deleted file mode 100644
index 2799807..0000000
--- a/test/suites/data/41/merged
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-250 ‡a2. painos.‡bsome extra piece of data
\ No newline at end of file
diff --git a/test/suites/data/41/other b/test/suites/data/41/other
deleted file mode 100644
index 2799807..0000000
--- a/test/suites/data/41/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-250 ‡a2. painos.‡bsome extra piece of data
\ No newline at end of file
diff --git a/test/suites/data/41/preferred b/test/suites/data/41/preferred
deleted file mode 100644
index 25624cf..0000000
--- a/test/suites/data/41/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-250 ‡a2. painos.
\ No newline at end of file
diff --git a/test/suites/data/42/merged b/test/suites/data/42/merged
deleted file mode 100644
index 2799807..0000000
--- a/test/suites/data/42/merged
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-250 ‡a2. painos.‡bsome extra piece of data
\ No newline at end of file
diff --git a/test/suites/data/42/other b/test/suites/data/42/other
deleted file mode 100644
index 25624cf..0000000
--- a/test/suites/data/42/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-250 ‡a2. painos.
\ No newline at end of file
diff --git a/test/suites/data/42/preferred b/test/suites/data/42/preferred
deleted file mode 100644
index 2799807..0000000
--- a/test/suites/data/42/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-250 ‡a2. painos.‡bsome extra piece of data
\ No newline at end of file
diff --git a/test/suites/data/43/merged b/test/suites/data/43/merged
deleted file mode 100644
index b655ae1..0000000
--- a/test/suites/data/43/merged
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-100 ‡aUnrelated field.
\ No newline at end of file
diff --git a/test/suites/data/43/other b/test/suites/data/43/other
deleted file mode 100644
index 25624cf..0000000
--- a/test/suites/data/43/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-250 ‡a2. painos.
\ No newline at end of file
diff --git a/test/suites/data/43/preferred b/test/suites/data/43/preferred
deleted file mode 100644
index b655ae1..0000000
--- a/test/suites/data/43/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-100 ‡aUnrelated field.
\ No newline at end of file
diff --git a/test/suites/data/44/merged b/test/suites/data/44/merged
deleted file mode 100644
index 1282a41..0000000
--- a/test/suites/data/44/merged
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-020 __ ‡a951-563-055-X‡qnid.
\ No newline at end of file
diff --git a/test/suites/data/44/other b/test/suites/data/44/other
deleted file mode 100644
index 1282a41..0000000
--- a/test/suites/data/44/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-020 __ ‡a951-563-055-X‡qnid.
\ No newline at end of file
diff --git a/test/suites/data/44/preferred b/test/suites/data/44/preferred
deleted file mode 100644
index 1282a41..0000000
--- a/test/suites/data/44/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-020 __ ‡a951-563-055-X‡qnid.
\ No newline at end of file
diff --git a/test/suites/data/45/merged b/test/suites/data/45/merged
deleted file mode 100644
index 1282a41..0000000
--- a/test/suites/data/45/merged
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-020 __ ‡a951-563-055-X‡qnid.
\ No newline at end of file
diff --git a/test/suites/data/45/other b/test/suites/data/45/other
deleted file mode 100644
index 00f689d..0000000
--- a/test/suites/data/45/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-020 __ ‡a951-563-055-X
\ No newline at end of file
diff --git a/test/suites/data/45/preferred b/test/suites/data/45/preferred
deleted file mode 100644
index 1282a41..0000000
--- a/test/suites/data/45/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-020 __ ‡a951-563-055-X‡qnid.
\ No newline at end of file
diff --git a/test/suites/data/46/merged b/test/suites/data/46/merged
deleted file mode 100644
index 5881c5d..0000000
--- a/test/suites/data/46/merged
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-020 __ ‡a951-563-055-X‡qOtava‡qnid.
\ No newline at end of file
diff --git a/test/suites/data/46/other b/test/suites/data/46/other
deleted file mode 100644
index 1282a41..0000000
--- a/test/suites/data/46/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-020 __ ‡a951-563-055-X‡qnid.
\ No newline at end of file
diff --git a/test/suites/data/46/preferred b/test/suites/data/46/preferred
deleted file mode 100644
index 7c93d05..0000000
--- a/test/suites/data/46/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-020 __ ‡a951-563-055-X‡qOtava
\ No newline at end of file
diff --git a/test/suites/data/47/merged b/test/suites/data/47/merged
deleted file mode 100644
index b76182e..0000000
--- a/test/suites/data/47/merged
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-020 __ ‡a951-563-055-X‡c[25 mk., 20 mk.]
\ No newline at end of file
diff --git a/test/suites/data/47/other b/test/suites/data/47/other
deleted file mode 100644
index 6f50a49..0000000
--- a/test/suites/data/47/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-020 __ ‡a951-563-055-X‡c20 mk.
\ No newline at end of file
diff --git a/test/suites/data/47/preferred b/test/suites/data/47/preferred
deleted file mode 100644
index 116b433..0000000
--- a/test/suites/data/47/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-020 __ ‡a951-563-055-X‡c25 mk.
\ No newline at end of file
diff --git a/test/suites/data/48/merged b/test/suites/data/48/merged
deleted file mode 100644
index 77566b5..0000000
--- a/test/suites/data/48/merged
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-020 __ ‡a951-563-055-X‡z951-792-076-8
\ No newline at end of file
diff --git a/test/suites/data/48/other b/test/suites/data/48/other
deleted file mode 100644
index 77566b5..0000000
--- a/test/suites/data/48/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-020 __ ‡a951-563-055-X‡z951-792-076-8
\ No newline at end of file
diff --git a/test/suites/data/48/preferred b/test/suites/data/48/preferred
deleted file mode 100644
index 77566b5..0000000
--- a/test/suites/data/48/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-020 __ ‡a951-563-055-X‡z951-792-076-8
\ No newline at end of file
diff --git a/test/suites/data/49/merged b/test/suites/data/49/merged
deleted file mode 100644
index dbff227..0000000
--- a/test/suites/data/49/merged
+++ /dev/null
@@ -1,3 +0,0 @@
-LDR
-020 __ ‡a1234-951-563-055-X‡qnid.
-020 __ ‡a951-563-123-5‡qnid.
\ No newline at end of file
diff --git a/test/suites/data/49/other b/test/suites/data/49/other
deleted file mode 100644
index 9d18c32..0000000
--- a/test/suites/data/49/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-020 __ ‡a951-563-123-5‡qnid.
\ No newline at end of file
diff --git a/test/suites/data/49/preferred b/test/suites/data/49/preferred
deleted file mode 100644
index a695b1c..0000000
--- a/test/suites/data/49/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-020 __ ‡a1234-951-563-055-X‡qnid.
\ No newline at end of file
diff --git a/test/suites/data/5/descr b/test/suites/data/5/descr
deleted file mode 100644
index d68185c..0000000
--- a/test/suites/data/5/descr
+++ /dev/null
@@ -1 +0,0 @@
-should keep only one copy of identical fields in the merged record
diff --git a/test/suites/data/5/merged b/test/suites/data/5/merged
deleted file mode 100644
index 856726f..0000000
--- a/test/suites/data/5/merged
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-500 #_ ‡aNote‡bSecond subfield
\ No newline at end of file
diff --git a/test/suites/data/5/other b/test/suites/data/5/other
deleted file mode 100644
index 856726f..0000000
--- a/test/suites/data/5/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-500 #_ ‡aNote‡bSecond subfield
\ No newline at end of file
diff --git a/test/suites/data/5/preferred b/test/suites/data/5/preferred
deleted file mode 100644
index 856726f..0000000
--- a/test/suites/data/5/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-500 #_ ‡aNote‡bSecond subfield
\ No newline at end of file
diff --git a/test/suites/data/50/merged b/test/suites/data/50/merged
deleted file mode 100644
index acadf6e..0000000
--- a/test/suites/data/50/merged
+++ /dev/null
@@ -1,3 +0,0 @@
-LDR
-020 __ ‡a1234-951-563-055-X‡qKustantaja B
-020 __ ‡a951-563-123-5‡qKustantaja A
\ No newline at end of file
diff --git a/test/suites/data/50/other b/test/suites/data/50/other
deleted file mode 100644
index 70d3db6..0000000
--- a/test/suites/data/50/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-020 __ ‡a951-563-123-5‡qKustantaja A
\ No newline at end of file
diff --git a/test/suites/data/50/preferred b/test/suites/data/50/preferred
deleted file mode 100644
index a22f6a2..0000000
--- a/test/suites/data/50/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-020 __ ‡a1234-951-563-055-X‡qKustantaja B
\ No newline at end of file
diff --git a/test/suites/data/51/merged b/test/suites/data/51/merged
deleted file mode 100644
index 623b081..0000000
--- a/test/suites/data/51/merged
+++ /dev/null
@@ -1,3 +0,0 @@
-LDR
-020 __ ‡a1234-951-563-055-X‡qKustantaja B‡c20 mk.
-020 __ ‡a951-563-123-5‡qKustantaja A‡qsid.
\ No newline at end of file
diff --git a/test/suites/data/51/other b/test/suites/data/51/other
deleted file mode 100644
index 1b59b04..0000000
--- a/test/suites/data/51/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-020 __ ‡a951-563-123-5‡qKustantaja A‡qsid.
\ No newline at end of file
diff --git a/test/suites/data/51/preferred b/test/suites/data/51/preferred
deleted file mode 100644
index 20ed0dd..0000000
--- a/test/suites/data/51/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-020 __ ‡a1234-951-563-055-X‡qKustantaja B‡c20 mk.
\ No newline at end of file
diff --git a/test/suites/data/52/merged b/test/suites/data/52/merged
deleted file mode 100644
index 1b97b84..0000000
--- a/test/suites/data/52/merged
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-020 __ ‡a951-563-055-X‡qnid.‡z951-792-076-2‡z951-792-076-8
\ No newline at end of file
diff --git a/test/suites/data/52/other b/test/suites/data/52/other
deleted file mode 100644
index 85580ce..0000000
--- a/test/suites/data/52/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-020 __ ‡a951-563-055-X‡qnid.‡z951-792-076-8
\ No newline at end of file
diff --git a/test/suites/data/52/preferred b/test/suites/data/52/preferred
deleted file mode 100644
index 18b334b..0000000
--- a/test/suites/data/52/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-020 __ ‡a951-563-055-X‡qnid.‡z951-792-076-2
\ No newline at end of file
diff --git a/test/suites/data/53/merged b/test/suites/data/53/merged
deleted file mode 100644
index dafa383..0000000
--- a/test/suites/data/53/merged
+++ /dev/null
@@ -1,3 +0,0 @@
-LDR
-020 __ ‡qOtava‡z951-792-076-2
-020 __ ‡qnid.‡z951-792-076-8
\ No newline at end of file
diff --git a/test/suites/data/53/other b/test/suites/data/53/other
deleted file mode 100644
index 16688fa..0000000
--- a/test/suites/data/53/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-020 __ ‡qnid.‡z951-792-076-8
\ No newline at end of file
diff --git a/test/suites/data/53/preferred b/test/suites/data/53/preferred
deleted file mode 100644
index 85b8338..0000000
--- a/test/suites/data/53/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-020 __ ‡qOtava‡z951-792-076-2
\ No newline at end of file
diff --git a/test/suites/data/54/merged b/test/suites/data/54/merged
deleted file mode 100644
index d18de37..0000000
--- a/test/suites/data/54/merged
+++ /dev/null
@@ -1,3 +0,0 @@
-LDR
-020 __ ‡a951-563-055-X‡qsid.
-020 __ ‡qnid.‡z951-792-076-8
\ No newline at end of file
diff --git a/test/suites/data/54/other b/test/suites/data/54/other
deleted file mode 100644
index 16688fa..0000000
--- a/test/suites/data/54/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-020 __ ‡qnid.‡z951-792-076-8
\ No newline at end of file
diff --git a/test/suites/data/54/preferred b/test/suites/data/54/preferred
deleted file mode 100644
index e870435..0000000
--- a/test/suites/data/54/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-020 __ ‡a951-563-055-X‡qsid.
\ No newline at end of file
diff --git a/test/suites/data/55/merged b/test/suites/data/55/merged
deleted file mode 100644
index 7a3930d..0000000
--- a/test/suites/data/55/merged
+++ /dev/null
@@ -1,3 +0,0 @@
-LDR
-020 __ ‡qnid.‡z951-792-076-2
-020 __ ‡qnid.‡z951-792-076-8
\ No newline at end of file
diff --git a/test/suites/data/55/other b/test/suites/data/55/other
deleted file mode 100644
index 16688fa..0000000
--- a/test/suites/data/55/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-020 __ ‡qnid.‡z951-792-076-8
\ No newline at end of file
diff --git a/test/suites/data/55/preferred b/test/suites/data/55/preferred
deleted file mode 100644
index ec0dbf6..0000000
--- a/test/suites/data/55/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-020 __ ‡qnid.‡z951-792-076-2
\ No newline at end of file
diff --git a/test/suites/data/56/merged b/test/suites/data/56/merged
deleted file mode 100644
index d005434..0000000
--- a/test/suites/data/56/merged
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-020 __ ‡a951-563-055-X‡qOtava‡qnid.‡c20 mk.
\ No newline at end of file
diff --git a/test/suites/data/56/other b/test/suites/data/56/other
deleted file mode 100644
index fa52b6b..0000000
--- a/test/suites/data/56/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-020 __ ‡a951-563-055-X‡qnid.‡c20 mk.
\ No newline at end of file
diff --git a/test/suites/data/56/preferred b/test/suites/data/56/preferred
deleted file mode 100644
index 7c93d05..0000000
--- a/test/suites/data/56/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-020 __ ‡a951-563-055-X‡qOtava
\ No newline at end of file
diff --git a/test/suites/data/57/descr b/test/suites/data/57/descr
deleted file mode 100644
index e665193..0000000
--- a/test/suites/data/57/descr
+++ /dev/null
@@ -1 +0,0 @@
-should not mess up any fields.
diff --git a/test/suites/data/57/merged b/test/suites/data/57/merged
deleted file mode 100644
index afe5440..0000000
--- a/test/suites/data/57/merged
+++ /dev/null
@@ -1,4 +0,0 @@
-LDR
-500 ‡aSelkänimeke: Ruotsi.‡9FENNI
-650 7 ‡asanakirjat‡xsuomen kieli‡xruotsin kieli‡2ysa‡9FENNI
-700 1 ‡aCantell, Ilse.
\ No newline at end of file
diff --git a/test/suites/data/57/other b/test/suites/data/57/other
deleted file mode 100644
index 47b3d5b..0000000
--- a/test/suites/data/57/other
+++ /dev/null
@@ -1,4 +0,0 @@
-LDR
-500 ‡aSelkänimeke: Ruotsi.
-650 7 ‡asanakirjat‡xsuomen kieli‡xruotsin kieli‡2ysa
-700 1 ‡aCantell, Ilse.
\ No newline at end of file
diff --git a/test/suites/data/57/preferred b/test/suites/data/57/preferred
deleted file mode 100644
index f13bdb4..0000000
--- a/test/suites/data/57/preferred
+++ /dev/null
@@ -1,4 +0,0 @@
-LDR
-500 ‡aSelkänimeke: Ruotsi.‡9FENNI
-650 7 ‡asanakirjat‡2ysa‡9FENNI
-700 1 ‡aCantell, Ilse.
\ No newline at end of file
diff --git a/test/suites/data/58/descr b/test/suites/data/58/descr
deleted file mode 100644
index bb79717..0000000
--- a/test/suites/data/58/descr
+++ /dev/null
@@ -1 +0,0 @@
-SelectBetter option should not create a copy of identical fields.
diff --git a/test/suites/data/58/merged b/test/suites/data/58/merged
deleted file mode 100644
index d913477..0000000
--- a/test/suites/data/58/merged
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-300 ‡a62, [59] s. :‡bkuv. ;‡c25 cm.
\ No newline at end of file
diff --git a/test/suites/data/58/other b/test/suites/data/58/other
deleted file mode 100644
index d913477..0000000
--- a/test/suites/data/58/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-300 ‡a62, [59] s. :‡bkuv. ;‡c25 cm.
\ No newline at end of file
diff --git a/test/suites/data/58/preferred b/test/suites/data/58/preferred
deleted file mode 100644
index d913477..0000000
--- a/test/suites/data/58/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-300 ‡a62, [59] s. :‡bkuv. ;‡c25 cm.
\ No newline at end of file
diff --git a/test/suites/data/59/descr b/test/suites/data/59/descr
deleted file mode 100644
index f580408..0000000
--- a/test/suites/data/59/descr
+++ /dev/null
@@ -1 +0,0 @@
-SelectBetter option should not create a copy of non-identical fields and it should use the one in preferred if neither is subset.
diff --git a/test/suites/data/59/merged b/test/suites/data/59/merged
deleted file mode 100644
index d913477..0000000
--- a/test/suites/data/59/merged
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-300 ‡a62, [59] s. :‡bkuv. ;‡c25 cm.
\ No newline at end of file
diff --git a/test/suites/data/59/other b/test/suites/data/59/other
deleted file mode 100644
index 68d192b..0000000
--- a/test/suites/data/59/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-300 ‡a62, [59] s. :‡bill. ;‡c25 cm.
\ No newline at end of file
diff --git a/test/suites/data/59/preferred b/test/suites/data/59/preferred
deleted file mode 100644
index d913477..0000000
--- a/test/suites/data/59/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-300 ‡a62, [59] s. :‡bkuv. ;‡c25 cm.
\ No newline at end of file
diff --git a/test/suites/data/6/descr b/test/suites/data/6/descr
deleted file mode 100644
index 20d7e10..0000000
--- a/test/suites/data/6/descr
+++ /dev/null
@@ -1 +0,0 @@
-should only copy fields that are configured
diff --git a/test/suites/data/6/merged b/test/suites/data/6/merged
deleted file mode 100644
index 856726f..0000000
--- a/test/suites/data/6/merged
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-500 #_ ‡aNote‡bSecond subfield
\ No newline at end of file
diff --git a/test/suites/data/6/other b/test/suites/data/6/other
deleted file mode 100644
index c3a9dc8..0000000
--- a/test/suites/data/6/other
+++ /dev/null
@@ -1,3 +0,0 @@
-LDR
-500 #_ ‡aNote‡bSecond subfield
-505 #_ ‡bField505
\ No newline at end of file
diff --git a/test/suites/data/6/preferred b/test/suites/data/6/preferred
deleted file mode 100644
index 856726f..0000000
--- a/test/suites/data/6/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-500 #_ ‡aNote‡bSecond subfield
\ No newline at end of file
diff --git a/test/suites/data/60/descr b/test/suites/data/60/descr
deleted file mode 100644
index 6dff2ac..0000000
--- a/test/suites/data/60/descr
+++ /dev/null
@@ -1 +0,0 @@
-SelectBetter option should use the field from other record if it's a superset
diff --git a/test/suites/data/60/merged b/test/suites/data/60/merged
deleted file mode 100644
index d913477..0000000
--- a/test/suites/data/60/merged
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-300 ‡a62, [59] s. :‡bkuv. ;‡c25 cm.
\ No newline at end of file
diff --git a/test/suites/data/60/other b/test/suites/data/60/other
deleted file mode 100644
index d913477..0000000
--- a/test/suites/data/60/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-300 ‡a62, [59] s. :‡bkuv. ;‡c25 cm.
\ No newline at end of file
diff --git a/test/suites/data/60/preferred b/test/suites/data/60/preferred
deleted file mode 100644
index 1c2f8f0..0000000
--- a/test/suites/data/60/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-300 ‡a62, [59] s. :‡c25 cm.
\ No newline at end of file
diff --git a/test/suites/data/61/descr b/test/suites/data/61/descr
deleted file mode 100644
index 87df7de..0000000
--- a/test/suites/data/61/descr
+++ /dev/null
@@ -1 +0,0 @@
-SelectBetter option should use the field from preferred record if it's a superset
diff --git a/test/suites/data/61/merged b/test/suites/data/61/merged
deleted file mode 100644
index d913477..0000000
--- a/test/suites/data/61/merged
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-300 ‡a62, [59] s. :‡bkuv. ;‡c25 cm.
\ No newline at end of file
diff --git a/test/suites/data/61/other b/test/suites/data/61/other
deleted file mode 100644
index 1c2f8f0..0000000
--- a/test/suites/data/61/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-300 ‡a62, [59] s. :‡c25 cm.
\ No newline at end of file
diff --git a/test/suites/data/61/preferred b/test/suites/data/61/preferred
deleted file mode 100644
index d913477..0000000
--- a/test/suites/data/61/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-300 ‡a62, [59] s. :‡bkuv. ;‡c25 cm.
\ No newline at end of file
diff --git a/test/suites/data/62/descr b/test/suites/data/62/descr
deleted file mode 100644
index 3f2af67..0000000
--- a/test/suites/data/62/descr
+++ /dev/null
@@ -1 +0,0 @@
-SelectBetter should copy the field from other if it's missing from preferred.
diff --git a/test/suites/data/62/merged b/test/suites/data/62/merged
deleted file mode 100644
index 0568801..0000000
--- a/test/suites/data/62/merged
+++ /dev/null
@@ -1,3 +0,0 @@
-LDR
-300 ‡a62, [59] s. :‡c25 cm.
-500 ‡aNote
\ No newline at end of file
diff --git a/test/suites/data/62/other b/test/suites/data/62/other
deleted file mode 100644
index 1c2f8f0..0000000
--- a/test/suites/data/62/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-300 ‡a62, [59] s. :‡c25 cm.
\ No newline at end of file
diff --git a/test/suites/data/62/preferred b/test/suites/data/62/preferred
deleted file mode 100644
index 0e77b67..0000000
--- a/test/suites/data/62/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-500 ‡aNote
\ No newline at end of file
diff --git a/test/suites/data/63/descr b/test/suites/data/63/descr
deleted file mode 100644
index 5f6672c..0000000
--- a/test/suites/data/63/descr
+++ /dev/null
@@ -1 +0,0 @@
-SelectBetter should keep the field from preferred if it's missing from other.
diff --git a/test/suites/data/63/merged b/test/suites/data/63/merged
deleted file mode 100644
index 0568801..0000000
--- a/test/suites/data/63/merged
+++ /dev/null
@@ -1,3 +0,0 @@
-LDR
-300 ‡a62, [59] s. :‡c25 cm.
-500 ‡aNote
\ No newline at end of file
diff --git a/test/suites/data/63/other b/test/suites/data/63/other
deleted file mode 100644
index 0e77b67..0000000
--- a/test/suites/data/63/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-500 ‡aNote
\ No newline at end of file
diff --git a/test/suites/data/63/preferred b/test/suites/data/63/preferred
deleted file mode 100644
index 1c2f8f0..0000000
--- a/test/suites/data/63/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-300 ‡a62, [59] s. :‡c25 cm.
\ No newline at end of file
diff --git a/test/suites/data/64/merged b/test/suites/data/64/merged
deleted file mode 100644
index 989e375..0000000
--- a/test/suites/data/64/merged
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-100 __ ‡aThis should be chosen.
\ No newline at end of file
diff --git a/test/suites/data/64/other b/test/suites/data/64/other
deleted file mode 100644
index 989e375..0000000
--- a/test/suites/data/64/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-100 __ ‡aThis should be chosen.
\ No newline at end of file
diff --git a/test/suites/data/64/preferred b/test/suites/data/64/preferred
deleted file mode 100644
index 011ce41..0000000
--- a/test/suites/data/64/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-100 __ ‡aThis is preferred field of preferred record and should be gone.
\ No newline at end of file
diff --git a/test/suites/data/65/merged b/test/suites/data/65/merged
deleted file mode 100644
index 9cd8642..0000000
--- a/test/suites/data/65/merged
+++ /dev/null
@@ -1,3 +0,0 @@
-LDR
-130 __ ‡afoo‡bbar
-930 _b ‡bfoo‡zfubar
\ No newline at end of file
diff --git a/test/suites/data/65/other b/test/suites/data/65/other
deleted file mode 100644
index 017ee7a..0000000
--- a/test/suites/data/65/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-130 _b ‡afoo‡bbar
\ No newline at end of file
diff --git a/test/suites/data/65/preferred b/test/suites/data/65/preferred
deleted file mode 100644
index 2252234..0000000
--- a/test/suites/data/65/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-130 __ ‡afoo‡bbar
\ No newline at end of file
diff --git a/test/suites/data/66/merged b/test/suites/data/66/merged
deleted file mode 100644
index 5317466..0000000
--- a/test/suites/data/66/merged
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-773 __ ‡afoo‡bbar‡zfubar‡zfoobar
\ No newline at end of file
diff --git a/test/suites/data/66/other b/test/suites/data/66/other
deleted file mode 100644
index eeaaab5..0000000
--- a/test/suites/data/66/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-773 __ ‡afoo‡bbar‡zfoobar
\ No newline at end of file
diff --git a/test/suites/data/66/preferred b/test/suites/data/66/preferred
deleted file mode 100644
index a0b4865..0000000
--- a/test/suites/data/66/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-773 __ ‡afoo‡bbar‡zfubar
\ No newline at end of file
diff --git a/test/suites/data/67/merged b/test/suites/data/67/merged
deleted file mode 100644
index 6171fa1..0000000
--- a/test/suites/data/67/merged
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-773 __ ‡afoo‡bbar‡gfu‡qbar
\ No newline at end of file
diff --git a/test/suites/data/67/other b/test/suites/data/67/other
deleted file mode 100644
index 6171fa1..0000000
--- a/test/suites/data/67/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-773 __ ‡afoo‡bbar‡gfu‡qbar
\ No newline at end of file
diff --git a/test/suites/data/67/preferred b/test/suites/data/67/preferred
deleted file mode 100644
index 56220e3..0000000
--- a/test/suites/data/67/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-773 __ ‡afoo‡bbar
\ No newline at end of file
diff --git a/test/suites/data/68/merged b/test/suites/data/68/merged
deleted file mode 100644
index a1afb23..0000000
--- a/test/suites/data/68/merged
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-773 __ ‡afoo‡bbarian‡gfu‡qbar‡gfu‡qbar
\ No newline at end of file
diff --git a/test/suites/data/68/other b/test/suites/data/68/other
deleted file mode 100644
index 6171fa1..0000000
--- a/test/suites/data/68/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-773 __ ‡afoo‡bbar‡gfu‡qbar
\ No newline at end of file
diff --git a/test/suites/data/68/preferred b/test/suites/data/68/preferred
deleted file mode 100644
index 0a655d8..0000000
--- a/test/suites/data/68/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-773 __ ‡afoo‡bbarian‡gfu‡qbar
\ No newline at end of file
diff --git a/test/suites/data/69/merged b/test/suites/data/69/merged
deleted file mode 100644
index ae6c4c1..0000000
--- a/test/suites/data/69/merged
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-773 __ ‡afoo‡bbar‡zfubar‡gfu‡qbar‡gfu‡qbar
\ No newline at end of file
diff --git a/test/suites/data/69/other b/test/suites/data/69/other
deleted file mode 100644
index 63f04ec..0000000
--- a/test/suites/data/69/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-773 __ ‡afoo‡bbar‡zfubar‡gfu‡qbar
\ No newline at end of file
diff --git a/test/suites/data/69/preferred b/test/suites/data/69/preferred
deleted file mode 100644
index 6171fa1..0000000
--- a/test/suites/data/69/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-773 __ ‡afoo‡bbar‡gfu‡qbar
\ No newline at end of file
diff --git a/test/suites/data/7/descr b/test/suites/data/7/descr
deleted file mode 100644
index bdcce8c..0000000
--- a/test/suites/data/7/descr
+++ /dev/null
@@ -1 +0,0 @@
-should copy whole field instead of merging specifically configured subfields if the fields are not identical
diff --git a/test/suites/data/7/merged b/test/suites/data/7/merged
deleted file mode 100644
index cc8fee0..0000000
--- a/test/suites/data/7/merged
+++ /dev/null
@@ -1,4 +0,0 @@
-LDR
-490 #_ ‡aNote‡bAdditional info‡9THISLOWTAG
-490 #_ ‡aNote‡9OTHERLOWTAG
-500 #_ ‡aNote‡bSecond subfield
\ No newline at end of file
diff --git a/test/suites/data/7/other b/test/suites/data/7/other
deleted file mode 100644
index 399aa63..0000000
--- a/test/suites/data/7/other
+++ /dev/null
@@ -1,3 +0,0 @@
-LDR
-490 #_ ‡aNote‡9OTHERLOWTAG
-505 #_ ‡bField505
\ No newline at end of file
diff --git a/test/suites/data/7/preferred b/test/suites/data/7/preferred
deleted file mode 100644
index 83edaf2..0000000
--- a/test/suites/data/7/preferred
+++ /dev/null
@@ -1,3 +0,0 @@
-LDR
-490 #_ ‡aNote‡bAdditional info‡9THISLOWTAG
-500 #_ ‡aNote‡bSecond subfield
\ No newline at end of file
diff --git a/test/suites/data/70/merged b/test/suites/data/70/merged
deleted file mode 100644
index 0a655d8..0000000
--- a/test/suites/data/70/merged
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-773 __ ‡afoo‡bbarian‡gfu‡qbar
\ No newline at end of file
diff --git a/test/suites/data/70/other b/test/suites/data/70/other
deleted file mode 100644
index 6171fa1..0000000
--- a/test/suites/data/70/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-773 __ ‡afoo‡bbar‡gfu‡qbar
\ No newline at end of file
diff --git a/test/suites/data/70/preferred b/test/suites/data/70/preferred
deleted file mode 100644
index 673e0b5..0000000
--- a/test/suites/data/70/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-773 __ ‡afoo‡bbarian
\ No newline at end of file
diff --git a/test/suites/data/71/merged b/test/suites/data/71/merged
deleted file mode 100644
index d1fd2b4..0000000
--- a/test/suites/data/71/merged
+++ /dev/null
@@ -1,3 +0,0 @@
-LDR
-100 __ ‡afu‡bbar
-100 __ ‡afoo‡bbar
\ No newline at end of file
diff --git a/test/suites/data/71/other b/test/suites/data/71/other
deleted file mode 100644
index b702487..0000000
--- a/test/suites/data/71/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-100 __ ‡afu‡bbar
\ No newline at end of file
diff --git a/test/suites/data/71/preferred b/test/suites/data/71/preferred
deleted file mode 100644
index 38ee7ce..0000000
--- a/test/suites/data/71/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-100 __ ‡afoo‡bbar
\ No newline at end of file
diff --git a/test/suites/data/72/merged b/test/suites/data/72/merged
deleted file mode 100644
index cc11097..0000000
--- a/test/suites/data/72/merged
+++ /dev/null
@@ -1,5 +0,0 @@
-LDR
-020 __ ‡axxx-xxx-xxx
-100 __ ‡asome‡bbody
-FOO __ ‡afoo
-245 __ ‡afubar
\ No newline at end of file
diff --git a/test/suites/data/72/other b/test/suites/data/72/other
deleted file mode 100644
index b284e5d..0000000
--- a/test/suites/data/72/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-FOO __ ‡afoo
\ No newline at end of file
diff --git a/test/suites/data/72/preferred b/test/suites/data/72/preferred
deleted file mode 100644
index e621a5c..0000000
--- a/test/suites/data/72/preferred
+++ /dev/null
@@ -1,4 +0,0 @@
-LDR
-020 __ ‡axxx-xxx-xxx
-100 __ ‡asome‡bbody
-245 __ ‡afubar
\ No newline at end of file
diff --git a/test/suites/data/73/merged b/test/suites/data/73/merged
deleted file mode 100644
index b4b31db..0000000
--- a/test/suites/data/73/merged
+++ /dev/null
@@ -1,3 +0,0 @@
-LDR
-700 __ ‡wfu
-700 __ ‡wbar
\ No newline at end of file
diff --git a/test/suites/data/73/other b/test/suites/data/73/other
deleted file mode 100644
index cbca47b..0000000
--- a/test/suites/data/73/other
+++ /dev/null
@@ -1,3 +0,0 @@
-LDR
-700 __ ‡wfoo
-700 __ ‡wbar
\ No newline at end of file
diff --git a/test/suites/data/73/preferred b/test/suites/data/73/preferred
deleted file mode 100644
index b4b31db..0000000
--- a/test/suites/data/73/preferred
+++ /dev/null
@@ -1,3 +0,0 @@
-LDR
-700 __ ‡wfu
-700 __ ‡wbar
\ No newline at end of file
diff --git a/test/suites/data/74/1/merged b/test/suites/data/74/1/merged
deleted file mode 100644
index 174632e..0000000
--- a/test/suites/data/74/1/merged
+++ /dev/null
@@ -1,3 +0,0 @@
-LDR
-007 tu
-100 __ ‡aThis is data
\ No newline at end of file
diff --git a/test/suites/data/74/1/other b/test/suites/data/74/1/other
deleted file mode 100644
index 174632e..0000000
--- a/test/suites/data/74/1/other
+++ /dev/null
@@ -1,3 +0,0 @@
-LDR
-007 tu
-100 __ ‡aThis is data
\ No newline at end of file
diff --git a/test/suites/data/74/1/preferred b/test/suites/data/74/1/preferred
deleted file mode 100644
index f092ee3..0000000
--- a/test/suites/data/74/1/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-100 __ ‡aThis is data
\ No newline at end of file
diff --git a/test/suites/data/74/merged b/test/suites/data/74/merged
deleted file mode 100644
index a7cbe3b..0000000
--- a/test/suites/data/74/merged
+++ /dev/null
@@ -1,4 +0,0 @@
-LDR
-007 tu
-100 __ ‡aThis is data
-100 1_ ‡aThis is data
\ No newline at end of file
diff --git a/test/suites/data/74/other b/test/suites/data/74/other
deleted file mode 100644
index a7cbe3b..0000000
--- a/test/suites/data/74/other
+++ /dev/null
@@ -1,4 +0,0 @@
-LDR
-007 tu
-100 __ ‡aThis is data
-100 1_ ‡aThis is data
\ No newline at end of file
diff --git a/test/suites/data/74/preferred b/test/suites/data/74/preferred
deleted file mode 100644
index f092ee3..0000000
--- a/test/suites/data/74/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-100 __ ‡aThis is data
\ No newline at end of file
diff --git a/test/suites/data/75/74/1/merged b/test/suites/data/75/74/1/merged
deleted file mode 100644
index 174632e..0000000
--- a/test/suites/data/75/74/1/merged
+++ /dev/null
@@ -1,3 +0,0 @@
-LDR
-007 tu
-100 __ ‡aThis is data
\ No newline at end of file
diff --git a/test/suites/data/75/74/1/other b/test/suites/data/75/74/1/other
deleted file mode 100644
index 174632e..0000000
--- a/test/suites/data/75/74/1/other
+++ /dev/null
@@ -1,3 +0,0 @@
-LDR
-007 tu
-100 __ ‡aThis is data
\ No newline at end of file
diff --git a/test/suites/data/75/74/1/preferred b/test/suites/data/75/74/1/preferred
deleted file mode 100644
index f092ee3..0000000
--- a/test/suites/data/75/74/1/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-100 __ ‡aThis is data
\ No newline at end of file
diff --git a/test/suites/data/75/74/merged b/test/suites/data/75/74/merged
deleted file mode 100644
index 03d6d53..0000000
--- a/test/suites/data/75/74/merged
+++ /dev/null
@@ -1,4 +0,0 @@
-LDR
-007 tu
-100 __ ‡aThis is data
-100 1_ ‡aThis is data
diff --git a/test/suites/data/75/74/other b/test/suites/data/75/74/other
deleted file mode 100644
index 03d6d53..0000000
--- a/test/suites/data/75/74/other
+++ /dev/null
@@ -1,4 +0,0 @@
-LDR
-007 tu
-100 __ ‡aThis is data
-100 1_ ‡aThis is data
diff --git a/test/suites/data/75/74/preferred b/test/suites/data/75/74/preferred
deleted file mode 100644
index f092ee3..0000000
--- a/test/suites/data/75/74/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-100 __ ‡aThis is data
\ No newline at end of file
diff --git a/test/suites/data/75/merged b/test/suites/data/75/merged
deleted file mode 100644
index eff39bd..0000000
--- a/test/suites/data/75/merged
+++ /dev/null
@@ -1,4 +0,0 @@
-LDR
-007 tu
-100 __ ‡aThis is data
-100 _1 ‡aThis is data
\ No newline at end of file
diff --git a/test/suites/data/75/other b/test/suites/data/75/other
deleted file mode 100644
index 87da049..0000000
--- a/test/suites/data/75/other
+++ /dev/null
@@ -1,3 +0,0 @@
-LDR
-007 tu
-100 _1 ‡aThis is data
\ No newline at end of file
diff --git a/test/suites/data/75/preferred b/test/suites/data/75/preferred
deleted file mode 100644
index f092ee3..0000000
--- a/test/suites/data/75/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-100 __ ‡aThis is data
\ No newline at end of file
diff --git a/test/suites/data/76/merged b/test/suites/data/76/merged
deleted file mode 100644
index a0b4865..0000000
--- a/test/suites/data/76/merged
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-773 __ ‡afoo‡bbar‡zfubar
\ No newline at end of file
diff --git a/test/suites/data/76/other b/test/suites/data/76/other
deleted file mode 100644
index eeaaab5..0000000
--- a/test/suites/data/76/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-773 __ ‡afoo‡bbar‡zfoobar
\ No newline at end of file
diff --git a/test/suites/data/76/preferred b/test/suites/data/76/preferred
deleted file mode 100644
index a0b4865..0000000
--- a/test/suites/data/76/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-773 __ ‡afoo‡bbar‡zfubar
\ No newline at end of file
diff --git a/test/suites/data/77/descr b/test/suites/data/77/descr
deleted file mode 100644
index 305a77a..0000000
--- a/test/suites/data/77/descr
+++ /dev/null
@@ -1 +0,0 @@
-Should copy field from the preferred record and include b-subfield only from the preferred field because the subfield are compared as normalized
diff --git a/test/suites/data/77/merged b/test/suites/data/77/merged
deleted file mode 100644
index 856726f..0000000
--- a/test/suites/data/77/merged
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-500 #_ ‡aNote‡bSecond subfield
\ No newline at end of file
diff --git a/test/suites/data/77/other b/test/suites/data/77/other
deleted file mode 100644
index b50f2f5..0000000
--- a/test/suites/data/77/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-500 #_ ‡aNote‡bsecond subfield
\ No newline at end of file
diff --git a/test/suites/data/77/preferred b/test/suites/data/77/preferred
deleted file mode 100644
index 856726f..0000000
--- a/test/suites/data/77/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-500 #_ ‡aNote‡bSecond subfield
\ No newline at end of file
diff --git a/test/suites/data/78/merged b/test/suites/data/78/merged
deleted file mode 100644
index 71f4ba6..0000000
--- a/test/suites/data/78/merged
+++ /dev/null
@@ -1,3 +0,0 @@
-LDR
-400 ‡aasd
-500 ‡akeep‡basd
\ No newline at end of file
diff --git a/test/suites/data/78/other b/test/suites/data/78/other
deleted file mode 100644
index 87bd710..0000000
--- a/test/suites/data/78/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-500 ‡akeep‡basd
\ No newline at end of file
diff --git a/test/suites/data/78/preferred b/test/suites/data/78/preferred
deleted file mode 100644
index fbfec16..0000000
--- a/test/suites/data/78/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-400 ‡aasd
\ No newline at end of file
diff --git a/test/suites/data/79/merged b/test/suites/data/79/merged
deleted file mode 100644
index fbfec16..0000000
--- a/test/suites/data/79/merged
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-400 ‡aasd
\ No newline at end of file
diff --git a/test/suites/data/79/other b/test/suites/data/79/other
deleted file mode 100644
index 3a4e58f..0000000
--- a/test/suites/data/79/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-500 ‡adrop‡basd
\ No newline at end of file
diff --git a/test/suites/data/79/preferred b/test/suites/data/79/preferred
deleted file mode 100644
index fbfec16..0000000
--- a/test/suites/data/79/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-400 ‡aasd
\ No newline at end of file
diff --git a/test/suites/data/8/descr b/test/suites/data/8/descr
deleted file mode 100644
index bfe19d2..0000000
--- a/test/suites/data/8/descr
+++ /dev/null
@@ -1 +0,0 @@
-should move specifically configured subfields if the fields are identical (sans configured subfields)
diff --git a/test/suites/data/8/merged b/test/suites/data/8/merged
deleted file mode 100644
index a9f9273..0000000
--- a/test/suites/data/8/merged
+++ /dev/null
@@ -1,3 +0,0 @@
-LDR
-490 #_ ‡aNote‡9THISLOWTAG‡9OTHERLOWTAG
-500 #_ ‡aNote‡bSecond subfield
\ No newline at end of file
diff --git a/test/suites/data/8/other b/test/suites/data/8/other
deleted file mode 100644
index 399aa63..0000000
--- a/test/suites/data/8/other
+++ /dev/null
@@ -1,3 +0,0 @@
-LDR
-490 #_ ‡aNote‡9OTHERLOWTAG
-505 #_ ‡bField505
\ No newline at end of file
diff --git a/test/suites/data/8/preferred b/test/suites/data/8/preferred
deleted file mode 100644
index 8756798..0000000
--- a/test/suites/data/8/preferred
+++ /dev/null
@@ -1,3 +0,0 @@
-LDR
-490 #_ ‡aNote‡9THISLOWTAG
-500 #_ ‡aNote‡bSecond subfield
\ No newline at end of file
diff --git a/test/suites/data/80/merged b/test/suites/data/80/merged
deleted file mode 100644
index 7069727..0000000
--- a/test/suites/data/80/merged
+++ /dev/null
@@ -1,3 +0,0 @@
-LDR
-400 ‡aasd
-500 ‡akeep‡basd
diff --git a/test/suites/data/80/other b/test/suites/data/80/other
deleted file mode 100644
index 87bd710..0000000
--- a/test/suites/data/80/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-500 ‡akeep‡basd
\ No newline at end of file
diff --git a/test/suites/data/80/preferred b/test/suites/data/80/preferred
deleted file mode 100644
index fbfec16..0000000
--- a/test/suites/data/80/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-400 ‡aasd
\ No newline at end of file
diff --git a/test/suites/data/81/merged b/test/suites/data/81/merged
deleted file mode 100644
index fbfec16..0000000
--- a/test/suites/data/81/merged
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-400 ‡aasd
\ No newline at end of file
diff --git a/test/suites/data/81/other b/test/suites/data/81/other
deleted file mode 100644
index 3a4e58f..0000000
--- a/test/suites/data/81/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-500 ‡adrop‡basd
\ No newline at end of file
diff --git a/test/suites/data/81/preferred b/test/suites/data/81/preferred
deleted file mode 100644
index fbfec16..0000000
--- a/test/suites/data/81/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-400 ‡aasd
\ No newline at end of file
diff --git a/test/suites/data/82/merged b/test/suites/data/82/merged
deleted file mode 100644
index 570f888..0000000
--- a/test/suites/data/82/merged
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-500 ‡basd
\ No newline at end of file
diff --git a/test/suites/data/82/other b/test/suites/data/82/other
deleted file mode 100644
index 570f888..0000000
--- a/test/suites/data/82/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-500 ‡basd
\ No newline at end of file
diff --git a/test/suites/data/82/preferred b/test/suites/data/82/preferred
deleted file mode 100644
index b3717f0..0000000
--- a/test/suites/data/82/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-500 ‡aasd
\ No newline at end of file
diff --git a/test/suites/data/83/merged b/test/suites/data/83/merged
deleted file mode 100644
index 0147222..0000000
--- a/test/suites/data/83/merged
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-650 ‡akirjastot‡2ysa‡9FENNI
\ No newline at end of file
diff --git a/test/suites/data/83/other b/test/suites/data/83/other
deleted file mode 100644
index 0147222..0000000
--- a/test/suites/data/83/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-650 ‡akirjastot‡2ysa‡9FENNI
\ No newline at end of file
diff --git a/test/suites/data/83/preferred b/test/suites/data/83/preferred
deleted file mode 100644
index e6279ac..0000000
--- a/test/suites/data/83/preferred
+++ /dev/null
@@ -1 +0,0 @@
-LDR
\ No newline at end of file
diff --git a/test/suites/data/84/merged b/test/suites/data/84/merged
deleted file mode 100644
index 0147222..0000000
--- a/test/suites/data/84/merged
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-650 ‡akirjastot‡2ysa‡9FENNI
\ No newline at end of file
diff --git a/test/suites/data/84/other b/test/suites/data/84/other
deleted file mode 100644
index 217030c..0000000
--- a/test/suites/data/84/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-650 ‡akirjastot‡2ysa‡9FENNI‡9ALMA
\ No newline at end of file
diff --git a/test/suites/data/84/preferred b/test/suites/data/84/preferred
deleted file mode 100644
index e6279ac..0000000
--- a/test/suites/data/84/preferred
+++ /dev/null
@@ -1 +0,0 @@
-LDR
\ No newline at end of file
diff --git a/test/suites/data/85/merged b/test/suites/data/85/merged
deleted file mode 100644
index 93842a6..0000000
--- a/test/suites/data/85/merged
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-650 ‡akirjastot‡2ysa‡9ALMA‡9FENNI
\ No newline at end of file
diff --git a/test/suites/data/85/other b/test/suites/data/85/other
deleted file mode 100644
index 0147222..0000000
--- a/test/suites/data/85/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-650 ‡akirjastot‡2ysa‡9FENNI
\ No newline at end of file
diff --git a/test/suites/data/85/preferred b/test/suites/data/85/preferred
deleted file mode 100644
index a5feed8..0000000
--- a/test/suites/data/85/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-650 ‡akirjastot‡2ysa‡9ALMA
\ No newline at end of file
diff --git a/test/suites/data/86/merged b/test/suites/data/86/merged
deleted file mode 100644
index bd4730e..0000000
--- a/test/suites/data/86/merged
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-650 ‡akirjastot‡2ysa‡9FENNI
\ No newline at end of file
diff --git a/test/suites/data/86/other b/test/suites/data/86/other
deleted file mode 100644
index ddfa99b..0000000
--- a/test/suites/data/86/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-650 ‡akirjastot‡2ysa‡9FENNI‡9FENNI
\ No newline at end of file
diff --git a/test/suites/data/86/preferred b/test/suites/data/86/preferred
deleted file mode 100644
index e6279ac..0000000
--- a/test/suites/data/86/preferred
+++ /dev/null
@@ -1 +0,0 @@
-LDR
\ No newline at end of file
diff --git a/test/suites/data/87/merged b/test/suites/data/87/merged
deleted file mode 100644
index a5feed8..0000000
--- a/test/suites/data/87/merged
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-650 ‡akirjastot‡2ysa‡9ALMA
\ No newline at end of file
diff --git a/test/suites/data/87/other b/test/suites/data/87/other
deleted file mode 100644
index 93842a6..0000000
--- a/test/suites/data/87/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-650 ‡akirjastot‡2ysa‡9ALMA‡9FENNI
\ No newline at end of file
diff --git a/test/suites/data/87/preferred b/test/suites/data/87/preferred
deleted file mode 100644
index e6279ac..0000000
--- a/test/suites/data/87/preferred
+++ /dev/null
@@ -1 +0,0 @@
-LDR
\ No newline at end of file
diff --git a/test/suites/data/88/merged b/test/suites/data/88/merged
deleted file mode 100644
index 0147222..0000000
--- a/test/suites/data/88/merged
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-650 ‡akirjastot‡2ysa‡9FENNI
\ No newline at end of file
diff --git a/test/suites/data/88/other b/test/suites/data/88/other
deleted file mode 100644
index ddfa99b..0000000
--- a/test/suites/data/88/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-650 ‡akirjastot‡2ysa‡9FENNI‡9FENNI
\ No newline at end of file
diff --git a/test/suites/data/88/preferred b/test/suites/data/88/preferred
deleted file mode 100644
index e6279ac..0000000
--- a/test/suites/data/88/preferred
+++ /dev/null
@@ -1 +0,0 @@
-LDR
\ No newline at end of file
diff --git a/test/suites/data/9/descr b/test/suites/data/9/descr
deleted file mode 100644
index 9fc3e1b..0000000
--- a/test/suites/data/9/descr
+++ /dev/null
@@ -1 +0,0 @@
-should normalize for comparison but preserve diacritics in copy action
diff --git a/test/suites/data/9/merged b/test/suites/data/9/merged
deleted file mode 100644
index 7fbb101..0000000
--- a/test/suites/data/9/merged
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-500 #_ ‡aCafé
\ No newline at end of file
diff --git a/test/suites/data/9/other b/test/suites/data/9/other
deleted file mode 100644
index 650fe10..0000000
--- a/test/suites/data/9/other
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-500 #_ ‡aCafe
\ No newline at end of file
diff --git a/test/suites/data/9/preferred b/test/suites/data/9/preferred
deleted file mode 100644
index 7fbb101..0000000
--- a/test/suites/data/9/preferred
+++ /dev/null
@@ -1,2 +0,0 @@
-LDR
-500 #_ ‡aCafé
\ No newline at end of file
diff --git a/test/test.js b/test/test.js
deleted file mode 100644
index c1ae316..0000000
--- a/test/test.js
+++ /dev/null
@@ -1,1017 +0,0 @@
-/**
- *
- * @licstart The following is the entire license notice for the JavaScript code in this file.
- *
- * A configurable Javascript module for merging MARC records
- *
- * Copyright (c) 2015-2017 University Of Helsinki (The National Library Of Finland)
- *
- * This file is part of marc-record-merge
- *
- * marc-record-merge is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- *
- * @licend The above is the entire license notice
- * for the JavaScript code in this file.
- *
- **/
-
-(function (root, factory) {
-
- 'use strict';
- if (typeof define === 'function' && define.amd) {
- define([
- 'chai/chai',
- 'marc-record-js',
- '../lib/main',
- '@natlibfi/es6-shims/lib/shims/array'
- ], factory);
- } else if (typeof module === 'object' && module.exports) {
- module.exports = factory(
- require('chai'),
- require('marc-record-js'),
- require('../lib/main'),
- require('@natlibfi/es6-shims/lib/shims/array')
- );
- }
-
-}(this, factory));
-
-function factory(chai, MarcRecord, mergeFactory, shim_array)
-{
-
- 'use strict';
-
- return function(getResources)
- {
-
- function runSuite(name_data, name_config, doneCallback, plugins)
- {
- try {
- getResources(name_data, name_config).then(function(resources) {
-
- var record_preferred, record_other, record_merged;
-
- try {
- record_preferred = MarcRecord.fromString(resources.data.preferred);
- record_other = MarcRecord.fromString(resources.data.other);
- record_merged = mergeFactory(resources.config, plugins)(record_preferred, record_other);
-
- expect(record_merged.toString().trim()).to.equal(resources.data.merged.trim(), 'merged do not match');
- expect(record_preferred.toString().trim()).to.equal(resources.data.preferred.trim(), 'preferreds do not match');
- expect(record_other.toString().trim()).to.equal(resources.data.other.trim(), 'others do not match');
-
- doneCallback();
-
- } catch (e_inner) {
- doneCallback(e_inner);
- }
-
- }, function (error) {
- doneCallback(error);
- });
- } catch (e) {
- doneCallback(e);
- }
- }
-
- var expect = chai.expect;
-
- describe('factory', function() {
-
- it('Should be a function', function() {
- expect(mergeFactory).to.be.a('function');
- });
-
- it('Should return a function', function() {
- expect(function() {
-
- mergeFactory({
- fields: []
- });
-
- }).to.be.a('function');
- });
-
- it('Should return a function with empty plugins', function() {
- expect(mergeFactory({
- fields: []
- }, {
- plugins: {}
- })).to.be.a('function');
- });
-
- });
-
- describe('object', function() {
-
- it('Should apply plugins', function() {
- expect(function() {
- mergeFactory({
- fields: {
- '...': {
- action: 'foobar'
- }
- }
- }, {
- actions: {
- foobar: function(record_merged, record_other, options, comparators) {
- comparators.fooBar();
- }
- },
- comparators: {
- fooBar: function() {}
- }
- })(
- new MarcRecord({
- fields: [{
- tag: '001',
- value: 'foo'
- }]
- }),
- new MarcRecord({
- fields: [{
- tag: '001',
- value: 'bar'
- }]
- })
- );
- }).to.not.throw();
- });
-
- });
-
- describe('merge', function() {
-
- it('Should fail because of non-existing action', function() {
- expect(function() {
- mergeFactory({
- fields: {
- '...': {
- action: 'foobar'
- }
- }
- })(
- new MarcRecord({
- fields: [{
- tag: '001',
- value: 'foo'
- }]
- }),
- new MarcRecord({
- fields: [{
- tag: '001',
- value: 'bar'
- }]
- })
- );
- }).to.throw(Error, /^Undefined action \'foobar\'$/);
- });
-
- it("Should be copied from other record if it's not present in preferred record", function(done) {
- runSuite('1', '1to3', done);
- });
-
- it("Should be kept if missing from from other record", function(done) {
- runSuite('2', '1to3', done);
- });
-
- it("Should take it from preferred record if both records have it", function(done) {
- runSuite('3', '1to3', done);
- });
-
- it("Should not copy the field from other record because indicators do not match (Indicator 2)", function(done) {
- runSuite('74', '1to3', done);
- });
-
- it("Should not copy the field from other record because indicators do not match (Indicator 1)", function(done) {
- runSuite('75', '1to3', done);
- });
-
- it("Should use the field with more information is used", function(done) {
- runSuite('4', '4to26', done);
- });
- it("Should keep only one copy of identical fields in the merged record", function(done) {
- runSuite('5', '4to26', done);
- });
- it("Should only copy fields that are configured", function(done) {
- runSuite('6', '4to26', done);
- });
- it("Should copy whole field instead of merging specifically configured subfields if the fields are not identical", function(done) {
- runSuite('7', '4to26', done);
- });
-
- it("Should copy because copyIf matches", function(done) {
- runSuite('78', '78to79', done);
- });
-
- it("Should not copy because copyIf does not match", function(done) {
- runSuite('79', '78to79', done);
- });
-
- it("Should copy because copyUnless does not match", function(done) {
- runSuite('80', '80to81', done);
- });
-
- it("Should not copy because copyUnless matches", function(done) {
- runSuite('81', '80to81', done);
- });
-
- it("Should copy field from other record and discard from preferred", function(done) {
- runSuite('82', '82', done);
- });
-
- it("It should keep matched subfield", function(done) {
- runSuite('83', '83to85', done);
- });
-
- it("It should drop unmatched subfields", function(done) {
- runSuite('84', '83to85', done);
- });
-
- it("It should keep subfields from preferred", function(done) {
- runSuite('85', '83to85', done);
- });
-
- it("It should keep exactly matched subfield", function(done) {
- runSuite('86', '86', done);
- });
-
- it("It should keep unmatched subfield", function(done) {
- runSuite('87', '87', done);
- });
-
- it("It should keep exactly unmatched subfield", function(done) {
- runSuite('88', '88', done);
- });
-
- it("Should move specifically configured subfields if the fields are identical (sans configured subfields)", function(done) {
- runSuite('8', '4to26', done);
- });
- it("Should normalize for comparison but preserve diacritics in copy action", function(done) {
- runSuite('9', '4to26', done);
- });
- it("Should normalize for comparison but preserve diacritics in move subfields action", function(done) {
- runSuite('10', '4to26', done);
- });
- it("Should normalize case for comparison but preserve it in copy action", function(done) {
- runSuite('11', '4to26', done);
- });
- it("Should normalize punctuation for comparison but preserve it in move subfields action", function(done) {
- runSuite('12', '4to26', done);
- });
- it("Should handle controlfields correctly", function(done) {
- runSuite('13', '4to26', done);
- });
- it("Should select better field from preferred record", function(done) {
- runSuite('14', '4to26', done);
- });
- it("Should select better field from other record", function(done) {
- runSuite('15', '4to26', done);
- });
- it("Should select better field from other record, making comparison without 'compareWithout' subfields.", function(done) {
- runSuite('16', '4to26', done);
- });
- it("Should move only one instance of 'compareWithout' fields to merged", function(done) {
- runSuite('17', '4to26', done);
- });
- it("Should select better field from preferred record, making comparison without 'compareWithout' subfields.", function(done) {
- runSuite('18', '4to26', done);
- });
- it("Should handle e subfields in field 700 with compareWithout setting.", function(done) {
- runSuite('19', '4to26', done);
- });
- it("Should handle e subfields with compareWithout setting.", function(done) {
- runSuite('20', '4to26', done);
- });
- it("Should copy field from the preferred record and include b-subfield only from the preferred field because the subfield are compared as normalized", function(done) {
- runSuite('77', '77', done);
- });
- it("Should not mess up any fields.", function(done) {
- runSuite('21', '4to26', done);
- });
- it("Should not mess up any fields.", function(done) {
- runSuite('22', '4to26', done);
- });
- it("Should use field from other record if the preferred record is proper subset. Note that only fields that have been marked in config will be handled.", function(done) {
- runSuite('23', '4to26', done);
- });
- it("Should compare without indicators if compareWithoutIndicators options is true. Selects the field with most indicators.", function(done) {
- runSuite('24', '4to26', done);
- });
- it("Should compare without indicators if compareWithoutIndicators options is true. Selects the field with most indicators.", function(done) {
- runSuite('25', '4to26', done);
- });
- it("Should only make superset comparisons when identical fields are not present.", function(done) {
- runSuite('26', '4to26', done);
- });
-
- it("Should move field matching regex", function(done) {
- runSuite('27', '27to28', done);
- });
- it("Should move fields matching regex", function(done) {
- runSuite('28', '27to28', done);
- });
- it("Should not copy field from other if preferred already has one", function(done) {
- runSuite('29', '29to31', done);
- });
- it("Should copy field from other if preferred doesn't have one", function(done) {
- runSuite('30', '29to31', done);
- });
-
- it("Should keep data from preferred if other doesn't have it", function(done) {
- runSuite('31', '29to31', done);
- });
-
- it("Should select the field that has more subfields using substring comparison of field equality", function(done) {
- getResources('32', '32to40').then(function(resources) {
- try {
-
- var record_preferred = MarcRecord.fromString(resources.data.preferred);
- var record_other = MarcRecord.fromString(resources.data.other);
-
- expect(function() {
- mergeFactory(resources.config)(record_preferred, record_other);
- }).to.throw(/^selectBetter cannot be used if there are multiple fields of same tag/);
-
- done();
-
- } catch (e ) {
- done(e);
- }
- }, done);
- });
-
- it("SelectBetter option should not create a copy of identical fields", function(done) {
- runSuite('33', '32to40', done);
- });
-
- it("SelectBetter option should not create a copy of non-identical fields and it should use the one in preferred if neither is subset", function(done) {
- runSuite('34', '32to40', done);
- });
-
- it("SelectBetter option should use the field from other record if it's a superset", function(done) {
- runSuite('35', '32to40', done);
- });
-
- it("SelectBetter option should use the field from preferred record if it's a superset", function(done) {
- runSuite('36', '32to40', done);
- });
-
- it("SelectBetter should copy the field from other if it's missing from preferred", function(done) {
- runSuite('37', '32to40', done);
- });
-
- it("SelectBetter should keep the field from preferred if it's missing from other", function(done) {
- runSuite('38', '32to40', done);
- });
-
- it("Should select the field that has more subfields using substring comparison of field equality", function(done) {
- runSuite('39', '32to40', done);
- });
-
- it("Should select the field that has better subfields if the fields have equal sets of subfields using substring comparator", function(done) {
- runSuite('40', '32to40', done);
- });
- it("Should select the field from other when it has more subfields", function(done) {
- runSuite('41', '41to43', done);
- });
-
- it("Should select the field from preferred when it has more subfields", function(done) {
- runSuite('42', '41to43', done);
- });
-
- it("Should not select the field from other when there is no field in preferred", function(done) {
- runSuite('43', '41to43', done);
- });
-
- it("Should combine identical ISBN fields into a single one.", function(done) {
- runSuite('44', '44to56', done);
- });
-
- it("Should compare ISBN field equality without q-subfield.", function(done) {
- runSuite('45', '44to56', done);
- });
-
- it("Should merge multiple different q-subfields to the same field. ", function(done) {
- runSuite('46', '44to56', done);
- });
-
- it("Should create an array of c subfields if there are multiple different ones.", function(done) {
- runSuite('47', '44to56', done);
- });
-
- it("Should merge multiple similar z-subfields.", function(done) {
- runSuite('48', '44to56', done);
- });
-
- it("Should keep all of the subfields", function(done) {
- runSuite('49', '44to56', done);
- });
-
- it("Should not make multiple isbn fields from similar items", function(done) {
- runSuite('50', '44to56', done);
- });
-
- it("Should not make multiple isbn fields from similar items", function(done) {
- runSuite('51', '44to56', done);
- });
-
- it("Should merge multiple different z-subfields to the same field. ", function(done) {
- runSuite('52', '44to56', done);
- });
-
- it("Should not merge multiple different z,q-subfields to the same field when a-subfield is missing.", function(done) {
- runSuite('53', '44to56', done);
- });
-
- it("Should merge multiple different z-subfields to the same field. ", function(done) {
- runSuite('54', '44to56', done);
- });
-
- it("Should not merge multiple fields if all of the subfields are marked as compareWithout", function(done) {
- runSuite('55', '44to56', done);
- });
-
- it("Should create an array of c subfields if there are multiple different ones.", function(done) {
- runSuite('56', '44to56', done);
- });
-
- it("Should not mess up any fields.", function(done) {
- runSuite('57', '57to63', done);
- });
- it("SelectBetter option should not create a copy of identical fields.", function(done) {
- runSuite('58', '57to63', done);
- });
- it("SelectBetter option should not create a copy of non-identical fields and it should use the one in preferred if neither is subset.", function(done) {
- runSuite('59', '57to63', done);
- });
- it("SelectBetter option should use the field from other record if it's a superset", function(done) {
- runSuite('60', '57to63', done);
- });
- it("SelectBetter option should use the field from preferred record if it's a superset", function(done) {
- runSuite('61', '57to63', done);
- });
- it("SelectBetter should copy the field from other if it's missing from preferred.", function(done) {
- runSuite('62', '57to63', done);
- });
- it("SelectBetter should keep the field from preferred if it's missing from other.", function(done) {
- runSuite('63', '57to63', done);
- });
-
- it("Should use custom action", function(done) {
-
- function customAction(record_merged, field_other, options)
- {
-
- record_merged.fields = record_merged.fields.filter(function(field) {
- return field.tag !== '100';
- });
-
- field_other.wasUsed = true;
- field_other.fromOther = true;
- record_merged.fields.push(field_other);
-
- }
-
- runSuite('64', '64', done, {
- actions: {
- chooseField100FromOther: customAction
- }
- });
-
- });
-
- it('It should transform a copied field', function(done) {
- runSuite('65', '65', done);
- });
-
- it('It should pick fields from the other field that is not copied to the merged record', function(done) {
- runSuite('66', '66', done);
- });
-
- it('It should pick only missing fields from the other field that is not copied to the merged record', function(done) {
- runSuite('67', '67', done);
- });
-
- it('It should pick fields from the other field to the preferred field that is considered better', function(done) {
- runSuite('68', '68', done);
- });
-
- it('It should pick fields from the preferred field to the other field that is considered better', function(done) {
- runSuite('69', '69', done);
- });
-
- it('It should pick only missing fields from the other field to the preferred field that is considered better', function(done) {
- runSuite('70', '70', done);
- });
-
- it('Should insert new content before the similar field', function(done) {
- runSuite('71', '71', done);
- });
-
- it('Should insert new content according to specified sort index', function(done) {
- runSuite('72', '72', done);
- });
-
- it("Should keep the preferred field instead of selecting the better one because 'skipOnMultiple' is true", function(done) {
- runSuite('73', '73', done);
- });
-
- it("Should create new field based on field in other record", function() {
- var record_preferred =
- "LDR ^^^^^cam^a2200637zi^4500";
-
- var record_other =
- "LDR ^^^^^cam^a2200637zi^4500" + "\n" +
- "020 ‡a978-952-67417-9-6";
-
- var record_expected =
- "LDR ^^^^^cam^a2200637zi^4500" + "\n" +
- "720 12 ‡z9789526741796‡b123";
-
- var config = { "fields": { "020": { "action": "createFrom", "options": { "convertTag": "720", "ind1": "1", "ind2": "2", "subfields": { "a": { "convertCode": "z", "modifications": [ { "type": "replace", "args": [/-/g, ""] } ] }, "b": { "replaceValue": "123" } } } } } };
-
- var record_preferred_obj = MarcRecord.fromString(record_preferred);
- var record_other_obj = MarcRecord.fromString(record_other);
-
- var record_merged = mergeFactory(config)(record_preferred_obj, record_other_obj);
-
- expect(record_merged.toString().trim()).to.equal(record_expected.trim(), 'merged do not match');
- expect(record_preferred_obj.toString().trim()).to.equal(record_preferred.trim(), 'preferreds do not match');
- expect(record_other_obj.toString().trim()).to.equal(record_other.trim(), 'others do not match');
- });
-
- it("Should add new subfield to existing field using field in other record", function() {
- var record_preferred =
- "LDR ^^^^^cam^a2200637zi^4500" + "\n" +
- "773 ‡7p1am";
-
- var record_other =
- "LDR ^^^^^cam^a2200637zi^4500" + "\n" +
- "100 1 ‡aAbcd";
-
- var record_expected =
- "LDR ^^^^^cam^a2200637zi^4500" + "\n" +
- "773 ‡7p1am‡aAbcd";
-
- var config = { "fields": { "100": { "action": "createFrom", "options": { "convertTag": "773", "useExisting": true, "subfields": { "a": {} } } } } };
-
- var record_preferred_obj = MarcRecord.fromString(record_preferred);
- var record_other_obj = MarcRecord.fromString(record_other);
-
- var record_merged = mergeFactory(config)(record_preferred_obj, record_other_obj);
-
- expect(record_merged.toString().trim()).to.equal(record_expected.trim(), 'merged do not match');
- expect(record_preferred_obj.toString().trim()).to.equal(record_preferred.trim(), 'preferreds do not match');
- expect(record_other_obj.toString().trim()).to.equal(record_other.trim(), 'others do not match');
- });
-
- it("Should create new field based on field in other record using custom function", function() {
- var record_preferred =
- "LDR ^^^^^cam^a2200637zi^4500";
-
- var record_other =
- "LDR ^^^^^cam^a2200637zi^4500" + "\n" +
- "020 ‡a1234567890";
-
- var record_expected =
- "LDR ^^^^^cam^a2200637zi^4500" + "\n" +
- "020 ‡a0987654321";
-
- var reverseString = function(str) {
- if (str === "")
- return "";
- else
- return reverseString(str.substr(1)) + str.charAt(0);
- };
-
- var config = { "fields": { "020": { "action": "createFrom", "options": { "subfields": { "a": { "modifications": [ reverseString ] } } } } } };
-
- var record_preferred_obj = MarcRecord.fromString(record_preferred);
- var record_other_obj = MarcRecord.fromString(record_other);
-
- var record_merged = mergeFactory(config)(record_preferred_obj, record_other_obj);
-
- expect(record_merged.toString().trim()).to.equal(record_expected.trim(), 'merged do not match');
- expect(record_preferred_obj.toString().trim()).to.equal(record_preferred.trim(), 'preferreds do not match');
- expect(record_other_obj.toString().trim()).to.equal(record_other.trim(), 'others do not match');
- });
-
- it("Should add new subfield to existing field keeping field in other record", function() {
- var record_preferred =
- "LDR ^^^^^cam^a2200637zi^4500" + "\n" +
- "773 ‡7p1am";
-
- var record_other =
- "LDR ^^^^^cam^a2200637zi^4500" + "\n" +
- "100 ‡aAbcd";
-
- var record_expected =
- "LDR ^^^^^cam^a2200637zi^4500" + "\n" +
- "773 ‡7p1am" + "\n" +
- "773 ‡aAbcd";
-
- var config = { "fields": { "100": { "action": "createFrom", "options": { "convertTag": "773", "keepExisting": true, "subfields": { "a": {} } } } } };
-
- var record_preferred_obj = MarcRecord.fromString(record_preferred);
- var record_other_obj = MarcRecord.fromString(record_other);
-
- var record_merged = mergeFactory(config)(record_preferred_obj, record_other_obj);
-
- expect(record_merged.toString().trim()).to.equal(record_expected.trim(), 'merged do not match');
- expect(record_preferred_obj.toString().trim()).to.equal(record_preferred.trim(), 'preferreds do not match');
- expect(record_other_obj.toString().trim()).to.equal(record_other.trim(), 'others do not match');
- });
-
- it("Should add new field with subfield concatenating two subfields together", function() {
- var record_preferred =
- "LDR ^^^^^cam^a2200637zi^4500";
-
- var record_other =
- "LDR ^^^^^cam^a2200637zi^4500" + "\n" +
- "260 ‡aabc‡bdef";
-
- var record_expected =
- "LDR ^^^^^cam^a2200637zi^4500" + "\n" +
- "773 ‡dabcdef";
-
- var config = { "fields": { "260": { "action": "createFrom", "options": { "convertTag": "773", "subfields": { "a": { "convertCode": "d", "append": true }, "b": { "convertCode": "d", "append": true } } } } } };
-
- var record_preferred_obj = MarcRecord.fromString(record_preferred);
- var record_other_obj = MarcRecord.fromString(record_other);
-
- var record_merged = mergeFactory(config)(record_preferred_obj, record_other_obj);
-
- expect(record_merged.toString().trim()).to.equal(record_expected.trim(), 'merged do not match');
- expect(record_preferred_obj.toString().trim()).to.equal(record_preferred.trim(), 'preferreds do not match');
- expect(record_other_obj.toString().trim()).to.equal(record_other.trim(), 'others do not match');
- });
-
- it("Should fail to add new field with subfield concatenating two subfields together", function() {
- var record_preferred =
- "LDR ^^^^^cam^a2200637zi^4500" + "\n" +
- "773 ‡dabc‡ddef";
-
- var record_other =
- "LDR ^^^^^cam^a2200637zi^4500" + "\n" +
- "260 ‡aghi";
-
- var config = { "fields": { "260": { "action": "createFrom", "options": { "useExisting": true, "convertTag": "773", "subfields": { "a": { "convertCode": "d", "append": true } } } } } };
-
- expect(function() {
- mergeFactory(config)(MarcRecord.fromString(record_preferred), MarcRecord.fromString(record_other));
- }).to.throw(Error, /^append option cannot be used if there are multiple subfields of same code\.$/);
- });
-
- it("Should modify field based on field in other record", function() {
- var record_preferred =
- "LDR ^^^^^cam^a2200637zi^4500" + "\n" +
- "300 ‡a1 verkkoaineisto (XXX sivua)";
-
- var record_other =
- "LDR ^^^^^cam^a2200637zi^4500" + "\n" +
- "300 ‡a83 s.";
-
- var record_expected =
- "LDR ^^^^^cam^a2200637zi^4500" + "\n" +
- "300 ‡a1 Verkkoaineisto (83 sivua) a";
-
- var config = { "fields": { "300": { "action": "createFrom", "options": { "subfields": { "a": { "modifications": [ { "type": "replace", "args": [/ s\./, " sivua"] }, { "type": "wrap", "args": [ "(", ")" ] }, { "type": "prepend", "args": [ "1 Verkkoaineisto " ] }, { "type": "append", "args": [ " a" ] } ] } } } } } };
-
- var record_preferred_obj = MarcRecord.fromString(record_preferred);
- var record_other_obj = MarcRecord.fromString(record_other);
-
- var record_merged = mergeFactory(config)(record_preferred_obj, record_other_obj);
-
- expect(record_merged.toString().trim()).to.equal(record_expected.trim(), 'merged do not match');
- expect(record_preferred_obj.toString().trim()).to.equal(record_preferred.trim(), 'preferreds do not match');
- expect(record_other_obj.toString().trim()).to.equal(record_other.trim(), 'others do not match');
- });
-
- it("Should fail to modify field because unknown operation", function() {
- var record_preferred =
- "LDR ^^^^^cam^a2200637zi^4500" + "\n" +
- "300 ‡a1 verkkoaineisto (XXX sivua)";
-
- var record_other =
- "LDR ^^^^^cam^a2200637zi^4500" + "\n" +
- "300 ‡a83 s.";
-
- var config = { "fields": { "300": { "action": "createFrom", "options": { "subfields": { "a": { "modifications": [ { "type": "unknown", "args": [/ s\./, " sivua"] } ] } } } } } };
-
- expect(function() {
- mergeFactory(config)(MarcRecord.fromString(record_preferred), MarcRecord.fromString(record_other));
- }).to.throw(Error, /^Undefined string operation 'unknown'$/);
- });
-
- it("Should fail to select a better field because number of subfields are not equal", function() {
- expect(function() {
- mergeFactory({
- fields: {
- '245': {
- action: 'selectBetter',
- options: {
- comparator: 'fooBar'
- }
- }
- }
- }, {
- comparators: {
- 'fooBar': function() { return 1; }
- }
- })(
- new MarcRecord({
- fields: [{
- tag: '245',
- subfields: [{
- code: 'a',
- value: 'foo'
- }]
- }]
- }),
- new MarcRecord({
- fields: [{
- tag: '245',
- subfields: [
- {
- code: 'a',
- value: 'foo'
- },
- {
- code: 'b',
- value: 'bar'
- }
- ]
- }]
- })
- );
- }).to.throw(Error, /^Number of subfields are not equal$/);
- });
-
- it("Should return the merged record and details about the merge process", function() {
-
- var record_merged = new MarcRecord({
- fields: [{
- tag: '003',
- value: 'CaOONL'
- }]
- }),
- record_preferred = new MarcRecord({
- fields: []
- }),
- record_other = new MarcRecord({
- fields: [{
- tag: '003',
- value: 'CaOONL'
- }]
- }),
- result = mergeFactory({
- fields: {
- '003': {
- action: 'controlfield'
- }
- }
- })(record_preferred, record_other, 1);
-
- expect(result).to.be.an('object');
- expect(result).to.have.all.keys(['record', 'details']);
- expect(result.record.toString()).to.eql(record_merged.toString());
- expect(result.details).to.eql({
- '003': [{
- action: 'controlfield',
- index: 0
- }]
- });
-
- });
-
- it('Should return details on multiple fields', function() {
- var result = mergeFactory({
- fields: {
- '...': {
- action: 'copy'
- }
- }
- })(
- new MarcRecord({
- fields: [{
- tag: '001',
- value: 'foo'
- }]
- }),
- new MarcRecord({
- fields: [
- {
- tag: '100',
- subfields: [{
- code: 'a',
- value: 'foo'
- }]
- },
- {
- tag: '100',
- subfields: [{
- code: 'a',
- value: 'bar'
- }]
- }
- ]
- }),
- 1
- );
-
- expect(JSON.parse(JSON.stringify(result))).to.eql({
- record: {
- fields: [
- {
- tag: '001',
- value: 'foo',
- fromPreferred: true,
- wasUsed: true
- },
- {
- tag: '100',
- subfields: [{
- code: 'a',
- value: 'foo'
- }],
- fromOther: true,
- wasUsed: true
- },
- {
- tag: '100',
- subfields: [{
- code: 'a',
- value: 'bar'
- }],
- fromOther: true,
- wasUsed: true
- }
- ]
- },
- details: {
- 100: [
- {
- action: 'copy'
- },
- {
- action: 'copy'
- }
- ]
- }
- });
-
- });
-
- describe("mergeControlfield", function() {
- var preferred, other;
- var config = {
- "fields": {
- "008": {
- "action": "mergeControlfield",
- "options": {
- "actions": [
- {
- "formats": ["BK", "CF", "CR", "MU", "MX", "VM", "MP"],
- "range": [15, 17],
- "significantCaret": false,
- "type": "selectNonEmpty"
- },
- {
- "formats": ["BK", "CF", "CR", "MU", "MX", "VM", "MP"],
- "range": [35, 37],
- "significantCaret": false,
- "type": "selectNonEmpty"
- },
- {
- "formats": ["BK"],
- "range": [18, 21],
- "significantCaret": true,
- "type": "combine"
- },
- {
- "formats": ["MU"],
- "range": [18, 23],
- "significantCaret": true,
- "type": "combine"
- },
-
- ]
- }
- }
- }
- };
- function selectValue(tag, record) {
- var field = shim_array.find(record.fields, function(field) { return field.tag === tag; });
- if (field) {
- return field.value;
- }
- return undefined;
- }
- function setType(chars, leader) {
- return leader.substr(0,6) + chars + leader.substr(8);
- }
- function prime008Fields(preferredValue, otherValue) {
- preferred.appendControlField(['008', preferredValue]);
- other.appendControlField(['008', otherValue]);
- }
-
- function primeTypes(preferredType, otherType) {
-
- var typeChars = {
- 'BK': 'am',
- 'MU': 'cm'
- };
-
- preferred.leader = setType(typeChars[preferredType], preferred.leader);
- other.leader = setType(typeChars[otherType], other.leader);
-
- }
-
- beforeEach(function() {
- preferred = new MarcRecord();
- other = new MarcRecord();
-
- preferred.leader = "00000cam^a2200733^i^4500";
- other.leader = "00000cam^a2200733^i^4500";
- });
-
- function selectMerged008Value() {
- var merged = mergeFactory(config, [])(preferred, other);
- return selectValue('008', merged);
- }
-
- it("should pick value form other if preferred is empty", function() {
- primeTypes('BK', 'BK');
- prime008Fields(
- '861000s1972^^^^||||||||||||||||||||eng||',
- '861000s1972^^^^xxu|||||||||||||||||eng||'
- );
-
- expect(selectMerged008Value()).to.equal('861000s1972^^^^xxu|||||||||||||||||eng||');
- });
-
- it("should not do anything if record types are different", function() {
- primeTypes('BK', 'MU');
- prime008Fields(
- '861000s1972^^^^||||||||||||||||||||eng||',
- '861000s1972^^^^xxu|||||||||||||||||eng||'
- );
-
- expect(selectMerged008Value()).to.equal('861000s1972^^^^||||||||||||||||||||eng||');
- });
-
- it("should combine fragment when action type is combine", function() {
- primeTypes('BK', 'BK');
- prime008Fields(
- '861000s1972^^^^|||abc||||||||||||||eng||',
- '861000s1972^^^^|||abe||||||||||||||eng||'
- );
-
- expect(selectMerged008Value()).to.equal('861000s1972^^^^|||abce|||||||||||||eng||');
- });
-
- it("should not convert uncoded fragment to empty fragment", function() {
- primeTypes('BK', 'BK');
- prime008Fields(
- '861000s1972^^^^||||||||||||||||||||eng||',
- '861000s1972^^^^||||||||||||||||||||eng||'
- );
-
- expect(selectMerged008Value()).to.equal('861000s1972^^^^||||||||||||||||||||eng||');
- });
- it("should fill combined fragment with empty characters", function() {
- primeTypes('BK', 'BK');
- prime008Fields(
- '861000s1972^^^^|||c||||||||||||||||eng||',
- '861000s1972^^^^|||ae|||||||||||||||eng||'
- );
-
- expect(selectMerged008Value()).to.equal('861000s1972^^^^|||ace^|||||||||||||eng||');
- });
- it("should handle combining fragments with non-4 length", function() {
- primeTypes('MU', 'MU');
- prime008Fields(
- '861000s1972^^^^|||c||||||||||||||||eng||',
- '861000s1972^^^^|||ae|||||||||||||||eng||'
- );
-
- expect(selectMerged008Value()).to.equal('861000s1972^^^^|||ace^^^|||||||||||eng||');
- });
- });
- });
-
- };
-
-}