diff --git a/.github/workflows/createrelease.yml b/.github/workflows/createrelease.yml index 45276c6..013b997 100644 --- a/.github/workflows/createrelease.yml +++ b/.github/workflows/createrelease.yml @@ -23,11 +23,6 @@ jobs: - name: Update npm run: | npm install npm@latest - - name: Run Unit Tests - run: | - cd EventStoreProjections - npm install - npm run test - name: Get the version id: get_version @@ -35,7 +30,7 @@ jobs: - name: Build and Publish Nuget Packages run: | - dotnet pack "NugetPackage\NugetPackage.csproj" /p:PackageVersion=${{ steps.get_version.outputs.VERSION }} --output Nugets + nuget pack nuspec\EventStoreProjections.nuspec -Properties version=${{ steps.get_version.outputs.VERSION }} -OutputDirectory Nugets dotnet nuget push Nugets/EventStoreProjections.${{ steps.get_version.outputs.VERSION }}.nupkg --api-key ${{ secrets.PRIVATEFEED_APIKEY }} --source ${{ secrets.PRIVATEFEED_URL }} diff --git a/.github/workflows/nightlybuild.yml b/.github/workflows/nightlybuild.yml index 895bdfc..7167645 100644 --- a/.github/workflows/nightlybuild.yml +++ b/.github/workflows/nightlybuild.yml @@ -22,6 +22,5 @@ jobs: - name: Run Unit Tests run: | - cd EventStoreProjections npm install npm run test diff --git a/.github/workflows/pullrequest.yml b/.github/workflows/pullrequest.yml index 171417c..4fe6fb0 100644 --- a/.github/workflows/pullrequest.yml +++ b/.github/workflows/pullrequest.yml @@ -25,8 +25,7 @@ jobs: npm install npm@latest - name: Run Unit Tests - run: | - cd EventStoreProjections + run: | npm install npm run test diff --git a/.npmignore b/.npmignore new file mode 100644 index 0000000..6d1f565 --- /dev/null +++ b/.npmignore @@ -0,0 +1,2 @@ +test/ +*.log diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..a65d3ad --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "mochaExplorer.files": "test/**/*.js" +} \ No newline at end of file diff --git a/EventStoreProjections.Tests.njsproj.user b/EventStoreProjections.Tests.njsproj.user deleted file mode 100644 index db86229..0000000 --- a/EventStoreProjections.Tests.njsproj.user +++ /dev/null @@ -1,6 +0,0 @@ - - - - Debug|Any CPU - - \ No newline at end of file diff --git a/EventStoreProjections.sln b/EventStoreProjections.sln deleted file mode 100644 index a629d20..0000000 --- a/EventStoreProjections.sln +++ /dev/null @@ -1,31 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.2.32526.322 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9092AA53-FB77-4645-B42D-1CCCA6BD08BD}") = "EventStoreProjections.Tests", "EventStoreProjections\EventStoreProjections.Tests.njsproj", "{0CDD29A1-4491-4025-8920-947FE0E0F01C}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NugetPackage", "NugetPackage\NugetPackage.csproj", "{3F8A3883-3949-4AFF-8A60-D7CB7B48155F}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {0CDD29A1-4491-4025-8920-947FE0E0F01C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0CDD29A1-4491-4025-8920-947FE0E0F01C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0CDD29A1-4491-4025-8920-947FE0E0F01C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0CDD29A1-4491-4025-8920-947FE0E0F01C}.Release|Any CPU.Build.0 = Release|Any CPU - {3F8A3883-3949-4AFF-8A60-D7CB7B48155F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3F8A3883-3949-4AFF-8A60-D7CB7B48155F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3F8A3883-3949-4AFF-8A60-D7CB7B48155F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3F8A3883-3949-4AFF-8A60-D7CB7B48155F}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {FD59068B-48DE-4EBC-8292-C54F7B43A5BB} - EndGlobalSection -EndGlobal diff --git a/EventStoreProjections/.npmrc b/EventStoreProjections/.npmrc deleted file mode 100644 index 0bfcace..0000000 --- a/EventStoreProjections/.npmrc +++ /dev/null @@ -1,2 +0,0 @@ -always-auth=true -@transactionprocessing:registry=https://f.feedz.io/transactionprocessing/nugets/npm/ diff --git a/EventStoreProjections/EventStoreProjections.Tests.njsproj b/EventStoreProjections/EventStoreProjections.Tests.njsproj deleted file mode 100644 index 7c113b5..0000000 --- a/EventStoreProjections/EventStoreProjections.Tests.njsproj +++ /dev/null @@ -1,96 +0,0 @@ - - - 14.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - EventStoreProjections.Tests - EventStoreProjections.Tests - Tape - True - tests\ - - - - Debug - 2.0 - 0cdd29a1-4491-4025-8920-947fe0e0f01c - . - - - - - . - . - v4.0 - {3AF33F2E-1136-4D97-BBB7-1795711AC8B8};{349c5851-65df-11da-9384-00065b846f21};{9092AA53-FB77-4645-B42D-1CCCA6BD08BD} - 1337 - True - - - true - - - true - - - - Code - - - - Code - mocha - True - - - - - - - - - - - - - - - - - - - - False - True - 0 - / - http://localhost:48022/ - False - True - http://localhost:1337 - False - - - - - - - CurrentPage - True - False - False - False - - - - - - - - - False - False - - - - - \ No newline at end of file diff --git a/EventStoreProjections/README.md b/EventStoreProjections/README.md deleted file mode 100644 index 0c928d5..0000000 --- a/EventStoreProjections/README.md +++ /dev/null @@ -1 +0,0 @@ -# EventStoreProjections \ No newline at end of file diff --git a/EventStoreProjections/app.js b/EventStoreProjections/app.js deleted file mode 100644 index 2a98100..0000000 --- a/EventStoreProjections/app.js +++ /dev/null @@ -1,3 +0,0 @@ -'use strict'; - -console.log('Hello world'); \ No newline at end of file diff --git a/EventStoreProjections/libman.json b/EventStoreProjections/libman.json deleted file mode 100644 index ceee271..0000000 --- a/EventStoreProjections/libman.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "version": "1.0", - "defaultProvider": "cdnjs", - "libraries": [] -} \ No newline at end of file diff --git a/EventStoreProjections/package-lock.json b/EventStoreProjections/package-lock.json deleted file mode 100644 index def3919..0000000 --- a/EventStoreProjections/package-lock.json +++ /dev/null @@ -1,1453 +0,0 @@ -{ - "name": "event-store-projections.tests", - "version": "0.0.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "event-store-projections.tests", - "version": "0.0.0", - "dependencies": { - "chai": "^4.3.10", - "event-store-projection-testing-framework": "2023.12.1", - "mocha": "^10.8.2" - } - }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "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==", - "engines": { - "node": ">=8" - } - }, - "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==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "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==" - }, - "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==", - "engines": { - "node": "*" - } - }, - "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==" - }, - "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==", - "engines": { - "node": ">=8" - } - }, - "node_modules/brace-expansion": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", - "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dependencies": { - "fill-range": "^7.1.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==" - }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/chai": { - "version": "4.3.10", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.10.tgz", - "integrity": "sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==", - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.3", - "deep-eql": "^4.1.3", - "get-func-name": "^2.0.2", - "loupe": "^2.3.6", - "pathval": "^1.1.1", - "type-detect": "^4.0.8" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "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/chalk/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==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/check-error": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", - "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", - "dependencies": { - "get-func-name": "^2.0.2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "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/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "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==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "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==" - }, - "node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "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==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/diff": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.2.tgz", - "integrity": "sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A==", - "engines": { - "node": ">=0.3.1" - } - }, - "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==" - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "engines": { - "node": ">=6" - } - }, - "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==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/event-store-projection-testing-framework": { - "version": "2023.12.1", - "resolved": "https://registry.npmjs.org/event-store-projection-testing-framework/-/event-store-projection-testing-framework-2023.12.1.tgz", - "integrity": "sha512-6RXZlNaTDBdudaLbSNx7ukLfcaKX/nsbLgh9klKT3SeTQuVM0Jv2M4Ktlne+eS+vBr3yYQwu476QN2tgk5XjcA==" - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "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==", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "bin": { - "flat": "cli.js" - } - }, - "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==" - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.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==", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-func-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", - "engines": { - "node": "*" - } - }, - "node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "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==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "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==", - "engines": { - "node": ">=8" - } - }, - "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==", - "bin": { - "he": "bin/he" - } - }, - "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==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "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==" - }, - "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==", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "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==", - "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==", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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==", - "engines": { - "node": ">=0.12.0" - } - }, - "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==", - "engines": { - "node": ">=8" - } - }, - "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==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "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==", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/loupe": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", - "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", - "dependencies": { - "get-func-name": "^2.0.1" - } - }, - "node_modules/minimatch": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", - "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mocha": { - "version": "10.8.2", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.8.2.tgz", - "integrity": "sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==", - "dependencies": { - "ansi-colors": "^4.1.3", - "browser-stdout": "^1.3.1", - "chokidar": "^3.5.3", - "debug": "^4.3.5", - "diff": "^5.2.0", - "escape-string-regexp": "^4.0.0", - "find-up": "^5.0.0", - "glob": "^8.1.0", - "he": "^1.2.0", - "js-yaml": "^4.1.0", - "log-symbols": "^4.1.0", - "minimatch": "^5.1.6", - "ms": "^2.1.3", - "serialize-javascript": "^6.0.2", - "strip-json-comments": "^3.1.1", - "supports-color": "^8.1.1", - "workerpool": "^6.5.1", - "yargs": "^16.2.0", - "yargs-parser": "^20.2.9", - "yargs-unparser": "^2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha.js" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "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==" - }, - "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==", - "engines": { - "node": ">=0.10.0" - } - }, - "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==", - "dependencies": { - "wrappy": "1" - } - }, - "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==", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "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==", - "engines": { - "node": "*" - } - }, - "node_modules/picomatch": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "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==", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "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==", - "engines": { - "node": ">=0.10.0" - } - }, - "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==", - "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/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "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==", - "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==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "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==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "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==", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=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==", - "engines": { - "node": ">=4" - } - }, - "node_modules/workerpool": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", - "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==" - }, - "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==", - "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/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "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.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "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==", - "dependencies": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "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==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - }, - "dependencies": { - "ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==" - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==" - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" - }, - "brace-expansion": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", - "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", - "requires": { - "balanced-match": "^1.0.0" - } - }, - "braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "requires": { - "fill-range": "^7.1.1" - } - }, - "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==" - }, - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==" - }, - "chai": { - "version": "4.3.10", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.10.tgz", - "integrity": "sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==", - "requires": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.3", - "deep-eql": "^4.1.3", - "get-func-name": "^2.0.2", - "loupe": "^2.3.6", - "pathval": "^1.1.1", - "type-detect": "^4.0.8" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "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==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "check-error": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", - "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", - "requires": { - "get-func-name": "^2.0.2" - } - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.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" - } - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "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==", - "requires": { - "color-name": "~1.1.4" - } - }, - "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==" - }, - "debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "requires": { - "ms": "^2.1.3" - } - }, - "decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==" - }, - "deep-eql": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", - "requires": { - "type-detect": "^4.0.0" - } - }, - "diff": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.2.tgz", - "integrity": "sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A==" - }, - "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==" - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" - }, - "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==" - }, - "event-store-projection-testing-framework": { - "version": "2023.12.1", - "resolved": "https://registry.npmjs.org/event-store-projection-testing-framework/-/event-store-projection-testing-framework-2023.12.1.tgz", - "integrity": "sha512-6RXZlNaTDBdudaLbSNx7ukLfcaKX/nsbLgh9klKT3SeTQuVM0Jv2M4Ktlne+eS+vBr3yYQwu476QN2tgk5XjcA==" - }, - "fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "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==", - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==" - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "optional": true - }, - "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==" - }, - "get-func-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==" - }, - "glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "requires": { - "is-glob": "^4.0.1" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "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==", - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" - }, - "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==" - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "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==" - }, - "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==" - }, - "js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", - "requires": { - "argparse": "^2.0.1" - } - }, - "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==", - "requires": { - "p-locate": "^5.0.0" - } - }, - "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==", - "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - } - }, - "loupe": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", - "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", - "requires": { - "get-func-name": "^2.0.1" - } - }, - "minimatch": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", - "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "mocha": { - "version": "10.8.2", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.8.2.tgz", - "integrity": "sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==", - "requires": { - "ansi-colors": "^4.1.3", - "browser-stdout": "^1.3.1", - "chokidar": "^3.5.3", - "debug": "^4.3.5", - "diff": "^5.2.0", - "escape-string-regexp": "^4.0.0", - "find-up": "^5.0.0", - "glob": "^8.1.0", - "he": "^1.2.0", - "js-yaml": "^4.1.0", - "log-symbols": "^4.1.0", - "minimatch": "^5.1.6", - "ms": "^2.1.3", - "serialize-javascript": "^6.0.2", - "strip-json-comments": "^3.1.1", - "supports-color": "^8.1.1", - "workerpool": "^6.5.1", - "yargs": "^16.2.0", - "yargs-parser": "^20.2.9", - "yargs-unparser": "^2.0.0" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "requires": { - "wrappy": "1" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "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==", - "requires": { - "p-limit": "^3.0.2" - } - }, - "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==" - }, - "pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==" - }, - "picomatch": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==" - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "requires": { - "picomatch": "^2.2.1" - } - }, - "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==" - }, - "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==" - }, - "serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "requires": { - "randombytes": "^2.1.0" - } - }, - "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==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "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==" - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "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==", - "requires": { - "is-number": "^7.0.0" - } - }, - "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==" - }, - "workerpool": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", - "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==" - }, - "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==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "requires": { - "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" - } - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" - }, - "yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "requires": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - } - }, - "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==" - } - } -} diff --git a/EventStoreProjections/package.json b/EventStoreProjections/package.json deleted file mode 100644 index bc7845d..0000000 --- a/EventStoreProjections/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "event-store-projections.tests", - "version": "0.0.0", - "description": "EventStoreProjections.Tests", - "main": "app.js", - "author": { - "name": "" - }, - "dependencies": { - "event-store-projection-testing-framework": "2023.12.1", - "chai": "^4.3.10", - "mocha": "^10.8.2" - }, - "scripts": { - "test": "mocha --full-trace 'test/*.js' --recursive" - } -} diff --git a/EventStoreProjections/projections.nuspec b/EventStoreProjections/projections.nuspec deleted file mode 100644 index 09be76e..0000000 --- a/EventStoreProjections/projections.nuspec +++ /dev/null @@ -1,19 +0,0 @@ - - - - EventStoreProjections - $version$ - Transaction Processing - - Transaction Processing Eventstore Projections - https://github.com/TransactionProcessing/EventStoreProjections - https://github.com/TransactionProcessing/EventStoreProjections - - - - - - - - - \ No newline at end of file diff --git a/EventStoreProjections/test/EstateAggregatorTests.js b/EventStoreProjections/test/EstateAggregatorTests.js deleted file mode 100644 index 11e4511..0000000 --- a/EventStoreProjections/test/EstateAggregatorTests.js +++ /dev/null @@ -1,430 +0,0 @@ -var testData = require('./TestData.js'); -testData.clearRequireCache(); - -require('../../NugetPackage/projections/continuous/EstateAggregator.js'); -var projection = require('event-store-projection-testing-framework'); -var chai = require("chai"); - -describe('Estate Aggregator Tests', function () { - it('Projection Can Handle Estate Events', function(){ - projection.initialize(); - - var estateId = '3bf2dab2-86d6-44e3-bcf8-51bec65cf8bc'; - var estateName = 'Demo Estate 1'; - var securityUserId = 'e41e6196-4f18-4f49-bab4-ead032c1e52e'; - var emailAddress = 'estateuser@demoestate.co.uk'; - var operatorName = "Safaricom"; - var operatorId = 'e41e6196-4f18-4f49-bab4-ead032c1e52e'; - - var estateCreatedEvent = testData.getEstateCreatedEvent(estateId, estateName); - - var securityUserAddedToEstateEvent = - testData.getSecurityUserAddedToEstateEvent(estateId, securityUserId, emailAddress); - - var operatorAddedToEstateEvent = - testData.getOperatorAddedToEstateEvent(estateId, operatorName, operatorId); - - projection.processEvent( - 'EstateAggregate-' + estateId.replace(/-/gi, ""), - estateCreatedEvent.eventType, - estateCreatedEvent.data); - - projection.processEvent( - 'EstateAggregate-' + estateId.replace(/-/gi, ""), - securityUserAddedToEstateEvent.eventType, - securityUserAddedToEstateEvent.data); - - projection.processEvent( - 'EstateAggregate-' + estateId.replace(/-/gi, ""), - operatorAddedToEstateEvent.eventType, - operatorAddedToEstateEvent.data); - - var events = projection.emittedEvents; - chai.expect(events.length).equal(3); - var state = projection.getState(); - chai.expect(state.estates[estateId].name).equal('DemoEstate1'); - }) - - it('Projection Can Handle Merchant Events', function() { - projection.initialize(); - - var estateId = '3bf2dab2-86d6-44e3-bcf8-51bec65cf8bc'; - var estateName = 'Demo Estate'; - var merchantId = 'c4c33d75-f011-40e4-9d97-1f428ab563d8'; - var merchantName = 'Test Merchant 1'; - - var estateCreatedEvent = testData.getEstateCreatedEvent(estateId, estateName); - - // Set up the merchant events - var merchantCreatedEvent = testData.getMerchantCreatedEvent(estateId, merchantId, merchantName); - var addressAddedEvent = testData.getAddressAddedEvent(estateId, merchantId); - var contactAddedEvent = testData.getContactAddedEvent(estateId, merchantId); - - var operatorId1 = '410c55fd-9eef-462d-9267-3649c7dedbff'; - var operatorName1 = 'Safaricom'; - var merchantNumber1 = ''; - var terminalNumber1 = ''; - var operatorAssignedToMerchantEvent = testData.getOperatorAssignedToMerchantEvent(estateId, - merchantId, - operatorId1, - operatorName1, - merchantNumber1, - terminalNumber1); - - var securityUserId = 'e41e6196-4f18-4f49-bab4-ead032c1e52e'; - var emailAddress = 'merchantuser@emulatormerchant.co.uk'; - var securityUserAddedEvent = - testData.getSecurityUserAddedToMerchantEvent(estateId, merchantId, securityUserId, emailAddress); - - var deviceId = '24297b34-b1cf-48bf-a391-eb1b8a48fdc7'; - var deviceIdentifier = 'EMULATOR29X3X2X0'; - var deviceAddedToMerchantEvent = - testData.getDeviceAddedToMerchantEvent(estateId, merchantId, deviceId, deviceIdentifier); - - var depositDateTime = '2020-05-30T06:21:31.356Z'; - var depositAmount = 1000.00; - var manualDepositMadeEvent = - testData.getManualDepositMadeEvent(estateId, merchantId, depositDateTime, depositAmount); - - projection.processEvent( - 'EstateAggregate-' + estateId.replace(/-/gi, ""), - estateCreatedEvent.eventType, - estateCreatedEvent.data); - - projection.processEvent( - 'MerchantAggregate-' + merchantId.replace(/-/gi, ""), - merchantCreatedEvent.eventType, - merchantCreatedEvent.data); - projection.processEvent( - 'MerchantAggregate-' + merchantId.replace(/-/gi, ""), - addressAddedEvent.eventType, - addressAddedEvent.data); - projection.processEvent( - 'MerchantAggregate-' + merchantId.replace(/-/gi, ""), - contactAddedEvent.eventType, - contactAddedEvent.data); - projection.processEvent( - 'MerchantAggregate-' + merchantId.replace(/-/gi, ""), - operatorAssignedToMerchantEvent.eventType, - operatorAssignedToMerchantEvent.data); - projection.processEvent( - 'MerchantAggregate-' + merchantId.replace(/-/gi, ""), - securityUserAddedEvent.eventType, - securityUserAddedEvent.data); - projection.processEvent( - 'MerchantAggregate-' + merchantId.replace(/-/gi, ""), - deviceAddedToMerchantEvent.eventType, - deviceAddedToMerchantEvent.data); - projection.processEvent( - 'MerchantAggregate-' + merchantId.replace(/-/gi, ""), - manualDepositMadeEvent.eventType, - manualDepositMadeEvent.data); - - var events = projection.emittedEvents; - chai.expect(events.length).equal(8); - }) - - it('Projection Can Handle Contract Events', function() { - projection.initialize(); - - var estateId = '3bf2dab2-86d6-44e3-bcf8-51bec65cf8bc'; - var estateName = 'Demo Estate'; - - var estateCreatedEvent = testData.getEstateCreatedEvent(estateId, estateName); - - var contractId = '7975776e-6c75-4fde-ab8b-ff561ceddcbe'; - var operatorId = 'ed2cadd0-5d25-4074-92fd-3de099189bb2'; - var contractDescription = 'Safaricom Contract'; - - var contractCreatedEvent = - testData.getContractCreatedEvent(estateId, contractId, operatorId, contractDescription); - var fixedProductId = '27f8c6a7-4eb4-4398-9519-257b15aff072'; - var fixedProductName = "100 KES Topup"; - var fixedProductDisplayText = "100 KES"; - var fixedProductValue = 100; - - var fixedValueProductAddedToContractEvent = testData.getFixedValueProductAddedToContractEvent(estateId, - contractId, - fixedProductId, - fixedProductName, - fixedProductDisplayText, - fixedProductValue); - - var variableProductId = '4fc2adaa-cf8f-4a67-84ae-deb15860f61a'; - var variableProductName = "Custom"; - var variableProductDisplayText = "Custom"; - var variableValueProductAddedToContractEvent = - testData.getVariableValueProductAddedToContractEvent(estateId, - contractId, - variableProductId, - variableProductName, - variableProductDisplayText); - - var feeDescription = 'Merchant Commission'; - var feeId = 'd740dfa3-0b5e-40b1-a1ed-d369f80f041a'; - var feeValue = 0.5; - var transactionFeeForProductAddedToContractEvent = - testData.getTransactionFeeForProductAddedToContractEvent(estateId, - contractId, - fixedProductId, - feeDescription, - feeId, - feeValue); - - projection.processEvent( - 'EstateAggregate-' + estateId.replace(/-/gi, ""), - estateCreatedEvent.eventType, - estateCreatedEvent.data); - - projection.processEvent( - 'ContractAggregate-' + estateId.replace(/-/gi, ""), - contractCreatedEvent.eventType, - contractCreatedEvent.data); - - projection.processEvent( - 'ContractAggregate-' + estateId.replace(/-/gi, ""), - fixedValueProductAddedToContractEvent.eventType, - fixedValueProductAddedToContractEvent.data); - - projection.processEvent( - 'ContractAggregate-' + estateId.replace(/-/gi, ""), - variableValueProductAddedToContractEvent.eventType, - variableValueProductAddedToContractEvent.data); - - projection.processEvent( - 'ContractAggregate-' + estateId.replace(/-/gi, ""), - transactionFeeForProductAddedToContractEvent.eventType, - transactionFeeForProductAddedToContractEvent.data); - - var events = projection.emittedEvents; - chai.expect(events.length).equal(5); - }) - - it('Projection Can Handle Transaction Events', function() { - projection.initialize(); - - var estateId = '3bf2dab2-86d6-44e3-bcf8-51bec65cf8bc'; - var estateName = 'Demo Estate'; - - var estateCreatedEvent = testData.getEstateCreatedEvent(estateId, estateName); - - var merchantId = 'a2f9ef28-59f8-4f4a-9110-2a4e5a4d2c32'; - var transactionId = 'a355ceef-90b9-46bc-af2c-73701e55a8e4'; - var transactionAmount = 100.0; - var transactionType = 'Logon'; - var contractId = 'a51958f8-dfdf-42cc-a044-7e347b76a1f2'; - var productId = '1f362ae5-6e4e-422e-aacb-a2a9c912441a'; - var customerAccountNumber = '1234567890'; - var calculatedFeeValue = 0.92; - var feeValue = 0.5; - var feeEventCreatedDateTime = '2021-05-28T05:57:40.5876129+00:00'; - var feeId = 'a514c078-80df-4fcf-81c4-07a633ed8a92'; - - var transactionHasStartedEvent = testData.getTransactionHasStartedEvent(estateId, - merchantId, - transactionId, - transactionAmount, - transactionType); - - var productDetailsAddedToTransactionEvent = - testData.getProductDetailsAddedToTransactionEvent(estateId, - merchantId, - transactionId, - contractId, - productId); - - var additionalRequestDataRecordedEvent = testData.getAdditionalRequestDataRecordedEvent(estateId, - merchantId, - transactionId, - transactionAmount, - customerAccountNumber); - - var transactionHasBeenLocallyAuthorisedEvent = - testData.getTransactionHasBeenLocallyAuthorisedEvent(estateId, merchantId, transactionId); - var transactionHasBeenLocallyDeclinedEvent = - testData.getTransactionHasBeenLocallyDeclinedEvent(estateId, merchantId, transactionId); - var transactionAuthorisedByOperatorEvent = - testData.getTransactionAuthorisedByOperatorEvent(estateId, merchantId, transactionId); - var transactionDeclinedByOperatorEvent = - testData.getTransactionDeclinedByOperatorEvent(estateId, merchantId, transactionId); - var transactionHasBeenCompletedEvent = - testData.getTransactionHasBeenCompletedEvent(estateId, - merchantId, - transactionId, - true, - transactionAmount); - var settledMerchantFeeAddedToTransactionEvent = testData.getSettledMerchantFeeAddedToTransactionEvent(estateId, - merchantId, - transactionId, - calculatedFeeValue, - feeEventCreatedDateTime); - - projection.processEvent( - 'EstateAggregate-' + estateId.replace(/-/gi, ""), - estateCreatedEvent.eventType, - estateCreatedEvent.data); - - projection.processEvent( - 'TransactionAggregate-' + transactionId.replace(/-/gi, ""), - transactionHasStartedEvent.eventType, - transactionHasStartedEvent.data); - - projection.processEvent( - 'TransactionAggregate-' + transactionId.replace(/-/gi, ""), - productDetailsAddedToTransactionEvent.eventType, - productDetailsAddedToTransactionEvent.data); - - projection.processEvent( - 'TransactionAggregate-' + transactionId.replace(/-/gi, ""), - additionalRequestDataRecordedEvent.eventType, - additionalRequestDataRecordedEvent.data); - - projection.processEvent('TransactionAggregate-' + transactionId.replace(/-/gi, ""), - transactionHasBeenLocallyAuthorisedEvent.eventType, - transactionHasBeenLocallyAuthorisedEvent.data); - - projection.processEvent('TransactionAggregate-' + transactionId.replace(/-/gi, ""), - transactionHasBeenLocallyDeclinedEvent.eventType, - transactionHasBeenLocallyDeclinedEvent.data); - - projection.processEvent('TransactionAggregate-' + transactionId.replace(/-/gi, ""), - transactionAuthorisedByOperatorEvent.eventType, - transactionAuthorisedByOperatorEvent.data); - - projection.processEvent('TransactionAggregate-' + transactionId.replace(/-/gi, ""), - transactionDeclinedByOperatorEvent.eventType, - transactionDeclinedByOperatorEvent.data); - - projection.processEvent('TransactionAggregate-' + transactionId.replace(/-/gi, ""), - transactionHasBeenCompletedEvent.eventType, - transactionHasBeenCompletedEvent.data); - - projection.processEvent('TransactionAggregate-' + transactionId.replace(/-/gi, ""), - settledMerchantFeeAddedToTransactionEvent.eventType, - settledMerchantFeeAddedToTransactionEvent.data); - - var events = projection.emittedEvents; - chai.expect(events.length).equal(10); - }) - - it('Projection Can Handle Voucher Events', function(){ - projection.initialize(); - - var estateId = '3bf2dab2-86d6-44e3-bcf8-51bec65cf8bc'; - var estateName = 'Demo Estate'; - - var estateCreatedEvent = testData.getEstateCreatedEvent(estateId, estateName); - - var transactionId = '4c41a750-0fc7-421a-9ae2-c7ab7f5d8dca'; - var voucherId = 'b6c8e2c2-6a8b-4fe1-b10e-e054601bc2c6'; - var voucherValue = 10.0; - var voucherCode = '2017251882'; - var voucherGeneratedEvent = - testData.getVoucherGeneratedEvent(estateId, voucherId, transactionId, voucherValue, voucherCode); - - var barcodeAddedEvent = testData.getBarcodeAddedEvent(estateId, voucherId); - - var voucherIssuedEvent = testData.getVoucherIssuedEvent(estateId, voucherId); - - projection.processEvent( - 'EstateAggregate-' + estateId.replace(/-/gi, ""), - estateCreatedEvent.eventType, - estateCreatedEvent.data); - - projection.processEvent( - 'VoucherAggregate-' + voucherId.replace(/-/gi, ""), - voucherGeneratedEvent.eventType, - voucherGeneratedEvent.data); - - projection.processEvent( - 'VoucherAggregate-' + voucherId.replace(/-/gi, ""), - barcodeAddedEvent.eventType, - barcodeAddedEvent.data); - - projection.processEvent( - 'VoucherAggregate-' + voucherId.replace(/-/gi, ""), - voucherIssuedEvent.eventType, - voucherIssuedEvent.data); - - var events = projection.emittedEvents; - chai.expect(events.length).equal(4); - }) - - it('Projection Can Handle File Events', function(){ - projection.initialize(); - var estateId = '3bf2dab2-86d6-44e3-bcf8-51bec65cf8bc'; - var estateName = 'Demo Estate'; - - var estateCreatedEvent = testData.getEstateCreatedEvent(estateId, estateName); - - var merchantId = '40c57207-0dfd-41b9-ae85-f7cd44f22288'; - var userId = '9a53a0a7-73ca-4766-9ce9-85148661ced0'; - var fileId = '5daf6d47-413d-833d-2cda-829ee5d29b28'; - var fileImportLogId = '330cc000-2490-08d9-0000-000000000000'; - var fileProfileId = 'b2a59abf-293d-4a6b-b81b-7007503c3476'; - var lineNumber = 1; - var transactionId = '8a52210e-1aeb-48c5-9571-276a0b781cf7"'; - - var importLogCreatedEvent = - testData.getImportLogCreatedEvent(estateId, fileImportLogId); - var fileAddedToImportLogEvent = testData.getFileAddedToImportLogEvent(estateId, merchantId); - - var fileCreatedEvent = - testData.getFileCreatedEvent(estateId, merchantId, userId, fileId, fileImportLogId, fileProfileId); - var fileLineAddedEvent = testData.getFileLineAddedEvent(estateId, fileId, lineNumber); - var fileLineProcessingSuccessfulEvent = - testData.getFileLineProcessingSuccessfulEvent(estateId, fileId, lineNumber, transactionId); - var fileLineProcessingIgnoredEvent = - testData.getFileLineProcessingIgnoredEvent(estateId, fileId, lineNumber, transactionId); - - var fileLineProcessingFailedEvent = - testData.getFileLineProcessingFailedEvent(estateId, fileId, lineNumber, transactionId); - - var fileProcessingCompletedEvent = testData.getFileProcessingCompletedEvent(estateId, fileId); - - projection.processEvent( - 'EstateAggregate-' + estateId.replace(/-/gi, ""), - estateCreatedEvent.eventType, - estateCreatedEvent.data); - - projection.processEvent( - 'EstateAggregate-' + estateId.replace(/-/gi, ""), - importLogCreatedEvent.eventType, - importLogCreatedEvent.data); - projection.processEvent( - 'FileImportLogAggregate-' + fileImportLogId.replace(/-/gi, ""), - fileAddedToImportLogEvent.eventType, - fileAddedToImportLogEvent.data); - - projection.processEvent( - 'FileAggregate-' + fileId.replace(/-/gi, ""), - fileCreatedEvent.eventType, - fileCreatedEvent.data); - projection.processEvent( - 'FileAggregate-' + fileId.replace(/-/gi, ""), - fileLineAddedEvent.eventType, - fileLineAddedEvent.data); - projection.processEvent( - 'FileAggregate-' + fileId.replace(/-/gi, ""), - fileLineProcessingSuccessfulEvent.eventType, - fileLineProcessingSuccessfulEvent.data); - projection.processEvent( - 'FileAggregate-' + fileId.replace(/-/gi, ""), - fileLineProcessingIgnoredEvent.eventType, - fileLineProcessingIgnoredEvent.data); - projection.processEvent( - 'FileAggregate-' + fileId.replace(/-/gi, ""), - fileLineProcessingFailedEvent.eventType, - fileLineProcessingFailedEvent.data); - projection.processEvent( - 'FileAggregate-' + fileId.replace(/-/gi, ""), - fileProcessingCompletedEvent.eventType, - fileProcessingCompletedEvent.data); - - var events = projection.emittedEvents; - chai.expect(events.length).equal(9); - }) -}) - -// TODO: Settlement Events Tests -// TODO: Messaging Events Tests \ No newline at end of file diff --git a/EventStoreProjections/test/EstateManagementSubscriptionStreamBuilderTests.js b/EventStoreProjections/test/EstateManagementSubscriptionStreamBuilderTests.js deleted file mode 100644 index c98b164..0000000 --- a/EventStoreProjections/test/EstateManagementSubscriptionStreamBuilderTests.js +++ /dev/null @@ -1,144 +0,0 @@ -var testData = require('./TestData.js'); -testData.clearRequireCache(); - -require('../../NugetPackage/projections/continuous/EstateManagementSubscriptionStreamBuilder.js'); -var projection = require('event-store-projection-testing-framework'); -var chai = require("chai"); - -describe('Estate Management Subscription Stream Builder Tests', function () { - it('Projection Can Handle Estate Created Event', function(){ - projection.initialize(); - - projection.setState({ estates: {} }); - - var estateId = '3bf2dab2-86d6-44e3-bcf8-51bec65cf8bc'; - var estateName = 'Demo Estate 1'; - var estateNameNoSpaces = 'DemoEstate1'; - - var estateCreatedEvent = testData.getEstateCreatedEvent(estateId, estateName); - - projection.processEvent( - 'EstateAggregate-' + estateId.replace(/-/gi, ""), - estateCreatedEvent.eventType, - estateCreatedEvent.data); - - var projectionState = projection.getState(); - - chai.expect(projectionState).to.not.be.null; - chai.expect(projectionState.estates[estateId]).to.not.be.null; - chai.expect(projectionState.estates[estateId].name).equal(estateNameNoSpaces); - chai.expect(projectionState.estates[estateId].filteredName).equal(estateName); - }) - - it('Projection Can Handle Transaction Has Been Completed Events', function(){ - projection.initialize(); - - projection.setState({ estates: {}, events:0 }); - - var estateId = '3bf2dab2-86d6-44e3-bcf8-51bec65cf8bc'; - var estateName = 'Demo Estate'; - var estateNameNoSpaces = 'DemoEstate'; - var merchantId = "30ebc670-88ac-4c0c-9631-77547a687bbc"; - var transactionId = "b846cec7-b751-4b33-8da5-5382ebc57541"; - - var estateCreatedEvent = testData.getEstateCreatedEvent(estateId, estateName); - - projection.processEvent( - 'EstateAggregate-' + estateId.replace(/-/gi, ""), - estateCreatedEvent.eventType, - estateCreatedEvent.data); - - var transactionHasBeenCompletedEvent = - testData.getTransactionHasBeenCompletedEvent(estateId, merchantId, transactionId, true, 100.00); - - projection.processEvent( - 'TransactionAggregate-' + transactionId.replace(/-/gi, ""), - transactionHasBeenCompletedEvent.eventType, - transactionHasBeenCompletedEvent.data); - - var projectionState = projection.getState(); - - chai.expect(projectionState).to.not.be.null; - chai.expect(projectionState.estates[estateId]).to.not.be.null; - chai.expect(projectionState.estates[estateId].name).equal(estateNameNoSpaces); - chai.expect(projectionState.estates[estateId].filteredName).equal(estateName); - - var events = projection.emittedEvents; - chai.expect(events.length).equal(1); - }) - - it('Projection Can Handle Merchant Fee Settled Events', function(){ - projection.initialize(); - - projection.setState({ estates: {} }); - - var estateId = '3bf2dab2-86d6-44e3-bcf8-51bec65cf8bc'; - var estateName = 'Demo Estate'; - var estateNameNoSpaces = 'DemoEstate'; - var merchantId = "30ebc670-88ac-4c0c-9631-77547a687bbc"; - var transactionId = "b846cec7-b751-4b33-8da5-5382ebc57541"; - var settlementId = "5bc0c000-aedd-08d9-0000-000000000000"; - - var estateCreatedEvent = testData.getEstateCreatedEvent(estateId, estateName); - - projection.processEvent( - 'EstateAggregate-' + estateId.replace(/-/gi, ""), - estateCreatedEvent.eventType, - estateCreatedEvent.data); - - var merchantFeeSettledEvent = - testData.getMerchantFeeSettledEvent(estateId, merchantId, transactionId, settlementId); - - projection.processEvent( - 'SettlementAggregate-' + settlementId.replace(/-/gi, ""), - merchantFeeSettledEvent.eventType, - merchantFeeSettledEvent.data); - - var projectionState = projection.getState(); - - chai.expect(projectionState).to.not.be.null; - chai.expect(projectionState.estates[estateId]).to.not.be.null; - chai.expect(projectionState.estates[estateId].name).equal(estateNameNoSpaces); - chai.expect(projectionState.estates[estateId].filteredName).equal(estateName); - - var events = projection.emittedEvents; - chai.expect(events.length).equal(1); - }) - - it('Projection Can Handle Statement Generated Events', function(){ - projection.initialize(); - - projection.setState({ estates: {} }); - - var estateId = '3bf2dab2-86d6-44e3-bcf8-51bec65cf8bc'; - var estateName = 'Demo Estate'; - var estateNameNoSpaces = 'DemoEstate'; - var merchantId = "30ebc670-88ac-4c0c-9631-77547a687bbc"; - var merchantStatementId = "71f5fdc4-6661-4a4d-bd61-c5e7f4b01a4a"; - - var estateCreatedEvent = testData.getEstateCreatedEvent(estateId, estateName); - - projection.processEvent( - 'EstateAggregate-' + estateId.replace(/-/gi, ""), - estateCreatedEvent.eventType, - estateCreatedEvent.data); - - var statementGeneratedEvent = - testData.getStatementGeneratedEvent(estateId, merchantId, merchantStatementId); - - projection.processEvent( - 'MerchantStatementAggregate-' + merchantStatementId.replace(/-/gi, ""), - statementGeneratedEvent.eventType, - statementGeneratedEvent.data); - - var projectionState = projection.getState(); - - chai.expect(projectionState).to.not.be.null; - chai.expect(projectionState.estates[estateId]).to.not.be.null; - chai.expect(projectionState.estates[estateId].name).equal(estateNameNoSpaces); - chai.expect(projectionState.estates[estateId].filteredName).equal(estateName); - - var events = projection.emittedEvents; - chai.expect(events.length).equal(1); - }) -}); \ No newline at end of file diff --git a/EventStoreProjections/test/FileProcessorSubscriptionStreamBuilderTests.js b/EventStoreProjections/test/FileProcessorSubscriptionStreamBuilderTests.js deleted file mode 100644 index 37bbd75..0000000 --- a/EventStoreProjections/test/FileProcessorSubscriptionStreamBuilderTests.js +++ /dev/null @@ -1,139 +0,0 @@ -var testData = require('./TestData.js'); -testData.clearRequireCache(); - -require('../../NugetPackage/projections/continuous/FileProcessorSubscriptionStreamBuilder.js'); -var projection = require('event-store-projection-testing-framework'); -var chai = require("chai"); - -describe('File Processor Subscription Stream Builder Tests', function () { - it('Projection Can Handle Estate Created Event', function(){ - projection.initialize(); - - projection.setState({ estates: {} }); - - var estateId = '3bf2dab2-86d6-44e3-bcf8-51bec65cf8bc'; - var estateName = 'Demo Estate 1'; - var estateNameNoSpaces = 'DemoEstate1'; - - var estateCreatedEvent = testData.getEstateCreatedEvent(estateId, estateName); - - projection.processEvent( - 'EstateAggregate-' + estateId.replace(/-/gi, ""), - estateCreatedEvent.eventType, - estateCreatedEvent.data); - - var projectionState = projection.getState(); - - chai.expect(projectionState).to.not.be.null; - chai.expect(projectionState.estates[estateId]).to.not.be.null; - chai.expect(projectionState.estates[estateId].name).equal(estateNameNoSpaces); - chai.expect(projectionState.estates[estateId].filteredName).equal(estateName); - }) - - it('Projection Can Handle File Events', function(){ - projection.initialize(); - - projection.setState({ estates: {} }); - - var estateId = '3bf2dab2-86d6-44e3-bcf8-51bec65cf8bc'; - var estateName = 'Demo Estate'; - var estateNameNoSpaces = 'DemoEstate'; - var merchantId = "30ebc670-88ac-4c0c-9631-77547a687bbc"; - var fileImportLogId = "b846cec7-b751-4b33-8da5-5382ebc57541"; - var fileId = "c89be3a5-8ebc-4f95-adce-084905e678d1"; - var userId = "8fab578b-c23f-41d3-91d2-2b52184637f2"; - var fileProfileId = "22a54491-896f-4a73-8dc1-4f48f050add9"; - var transactionId1 = "6a1bfea7-06c7-46dc-a292-b4d917a900a4"; - var transactionId2 = "a849071c-252a-42de-a77a-1a1651a062ae"; - - var estateCreatedEvent = testData.getEstateCreatedEvent(estateId, estateName); - - projection.processEvent( - 'EstateAggregate-' + estateId.replace(/-/gi, ""), - estateCreatedEvent.eventType, - estateCreatedEvent.data); - - var importLogCreatedEvent = testData.getImportLogCreatedEvent(estateId, fileImportLogId); - - projection.processEvent( - 'FileImportLogAggregate-' + fileImportLogId.replace(/-/gi, ""), - importLogCreatedEvent.eventType, - importLogCreatedEvent.data); - - var fileAddedToImportLog = - testData.getFileAddedToImportLogEvent(estateId, merchantId, userId, fileId, fileProfileId); - - projection.processEvent( - 'FileImportLogAggregate-' + fileImportLogId.replace(/-/gi, ""), - fileAddedToImportLog.eventType, - fileAddedToImportLog.data); - - var fileCreatedEvent = testData.getFileCreatedEvent(estateId, merchantId, userId, fileId, fileProfileId); - - projection.processEvent( - 'FileAggregate-' + fileId.replace(/-/gi, ""), - fileCreatedEvent.eventType, - fileCreatedEvent.data); - - var fileLineAddedEvent1 = testData.getFileLineAddedEvent(estateId, fileId, 1); - - projection.processEvent( - 'FileAggregate-' + fileId.replace(/-/gi, ""), - fileLineAddedEvent1.eventType, - fileLineAddedEvent1.data); - - var fileLineAddedEvent2 = testData.getFileLineAddedEvent(estateId, fileId, 2); - - projection.processEvent( - 'FileAggregate-' + fileId.replace(/-/gi, ""), - fileLineAddedEvent2.eventType, - fileLineAddedEvent2.data); - - var fileLineAddedEvent3 = testData.getFileLineAddedEvent(estateId, fileId, 3); - - projection.processEvent( - 'FileAggregate-' + fileId.replace(/-/gi, ""), - fileLineAddedEvent3.eventType, - fileLineAddedEvent3.data); - - var fileLineProcessingSuccessfulEvent = - testData.getFileLineProcessingSuccessfulEvent(estateId, fileId, 1, transactionId1); - - projection.processEvent( - 'FileAggregate-' + fileId.replace(/-/gi, ""), - fileLineProcessingSuccessfulEvent.eventType, - fileLineProcessingSuccessfulEvent.data); - - var fileLineProcessingIgnoredEvent = testData.getFileLineProcessingIgnoredEvent(estateId, fileId, 2); - - projection.processEvent( - 'FileAggregate-' + fileId.replace(/-/gi, ""), - fileLineProcessingIgnoredEvent.eventType, - fileLineProcessingIgnoredEvent.data); - - var fileLineProcessingFailedEvent = - testData.getFileLineProcessingFailedEvent(estateId, fileId, 3, transactionId2); - - projection.processEvent( - 'FileAggregate-' + fileId.replace(/-/gi, ""), - fileLineProcessingFailedEvent.eventType, - fileLineProcessingFailedEvent.data); - - var fileProcessingCompletedEvent = testData.getFileProcessingCompletedEvent(estateId, fileId); - - projection.processEvent( - 'FileAggregate-' + fileId.replace(/-/gi, ""), - fileProcessingCompletedEvent.eventType, - fileProcessingCompletedEvent.data); - - var projectionState = projection.getState(); - - chai.expect(projectionState).to.not.be.null; - chai.expect(projectionState.estates[estateId]).to.not.be.null; - chai.expect(projectionState.estates[estateId].name).equal(estateNameNoSpaces); - chai.expect(projectionState.estates[estateId].filteredName).equal(estateName); - - var events = projection.emittedEvents; - chai.expect(events.length).equal(10); - }) -}); \ No newline at end of file diff --git a/EventStoreProjections/test/MerchantAggregatorTests.js b/EventStoreProjections/test/MerchantAggregatorTests.js deleted file mode 100644 index a3b4628..0000000 --- a/EventStoreProjections/test/MerchantAggregatorTests.js +++ /dev/null @@ -1,183 +0,0 @@ -var testData = require('./TestData.js'); -testData.clearRequireCache(); - -require('../../NugetPackage/projections/continuous/MerchantAggregator.js'); -var projection = require('event-store-projection-testing-framework'); -var chai = require("chai"); - -describe('Merchant Aggregator Tests', function () { - it('Projection Can Handle Merchant Events', function(){ - projection.initialize(); - - var estateId = '3bf2dab2-86d6-44e3-bcf8-51bec65cf8bc'; - var merchantId = 'c4c33d75-f011-40e4-9d97-1f428ab563d8'; - var merchantName = 'Test Merchant 1'; - - // Set up the merchant events - var merchantCreatedEvent = testData.getMerchantCreatedEvent(estateId, merchantId, merchantName); - var addressAddedEvent = testData.getAddressAddedEvent(estateId, merchantId); - var contactAddedEvent = testData.getContactAddedEvent(estateId, merchantId); - - var operatorId1 = '410c55fd-9eef-462d-9267-3649c7dedbff'; - var operatorName1 = 'Safaricom'; - var merchantNumber1 = ''; - var terminalNumber1 = ''; - var operatorAssignedToMerchantEvent = testData.getOperatorAssignedToMerchantEvent(estateId, - merchantId, - operatorId1, - operatorName1, - merchantNumber1, - terminalNumber1); - - var securityUserId = 'e41e6196-4f18-4f49-bab4-ead032c1e52e'; - var emailAddress = 'merchantuser@emulatormerchant.co.uk'; - var securityUserAddedEvent = - testData.getSecurityUserAddedToMerchantEvent(estateId, merchantId, securityUserId, emailAddress); - - var deviceId = '24297b34-b1cf-48bf-a391-eb1b8a48fdc7'; - var deviceIdentifier = 'EMULATOR29X3X2X0'; - var deviceAddedToMerchantEvent = - testData.getDeviceAddedToMerchantEvent(estateId, merchantId, deviceId, deviceIdentifier); - - var depositDateTime = '2020-05-30T06:21:31.356Z'; - var depositAmount = 1000.00; - var manualDepositMadeEvent = - testData.getManualDepositMadeEvent(estateId, merchantId, depositDateTime, depositAmount); - - projection.processEvent( - 'MerchantAggregate-' + merchantId.replace(/-/gi, ""), - merchantCreatedEvent.eventType, - merchantCreatedEvent.data); - projection.processEvent( - 'MerchantAggregate-' + merchantId.replace(/-/gi, ""), - addressAddedEvent.eventType, - addressAddedEvent.data); - projection.processEvent( - 'MerchantAggregate-' + merchantId.replace(/-/gi, ""), - contactAddedEvent.eventType, - contactAddedEvent.data); - projection.processEvent( - 'MerchantAggregate-' + merchantId.replace(/-/gi, ""), - operatorAssignedToMerchantEvent.eventType, - operatorAssignedToMerchantEvent.data); - projection.processEvent( - 'MerchantAggregate-' + merchantId.replace(/-/gi, ""), - securityUserAddedEvent.eventType, - securityUserAddedEvent.data); - projection.processEvent( - 'MerchantAggregate-' + merchantId.replace(/-/gi, ""), - deviceAddedToMerchantEvent.eventType, - deviceAddedToMerchantEvent.data); - projection.processEvent( - 'MerchantAggregate-' + merchantId.replace(/-/gi, ""), - manualDepositMadeEvent.eventType, - manualDepositMadeEvent.data); - - var events = projection.emittedEvents; - chai.expect(events.length).equal(7); - }) - - it('Projection Can Handle Transaction Events', function(){ - projection.initialize(); - - var estateId = '3bf2dab2-86d6-44e3-bcf8-51bec65cf8bc'; - var merchantId = 'c4c33d75-f011-40e4-9d97-1f428ab563d8'; - var transactionId = 'c4c33d75-f011-40e4-9d97-1f428ab563d8'; - var transactionAmount = 100.00; - var transactionType = 'Sale'; - - var transactionHasStartedEvent = testData.getTransactionHasStartedEvent(estateId, - merchantId, - transactionId, - transactionAmount, - transactionType); - - var contractId = '327678c4-d349-4e1c-b466-f2ea4b0e869b'; - var productId = '001b29c9-91f5-42f9-95d0-6fd9d69a2e18'; - - var productDetailsAddedToTransactionEvent = - testData.getProductDetailsAddedToTransactionEvent(estateId, - merchantId, - transactionId, - contractId, - productId); - - var customerAccountNumber = "1234567890"; - var additionalRequestDataRecordedEvent = testData.getAdditionalRequestDataRecordedEvent(estateId, - merchantId, - transactionId, - transactionAmount, - customerAccountNumber); - - var transactionHasBeenLocallyAuthorisedEvent = - testData.getTransactionHasBeenLocallyAuthorisedEvent(estateId, merchantId, transactionId); - - var transactionHasBeenLocallyDeclinedEvent = - testData.getTransactionHasBeenLocallyDeclinedEvent(estateId, merchantId, transactionId); - - var transactionAuthorisedByOperatorEvent = - testData.getTransactionAuthorisedByOperatorEvent(estateId, merchantId, transactionId); - - var transactionDeclinedByOperatorEvent = - testData.getTransactionDeclinedByOperatorEvent(estateId, merchantId, transactionId); - - var transactionHasBeenCompletedEvent = - testData.getTransactionHasBeenCompletedEvent(estateId, merchantId, transactionId, true); - - var calculatedValue = 5.00; - var eventCreatedDateTime = "2020-05-16T07:47:51.6617562+00:00"; - var settledMerchantFeeAddedToTransactionEvent = testData.getSettledMerchantFeeAddedToTransactionEvent(estateId, - merchantId, - transactionId, - calculatedValue, - eventCreatedDateTime); - - projection.processEvent( - 'TransactionAggregate-' + transactionId.replace(/-/gi, ""), - transactionHasStartedEvent.eventType, - transactionHasStartedEvent.data); - - projection.processEvent( - 'TransactionAggregate-' + transactionId.replace(/-/gi, ""), - productDetailsAddedToTransactionEvent.eventType, - productDetailsAddedToTransactionEvent.data); - - projection.processEvent( - 'TransactionAggregate-' + transactionId.replace(/-/gi, ""), - additionalRequestDataRecordedEvent.eventType, - additionalRequestDataRecordedEvent.data); - - projection.processEvent( - 'TransactionAggregate-' + transactionId.replace(/-/gi, ""), - transactionHasBeenLocallyAuthorisedEvent.eventType, - transactionHasBeenLocallyAuthorisedEvent.data); - - projection.processEvent( - 'TransactionAggregate-' + transactionId.replace(/-/gi, ""), - transactionHasBeenLocallyDeclinedEvent.eventType, - transactionHasBeenLocallyDeclinedEvent.data); - - projection.processEvent( - 'TransactionAggregate-' + transactionId.replace(/-/gi, ""), - transactionAuthorisedByOperatorEvent.eventType, - transactionAuthorisedByOperatorEvent.data); - - projection.processEvent( - 'TransactionAggregate-' + transactionId.replace(/-/gi, ""), - transactionDeclinedByOperatorEvent.eventType, - transactionDeclinedByOperatorEvent.data); - - projection.processEvent( - 'TransactionAggregate-' + transactionId.replace(/-/gi, ""), - transactionHasBeenCompletedEvent.eventType, - transactionHasBeenCompletedEvent.data); - - projection.processEvent( - 'TransactionAggregate-' + transactionId.replace(/-/gi, ""), - settledMerchantFeeAddedToTransactionEvent.eventType, - settledMerchantFeeAddedToTransactionEvent.data); - - var events = projection.emittedEvents; - chai.expect(events.length).equal(9); - }) -}); \ No newline at end of file diff --git a/EventStoreProjections/test/TransactionProcessorSubscriptionStreamBuilderTests.js b/EventStoreProjections/test/TransactionProcessorSubscriptionStreamBuilderTests.js deleted file mode 100644 index e08b187..0000000 --- a/EventStoreProjections/test/TransactionProcessorSubscriptionStreamBuilderTests.js +++ /dev/null @@ -1,91 +0,0 @@ -var testData = require('./TestData.js'); -testData.clearRequireCache(); - -require('../../NugetPackage/projections/continuous/TransactionProcessorSubscriptionStreamBuilder.js'); -var projection = require('event-store-projection-testing-framework'); -var chai = require("chai"); - -describe('Transaction Processor Subscription Stream Builder Tests', function () { - it('Projection Can Handle Estate Created Event', function(){ - projection.initialize(); - - projection.setState({ estates: {} }); - - var estateId = '3bf2dab2-86d6-44e3-bcf8-51bec65cf8bc'; - var estateName = 'Demo Estate 1'; - var estateNameNoSpaces = 'DemoEstate1'; - - var estateCreatedEvent = testData.getEstateCreatedEvent(estateId, estateName); - - projection.processEvent( - 'EstateAggregate-' + estateId.replace(/-/gi, ""), - estateCreatedEvent.eventType, - estateCreatedEvent.data); - - var projectionState = projection.getState(); - - chai.expect(projectionState).to.not.be.null; - chai.expect(projectionState.estates[estateId]).to.not.be.null; - chai.expect(projectionState.estates[estateId].name).equal(estateNameNoSpaces); - chai.expect(projectionState.estates[estateId].filteredName).equal(estateName); - }) - - it('Projection Can Handle Transaction Events', function(){ - projection.initialize(); - - projection.setState({ estates: {} }); - - var estateId = '3bf2dab2-86d6-44e3-bcf8-51bec65cf8bc'; - var estateName = 'Demo Estate'; - var estateNameNoSpaces = 'DemoEstate'; - var merchantId = "30ebc670-88ac-4c0c-9631-77547a687bbc"; - var transactionId = "b846cec7-b751-4b33-8da5-5382ebc57541"; - var customerEmailAddress = "customer@myemail.com"; - - var estateCreatedEvent = testData.getEstateCreatedEvent(estateId, estateName); - - projection.processEvent( - 'EstateAggregate-' + estateId.replace(/-/gi, ""), - estateCreatedEvent.eventType, - estateCreatedEvent.data); - - var customerEmailReceiptRequestedEvent = - testData.getCustomerEmailReceiptRequestedEvent(estateId, merchantId, transactionId, customerEmailAddress); - - projection.processEvent( - 'TransactionAggregate-' + transactionId.replace(/-/gi, ""), - customerEmailReceiptRequestedEvent.eventType, - customerEmailReceiptRequestedEvent.data); - - var transactionHasBeenCompletedEvent = - testData.getTransactionHasBeenCompletedEvent(estateId, merchantId, transactionId, true, 100.00); - - projection.processEvent( - 'TransactionAggregate-' + transactionId.replace(/-/gi, ""), - transactionHasBeenCompletedEvent.eventType, - transactionHasBeenCompletedEvent.data); - - var calculatedValue = 5.00; - var eventCreatedDateTime = "2020-05-16T07:47:51.6617562+00:00"; - var settledMerchantFeeAddedToTransactionEvent = testData.getSettledMerchantFeeAddedToTransactionEvent(estateId, - merchantId, - transactionId, - calculatedValue, - eventCreatedDateTime); - - projection.processEvent( - 'TransactionAggregate-' + transactionId.replace(/-/gi, ""), - settledMerchantFeeAddedToTransactionEvent.eventType, - settledMerchantFeeAddedToTransactionEvent.data); - - var projectionState = projection.getState(); - - chai.expect(projectionState).to.not.be.null; - chai.expect(projectionState.estates[estateId]).to.not.be.null; - chai.expect(projectionState.estates[estateId].name).equal(estateNameNoSpaces); - chai.expect(projectionState.estates[estateId].filteredName).equal(estateName); - - var events = projection.emittedEvents; - chai.expect(events.length).equal(3); - }) -}) \ No newline at end of file diff --git a/NugetPackage/NugetPackage.csproj b/NugetPackage/NugetPackage.csproj deleted file mode 100644 index 6f355e1..0000000 --- a/NugetPackage/NugetPackage.csproj +++ /dev/null @@ -1,38 +0,0 @@ - - - - net6.0 - EventStoreProjections - - - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - - true - - - diff --git a/NugetPackage/NugetPackage.targets b/NugetPackage/NugetPackage.targets deleted file mode 100644 index c1ddd65..0000000 --- a/NugetPackage/NugetPackage.targets +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/NugetPackage/obj/NugetPackage.csproj.nuget.dgspec.json b/NugetPackage/obj/NugetPackage.csproj.nuget.dgspec.json deleted file mode 100644 index cc98163..0000000 --- a/NugetPackage/obj/NugetPackage.csproj.nuget.dgspec.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "format": 1, - "restore": { - "C:\\Projects\\TransactionProcessing\\EventStoreProjections\\NugetPackage\\NugetPackage.csproj": {} - }, - "projects": { - "C:\\Projects\\TransactionProcessing\\EventStoreProjections\\NugetPackage\\NugetPackage.csproj": { - "version": "1.0.0", - "restore": { - "projectUniqueName": "C:\\Projects\\TransactionProcessing\\EventStoreProjections\\NugetPackage\\NugetPackage.csproj", - "projectName": "EventStoreProjections", - "projectPath": "C:\\Projects\\TransactionProcessing\\EventStoreProjections\\NugetPackage\\NugetPackage.csproj", - "packagesPath": "C:\\Users\\stuar\\.nuget\\packages\\", - "outputPath": "C:\\Projects\\TransactionProcessing\\EventStoreProjections\\NugetPackage\\obj\\", - "projectStyle": "PackageReference", - "fallbackFolders": [ - "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages" - ], - "configFilePaths": [ - "C:\\Users\\stuar\\AppData\\Roaming\\NuGet\\NuGet.Config", - "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config", - "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" - ], - "originalTargetFrameworks": [ - "net6.0" - ], - "sources": { - "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {}, - "C:\\Program Files\\dotnet\\library-packs": {}, - "https://api.nuget.org/v3/index.json": {}, - "https://f.feedz.io/transactionprocessing/nugets/nuget/index.json": {}, - "https://www.myget.org/F/tahoe-eposity/auth/024ff48c-540a-4059-8712-d54f7b0d6a31/api/v3/index.json": {}, - "https://www.myget.org/F/vme-intellistore-beta/auth/024ff48c-540a-4059-8712-d54f7b0d6a31/api/v3/index.json": {}, - "https://www.myget.org/F/vme-intellistore/auth/024ff48c-540a-4059-8712-d54f7b0d6a31/api/v3/index.json": {}, - "https://www.myget.org/F/vme-shared/auth/024ff48c-540a-4059-8712-d54f7b0d6a31/api/v3/index.json": {} - }, - "frameworks": { - "net6.0": { - "targetAlias": "net6.0", - "projectReferences": {} - } - }, - "warningProperties": { - "warnAsError": [ - "NU1605" - ] - } - }, - "frameworks": { - "net6.0": { - "targetAlias": "net6.0", - "imports": [ - "net461", - "net462", - "net47", - "net471", - "net472", - "net48", - "net481" - ], - "assetTargetFallback": true, - "warn": true, - "frameworkReferences": { - "Microsoft.NETCore.App": { - "privateAssets": "all" - } - }, - "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\8.0.100\\RuntimeIdentifierGraph.json" - } - } - } - } -} \ No newline at end of file diff --git a/NugetPackage/obj/NugetPackage.csproj.nuget.g.props b/NugetPackage/obj/NugetPackage.csproj.nuget.g.props deleted file mode 100644 index 6a2f27e..0000000 --- a/NugetPackage/obj/NugetPackage.csproj.nuget.g.props +++ /dev/null @@ -1,16 +0,0 @@ - - - - True - NuGet - $(MSBuildThisFileDirectory)project.assets.json - $(UserProfile)\.nuget\packages\ - C:\Users\stuar\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages - PackageReference - 6.9.0 - - - - - - \ No newline at end of file diff --git a/NugetPackage/obj/NugetPackage.csproj.nuget.g.targets b/NugetPackage/obj/NugetPackage.csproj.nuget.g.targets deleted file mode 100644 index 3dc06ef..0000000 --- a/NugetPackage/obj/NugetPackage.csproj.nuget.g.targets +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/NugetPackage/obj/project.assets.json b/NugetPackage/obj/project.assets.json deleted file mode 100644 index e6839db..0000000 --- a/NugetPackage/obj/project.assets.json +++ /dev/null @@ -1,79 +0,0 @@ -{ - "version": 3, - "targets": { - "net6.0": {} - }, - "libraries": {}, - "projectFileDependencyGroups": { - "net6.0": [] - }, - "packageFolders": { - "C:\\Users\\stuar\\.nuget\\packages\\": {}, - "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages": {} - }, - "project": { - "version": "1.0.0", - "restore": { - "projectUniqueName": "C:\\Projects\\TransactionProcessing\\EventStoreProjections\\NugetPackage\\NugetPackage.csproj", - "projectName": "EventStoreProjections", - "projectPath": "C:\\Projects\\TransactionProcessing\\EventStoreProjections\\NugetPackage\\NugetPackage.csproj", - "packagesPath": "C:\\Users\\stuar\\.nuget\\packages\\", - "outputPath": "C:\\Projects\\TransactionProcessing\\EventStoreProjections\\NugetPackage\\obj\\", - "projectStyle": "PackageReference", - "fallbackFolders": [ - "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages" - ], - "configFilePaths": [ - "C:\\Users\\stuar\\AppData\\Roaming\\NuGet\\NuGet.Config", - "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config", - "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" - ], - "originalTargetFrameworks": [ - "net6.0" - ], - "sources": { - "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {}, - "C:\\Program Files\\dotnet\\library-packs": {}, - "https://api.nuget.org/v3/index.json": {}, - "https://f.feedz.io/transactionprocessing/nugets/nuget/index.json": {}, - "https://www.myget.org/F/tahoe-eposity/auth/024ff48c-540a-4059-8712-d54f7b0d6a31/api/v3/index.json": {}, - "https://www.myget.org/F/vme-intellistore-beta/auth/024ff48c-540a-4059-8712-d54f7b0d6a31/api/v3/index.json": {}, - "https://www.myget.org/F/vme-intellistore/auth/024ff48c-540a-4059-8712-d54f7b0d6a31/api/v3/index.json": {}, - "https://www.myget.org/F/vme-shared/auth/024ff48c-540a-4059-8712-d54f7b0d6a31/api/v3/index.json": {} - }, - "frameworks": { - "net6.0": { - "targetAlias": "net6.0", - "projectReferences": {} - } - }, - "warningProperties": { - "warnAsError": [ - "NU1605" - ] - } - }, - "frameworks": { - "net6.0": { - "targetAlias": "net6.0", - "imports": [ - "net461", - "net462", - "net47", - "net471", - "net472", - "net48", - "net481" - ], - "assetTargetFallback": true, - "warn": true, - "frameworkReferences": { - "Microsoft.NETCore.App": { - "privateAssets": "all" - } - }, - "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\8.0.100\\RuntimeIdentifierGraph.json" - } - } - } -} \ No newline at end of file diff --git a/NugetPackage/obj/project.nuget.cache b/NugetPackage/obj/project.nuget.cache deleted file mode 100644 index 50363cb..0000000 --- a/NugetPackage/obj/project.nuget.cache +++ /dev/null @@ -1,8 +0,0 @@ -{ - "version": 2, - "dgSpecHash": "j45ZeoeQfbNNK8ozXACAIgDVpdIcjuiJUKtj7VdoE2uR3VA9oc3bVSjYBF2Nnh/Xv4nz7eioP/hDnvz+jLsVhg==", - "success": true, - "projectFilePath": "C:\\Projects\\TransactionProcessing\\EventStoreProjections\\NugetPackage\\NugetPackage.csproj", - "expectedPackageFiles": [], - "logs": [] -} \ No newline at end of file diff --git a/NugetPackage/projections/continuous/EstateAggregator.js b/NugetPackage/projections/continuous/EstateAggregator.js deleted file mode 100644 index 5f04802..0000000 --- a/NugetPackage/projections/continuous/EstateAggregator.js +++ /dev/null @@ -1,51 +0,0 @@ -//starttestsetup -var fromAll = fromAll || require("../../../EventStoreProjections/node_modules/event-store-projection-testing-framework").scope.fromAll; -var linkTo = linkTo || require("../../../EventStoreProjections/node_modules/event-store-projection-testing-framework").scope.linkTo; -//endtestsetup - -isEstateEvent = (e) => { return (e.data && e.data.estateId); } -isAnEstateCreatedEvent = (e) => { return compareEventTypeSafely(e.eventType, 'EstateCreatedEvent') }; - -isAMerchantFeeAddedToTransactionEvent = (e) => { return compareEventTypeSafely(e.eventType, 'MerchantFeeAddedToTransactionEvent') }; -isAServiceProviderFeeAddedToTransactionEvent = (e) => { return compareEventTypeSafely(e.eventType, 'ServiceProviderFeeAddedToTransactionEvent') }; - -compareEventTypeSafely = (sourceEventType, targetEventType) => { return (sourceEventType.toUpperCase() === targetEventType.toUpperCase()); } - -ignoreEvent = (e) => isAServiceProviderFeeAddedToTransactionEvent(e) | isAMerchantFeeAddedToTransactionEvent(e); - -isInvalidEvent = (e) => (e === null || e === undefined || e.data === undefined); - -isTruncated = function (metadata) { - if (metadata && metadata['$v']) { - var parts = metadata['$v'].split(":"); - var projectionEpoch = parts[1]; - - return (projectionEpoch < 0); - } - return false; -}; - -getStringWithNoSpaces = function(inputString) { return inputString.replace(/-/gi, "").replace(/ /g, ""); } - -fromAll() - .when({ - $init: function (s, e) { - return { estates: {} } - }, - $any: function (s, e) { - if (isTruncated(e)) return; - - if (isEstateEvent(e)) { - if (ignoreEvent(e)) return; - - if (isAnEstateCreatedEvent(e)) { - s.estates[e.data.estateId] = { - name: getStringWithNoSpaces(e.data.estateName) - }; - } - - linkTo(s.estates[e.data.estateId].name, e); - } - } - } - ); \ No newline at end of file diff --git a/NugetPackage/projections/continuous/EstateManagementSubscriptionStreamBuilder.js b/NugetPackage/projections/continuous/EstateManagementSubscriptionStreamBuilder.js deleted file mode 100644 index 2b8488d..0000000 --- a/NugetPackage/projections/continuous/EstateManagementSubscriptionStreamBuilder.js +++ /dev/null @@ -1,64 +0,0 @@ -//starttestsetup -var fromAll = fromAll || require("../../../EventStoreProjections/node_modules/event-store-projection-testing-framework").scope.fromAll; -var linkTo = linkTo || require("../../../EventStoreProjections/node_modules/event-store-projection-testing-framework").scope.linkTo; -//endtestsetup - -isEstateEvent = (e) => { return (e.data && e.data.estateId); } -isAnEstateCreatedEvent = (e) => { return compareEventTypeSafely(e.eventType, 'EstateCreatedEvent') }; -compareEventTypeSafely = (sourceEventType, targetEventType) => { return (sourceEventType.toUpperCase() === targetEventType.toUpperCase()); } -isInvalidEvent = (e) => (e === null || e === undefined || e.data === undefined); - -isARequiredEvent = (e, eventTypes) => { - var supportedEvents = eventTypes; - - var index = supportedEvents.indexOf(e.eventType); - - return index !== -1 -}; - -isTruncated = function (metadata) { - if (metadata && metadata['$v']) { - var parts = metadata['$v'].split(":"); - var projectionEpoch = parts[1]; - - return (projectionEpoch < 0); - } - return false; -}; - -getStreamName = function (estateName) { - return 'EstateManagementSubscriptionStream_' + estateName; -} - -getStringWithNoSpaces = function (inputString) { return inputString.replace(/-/gi, "").replace(/ /g, ""); } - -fromAll() - .when({ - $init: function (s, e) { - return { estates: {} } - }, - $any: function (s, e) { - if (isTruncated(e)) return; - - if (isEstateEvent(e)) { - - if (isAnEstateCreatedEvent(e)) { - s.estates[e.data.estateId] = { - filteredName: e.data.estateName.replace(/-/gi, ""), - name: getStringWithNoSpaces(e.data.estateName) - }; - } - - var eventTypes = []; - - eventTypes.push('TransactionHasBeenCompletedEvent'); - eventTypes.push('MerchantFeeSettledEvent'); - eventTypes.push('StatementGeneratedEvent'); - - if (isARequiredEvent(e, eventTypes) === false) return; - - linkTo(getStreamName(s.estates[e.data.estateId].name), e); - } - } - } -); \ No newline at end of file diff --git a/NugetPackage/projections/continuous/FileProcessorSubscriptionStreamBuilder.js b/NugetPackage/projections/continuous/FileProcessorSubscriptionStreamBuilder.js deleted file mode 100644 index 42b83c7..0000000 --- a/NugetPackage/projections/continuous/FileProcessorSubscriptionStreamBuilder.js +++ /dev/null @@ -1,68 +0,0 @@ -//starttestsetup -var fromAll = fromAll || require("../../../EventStoreProjections/node_modules/event-store-projection-testing-framework").scope.fromAll; -var linkTo = linkTo || require("../../../EventStoreProjections/node_modules/event-store-projection-testing-framework").scope.linkTo; -//endtestsetup - -isEstateEvent = (e) => { return (e.data && e.data.estateId); } -isAnEstateCreatedEvent = (e) => { return compareEventTypeSafely(e.eventType, 'EstateCreatedEvent') }; -compareEventTypeSafely = (sourceEventType, targetEventType) => { return (sourceEventType.toUpperCase() === targetEventType.toUpperCase()); } -isInvalidEvent = (e) => (e === null || e === undefined || e.data === undefined); - -isARequiredEvent = (e, eventTypes) => { - var supportedEvents = eventTypes; - - var index = supportedEvents.indexOf(e.eventType); - - return index !== -1 -}; - -isTruncated = function (metadata) { - if (metadata && metadata['$v']) { - var parts = metadata['$v'].split(":"); - var projectionEpoch = parts[1]; - - return (projectionEpoch < 0); - } - return false; -}; -getStreamName = function (estateName) { - return 'FileProcessorSubscriptionStream_' + estateName; -} - -getStringWithNoSpaces = function (inputString) { return inputString.replace(/-/gi, "").replace(/ /g, ""); } - -fromAll() - .when({ - $init: function (s, e) { - return { estates: {} } - }, - $any: function (s, e) { - if (isTruncated(e)) return; - - if (isEstateEvent(e)) { - - if (isAnEstateCreatedEvent(e)) { - s.estates[e.data.estateId] = { - filteredName: e.data.estateName.replace(/-/gi, ""), - name: getStringWithNoSpaces(e.data.estateName) - }; - } - - var eventTypes = []; - - eventTypes.push('ImportLogCreatedEvent'); - eventTypes.push('FileAddedToImportLogEvent'); - eventTypes.push('FileCreatedEvent'); - eventTypes.push('FileLineAddedEvent'); - eventTypes.push('FileLineProcessingSuccessfulEvent'); - eventTypes.push('FileLineProcessingIgnoredEvent'); - eventTypes.push('FileLineProcessingFailedEvent'); - eventTypes.push('FileProcessingCompletedEvent'); - - if (isARequiredEvent(e,eventTypes) === false) return; - - linkTo(getStreamName(s.estates[e.data.estateId].name), e); - } - } - } -); \ No newline at end of file diff --git a/NugetPackage/projections/continuous/MerchantAggregator.js b/NugetPackage/projections/continuous/MerchantAggregator.js deleted file mode 100644 index 834e7fc..0000000 --- a/NugetPackage/projections/continuous/MerchantAggregator.js +++ /dev/null @@ -1,39 +0,0 @@ -//starttestsetup -var fromAll = fromAll || require("../../../EventStoreProjections/node_modules/event-store-projection-testing-framework").scope.fromAll; -var linkTo = linkTo || require("../../../EventStoreProjections/node_modules/event-store-projection-testing-framework").scope.linkTo; -//endtestsetup - -isValidEvent = function (e) { - - if (e) { - if (e.data) { - if (e.isJson) { - if (e.eventType !== "$metadata") { - return true; - } - } - } - } - - return false; -}; - -getMerchantId = function (e) { - if (e.data.merchantId === undefined) { - return null; - } - return e.data.merchantId; -}; - -fromAll() - .when({ - $any: function (s, e) { - if (isValidEvent(e)) { - var merchantId = getMerchantId(e); - if (merchantId !== null) { - var streamName = "MerchantArchive-" + merchantId.replace(/-/gi, ""); - linkTo(streamName, e); - } - } - } - }); \ No newline at end of file diff --git a/NugetPackage/projections/continuous/MerchantBalanceAggregator.js b/NugetPackage/projections/continuous/MerchantBalanceAggregator.js deleted file mode 100644 index 62a414f..0000000 --- a/NugetPackage/projections/continuous/MerchantBalanceAggregator.js +++ /dev/null @@ -1,56 +0,0 @@ -//starttestsetup -var fromAll = fromAll || require("../../../EventStoreProjections/node_modules/event-store-projection-testing-framework").scope.fromAll; -var linkTo = linkTo || require("../../../EventStoreProjections/node_modules/event-store-projection-testing-framework").scope.linkTo; -//endtestsetup - -isValidEvent = function (e) { - - if (e) { - if (e.data) { - if (e.isJson) { - if (e.eventType !== "$metadata") { - return true; - } - } - } - } - - return false; -}; - -getMerchantId = function (e) { - if (e.data.merchantId === undefined) { - return null; - } - return e.data.merchantId; -}; - -isEventSupported = function (e) { - if (e.eventType == "MerchantCreatedEvent" || - e.eventType === "ManualDepositMadeEvent" || - e.eventType === "AutomaticDepositMadeEvent" || - e.eventType === "TransactionHasStartedEvent" || - e.eventType === "TransactionHasBeenCompletedEvent" || - e.eventType === "SettledMerchantFeeAddedToTransactionEvent" || - e.eventType === "WithdrawalMadeEvent") { - return true; - } - return false; -} - -fromAll() - .when({ - $any: function (s, e) { - if (isValidEvent(e)) { - var merchantId = getMerchantId(e); - if (merchantId !== null) { - { - if (isEventSupported(e)) { - var streamName = "MerchantBalanceArchive-" + merchantId.replace(/-/gi, ""); - linkTo(streamName, e); - } - } - } - } - } - }); \ No newline at end of file diff --git a/NugetPackage/projections/continuous/MerchantBalanceProjection.js b/NugetPackage/projections/continuous/MerchantBalanceProjection.js deleted file mode 100644 index 8bf9ebc..0000000 --- a/NugetPackage/projections/continuous/MerchantBalanceProjection.js +++ /dev/null @@ -1,123 +0,0 @@ -//starttestsetup -var fromAll = fromAll || require("../../../EventStoreProjections/node_modules/event-store-projection-testing-framework").scope.fromAll; -var partitionBy = partitionBy !== null ? partitionBy : require('../../node_modules/event-store-projection-testing').scope.partitionBy; -var linkTo = linkTo || require("../../../EventStoreProjections/node_modules/event-store-projection-testing-framework").scope.linkTo; -//endtestsetup - -function createMerchantState(merchantId, merchantName){ - var merchant = { - Id: merchantId, - Name: merchantName, - numberOfEventsProcessed: 1, - balance: 0, - deposits: { - count: 0, - value: 0, - lastDeposit: null, - }, - withdrawals: { - count: 0, - value: 0, - lastWithdrawal: null - }, - authorisedSales: { - count: 0, - value: 0, - lastSale: null - }, - declinedSales: { - count: 0, - value: 0, - lastSale: null - }, - fees: { - count: 0, - value: 0, - lastFee: null - } - }; - return merchant; -} - -function isMerchantValid(s){ - if (s.merchant === null){ - return false; - } - return true; -} - -function HandleMerchantCreatedEvent(s,e){ - if (s.merchant === null){ - var newMerchantState = createMerchantState(e.data.merchantId, e.data.merchantName); - s.merchant = newMerchantState; - } -} - -function HandleDepositEvent(s,e){ - if (isMerchantValid(s) == false) - return; - s.merchant.balance += e.data.amount; - s.merchant.numberOfEventsProcessed++; - s.merchant.deposits.count++; - s.merchant.deposits.value += e.data.amount; - s.merchant.deposits.lastDeposit = e.data.depositDateTime; // TODO: handle out of date events -} - -function HandleWithdrawalMadeEvent(s,e){ - if (isMerchantValid(s) == false) - return; - s.merchant.balance -= e.data.amount; - s.merchant.numberOfEventsProcessed++; - s.merchant.withdrawals.count++; - s.merchant.withdrawals.value += e.data.amount; - s.merchant.withdrawals.lastWithdrawal = e.data.withdrawalDateTime; -} - -function HandleTransactionHasBeenCompletedEvent(s,e){ - if (isMerchantValid(s) == false) - return; - - s.merchant.numberOfEventsProcessed++; - - // Filter out logons and reconciliations - if(e.data.transactionAmount !== undefined){ - if (e.data.isAuthorised){ - s.merchant.balance -= e.data.transactionAmount; - s.merchant.authorisedSales.count += 1; - s.merchant.authorisedSales.value += e.data.transactionAmount; - s.merchant.authorisedSales.lastSale = e.data.completedDateTime; - } - else{ - s.merchant.declinedSales.count++; - s.merchant.declinedSales.value += e.data.transactionAmount; - s.merchant.declinedSales.lastSale = e.data.completedDateTime; - } - } -} - -function HandleSettledMerchantFeeAddedToTransactionEvent(s,e){ - if (isMerchantValid(s) == false) - return; - - s.merchant.numberOfEventsProcessed++; - s.merchant.balance += e.data.calculatedValue; - s.merchant.fees.count++; - s.merchant.fees.value += e.data.calculatedValue; - s.merchant.fees.lastFee = e.data.feeCalculatedDateTime; -} - -fromAll() - .partitionBy(function(e) { - return "MerchantBalance-" + e.data.merchantId.replace(/-/gi, "") - }) - .when({ - $init: function (s, e) { - return { merchant: null } - }, - "MerchantCreatedEvent": HandleMerchantCreatedEvent, - "ManualDepositMadeEvent": HandleDepositEvent, - "AutomaticDepositMadeEvent": HandleDepositEvent, - "TransactionHasBeenCompletedEvent": HandleTransactionHasBeenCompletedEvent, - "SettledMerchantFeeAddedToTransactionEvent": HandleSettledMerchantFeeAddedToTransactionEvent, - "WithdrawalMadeEvent": HandleWithdrawalMadeEvent - }); \ No newline at end of file diff --git a/NugetPackage/projections/continuous/TransactionProcessorSubscriptionStreamBuilder.js b/NugetPackage/projections/continuous/TransactionProcessorSubscriptionStreamBuilder.js deleted file mode 100644 index 51b26fc..0000000 --- a/NugetPackage/projections/continuous/TransactionProcessorSubscriptionStreamBuilder.js +++ /dev/null @@ -1,64 +0,0 @@ -//starttestsetup -var fromAll = fromAll || require("../../../EventStoreProjections/node_modules/event-store-projection-testing-framework").scope.fromAll; -var linkTo = linkTo || require("../../../EventStoreProjections/node_modules/event-store-projection-testing-framework").scope.linkTo; -//endtestsetup - -isEstateEvent = (e) => { return (e.data && e.data.estateId); } -isAnEstateCreatedEvent = (e) => { return compareEventTypeSafely(e.eventType, 'EstateCreatedEvent') }; -compareEventTypeSafely = (sourceEventType, targetEventType) => { return (sourceEventType.toUpperCase() === targetEventType.toUpperCase()); } -isInvalidEvent = (e) => (e === null || e === undefined || e.data === undefined); - -isARequiredEvent = (e, eventTypes) => { - var supportedEvents = eventTypes; - - var index = supportedEvents.indexOf(e.eventType); - - return index !== -1 -}; - -isTruncated = function (metadata) { - if (metadata && metadata['$v']) { - var parts = metadata['$v'].split(":"); - var projectionEpoch = parts[1]; - - return (projectionEpoch < 0); - } - return false; -}; -getStreamName = function (estateName) { - return 'TransactionProcessorSubscriptionStream_' + estateName; -} - -getStringWithNoSpaces = function (inputString) { return inputString.replace(/-/gi, "").replace(/ /g, ""); } - -fromAll() - .when({ - $init: function (s, e) { - return { estates: {} } - }, - $any: function (s, e) { - if (isTruncated(e)) return; - - if (isEstateEvent(e)) { - - if (isAnEstateCreatedEvent(e)) { - s.estates[e.data.estateId] = { - filteredName: e.data.estateName.replace(/-/gi, ""), - name: getStringWithNoSpaces(e.data.estateName) - }; - } - - var eventTypes = []; - - eventTypes.push('CustomerEmailReceiptRequestedEvent'); - eventTypes.push('TransactionHasBeenCompletedEvent'); - eventTypes.push('MerchantFeePendingSettlementAddedToTransactionEvent'); - eventTypes.push('SettledMerchantFeeAddedToTransactionEvent'); - - if (isARequiredEvent(e, eventTypes) === false) return; - - linkTo(getStreamName(s.estates[e.data.estateId].name), e); - } - } - } -); \ No newline at end of file diff --git a/nuspec/EventStoreProjections.nuspec b/nuspec/EventStoreProjections.nuspec new file mode 100644 index 0000000..c5b6640 --- /dev/null +++ b/nuspec/EventStoreProjections.nuspec @@ -0,0 +1,17 @@ + + + + TransactionProcessingEventStoreProjections + $version$ + Transaction Processing + Transaction Processing + false + Transaction Processing EventStore projections packaged as NuGet + Transaction Processing Projection + + + + + + + diff --git a/package-lock.json b/package-lock.json index 8d3976a..a24d83e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,1035 @@ { - "name": "EventStoreProjections", + "name": "eventstore-projections", + "version": "1.0.0", "lockfileVersion": 3, "requires": true, - "packages": {} + "packages": { + "": { + "name": "eventstore-projections", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "chai": "^4.3.10", + "event-store-projection-testing-framework": "2023.12.1", + "mocha": "^10.2.0" + }, + "devDependencies": { + "chai": "^4.3.7", + "mocha": "^10.2.0" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "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, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "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, + "license": "Python-2.0" + }, + "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, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "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, + "license": "MIT" + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", + "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.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, + "license": "ISC" + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/chai": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz", + "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "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, + "license": "MIT", + "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/chalk/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, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/check-error": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-func-name": "^2.0.2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "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" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "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, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "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, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "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, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-eql": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", + "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/diff": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.2.tgz", + "integrity": "sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "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, + "license": "MIT" + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/event-store-projection-testing-framework": { + "version": "2023.12.1", + "resolved": "https://registry.npmjs.org/event-store-projection-testing-framework/-/event-store-projection-testing-framework-2023.12.1.tgz", + "integrity": "sha512-6RXZlNaTDBdudaLbSNx7ukLfcaKX/nsbLgh9klKT3SeTQuVM0Jv2M4Ktlne+eS+vBr3yYQwu476QN2tgk5XjcA==" + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "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, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.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, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "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, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "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==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "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, + "license": "ISC" + }, + "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, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "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, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/loupe": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-func-name": "^2.0.1" + } + }, + "node_modules/minimatch": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha": { + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.8.2.tgz", + "integrity": "sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.3", + "browser-stdout": "^1.3.1", + "chokidar": "^3.5.3", + "debug": "^4.3.5", + "diff": "^5.2.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^8.1.0", + "he": "^1.2.0", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^5.1.6", + "ms": "^2.1.3", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^6.5.1", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9", + "yargs-unparser": "^2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "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, + "license": "MIT" + }, + "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, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "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, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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" + } + ], + "license": "MIT" + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "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, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "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, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/type-detect": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", + "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/workerpool": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", + "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", + "dev": true, + "license": "Apache-2.0" + }, + "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, + "license": "MIT", + "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/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, + "license": "ISC" + }, + "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, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "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, + "license": "MIT", + "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.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "license": "ISC", + "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, + "license": "MIT", + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } } diff --git a/package.json b/package.json new file mode 100644 index 0000000..f3dbaf8 --- /dev/null +++ b/package.json @@ -0,0 +1,15 @@ +{ + "name": "eventstore-projections", + "version": "1.0.0", + "description": "Node.js EventStore projections packaged as NuGet", + "main": "src/projection.js", + "scripts": { "test": "mocha" }, + "author": "Your Name", + "license": "MIT", + "devDependencies": { "mocha": "^10.2.0", "chai": "^4.3.7" }, + "dependencies": { + "event-store-projection-testing-framework": "2023.12.1", + "chai": "^4.3.10", + "mocha": "^10.2.0" + } +} diff --git a/NugetPackage/projections/continuous/CallbackHandlerEnricher.js b/src/continuous/CallbackHandlerEnricher.js similarity index 91% rename from NugetPackage/projections/continuous/CallbackHandlerEnricher.js rename to src/continuous/CallbackHandlerEnricher.js index 29aa1e0..28db1d3 100644 --- a/NugetPackage/projections/continuous/CallbackHandlerEnricher.js +++ b/src/continuous/CallbackHandlerEnricher.js @@ -1,6 +1,6 @@ //starttestsetup -var fromStreams = fromStreams || require('../../../EventStoreProjections/node_modules/event-store-projection-testing-framework').scope.fromStreams; -var emit = emit || require('../../../EventStoreProjections/node_modules/event-store-projection-testing-framework').scope.emit; +var fromStreams = fromStreams || require('../../node_modules/event-store-projection-testing-framework').scope.fromStreams; +var emit = emit || require('../../node_modules/event-store-projection-testing-framework').scope.emit; //endtestsetup fromStreams("$ce-EstateAggregate", "$et-CallbackReceivedEvent") diff --git a/src/continuous/MerchantBalanceAggregator.js b/src/continuous/MerchantBalanceAggregator.js new file mode 100644 index 0000000..a869a52 --- /dev/null +++ b/src/continuous/MerchantBalanceAggregator.js @@ -0,0 +1,73 @@ +//starttestsetup +var fromAll = fromAll || require("../../node_modules/event-store-projection-testing-framework").scope.fromAll; +var linkTo = linkTo || require("../../node_modules/event-store-projection-testing-framework").scope.linkTo; +//endtestsetup + +// ------------------------------- +// Event validation +// ------------------------------- +function isValidEvent(e) { + return !!( + e && + e.data && + e.isJson && + typeof e.eventType === 'string' && + !e.eventType.startsWith('$') // ignore system events + ); +} + +// ------------------------------- +// Merchant extraction +// ------------------------------- +function getMerchantId(e) { + return e?.data?.merchantId ?? null; +} + +// ------------------------------- +// Supported events (declarative set) +// ------------------------------- +const supportedEvents = new Set([ + "MerchantCreatedEvent", + "ManualDepositMadeEvent", + "AutomaticDepositMadeEvent", + "TransactionHasStartedEvent", + "TransactionHasBeenCompletedEvent", + "SettledMerchantFeeAddedToTransactionEvent", + "WithdrawalMadeEvent" +]); + +function isEventSupported(e) { + return supportedEvents.has(e.eventType); +} + +// ------------------------------- +// Stream naming +// ------------------------------- +function getStreamName(merchantId) { + return "MerchantBalanceArchive-" + merchantId.replace(/-/gi, ""); +} + +// ------------------------------- +// Pipeline (single responsibility flow) +// ------------------------------- +function processEvent(e) { + if (!isValidEvent(e)) return; + + const merchantId = getMerchantId(e); + if (!merchantId) return; + + if (!isEventSupported(e)) return; + + const streamName = getStreamName(merchantId); + linkTo(streamName, e); +} + +// ------------------------------- +// Projection +// ------------------------------- +fromAll() + .when({ + $any: function (s, e) { + processEvent(e); + } + }); \ No newline at end of file diff --git a/src/continuous/MerchantBalanceProjection.js b/src/continuous/MerchantBalanceProjection.js new file mode 100644 index 0000000..94a5995 --- /dev/null +++ b/src/continuous/MerchantBalanceProjection.js @@ -0,0 +1,239 @@ +//starttestsetup +var fromAll = fromAll || require("../../node_modules/event-store-projection-testing-framework").scope.fromAll; +var partitionBy = partitionBy !== null ? partitionBy : require('../node_modules/event-store-projection-testing').scope.partitionBy; +var linkTo = linkTo || require("../../node_modules/event-store-projection-testing-framework").scope.linkTo; +//endtestsetup + +// ------------------------ +// Helpers +// ------------------------ + +function createMetric(lastField) { + return { + count: 0, + value: 0, + [lastField]: null + }; +} + +function updateLastDate(metric, field, newDate) { + if (!metric[field] || newDate > metric[field]) { + metric[field] = newDate; + } +} + +function isEventValid(e) { + if (!e || !e.data) return false; // No event data + if (!e.data.merchantId) return false; // No merchant + if (!e.data.estateId) return false; // No estate + if (typeof e.eventType !== 'string') return false; // Must have eventType + if (e.eventType.startsWith('$')) return false; // Ignore system events + return true; +} + +function applyMetric(metric, amount, dateField, dateValue) { + metric.count++; + metric.value += amount; + updateLastDate(metric, dateField, dateValue); +} + +function withMerchant(s, e, handler) { + if (!s.merchant) return; + + const position = e.position && e.position.commitPosition; + + // Idempotency guard (based on $all ordering) + if ( + s.merchant.lastProcessedPosition !== null && + position !== undefined && + position <= s.merchant.lastProcessedPosition + ) { + return; + } + + // Update position + debug info + if (position !== undefined) { + s.merchant.lastProcessedPosition = position; + } + + s.merchant.lastProcessedEventId = e.eventId; + s.merchant.lastProcessedEventType = e.eventType; + + s.merchant.numberOfEventsProcessed++; + + handler(s.merchant); +} + +// ------------------------ +// State Factory +// ------------------------ + +function createMerchant(id, name) { + return { + Id: id, + Name: name, + numberOfEventsProcessed: 1, + balance: 0, + + // Idempotency + debugging + lastProcessedPosition: null, + lastProcessedEventId: null, + lastProcessedEventType: null, + + // Metrics + deposits: createMetric("lastDeposit"), + withdrawals: createMetric("lastWithdrawal"), + authorisedSales: createMetric("lastSale"), + declinedSales: createMetric("lastSale"), + fees: createMetric("lastFee") + }; +} + +// ------------------------ +// Declarative Event Config +// ------------------------ + +const eventConfig = { + ManualDepositMadeEvent: { + amount: e => e.data.amount, + balanceDelta: e => e.data.amount, + metric: "deposits", + dateField: "lastDeposit", + date: e => e.data.depositDateTime + }, + + AutomaticDepositMadeEvent: { + amount: e => e.data.amount, + balanceDelta: e => e.data.amount, + metric: "deposits", + dateField: "lastDeposit", + date: e => e.data.depositDateTime + }, + + WithdrawalMadeEvent: { + amount: e => e.data.amount, + balanceDelta: e => -e.data.amount, + metric: "withdrawals", + dateField: "lastWithdrawal", + date: e => e.data.withdrawalDateTime + }, + + SettledMerchantFeeAddedToTransactionEvent: { + amount: e => e.data.calculatedValue, + balanceDelta: e => e.data.calculatedValue, + metric: "fees", + dateField: "lastFee", + date: e => e.data.feeCalculatedDateTime + }, + + TransactionHasBeenCompletedEvent: { + when: e => e.data.transactionAmount !== undefined, + + variants: [ + { + when: e => e.data.isAuthorised === true, + amount: e => e.data.transactionAmount, + balanceDelta: e => -e.data.transactionAmount, + metric: "authorisedSales", + dateField: "lastSale", + date: e => e.data.completedDateTime + }, + { + when: e => e.data.isAuthorised === false, + amount: e => e.data.transactionAmount, + balanceDelta: () => 0, + metric: "declinedSales", + dateField: "lastSale", + date: e => e.data.completedDateTime + } + ] + } +}; + +// ------------------------ +// Generic Handler Engine +// ------------------------ + +function applyEventConfig(m, e, config) { + if (config.when && !config.when(e)) return; + + // Handle branching (variants) + if (config.variants) { + const variant = config.variants.find(v => v.when(e)); + if (!variant) return; + + return applyEventConfig(m, e, variant); + } + + const amount = config.amount ? config.amount(e) : 0; + const balanceDelta = config.balanceDelta ? config.balanceDelta(e) : 0; + + if (balanceDelta) { + m.balance += balanceDelta; + } + + if (config.metric) { + applyMetric( + m[config.metric], + amount, + config.dateField, + config.date(e) + ); + } +} + +function handleConfiguredEvent(eventType) { + return function (s, e) { + const config = eventConfig[eventType]; + if (!config) return; + + withMerchant(s, e, m => { + applyEventConfig(m, e, config); + }); + }; +} + +// ------------------------ +// Special Case Handler +// ------------------------ + +function handleMerchantCreated(s, e) { + if (!s.merchant) { + s.merchant = createMerchant( + e.data.merchantId, + e.data.merchantName + ); + } +} + +function handleConfiguredEventSafe(eventType) { + + const handler = handleConfiguredEvent(eventType); // get the original handler + return (state, e) => { + if (!isEventValid(e)) return; // skip invalid events + handler(state, e); // call original handler + }; +} + +// ------------------------ +// Projection Definition +// ------------------------ + +fromAll() + .partitionBy(e => + "MerchantBalance-" + e.data.merchantId.replace(/-/gi, "") + ) + .when({ + $init: () => ({ merchant: null }), + + MerchantCreatedEvent: handleMerchantCreated, + + ManualDepositMadeEvent: handleConfiguredEventSafe("ManualDepositMadeEvent"), + AutomaticDepositMadeEvent: handleConfiguredEventSafe("AutomaticDepositMadeEvent"), + + WithdrawalMadeEvent: handleConfiguredEventSafe("WithdrawalMadeEvent"), + + TransactionHasBeenCompletedEvent: handleConfiguredEventSafe("TransactionHasBeenCompletedEvent"), + + SettledMerchantFeeAddedToTransactionEvent: handleConfiguredEventSafe("SettledMerchantFeeAddedToTransactionEvent") + }); \ No newline at end of file diff --git a/EventStoreProjections/test/CallbackHandlerEnricherTests.js b/test/CallbackHandlerEnricherTests.js similarity index 98% rename from EventStoreProjections/test/CallbackHandlerEnricherTests.js rename to test/CallbackHandlerEnricherTests.js index d70e45f..b7e9e1f 100644 --- a/EventStoreProjections/test/CallbackHandlerEnricherTests.js +++ b/test/CallbackHandlerEnricherTests.js @@ -1,7 +1,7 @@ var testData = require('./TestData.js'); testData.clearRequireCache(); -require('../../NugetPackage/projections/continuous/CallbackHandlerEnricher.js'); +require('../src/continuous/CallbackHandlerEnricher.js'); var projection = require('event-store-projection-testing-framework'); var chai = require("chai"); describe('Callback Handler Enricher Tests', function () { diff --git a/EventStoreProjections/test/MerchantBalanceAggregatorTests.js b/test/MerchantBalanceAggregatorTests.js similarity index 57% rename from EventStoreProjections/test/MerchantBalanceAggregatorTests.js rename to test/MerchantBalanceAggregatorTests.js index 1544afb..9a964d2 100644 --- a/EventStoreProjections/test/MerchantBalanceAggregatorTests.js +++ b/test/MerchantBalanceAggregatorTests.js @@ -1,7 +1,7 @@ var testData = require('./TestData.js'); testData.clearRequireCache(); -require('../../NugetPackage/projections/continuous/MerchantBalanceAggregator.js'); +require('../src/continuous/MerchantBalanceAggregator.js'); var projection = require('event-store-projection-testing-framework'); var chai = require("chai"); @@ -95,4 +95,88 @@ describe('Merchant Balance Aggregator Tests', function () { var events = projection.emittedEvents; chai.expect(events.length).equal(3); }); + + it('should ignore an event with no data', () => { + projection.initialize(); + + var projectionState = { + merchant: {} + }; + + projection.setState(projectionState); + + const invalidEvent = { eventType: 'ManualDepositMadeEvent' }; // missing data + projection.processEvent( + 'TransactionAggregate-c4c33d75-f011-40e4-9d97-1f428ab563d8', + invalidEvent.eventType, + invalidEvent.data); + + var projectionState = projection.getState(); + chai.expect(projectionState.merchant.numberOfEventsProcessed).to.be.undefined; + }); + + it('should ignore an event with no merchantId', () => { + projection.initialize(); + + var projectionState = { + merchant: {} + }; + + projection.setState(projectionState); + + const invalidEvent = { + eventType: 'ManualDepositMadeEvent', + data: { amount: 100, estateId: 'e1' } // missing merchantId + }; + projection.processEvent( + 'TransactionAggregate-c4c33d75-f011-40e4-9d97-1f428ab563d8', + invalidEvent.eventType, + invalidEvent.data); + + var projectionState = projection.getState(); + chai.expect(projectionState.merchant.numberOfEventsProcessed).to.be.undefined; + }); + + it('should ignore an event with no estateId', () => { + projection.initialize(); + + var projectionState = { + merchant: {} + }; + + projection.setState(projectionState); + const invalidEvent = { + eventType: 'ManualDepositMadeEvent', + data: { amount: 100, merchantId: 'm1' } // missing estateId + }; + projection.processEvent( + 'TransactionAggregate-c4c33d75-f011-40e4-9d97-1f428ab563d8', + invalidEvent.eventType, + invalidEvent.data); + + var projectionState = projection.getState(); + chai.expect(projectionState.merchant.numberOfEventsProcessed).to.be.undefined; + }); + + it('should ignore system events', () => { + projection.initialize(); + + var projectionState = { + merchant: {} + }; + + projection.setState(projectionState); + + const invalidEvent = { + eventType: '$systemEvent', + data: { amount: 100, merchantId: 'm1', estateId: 'e1' } + }; + projection.processEvent( + 'TransactionAggregate-c4c33d75-f011-40e4-9d97-1f428ab563d8', + invalidEvent.eventType, + invalidEvent.data); + + var projectionState = projection.getState(); + chai.expect(projectionState.merchant.numberOfEventsProcessed).to.be.undefined;; + }); }) \ No newline at end of file diff --git a/EventStoreProjections/test/MerchantBalanceProjectionTests.js b/test/MerchantBalanceProjectionTests.js similarity index 87% rename from EventStoreProjections/test/MerchantBalanceProjectionTests.js rename to test/MerchantBalanceProjectionTests.js index 020da43..75aa0d8 100644 --- a/EventStoreProjections/test/MerchantBalanceProjectionTests.js +++ b/test/MerchantBalanceProjectionTests.js @@ -2,7 +2,7 @@ var testData = require('./TestData.js'); var helpers = require('./helpers.js'); testData.clearRequireCache(); -require('../../NugetPackage/projections/continuous/MerchantBalanceProjection.js'); +require('../src/continuous/MerchantBalanceProjection.js'); var projection = require('event-store-projection-testing-framework'); var chai = require("chai"); @@ -482,6 +482,87 @@ describe('Merchant Balance Projection Tests', function () { console.log("Done"); }); -}); + it('should ignore an event with no data', () => { + projection.initialize(); + + var projectionState = { + merchant: {} + }; + + projection.setState(projectionState); + + const invalidEvent = { eventType: 'ManualDepositMadeEvent' }; // missing data + projection.processEvent( + 'TransactionAggregate-c4c33d75-f011-40e4-9d97-1f428ab563d8', + invalidEvent.eventType, + invalidEvent.data); + + var projectionState = projection.getState(); + chai.expect(projectionState.merchant.numberOfEventsProcessed).to.be.undefined; + }); + + it('should ignore an event with no merchantId', () => { + projection.initialize(); + + var projectionState = { + merchant: {} + }; + + projection.setState(projectionState); + + const invalidEvent = { + eventType: 'ManualDepositMadeEvent', + data: { amount: 100, estateId: 'e1' } // missing merchantId + }; + projection.processEvent( + 'TransactionAggregate-c4c33d75-f011-40e4-9d97-1f428ab563d8', + invalidEvent.eventType, + invalidEvent.data); + var projectionState = projection.getState(); + chai.expect(projectionState.merchant.numberOfEventsProcessed).to.be.undefined; + }); + it('should ignore an event with no estateId', () => { + projection.initialize(); + + var projectionState = { + merchant: {} + }; + + projection.setState(projectionState); + const invalidEvent = { + eventType: 'ManualDepositMadeEvent', + data: { amount: 100, merchantId: 'm1' } // missing estateId + }; + projection.processEvent( + 'TransactionAggregate-c4c33d75-f011-40e4-9d97-1f428ab563d8', + invalidEvent.eventType, + invalidEvent.data); + + var projectionState = projection.getState(); + chai.expect(projectionState.merchant.numberOfEventsProcessed).to.be.undefined; + }); + + it('should ignore system events', () => { + projection.initialize(); + + var projectionState = { + merchant: {} + }; + + projection.setState(projectionState); + + const invalidEvent = { + eventType: '$systemEvent', + data: { amount: 100, merchantId: 'm1', estateId: 'e1' } + }; + projection.processEvent( + 'TransactionAggregate-c4c33d75-f011-40e4-9d97-1f428ab563d8', + invalidEvent.eventType, + invalidEvent.data); + + var projectionState = projection.getState(); + chai.expect(projectionState.merchant.numberOfEventsProcessed).to.be.undefined;; + }); +}); \ No newline at end of file diff --git a/EventStoreProjections/test/TestData.js b/test/TestData.js similarity index 99% rename from EventStoreProjections/test/TestData.js rename to test/TestData.js index 2c05bdb..7c64da2 100644 --- a/EventStoreProjections/test/TestData.js +++ b/test/TestData.js @@ -356,7 +356,8 @@ module.exports = { "merchantId": merchantId, "responseCode": '1001', "responseMessage": 'DECLINED', - "transactionId": transactionId + "transactionId": transactionId, + "isAuthorised": false }, metadata: { }, diff --git a/EventStoreProjections/test/helpers.js b/test/helpers.js similarity index 100% rename from EventStoreProjections/test/helpers.js rename to test/helpers.js