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