Compare commits
17 Commits
hierarch-d
...
addCustomR
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b22915b6e7 | ||
|
|
6fb46a0ad7 | ||
|
|
6ee42326a7 | ||
|
|
e790d89065 | ||
|
|
94dd9620e4 | ||
|
|
1672c8d914 | ||
|
|
0132241c43 | ||
|
|
d1619cfa4d | ||
|
|
f844a39069 | ||
|
|
b60e02bb22 | ||
|
|
07ffdedace | ||
|
|
3554674d8e | ||
|
|
45e9c132a9 | ||
|
|
e9a81ad2a8 | ||
|
|
2389924403 | ||
|
|
b733f8333c | ||
|
|
4fa96203cb |
15
.eslint/index.js
Normal file
15
.eslint/index.js
Normal file
@@ -0,0 +1,15 @@
|
||||
const cds = require("@sap/eslint-plugin-cds");
|
||||
|
||||
module.exports = {
|
||||
configs: {
|
||||
recommended: {
|
||||
plugins: ["cloud-cap-samples"],
|
||||
rules: {
|
||||
"cloud-cap-samples/no-open-services": ["error", "show"]
|
||||
}
|
||||
}
|
||||
},
|
||||
rules: {
|
||||
"no-open-services": cds.createRule(require("./rules/no-open-services")),
|
||||
}
|
||||
};
|
||||
5
.eslint/package.json
Normal file
5
.eslint/package.json
Normal file
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"name": "eslint-plugin-cloud-cap-samples",
|
||||
"description": "Contains shareable custom lint rules for this repository",
|
||||
"version": "1.0.0"
|
||||
}
|
||||
29
.eslint/rules/no-open-services.js
Normal file
29
.eslint/rules/no-open-services.js
Normal file
@@ -0,0 +1,29 @@
|
||||
module.exports = {
|
||||
meta: {
|
||||
docs: {
|
||||
description: "Service without `@requires/restrict` should not expose fields with personal data.",
|
||||
version: "1.0.0"
|
||||
},
|
||||
fixable: "code",
|
||||
model: "inferred"
|
||||
},
|
||||
create: function (context) {
|
||||
const services = context.getModel() ? context.getModel().services : [];
|
||||
const unprotectedServices = services.filter(s => !s["@requires"] && !s["@restrict"]).map(s => s.name)
|
||||
return { entity: checkForExposedFields };
|
||||
|
||||
function checkForExposedFields(entity) {
|
||||
const entityInUnprotectedService = unprotectedServices.some(service => entity.name.includes(service))
|
||||
if (entityInUnprotectedService) {
|
||||
const elements = Object.keys(entity.elements).filter((name) => ["createdBy", "modifiedBy"].includes(name))
|
||||
for (let element of elements) {
|
||||
context.report({
|
||||
message: `Field '${element}' in '${entity.name}' exposes personal data. Remove field or add \`@restrict/requires\`.`,
|
||||
node: context.getNode(entity),
|
||||
file: entity.$location.file
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,11 @@
|
||||
{
|
||||
"extends": [
|
||||
"eslint:recommended",
|
||||
"plugin:@sap/cds/recommended"
|
||||
"plugin:@sap/cds/recommended",
|
||||
"plugin:cloud-cap-samples/recommended"
|
||||
],
|
||||
"plugins": [
|
||||
"cloud-cap-samples"
|
||||
],
|
||||
"env": {
|
||||
"browser": true,
|
||||
@@ -23,7 +27,7 @@
|
||||
"rules": {
|
||||
"no-console": "off",
|
||||
"require-atomic-updates": "off",
|
||||
"require-await":"warn",
|
||||
"require-await": "warn",
|
||||
"no-unused-vars": ["warn", { "argsIgnorePattern": "_" }]
|
||||
}
|
||||
}
|
||||
|
||||
2
.vscode/settings.json
vendored
2
.vscode/settings.json
vendored
@@ -24,4 +24,4 @@
|
||||
"tsv",
|
||||
"tab"
|
||||
],
|
||||
}
|
||||
}
|
||||
|
||||
865
package-lock.json
generated
865
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -24,8 +24,11 @@
|
||||
"chai": "^4.3.4",
|
||||
"chai-as-promised": "^7.1.1",
|
||||
"chai-subset": "^1.6.0",
|
||||
"eslint": "^8.9",
|
||||
"semver": "^7",
|
||||
"sqlite3": "^5"
|
||||
"sqlite3": "^5",
|
||||
"@sap/eslint-plugin-cds": "^2.6.0",
|
||||
"eslint-plugin-cloud-cap-samples": "file:.eslint"
|
||||
},
|
||||
"scripts": {
|
||||
"cleanup": "rm -rf node_modules && rm -rf */node_modules && rm -rf */*/node_modules",
|
||||
|
||||
Reference in New Issue
Block a user