diff --git a/bookstore/mta.yaml b/bookstore/mta.yaml new file mode 100644 index 00000000..dddfc701 --- /dev/null +++ b/bookstore/mta.yaml @@ -0,0 +1,43 @@ +_schema-version: '3.1' +ID: capire.bookstore +version: 1.0.0 +description: "A simple CAP project." +parameters: + enable-parallel-deployments: true +build-parameters: + before-all: + - builder: custom + commands: + - npm ci + - npx cds build --production +modules: + - name: bookstore-srv + type: nodejs + path: gen/srv + parameters: + buildpack: nodejs_buildpack + readiness-health-check-type: http + readiness-health-check-http-endpoint: /health + build-parameters: + builder: npm + provides: + - name: srv-api # required by consumers of CAP services (e.g. approuter) + properties: + srv-url: ${default-url} + requires: + - name: bookstore-destination + - name: bookstore-messaging + - name: samples-db + +resources: + - name: bookstore-destination + type: org.cloudfoundry.managed-service + parameters: + service: destination + service-plan: lite + - name: bookstore-messaging + type: org.cloudfoundry.managed-service + parameters: + service: enterprise-messaging + service-plan: default + path: ./event-mesh.json \ No newline at end of file diff --git a/bookstore/package.json b/bookstore/package.json index 7802fcef..ccc7a2bf 100644 --- a/bookstore/package.json +++ b/bookstore/package.json @@ -21,14 +21,25 @@ "model": "@capire/orders" }, "messaging": { - "[development]": { "kind": "file-based-messaging" }, - "[hybrid]": { "kind": "enterprise-messaging-shared" }, - "[production]": { "kind": "enterprise-messaging" } + "[development]": { + "kind": "file-based-messaging" + }, + "[hybrid]": { + "kind": "enterprise-messaging-shared" + }, + "[production]": { + "kind": "enterprise-messaging" + } }, "db": { "kind": "sql" } }, - "log": { "service": true } + "log": { + "service": true + } + }, + "devDependencies": { + "@sap/cds-dk": "^7" } -} \ No newline at end of file +} diff --git a/fiori/app/router/package.json b/fiori/app/router/package.json new file mode 100644 index 00000000..81c077a0 --- /dev/null +++ b/fiori/app/router/package.json @@ -0,0 +1,12 @@ +{ + "name": "approuter", + "dependencies": { + "@sap/approuter": "^16.0.0" + }, + "engines": { + "node": "^20.0.0" + }, + "scripts": { + "start": "node node_modules/@sap/approuter/approuter.js" + } +} diff --git a/fiori/app/router/xs-app.json b/fiori/app/router/xs-app.json new file mode 100644 index 00000000..e84d6ab4 --- /dev/null +++ b/fiori/app/router/xs-app.json @@ -0,0 +1,22 @@ +{ + "welcomeFile": "app/index.html", + "routes": [ + { + "source": "^/app/(.*)$", + "target": "$1", + "localDir": ".", + "cacheControl": "no-cache, no-store, must-revalidate" + }, + { + "source": "^/appconfig/", + "localDir": ".", + "cacheControl": "no-cache, no-store, must-revalidate" + }, + { + "source": "^/(.*)$", + "target": "$1", + "destination": "srv-api", + "csrfProtection": true + } + ] +} diff --git a/fiori/mta.yaml b/fiori/mta.yaml new file mode 100644 index 00000000..b8c7f93f --- /dev/null +++ b/fiori/mta.yaml @@ -0,0 +1,69 @@ +_schema-version: '3.1' +ID: capire.fiori +version: 1.0.0 +description: "A simple CAP project." +parameters: + enable-parallel-deployments: true +build-parameters: + before-all: + - builder: custom + commands: + - npm ci + - npx cds build --production +modules: + - name: fiori-srv + type: nodejs + path: gen/srv + parameters: + buildpack: nodejs_buildpack + readiness-health-check-type: http + readiness-health-check-http-endpoint: /health + build-parameters: + builder: npm + provides: + - name: srv-api # required by consumers of CAP services (e.g. approuter) + properties: + srv-url: ${default-url} + requires: + - name: fiori-auth + - name: fiori-destination + - name: fiori-messaging + - name: samples-db + + - name: fiori + type: approuter.nodejs + path: app/router + parameters: + keep-existing-routes: true + disk-quota: 256M + memory: 256M + requires: + - name: srv-api + group: destinations + properties: + name: srv-api # must be used in xs-app.json as well + url: ~{srv-url} + forwardAuthToken: true + - name: fiori-auth + +resources: + - name: fiori-auth + type: org.cloudfoundry.managed-service + parameters: + service: xsuaa + service-plan: application + path: ./xs-security.json + config: + xsappname: fiori-${org}-${space} + tenant-mode: dedicated + - name: fiori-destination + type: org.cloudfoundry.managed-service + parameters: + service: destination + service-plan: lite + - name: fiori-messaging + type: org.cloudfoundry.managed-service + parameters: + service: enterprise-messaging + service-plan: default + path: ./event-mesh.json \ No newline at end of file diff --git a/fiori/package.json b/fiori/package.json index 85a56ab9..90b7b5df 100644 --- a/fiori/package.json +++ b/fiori/package.json @@ -5,10 +5,12 @@ "@capire/bookstore": "*", "@sap/cds": ">=5", "@cap-js-community/odata-v2-adapter": "^1", - "express": "^4.17.1" + "express": "^4.17.1", + "@sap/xssec": "^3" }, "devDependencies": { - "@cap-js/sqlite": "^1" + "@cap-js/sqlite": "^1", + "@sap/cds-dk": "^7" }, "scripts": { "start": "cds-serve", @@ -45,7 +47,8 @@ "[production]": { "model": "db/hana" } - } + }, + "auth": "xsuaa" }, "hana": { "deploy-format": "hdbtable" diff --git a/fiori/xs-security.json b/fiori/xs-security.json new file mode 100644 index 00000000..8429ba54 --- /dev/null +++ b/fiori/xs-security.json @@ -0,0 +1,22 @@ +{ + "scopes": [ + { + "name": "$XSAPPNAME.emcallback", + "description": "Enterprise-Messaging Callback Access", + "grant-as-authority-to-apps": [ + "$XSSERVICENAME(fiori-messaging)" + ] + }, + { + "name": "$XSAPPNAME.emmanagement", + "description": "Enterprise-Messaging Management Access" + } + ], + "attributes": [], + "role-templates": [], + "authorities-inheritance": false, + "authorities": [ + "$XSAPPNAME.emmanagement", + "$XSAPPNAME.mtcallback" + ] +} diff --git a/mta.yaml b/mta.yaml new file mode 100644 index 00000000..f2437f4d --- /dev/null +++ b/mta.yaml @@ -0,0 +1,27 @@ +_schema-version: '3.1' +ID: capire.samples +version: 2.0.0 +description: "A monorepo with several samples for CAP." +parameters: + enable-parallel-deployments: true +build-parameters: + before-all: + - builder: custom + commands: + - npm ci + - npx cds build --production --ws +modules: + - name: samples-db-deployer + type: hdb + path: gen/db + parameters: + buildpack: nodejs_buildpack + requires: + - name: samples-db + +resources: + - name: samples-db + type: com.sap.xs.hdi-container + parameters: + service: hana + service-plan: hdi-shared diff --git a/orders/app/router/package.json b/orders/app/router/package.json new file mode 100644 index 00000000..81c077a0 --- /dev/null +++ b/orders/app/router/package.json @@ -0,0 +1,12 @@ +{ + "name": "approuter", + "dependencies": { + "@sap/approuter": "^16.0.0" + }, + "engines": { + "node": "^20.0.0" + }, + "scripts": { + "start": "node node_modules/@sap/approuter/approuter.js" + } +} diff --git a/orders/app/router/xs-app.json b/orders/app/router/xs-app.json new file mode 100644 index 00000000..e84d6ab4 --- /dev/null +++ b/orders/app/router/xs-app.json @@ -0,0 +1,22 @@ +{ + "welcomeFile": "app/index.html", + "routes": [ + { + "source": "^/app/(.*)$", + "target": "$1", + "localDir": ".", + "cacheControl": "no-cache, no-store, must-revalidate" + }, + { + "source": "^/appconfig/", + "localDir": ".", + "cacheControl": "no-cache, no-store, must-revalidate" + }, + { + "source": "^/(.*)$", + "target": "$1", + "destination": "srv-api", + "csrfProtection": true + } + ] +} diff --git a/orders/mta.yaml b/orders/mta.yaml new file mode 100644 index 00000000..641d40e2 --- /dev/null +++ b/orders/mta.yaml @@ -0,0 +1,55 @@ +_schema-version: '3.1' +ID: capire.orders +version: 1.0.0 +description: "A simple CAP project." +parameters: + enable-parallel-deployments: true +build-parameters: + before-all: + - builder: custom + commands: + - npm ci + - npx cds build --production +modules: + - name: orders-srv + type: nodejs + path: gen/srv + parameters: + buildpack: nodejs_buildpack + readiness-health-check-type: http + readiness-health-check-http-endpoint: /health + build-parameters: + builder: npm + provides: + - name: srv-api # required by consumers of CAP services (e.g. approuter) + properties: + srv-url: ${default-url} + requires: + - name: orders-auth + + - name: orders + type: approuter.nodejs + path: app/router + parameters: + keep-existing-routes: true + disk-quota: 256M + memory: 256M + requires: + - name: srv-api + group: destinations + properties: + name: srv-api # must be used in xs-app.json as well + url: ~{srv-url} + forwardAuthToken: true + - name: orders-auth + +resources: + - name: orders-auth + type: org.cloudfoundry.managed-service + parameters: + service: xsuaa + service-plan: application + path: ./xs-security.json + config: + xsappname: orders-${org}-${space} + tenant-mode: dedicated diff --git a/orders/package.json b/orders/package.json index 2685aa44..7c1d58c0 100644 --- a/orders/package.json +++ b/orders/package.json @@ -3,6 +3,15 @@ "version": "1.0.0", "dependencies": { "@capire/common": "*", - "@sap/cds": ">=5" + "@sap/cds": ">=5", + "@sap/xssec": "^3" + }, + "cds": { + "requires": { + "auth": "xsuaa" + } + }, + "devDependencies": { + "@sap/cds-dk": "^7" } -} \ No newline at end of file +} diff --git a/orders/xs-security.json b/orders/xs-security.json new file mode 100644 index 00000000..c666101c --- /dev/null +++ b/orders/xs-security.json @@ -0,0 +1,5 @@ +{ + "scopes": [], + "attributes": [], + "role-templates": [] +} diff --git a/package-lock.json b/package-lock.json index 6d4c4de0..080e8aba 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,6 +21,7 @@ "./reviews" ], "dependencies": { + "@sap-cloud-sdk/resilience": "^3.14.0", "@sap/cds": ">=7" }, "devDependencies": { @@ -393,6 +394,24 @@ "resolved": "reviews", "link": true }, + "node_modules/@colors/colors": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", + "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@dabh/diagnostics": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", + "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", + "dependencies": { + "colorspace": "1.1.x", + "enabled": "2.0.x", + "kuler": "^2.0.0" + } + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -568,6 +587,30 @@ "node": ">= 8" } }, + "node_modules/@sap-cloud-sdk/resilience": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/@sap-cloud-sdk/resilience/-/resilience-3.14.0.tgz", + "integrity": "sha512-VBgeNkAvW9J8duNORsRl55DoRPIrCuXxDRYEdAm7jBEooYZw/SRdPo0ufM3uSzLGSo76kPO3iHIDPROjr15tAg==", + "dependencies": { + "@sap-cloud-sdk/util": "^3.14.0", + "async-retry": "^1.3.3", + "axios": "^1.6.8", + "opossum": "^8.1.3" + } + }, + "node_modules/@sap-cloud-sdk/util": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/@sap-cloud-sdk/util/-/util-3.14.0.tgz", + "integrity": "sha512-yfnun4RkXd/YrKG+quv/nRJrsRDTtHomjVd2AIOxdR3XxdZ53lst3c9zuZUOGL4BkbJ1eSeQZ11GDauzln8mPQ==", + "dependencies": { + "axios": "^1.6.8", + "chalk": "^4.1.0", + "logform": "^2.6.0", + "voca": "^1.4.1", + "winston": "^3.13.0", + "winston-transport": "^4.7.0" + } + }, "node_modules/@sap/cds": { "version": "7.8.1", "resolved": "https://registry.npmjs.org/@sap/cds/-/cds-7.8.1.tgz", @@ -703,6 +746,11 @@ "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", "dev": true }, + "node_modules/@types/triple-beam": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", + "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==" + }, "node_modules/@types/yargs": { "version": "17.0.31", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.31.tgz", @@ -791,7 +839,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -831,17 +878,28 @@ "node": "*" } }, + "node_modules/async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" + }, + "node_modules/async-retry": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", + "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", + "dependencies": { + "retry": "0.13.1" + } + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/axios": { "version": "1.6.8", "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", - "dev": true, "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -1116,7 +1174,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -1161,11 +1218,19 @@ "node": ">=8" } }, + "node_modules/color": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "dependencies": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -1176,14 +1241,43 @@ "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/color/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/colorspace": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", + "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", + "dependencies": { + "color": "^3.1.3", + "text-hex": "1.0.x" + } }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, "dependencies": { "delayed-stream": "~1.0.0" }, @@ -1323,7 +1417,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, "engines": { "node": ">=0.4.0" } @@ -1381,6 +1474,11 @@ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, + "node_modules/enabled": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" + }, "node_modules/encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", @@ -1700,6 +1798,11 @@ "reusify": "^1.0.4" } }, + "node_modules/fecha": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" + }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -1799,6 +1902,11 @@ "dev": true, "peer": true }, + "node_modules/fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" + }, "node_modules/follow-redirects": { "version": "1.15.6", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", @@ -1822,7 +1930,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -1984,7 +2091,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "engines": { "node": ">=8" } @@ -2182,6 +2288,11 @@ "node": ">= 0.10" } }, + "node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -2230,6 +2341,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -2363,6 +2485,11 @@ "json-buffer": "3.0.1" } }, + "node_modules/kuler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -2400,6 +2527,22 @@ "dev": true, "peer": true }, + "node_modules/logform": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.6.0.tgz", + "integrity": "sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ==", + "dependencies": { + "@colors/colors": "1.6.0", + "@types/triple-beam": "^1.3.2", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, "node_modules/lokijs": { "version": "1.5.12", "resolved": "https://registry.npmjs.org/lokijs/-/lokijs-1.5.12.tgz", @@ -2532,9 +2675,7 @@ "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true, - "peer": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/napi-build-utils": { "version": "1.0.2", @@ -2597,6 +2738,22 @@ "wrappy": "1" } }, + "node_modules/one-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "dependencies": { + "fn.name": "1.x.x" + } + }, + "node_modules/opossum": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/opossum/-/opossum-8.1.3.tgz", + "integrity": "sha512-6YPGEVdjO5F5q0Nj5cDpXGlobfj4jXdrPJbA19iIVXV/yshgqdH44eX25rmQcJp90vUg4uyO1IlZLom2HsIyyA==", + "engines": { + "node": "^21 || ^20 || ^18 || ^16" + } + }, "node_modules/optionator": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", @@ -2800,8 +2957,7 @@ "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, "node_modules/pump": { "version": "3.0.0", @@ -2914,7 +3070,6 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -2939,6 +3094,14 @@ "node": ">=4" } }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "engines": { + "node": ">= 4" + } + }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -3009,6 +3172,14 @@ } ] }, + "node_modules/safe-stable-stringify": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", + "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", + "engines": { + "node": ">=10" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -3189,6 +3360,14 @@ "simple-concat": "^1.0.0" } }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -3198,6 +3377,14 @@ "node": ">=8" } }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "engines": { + "node": "*" + } + }, "node_modules/stack-utils": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", @@ -3239,7 +3426,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, "dependencies": { "safe-buffer": "~5.2.0" } @@ -3274,7 +3460,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -3310,6 +3495,11 @@ "node": ">=6" } }, + "node_modules/text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -3336,6 +3526,14 @@ "node": ">=0.6" } }, + "node_modules/triple-beam": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", + "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", + "engines": { + "node": ">= 14.0.0" + } + }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -3434,8 +3632,7 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/utils-merge": { "version": "1.0.1", @@ -3453,6 +3650,11 @@ "node": ">= 0.8" } }, + "node_modules/voca": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/voca/-/voca-1.4.1.tgz", + "integrity": "sha512-NJC/BzESaHT1p4B5k4JykxedeltmNbau4cummStd4RjFojgq/kLew5TzYge9N2geeWyI2w8T30wUET5v+F7ZHA==" + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -3469,6 +3671,40 @@ "node": ">= 8" } }, + "node_modules/winston": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.13.0.tgz", + "integrity": "sha512-rwidmA1w3SE4j0E5MuIufFhyJPBDG7Nu71RkZor1p2+qHvJSZ9GYDA81AyleQcZbh/+V6HjeBdfnTZJm9rSeQQ==", + "dependencies": { + "@colors/colors": "^1.6.0", + "@dabh/diagnostics": "^2.0.2", + "async": "^3.2.3", + "is-stream": "^2.0.0", + "logform": "^2.4.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "safe-stable-stringify": "^2.3.1", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.7.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/winston-transport": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.7.0.tgz", + "integrity": "sha512-ajBj65K5I7denzer2IYW6+2bNIVqLGDHqDw3Ow8Ohh+vdW+rv4MZ6eiDvHoKhfJFZ2auyN8byXieDDJ96ViONg==", + "dependencies": { + "logform": "^2.3.2", + "readable-stream": "^3.6.0", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", diff --git a/package.json b/package.json index 6a8fe5f7..068c8cbe 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,7 @@ "repository": "https://github.com/sap-samples/cloud-cap-samples.git", "author": "daniel.hutzel@sap.com", "dependencies": { + "@sap-cloud-sdk/resilience": "^3.14.0", "@sap/cds": ">=7" }, "workspaces": [ @@ -21,6 +22,7 @@ ], "devDependencies": { "@cap-js/sqlite": "^1", + "@sap/cds-dk": "^7", "@sap/eslint-plugin-cds": "^2.6.1", "axios": "^1", "chai": "^4.3.4",