mirror of
https://github.com/standardnotes/server
synced 2026-01-22 20:01:10 -05:00
Compare commits
23 Commits
@standardn
...
@standardn
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2f9d8e776f | ||
|
|
9503f0d963 | ||
|
|
32aff3e3f4 | ||
|
|
9b9f10d4ca | ||
|
|
e4f0cc6b37 | ||
|
|
d211249086 | ||
|
|
0fc5db8aee | ||
|
|
0a2abef979 | ||
|
|
8242f13aff | ||
|
|
7516ba7028 | ||
|
|
3417407cbe | ||
|
|
720d046c00 | ||
|
|
b88f560b07 | ||
|
|
51b264ca13 | ||
|
|
0309aeab34 | ||
|
|
aca8d2948d | ||
|
|
09596d2181 | ||
|
|
e87f7e1674 | ||
|
|
4ad1cccc33 | ||
|
|
5d12648669 | ||
|
|
7e989720bf | ||
|
|
f8a2892811 | ||
|
|
eaab23ec19 |
@@ -7,7 +7,6 @@ DB_PORT=3306
|
||||
DB_USERNAME=std_notes_user
|
||||
DB_PASSWORD=changeme123
|
||||
DB_DATABASE=standard_notes_db
|
||||
DB_DEBUG_LEVEL=all
|
||||
|
||||
#########
|
||||
# CACHE #
|
||||
@@ -15,3 +14,11 @@ DB_DEBUG_LEVEL=all
|
||||
|
||||
REDIS_PORT=6379
|
||||
REDIS_HOST=cache
|
||||
|
||||
########
|
||||
# KEYS #
|
||||
########
|
||||
|
||||
AUTH_JWT_SECRET=
|
||||
AUTH_SERVER_ENCRYPTION_SERVER_KEY=
|
||||
VALET_TOKEN_SECRET=
|
||||
|
||||
5
.github/ci.env
vendored
5
.github/ci.env
vendored
@@ -3,6 +3,7 @@ DB_HOST=db
|
||||
DB_USERNAME=std_notes_user
|
||||
DB_PASSWORD=changeme123
|
||||
DB_DATABASE=standard_notes_db
|
||||
DB_PORT=3306
|
||||
REDIS_PORT=6379
|
||||
REDIS_HOST=cache
|
||||
AUTH_SERVER_ACCESS_TOKEN_AGE=4
|
||||
@@ -19,3 +20,7 @@ MYSQL_DATABASE=standard_notes_db
|
||||
MYSQL_USER=std_notes_user
|
||||
MYSQL_PASSWORD=changeme123
|
||||
MYSQL_ROOT_PASSWORD=changeme123
|
||||
|
||||
AUTH_JWT_SECRET=f95259c5e441f5a4646d76422cfb3df4c4488842901aa50b6c51b8be2e0040e9
|
||||
AUTH_SERVER_ENCRYPTION_SERVER_KEY=1087415dfde3093797f9a7ca93a49e7d7aa1861735eb0d32aae9c303b8c3d060
|
||||
VALET_TOKEN_SECRET=4b886819ebe1e908077c6cae96311b48a8416bd60cc91c03060e15bdf6b30d1f
|
||||
|
||||
2
.github/workflows/common-deploy.yml
vendored
2
.github/workflows/common-deploy.yml
vendored
@@ -50,6 +50,6 @@ jobs:
|
||||
uses: aws-actions/amazon-ecs-deploy-task-definition@v1
|
||||
with:
|
||||
task-definition: ${{ steps.task-def-prod.outputs.task-definition }}
|
||||
service: ${{ inputs.service_name }}-prod
|
||||
service: ${{ inputs.service_name }}
|
||||
cluster: prod
|
||||
wait-for-service-stability: true
|
||||
|
||||
154
.pnp.cjs
generated
154
.pnp.cjs
generated
@@ -123,13 +123,13 @@ const RAW_RUNTIME_STATE =
|
||||
["@lerna-lite/run", "npm:1.6.0"],\
|
||||
["@sentry/node", "npm:7.28.1"],\
|
||||
["@types/jest", "npm:29.1.1"],\
|
||||
["@types/newrelic", "npm:9.4.0"],\
|
||||
["@types/newrelic", "npm:9.13.0"],\
|
||||
["@types/node", "npm:18.11.9"],\
|
||||
["@typescript-eslint/parser", "virtual:8859b278716fedf3e7458b5628625f7e35678c418626878559a0b816445001b7e24c55546f4677ba4c20b521aa0cf52cc33ac07deff171e383ada6eeab69933f#npm:5.40.1"],\
|
||||
["eslint", "npm:8.32.0"],\
|
||||
["eslint-config-prettier", "virtual:8859b278716fedf3e7458b5628625f7e35678c418626878559a0b816445001b7e24c55546f4677ba4c20b521aa0cf52cc33ac07deff171e383ada6eeab69933f#npm:8.6.0"],\
|
||||
["ini", "npm:3.0.0"],\
|
||||
["newrelic", "npm:9.11.0"],\
|
||||
["newrelic", "npm:10.0.0"],\
|
||||
["npm-check-updates", "npm:16.0.1"],\
|
||||
["prettier", "npm:2.7.1"],\
|
||||
["ts-node", "virtual:8859b278716fedf3e7458b5628625f7e35678c418626878559a0b816445001b7e24c55546f4677ba4c20b521aa0cf52cc33ac07deff171e383ada6eeab69933f#npm:10.9.1"],\
|
||||
@@ -2594,10 +2594,10 @@ const RAW_RUNTIME_STATE =
|
||||
}]\
|
||||
]],\
|
||||
["@grpc/grpc-js", [\
|
||||
["npm:1.8.12", {\
|
||||
"packageLocation": "./.yarn/cache/@grpc-grpc-js-npm-1.8.12-055f611493-cf2523ed61.zip/node_modules/@grpc/grpc-js/",\
|
||||
["npm:1.8.13", {\
|
||||
"packageLocation": "./.yarn/cache/@grpc-grpc-js-npm-1.8.13-59d4d0dc89-04d24ca840.zip/node_modules/@grpc/grpc-js/",\
|
||||
"packageDependencies": [\
|
||||
["@grpc/grpc-js", "npm:1.8.12"],\
|
||||
["@grpc/grpc-js", "npm:1.8.13"],\
|
||||
["@grpc/proto-loader", "npm:0.7.4"],\
|
||||
["@types/node", "npm:18.0.3"]\
|
||||
],\
|
||||
@@ -3284,12 +3284,12 @@ const RAW_RUNTIME_STATE =
|
||||
],\
|
||||
"linkType": "SOFT"\
|
||||
}],\
|
||||
["virtual:3903f8b52579d93ef51c172e331bc99e7b2816716d59e05f43ef24f0b7764b243282fc408399f3458a146bc3927d0afc82281a5fef8bf3c4a084cec2d908e789#npm:5.0.2", {\
|
||||
"packageLocation": "./.yarn/__virtual__/@newrelic-aws-sdk-virtual-5e033661a6/0/cache/@newrelic-aws-sdk-npm-5.0.2-96d8663350-d99b851c78.zip/node_modules/@newrelic/aws-sdk/",\
|
||||
["virtual:2e94dc408d78a7f546b419c58b70581fdb1401ee1979fe214195b4cfca74499df9c9aa918c3214331583e314b7e767fec897581d1a684dcab7cc3bba5897fc45#npm:5.0.2", {\
|
||||
"packageLocation": "./.yarn/__virtual__/@newrelic-aws-sdk-virtual-32f8e7f038/0/cache/@newrelic-aws-sdk-npm-5.0.2-96d8663350-d99b851c78.zip/node_modules/@newrelic/aws-sdk/",\
|
||||
"packageDependencies": [\
|
||||
["@newrelic/aws-sdk", "virtual:3903f8b52579d93ef51c172e331bc99e7b2816716d59e05f43ef24f0b7764b243282fc408399f3458a146bc3927d0afc82281a5fef8bf3c4a084cec2d908e789#npm:5.0.2"],\
|
||||
["@newrelic/aws-sdk", "virtual:2e94dc408d78a7f546b419c58b70581fdb1401ee1979fe214195b4cfca74499df9c9aa918c3214331583e314b7e767fec897581d1a684dcab7cc3bba5897fc45#npm:5.0.2"],\
|
||||
["@types/newrelic", null],\
|
||||
["newrelic", "npm:9.11.0"]\
|
||||
["newrelic", "npm:10.0.0"]\
|
||||
],\
|
||||
"packagePeers": [\
|
||||
"@types/newrelic",\
|
||||
@@ -3306,12 +3306,12 @@ const RAW_RUNTIME_STATE =
|
||||
],\
|
||||
"linkType": "SOFT"\
|
||||
}],\
|
||||
["virtual:3903f8b52579d93ef51c172e331bc99e7b2816716d59e05f43ef24f0b7764b243282fc408399f3458a146bc3927d0afc82281a5fef8bf3c4a084cec2d908e789#npm:7.1.1", {\
|
||||
"packageLocation": "./.yarn/__virtual__/@newrelic-koa-virtual-5f623c0915/0/cache/@newrelic-koa-npm-7.1.1-363bc0d9f3-b4fd860e8b.zip/node_modules/@newrelic/koa/",\
|
||||
["virtual:2e94dc408d78a7f546b419c58b70581fdb1401ee1979fe214195b4cfca74499df9c9aa918c3214331583e314b7e767fec897581d1a684dcab7cc3bba5897fc45#npm:7.1.1", {\
|
||||
"packageLocation": "./.yarn/__virtual__/@newrelic-koa-virtual-d5ac9cc242/0/cache/@newrelic-koa-npm-7.1.1-363bc0d9f3-b4fd860e8b.zip/node_modules/@newrelic/koa/",\
|
||||
"packageDependencies": [\
|
||||
["@newrelic/koa", "virtual:3903f8b52579d93ef51c172e331bc99e7b2816716d59e05f43ef24f0b7764b243282fc408399f3458a146bc3927d0afc82281a5fef8bf3c4a084cec2d908e789#npm:7.1.1"],\
|
||||
["@newrelic/koa", "virtual:2e94dc408d78a7f546b419c58b70581fdb1401ee1979fe214195b4cfca74499df9c9aa918c3214331583e314b7e767fec897581d1a684dcab7cc3bba5897fc45#npm:7.1.1"],\
|
||||
["@types/newrelic", null],\
|
||||
["newrelic", "npm:9.11.0"]\
|
||||
["newrelic", "npm:10.0.0"]\
|
||||
],\
|
||||
"packagePeers": [\
|
||||
"@types/newrelic",\
|
||||
@@ -3341,12 +3341,12 @@ const RAW_RUNTIME_STATE =
|
||||
],\
|
||||
"linkType": "SOFT"\
|
||||
}],\
|
||||
["virtual:3903f8b52579d93ef51c172e331bc99e7b2816716d59e05f43ef24f0b7764b243282fc408399f3458a146bc3927d0afc82281a5fef8bf3c4a084cec2d908e789#npm:6.0.0", {\
|
||||
"packageLocation": "./.yarn/__virtual__/@newrelic-superagent-virtual-4f2fdfe6c7/0/cache/@newrelic-superagent-npm-6.0.0-db8b77d0f3-b77997b792.zip/node_modules/@newrelic/superagent/",\
|
||||
["virtual:2e94dc408d78a7f546b419c58b70581fdb1401ee1979fe214195b4cfca74499df9c9aa918c3214331583e314b7e767fec897581d1a684dcab7cc3bba5897fc45#npm:6.0.0", {\
|
||||
"packageLocation": "./.yarn/__virtual__/@newrelic-superagent-virtual-0d8a0615e8/0/cache/@newrelic-superagent-npm-6.0.0-db8b77d0f3-b77997b792.zip/node_modules/@newrelic/superagent/",\
|
||||
"packageDependencies": [\
|
||||
["@newrelic/superagent", "virtual:3903f8b52579d93ef51c172e331bc99e7b2816716d59e05f43ef24f0b7764b243282fc408399f3458a146bc3927d0afc82281a5fef8bf3c4a084cec2d908e789#npm:6.0.0"],\
|
||||
["@newrelic/superagent", "virtual:2e94dc408d78a7f546b419c58b70581fdb1401ee1979fe214195b4cfca74499df9c9aa918c3214331583e314b7e767fec897581d1a684dcab7cc3bba5897fc45#npm:6.0.0"],\
|
||||
["@types/newrelic", null],\
|
||||
["newrelic", "npm:9.11.0"]\
|
||||
["newrelic", "npm:10.0.0"]\
|
||||
],\
|
||||
"packagePeers": [\
|
||||
"@types/newrelic",\
|
||||
@@ -3356,19 +3356,19 @@ const RAW_RUNTIME_STATE =
|
||||
}]\
|
||||
]],\
|
||||
["@newrelic/winston-enricher", [\
|
||||
["npm:4.0.0", {\
|
||||
"packageLocation": "./.yarn/cache/@newrelic-winston-enricher-npm-4.0.0-ebaf2d0d28-3fc901cded.zip/node_modules/@newrelic/winston-enricher/",\
|
||||
["npm:4.0.1", {\
|
||||
"packageLocation": "./.yarn/cache/@newrelic-winston-enricher-npm-4.0.1-ef1230a3ce-e45880f6ec.zip/node_modules/@newrelic/winston-enricher/",\
|
||||
"packageDependencies": [\
|
||||
["@newrelic/winston-enricher", "npm:4.0.0"]\
|
||||
["@newrelic/winston-enricher", "npm:4.0.1"]\
|
||||
],\
|
||||
"linkType": "SOFT"\
|
||||
}],\
|
||||
["virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0", {\
|
||||
"packageLocation": "./.yarn/__virtual__/@newrelic-winston-enricher-virtual-6b8c53ab3d/0/cache/@newrelic-winston-enricher-npm-4.0.0-ebaf2d0d28-3fc901cded.zip/node_modules/@newrelic/winston-enricher/",\
|
||||
["virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.1", {\
|
||||
"packageLocation": "./.yarn/__virtual__/@newrelic-winston-enricher-virtual-c32d28b076/0/cache/@newrelic-winston-enricher-npm-4.0.1-ef1230a3ce-e45880f6ec.zip/node_modules/@newrelic/winston-enricher/",\
|
||||
"packageDependencies": [\
|
||||
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\
|
||||
["@types/newrelic", "npm:9.4.0"],\
|
||||
["newrelic", "npm:9.11.0"]\
|
||||
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.1"],\
|
||||
["@types/newrelic", "npm:9.13.0"],\
|
||||
["newrelic", "npm:10.0.0"]\
|
||||
],\
|
||||
"packagePeers": [\
|
||||
"@types/newrelic",\
|
||||
@@ -4062,7 +4062,7 @@ const RAW_RUNTIME_STATE =
|
||||
["@standardnotes/analytics", "workspace:packages/analytics"],\
|
||||
["@aws-sdk/client-sns", "npm:3.259.0"],\
|
||||
["@aws-sdk/client-sqs", "npm:3.259.0"],\
|
||||
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\
|
||||
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.1"],\
|
||||
["@sentry/node", "npm:7.28.1"],\
|
||||
["@standardnotes/common", "workspace:packages/common"],\
|
||||
["@standardnotes/domain-core", "workspace:packages/domain-core"],\
|
||||
@@ -4072,7 +4072,7 @@ const RAW_RUNTIME_STATE =
|
||||
["@types/ioredis", "npm:5.0.0"],\
|
||||
["@types/jest", "npm:29.1.1"],\
|
||||
["@types/mixpanel", "npm:2.14.4"],\
|
||||
["@types/newrelic", "npm:9.4.0"],\
|
||||
["@types/newrelic", "npm:9.13.0"],\
|
||||
["@types/node", "npm:18.11.9"],\
|
||||
["@typescript-eslint/eslint-plugin", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:5.48.2"],\
|
||||
["dayjs", "npm:1.11.6"],\
|
||||
@@ -4084,7 +4084,7 @@ const RAW_RUNTIME_STATE =
|
||||
["jest", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:29.1.2"],\
|
||||
["mixpanel", "npm:0.17.0"],\
|
||||
["mysql2", "npm:3.0.1"],\
|
||||
["newrelic", "npm:9.11.0"],\
|
||||
["newrelic", "npm:10.0.0"],\
|
||||
["reflect-metadata", "npm:0.1.13"],\
|
||||
["ts-jest", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:29.0.3"],\
|
||||
["typeorm", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:0.3.10"],\
|
||||
@@ -4116,7 +4116,7 @@ const RAW_RUNTIME_STATE =
|
||||
"packageLocation": "./packages/api-gateway/",\
|
||||
"packageDependencies": [\
|
||||
["@standardnotes/api-gateway", "workspace:packages/api-gateway"],\
|
||||
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\
|
||||
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.1"],\
|
||||
["@sentry/node", "npm:7.28.1"],\
|
||||
["@standardnotes/domain-core", "workspace:packages/domain-core"],\
|
||||
["@standardnotes/domain-events", "workspace:packages/domain-events"],\
|
||||
@@ -4128,7 +4128,7 @@ const RAW_RUNTIME_STATE =
|
||||
["@types/ioredis", "npm:5.0.0"],\
|
||||
["@types/jest", "npm:29.1.1"],\
|
||||
["@types/jsonwebtoken", "npm:9.0.1"],\
|
||||
["@types/newrelic", "npm:9.4.0"],\
|
||||
["@types/newrelic", "npm:9.13.0"],\
|
||||
["@types/prettyjson", "npm:0.0.30"],\
|
||||
["@typescript-eslint/eslint-plugin", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:5.48.2"],\
|
||||
["axios", "npm:1.1.3"],\
|
||||
@@ -4144,7 +4144,7 @@ const RAW_RUNTIME_STATE =
|
||||
["ioredis", "npm:5.2.4"],\
|
||||
["jest", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:29.1.2"],\
|
||||
["jsonwebtoken", "npm:9.0.0"],\
|
||||
["newrelic", "npm:9.11.0"],\
|
||||
["newrelic", "npm:10.0.0"],\
|
||||
["nodemon", "npm:2.0.20"],\
|
||||
["npm-check-updates", "npm:16.0.1"],\
|
||||
["prettyjson", "npm:1.2.5"],\
|
||||
@@ -4165,7 +4165,7 @@ const RAW_RUNTIME_STATE =
|
||||
["@aws-sdk/client-sqs", "npm:3.259.0"],\
|
||||
["@cbor-extract/cbor-extract-linux-arm64", "npm:2.1.1"],\
|
||||
["@cbor-extract/cbor-extract-linux-x64", "npm:2.1.1"],\
|
||||
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\
|
||||
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.1"],\
|
||||
["@sentry/node", "npm:7.28.1"],\
|
||||
["@sentry/tracing", "npm:7.28.1"],\
|
||||
["@simplewebauthn/server", "npm:7.0.1"],\
|
||||
@@ -4175,7 +4175,7 @@ const RAW_RUNTIME_STATE =
|
||||
["@standardnotes/domain-core", "workspace:packages/domain-core"],\
|
||||
["@standardnotes/domain-events", "workspace:packages/domain-events"],\
|
||||
["@standardnotes/domain-events-infra", "workspace:packages/domain-events-infra"],\
|
||||
["@standardnotes/features", "npm:1.58.9"],\
|
||||
["@standardnotes/features", "npm:1.58.12"],\
|
||||
["@standardnotes/predicates", "workspace:packages/predicates"],\
|
||||
["@standardnotes/responses", "npm:1.13.9"],\
|
||||
["@standardnotes/security", "workspace:packages/security"],\
|
||||
@@ -4188,7 +4188,7 @@ const RAW_RUNTIME_STATE =
|
||||
["@types/express", "npm:4.17.14"],\
|
||||
["@types/ioredis", "npm:5.0.0"],\
|
||||
["@types/jest", "npm:29.1.1"],\
|
||||
["@types/newrelic", "npm:9.4.0"],\
|
||||
["@types/newrelic", "npm:9.13.0"],\
|
||||
["@types/otplib", "npm:10.0.0"],\
|
||||
["@types/prettyjson", "npm:0.0.30"],\
|
||||
["@types/ua-parser-js", "npm:0.7.36"],\
|
||||
@@ -4207,7 +4207,7 @@ const RAW_RUNTIME_STATE =
|
||||
["ioredis", "npm:5.2.4"],\
|
||||
["jest", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:29.1.2"],\
|
||||
["mysql2", "npm:3.0.1"],\
|
||||
["newrelic", "npm:9.11.0"],\
|
||||
["newrelic", "npm:10.0.0"],\
|
||||
["nodemon", "npm:2.0.20"],\
|
||||
["npm-check-updates", "npm:16.0.1"],\
|
||||
["otplib", "npm:12.0.1"],\
|
||||
@@ -4298,12 +4298,12 @@ const RAW_RUNTIME_STATE =
|
||||
["@standardnotes/domain-events", "workspace:packages/domain-events"],\
|
||||
["@types/ioredis", "npm:5.0.0"],\
|
||||
["@types/jest", "npm:29.1.1"],\
|
||||
["@types/newrelic", "npm:9.4.0"],\
|
||||
["@types/newrelic", "npm:9.13.0"],\
|
||||
["@typescript-eslint/eslint-plugin", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:5.48.2"],\
|
||||
["eslint-plugin-prettier", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:4.2.1"],\
|
||||
["ioredis", "npm:5.2.4"],\
|
||||
["jest", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:29.1.2"],\
|
||||
["newrelic", "npm:9.11.0"],\
|
||||
["newrelic", "npm:10.0.0"],\
|
||||
["reflect-metadata", "npm:0.1.13"],\
|
||||
["sqs-consumer", "virtual:685a6222c3349423674bb7f0684ba34e2ab20912010f352e04dcf707a156e13183fc382e2417cb37a60f3e7b52fd0178c53181674890e1773eb83e190dc13378#npm:6.2.1"],\
|
||||
["ts-jest", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:29.0.3"],\
|
||||
@@ -4339,7 +4339,7 @@ const RAW_RUNTIME_STATE =
|
||||
["@standardnotes/time", "workspace:packages/time"],\
|
||||
["@types/ioredis", "npm:5.0.0"],\
|
||||
["@types/jest", "npm:29.1.1"],\
|
||||
["@types/newrelic", "npm:9.4.0"],\
|
||||
["@types/newrelic", "npm:9.13.0"],\
|
||||
["@types/nodemailer", "npm:6.4.6"],\
|
||||
["@typescript-eslint/eslint-plugin", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:5.48.2"],\
|
||||
["dotenv", "npm:16.0.1"],\
|
||||
@@ -4349,7 +4349,7 @@ const RAW_RUNTIME_STATE =
|
||||
["ioredis", "npm:5.2.4"],\
|
||||
["jest", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:29.1.2"],\
|
||||
["mysql2", "npm:3.0.1"],\
|
||||
["newrelic", "npm:9.11.0"],\
|
||||
["newrelic", "npm:10.0.0"],\
|
||||
["reflect-metadata", "npm:0.1.13"],\
|
||||
["ts-jest", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:29.0.3"],\
|
||||
["typeorm", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:0.3.10"],\
|
||||
@@ -4360,10 +4360,10 @@ const RAW_RUNTIME_STATE =
|
||||
}]\
|
||||
]],\
|
||||
["@standardnotes/features", [\
|
||||
["npm:1.58.8", {\
|
||||
"packageLocation": "./.yarn/cache/@standardnotes-features-npm-1.58.8-d97ff2aae1-77bac7d0a0.zip/node_modules/@standardnotes/features/",\
|
||||
["npm:1.58.12", {\
|
||||
"packageLocation": "./.yarn/cache/@standardnotes-features-npm-1.58.12-9778b78276-3fcd9a9488.zip/node_modules/@standardnotes/features/",\
|
||||
"packageDependencies": [\
|
||||
["@standardnotes/features", "npm:1.58.8"],\
|
||||
["@standardnotes/features", "npm:1.58.12"],\
|
||||
["@standardnotes/common", "workspace:packages/common"],\
|
||||
["@standardnotes/domain-core", "workspace:packages/domain-core"],\
|
||||
["@standardnotes/security", "workspace:packages/security"],\
|
||||
@@ -4371,10 +4371,10 @@ const RAW_RUNTIME_STATE =
|
||||
],\
|
||||
"linkType": "HARD"\
|
||||
}],\
|
||||
["npm:1.58.9", {\
|
||||
"packageLocation": "./.yarn/cache/@standardnotes-features-npm-1.58.9-c278f712cd-218350ee55.zip/node_modules/@standardnotes/features/",\
|
||||
["npm:1.58.8", {\
|
||||
"packageLocation": "./.yarn/cache/@standardnotes-features-npm-1.58.8-d97ff2aae1-77bac7d0a0.zip/node_modules/@standardnotes/features/",\
|
||||
"packageDependencies": [\
|
||||
["@standardnotes/features", "npm:1.58.9"],\
|
||||
["@standardnotes/features", "npm:1.58.8"],\
|
||||
["@standardnotes/common", "workspace:packages/common"],\
|
||||
["@standardnotes/domain-core", "workspace:packages/domain-core"],\
|
||||
["@standardnotes/security", "workspace:packages/security"],\
|
||||
@@ -4406,7 +4406,7 @@ const RAW_RUNTIME_STATE =
|
||||
["@types/ioredis", "npm:5.0.0"],\
|
||||
["@types/jest", "npm:29.1.1"],\
|
||||
["@types/jsonwebtoken", "npm:9.0.1"],\
|
||||
["@types/newrelic", "npm:9.4.0"],\
|
||||
["@types/newrelic", "npm:9.13.0"],\
|
||||
["@types/prettyjson", "npm:0.0.30"],\
|
||||
["@types/uuid", "npm:8.3.4"],\
|
||||
["@typescript-eslint/eslint-plugin", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:5.48.2"],\
|
||||
@@ -4425,7 +4425,7 @@ const RAW_RUNTIME_STATE =
|
||||
["ioredis", "npm:5.2.4"],\
|
||||
["jest", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:29.1.2"],\
|
||||
["jsonwebtoken", "npm:9.0.0"],\
|
||||
["newrelic", "npm:9.11.0"],\
|
||||
["newrelic", "npm:10.0.0"],\
|
||||
["nodemon", "npm:2.0.20"],\
|
||||
["npm-check-updates", "npm:16.0.1"],\
|
||||
["prettyjson", "npm:1.2.5"],\
|
||||
@@ -4488,7 +4488,7 @@ const RAW_RUNTIME_STATE =
|
||||
["@standardnotes/revisions-server", "workspace:packages/revisions"],\
|
||||
["@aws-sdk/client-s3", "npm:3.259.0"],\
|
||||
["@aws-sdk/client-sqs", "npm:3.259.0"],\
|
||||
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\
|
||||
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.1"],\
|
||||
["@sentry/node", "npm:7.28.1"],\
|
||||
["@standardnotes/api", "npm:1.25.3"],\
|
||||
["@standardnotes/common", "workspace:packages/common"],\
|
||||
@@ -4503,7 +4503,7 @@ const RAW_RUNTIME_STATE =
|
||||
["@types/express", "npm:4.17.14"],\
|
||||
["@types/inversify-express-utils", "npm:2.0.0"],\
|
||||
["@types/jest", "npm:29.1.1"],\
|
||||
["@types/newrelic", "npm:9.4.0"],\
|
||||
["@types/newrelic", "npm:9.13.0"],\
|
||||
["@typescript-eslint/eslint-plugin", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:5.48.2"],\
|
||||
["cors", "npm:2.8.5"],\
|
||||
["dotenv", "npm:16.0.1"],\
|
||||
@@ -4514,7 +4514,7 @@ const RAW_RUNTIME_STATE =
|
||||
["inversify-express-utils", "npm:6.4.3"],\
|
||||
["jest", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:29.1.2"],\
|
||||
["mysql2", "npm:3.0.1"],\
|
||||
["newrelic", "npm:9.11.0"],\
|
||||
["newrelic", "npm:10.0.0"],\
|
||||
["npm-check-updates", "npm:16.0.1"],\
|
||||
["reflect-metadata", "npm:0.1.13"],\
|
||||
["ts-jest", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:29.0.3"],\
|
||||
@@ -4532,7 +4532,7 @@ const RAW_RUNTIME_STATE =
|
||||
["@standardnotes/scheduler-server", "workspace:packages/scheduler"],\
|
||||
["@aws-sdk/client-sns", "npm:3.259.0"],\
|
||||
["@aws-sdk/client-sqs", "npm:3.259.0"],\
|
||||
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\
|
||||
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.1"],\
|
||||
["@sentry/node", "npm:7.28.1"],\
|
||||
["@standardnotes/domain-core", "workspace:packages/domain-core"],\
|
||||
["@standardnotes/domain-events", "workspace:packages/domain-events"],\
|
||||
@@ -4541,7 +4541,7 @@ const RAW_RUNTIME_STATE =
|
||||
["@standardnotes/time", "workspace:packages/time"],\
|
||||
["@types/ioredis", "npm:5.0.0"],\
|
||||
["@types/jest", "npm:29.1.1"],\
|
||||
["@types/newrelic", "npm:9.4.0"],\
|
||||
["@types/newrelic", "npm:9.13.0"],\
|
||||
["@types/node", "npm:18.11.9"],\
|
||||
["@typescript-eslint/eslint-plugin", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:5.48.2"],\
|
||||
["dayjs", "npm:1.11.6"],\
|
||||
@@ -4552,7 +4552,7 @@ const RAW_RUNTIME_STATE =
|
||||
["ioredis", "npm:5.2.4"],\
|
||||
["jest", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:29.1.2"],\
|
||||
["mysql2", "npm:3.0.1"],\
|
||||
["newrelic", "npm:9.11.0"],\
|
||||
["newrelic", "npm:10.0.0"],\
|
||||
["npm-check-updates", "npm:16.0.1"],\
|
||||
["reflect-metadata", "npm:0.1.13"],\
|
||||
["ts-jest", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:29.0.3"],\
|
||||
@@ -4593,13 +4593,13 @@ const RAW_RUNTIME_STATE =
|
||||
["@lerna-lite/run", "npm:1.6.0"],\
|
||||
["@sentry/node", "npm:7.28.1"],\
|
||||
["@types/jest", "npm:29.1.1"],\
|
||||
["@types/newrelic", "npm:9.4.0"],\
|
||||
["@types/newrelic", "npm:9.13.0"],\
|
||||
["@types/node", "npm:18.11.9"],\
|
||||
["@typescript-eslint/parser", "virtual:8859b278716fedf3e7458b5628625f7e35678c418626878559a0b816445001b7e24c55546f4677ba4c20b521aa0cf52cc33ac07deff171e383ada6eeab69933f#npm:5.40.1"],\
|
||||
["eslint", "npm:8.32.0"],\
|
||||
["eslint-config-prettier", "virtual:8859b278716fedf3e7458b5628625f7e35678c418626878559a0b816445001b7e24c55546f4677ba4c20b521aa0cf52cc33ac07deff171e383ada6eeab69933f#npm:8.6.0"],\
|
||||
["ini", "npm:3.0.0"],\
|
||||
["newrelic", "npm:9.11.0"],\
|
||||
["newrelic", "npm:10.0.0"],\
|
||||
["npm-check-updates", "npm:16.0.1"],\
|
||||
["prettier", "npm:2.7.1"],\
|
||||
["ts-node", "virtual:8859b278716fedf3e7458b5628625f7e35678c418626878559a0b816445001b7e24c55546f4677ba4c20b521aa0cf52cc33ac07deff171e383ada6eeab69933f#npm:10.9.1"],\
|
||||
@@ -4668,7 +4668,7 @@ const RAW_RUNTIME_STATE =
|
||||
["@aws-sdk/client-s3", "npm:3.259.0"],\
|
||||
["@aws-sdk/client-sns", "npm:3.259.0"],\
|
||||
["@aws-sdk/client-sqs", "npm:3.259.0"],\
|
||||
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\
|
||||
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.1"],\
|
||||
["@sentry/node", "npm:7.28.1"],\
|
||||
["@sentry/tracing", "npm:7.28.1"],\
|
||||
["@standardnotes/api", "npm:1.25.3"],\
|
||||
@@ -4686,7 +4686,7 @@ const RAW_RUNTIME_STATE =
|
||||
["@types/inversify-express-utils", "npm:2.0.0"],\
|
||||
["@types/jest", "npm:29.1.1"],\
|
||||
["@types/jsonwebtoken", "npm:9.0.1"],\
|
||||
["@types/newrelic", "npm:9.4.0"],\
|
||||
["@types/newrelic", "npm:9.13.0"],\
|
||||
["@types/prettyjson", "npm:0.0.30"],\
|
||||
["@types/ua-parser-js", "npm:0.7.36"],\
|
||||
["@types/uuid", "npm:8.3.4"],\
|
||||
@@ -4703,7 +4703,7 @@ const RAW_RUNTIME_STATE =
|
||||
["jest", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:29.1.2"],\
|
||||
["jsonwebtoken", "npm:9.0.0"],\
|
||||
["mysql2", "npm:3.0.1"],\
|
||||
["newrelic", "npm:9.11.0"],\
|
||||
["newrelic", "npm:10.0.0"],\
|
||||
["nodemon", "npm:2.0.20"],\
|
||||
["npm-check-updates", "npm:16.0.1"],\
|
||||
["prettyjson", "npm:1.2.5"],\
|
||||
@@ -4767,7 +4767,7 @@ const RAW_RUNTIME_STATE =
|
||||
"packageDependencies": [\
|
||||
["@standardnotes/websockets-server", "workspace:packages/websockets"],\
|
||||
["@aws-sdk/client-sqs", "npm:3.259.0"],\
|
||||
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\
|
||||
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.1"],\
|
||||
["@sentry/node", "npm:7.28.1"],\
|
||||
["@standardnotes/api", "npm:1.25.3"],\
|
||||
["@standardnotes/common", "workspace:packages/common"],\
|
||||
@@ -4781,7 +4781,7 @@ const RAW_RUNTIME_STATE =
|
||||
["@types/express", "npm:4.17.14"],\
|
||||
["@types/ioredis", "npm:5.0.0"],\
|
||||
["@types/jest", "npm:29.1.1"],\
|
||||
["@types/newrelic", "npm:9.4.0"],\
|
||||
["@types/newrelic", "npm:9.13.0"],\
|
||||
["@typescript-eslint/eslint-plugin", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:5.48.2"],\
|
||||
["axios", "npm:1.1.3"],\
|
||||
["cors", "npm:2.8.5"],\
|
||||
@@ -4794,7 +4794,7 @@ const RAW_RUNTIME_STATE =
|
||||
["ioredis", "npm:5.2.4"],\
|
||||
["jest", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:29.1.2"],\
|
||||
["mysql2", "npm:3.0.1"],\
|
||||
["newrelic", "npm:9.11.0"],\
|
||||
["newrelic", "npm:10.0.0"],\
|
||||
["reflect-metadata", "npm:0.1.13"],\
|
||||
["ts-jest", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:29.0.3"],\
|
||||
["typeorm", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:0.3.10"],\
|
||||
@@ -5185,10 +5185,10 @@ const RAW_RUNTIME_STATE =
|
||||
}]\
|
||||
]],\
|
||||
["@types/newrelic", [\
|
||||
["npm:9.4.0", {\
|
||||
"packageLocation": "./.yarn/cache/@types-newrelic-npm-9.4.0-72a77bd5e6-adb12973e8.zip/node_modules/@types/newrelic/",\
|
||||
["npm:9.13.0", {\
|
||||
"packageLocation": "./.yarn/cache/@types-newrelic-npm-9.13.0-a283f22b65-d0269b05c4.zip/node_modules/@types/newrelic/",\
|
||||
"packageDependencies": [\
|
||||
["@types/newrelic", "npm:9.4.0"]\
|
||||
["@types/newrelic", "npm:9.13.0"]\
|
||||
],\
|
||||
"linkType": "HARD"\
|
||||
}]\
|
||||
@@ -11502,23 +11502,23 @@ const RAW_RUNTIME_STATE =
|
||||
}]\
|
||||
]],\
|
||||
["newrelic", [\
|
||||
["npm:9.11.0", {\
|
||||
"packageLocation": "./.yarn/cache/newrelic-npm-9.11.0-3903f8b525-fd1ec1b307.zip/node_modules/newrelic/",\
|
||||
["npm:10.0.0", {\
|
||||
"packageLocation": "./.yarn/cache/newrelic-npm-10.0.0-2e94dc408d-b5af478708.zip/node_modules/newrelic/",\
|
||||
"packageDependencies": [\
|
||||
["newrelic", "npm:9.11.0"],\
|
||||
["newrelic", "npm:10.0.0"],\
|
||||
["@contrast/fn-inspect", "npm:3.3.0"],\
|
||||
["@grpc/grpc-js", "npm:1.8.12"],\
|
||||
["@grpc/grpc-js", "npm:1.8.13"],\
|
||||
["@grpc/proto-loader", "npm:0.7.5"],\
|
||||
["@newrelic/aws-sdk", "virtual:3903f8b52579d93ef51c172e331bc99e7b2816716d59e05f43ef24f0b7764b243282fc408399f3458a146bc3927d0afc82281a5fef8bf3c4a084cec2d908e789#npm:5.0.2"],\
|
||||
["@newrelic/koa", "virtual:3903f8b52579d93ef51c172e331bc99e7b2816716d59e05f43ef24f0b7764b243282fc408399f3458a146bc3927d0afc82281a5fef8bf3c4a084cec2d908e789#npm:7.1.1"],\
|
||||
["@newrelic/aws-sdk", "virtual:2e94dc408d78a7f546b419c58b70581fdb1401ee1979fe214195b4cfca74499df9c9aa918c3214331583e314b7e767fec897581d1a684dcab7cc3bba5897fc45#npm:5.0.2"],\
|
||||
["@newrelic/koa", "virtual:2e94dc408d78a7f546b419c58b70581fdb1401ee1979fe214195b4cfca74499df9c9aa918c3214331583e314b7e767fec897581d1a684dcab7cc3bba5897fc45#npm:7.1.1"],\
|
||||
["@newrelic/native-metrics", "npm:9.0.0"],\
|
||||
["@newrelic/superagent", "virtual:3903f8b52579d93ef51c172e331bc99e7b2816716d59e05f43ef24f0b7764b243282fc408399f3458a146bc3927d0afc82281a5fef8bf3c4a084cec2d908e789#npm:6.0.0"],\
|
||||
["@newrelic/superagent", "virtual:2e94dc408d78a7f546b419c58b70581fdb1401ee1979fe214195b4cfca74499df9c9aa918c3214331583e314b7e767fec897581d1a684dcab7cc3bba5897fc45#npm:6.0.0"],\
|
||||
["@tyriar/fibonacci-heap", "npm:2.0.9"],\
|
||||
["concat-stream", "npm:2.0.0"],\
|
||||
["https-proxy-agent", "npm:5.0.1"],\
|
||||
["json-bigint", "npm:1.0.0"],\
|
||||
["json-stringify-safe", "npm:5.0.1"],\
|
||||
["readable-stream", "npm:3.6.0"],\
|
||||
["readable-stream", "npm:3.6.2"],\
|
||||
["semver", "npm:5.7.1"],\
|
||||
["winston-transport", "npm:4.5.0"]\
|
||||
],\
|
||||
@@ -12866,6 +12866,16 @@ const RAW_RUNTIME_STATE =
|
||||
["util-deprecate", "npm:1.0.2"]\
|
||||
],\
|
||||
"linkType": "HARD"\
|
||||
}],\
|
||||
["npm:3.6.2", {\
|
||||
"packageLocation": "./.yarn/cache/readable-stream-npm-3.6.2-d2a6069158-b1cbe0fea6.zip/node_modules/readable-stream/",\
|
||||
"packageDependencies": [\
|
||||
["readable-stream", "npm:3.6.2"],\
|
||||
["inherits", "npm:2.0.4"],\
|
||||
["string_decoder", "npm:1.3.0"],\
|
||||
["util-deprecate", "npm:1.0.2"]\
|
||||
],\
|
||||
"linkType": "HARD"\
|
||||
}]\
|
||||
]],\
|
||||
["readdirp", [\
|
||||
|
||||
Binary file not shown.
Binary file not shown.
BIN
.yarn/cache/@newrelic-winston-enricher-npm-4.0.1-ef1230a3ce-e45880f6ec.zip
vendored
Normal file
BIN
.yarn/cache/@newrelic-winston-enricher-npm-4.0.1-ef1230a3ce-e45880f6ec.zip
vendored
Normal file
Binary file not shown.
Binary file not shown.
BIN
.yarn/cache/@types-newrelic-npm-9.13.0-a283f22b65-d0269b05c4.zip
vendored
Normal file
BIN
.yarn/cache/@types-newrelic-npm-9.13.0-a283f22b65-d0269b05c4.zip
vendored
Normal file
Binary file not shown.
Binary file not shown.
BIN
.yarn/cache/newrelic-npm-10.0.0-2e94dc408d-b5af478708.zip
vendored
Normal file
BIN
.yarn/cache/newrelic-npm-10.0.0-2e94dc408d-b5af478708.zip
vendored
Normal file
Binary file not shown.
Binary file not shown.
BIN
.yarn/cache/readable-stream-npm-3.6.2-d2a6069158-b1cbe0fea6.zip
vendored
Normal file
BIN
.yarn/cache/readable-stream-npm-3.6.2-d2a6069158-b1cbe0fea6.zip
vendored
Normal file
Binary file not shown.
@@ -327,7 +327,7 @@ endif
|
||||
|
||||
quiet_cmd_regen_makefile = ACTION Regenerating $@
|
||||
cmd_regen_makefile = cd $(srcdir); /Users/karolsojko/workspace/server/.yarn/unplugged/node-gyp-npm-9.0.0-0eccfca4d1/node_modules/node-gyp/gyp/gyp_main.py -fmake --ignore-environment "-Dlibrary=shared_library" "-Dvisibility=default" "-Dnode_root_dir=/Users/karolsojko/Library/Caches/node-gyp/18.15.0" "-Dnode_gyp_dir=/Users/karolsojko/workspace/server/.yarn/unplugged/node-gyp-npm-9.0.0-0eccfca4d1/node_modules/node-gyp" "-Dnode_lib_file=/Users/karolsojko/Library/Caches/node-gyp/18.15.0/<(target_arch)/node.lib" "-Dmodule_root_dir=/Users/karolsojko/workspace/server/.yarn/unplugged/@newrelic-native-metrics-npm-9.0.0-590d2e713a/node_modules/@newrelic/native-metrics" "-Dnode_engine=v8" "--depth=." "-Goutput_dir=." "--generator-output=build" -I/Users/karolsojko/workspace/server/.yarn/unplugged/@newrelic-native-metrics-npm-9.0.0-590d2e713a/node_modules/@newrelic/native-metrics/build/config.gypi -I/Users/karolsojko/workspace/server/.yarn/unplugged/node-gyp-npm-9.0.0-0eccfca4d1/node_modules/node-gyp/addon.gypi -I/Users/karolsojko/Library/Caches/node-gyp/18.15.0/include/node/common.gypi "--toplevel-dir=." binding.gyp
|
||||
Makefile: $(srcdir)/binding.gyp $(srcdir)/../../../../node-gyp-npm-9.0.0-0eccfca4d1/node_modules/node-gyp/addon.gypi $(srcdir)/../../../../../../../../Library/Caches/node-gyp/18.15.0/include/node/common.gypi $(srcdir)/build/config.gypi
|
||||
Makefile: $(srcdir)/../../../../node-gyp-npm-9.0.0-0eccfca4d1/node_modules/node-gyp/addon.gypi $(srcdir)/build/config.gypi $(srcdir)/../../../../../../../../Library/Caches/node-gyp/18.15.0/include/node/common.gypi $(srcdir)/binding.gyp
|
||||
$(call do_cmd,regen_makefile)
|
||||
|
||||
# "all" is a concatenation of the "all" targets from all the included
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -22,24 +22,37 @@ if [ -z "$REVISIONS_SERVER_PORT" ]; then
|
||||
export REVISIONS_SERVER_PORT=3105
|
||||
fi
|
||||
|
||||
#############
|
||||
# NEW RELIC #
|
||||
#############
|
||||
|
||||
if [ -z "$NEW_RELIC_ENABLED" ]; then
|
||||
export NEW_RELIC_ENABLED=false
|
||||
fi
|
||||
|
||||
######
|
||||
# DB #
|
||||
######
|
||||
|
||||
if [ -z "$DB_HOST" ]; then
|
||||
export DB_HOST="db"
|
||||
echo "DB_HOST is not set. Please set it in your .env file."
|
||||
exit 1
|
||||
fi
|
||||
if [ -z "$DB_PORT" ]; then
|
||||
export DB_PORT="3306"
|
||||
echo "DB_PORT is not set. Please set it in your .env file."
|
||||
exit 1
|
||||
fi
|
||||
if [ -z "$DB_USERNAME" ]; then
|
||||
export DB_USERNAME="std_notes_user"
|
||||
echo "DB_USERNAME is not set. Please set it in your .env file."
|
||||
exit 1
|
||||
fi
|
||||
if [ -z "$DB_PASSWORD" ]; then
|
||||
export DB_PASSWORD=$(openssl rand -hex 32)
|
||||
echo "DB_PASSWORD is not set. Please set it in your .env file."
|
||||
exit 1
|
||||
fi
|
||||
if [ -z "$DB_DATABASE" ]; then
|
||||
export DB_DATABASE="standard_notes_db"
|
||||
echo "DB_DATABASE is not set. Please set it in your .env file."
|
||||
exit 1
|
||||
fi
|
||||
if [ -z "$DB_DEBUG_LEVEL" ]; then
|
||||
export DB_DEBUG_LEVEL="all"
|
||||
@@ -51,11 +64,13 @@ export DB_MIGRATIONS_PATH="dist/migrations/*.js"
|
||||
#########
|
||||
|
||||
if [ -z "$REDIS_PORT" ]; then
|
||||
export REDIS_PORT=6379
|
||||
echo "REDIS_PORT is not set. Please set it in your .env file."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -z "$REDIS_HOST" ]; then
|
||||
export REDIS_HOST="cache"
|
||||
echo "REDIS_HOST is not set. Please set it in your .env file."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -z "$REDIS_URL" ]; then
|
||||
@@ -67,11 +82,13 @@ fi
|
||||
##########
|
||||
|
||||
if [ -z "$AUTH_JWT_SECRET" ]; then
|
||||
export AUTH_JWT_SECRET=$(openssl rand -hex 32)
|
||||
echo "AUTH_JWT_SECRET is not set. Please set it in your .env file. You can run 'openssl rand -hex 32' to generate a random string."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -z "$VALET_TOKEN_SECRET" ]; then
|
||||
export VALET_TOKEN_SECRET=$(openssl rand -base64 32)
|
||||
echo "VALET_TOKEN_SECRET is not set. Please set it in your .env file. You can run 'openssl rand -hex 32' to generate a random string."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
########
|
||||
@@ -122,7 +139,8 @@ if [ -z "$AUTH_SERVER_EPHEMERAL_SESSION_AGE" ]; then
|
||||
fi
|
||||
|
||||
if [ -z "$AUTH_SERVER_ENCRYPTION_SERVER_KEY" ]; then
|
||||
export AUTH_SERVER_ENCRYPTION_SERVER_KEY=$(openssl rand -hex 32)
|
||||
echo "AUTH_SERVER_ENCRYPTION_SERVER_KEY is not set. Please set it in your .env file. You can run 'openssl rand -hex 32' to generate a random string."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
export AUTH_SERVER_SYNCING_SERVER_URL=http://localhost:$SYNCING_SERVER_PORT
|
||||
@@ -172,7 +190,7 @@ if [ -z "$AUTH_SERVER_U2F_RELYING_PARTY_NAME" ]; then
|
||||
export AUTH_SERVER_U2F_RELYING_PARTY_NAME="Standard Notes"
|
||||
fi
|
||||
if [ -z "$AUTH_SERVER_U2F_EXPECTED_ORIGIN" ]; then
|
||||
export AUTH_SERVER_U2F_EXPECTED_ORIGIN="http://localhost,http://localhost:3001"
|
||||
export AUTH_SERVER_U2F_EXPECTED_ORIGIN="http://localhost,http://localhost:3001,https://app.standardnotes.com,android:apk-key-hash:WD_EG0kMOAtW--nuRzgetO9T4DcZpVA_wfKdzY4okCo"
|
||||
fi
|
||||
if [ -z "$AUTH_SERVER_U2F_REQUIRE_USER_VERIFICATION" ]; then
|
||||
export AUTH_SERVER_U2F_REQUIRE_USER_VERIFICATION=false
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
"@lerna-lite/list": "^1.5.1",
|
||||
"@lerna-lite/run": "^1.5.1",
|
||||
"@types/jest": "^29.1.1",
|
||||
"@types/newrelic": "^9.4.0",
|
||||
"@types/newrelic": "^9.13.0",
|
||||
"@types/node": "^18.11.9",
|
||||
"@typescript-eslint/parser": "^5.40.1",
|
||||
"eslint": "^8.32.0",
|
||||
@@ -40,6 +40,6 @@
|
||||
"packageManager": "yarn@4.0.0-rc.25",
|
||||
"dependencies": {
|
||||
"@sentry/node": "^7.28.1",
|
||||
"newrelic": "^9.11.0"
|
||||
"newrelic": "^10.0.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,6 +3,18 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [2.21.7](https://github.com/standardnotes/server/compare/@standardnotes/analytics@2.21.6...@standardnotes/analytics@2.21.7) (2023-04-21)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/analytics
|
||||
|
||||
## [2.21.6](https://github.com/standardnotes/server/compare/@standardnotes/analytics@2.21.5...@standardnotes/analytics@2.21.6) (2023-04-21)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/analytics
|
||||
|
||||
## [2.21.5](https://github.com/standardnotes/server/compare/@standardnotes/analytics@2.21.4...@standardnotes/analytics@2.21.5) (2023-03-30)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/analytics
|
||||
|
||||
## [2.21.4](https://github.com/standardnotes/server/compare/@standardnotes/analytics@2.21.3...@standardnotes/analytics@2.21.4) (2023-03-10)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/analytics
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@standardnotes/analytics",
|
||||
"version": "2.21.4",
|
||||
"version": "2.21.7",
|
||||
"engines": {
|
||||
"node": ">=18.0.0 <19.0.0"
|
||||
},
|
||||
@@ -28,7 +28,7 @@
|
||||
"@types/ioredis": "^5.0.0",
|
||||
"@types/jest": "^29.1.1",
|
||||
"@types/mixpanel": "^2.14.4",
|
||||
"@types/newrelic": "^9.4.0",
|
||||
"@types/newrelic": "^9.13.0",
|
||||
"@types/node": "^18.11.9",
|
||||
"@typescript-eslint/eslint-plugin": "^5.48.2",
|
||||
"eslint": "^8.32.0",
|
||||
@@ -40,7 +40,7 @@
|
||||
"dependencies": {
|
||||
"@aws-sdk/client-sns": "^3.259.0",
|
||||
"@aws-sdk/client-sqs": "^3.259.0",
|
||||
"@newrelic/winston-enricher": "^4.0.0",
|
||||
"@newrelic/winston-enricher": "^4.0.1",
|
||||
"@sentry/node": "^7.28.1",
|
||||
"@standardnotes/common": "workspace:*",
|
||||
"@standardnotes/domain-core": "workspace:^",
|
||||
@@ -53,7 +53,7 @@
|
||||
"ioredis": "^5.2.4",
|
||||
"mixpanel": "^0.17.0",
|
||||
"mysql2": "^3.0.1",
|
||||
"newrelic": "^9.11.0",
|
||||
"newrelic": "^10.0.0",
|
||||
"reflect-metadata": "^0.1.13",
|
||||
"typeorm": "^0.3.10",
|
||||
"winston": "^3.8.1"
|
||||
|
||||
@@ -3,6 +3,18 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [1.49.10](https://github.com/standardnotes/api-gateway/compare/@standardnotes/api-gateway@1.49.9...@standardnotes/api-gateway@1.49.10) (2023-04-21)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/api-gateway
|
||||
|
||||
## [1.49.9](https://github.com/standardnotes/api-gateway/compare/@standardnotes/api-gateway@1.49.8...@standardnotes/api-gateway@1.49.9) (2023-04-21)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/api-gateway
|
||||
|
||||
## [1.49.8](https://github.com/standardnotes/api-gateway/compare/@standardnotes/api-gateway@1.49.7...@standardnotes/api-gateway@1.49.8) (2023-03-30)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/api-gateway
|
||||
|
||||
## [1.49.7](https://github.com/standardnotes/api-gateway/compare/@standardnotes/api-gateway@1.49.6...@standardnotes/api-gateway@1.49.7) (2023-03-10)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/api-gateway
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@standardnotes/api-gateway",
|
||||
"version": "1.49.7",
|
||||
"version": "1.49.10",
|
||||
"engines": {
|
||||
"node": ">=18.0.0 <19.0.0"
|
||||
},
|
||||
@@ -20,7 +20,7 @@
|
||||
"upgrade:snjs": "yarn ncu -u '@standardnotes/*'"
|
||||
},
|
||||
"dependencies": {
|
||||
"@newrelic/winston-enricher": "^4.0.0",
|
||||
"@newrelic/winston-enricher": "^4.0.1",
|
||||
"@sentry/node": "^7.28.1",
|
||||
"@standardnotes/domain-core": "workspace:^",
|
||||
"@standardnotes/domain-events": "workspace:*",
|
||||
@@ -37,7 +37,7 @@
|
||||
"inversify-express-utils": "^6.4.3",
|
||||
"ioredis": "^5.2.4",
|
||||
"jsonwebtoken": "^9.0.0",
|
||||
"newrelic": "^9.11.0",
|
||||
"newrelic": "^10.0.0",
|
||||
"prettyjson": "^1.2.5",
|
||||
"reflect-metadata": "0.1.13",
|
||||
"winston": "^3.8.1"
|
||||
@@ -48,7 +48,7 @@
|
||||
"@types/ioredis": "^5.0.0",
|
||||
"@types/jest": "^29.1.1",
|
||||
"@types/jsonwebtoken": "^9.0.1",
|
||||
"@types/newrelic": "^9.4.0",
|
||||
"@types/newrelic": "^9.13.0",
|
||||
"@types/prettyjson": "^0.0.30",
|
||||
"@typescript-eslint/eslint-plugin": "^5.48.2",
|
||||
"eslint": "^8.32.0",
|
||||
|
||||
@@ -3,6 +3,58 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [1.95.3](https://github.com/standardnotes/server/compare/@standardnotes/auth-server@1.95.2...@standardnotes/auth-server@1.95.3) (2023-04-21)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/auth-server
|
||||
|
||||
## [1.95.2](https://github.com/standardnotes/server/compare/@standardnotes/auth-server@1.95.1...@standardnotes/auth-server@1.95.2) (2023-04-21)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/auth-server
|
||||
|
||||
## [1.95.1](https://github.com/standardnotes/server/compare/@standardnotes/auth-server@1.95.0...@standardnotes/auth-server@1.95.1) (2023-04-20)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **auth:** add u2f permissions for pro users ([d211249](https://github.com/standardnotes/server/commit/d21124908652e89a7995c8f58e6b95394268967f))
|
||||
|
||||
# [1.95.0](https://github.com/standardnotes/server/compare/@standardnotes/auth-server@1.94.1...@standardnotes/auth-server@1.95.0) (2023-04-04)
|
||||
|
||||
### Features
|
||||
|
||||
* **auth:** add initial emergency access invitations model ([#528](https://github.com/standardnotes/server/issues/528)) ([8242f13](https://github.com/standardnotes/server/commit/8242f13aff63ea9f3007308fe4f65973fa1478e1))
|
||||
|
||||
## [1.94.1](https://github.com/standardnotes/server/compare/@standardnotes/auth-server@1.94.0...@standardnotes/auth-server@1.94.1) (2023-04-04)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **auth:** change status code for updating a subscription setting without a subscription ([3417407](https://github.com/standardnotes/server/commit/3417407cbe3b8e19069f6003e767d707e14b4501))
|
||||
|
||||
# [1.94.0](https://github.com/standardnotes/server/compare/@standardnotes/auth-server@1.93.14...@standardnotes/auth-server@1.94.0) (2023-04-03)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **auth:** feature service specs ([b88f560](https://github.com/standardnotes/server/commit/b88f560b07de183d4101220626785d3ba994b44c))
|
||||
|
||||
### Features
|
||||
|
||||
* **auth:** feature entitlement check for u2f endpoints ([51b264c](https://github.com/standardnotes/server/commit/51b264ca13fffc66e2dc31e87b0934ba61a48435))
|
||||
|
||||
## [1.93.14](https://github.com/standardnotes/server/compare/@standardnotes/auth-server@1.93.13...@standardnotes/auth-server@1.93.14) (2023-04-03)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **auth:** relying party id ([aca8d29](https://github.com/standardnotes/server/commit/aca8d2948da67b32445dc8da54b561ff08bf5c62))
|
||||
|
||||
## [1.93.13](https://github.com/standardnotes/server/compare/@standardnotes/auth-server@1.93.12...@standardnotes/auth-server@1.93.13) (2023-03-30)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/auth-server
|
||||
|
||||
## [1.93.12](https://github.com/standardnotes/server/compare/@standardnotes/auth-server@1.93.11...@standardnotes/auth-server@1.93.12) (2023-03-16)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **auth:** persistence mapping for authenticators ([f8a2892](https://github.com/standardnotes/server/commit/f8a2892811ebb4d8f067e036fb9f54780a400535))
|
||||
|
||||
## [1.93.11](https://github.com/standardnotes/server/compare/@standardnotes/auth-server@1.93.10...@standardnotes/auth-server@1.93.11) (2023-03-10)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
import { MigrationInterface, QueryRunner } from 'typeorm'
|
||||
|
||||
export class emergencyAccessInvitations1680597887475 implements MigrationInterface {
|
||||
name = 'emergencyAccessInvitations1680597887475'
|
||||
|
||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||
await queryRunner.query(
|
||||
'CREATE TABLE `emergency_access_invitations` (`uuid` varchar(36) NOT NULL, `grantor_uuid` varchar(36) NOT NULL, `grantee_uuid` varchar(36) NOT NULL, `status` varchar(36) NOT NULL, `expires_at` datetime NOT NULL, `created_at` datetime NOT NULL, `updated_at` datetime NOT NULL, PRIMARY KEY (`uuid`)) ENGINE=InnoDB',
|
||||
)
|
||||
await queryRunner.query(
|
||||
'ALTER TABLE `emergency_access_invitations` ADD CONSTRAINT `grantor_uuid_fk` FOREIGN KEY (`grantor_uuid`) REFERENCES `users`(`uuid`) ON DELETE CASCADE ON UPDATE NO ACTION',
|
||||
)
|
||||
await queryRunner.query(
|
||||
'ALTER TABLE `emergency_access_invitations` ADD CONSTRAINT `grantee_uuid_fk` FOREIGN KEY (`grantee_uuid`) REFERENCES `users`(`uuid`) ON DELETE CASCADE ON UPDATE NO ACTION',
|
||||
)
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||
await queryRunner.query('ALTER TABLE `emergency_access_invitations` DROP FOREIGN KEY `grantee_uuid_fk`')
|
||||
await queryRunner.query('ALTER TABLE `emergency_access_invitations` DROP FOREIGN KEY `grantor_uuid_fk`')
|
||||
await queryRunner.query('DROP TABLE `emergency_access_invitations`')
|
||||
}
|
||||
}
|
||||
14
packages/auth/migrations/1681984540867-enable-u2f.ts
Normal file
14
packages/auth/migrations/1681984540867-enable-u2f.ts
Normal file
@@ -0,0 +1,14 @@
|
||||
import { MigrationInterface, QueryRunner } from 'typeorm'
|
||||
|
||||
export class enableU2f1681984540867 implements MigrationInterface {
|
||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||
// add u2f permission for pro users
|
||||
await queryRunner.query(
|
||||
'INSERT INTO `role_permissions` (role_uuid, permission_uuid) VALUES ("8047edbb-a10a-4ff8-8d53-c2cae600a8e8", "fb13e7d3-936f-4ded-a543-e1650cc99dfd")',
|
||||
)
|
||||
}
|
||||
|
||||
public async down(): Promise<void> {
|
||||
return
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@standardnotes/auth-server",
|
||||
"version": "1.93.11",
|
||||
"version": "1.95.3",
|
||||
"engines": {
|
||||
"node": ">=18.0.0 <19.0.0"
|
||||
},
|
||||
@@ -36,7 +36,7 @@
|
||||
"@aws-sdk/client-sqs": "^3.259.0",
|
||||
"@cbor-extract/cbor-extract-linux-arm64": "^2.1.1",
|
||||
"@cbor-extract/cbor-extract-linux-x64": "^2.1.1",
|
||||
"@newrelic/winston-enricher": "^4.0.0",
|
||||
"@newrelic/winston-enricher": "^4.0.1",
|
||||
"@sentry/node": "^7.28.1",
|
||||
"@sentry/tracing": "^7.28.1",
|
||||
"@simplewebauthn/server": "^7.0.1",
|
||||
@@ -46,7 +46,7 @@
|
||||
"@standardnotes/domain-core": "workspace:^",
|
||||
"@standardnotes/domain-events": "workspace:*",
|
||||
"@standardnotes/domain-events-infra": "workspace:*",
|
||||
"@standardnotes/features": "^1.58.9",
|
||||
"@standardnotes/features": "^1.58.12",
|
||||
"@standardnotes/predicates": "workspace:*",
|
||||
"@standardnotes/responses": "^1.13.9",
|
||||
"@standardnotes/security": "workspace:*",
|
||||
@@ -64,7 +64,7 @@
|
||||
"inversify-express-utils": "^6.4.3",
|
||||
"ioredis": "^5.2.4",
|
||||
"mysql2": "^3.0.1",
|
||||
"newrelic": "^9.11.0",
|
||||
"newrelic": "^10.0.0",
|
||||
"otplib": "12.0.1",
|
||||
"prettyjson": "^1.2.5",
|
||||
"reflect-metadata": "0.1.13",
|
||||
@@ -79,7 +79,7 @@
|
||||
"@types/express": "^4.17.14",
|
||||
"@types/ioredis": "^5.0.0",
|
||||
"@types/jest": "^29.1.1",
|
||||
"@types/newrelic": "^9.4.0",
|
||||
"@types/newrelic": "^9.13.0",
|
||||
"@types/otplib": "^10.0.0",
|
||||
"@types/prettyjson": "^0.0.30",
|
||||
"@types/ua-parser-js": "^0.7.36",
|
||||
|
||||
@@ -452,7 +452,7 @@ export class ContainerConfigLoader {
|
||||
.toConstantValue(env.get('U2F_RELYING_PARTY_NAME', true) ?? 'Standard Notes')
|
||||
container
|
||||
.bind(TYPES.U2F_RELYING_PARTY_ID)
|
||||
.toConstantValue(env.get('U2F_RELYING_PARTY_ID', true) ?? 'standardnotes.com')
|
||||
.toConstantValue(env.get('U2F_RELYING_PARTY_ID', true) ?? 'app.standardnotes.com')
|
||||
container
|
||||
.bind(TYPES.U2F_EXPECTED_ORIGIN)
|
||||
.toConstantValue(
|
||||
@@ -563,6 +563,8 @@ export class ContainerConfigLoader {
|
||||
container.get(TYPES.AuthenticatorChallengeRepository),
|
||||
container.get(TYPES.U2F_RELYING_PARTY_NAME),
|
||||
container.get(TYPES.U2F_RELYING_PARTY_ID),
|
||||
container.get(TYPES.UserRepository),
|
||||
container.get(TYPES.FeatureService),
|
||||
),
|
||||
)
|
||||
container
|
||||
@@ -574,6 +576,8 @@ export class ContainerConfigLoader {
|
||||
container.get(TYPES.U2F_RELYING_PARTY_ID),
|
||||
container.get(TYPES.U2F_EXPECTED_ORIGIN),
|
||||
container.get(TYPES.U2F_REQUIRE_USER_VERIFICATION),
|
||||
container.get(TYPES.UserRepository),
|
||||
container.get(TYPES.FeatureService),
|
||||
),
|
||||
)
|
||||
container
|
||||
@@ -599,10 +603,22 @@ export class ContainerConfigLoader {
|
||||
)
|
||||
container
|
||||
.bind<ListAuthenticators>(TYPES.ListAuthenticators)
|
||||
.toConstantValue(new ListAuthenticators(container.get(TYPES.AuthenticatorRepository)))
|
||||
.toConstantValue(
|
||||
new ListAuthenticators(
|
||||
container.get(TYPES.AuthenticatorRepository),
|
||||
container.get(TYPES.UserRepository),
|
||||
container.get(TYPES.FeatureService),
|
||||
),
|
||||
)
|
||||
container
|
||||
.bind<DeleteAuthenticator>(TYPES.DeleteAuthenticator)
|
||||
.toConstantValue(new DeleteAuthenticator(container.get(TYPES.AuthenticatorRepository)))
|
||||
.toConstantValue(
|
||||
new DeleteAuthenticator(
|
||||
container.get(TYPES.AuthenticatorRepository),
|
||||
container.get(TYPES.UserRepository),
|
||||
container.get(TYPES.FeatureService),
|
||||
),
|
||||
)
|
||||
container
|
||||
.bind<GenerateRecoveryCodes>(TYPES.GenerateRecoveryCodes)
|
||||
.toConstantValue(
|
||||
|
||||
@@ -12,6 +12,7 @@ import { UserSubscription } from '../Domain/Subscription/UserSubscription'
|
||||
import { User } from '../Domain/User/User'
|
||||
import { TypeORMAuthenticator } from '../Infra/TypeORM/TypeORMAuthenticator'
|
||||
import { TypeORMAuthenticatorChallenge } from '../Infra/TypeORM/TypeORMAuthenticatorChallenge'
|
||||
import { TypeORMEmergencyAccessInvitation } from '../Infra/TypeORM/TypeORMEmergencyAccessInvitation'
|
||||
import { TypeORMSessionTrace } from '../Infra/TypeORM/TypeORMSessionTrace'
|
||||
import { Env } from './Env'
|
||||
|
||||
@@ -72,6 +73,7 @@ export const AppDataSource = new DataSource({
|
||||
TypeORMSessionTrace,
|
||||
TypeORMAuthenticator,
|
||||
TypeORMAuthenticatorChallenge,
|
||||
TypeORMEmergencyAccessInvitation,
|
||||
],
|
||||
migrations: [env.get('DB_MIGRATIONS_PATH', true) ?? 'dist/migrations/*.js'],
|
||||
migrationsRun: true,
|
||||
|
||||
@@ -34,6 +34,17 @@ export class AuthenticatorsController {
|
||||
userUuid: params.userUuid,
|
||||
})
|
||||
|
||||
if (result.isFailed()) {
|
||||
return {
|
||||
status: HttpStatusCode.Unauthorized,
|
||||
data: {
|
||||
error: {
|
||||
message: result.getError(),
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
status: HttpStatusCode.Success,
|
||||
data: {
|
||||
@@ -50,6 +61,17 @@ export class AuthenticatorsController {
|
||||
authenticatorId: params.authenticatorId,
|
||||
})
|
||||
|
||||
if (result.isFailed()) {
|
||||
return {
|
||||
status: HttpStatusCode.Unauthorized,
|
||||
data: {
|
||||
error: {
|
||||
message: result.getError(),
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
status: HttpStatusCode.Success,
|
||||
data: {
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
import { Entity, Result, UniqueEntityId } from '@standardnotes/domain-core'
|
||||
|
||||
import { EmergencyAccessInvitationProps } from './EmergencyAccessInvitationProps'
|
||||
|
||||
export class EmergencyAccessInvitation extends Entity<EmergencyAccessInvitationProps> {
|
||||
get id(): UniqueEntityId {
|
||||
return this._id
|
||||
}
|
||||
|
||||
private constructor(props: EmergencyAccessInvitationProps, id?: UniqueEntityId) {
|
||||
super(props, id)
|
||||
}
|
||||
|
||||
static create(props: EmergencyAccessInvitationProps, id?: UniqueEntityId): Result<EmergencyAccessInvitation> {
|
||||
return Result.ok<EmergencyAccessInvitation>(new EmergencyAccessInvitation(props, id))
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
import { Dates, Uuid } from '@standardnotes/domain-core'
|
||||
|
||||
import { EmergencyAccessInvitationStatus } from './EmergencyAccessInvitationStatus'
|
||||
|
||||
export interface EmergencyAccessInvitationProps {
|
||||
grantorUuid: Uuid
|
||||
granteeUuid: Uuid
|
||||
status: EmergencyAccessInvitationStatus
|
||||
expiresAt: Date
|
||||
dates: Dates
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
import { Result, ValueObject } from '@standardnotes/domain-core'
|
||||
|
||||
import { EmergencyAccessInvitationStatusProps } from './EmergencyAccessInvitationStatusProps'
|
||||
|
||||
export class EmergencyAccessInvitationStatus extends ValueObject<EmergencyAccessInvitationStatusProps> {
|
||||
static readonly NAMES = {
|
||||
Sent: 'sent',
|
||||
Accepted: 'accepted',
|
||||
Confirmed: 'confirmed',
|
||||
Expired: 'expired',
|
||||
Revoked: 'revoked',
|
||||
}
|
||||
|
||||
get value(): string {
|
||||
return this.props.value
|
||||
}
|
||||
|
||||
private constructor(props: EmergencyAccessInvitationStatusProps) {
|
||||
super(props)
|
||||
}
|
||||
|
||||
static create(name: string): Result<EmergencyAccessInvitationStatus> {
|
||||
const isValidName = Object.values(this.NAMES).includes(name)
|
||||
if (!isValidName) {
|
||||
return Result.fail<EmergencyAccessInvitationStatus>(`Invalid status name: ${name}`)
|
||||
} else {
|
||||
return Result.ok<EmergencyAccessInvitationStatus>(new EmergencyAccessInvitationStatus({ value: name }))
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
export interface EmergencyAccessInvitationStatusProps {
|
||||
value: string
|
||||
}
|
||||
@@ -30,7 +30,7 @@ jest.mock('@standardnotes/features', () => {
|
||||
const { GetFeatures } = jest.requireMock('@standardnotes/features')
|
||||
|
||||
import { FeatureService } from './FeatureService'
|
||||
import { Permission, PermissionName } from '@standardnotes/features'
|
||||
import { FeatureIdentifier, Permission, PermissionName } from '@standardnotes/features'
|
||||
import { OfflineUserSubscriptionRepositoryInterface } from '../Subscription/OfflineUserSubscriptionRepositoryInterface'
|
||||
import { TimerInterface } from '@standardnotes/time'
|
||||
import { OfflineUserSubscription } from '../Subscription/OfflineUserSubscription'
|
||||
@@ -201,6 +201,62 @@ describe('FeatureService', () => {
|
||||
})
|
||||
|
||||
describe('online subscribers', () => {
|
||||
it('should tell if a user is entitled to a feature', async () => {
|
||||
expect(await createService().userIsEntitledToFeature(user, FeatureIdentifier.AutobiographyTheme)).toBe(true)
|
||||
expect(await createService().userIsEntitledToFeature(user, FeatureIdentifier.DeprecatedBoldEditor)).toBe(false)
|
||||
})
|
||||
|
||||
it('should tell if a user is not entitled to a feature because it is expired', async () => {
|
||||
timer.getTimestampInMicroseconds = jest.fn().mockReturnValue(777)
|
||||
expect(await createService().userIsEntitledToFeature(user, FeatureIdentifier.AutobiographyTheme)).toBe(false)
|
||||
})
|
||||
|
||||
it('should tell if a user is entitled to a feature that does not expire', async () => {
|
||||
const nonSubscriptionPermission = {
|
||||
uuid: 'files-beta-permission-1-1-1',
|
||||
name: 'files-beta' as PermissionName,
|
||||
} as jest.Mocked<Permission>
|
||||
|
||||
GetFeatures.mockImplementation(() => [
|
||||
{
|
||||
identifier: 'org.standardnotes.theme-autobiography',
|
||||
permission_name: PermissionName.AutobiographyTheme,
|
||||
expires_at: 555,
|
||||
},
|
||||
{
|
||||
identifier: 'org.standardnotes.bold-editor',
|
||||
permission_name: PermissionName.BoldEditor,
|
||||
expires_at: 777,
|
||||
},
|
||||
{
|
||||
identifier: 'files-beta',
|
||||
permission_name: 'files-beta' as PermissionName,
|
||||
expires_at: undefined,
|
||||
no_expire: true,
|
||||
},
|
||||
])
|
||||
|
||||
const nonSubscriptionRole = {
|
||||
name: RoleName.NAMES.InternalTeamUser,
|
||||
uuid: 'role-files-beta',
|
||||
permissions: Promise.resolve([nonSubscriptionPermission]),
|
||||
} as jest.Mocked<Role>
|
||||
|
||||
roleToSubscriptionMap.filterNonSubscriptionRoles = jest.fn().mockReturnValue([nonSubscriptionRole])
|
||||
roleToSubscriptionMap.getSubscriptionNameForRoleName = jest
|
||||
.fn()
|
||||
.mockReturnValueOnce(SubscriptionName.PlusPlan)
|
||||
.mockReturnValueOnce(SubscriptionName.ProPlan)
|
||||
|
||||
user = {
|
||||
uuid: 'user-1-1-1',
|
||||
roles: Promise.resolve([role1, role2, nonSubscriptionRole]),
|
||||
subscriptions: Promise.resolve([subscription1, subscription2]),
|
||||
} as jest.Mocked<User>
|
||||
|
||||
expect(await createService().userIsEntitledToFeature(user, 'files-beta')).toBe(true)
|
||||
})
|
||||
|
||||
it('should return user features with `expires_at` field', async () => {
|
||||
const features = await createService().getFeaturesForUser(user)
|
||||
expect(features).toEqual(
|
||||
@@ -321,7 +377,7 @@ describe('FeatureService', () => {
|
||||
it('should return user features along with features related to non subscription roles', async () => {
|
||||
const nonSubscriptionPermission = {
|
||||
uuid: 'files-beta-permission-1-1-1',
|
||||
name: PermissionName.FilesBeta,
|
||||
name: 'files-beta' as PermissionName,
|
||||
} as jest.Mocked<Permission>
|
||||
|
||||
GetFeatures.mockImplementation(() => [
|
||||
@@ -336,7 +392,8 @@ describe('FeatureService', () => {
|
||||
expires_at: 777,
|
||||
},
|
||||
{
|
||||
permission_name: PermissionName.FilesBeta,
|
||||
identifier: 'files-beta',
|
||||
permission_name: 'files-beta' as PermissionName,
|
||||
expires_at: undefined,
|
||||
no_expire: true,
|
||||
},
|
||||
|
||||
@@ -21,6 +21,25 @@ export class FeatureService implements FeatureServiceInterface {
|
||||
@inject(TYPES.Timer) private timer: TimerInterface,
|
||||
) {}
|
||||
|
||||
async userIsEntitledToFeature(user: User, featureIdentifier: string): Promise<boolean> {
|
||||
const userFeatures = await this.getFeaturesForUser(user)
|
||||
|
||||
const feature = userFeatures.find((userFeature) => userFeature.identifier === featureIdentifier)
|
||||
|
||||
if (feature === undefined) {
|
||||
return false
|
||||
}
|
||||
|
||||
if (feature.no_expire) {
|
||||
return true
|
||||
}
|
||||
|
||||
const featureIsExpired =
|
||||
feature.expires_at !== undefined && feature.expires_at < this.timer.getTimestampInMicroseconds()
|
||||
|
||||
return !featureIsExpired
|
||||
}
|
||||
|
||||
async getFeaturesForOfflineUser(email: string): Promise<{ features: FeatureDescription[]; roles: string[] }> {
|
||||
const userSubscriptions = await this.offlineUserSubscriptionRepository.findByEmail(
|
||||
email,
|
||||
|
||||
@@ -4,5 +4,6 @@ import { User } from '../User/User'
|
||||
|
||||
export interface FeatureServiceInterface {
|
||||
getFeaturesForUser(user: User): Promise<Array<FeatureDescription>>
|
||||
userIsEntitledToFeature(user: User, featureIdentifier: string): Promise<boolean>
|
||||
getFeaturesForOfflineUser(email: string): Promise<{ features: FeatureDescription[]; roles: string[] }>
|
||||
}
|
||||
|
||||
@@ -2,12 +2,18 @@ import { Dates, Uuid } from '@standardnotes/domain-core'
|
||||
|
||||
import { Authenticator } from '../../Authenticator/Authenticator'
|
||||
import { AuthenticatorRepositoryInterface } from '../../Authenticator/AuthenticatorRepositoryInterface'
|
||||
import { FeatureServiceInterface } from '../../Feature/FeatureServiceInterface'
|
||||
import { User } from '../../User/User'
|
||||
import { UserRepositoryInterface } from '../../User/UserRepositoryInterface'
|
||||
import { DeleteAuthenticator } from './DeleteAuthenticator'
|
||||
|
||||
describe('DeleteAuthenticator', () => {
|
||||
let authenticatorRepository: AuthenticatorRepositoryInterface
|
||||
let authenticator: Authenticator
|
||||
const createUseCase = () => new DeleteAuthenticator(authenticatorRepository)
|
||||
let userRepository: UserRepositoryInterface
|
||||
let featureService: FeatureServiceInterface
|
||||
|
||||
const createUseCase = () => new DeleteAuthenticator(authenticatorRepository, userRepository, featureService)
|
||||
|
||||
beforeEach(() => {
|
||||
authenticator = Authenticator.create({
|
||||
@@ -24,6 +30,12 @@ describe('DeleteAuthenticator', () => {
|
||||
authenticatorRepository = {} as jest.Mocked<AuthenticatorRepositoryInterface>
|
||||
authenticatorRepository.findById = jest.fn().mockReturnValue(authenticator)
|
||||
authenticatorRepository.remove = jest.fn()
|
||||
|
||||
userRepository = {} as jest.Mocked<UserRepositoryInterface>
|
||||
userRepository.findOneByUuid = jest.fn().mockReturnValue({} as jest.Mocked<User>)
|
||||
|
||||
featureService = {} as jest.Mocked<FeatureServiceInterface>
|
||||
featureService.userIsEntitledToFeature = jest.fn().mockReturnValue(true)
|
||||
})
|
||||
|
||||
it('should return error if authenticator not found', async () => {
|
||||
@@ -38,6 +50,40 @@ describe('DeleteAuthenticator', () => {
|
||||
expect(result.getError()).toEqual('Authenticator not found')
|
||||
})
|
||||
|
||||
it('should return error if user is not found', async () => {
|
||||
userRepository.findOneByUuid = jest.fn().mockReturnValue(null)
|
||||
|
||||
const result = await createUseCase().execute({
|
||||
userUuid: '00000000-0000-0000-0000-000000000000',
|
||||
authenticatorId: '00000000-0000-0000-0000-000000000000',
|
||||
})
|
||||
|
||||
expect(result.isFailed()).toBe(true)
|
||||
expect(result.getError()).toEqual('Could not delete authenticator: user not found.')
|
||||
})
|
||||
|
||||
it('should return error if user is not entitled to U2F', async () => {
|
||||
featureService.userIsEntitledToFeature = jest.fn().mockReturnValue(false)
|
||||
|
||||
const result = await createUseCase().execute({
|
||||
userUuid: '00000000-0000-0000-0000-000000000000',
|
||||
authenticatorId: '00000000-0000-0000-0000-000000000000',
|
||||
})
|
||||
|
||||
expect(result.isFailed()).toBe(true)
|
||||
expect(result.getError()).toEqual('Could not delete authenticator: user is not entitled to U2F.')
|
||||
})
|
||||
|
||||
it('should return error if user uuid is not valid', async () => {
|
||||
const result = await createUseCase().execute({
|
||||
userUuid: 'invalid',
|
||||
authenticatorId: '00000000-0000-0000-0000-000000000000',
|
||||
})
|
||||
|
||||
expect(result.isFailed()).toBe(true)
|
||||
expect(result.getError()).toEqual('Could not delete authenticator: Given value is not a valid uuid: invalid')
|
||||
})
|
||||
|
||||
it('should return error if authenticator does not belong to user', async () => {
|
||||
authenticatorRepository.findById = jest.fn().mockReturnValue({
|
||||
...authenticator,
|
||||
|
||||
@@ -1,12 +1,41 @@
|
||||
import { Result, UniqueEntityId, UseCaseInterface } from '@standardnotes/domain-core'
|
||||
import { Result, UniqueEntityId, UseCaseInterface, Uuid } from '@standardnotes/domain-core'
|
||||
import { FeatureIdentifier } from '@standardnotes/features'
|
||||
|
||||
import { AuthenticatorRepositoryInterface } from '../../Authenticator/AuthenticatorRepositoryInterface'
|
||||
import { FeatureServiceInterface } from '../../Feature/FeatureServiceInterface'
|
||||
import { UserRepositoryInterface } from '../../User/UserRepositoryInterface'
|
||||
import { DeleteAuthenticatorDTO } from './DeleteAuthenticatorDTO'
|
||||
|
||||
export class DeleteAuthenticator implements UseCaseInterface<string> {
|
||||
constructor(private authenticatorRepository: AuthenticatorRepositoryInterface) {}
|
||||
constructor(
|
||||
private authenticatorRepository: AuthenticatorRepositoryInterface,
|
||||
private userRepository: UserRepositoryInterface,
|
||||
private featureService: FeatureServiceInterface,
|
||||
) {}
|
||||
|
||||
async execute(dto: DeleteAuthenticatorDTO): Promise<Result<string>> {
|
||||
const userUuidOrError = Uuid.create(dto.userUuid)
|
||||
if (userUuidOrError.isFailed()) {
|
||||
return Result.fail(`Could not delete authenticator: ${userUuidOrError.getError()}`)
|
||||
}
|
||||
const userUuid = userUuidOrError.getValue()
|
||||
|
||||
const user = await this.userRepository.findOneByUuid(userUuid.value)
|
||||
if (user === null) {
|
||||
return Result.fail('Could not delete authenticator: user not found.')
|
||||
}
|
||||
|
||||
const userIsEntitledToU2F = await this.featureService.userIsEntitledToFeature(
|
||||
user,
|
||||
FeatureIdentifier.UniversalSecondFactor,
|
||||
)
|
||||
|
||||
if (!userIsEntitledToU2F) {
|
||||
return Result.fail('Could not delete authenticator: user is not entitled to U2F.')
|
||||
}
|
||||
|
||||
const authenticator = await this.authenticatorRepository.findById(new UniqueEntityId(dto.authenticatorId))
|
||||
if (!authenticator || authenticator.props.userUuid.value !== dto.userUuid) {
|
||||
if (!authenticator || authenticator.props.userUuid.value !== userUuid.value) {
|
||||
return Result.fail('Authenticator not found')
|
||||
}
|
||||
|
||||
|
||||
@@ -4,11 +4,16 @@ import { Authenticator } from '../../Authenticator/Authenticator'
|
||||
import { AuthenticatorChallenge } from '../../Authenticator/AuthenticatorChallenge'
|
||||
import { AuthenticatorChallengeRepositoryInterface } from '../../Authenticator/AuthenticatorChallengeRepositoryInterface'
|
||||
import { AuthenticatorRepositoryInterface } from '../../Authenticator/AuthenticatorRepositoryInterface'
|
||||
import { FeatureServiceInterface } from '../../Feature/FeatureServiceInterface'
|
||||
import { User } from '../../User/User'
|
||||
import { UserRepositoryInterface } from '../../User/UserRepositoryInterface'
|
||||
import { GenerateAuthenticatorRegistrationOptions } from './GenerateAuthenticatorRegistrationOptions'
|
||||
|
||||
describe('GenerateAuthenticatorRegistrationOptions', () => {
|
||||
let authenticatorRepository: AuthenticatorRepositoryInterface
|
||||
let authenticatorChallengeRepository: AuthenticatorChallengeRepositoryInterface
|
||||
let userRepository: UserRepositoryInterface
|
||||
let featureService: FeatureServiceInterface
|
||||
|
||||
const createUseCase = () =>
|
||||
new GenerateAuthenticatorRegistrationOptions(
|
||||
@@ -16,6 +21,8 @@ describe('GenerateAuthenticatorRegistrationOptions', () => {
|
||||
authenticatorChallengeRepository,
|
||||
'Standard Notes',
|
||||
'standardnotes.com',
|
||||
userRepository,
|
||||
featureService,
|
||||
)
|
||||
|
||||
beforeEach(() => {
|
||||
@@ -35,6 +42,12 @@ describe('GenerateAuthenticatorRegistrationOptions', () => {
|
||||
|
||||
authenticatorChallengeRepository = {} as jest.Mocked<AuthenticatorChallengeRepositoryInterface>
|
||||
authenticatorChallengeRepository.save = jest.fn()
|
||||
|
||||
userRepository = {} as jest.Mocked<UserRepositoryInterface>
|
||||
userRepository.findOneByUuid = jest.fn().mockReturnValue({} as jest.Mocked<User>)
|
||||
|
||||
featureService = {} as jest.Mocked<FeatureServiceInterface>
|
||||
featureService.userIsEntitledToFeature = jest.fn().mockReturnValue(true)
|
||||
})
|
||||
|
||||
it('should return error if userUuid is invalid', async () => {
|
||||
@@ -63,6 +76,36 @@ describe('GenerateAuthenticatorRegistrationOptions', () => {
|
||||
expect(result.getError()).toBe('Could not generate authenticator registration options: Username cannot be empty')
|
||||
})
|
||||
|
||||
it('should return error if user is not entitled to u2f feature', async () => {
|
||||
featureService.userIsEntitledToFeature = jest.fn().mockReturnValue(false)
|
||||
|
||||
const useCase = createUseCase()
|
||||
|
||||
const result = await useCase.execute({
|
||||
userUuid: '00000000-0000-0000-0000-000000000000',
|
||||
username: 'username',
|
||||
})
|
||||
|
||||
expect(result.isFailed()).toBe(true)
|
||||
expect(result.getError()).toBe(
|
||||
'Could not generate authenticator registration options: user is not entitled to U2F.',
|
||||
)
|
||||
})
|
||||
|
||||
it('should return error if user is not found', async () => {
|
||||
userRepository.findOneByUuid = jest.fn().mockReturnValue(null)
|
||||
|
||||
const useCase = createUseCase()
|
||||
|
||||
const result = await useCase.execute({
|
||||
userUuid: '00000000-0000-0000-0000-000000000000',
|
||||
username: 'username',
|
||||
})
|
||||
|
||||
expect(result.isFailed()).toBe(true)
|
||||
expect(result.getError()).toBe('Could not generate authenticator registration options: user not found.')
|
||||
})
|
||||
|
||||
it('should return error if authenticator challenge is invalid', async () => {
|
||||
const mock = jest.spyOn(AuthenticatorChallenge, 'create')
|
||||
mock.mockReturnValue(Result.fail('Oops'))
|
||||
|
||||
@@ -5,6 +5,9 @@ import { GenerateAuthenticatorRegistrationOptionsDTO } from './GenerateAuthentic
|
||||
import { AuthenticatorRepositoryInterface } from '../../Authenticator/AuthenticatorRepositoryInterface'
|
||||
import { AuthenticatorChallengeRepositoryInterface } from '../../Authenticator/AuthenticatorChallengeRepositoryInterface'
|
||||
import { AuthenticatorChallenge } from '../../Authenticator/AuthenticatorChallenge'
|
||||
import { FeatureIdentifier } from '@standardnotes/features'
|
||||
import { FeatureServiceInterface } from '../../Feature/FeatureServiceInterface'
|
||||
import { UserRepositoryInterface } from '../../User/UserRepositoryInterface'
|
||||
|
||||
export class GenerateAuthenticatorRegistrationOptions implements UseCaseInterface<Record<string, unknown>> {
|
||||
constructor(
|
||||
@@ -12,6 +15,8 @@ export class GenerateAuthenticatorRegistrationOptions implements UseCaseInterfac
|
||||
private authenticatorChallengeRepository: AuthenticatorChallengeRepositoryInterface,
|
||||
private relyingPartyName: string,
|
||||
private relyingPartyId: string,
|
||||
private userRepository: UserRepositoryInterface,
|
||||
private featureService: FeatureServiceInterface,
|
||||
) {}
|
||||
|
||||
async execute(dto: GenerateAuthenticatorRegistrationOptionsDTO): Promise<Result<Record<string, unknown>>> {
|
||||
@@ -27,6 +32,20 @@ export class GenerateAuthenticatorRegistrationOptions implements UseCaseInterfac
|
||||
}
|
||||
const username = usernameOrError.getValue()
|
||||
|
||||
const user = await this.userRepository.findOneByUuid(userUuid.value)
|
||||
if (user === null) {
|
||||
return Result.fail('Could not generate authenticator registration options: user not found.')
|
||||
}
|
||||
|
||||
const userIsEntitledToU2F = await this.featureService.userIsEntitledToFeature(
|
||||
user,
|
||||
FeatureIdentifier.UniversalSecondFactor,
|
||||
)
|
||||
|
||||
if (!userIsEntitledToU2F) {
|
||||
return Result.fail('Could not generate authenticator registration options: user is not entitled to U2F.')
|
||||
}
|
||||
|
||||
const authenticators = await this.authenticatorRepository.findByUserUuid(userUuid)
|
||||
const options = generateRegistrationOptions({
|
||||
rpID: this.relyingPartyId,
|
||||
|
||||
@@ -1,14 +1,25 @@
|
||||
import { AuthenticatorRepositoryInterface } from '../../Authenticator/AuthenticatorRepositoryInterface'
|
||||
import { FeatureServiceInterface } from '../../Feature/FeatureServiceInterface'
|
||||
import { User } from '../../User/User'
|
||||
import { UserRepositoryInterface } from '../../User/UserRepositoryInterface'
|
||||
import { ListAuthenticators } from './ListAuthenticators'
|
||||
|
||||
describe('ListAuthenticators', () => {
|
||||
let authenticatorRepository: AuthenticatorRepositoryInterface
|
||||
let userRepository: UserRepositoryInterface
|
||||
let featureService: FeatureServiceInterface
|
||||
|
||||
const createUseCase = () => new ListAuthenticators(authenticatorRepository)
|
||||
const createUseCase = () => new ListAuthenticators(authenticatorRepository, userRepository, featureService)
|
||||
|
||||
beforeEach(() => {
|
||||
authenticatorRepository = {} as jest.Mocked<AuthenticatorRepositoryInterface>
|
||||
authenticatorRepository.findByUserUuid = jest.fn().mockReturnValue([])
|
||||
|
||||
userRepository = {} as jest.Mocked<UserRepositoryInterface>
|
||||
userRepository.findOneByUuid = jest.fn().mockReturnValue({} as jest.Mocked<User>)
|
||||
|
||||
featureService = {} as jest.Mocked<FeatureServiceInterface>
|
||||
featureService.userIsEntitledToFeature = jest.fn().mockReturnValue(true)
|
||||
})
|
||||
|
||||
it('should list authenticators', async () => {
|
||||
@@ -27,4 +38,24 @@ describe('ListAuthenticators', () => {
|
||||
|
||||
expect(result.isFailed()).toBeTruthy()
|
||||
})
|
||||
|
||||
it('should fail if user is not found', async () => {
|
||||
userRepository.findOneByUuid = jest.fn().mockReturnValue(null)
|
||||
|
||||
const useCase = createUseCase()
|
||||
|
||||
const result = await useCase.execute({ userUuid: '00000000-0000-0000-0000-000000000000' })
|
||||
|
||||
expect(result.isFailed()).toBeTruthy()
|
||||
})
|
||||
|
||||
it('should fail if user is not entitled to U2F', async () => {
|
||||
featureService.userIsEntitledToFeature = jest.fn().mockReturnValue(false)
|
||||
|
||||
const useCase = createUseCase()
|
||||
|
||||
const result = await useCase.execute({ userUuid: '00000000-0000-0000-0000-000000000000' })
|
||||
|
||||
expect(result.isFailed()).toBeTruthy()
|
||||
})
|
||||
})
|
||||
|
||||
@@ -1,11 +1,19 @@
|
||||
import { Result, UseCaseInterface, Uuid } from '@standardnotes/domain-core'
|
||||
import { FeatureIdentifier } from '@standardnotes/features'
|
||||
|
||||
import { Authenticator } from '../../Authenticator/Authenticator'
|
||||
import { AuthenticatorRepositoryInterface } from '../../Authenticator/AuthenticatorRepositoryInterface'
|
||||
import { FeatureServiceInterface } from '../../Feature/FeatureServiceInterface'
|
||||
import { UserRepositoryInterface } from '../../User/UserRepositoryInterface'
|
||||
import { ListAuthenticatorsDTO } from './ListAuthenticatorsDTO'
|
||||
|
||||
export class ListAuthenticators implements UseCaseInterface<Authenticator[]> {
|
||||
constructor(private authenticatorRepository: AuthenticatorRepositoryInterface) {}
|
||||
constructor(
|
||||
private authenticatorRepository: AuthenticatorRepositoryInterface,
|
||||
private userRepository: UserRepositoryInterface,
|
||||
private featureService: FeatureServiceInterface,
|
||||
) {}
|
||||
|
||||
async execute(dto: ListAuthenticatorsDTO): Promise<Result<Authenticator[]>> {
|
||||
const userUuidOrError = Uuid.create(dto.userUuid)
|
||||
if (userUuidOrError.isFailed()) {
|
||||
@@ -13,6 +21,20 @@ export class ListAuthenticators implements UseCaseInterface<Authenticator[]> {
|
||||
}
|
||||
const userUuid = userUuidOrError.getValue()
|
||||
|
||||
const user = await this.userRepository.findOneByUuid(userUuid.value)
|
||||
if (user === null) {
|
||||
return Result.fail('Could not list authenticators: user not found.')
|
||||
}
|
||||
|
||||
const userIsEntitledToU2F = await this.featureService.userIsEntitledToFeature(
|
||||
user,
|
||||
FeatureIdentifier.UniversalSecondFactor,
|
||||
)
|
||||
|
||||
if (!userIsEntitledToU2F) {
|
||||
return Result.fail('Could not list authenticators: user is not entitled to U2F.')
|
||||
}
|
||||
|
||||
const authenticators = await this.authenticatorRepository.findByUserUuid(userUuid)
|
||||
|
||||
return Result.ok(authenticators)
|
||||
|
||||
@@ -168,7 +168,7 @@ describe('UpdateSetting', () => {
|
||||
error: {
|
||||
message: 'User 1-2-3 has no subscription to change a subscription setting.',
|
||||
},
|
||||
statusCode: 401,
|
||||
statusCode: 400,
|
||||
})
|
||||
})
|
||||
|
||||
|
||||
@@ -83,7 +83,7 @@ export class UpdateSetting implements UseCaseInterface {
|
||||
error: {
|
||||
message: `User ${userUuid} has no subscription to change a subscription setting.`,
|
||||
},
|
||||
statusCode: 401,
|
||||
statusCode: 400,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -7,11 +7,16 @@ import { Authenticator } from '../../Authenticator/Authenticator'
|
||||
import { AuthenticatorChallenge } from '../../Authenticator/AuthenticatorChallenge'
|
||||
import { AuthenticatorChallengeRepositoryInterface } from '../../Authenticator/AuthenticatorChallengeRepositoryInterface'
|
||||
import { AuthenticatorRepositoryInterface } from '../../Authenticator/AuthenticatorRepositoryInterface'
|
||||
import { FeatureServiceInterface } from '../../Feature/FeatureServiceInterface'
|
||||
import { User } from '../../User/User'
|
||||
import { UserRepositoryInterface } from '../../User/UserRepositoryInterface'
|
||||
import { VerifyAuthenticatorRegistrationResponse } from './VerifyAuthenticatorRegistrationResponse'
|
||||
|
||||
describe('VerifyAuthenticatorRegistrationResponse', () => {
|
||||
let authenticatorRepository: AuthenticatorRepositoryInterface
|
||||
let authenticatorChallengeRepository: AuthenticatorChallengeRepositoryInterface
|
||||
let userRepository: UserRepositoryInterface
|
||||
let featureService: FeatureServiceInterface
|
||||
|
||||
const createUseCase = () =>
|
||||
new VerifyAuthenticatorRegistrationResponse(
|
||||
@@ -20,6 +25,8 @@ describe('VerifyAuthenticatorRegistrationResponse', () => {
|
||||
'standardnotes.com',
|
||||
['localhost', 'https://app.standardnotes.com'],
|
||||
true,
|
||||
userRepository,
|
||||
featureService,
|
||||
)
|
||||
|
||||
beforeEach(() => {
|
||||
@@ -32,6 +39,12 @@ describe('VerifyAuthenticatorRegistrationResponse', () => {
|
||||
challenge: Buffer.from('challenge'),
|
||||
},
|
||||
} as jest.Mocked<AuthenticatorChallenge>)
|
||||
|
||||
userRepository = {} as jest.Mocked<UserRepositoryInterface>
|
||||
userRepository.findOneByUuid = jest.fn().mockReturnValue({} as jest.Mocked<User>)
|
||||
|
||||
featureService = {} as jest.Mocked<FeatureServiceInterface>
|
||||
featureService.userIsEntitledToFeature = jest.fn().mockReturnValue(true)
|
||||
})
|
||||
|
||||
it('should return error if user uuid is invalid', async () => {
|
||||
@@ -57,6 +70,54 @@ describe('VerifyAuthenticatorRegistrationResponse', () => {
|
||||
)
|
||||
})
|
||||
|
||||
it('should return error if user is not entitled to feature', async () => {
|
||||
featureService.userIsEntitledToFeature = jest.fn().mockReturnValue(false)
|
||||
|
||||
const useCase = createUseCase()
|
||||
|
||||
const result = await useCase.execute({
|
||||
userUuid: '00000000-0000-0000-0000-000000000000',
|
||||
attestationResponse: {
|
||||
id: 'id',
|
||||
rawId: 'rawId',
|
||||
response: {
|
||||
attestationObject: 'attestationObject',
|
||||
clientDataJSON: 'clientDataJSON',
|
||||
},
|
||||
type: 'public-key',
|
||||
clientExtensionResults: {},
|
||||
} as jest.Mocked<RegistrationResponseJSON>,
|
||||
})
|
||||
|
||||
expect(result.isFailed()).toBeTruthy()
|
||||
expect(result.getError()).toEqual(
|
||||
'Could not verify authenticator registration response: user is not entitled to U2F.',
|
||||
)
|
||||
})
|
||||
|
||||
it('should return error if user is not found', async () => {
|
||||
userRepository.findOneByUuid = jest.fn().mockReturnValue(null)
|
||||
|
||||
const useCase = createUseCase()
|
||||
|
||||
const result = await useCase.execute({
|
||||
userUuid: '00000000-0000-0000-0000-000000000000',
|
||||
attestationResponse: {
|
||||
id: 'id',
|
||||
rawId: 'rawId',
|
||||
response: {
|
||||
attestationObject: 'attestationObject',
|
||||
clientDataJSON: 'clientDataJSON',
|
||||
},
|
||||
type: 'public-key',
|
||||
clientExtensionResults: {},
|
||||
} as jest.Mocked<RegistrationResponseJSON>,
|
||||
})
|
||||
|
||||
expect(result.isFailed()).toBeTruthy()
|
||||
expect(result.getError()).toEqual('Could not verify authenticator registration response: user not found.')
|
||||
})
|
||||
|
||||
it('should return error if challenge is not found', async () => {
|
||||
authenticatorChallengeRepository.findByUserUuid = jest.fn().mockReturnValue(null)
|
||||
|
||||
|
||||
@@ -1,10 +1,13 @@
|
||||
import { Dates, Result, UniqueEntityId, UseCaseInterface, Uuid } from '@standardnotes/domain-core'
|
||||
import { VerifiedRegistrationResponse, verifyRegistrationResponse } from '@simplewebauthn/server'
|
||||
import { FeatureIdentifier } from '@standardnotes/features'
|
||||
|
||||
import { AuthenticatorChallengeRepositoryInterface } from '../../Authenticator/AuthenticatorChallengeRepositoryInterface'
|
||||
import { AuthenticatorRepositoryInterface } from '../../Authenticator/AuthenticatorRepositoryInterface'
|
||||
import { Authenticator } from '../../Authenticator/Authenticator'
|
||||
import { VerifyAuthenticatorRegistrationResponseDTO } from './VerifyAuthenticatorRegistrationResponseDTO'
|
||||
import { FeatureServiceInterface } from '../../Feature/FeatureServiceInterface'
|
||||
import { UserRepositoryInterface } from '../../User/UserRepositoryInterface'
|
||||
|
||||
export class VerifyAuthenticatorRegistrationResponse implements UseCaseInterface<UniqueEntityId> {
|
||||
constructor(
|
||||
@@ -13,6 +16,8 @@ export class VerifyAuthenticatorRegistrationResponse implements UseCaseInterface
|
||||
private relyingPartyId: string,
|
||||
private expectedOrigin: string[],
|
||||
private requireUserVerification: boolean,
|
||||
private userRepository: UserRepositoryInterface,
|
||||
private featureService: FeatureServiceInterface,
|
||||
) {}
|
||||
|
||||
async execute(dto: VerifyAuthenticatorRegistrationResponseDTO): Promise<Result<UniqueEntityId>> {
|
||||
@@ -22,6 +27,20 @@ export class VerifyAuthenticatorRegistrationResponse implements UseCaseInterface
|
||||
}
|
||||
const userUuid = userUuidOrError.getValue()
|
||||
|
||||
const user = await this.userRepository.findOneByUuid(userUuid.value)
|
||||
if (user === null) {
|
||||
return Result.fail('Could not verify authenticator registration response: user not found.')
|
||||
}
|
||||
|
||||
const userIsEntitledToU2F = await this.featureService.userIsEntitledToFeature(
|
||||
user,
|
||||
FeatureIdentifier.UniversalSecondFactor,
|
||||
)
|
||||
|
||||
if (!userIsEntitledToU2F) {
|
||||
return Result.fail('Could not verify authenticator registration response: user is not entitled to U2F.')
|
||||
}
|
||||
|
||||
const authenticatorChallenge = await this.authenticatorChallengeRepository.findByUserUuid(userUuid)
|
||||
if (!authenticatorChallenge) {
|
||||
return Result.fail('Could not verify authenticator registration response: challenge not found')
|
||||
|
||||
@@ -4,6 +4,7 @@ import { Role } from '../Role/Role'
|
||||
import { Setting } from '../Setting/Setting'
|
||||
import { UserSubscription } from '../Subscription/UserSubscription'
|
||||
import { ProtocolVersion } from '@standardnotes/common'
|
||||
import { TypeORMEmergencyAccessInvitation } from '../../Infra/TypeORM/TypeORMEmergencyAccessInvitation'
|
||||
|
||||
@Entity({ name: 'users' })
|
||||
export class User {
|
||||
@@ -181,6 +182,22 @@ export class User {
|
||||
)
|
||||
declare subscriptions: Promise<UserSubscription[]>
|
||||
|
||||
@OneToMany(
|
||||
/* istanbul ignore next */
|
||||
() => TypeORMEmergencyAccessInvitation,
|
||||
/* istanbul ignore next */
|
||||
(invitation) => invitation.grantor,
|
||||
)
|
||||
declare emergencyAccessInvitationsCreated: Promise<TypeORMEmergencyAccessInvitation[]>
|
||||
|
||||
@OneToMany(
|
||||
/* istanbul ignore next */
|
||||
() => TypeORMEmergencyAccessInvitation,
|
||||
/* istanbul ignore next */
|
||||
(invitation) => invitation.grantee,
|
||||
)
|
||||
declare emergencyAccessInvitationsReceived: Promise<TypeORMEmergencyAccessInvitation[]>
|
||||
|
||||
supportsSessions(): boolean {
|
||||
return parseInt(this.version) >= parseInt(ProtocolVersion.V004)
|
||||
}
|
||||
|
||||
@@ -0,0 +1,66 @@
|
||||
import { Column, Entity, JoinColumn, ManyToOne, PrimaryGeneratedColumn } from 'typeorm'
|
||||
import { User } from '../../Domain/User/User'
|
||||
|
||||
@Entity({ name: 'emergency_access_invitations' })
|
||||
export class TypeORMEmergencyAccessInvitation {
|
||||
@PrimaryGeneratedColumn('uuid')
|
||||
declare uuid: string
|
||||
|
||||
@Column({
|
||||
name: 'grantor_uuid',
|
||||
length: 36,
|
||||
})
|
||||
declare grantorUuid: string
|
||||
|
||||
@ManyToOne(
|
||||
/* istanbul ignore next */
|
||||
() => User,
|
||||
/* istanbul ignore next */
|
||||
(user) => user.emergencyAccessInvitationsCreated,
|
||||
/* istanbul ignore next */
|
||||
{ onDelete: 'CASCADE', nullable: false },
|
||||
)
|
||||
@JoinColumn({ name: 'grantor_uuid', referencedColumnName: 'uuid', foreignKeyConstraintName: 'grantor_uuid_fk' })
|
||||
declare grantor: Promise<User>
|
||||
|
||||
@Column({
|
||||
name: 'grantee_uuid',
|
||||
length: 36,
|
||||
})
|
||||
declare granteeUuid: string
|
||||
|
||||
@ManyToOne(
|
||||
/* istanbul ignore next */
|
||||
() => User,
|
||||
/* istanbul ignore next */
|
||||
(user) => user.emergencyAccessInvitationsReceived,
|
||||
/* istanbul ignore next */
|
||||
{ onDelete: 'CASCADE', nullable: false },
|
||||
)
|
||||
@JoinColumn({ name: 'grantee_uuid', referencedColumnName: 'uuid', foreignKeyConstraintName: 'grantee_uuid_fk' })
|
||||
declare grantee: Promise<User>
|
||||
|
||||
@Column({
|
||||
name: 'status',
|
||||
length: 36,
|
||||
})
|
||||
declare status: string
|
||||
|
||||
@Column({
|
||||
name: 'expires_at',
|
||||
type: 'datetime',
|
||||
})
|
||||
declare expiresAt: Date
|
||||
|
||||
@Column({
|
||||
name: 'created_at',
|
||||
type: 'datetime',
|
||||
})
|
||||
declare createdAt: Date
|
||||
|
||||
@Column({
|
||||
name: 'updated_at',
|
||||
type: 'datetime',
|
||||
})
|
||||
declare updatedAt: Date
|
||||
}
|
||||
@@ -23,8 +23,8 @@ export class AuthenticatorPersistenceMapper implements MapperInterface<Authentic
|
||||
counter: projection.counter,
|
||||
credentialBackedUp: projection.credentialBackedUp,
|
||||
credentialDeviceType: projection.credentialDeviceType,
|
||||
credentialId: Buffer.from(projection.credentialId, 'base64url'),
|
||||
credentialPublicKey: projection.credentialPublicKey,
|
||||
credentialId: new Uint8Array(Buffer.from(projection.credentialId, 'base64url')),
|
||||
credentialPublicKey: new Uint8Array(projection.credentialPublicKey),
|
||||
dates,
|
||||
transports: projection.transports ? JSON.parse(projection.transports) : undefined,
|
||||
},
|
||||
@@ -43,7 +43,7 @@ export class AuthenticatorPersistenceMapper implements MapperInterface<Authentic
|
||||
|
||||
typeorm.uuid = domain.id.toString()
|
||||
typeorm.userUuid = domain.props.userUuid.value
|
||||
typeorm.credentialId = Buffer.from(domain.props.credentialId).toString('base64url')
|
||||
typeorm.credentialId = Buffer.from(domain.props.credentialId.buffer).toString('base64url')
|
||||
typeorm.credentialPublicKey = Buffer.from(domain.props.credentialPublicKey.buffer)
|
||||
typeorm.counter = domain.props.counter
|
||||
typeorm.credentialDeviceType = domain.props.credentialDeviceType
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
import { Dates, MapperInterface, UniqueEntityId, Uuid } from '@standardnotes/domain-core'
|
||||
|
||||
import { EmergencyAccessInvitation } from '../Domain/EmergencyAccess/EmergencyAccessInvitation'
|
||||
import { EmergencyAccessInvitationStatus } from '../Domain/EmergencyAccess/EmergencyAccessInvitationStatus'
|
||||
import { TypeORMEmergencyAccessInvitation } from '../Infra/TypeORM/TypeORMEmergencyAccessInvitation'
|
||||
|
||||
export class EmergencyAccessInvitationPersistenceMapper
|
||||
implements MapperInterface<EmergencyAccessInvitation, TypeORMEmergencyAccessInvitation>
|
||||
{
|
||||
toDomain(projection: TypeORMEmergencyAccessInvitation): EmergencyAccessInvitation {
|
||||
const grantorUuidOrError = Uuid.create(projection.grantorUuid)
|
||||
if (grantorUuidOrError.isFailed()) {
|
||||
throw new Error(grantorUuidOrError.getError())
|
||||
}
|
||||
const grantorUuid = grantorUuidOrError.getValue()
|
||||
|
||||
const granteeUuidOrError = Uuid.create(projection.granteeUuid)
|
||||
if (granteeUuidOrError.isFailed()) {
|
||||
throw new Error(granteeUuidOrError.getError())
|
||||
}
|
||||
const granteeUuid = granteeUuidOrError.getValue()
|
||||
|
||||
const emergencyAccessInvitationStatusOrError = EmergencyAccessInvitationStatus.create(projection.status)
|
||||
if (emergencyAccessInvitationStatusOrError.isFailed()) {
|
||||
throw new Error(emergencyAccessInvitationStatusOrError.getError())
|
||||
}
|
||||
const emergencyAccessInvitationStatus = emergencyAccessInvitationStatusOrError.getValue()
|
||||
|
||||
const datesOrError = Dates.create(projection.createdAt, projection.updatedAt)
|
||||
if (datesOrError.isFailed()) {
|
||||
throw new Error(datesOrError.getError())
|
||||
}
|
||||
const dates = datesOrError.getValue()
|
||||
|
||||
const emergencyAccessInvitationOrError = EmergencyAccessInvitation.create(
|
||||
{
|
||||
grantorUuid,
|
||||
granteeUuid,
|
||||
status: emergencyAccessInvitationStatus,
|
||||
expiresAt: projection.expiresAt,
|
||||
dates,
|
||||
},
|
||||
new UniqueEntityId(projection.uuid),
|
||||
)
|
||||
const emergencyAccessInvitation = emergencyAccessInvitationOrError.getValue()
|
||||
|
||||
return emergencyAccessInvitation
|
||||
}
|
||||
|
||||
toProjection(domain: EmergencyAccessInvitation): TypeORMEmergencyAccessInvitation {
|
||||
const typeorm = new TypeORMEmergencyAccessInvitation()
|
||||
|
||||
typeorm.uuid = domain.id.toString()
|
||||
typeorm.grantorUuid = domain.props.grantorUuid.value
|
||||
typeorm.granteeUuid = domain.props.granteeUuid.value
|
||||
typeorm.status = domain.props.status.value
|
||||
typeorm.expiresAt = domain.props.expiresAt
|
||||
typeorm.createdAt = domain.props.dates.createdAt
|
||||
typeorm.updatedAt = domain.props.dates.updatedAt
|
||||
|
||||
return typeorm
|
||||
}
|
||||
}
|
||||
@@ -3,6 +3,20 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [1.10.1](https://github.com/standardnotes/server/compare/@standardnotes/domain-events-infra@1.10.0...@standardnotes/domain-events-infra@1.10.1) (2023-04-21)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/domain-events-infra
|
||||
|
||||
# [1.10.0](https://github.com/standardnotes/server/compare/@standardnotes/domain-events-infra@1.9.74...@standardnotes/domain-events-infra@1.10.0) (2023-04-21)
|
||||
|
||||
### Features
|
||||
|
||||
* **domain-events-infra:** add SES email bounce notifications handler ([#569](https://github.com/standardnotes/server/issues/569)) ([9b9f10d](https://github.com/standardnotes/server/commit/9b9f10d4ca9ceef1defa868b7c96f570e46d8053))
|
||||
|
||||
## [1.9.74](https://github.com/standardnotes/server/compare/@standardnotes/domain-events-infra@1.9.73...@standardnotes/domain-events-infra@1.9.74) (2023-03-30)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/domain-events-infra
|
||||
|
||||
## [1.9.73](https://github.com/standardnotes/server/compare/@standardnotes/domain-events-infra@1.9.72...@standardnotes/domain-events-infra@1.9.73) (2023-03-10)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/domain-events-infra
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@standardnotes/domain-events-infra",
|
||||
"version": "1.9.73",
|
||||
"version": "1.10.1",
|
||||
"engines": {
|
||||
"node": ">=18.0.0 <19.0.0"
|
||||
},
|
||||
@@ -27,7 +27,7 @@
|
||||
"@aws-sdk/client-sqs": "^3.259.0",
|
||||
"@standardnotes/domain-events": "workspace:*",
|
||||
"ioredis": "^5.2.4",
|
||||
"newrelic": "^9.11.0",
|
||||
"newrelic": "^10.0.0",
|
||||
"reflect-metadata": "^0.1.13",
|
||||
"sqs-consumer": "^6.2.1",
|
||||
"winston": "^3.8.1"
|
||||
@@ -35,7 +35,7 @@
|
||||
"devDependencies": {
|
||||
"@types/ioredis": "^5.0.0",
|
||||
"@types/jest": "^29.1.1",
|
||||
"@types/newrelic": "^9.4.0",
|
||||
"@types/newrelic": "^9.13.0",
|
||||
"@typescript-eslint/eslint-plugin": "^5.48.2",
|
||||
"eslint-plugin-prettier": "^4.2.1",
|
||||
"jest": "^29.1.2",
|
||||
|
||||
@@ -0,0 +1,72 @@
|
||||
import 'reflect-metadata'
|
||||
|
||||
import { DomainEventHandlerInterface } from '@standardnotes/domain-events'
|
||||
|
||||
import { startBackgroundTransaction } from 'newrelic'
|
||||
jest.mock('newrelic')
|
||||
|
||||
import { Logger } from 'winston'
|
||||
|
||||
import { SQSNewRelicBounceNotificiationHandler } from './SQSNewRelicBounceNotificiationHandler'
|
||||
|
||||
describe('SQSNewRelicBounceNotificiationHandler', () => {
|
||||
let handler: DomainEventHandlerInterface
|
||||
let handlers: Map<string, DomainEventHandlerInterface>
|
||||
let logger: Logger
|
||||
let mockedStartBackgroundTransaction: unknown
|
||||
|
||||
const createHandler = () => new SQSNewRelicBounceNotificiationHandler(handlers, logger)
|
||||
|
||||
beforeEach(() => {
|
||||
handler = {} as jest.Mocked<DomainEventHandlerInterface>
|
||||
handler.handle = jest.fn()
|
||||
|
||||
handlers = new Map([['EMAIL_BOUNCED', handler]])
|
||||
|
||||
logger = {} as jest.Mocked<Logger>
|
||||
logger.debug = jest.fn()
|
||||
logger.error = jest.fn()
|
||||
|
||||
mockedStartBackgroundTransaction = startBackgroundTransaction as jest.Mocked<unknown>
|
||||
})
|
||||
|
||||
it('should handle messages', async () => {
|
||||
const sqsMessage = `{
|
||||
"Message" : "{\\"notificationType\\":\\"Bounce\\",\\"bounce\\":{\\"feedbackId\\":\\"010001879d0a9def-d9882210-6467-48ed-8088-2193c66a349b-000000\\",\\"bounceType\\":\\"Transient\\",\\"bounceSubType\\":\\"General\\",\\"bouncedRecipients\\":[{\\"emailAddress\\":\\"test@test.te\\",\\"action\\":\\"failed\\",\\"status\\":\\"5.7.1\\",\\"diagnosticCode\\":\\"smtp; 550 5.7.1 <test@test.te>: Recipient address rejected: Recipient not found\\"}],\\"timestamp\\":\\"2023-04-20T05:02:11.000Z\\",\\"remoteMtaIp\\":\\"1.2.3.4\\",\\"reportingMTA\\":\\"dns; test.smtp-out.amazonses.com\\"},\\"mail\\":{\\"timestamp\\":\\"2023-04-20T05:02:08.589Z\\",\\"source\\":\\"Standard Notes <backups@standardnotes.org>\\",\\"sourceArn\\":\\"arn:aws:ses:us-east-1:336603415364:identity/backups@standardnotes.org\\",\\"sourceIp\\":\\"1.2.3.4\\",\\"callerIdentity\\":\\"test\\",\\"sendingAccountId\\":\\"123456\\",\\"messageId\\":\\"010001879d0a92cd-00ed31d1-bf9e-4ce4-abb9-8c6e95a30733-000000\\",\\"destination\\":[\\"test@test.te\\"]}}"
|
||||
}`
|
||||
|
||||
await createHandler().handleMessage(sqsMessage)
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
expect((<any>mockedStartBackgroundTransaction).mock.calls[0][0]).toBe('EMAIL_BOUNCED')
|
||||
})
|
||||
|
||||
it('should not handle unsupported messages', async () => {
|
||||
const sqsMessage = `{
|
||||
"Message" : "{\\"notificationType\\":\\"TEST\\",\\"bounce\\":{\\"feedbackId\\":\\"010001879d0a9def-d9882210-6467-48ed-8088-2193c66a349b-000000\\",\\"bounceType\\":\\"Transient\\",\\"bounceSubType\\":\\"General\\",\\"bouncedRecipients\\":[{\\"emailAddress\\":\\"test@test.te\\",\\"action\\":\\"failed\\",\\"status\\":\\"5.7.1\\",\\"diagnosticCode\\":\\"smtp; 550 5.7.1 <test@test.te>: Recipient address rejected: Recipient not found\\"}],\\"timestamp\\":\\"2023-04-20T05:02:11.000Z\\",\\"remoteMtaIp\\":\\"1.2.3.4\\",\\"reportingMTA\\":\\"dns; test.smtp-out.amazonses.com\\"},\\"mail\\":{\\"timestamp\\":\\"2023-04-20T05:02:08.589Z\\",\\"source\\":\\"Standard Notes <backups@standardnotes.org>\\",\\"sourceArn\\":\\"arn:aws:ses:us-east-1:336603415364:identity/backups@standardnotes.org\\",\\"sourceIp\\":\\"1.2.3.4\\",\\"callerIdentity\\":\\"test\\",\\"sendingAccountId\\":\\"123456\\",\\"messageId\\":\\"010001879d0a92cd-00ed31d1-bf9e-4ce4-abb9-8c6e95a30733-000000\\",\\"destination\\":[\\"test@test.te\\"]}}"
|
||||
}`
|
||||
|
||||
await createHandler().handleMessage(sqsMessage)
|
||||
|
||||
expect(handler.handle).not.toHaveBeenCalled()
|
||||
})
|
||||
|
||||
it('should handle errors', async () => {
|
||||
await createHandler().handleError(new Error('test'))
|
||||
|
||||
expect(logger.error).toHaveBeenCalled()
|
||||
})
|
||||
|
||||
it('should tell if there is no handler for an event', async () => {
|
||||
const sqsMessage = `{
|
||||
"Message" : "{\\"notificationType\\":\\"Bounce\\",\\"bounce\\":{\\"feedbackId\\":\\"010001879d0a9def-d9882210-6467-48ed-8088-2193c66a349b-000000\\",\\"bounceType\\":\\"Transient\\",\\"bounceSubType\\":\\"General\\",\\"bouncedRecipients\\":[{\\"emailAddress\\":\\"test@test.te\\",\\"action\\":\\"failed\\",\\"status\\":\\"5.7.1\\",\\"diagnosticCode\\":\\"smtp; 550 5.7.1 <test@test.te>: Recipient address rejected: Recipient not found\\"}],\\"timestamp\\":\\"2023-04-20T05:02:11.000Z\\",\\"remoteMtaIp\\":\\"1.2.3.4\\",\\"reportingMTA\\":\\"dns; test.smtp-out.amazonses.com\\"},\\"mail\\":{\\"timestamp\\":\\"2023-04-20T05:02:08.589Z\\",\\"source\\":\\"Standard Notes <backups@standardnotes.org>\\",\\"sourceArn\\":\\"arn:aws:ses:us-east-1:336603415364:identity/backups@standardnotes.org\\",\\"sourceIp\\":\\"1.2.3.4\\",\\"callerIdentity\\":\\"test\\",\\"sendingAccountId\\":\\"123456\\",\\"messageId\\":\\"010001879d0a92cd-00ed31d1-bf9e-4ce4-abb9-8c6e95a30733-000000\\",\\"destination\\":[\\"test@test.te\\"]}}"
|
||||
}`
|
||||
|
||||
const bounceHandler = new SQSNewRelicBounceNotificiationHandler(new Map([]), logger)
|
||||
await bounceHandler.handleMessage(sqsMessage)
|
||||
|
||||
expect(logger.debug).toHaveBeenCalledWith('Event handler for event type EMAIL_BOUNCED does not exist')
|
||||
|
||||
expect(handler.handle).not.toHaveBeenCalled()
|
||||
})
|
||||
})
|
||||
@@ -0,0 +1,68 @@
|
||||
import { Logger } from 'winston'
|
||||
import * as newrelic from 'newrelic'
|
||||
|
||||
import {
|
||||
DomainEventHandlerInterface,
|
||||
DomainEventMessageHandlerInterface,
|
||||
DomainEventService,
|
||||
EmailBouncedEvent,
|
||||
} from '@standardnotes/domain-events'
|
||||
|
||||
export class SQSNewRelicBounceNotificiationHandler implements DomainEventMessageHandlerInterface {
|
||||
private readonly ALLOWED_NOTIFICATION_TYPES = ['Bounce']
|
||||
|
||||
constructor(private handlers: Map<string, DomainEventHandlerInterface>, private logger: Logger) {}
|
||||
|
||||
async handleMessage(message: string): Promise<void> {
|
||||
const messageParsed = JSON.parse(JSON.parse(message).Message)
|
||||
|
||||
if (!this.ALLOWED_NOTIFICATION_TYPES.includes(messageParsed.notificationType)) {
|
||||
this.logger.error(`Received notification of type ${messageParsed.notificationType} which is not allowed`)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
for (const bouncedRecipient of messageParsed.bounce.bouncedRecipients) {
|
||||
const domainEvent: EmailBouncedEvent = {
|
||||
type: 'EMAIL_BOUNCED',
|
||||
payload: {
|
||||
bounceType: messageParsed.bounce.bounceType,
|
||||
bounceSubType: messageParsed.bounce.bounceSubType,
|
||||
recipientEmail: bouncedRecipient.emailAddress,
|
||||
diagnosticCode: bouncedRecipient.diagnosticCode,
|
||||
},
|
||||
createdAt: new Date(),
|
||||
meta: {
|
||||
correlation: {
|
||||
userIdentifier: bouncedRecipient.emailAddress,
|
||||
userIdentifierType: 'email',
|
||||
},
|
||||
origin: DomainEventService.SES,
|
||||
},
|
||||
}
|
||||
|
||||
const handler = this.handlers.get(domainEvent.type)
|
||||
if (!handler) {
|
||||
this.logger.debug(`Event handler for event type ${domainEvent.type} does not exist`)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
this.logger.debug(`Received event: ${domainEvent.type}`)
|
||||
|
||||
await newrelic.startBackgroundTransaction(
|
||||
domainEvent.type,
|
||||
/* istanbul ignore next */
|
||||
() => {
|
||||
newrelic.getTransaction()
|
||||
|
||||
return handler.handle(domainEvent)
|
||||
},
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
async handleError(error: Error): Promise<void> {
|
||||
this.logger.error('Error occured while handling SQS message: %O', error)
|
||||
}
|
||||
}
|
||||
@@ -5,6 +5,7 @@ export * from './Redis/RedisEventMessageHandler'
|
||||
|
||||
export * from './SNS/SNSDomainEventPublisher'
|
||||
|
||||
export * from './SQS/SQSNewRelicBounceNotificiationHandler'
|
||||
export * from './SQS/SQSDomainEventSubscriberFactory'
|
||||
export * from './SQS/SQSEventMessageHandler'
|
||||
export * from './SQS/SQSNewRelicEventMessageHandler'
|
||||
|
||||
@@ -3,6 +3,12 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
# [2.109.0](https://github.com/standardnotes/server/compare/@standardnotes/domain-events@2.108.1...@standardnotes/domain-events@2.109.0) (2023-04-21)
|
||||
|
||||
### Features
|
||||
|
||||
* **domain-events-infra:** add SES email bounce notifications handler ([#569](https://github.com/standardnotes/server/issues/569)) ([9b9f10d](https://github.com/standardnotes/server/commit/9b9f10d4ca9ceef1defa868b7c96f570e46d8053))
|
||||
|
||||
## [2.108.1](https://github.com/standardnotes/server/compare/@standardnotes/domain-events@2.108.0...@standardnotes/domain-events@2.108.1) (2023-02-23)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/domain-events
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@standardnotes/domain-events",
|
||||
"version": "2.108.1",
|
||||
"version": "2.109.0",
|
||||
"engines": {
|
||||
"node": ">=18.0.0 <19.0.0"
|
||||
},
|
||||
|
||||
@@ -12,4 +12,5 @@ export enum DomainEventService {
|
||||
Revisions = 'revisions',
|
||||
Email = 'email',
|
||||
Settings = 'settings',
|
||||
SES = 'ses',
|
||||
}
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
import { DomainEventInterface } from './DomainEventInterface'
|
||||
import { EmailBouncedEventPayload } from './EmailBouncedEventPayload'
|
||||
|
||||
export interface EmailBouncedEvent extends DomainEventInterface {
|
||||
type: 'EMAIL_BOUNCED'
|
||||
payload: EmailBouncedEventPayload
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
export interface EmailBouncedEventPayload {
|
||||
recipientEmail: string
|
||||
bounceType: string
|
||||
bounceSubType: string
|
||||
diagnosticCode?: string
|
||||
}
|
||||
@@ -12,6 +12,8 @@ export * from './Event/DuplicateItemSyncedEvent'
|
||||
export * from './Event/DuplicateItemSyncedEventPayload'
|
||||
export * from './Event/EmailBackupRequestedEvent'
|
||||
export * from './Event/EmailBackupRequestedEventPayload'
|
||||
export * from './Event/EmailBouncedEvent'
|
||||
export * from './Event/EmailBouncedEventPayload'
|
||||
export * from './Event/EmailRequestedEvent'
|
||||
export * from './Event/EmailRequestedEventPayload'
|
||||
export * from './Event/EmailSentEvent'
|
||||
|
||||
@@ -3,6 +3,18 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [1.7.9](https://github.com/standardnotes/server/compare/@standardnotes/event-store@1.7.8...@standardnotes/event-store@1.7.9) (2023-04-21)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/event-store
|
||||
|
||||
## [1.7.8](https://github.com/standardnotes/server/compare/@standardnotes/event-store@1.7.7...@standardnotes/event-store@1.7.8) (2023-04-21)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/event-store
|
||||
|
||||
## [1.7.7](https://github.com/standardnotes/server/compare/@standardnotes/event-store@1.7.6...@standardnotes/event-store@1.7.7) (2023-03-30)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/event-store
|
||||
|
||||
## [1.7.6](https://github.com/standardnotes/server/compare/@standardnotes/event-store@1.7.5...@standardnotes/event-store@1.7.6) (2023-03-10)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/event-store
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@standardnotes/event-store",
|
||||
"version": "1.7.6",
|
||||
"version": "1.7.9",
|
||||
"description": "Event Store Service",
|
||||
"private": true,
|
||||
"main": "dist/src/index.js",
|
||||
@@ -21,7 +21,7 @@
|
||||
"devDependencies": {
|
||||
"@types/ioredis": "^5.0.0",
|
||||
"@types/jest": "^29.1.1",
|
||||
"@types/newrelic": "^9.4.0",
|
||||
"@types/newrelic": "^9.13.0",
|
||||
"@types/nodemailer": "^6.4.1",
|
||||
"@typescript-eslint/eslint-plugin": "^5.48.2",
|
||||
"eslint": "^8.32.0",
|
||||
@@ -39,7 +39,7 @@
|
||||
"inversify": "^6.0.1",
|
||||
"ioredis": "^5.2.4",
|
||||
"mysql2": "^3.0.1",
|
||||
"newrelic": "^9.11.0",
|
||||
"newrelic": "^10.0.0",
|
||||
"reflect-metadata": "0.1.13",
|
||||
"typeorm": "^0.3.10",
|
||||
"winston": "^3.8.1"
|
||||
|
||||
@@ -3,6 +3,18 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [1.10.11](https://github.com/standardnotes/files/compare/@standardnotes/files-server@1.10.10...@standardnotes/files-server@1.10.11) (2023-04-21)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/files-server
|
||||
|
||||
## [1.10.10](https://github.com/standardnotes/files/compare/@standardnotes/files-server@1.10.9...@standardnotes/files-server@1.10.10) (2023-04-21)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/files-server
|
||||
|
||||
## [1.10.9](https://github.com/standardnotes/files/compare/@standardnotes/files-server@1.10.8...@standardnotes/files-server@1.10.9) (2023-03-30)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/files-server
|
||||
|
||||
## [1.10.8](https://github.com/standardnotes/files/compare/@standardnotes/files-server@1.10.7...@standardnotes/files-server@1.10.8) (2023-03-10)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/files-server
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@standardnotes/files-server",
|
||||
"version": "1.10.8",
|
||||
"version": "1.10.11",
|
||||
"engines": {
|
||||
"node": ">=18.0.0 <19.0.0"
|
||||
},
|
||||
@@ -48,7 +48,7 @@
|
||||
"inversify-express-utils": "^6.4.3",
|
||||
"ioredis": "^5.2.4",
|
||||
"jsonwebtoken": "^9.0.0",
|
||||
"newrelic": "^9.11.0",
|
||||
"newrelic": "^10.0.0",
|
||||
"nodemon": "^2.0.19",
|
||||
"prettyjson": "^1.2.5",
|
||||
"reflect-metadata": "^0.1.13",
|
||||
@@ -63,7 +63,7 @@
|
||||
"@types/ioredis": "^5.0.0",
|
||||
"@types/jest": "^29.1.1",
|
||||
"@types/jsonwebtoken": "^9.0.1",
|
||||
"@types/newrelic": "^9.4.0",
|
||||
"@types/newrelic": "^9.13.0",
|
||||
"@types/prettyjson": "^0.0.30",
|
||||
"@types/uuid": "^8.3.0",
|
||||
"@typescript-eslint/eslint-plugin": "^5.48.2",
|
||||
|
||||
@@ -3,6 +3,18 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [1.12.14](https://github.com/standardnotes/server/compare/@standardnotes/revisions-server@1.12.13...@standardnotes/revisions-server@1.12.14) (2023-04-21)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/revisions-server
|
||||
|
||||
## [1.12.13](https://github.com/standardnotes/server/compare/@standardnotes/revisions-server@1.12.12...@standardnotes/revisions-server@1.12.13) (2023-04-21)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/revisions-server
|
||||
|
||||
## [1.12.12](https://github.com/standardnotes/server/compare/@standardnotes/revisions-server@1.12.11...@standardnotes/revisions-server@1.12.12) (2023-03-30)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/revisions-server
|
||||
|
||||
## [1.12.11](https://github.com/standardnotes/server/compare/@standardnotes/revisions-server@1.12.10...@standardnotes/revisions-server@1.12.11) (2023-03-15)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@standardnotes/revisions-server",
|
||||
"version": "1.12.11",
|
||||
"version": "1.12.14",
|
||||
"engines": {
|
||||
"node": ">=18.0.0 <19.0.0"
|
||||
},
|
||||
@@ -25,7 +25,7 @@
|
||||
"dependencies": {
|
||||
"@aws-sdk/client-s3": "^3.259.0",
|
||||
"@aws-sdk/client-sqs": "^3.259.0",
|
||||
"@newrelic/winston-enricher": "^4.0.0",
|
||||
"@newrelic/winston-enricher": "^4.0.1",
|
||||
"@sentry/node": "^7.28.1",
|
||||
"@standardnotes/api": "^1.25.3",
|
||||
"@standardnotes/common": "workspace:^",
|
||||
@@ -41,7 +41,7 @@
|
||||
"inversify": "^6.0.1",
|
||||
"inversify-express-utils": "^6.4.3",
|
||||
"mysql2": "^3.0.1",
|
||||
"newrelic": "^9.11.0",
|
||||
"newrelic": "^10.0.0",
|
||||
"reflect-metadata": "0.1.13",
|
||||
"typeorm": "^0.3.10",
|
||||
"winston": "^3.8.1"
|
||||
@@ -52,7 +52,7 @@
|
||||
"@types/express": "^4.17.14",
|
||||
"@types/inversify-express-utils": "^2.0.0",
|
||||
"@types/jest": "^29.1.1",
|
||||
"@types/newrelic": "^9.4.0",
|
||||
"@types/newrelic": "^9.13.0",
|
||||
"@typescript-eslint/eslint-plugin": "^5.48.2",
|
||||
"eslint": "^8.32.0",
|
||||
"eslint-plugin-prettier": "^4.0.0",
|
||||
|
||||
@@ -3,6 +3,18 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [1.17.11](https://github.com/standardnotes/server/compare/@standardnotes/scheduler-server@1.17.10...@standardnotes/scheduler-server@1.17.11) (2023-04-21)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/scheduler-server
|
||||
|
||||
## [1.17.10](https://github.com/standardnotes/server/compare/@standardnotes/scheduler-server@1.17.9...@standardnotes/scheduler-server@1.17.10) (2023-04-21)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/scheduler-server
|
||||
|
||||
## [1.17.9](https://github.com/standardnotes/server/compare/@standardnotes/scheduler-server@1.17.8...@standardnotes/scheduler-server@1.17.9) (2023-03-30)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/scheduler-server
|
||||
|
||||
## [1.17.8](https://github.com/standardnotes/server/compare/@standardnotes/scheduler-server@1.17.7...@standardnotes/scheduler-server@1.17.8) (2023-03-10)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/scheduler-server
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@standardnotes/scheduler-server",
|
||||
"version": "1.17.8",
|
||||
"version": "1.17.11",
|
||||
"engines": {
|
||||
"node": ">=18.0.0 <19.0.0"
|
||||
},
|
||||
@@ -26,7 +26,7 @@
|
||||
"dependencies": {
|
||||
"@aws-sdk/client-sns": "^3.259.0",
|
||||
"@aws-sdk/client-sqs": "^3.259.0",
|
||||
"@newrelic/winston-enricher": "^4.0.0",
|
||||
"@newrelic/winston-enricher": "^4.0.1",
|
||||
"@sentry/node": "^7.28.1",
|
||||
"@standardnotes/domain-core": "workspace:^",
|
||||
"@standardnotes/domain-events": "workspace:*",
|
||||
@@ -38,7 +38,7 @@
|
||||
"inversify": "^6.0.1",
|
||||
"ioredis": "^5.2.4",
|
||||
"mysql2": "^3.0.1",
|
||||
"newrelic": "^9.11.0",
|
||||
"newrelic": "^10.0.0",
|
||||
"reflect-metadata": "^0.1.13",
|
||||
"typeorm": "^0.3.10",
|
||||
"winston": "^3.8.1"
|
||||
@@ -46,7 +46,7 @@
|
||||
"devDependencies": {
|
||||
"@types/ioredis": "^5.0.0",
|
||||
"@types/jest": "^29.1.1",
|
||||
"@types/newrelic": "^9.4.0",
|
||||
"@types/newrelic": "^9.13.0",
|
||||
"@types/node": "^18.11.9",
|
||||
"@typescript-eslint/eslint-plugin": "^5.48.2",
|
||||
"eslint": "^8.32.0",
|
||||
|
||||
@@ -3,6 +3,18 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [1.32.7](https://github.com/standardnotes/syncing-server-js/compare/@standardnotes/syncing-server@1.32.6...@standardnotes/syncing-server@1.32.7) (2023-04-21)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/syncing-server
|
||||
|
||||
## [1.32.6](https://github.com/standardnotes/syncing-server-js/compare/@standardnotes/syncing-server@1.32.5...@standardnotes/syncing-server@1.32.6) (2023-04-21)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/syncing-server
|
||||
|
||||
## [1.32.5](https://github.com/standardnotes/syncing-server-js/compare/@standardnotes/syncing-server@1.32.4...@standardnotes/syncing-server@1.32.5) (2023-03-30)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/syncing-server
|
||||
|
||||
## [1.32.4](https://github.com/standardnotes/syncing-server-js/compare/@standardnotes/syncing-server@1.32.3...@standardnotes/syncing-server@1.32.4) (2023-03-15)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@standardnotes/syncing-server",
|
||||
"version": "1.32.4",
|
||||
"version": "1.32.7",
|
||||
"engines": {
|
||||
"node": ">=18.0.0 <19.0.0"
|
||||
},
|
||||
@@ -28,7 +28,7 @@
|
||||
"@aws-sdk/client-s3": "^3.259.0",
|
||||
"@aws-sdk/client-sns": "^3.259.0",
|
||||
"@aws-sdk/client-sqs": "^3.259.0",
|
||||
"@newrelic/winston-enricher": "^4.0.0",
|
||||
"@newrelic/winston-enricher": "^4.0.1",
|
||||
"@sentry/node": "^7.28.1",
|
||||
"@sentry/tracing": "^7.28.1",
|
||||
"@standardnotes/api": "^1.25.3",
|
||||
@@ -49,7 +49,7 @@
|
||||
"inversify-express-utils": "^6.4.3",
|
||||
"jsonwebtoken": "^9.0.0",
|
||||
"mysql2": "^3.0.1",
|
||||
"newrelic": "^9.11.0",
|
||||
"newrelic": "^10.0.0",
|
||||
"nodemon": "^2.0.19",
|
||||
"prettyjson": "^1.2.5",
|
||||
"reflect-metadata": "0.1.13",
|
||||
@@ -65,7 +65,7 @@
|
||||
"@types/inversify-express-utils": "^2.0.0",
|
||||
"@types/jest": "^29.1.1",
|
||||
"@types/jsonwebtoken": "^9.0.1",
|
||||
"@types/newrelic": "^9.4.0",
|
||||
"@types/newrelic": "^9.13.0",
|
||||
"@types/prettyjson": "^0.0.30",
|
||||
"@types/ua-parser-js": "^0.7.36",
|
||||
"@types/uuid": "^8.3.0",
|
||||
|
||||
@@ -3,6 +3,18 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [1.6.12](https://github.com/standardnotes/server/compare/@standardnotes/websockets-server@1.6.11...@standardnotes/websockets-server@1.6.12) (2023-04-21)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/websockets-server
|
||||
|
||||
## [1.6.11](https://github.com/standardnotes/server/compare/@standardnotes/websockets-server@1.6.10...@standardnotes/websockets-server@1.6.11) (2023-04-21)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/websockets-server
|
||||
|
||||
## [1.6.10](https://github.com/standardnotes/server/compare/@standardnotes/websockets-server@1.6.9...@standardnotes/websockets-server@1.6.10) (2023-03-30)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/websockets-server
|
||||
|
||||
## [1.6.9](https://github.com/standardnotes/server/compare/@standardnotes/websockets-server@1.6.8...@standardnotes/websockets-server@1.6.9) (2023-03-10)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/websockets-server
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@standardnotes/websockets-server",
|
||||
"version": "1.6.9",
|
||||
"version": "1.6.12",
|
||||
"engines": {
|
||||
"node": ">=18.0.0 <19.0.0"
|
||||
},
|
||||
@@ -23,7 +23,7 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@aws-sdk/client-sqs": "^3.259.0",
|
||||
"@newrelic/winston-enricher": "^4.0.0",
|
||||
"@newrelic/winston-enricher": "^4.0.1",
|
||||
"@sentry/node": "^7.28.1",
|
||||
"@standardnotes/api": "^1.25.3",
|
||||
"@standardnotes/common": "workspace:^",
|
||||
@@ -41,7 +41,7 @@
|
||||
"inversify-express-utils": "^6.4.3",
|
||||
"ioredis": "^5.2.4",
|
||||
"mysql2": "^3.0.1",
|
||||
"newrelic": "^9.11.0",
|
||||
"newrelic": "^10.0.0",
|
||||
"reflect-metadata": "0.1.13",
|
||||
"typeorm": "^0.3.10",
|
||||
"winston": "^3.8.1"
|
||||
@@ -51,7 +51,7 @@
|
||||
"@types/express": "^4.17.14",
|
||||
"@types/ioredis": "^5.0.0",
|
||||
"@types/jest": "^29.1.1",
|
||||
"@types/newrelic": "^9.4.0",
|
||||
"@types/newrelic": "^9.13.0",
|
||||
"@typescript-eslint/eslint-plugin": "^5.48.2",
|
||||
"eslint": "^8.32.0",
|
||||
"eslint-plugin-prettier": "^4.0.0",
|
||||
|
||||
115
yarn.lock
115
yarn.lock
@@ -1940,13 +1940,13 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@grpc/grpc-js@npm:^1.8.8":
|
||||
version: 1.8.12
|
||||
resolution: "@grpc/grpc-js@npm:1.8.12"
|
||||
"@grpc/grpc-js@npm:^1.8.10":
|
||||
version: 1.8.13
|
||||
resolution: "@grpc/grpc-js@npm:1.8.13"
|
||||
dependencies:
|
||||
"@grpc/proto-loader": "npm:^0.7.0"
|
||||
"@types/node": "npm:>=12.12.47"
|
||||
checksum: cf2523ed610cd7c9f08f6c24bfdde8072d4d98e3026b9158d09709ff0ab079912c31af8803a723c3707a1d58a9030df7cdb8ef9d2e1135ac6d5440d10bd76752
|
||||
checksum: 04d24ca840f2bccb7fc8698ae611bdb3f361b6b4785fe5559155218766bc48da67959db8cb692b31062d6918f3e5c1475083ffb60e67d23b0560ba5c1b88510a
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
@@ -2608,12 +2608,12 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@newrelic/winston-enricher@npm:^4.0.0":
|
||||
version: 4.0.0
|
||||
resolution: "@newrelic/winston-enricher@npm:4.0.0"
|
||||
"@newrelic/winston-enricher@npm:^4.0.1":
|
||||
version: 4.0.1
|
||||
resolution: "@newrelic/winston-enricher@npm:4.0.1"
|
||||
peerDependencies:
|
||||
newrelic: ">=8.13.0"
|
||||
checksum: 3fc901cded1c0ffe59f540daadfcb5ec348a62143f5324ce7869af2d0f2924ce4fe2ad8d927f240439fa71327d3f87f7b1914cf3e5fee7bdfcfd855c9ffa249c
|
||||
checksum: e45880f6ec9b8125e470b55e685701287c2ddb37b4423472113043031992bd7e0cb4042c784dcad7ec6ca90799ccaea4954c02873e9885b0148a0b79fc0316e0
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
@@ -3191,7 +3191,7 @@ __metadata:
|
||||
dependencies:
|
||||
"@aws-sdk/client-sns": "npm:^3.259.0"
|
||||
"@aws-sdk/client-sqs": "npm:^3.259.0"
|
||||
"@newrelic/winston-enricher": "npm:^4.0.0"
|
||||
"@newrelic/winston-enricher": "npm:^4.0.1"
|
||||
"@sentry/node": "npm:^7.28.1"
|
||||
"@standardnotes/common": "workspace:*"
|
||||
"@standardnotes/domain-core": "workspace:^"
|
||||
@@ -3201,7 +3201,7 @@ __metadata:
|
||||
"@types/ioredis": "npm:^5.0.0"
|
||||
"@types/jest": "npm:^29.1.1"
|
||||
"@types/mixpanel": "npm:^2.14.4"
|
||||
"@types/newrelic": "npm:^9.4.0"
|
||||
"@types/newrelic": "npm:^9.13.0"
|
||||
"@types/node": "npm:^18.11.9"
|
||||
"@typescript-eslint/eslint-plugin": "npm:^5.48.2"
|
||||
dayjs: "npm:^1.11.6"
|
||||
@@ -3213,7 +3213,7 @@ __metadata:
|
||||
jest: "npm:^29.1.2"
|
||||
mixpanel: "npm:^0.17.0"
|
||||
mysql2: "npm:^3.0.1"
|
||||
newrelic: "npm:^9.11.0"
|
||||
newrelic: "npm:^10.0.0"
|
||||
reflect-metadata: "npm:^0.1.13"
|
||||
ts-jest: "npm:^29.0.3"
|
||||
typeorm: "npm:^0.3.10"
|
||||
@@ -3226,7 +3226,7 @@ __metadata:
|
||||
version: 0.0.0-use.local
|
||||
resolution: "@standardnotes/api-gateway@workspace:packages/api-gateway"
|
||||
dependencies:
|
||||
"@newrelic/winston-enricher": "npm:^4.0.0"
|
||||
"@newrelic/winston-enricher": "npm:^4.0.1"
|
||||
"@sentry/node": "npm:^7.28.1"
|
||||
"@standardnotes/domain-core": "workspace:^"
|
||||
"@standardnotes/domain-events": "workspace:*"
|
||||
@@ -3238,7 +3238,7 @@ __metadata:
|
||||
"@types/ioredis": "npm:^5.0.0"
|
||||
"@types/jest": "npm:^29.1.1"
|
||||
"@types/jsonwebtoken": "npm:^9.0.1"
|
||||
"@types/newrelic": "npm:^9.4.0"
|
||||
"@types/newrelic": "npm:^9.13.0"
|
||||
"@types/prettyjson": "npm:^0.0.30"
|
||||
"@typescript-eslint/eslint-plugin": "npm:^5.48.2"
|
||||
axios: "npm:^1.1.3"
|
||||
@@ -3254,7 +3254,7 @@ __metadata:
|
||||
ioredis: "npm:^5.2.4"
|
||||
jest: "npm:^29.1.2"
|
||||
jsonwebtoken: "npm:^9.0.0"
|
||||
newrelic: "npm:^9.11.0"
|
||||
newrelic: "npm:^10.0.0"
|
||||
nodemon: "npm:^2.0.19"
|
||||
npm-check-updates: "npm:^16.0.1"
|
||||
prettyjson: "npm:^1.2.5"
|
||||
@@ -3289,7 +3289,7 @@ __metadata:
|
||||
"@aws-sdk/client-sqs": "npm:^3.259.0"
|
||||
"@cbor-extract/cbor-extract-linux-arm64": "npm:^2.1.1"
|
||||
"@cbor-extract/cbor-extract-linux-x64": "npm:^2.1.1"
|
||||
"@newrelic/winston-enricher": "npm:^4.0.0"
|
||||
"@newrelic/winston-enricher": "npm:^4.0.1"
|
||||
"@sentry/node": "npm:^7.28.1"
|
||||
"@sentry/tracing": "npm:^7.28.1"
|
||||
"@simplewebauthn/server": "npm:^7.0.1"
|
||||
@@ -3299,7 +3299,7 @@ __metadata:
|
||||
"@standardnotes/domain-core": "workspace:^"
|
||||
"@standardnotes/domain-events": "workspace:*"
|
||||
"@standardnotes/domain-events-infra": "workspace:*"
|
||||
"@standardnotes/features": "npm:^1.58.9"
|
||||
"@standardnotes/features": "npm:^1.58.12"
|
||||
"@standardnotes/predicates": "workspace:*"
|
||||
"@standardnotes/responses": "npm:^1.13.9"
|
||||
"@standardnotes/security": "workspace:*"
|
||||
@@ -3312,7 +3312,7 @@ __metadata:
|
||||
"@types/express": "npm:^4.17.14"
|
||||
"@types/ioredis": "npm:^5.0.0"
|
||||
"@types/jest": "npm:^29.1.1"
|
||||
"@types/newrelic": "npm:^9.4.0"
|
||||
"@types/newrelic": "npm:^9.13.0"
|
||||
"@types/otplib": "npm:^10.0.0"
|
||||
"@types/prettyjson": "npm:^0.0.30"
|
||||
"@types/ua-parser-js": "npm:^0.7.36"
|
||||
@@ -3331,7 +3331,7 @@ __metadata:
|
||||
ioredis: "npm:^5.2.4"
|
||||
jest: "npm:^29.1.2"
|
||||
mysql2: "npm:^3.0.1"
|
||||
newrelic: "npm:^9.11.0"
|
||||
newrelic: "npm:^10.0.0"
|
||||
nodemon: "npm:^2.0.19"
|
||||
npm-check-updates: "npm:^16.0.1"
|
||||
otplib: "npm:12.0.1"
|
||||
@@ -3398,12 +3398,12 @@ __metadata:
|
||||
"@standardnotes/domain-events": "workspace:*"
|
||||
"@types/ioredis": "npm:^5.0.0"
|
||||
"@types/jest": "npm:^29.1.1"
|
||||
"@types/newrelic": "npm:^9.4.0"
|
||||
"@types/newrelic": "npm:^9.13.0"
|
||||
"@typescript-eslint/eslint-plugin": "npm:^5.48.2"
|
||||
eslint-plugin-prettier: "npm:^4.2.1"
|
||||
ioredis: "npm:^5.2.4"
|
||||
jest: "npm:^29.1.2"
|
||||
newrelic: "npm:^9.11.0"
|
||||
newrelic: "npm:^10.0.0"
|
||||
reflect-metadata: "npm:^0.1.13"
|
||||
sqs-consumer: "npm:^6.2.1"
|
||||
ts-jest: "npm:^29.0.3"
|
||||
@@ -3451,7 +3451,7 @@ __metadata:
|
||||
"@standardnotes/time": "workspace:*"
|
||||
"@types/ioredis": "npm:^5.0.0"
|
||||
"@types/jest": "npm:^29.1.1"
|
||||
"@types/newrelic": "npm:^9.4.0"
|
||||
"@types/newrelic": "npm:^9.13.0"
|
||||
"@types/nodemailer": "npm:^6.4.1"
|
||||
"@typescript-eslint/eslint-plugin": "npm:^5.48.2"
|
||||
dotenv: "npm:^16.0.1"
|
||||
@@ -3461,7 +3461,7 @@ __metadata:
|
||||
ioredis: "npm:^5.2.4"
|
||||
jest: "npm:^29.1.2"
|
||||
mysql2: "npm:^3.0.1"
|
||||
newrelic: "npm:^9.11.0"
|
||||
newrelic: "npm:^10.0.0"
|
||||
reflect-metadata: "npm:0.1.13"
|
||||
ts-jest: "npm:^29.0.3"
|
||||
typeorm: "npm:^0.3.10"
|
||||
@@ -3482,15 +3482,15 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@standardnotes/features@npm:^1.58.9":
|
||||
version: 1.58.9
|
||||
resolution: "@standardnotes/features@npm:1.58.9"
|
||||
"@standardnotes/features@npm:^1.58.12":
|
||||
version: 1.58.12
|
||||
resolution: "@standardnotes/features@npm:1.58.12"
|
||||
dependencies:
|
||||
"@standardnotes/common": "npm:^1.46.6"
|
||||
"@standardnotes/domain-core": "npm:^1.11.3"
|
||||
"@standardnotes/security": "npm:^1.7.6"
|
||||
reflect-metadata: "npm:^0.1.13"
|
||||
checksum: 218350ee55d2f920e26c4041e1e307655cf9e755b83c7fd2165be2222d95b40154c0d325a362cc84ce960ccf8c07c6d95c6a8558ddabf6ee335462cf6bd22508
|
||||
checksum: 3fcd9a948848cf6fe567390a7740222fd96d10b8a9bceeaf608befcd7e24ac7374e1c87ed51c12ab62a9ed6036b3c6da82c78ab58f6b0c3f0c3c9aaa2b7ffdfe
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
@@ -3516,7 +3516,7 @@ __metadata:
|
||||
"@types/ioredis": "npm:^5.0.0"
|
||||
"@types/jest": "npm:^29.1.1"
|
||||
"@types/jsonwebtoken": "npm:^9.0.1"
|
||||
"@types/newrelic": "npm:^9.4.0"
|
||||
"@types/newrelic": "npm:^9.13.0"
|
||||
"@types/prettyjson": "npm:^0.0.30"
|
||||
"@types/uuid": "npm:^8.3.0"
|
||||
"@typescript-eslint/eslint-plugin": "npm:^5.48.2"
|
||||
@@ -3535,7 +3535,7 @@ __metadata:
|
||||
ioredis: "npm:^5.2.4"
|
||||
jest: "npm:^29.1.2"
|
||||
jsonwebtoken: "npm:^9.0.0"
|
||||
newrelic: "npm:^9.11.0"
|
||||
newrelic: "npm:^10.0.0"
|
||||
nodemon: "npm:^2.0.19"
|
||||
npm-check-updates: "npm:^16.0.1"
|
||||
prettyjson: "npm:^1.2.5"
|
||||
@@ -3592,7 +3592,7 @@ __metadata:
|
||||
dependencies:
|
||||
"@aws-sdk/client-s3": "npm:^3.259.0"
|
||||
"@aws-sdk/client-sqs": "npm:^3.259.0"
|
||||
"@newrelic/winston-enricher": "npm:^4.0.0"
|
||||
"@newrelic/winston-enricher": "npm:^4.0.1"
|
||||
"@sentry/node": "npm:^7.28.1"
|
||||
"@standardnotes/api": "npm:^1.25.3"
|
||||
"@standardnotes/common": "workspace:^"
|
||||
@@ -3607,7 +3607,7 @@ __metadata:
|
||||
"@types/express": "npm:^4.17.14"
|
||||
"@types/inversify-express-utils": "npm:^2.0.0"
|
||||
"@types/jest": "npm:^29.1.1"
|
||||
"@types/newrelic": "npm:^9.4.0"
|
||||
"@types/newrelic": "npm:^9.13.0"
|
||||
"@typescript-eslint/eslint-plugin": "npm:^5.48.2"
|
||||
cors: "npm:2.8.5"
|
||||
dotenv: "npm:^16.0.1"
|
||||
@@ -3618,7 +3618,7 @@ __metadata:
|
||||
inversify-express-utils: "npm:^6.4.3"
|
||||
jest: "npm:^29.1.2"
|
||||
mysql2: "npm:^3.0.1"
|
||||
newrelic: "npm:^9.11.0"
|
||||
newrelic: "npm:^10.0.0"
|
||||
npm-check-updates: "npm:^16.0.1"
|
||||
reflect-metadata: "npm:0.1.13"
|
||||
ts-jest: "npm:^29.0.3"
|
||||
@@ -3634,7 +3634,7 @@ __metadata:
|
||||
dependencies:
|
||||
"@aws-sdk/client-sns": "npm:^3.259.0"
|
||||
"@aws-sdk/client-sqs": "npm:^3.259.0"
|
||||
"@newrelic/winston-enricher": "npm:^4.0.0"
|
||||
"@newrelic/winston-enricher": "npm:^4.0.1"
|
||||
"@sentry/node": "npm:^7.28.1"
|
||||
"@standardnotes/domain-core": "workspace:^"
|
||||
"@standardnotes/domain-events": "workspace:*"
|
||||
@@ -3643,7 +3643,7 @@ __metadata:
|
||||
"@standardnotes/time": "workspace:*"
|
||||
"@types/ioredis": "npm:^5.0.0"
|
||||
"@types/jest": "npm:^29.1.1"
|
||||
"@types/newrelic": "npm:^9.4.0"
|
||||
"@types/newrelic": "npm:^9.13.0"
|
||||
"@types/node": "npm:^18.11.9"
|
||||
"@typescript-eslint/eslint-plugin": "npm:^5.48.2"
|
||||
dayjs: "npm:^1.11.6"
|
||||
@@ -3654,7 +3654,7 @@ __metadata:
|
||||
ioredis: "npm:^5.2.4"
|
||||
jest: "npm:^29.1.2"
|
||||
mysql2: "npm:^3.0.1"
|
||||
newrelic: "npm:^9.11.0"
|
||||
newrelic: "npm:^10.0.0"
|
||||
npm-check-updates: "npm:^16.0.1"
|
||||
reflect-metadata: "npm:^0.1.13"
|
||||
ts-jest: "npm:^29.0.3"
|
||||
@@ -3691,13 +3691,13 @@ __metadata:
|
||||
"@lerna-lite/run": "npm:^1.5.1"
|
||||
"@sentry/node": "npm:^7.28.1"
|
||||
"@types/jest": "npm:^29.1.1"
|
||||
"@types/newrelic": "npm:^9.4.0"
|
||||
"@types/newrelic": "npm:^9.13.0"
|
||||
"@types/node": "npm:^18.11.9"
|
||||
"@typescript-eslint/parser": "npm:^5.40.1"
|
||||
eslint: "npm:^8.32.0"
|
||||
eslint-config-prettier: "npm:^8.6.0"
|
||||
ini: "npm:^3.0.0"
|
||||
newrelic: "npm:^9.11.0"
|
||||
newrelic: "npm:^10.0.0"
|
||||
npm-check-updates: "npm:^16.0.1"
|
||||
prettier: "npm:^2.7.1"
|
||||
ts-node: "npm:^10.9.1"
|
||||
@@ -3760,7 +3760,7 @@ __metadata:
|
||||
"@aws-sdk/client-s3": "npm:^3.259.0"
|
||||
"@aws-sdk/client-sns": "npm:^3.259.0"
|
||||
"@aws-sdk/client-sqs": "npm:^3.259.0"
|
||||
"@newrelic/winston-enricher": "npm:^4.0.0"
|
||||
"@newrelic/winston-enricher": "npm:^4.0.1"
|
||||
"@sentry/node": "npm:^7.28.1"
|
||||
"@sentry/tracing": "npm:^7.28.1"
|
||||
"@standardnotes/api": "npm:^1.25.3"
|
||||
@@ -3778,7 +3778,7 @@ __metadata:
|
||||
"@types/inversify-express-utils": "npm:^2.0.0"
|
||||
"@types/jest": "npm:^29.1.1"
|
||||
"@types/jsonwebtoken": "npm:^9.0.1"
|
||||
"@types/newrelic": "npm:^9.4.0"
|
||||
"@types/newrelic": "npm:^9.13.0"
|
||||
"@types/prettyjson": "npm:^0.0.30"
|
||||
"@types/ua-parser-js": "npm:^0.7.36"
|
||||
"@types/uuid": "npm:^8.3.0"
|
||||
@@ -3795,7 +3795,7 @@ __metadata:
|
||||
jest: "npm:^29.1.2"
|
||||
jsonwebtoken: "npm:^9.0.0"
|
||||
mysql2: "npm:^3.0.1"
|
||||
newrelic: "npm:^9.11.0"
|
||||
newrelic: "npm:^10.0.0"
|
||||
nodemon: "npm:^2.0.19"
|
||||
npm-check-updates: "npm:^16.0.1"
|
||||
prettyjson: "npm:^1.2.5"
|
||||
@@ -3855,7 +3855,7 @@ __metadata:
|
||||
resolution: "@standardnotes/websockets-server@workspace:packages/websockets"
|
||||
dependencies:
|
||||
"@aws-sdk/client-sqs": "npm:^3.259.0"
|
||||
"@newrelic/winston-enricher": "npm:^4.0.0"
|
||||
"@newrelic/winston-enricher": "npm:^4.0.1"
|
||||
"@sentry/node": "npm:^7.28.1"
|
||||
"@standardnotes/api": "npm:^1.25.3"
|
||||
"@standardnotes/common": "workspace:^"
|
||||
@@ -3869,7 +3869,7 @@ __metadata:
|
||||
"@types/express": "npm:^4.17.14"
|
||||
"@types/ioredis": "npm:^5.0.0"
|
||||
"@types/jest": "npm:^29.1.1"
|
||||
"@types/newrelic": "npm:^9.4.0"
|
||||
"@types/newrelic": "npm:^9.13.0"
|
||||
"@typescript-eslint/eslint-plugin": "npm:^5.48.2"
|
||||
axios: "npm:^1.1.3"
|
||||
cors: "npm:2.8.5"
|
||||
@@ -3882,7 +3882,7 @@ __metadata:
|
||||
ioredis: "npm:^5.2.4"
|
||||
jest: "npm:^29.1.2"
|
||||
mysql2: "npm:^3.0.1"
|
||||
newrelic: "npm:^9.11.0"
|
||||
newrelic: "npm:^10.0.0"
|
||||
reflect-metadata: "npm:0.1.13"
|
||||
ts-jest: "npm:^29.0.3"
|
||||
typeorm: "npm:^0.3.10"
|
||||
@@ -4216,10 +4216,10 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@types/newrelic@npm:^9.4.0":
|
||||
version: 9.4.0
|
||||
resolution: "@types/newrelic@npm:9.4.0"
|
||||
checksum: adb12973e86078be8b49f75cae9bf26d5f344a85df76a69cf73ad24b529e53ab43c66fd5d4f973382be09146be8d1407f2a9c388310415a6464d6d182fbecba1
|
||||
"@types/newrelic@npm:^9.13.0":
|
||||
version: 9.13.0
|
||||
resolution: "@types/newrelic@npm:9.13.0"
|
||||
checksum: d0269b05c43b48756b0ff10e09d312cb22871b74dbc64ac85e0dfbd1a5cd81f15235ea47c02ba319e7d9e219db0629ef0474c0696961406faff43844c748920f
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
@@ -9400,12 +9400,12 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"newrelic@npm:^9.11.0":
|
||||
version: 9.11.0
|
||||
resolution: "newrelic@npm:9.11.0"
|
||||
"newrelic@npm:^10.0.0":
|
||||
version: 10.0.0
|
||||
resolution: "newrelic@npm:10.0.0"
|
||||
dependencies:
|
||||
"@contrast/fn-inspect": "npm:^3.3.0"
|
||||
"@grpc/grpc-js": "npm:^1.8.8"
|
||||
"@grpc/grpc-js": "npm:^1.8.10"
|
||||
"@grpc/proto-loader": "npm:^0.7.5"
|
||||
"@newrelic/aws-sdk": "npm:^5.0.2"
|
||||
"@newrelic/koa": "npm:^7.1.1"
|
||||
@@ -9416,7 +9416,7 @@ __metadata:
|
||||
https-proxy-agent: "npm:^5.0.0"
|
||||
json-bigint: "npm:^1.0.0"
|
||||
json-stringify-safe: "npm:^5.0.0"
|
||||
readable-stream: "npm:^3.6.0"
|
||||
readable-stream: "npm:^3.6.1"
|
||||
semver: "npm:^5.3.0"
|
||||
winston-transport: "npm:^4.5.0"
|
||||
dependenciesMeta:
|
||||
@@ -9426,7 +9426,7 @@ __metadata:
|
||||
optional: true
|
||||
bin:
|
||||
newrelic-naming-rules: bin/test-naming-rules.js
|
||||
checksum: fd1ec1b30799f56632130100a84d90ebcf2ebdb0ded4432bc3b4d71fa3b801c48284eebce814ef32fc31510f1fca4b43676d1de63ed7d6ca00bd8cbc8f6b2f98
|
||||
checksum: b5af478708807fde3be9bd0a621421bd06210e84543b7b097640965ba4c2b28920adb36fe86b2923b76abc66d8ade9935b5d9c9a8ce882e03e8698c47971ce18
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
@@ -10629,6 +10629,17 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"readable-stream@npm:^3.6.1":
|
||||
version: 3.6.2
|
||||
resolution: "readable-stream@npm:3.6.2"
|
||||
dependencies:
|
||||
inherits: "npm:^2.0.3"
|
||||
string_decoder: "npm:^1.1.1"
|
||||
util-deprecate: "npm:^1.0.1"
|
||||
checksum: b1cbe0fea6b407fc75bfbe4f6c54d48899e638d54a8a1207b5040c60566dd5f65059b32c3edf0ac0ce621ea46929b3337e8a19410870eff98b8be5a3ba543b7a
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"readable-stream@npm:~2.3.6":
|
||||
version: 2.3.7
|
||||
resolution: "readable-stream@npm:2.3.7"
|
||||
|
||||
Reference in New Issue
Block a user