@vannizhang/living-atlas-content-validator 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +101 -0
- package/README.md +196 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/accessInformation/isValidAccessInformation.d.ts +10 -0
- package/dist/lib/accessInformation/isValidAccessInformation.js +48 -0
- package/dist/lib/accessInformation/isValidAccessInformation.js.map +1 -0
- package/dist/lib/accessInformation/scoringRulesConfig.d.ts +3 -0
- package/dist/lib/accessInformation/scoringRulesConfig.js +37 -0
- package/dist/lib/accessInformation/scoringRulesConfig.js.map +1 -0
- package/dist/lib/config.d.ts +6 -0
- package/dist/lib/config.js +61 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/description/isValidDescription.d.ts +18 -0
- package/dist/lib/description/isValidDescription.js +95 -0
- package/dist/lib/description/isValidDescription.js.map +1 -0
- package/dist/lib/description/scoringRulesConfig.d.ts +3 -0
- package/dist/lib/description/scoringRulesConfig.js +49 -0
- package/dist/lib/description/scoringRulesConfig.js.map +1 -0
- package/dist/lib/layers/isValidLayerCount.d.ts +12 -0
- package/dist/lib/layers/isValidLayerCount.js +148 -0
- package/dist/lib/layers/isValidLayerCount.js.map +1 -0
- package/dist/lib/layers/scoringRulesConfig.d.ts +3 -0
- package/dist/lib/layers/scoringRulesConfig.js +49 -0
- package/dist/lib/layers/scoringRulesConfig.js.map +1 -0
- package/dist/lib/licenseInfo/isValidLicenseInfo.d.ts +36 -0
- package/dist/lib/licenseInfo/isValidLicenseInfo.js +108 -0
- package/dist/lib/licenseInfo/isValidLicenseInfo.js.map +1 -0
- package/dist/lib/licenseInfo/scoringRulesConfig.d.ts +3 -0
- package/dist/lib/licenseInfo/scoringRulesConfig.js +49 -0
- package/dist/lib/licenseInfo/scoringRulesConfig.js.map +1 -0
- package/dist/lib/sharing/isValidAccess.d.ts +22 -0
- package/dist/lib/sharing/isValidAccess.js +79 -0
- package/dist/lib/sharing/isValidAccess.js.map +1 -0
- package/dist/lib/sharing/scoringRulesConfig.d.ts +3 -0
- package/dist/lib/sharing/scoringRulesConfig.js +49 -0
- package/dist/lib/sharing/scoringRulesConfig.js.map +1 -0
- package/dist/lib/ssl/isValidSSL.d.ts +14 -0
- package/dist/lib/ssl/isValidSSL.js +62 -0
- package/dist/lib/ssl/isValidSSL.js.map +1 -0
- package/dist/lib/ssl/scoringRulesConfig.d.ts +3 -0
- package/dist/lib/ssl/scoringRulesConfig.js +43 -0
- package/dist/lib/ssl/scoringRulesConfig.js.map +1 -0
- package/dist/lib/summary/isValidSummary.d.ts +17 -0
- package/dist/lib/summary/isValidSummary.js +114 -0
- package/dist/lib/summary/isValidSummary.js.map +1 -0
- package/dist/lib/summary/scoringRulesConfig.d.ts +3 -0
- package/dist/lib/summary/scoringRulesConfig.js +55 -0
- package/dist/lib/summary/scoringRulesConfig.js.map +1 -0
- package/dist/lib/tags/isValidTags.d.ts +14 -0
- package/dist/lib/tags/isValidTags.js +82 -0
- package/dist/lib/tags/isValidTags.js.map +1 -0
- package/dist/lib/tags/scoringRulesConfig.d.ts +3 -0
- package/dist/lib/tags/scoringRulesConfig.js +43 -0
- package/dist/lib/tags/scoringRulesConfig.js.map +1 -0
- package/dist/lib/thumbnail/isValidThumbnail.d.ts +10 -0
- package/dist/lib/thumbnail/isValidThumbnail.js +90 -0
- package/dist/lib/thumbnail/isValidThumbnail.js.map +1 -0
- package/dist/lib/thumbnail/scoringRulesConfig.d.ts +3 -0
- package/dist/lib/thumbnail/scoringRulesConfig.js +43 -0
- package/dist/lib/thumbnail/scoringRulesConfig.js.map +1 -0
- package/dist/lib/title/isValidTitle.d.ts +23 -0
- package/dist/lib/title/isValidTitle.js +128 -0
- package/dist/lib/title/isValidTitle.js.map +1 -0
- package/dist/lib/title/scoringRulesConfig.d.ts +3 -0
- package/dist/lib/title/scoringRulesConfig.js +54 -0
- package/dist/lib/title/scoringRulesConfig.js.map +1 -0
- package/dist/lib/userProfileDescription/isValidUserProfileDescription.d.ts +23 -0
- package/dist/lib/userProfileDescription/isValidUserProfileDescription.js +138 -0
- package/dist/lib/userProfileDescription/isValidUserProfileDescription.js.map +1 -0
- package/dist/lib/userProfileDescription/scoringRulesConfig.d.ts +3 -0
- package/dist/lib/userProfileDescription/scoringRulesConfig.js +61 -0
- package/dist/lib/userProfileDescription/scoringRulesConfig.js.map +1 -0
- package/dist/lib/userProfileName/isValidUserProfileName.d.ts +10 -0
- package/dist/lib/userProfileName/isValidUserProfileName.js +60 -0
- package/dist/lib/userProfileName/isValidUserProfileName.js.map +1 -0
- package/dist/lib/userProfileName/scoringRulesConfig.d.ts +3 -0
- package/dist/lib/userProfileName/scoringRulesConfig.js +43 -0
- package/dist/lib/userProfileName/scoringRulesConfig.js.map +1 -0
- package/dist/lib/userProfileThumbnail/isValidUserProfileThumbnail.d.ts +22 -0
- package/dist/lib/userProfileThumbnail/isValidUserProfileThumbnail.js +62 -0
- package/dist/lib/userProfileThumbnail/isValidUserProfileThumbnail.js.map +1 -0
- package/dist/lib/userProfileThumbnail/scoringRulesConfig.d.ts +3 -0
- package/dist/lib/userProfileThumbnail/scoringRulesConfig.js +37 -0
- package/dist/lib/userProfileThumbnail/scoringRulesConfig.js.map +1 -0
- package/dist/lib/util/assertString.d.ts +11 -0
- package/dist/lib/util/assertString.js +20 -0
- package/dist/lib/util/assertString.js.map +1 -0
- package/dist/lib/util/contains.d.ts +7 -0
- package/dist/lib/util/contains.js +17 -0
- package/dist/lib/util/contains.js.map +1 -0
- package/dist/lib/util/getNumberOfStrings.d.ts +6 -0
- package/dist/lib/util/getNumberOfStrings.js +25 -0
- package/dist/lib/util/getNumberOfStrings.js.map +1 -0
- package/dist/lib/util/getScoringRules.d.ts +21 -0
- package/dist/lib/util/getScoringRules.js +99 -0
- package/dist/lib/util/getScoringRules.js.map +1 -0
- package/dist/lib/util/getThumbnailFileName.d.ts +15 -0
- package/dist/lib/util/getThumbnailFileName.js +26 -0
- package/dist/lib/util/getThumbnailFileName.js.map +1 -0
- package/dist/lib/util/isArcGISDomain.d.ts +6 -0
- package/dist/lib/util/isArcGISDomain.js +16 -0
- package/dist/lib/util/isArcGISDomain.js.map +1 -0
- package/dist/lib/util/isArcGISOnlineReservedThumbnailName.d.ts +6 -0
- package/dist/lib/util/isArcGISOnlineReservedThumbnailName.js +19 -0
- package/dist/lib/util/isArcGISOnlineReservedThumbnailName.js.map +1 -0
- package/dist/lib/util/isDefined.d.ts +8 -0
- package/dist/lib/util/isDefined.js +15 -0
- package/dist/lib/util/isDefined.js.map +1 -0
- package/dist/lib/util/isEmail.d.ts +6 -0
- package/dist/lib/util/isEmail.js +14 -0
- package/dist/lib/util/isEmail.js.map +1 -0
- package/dist/lib/util/isEmpty.d.ts +6 -0
- package/dist/lib/util/isEmpty.js +17 -0
- package/dist/lib/util/isEmpty.js.map +1 -0
- package/dist/lib/util/isFeatureCollection.d.ts +7 -0
- package/dist/lib/util/isFeatureCollection.js +13 -0
- package/dist/lib/util/isFeatureCollection.js.map +1 -0
- package/dist/lib/util/isHosted.d.ts +7 -0
- package/dist/lib/util/isHosted.js +17 -0
- package/dist/lib/util/isHosted.js.map +1 -0
- package/dist/lib/util/isSecureProtocol.d.ts +6 -0
- package/dist/lib/util/isSecureProtocol.js +16 -0
- package/dist/lib/util/isSecureProtocol.js.map +1 -0
- package/dist/lib/util/isUppercase.d.ts +4 -0
- package/dist/lib/util/isUppercase.js +14 -0
- package/dist/lib/util/isUppercase.js.map +1 -0
- package/dist/lib/util/isUrl.d.ts +4 -0
- package/dist/lib/util/isUrl.js +12 -0
- package/dist/lib/util/isUrl.js.map +1 -0
- package/dist/lib/util/matches.d.ts +12 -0
- package/dist/lib/util/matches.js +22 -0
- package/dist/lib/util/matches.js.map +1 -0
- package/dist/lib/util/stringsConfig.d.ts +17 -0
- package/dist/lib/util/stringsConfig.js +42 -0
- package/dist/lib/util/stringsConfig.js.map +1 -0
- package/dist/lib/util/toString.d.ts +11 -0
- package/dist/lib/util/toString.js +31 -0
- package/dist/lib/util/toString.js.map +1 -0
- package/dist/lib/validate/validate.d.ts +11 -0
- package/dist/lib/validate/validate.js +62 -0
- package/dist/lib/validate/validate.js.map +1 -0
- package/dist/locale/de.json +195 -0
- package/dist/locale/en.json +195 -0
- package/dist/locale/es.json +195 -0
- package/dist/locale/fr.json +195 -0
- package/dist/locale/ja.json +195 -0
- package/dist/locale/pt-br.json +195 -0
- package/dist/types/index.d.ts +114 -0
- package/dist/types/index.js +16 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +55 -0
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.isValidThumbnail = void 0;
|
|
7
|
+
const scoringRulesConfig_1 = __importDefault(require("./scoringRulesConfig"));
|
|
8
|
+
const getScoringRules_1 = require("../util/getScoringRules");
|
|
9
|
+
const stringsConfig_1 = require("../util/stringsConfig");
|
|
10
|
+
const isEmpty_1 = require("../util/isEmpty");
|
|
11
|
+
const isDefined_1 = require("../util/isDefined");
|
|
12
|
+
const getThumbnailFileName_1 = require("../util/getThumbnailFileName");
|
|
13
|
+
const isArcGISOnlineReservedThumbnailName_1 = require("../util/isArcGISOnlineReservedThumbnailName");
|
|
14
|
+
const MIN_WIDTH = 286;
|
|
15
|
+
const MIN_HEIGHT = 190;
|
|
16
|
+
/**
|
|
17
|
+
* Validate an item's thumbnail
|
|
18
|
+
*
|
|
19
|
+
* Living Atlas specific rules:
|
|
20
|
+
* - thumbnail cannot be empty
|
|
21
|
+
* - Must have a custom thumbnail.
|
|
22
|
+
* - The thumbnail must be at least `286 x 190`
|
|
23
|
+
*/
|
|
24
|
+
const isValidThumbnail = (item) => {
|
|
25
|
+
const thumbnail = item.thumbnail || item.largeThumbnail || '';
|
|
26
|
+
// const {largeThumbnail} = item;
|
|
27
|
+
// scoring rules
|
|
28
|
+
const SCORING = (0, getScoringRules_1.getScoringRules)(item, scoringRulesConfig_1.default);
|
|
29
|
+
const stringsConfig = (0, stringsConfig_1.getStringsConfig)();
|
|
30
|
+
// issues
|
|
31
|
+
const issues = {
|
|
32
|
+
property: 'thumbnail',
|
|
33
|
+
label: stringsConfig.thumbnail.LABEL,
|
|
34
|
+
maxScore: SCORING.EMPTY_STRING_SCORE +
|
|
35
|
+
SCORING.HAS_CUSTOM_SMALL +
|
|
36
|
+
SCORING.HAS_CUSTOM_LARGE,
|
|
37
|
+
score: SCORING.EMPTY_STRING_SCORE,
|
|
38
|
+
messages: [],
|
|
39
|
+
weight: stringsConfig.thumbnail.WEIGHT,
|
|
40
|
+
critical: true,
|
|
41
|
+
};
|
|
42
|
+
// no thumbnail, return validation info with zero score
|
|
43
|
+
if ((0, isEmpty_1.isEmpty)(thumbnail)) {
|
|
44
|
+
issues.messages.push({
|
|
45
|
+
code: stringsConfig.thumbnail.EMPTY_STRING_CODE,
|
|
46
|
+
message: stringsConfig.thumbnail.EMPTY_STRING_MESSAGE,
|
|
47
|
+
});
|
|
48
|
+
return issues;
|
|
49
|
+
}
|
|
50
|
+
const thumbnailFileName = (0, getThumbnailFileName_1.getThumbnailFileName)(thumbnail);
|
|
51
|
+
// check if thumbnail uses one of the ArcGIS Online reserved file names
|
|
52
|
+
if ((0, isArcGISOnlineReservedThumbnailName_1.isArcGISOnlineReservedThumbnailName)(thumbnailFileName)) {
|
|
53
|
+
issues.messages.push({
|
|
54
|
+
code: stringsConfig.thumbnail.SMALL_THUMBNAIL_FILENAME_ISSUE_CODE,
|
|
55
|
+
message: stringsConfig.thumbnail.SMALL_THUMBNAIL_FILENAME_ISSUE_MESSAGE,
|
|
56
|
+
});
|
|
57
|
+
return issues;
|
|
58
|
+
}
|
|
59
|
+
// check thumbnail size
|
|
60
|
+
if ((0, isDefined_1.isDefined)(item.dimensions)) {
|
|
61
|
+
const imgWidth = item.dimensions.width;
|
|
62
|
+
const imgHeight = item.dimensions.height;
|
|
63
|
+
if (imgWidth >= MIN_WIDTH && imgHeight >= MIN_HEIGHT) {
|
|
64
|
+
issues.score =
|
|
65
|
+
issues.score +
|
|
66
|
+
SCORING.HAS_CUSTOM_SMALL +
|
|
67
|
+
SCORING.HAS_CUSTOM_LARGE;
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
// too small
|
|
71
|
+
issues.messages.push({
|
|
72
|
+
code: stringsConfig.thumbnail.THUMBNAIL_SIZE_CODE,
|
|
73
|
+
message: stringsConfig.thumbnail.THUMBNAIL_SIZE_MESSAGE,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
issues.score =
|
|
79
|
+
issues.score + SCORING.HAS_CUSTOM_SMALL + SCORING.HAS_CUSTOM_LARGE;
|
|
80
|
+
}
|
|
81
|
+
if (thumbnail.toLowerCase().endsWith('.gif') &&
|
|
82
|
+
(0, isDefined_1.isDefined)(item === null || item === void 0 ? void 0 : item.contentStatus) &&
|
|
83
|
+
(item === null || item === void 0 ? void 0 : item.contentStatus) === 'public_authoritative') {
|
|
84
|
+
issues.score =
|
|
85
|
+
issues.score + SCORING.HAS_CUSTOM_SMALL + SCORING.HAS_CUSTOM_LARGE;
|
|
86
|
+
}
|
|
87
|
+
return issues;
|
|
88
|
+
};
|
|
89
|
+
exports.isValidThumbnail = isValidThumbnail;
|
|
90
|
+
//# sourceMappingURL=isValidThumbnail.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isValidThumbnail.js","sourceRoot":"","sources":["../../../src/lib/thumbnail/isValidThumbnail.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const config = {
|
|
4
|
+
// Scoring
|
|
5
|
+
SCORING: {
|
|
6
|
+
DEFAULT: {
|
|
7
|
+
WEB_MAP: {
|
|
8
|
+
EMPTY_STRING_SCORE: 0,
|
|
9
|
+
HAS_CUSTOM_SMALL: 4,
|
|
10
|
+
HAS_CUSTOM_LARGE: 5,
|
|
11
|
+
},
|
|
12
|
+
WEB_SCENE: {
|
|
13
|
+
EMPTY_STRING_SCORE: 0,
|
|
14
|
+
HAS_CUSTOM_SMALL: 5,
|
|
15
|
+
HAS_CUSTOM_LARGE: 6,
|
|
16
|
+
},
|
|
17
|
+
APPLICATION: {
|
|
18
|
+
EMPTY_STRING_SCORE: 0,
|
|
19
|
+
HAS_CUSTOM_SMALL: 5,
|
|
20
|
+
HAS_CUSTOM_LARGE: 5,
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
INTERNATIONAL: {
|
|
24
|
+
WEB_MAP: {
|
|
25
|
+
EMPTY_STRING_SCORE: 0,
|
|
26
|
+
HAS_CUSTOM_SMALL: 4,
|
|
27
|
+
HAS_CUSTOM_LARGE: 5,
|
|
28
|
+
},
|
|
29
|
+
WEB_SCENE: {
|
|
30
|
+
EMPTY_STRING_SCORE: 0,
|
|
31
|
+
HAS_CUSTOM_SMALL: 5,
|
|
32
|
+
HAS_CUSTOM_LARGE: 6,
|
|
33
|
+
},
|
|
34
|
+
APPLICATION: {
|
|
35
|
+
EMPTY_STRING_SCORE: 0,
|
|
36
|
+
HAS_CUSTOM_SMALL: 5,
|
|
37
|
+
HAS_CUSTOM_LARGE: 5,
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
exports.default = config;
|
|
43
|
+
//# sourceMappingURL=scoringRulesConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scoringRulesConfig.js","sourceRoot":"","sources":["../../../src/lib/thumbnail/scoringRulesConfig.ts"],"names":[],"mappings":";;AAEA,MAAM,MAAM,GAAuB;IAC/B,UAAU;IACV,OAAO,EAAE;QACL,OAAO,EAAE;YACL,OAAO,EAAE;gBACL,kBAAkB,EAAE,CAAC;gBACrB,gBAAgB,EAAE,CAAC;gBACnB,gBAAgB,EAAE,CAAC;aACtB;YACD,SAAS,EAAE;gBACP,kBAAkB,EAAE,CAAC;gBACrB,gBAAgB,EAAE,CAAC;gBACnB,gBAAgB,EAAE,CAAC;aACtB;YACD,WAAW,EAAE;gBACT,kBAAkB,EAAE,CAAC;gBACrB,gBAAgB,EAAE,CAAC;gBACnB,gBAAgB,EAAE,CAAC;aACtB;SACJ;QAED,aAAa,EAAE;YACX,OAAO,EAAE;gBACL,kBAAkB,EAAE,CAAC;gBACrB,gBAAgB,EAAE,CAAC;gBACnB,gBAAgB,EAAE,CAAC;aACtB;YACD,SAAS,EAAE;gBACP,kBAAkB,EAAE,CAAC;gBACrB,gBAAgB,EAAE,CAAC;gBACnB,gBAAgB,EAAE,CAAC;aACtB;YACD,WAAW,EAAE;gBACT,kBAAkB,EAAE,CAAC;gBACrB,gBAAgB,EAAE,CAAC;gBACnB,gBAAgB,EAAE,CAAC;aACtB;SACJ;KACJ;CACJ,CAAC;AAEF,kBAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { IItem, ValidationInfo } from '../../types';
|
|
2
|
+
/**
|
|
3
|
+
* Validate an item's title. A Valid title must meet these rules below:
|
|
4
|
+
*
|
|
5
|
+
* ArcGIS Online specific rules:
|
|
6
|
+
* - Cannot be empty
|
|
7
|
+
* - Minimum length: 1 character
|
|
8
|
+
* - Maximum length: 250 characters
|
|
9
|
+
* - Cannot contain `<` or `>` (ArcGIS Online defined)
|
|
10
|
+
*
|
|
11
|
+
* Living Atlas specific rules:
|
|
12
|
+
* - Cannot be all uppercase
|
|
13
|
+
* - Cannot contain blacklisted characters or strings ("_", "copy", "demo", "test", "eval")
|
|
14
|
+
* - Contain more than one word
|
|
15
|
+
*
|
|
16
|
+
* Living Atlas specific rules (international):
|
|
17
|
+
* - Must contain a string of any length
|
|
18
|
+
*
|
|
19
|
+
* @param item
|
|
20
|
+
* @param blacklist
|
|
21
|
+
* @returns
|
|
22
|
+
*/
|
|
23
|
+
export declare const isValidTitle: (item: IItem, blacklist?: RegExp[]) => ValidationInfo;
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.isValidTitle = void 0;
|
|
7
|
+
const scoringRulesConfig_1 = __importDefault(require("./scoringRulesConfig"));
|
|
8
|
+
// import stringsConfig from '../config';
|
|
9
|
+
const assertString_1 = require("../util/assertString");
|
|
10
|
+
const contains_1 = require("../util/contains");
|
|
11
|
+
const isEmpty_1 = require("../util/isEmpty");
|
|
12
|
+
const isUppercase_1 = require("../util/isUppercase");
|
|
13
|
+
const matches_1 = require("../util/matches");
|
|
14
|
+
const getNumberOfStrings_1 = require("../util/getNumberOfStrings");
|
|
15
|
+
const getScoringRules_1 = require("../util/getScoringRules");
|
|
16
|
+
const config_1 = require("../config");
|
|
17
|
+
const stringsConfig_1 = require("../util/stringsConfig");
|
|
18
|
+
/**
|
|
19
|
+
* Validate an item's title. A Valid title must meet these rules below:
|
|
20
|
+
*
|
|
21
|
+
* ArcGIS Online specific rules:
|
|
22
|
+
* - Cannot be empty
|
|
23
|
+
* - Minimum length: 1 character
|
|
24
|
+
* - Maximum length: 250 characters
|
|
25
|
+
* - Cannot contain `<` or `>` (ArcGIS Online defined)
|
|
26
|
+
*
|
|
27
|
+
* Living Atlas specific rules:
|
|
28
|
+
* - Cannot be all uppercase
|
|
29
|
+
* - Cannot contain blacklisted characters or strings ("_", "copy", "demo", "test", "eval")
|
|
30
|
+
* - Contain more than one word
|
|
31
|
+
*
|
|
32
|
+
* Living Atlas specific rules (international):
|
|
33
|
+
* - Must contain a string of any length
|
|
34
|
+
*
|
|
35
|
+
* @param item
|
|
36
|
+
* @param blacklist
|
|
37
|
+
* @returns
|
|
38
|
+
*/
|
|
39
|
+
const isValidTitle = (item, blacklist = config_1.BLACKLIST) => {
|
|
40
|
+
// property
|
|
41
|
+
const { title } = item;
|
|
42
|
+
// scoring rules locale
|
|
43
|
+
const culture = (0, getScoringRules_1.getScoringRulesLocale)(item);
|
|
44
|
+
// scoring rules
|
|
45
|
+
const SCORING = (0, getScoringRules_1.getScoringRules)(item, scoringRulesConfig_1.default);
|
|
46
|
+
const stringsConfig = (0, stringsConfig_1.getStringsConfig)();
|
|
47
|
+
// issues
|
|
48
|
+
const issues = {
|
|
49
|
+
property: 'title',
|
|
50
|
+
label: stringsConfig.title.LABEL,
|
|
51
|
+
maxScore: SCORING.EMPTY_STRING_SCORE +
|
|
52
|
+
SCORING.MIN_LENGTH_SCORE +
|
|
53
|
+
SCORING.NO_BLACK_LISTED_WORDS_SCORE +
|
|
54
|
+
SCORING.NO_UNDERSCORE_SCORE +
|
|
55
|
+
SCORING.CASE_SENSITIVE_SCORE,
|
|
56
|
+
score: SCORING.EMPTY_STRING_SCORE,
|
|
57
|
+
messages: [],
|
|
58
|
+
weight: stringsConfig.title.WEIGHT,
|
|
59
|
+
critical: false,
|
|
60
|
+
};
|
|
61
|
+
// return empty socre and message if title is empty
|
|
62
|
+
if (!(0, assertString_1.assertString)(item.title) || (0, isEmpty_1.isEmpty)(title)) {
|
|
63
|
+
issues.messages.push({
|
|
64
|
+
code: stringsConfig.title.EMPTY_STRING_CODE,
|
|
65
|
+
message: stringsConfig.title.EMPTY_STRING_MESSAGE,
|
|
66
|
+
});
|
|
67
|
+
issues.score = SCORING.EMPTY_STRING_SCORE;
|
|
68
|
+
return issues;
|
|
69
|
+
}
|
|
70
|
+
// all international items get the maximum score as long as the title is not empty
|
|
71
|
+
if (culture === 'international') {
|
|
72
|
+
issues.score += SCORING.MIN_LENGTH_SCORE;
|
|
73
|
+
issues.score += SCORING.CASE_SENSITIVE_SCORE;
|
|
74
|
+
issues.score += SCORING.NO_UNDERSCORE_SCORE;
|
|
75
|
+
issues.score += SCORING.NO_BLACK_LISTED_WORDS_SCORE;
|
|
76
|
+
return issues;
|
|
77
|
+
}
|
|
78
|
+
// check number of word in the title
|
|
79
|
+
if ((0, getNumberOfStrings_1.getNumberOfStrings)(title) > 1) {
|
|
80
|
+
issues.score += SCORING.MIN_LENGTH_SCORE;
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
issues.messages.push({
|
|
84
|
+
code: stringsConfig.title.STRING_COUNT_CODE,
|
|
85
|
+
message: stringsConfig.title.STRING_COUNT_MESSAGE,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
// check if the title is uppercase string
|
|
89
|
+
if ((0, isUppercase_1.isUppercase)(title)) {
|
|
90
|
+
issues.messages.push({
|
|
91
|
+
code: stringsConfig.title.UPPER_CASE_CODE,
|
|
92
|
+
message: stringsConfig.title.UPPER_CASE_MESSAGE,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
issues.score += SCORING.CASE_SENSITIVE_SCORE;
|
|
97
|
+
}
|
|
98
|
+
// check if the title contains any of these special characters: `>`, `<`, `_`
|
|
99
|
+
if ((0, contains_1.contains)(title, '>') || (0, contains_1.contains)(title, '<') || (0, contains_1.contains)(title, '_')) {
|
|
100
|
+
issues.messages.push({
|
|
101
|
+
code: stringsConfig.title.BLACKLISTED_CHARS_CODE,
|
|
102
|
+
message: stringsConfig.title.BLACKLISTED_CHARS_MESSAGE,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
issues.score += SCORING.NO_UNDERSCORE_SCORE;
|
|
107
|
+
}
|
|
108
|
+
// check if title contains any words in the blacklist
|
|
109
|
+
let containsBlacklistedWords = false;
|
|
110
|
+
for (let i = 0; i < blacklist.length; i += 1) {
|
|
111
|
+
if ((0, matches_1.matches)(title, blacklist[i])) {
|
|
112
|
+
containsBlacklistedWords = true;
|
|
113
|
+
break;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
if (containsBlacklistedWords) {
|
|
117
|
+
issues.messages.push({
|
|
118
|
+
code: stringsConfig.title.BLACKLISTED_WORDS_CODE,
|
|
119
|
+
message: stringsConfig.title.BLACKLISTED_WORDS_MESSAGE,
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
issues.score += SCORING.NO_BLACK_LISTED_WORDS_SCORE;
|
|
124
|
+
}
|
|
125
|
+
return issues;
|
|
126
|
+
};
|
|
127
|
+
exports.isValidTitle = isValidTitle;
|
|
128
|
+
//# sourceMappingURL=isValidTitle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isValidTitle.js","sourceRoot":"","sources":["../../../src/lib/title/isValidTitle.ts"],"names":[],"mappings":";;;;;;AAAA,8EAAsD;AACtD,yCAAyC;AAEzC,uDAAoD;AAEpD,+CAA4C;AAC5C,6CAA0C;AAC1C,qDAAkD;AAClD,6CAA0C;AAC1C,mEAAgE;AAChE,6DAGiC;AACjC,sCAAsC;AAEtC,yDAAyD;AAEzD;;;;;;;;;;;;;;;;;;;;GAoBG;AACI,MAAM,YAAY,GAAG,CACxB,IAAW,EACX,SAAS,GAAG,kBAAS,EACP,EAAE;IAChB,WAAW;IACX,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IAEvB,uBAAuB;IACvB,MAAM,OAAO,GAAG,IAAA,uCAAqB,EAAC,IAAI,CAAC,CAAC;IAE5C,gBAAgB;IAChB,MAAM,OAAO,GAAG,IAAA,iCAAe,EAAC,IAAI,EAAE,4BAAkB,CAAC,CAAC;IAE1D,MAAM,aAAa,GAAG,IAAA,gCAAgB,GAAE,CAAC;IAEzC,SAAS;IACT,MAAM,MAAM,GAAmB;QAC3B,QAAQ,EAAE,OAAO;QACjB,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,KAAK;QAChC,QAAQ,EACJ,OAAO,CAAC,kBAAkB;YAC1B,OAAO,CAAC,gBAAgB;YACxB,OAAO,CAAC,2BAA2B;YACnC,OAAO,CAAC,mBAAmB;YAC3B,OAAO,CAAC,oBAAoB;QAChC,KAAK,EAAE,OAAO,CAAC,kBAAkB;QACjC,QAAQ,EAAE,EAAE;QACZ,MAAM,EAAE,aAAa,CAAC,KAAK,CAAC,MAAM;QAClC,QAAQ,EAAE,KAAK;KAClB,CAAC;IAEF,mDAAmD;IACnD,IAAI,CAAC,IAAA,2BAAY,EAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAA,iBAAO,EAAC,KAAK,CAAC,EAAE;QAC7C,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;YACjB,IAAI,EAAE,aAAa,CAAC,KAAK,CAAC,iBAAiB;YAC3C,OAAO,EAAE,aAAa,CAAC,KAAK,CAAC,oBAAoB;SACpD,CAAC,CAAC;QAEH,MAAM,CAAC,KAAK,GAAG,OAAO,CAAC,kBAAkB,CAAC;QAE1C,OAAO,MAAM,CAAC;KACjB;IAED,kFAAkF;IAClF,IAAI,OAAO,KAAK,eAAe,EAAE;QAC7B,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC,gBAAgB,CAAC;QACzC,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC,oBAAoB,CAAC;QAC7C,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC,mBAAmB,CAAC;QAC5C,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC,2BAA2B,CAAC;QAEpD,OAAO,MAAM,CAAC;KACjB;IAED,oCAAoC;IACpC,IAAI,IAAA,uCAAkB,EAAC,KAAK,CAAC,GAAG,CAAC,EAAE;QAC/B,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC,gBAAgB,CAAC;KAC5C;SAAM;QACH,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;YACjB,IAAI,EAAE,aAAa,CAAC,KAAK,CAAC,iBAAiB;YAC3C,OAAO,EAAE,aAAa,CAAC,KAAK,CAAC,oBAAoB;SACpD,CAAC,CAAC;KACN;IAED,yCAAyC;IACzC,IAAI,IAAA,yBAAW,EAAC,KAAK,CAAC,EAAE;QACpB,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;YACjB,IAAI,EAAE,aAAa,CAAC,KAAK,CAAC,eAAe;YACzC,OAAO,EAAE,aAAa,CAAC,KAAK,CAAC,kBAAkB;SAClD,CAAC,CAAC;KACN;SAAM;QACH,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC,oBAAoB,CAAC;KAChD;IAED,6EAA6E;IAC7E,IAAI,IAAA,mBAAQ,EAAC,KAAK,EAAE,GAAG,CAAC,IAAI,IAAA,mBAAQ,EAAC,KAAK,EAAE,GAAG,CAAC,IAAI,IAAA,mBAAQ,EAAC,KAAK,EAAE,GAAG,CAAC,EAAE;QACtE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;YACjB,IAAI,EAAE,aAAa,CAAC,KAAK,CAAC,sBAAsB;YAChD,OAAO,EAAE,aAAa,CAAC,KAAK,CAAC,yBAAyB;SACzD,CAAC,CAAC;KACN;SAAM;QACH,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC,mBAAmB,CAAC;KAC/C;IAED,qDAAqD;IACrD,IAAI,wBAAwB,GAAG,KAAK,CAAC;IACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE;QAC1C,IAAI,IAAA,iBAAO,EAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE;YAC9B,wBAAwB,GAAG,IAAI,CAAC;YAChC,MAAM;SACT;KACJ;IAED,IAAI,wBAAwB,EAAE;QAC1B,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;YACjB,IAAI,EAAE,aAAa,CAAC,KAAK,CAAC,sBAAsB;YAChD,OAAO,EAAE,aAAa,CAAC,KAAK,CAAC,yBAAyB;SACzD,CAAC,CAAC;KACN;SAAM;QACH,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC,2BAA2B,CAAC;KACvD;IAED,OAAO,MAAM,CAAC;AAClB,CAAC,CAAC;AAtGW,QAAA,YAAY,gBAsGvB"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const config = {
|
|
4
|
+
SCORING: {
|
|
5
|
+
DEFAULT: {
|
|
6
|
+
WEB_MAP: {
|
|
7
|
+
EMPTY_STRING_SCORE: 0,
|
|
8
|
+
MIN_LENGTH_SCORE: 2,
|
|
9
|
+
NO_BLACK_LISTED_WORDS_SCORE: 2,
|
|
10
|
+
NO_UNDERSCORE_SCORE: 2,
|
|
11
|
+
CASE_SENSITIVE_SCORE: 2,
|
|
12
|
+
},
|
|
13
|
+
WEB_SCENE: {
|
|
14
|
+
EMPTY_STRING_SCORE: 0,
|
|
15
|
+
MIN_LENGTH_SCORE: 2,
|
|
16
|
+
NO_BLACK_LISTED_WORDS_SCORE: 3,
|
|
17
|
+
NO_UNDERSCORE_SCORE: 2,
|
|
18
|
+
CASE_SENSITIVE_SCORE: 2,
|
|
19
|
+
},
|
|
20
|
+
APPLICATION: {
|
|
21
|
+
EMPTY_STRING_SCORE: 0,
|
|
22
|
+
MIN_LENGTH_SCORE: 2,
|
|
23
|
+
NO_BLACK_LISTED_WORDS_SCORE: 3,
|
|
24
|
+
NO_UNDERSCORE_SCORE: 2,
|
|
25
|
+
CASE_SENSITIVE_SCORE: 2,
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
INTERNATIONAL: {
|
|
29
|
+
WEB_MAP: {
|
|
30
|
+
EMPTY_STRING_SCORE: 0,
|
|
31
|
+
MIN_LENGTH_SCORE: 8,
|
|
32
|
+
NO_BLACK_LISTED_WORDS_SCORE: 0,
|
|
33
|
+
NO_UNDERSCORE_SCORE: 0,
|
|
34
|
+
CASE_SENSITIVE_SCORE: 0,
|
|
35
|
+
},
|
|
36
|
+
WEB_SCENE: {
|
|
37
|
+
EMPTY_STRING_SCORE: 0,
|
|
38
|
+
MIN_LENGTH_SCORE: 9,
|
|
39
|
+
NO_BLACK_LISTED_WORDS_SCORE: 0,
|
|
40
|
+
NO_UNDERSCORE_SCORE: 0,
|
|
41
|
+
CASE_SENSITIVE_SCORE: 0,
|
|
42
|
+
},
|
|
43
|
+
APPLICATION: {
|
|
44
|
+
EMPTY_STRING_SCORE: 0,
|
|
45
|
+
MIN_LENGTH_SCORE: 8,
|
|
46
|
+
NO_BLACK_LISTED_WORDS_SCORE: 0,
|
|
47
|
+
NO_UNDERSCORE_SCORE: 0,
|
|
48
|
+
CASE_SENSITIVE_SCORE: 0,
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
exports.default = config;
|
|
54
|
+
//# sourceMappingURL=scoringRulesConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scoringRulesConfig.js","sourceRoot":"","sources":["../../../src/lib/title/scoringRulesConfig.ts"],"names":[],"mappings":";;AAEA,MAAM,MAAM,GAAuB;IAC/B,OAAO,EAAE;QACL,OAAO,EAAE;YACL,OAAO,EAAE;gBACL,kBAAkB,EAAE,CAAC;gBACrB,gBAAgB,EAAE,CAAC;gBACnB,2BAA2B,EAAE,CAAC;gBAC9B,mBAAmB,EAAE,CAAC;gBACtB,oBAAoB,EAAE,CAAC;aAC1B;YACD,SAAS,EAAE;gBACP,kBAAkB,EAAE,CAAC;gBACrB,gBAAgB,EAAE,CAAC;gBACnB,2BAA2B,EAAE,CAAC;gBAC9B,mBAAmB,EAAE,CAAC;gBACtB,oBAAoB,EAAE,CAAC;aAC1B;YACD,WAAW,EAAE;gBACT,kBAAkB,EAAE,CAAC;gBACrB,gBAAgB,EAAE,CAAC;gBACnB,2BAA2B,EAAE,CAAC;gBAC9B,mBAAmB,EAAE,CAAC;gBACtB,oBAAoB,EAAE,CAAC;aAC1B;SACJ;QAED,aAAa,EAAE;YACX,OAAO,EAAE;gBACL,kBAAkB,EAAE,CAAC;gBACrB,gBAAgB,EAAE,CAAC;gBACnB,2BAA2B,EAAE,CAAC;gBAC9B,mBAAmB,EAAE,CAAC;gBACtB,oBAAoB,EAAE,CAAC;aAC1B;YACD,SAAS,EAAE;gBACP,kBAAkB,EAAE,CAAC;gBACrB,gBAAgB,EAAE,CAAC;gBACnB,2BAA2B,EAAE,CAAC;gBAC9B,mBAAmB,EAAE,CAAC;gBACtB,oBAAoB,EAAE,CAAC;aAC1B;YACD,WAAW,EAAE;gBACT,kBAAkB,EAAE,CAAC;gBACrB,gBAAgB,EAAE,CAAC;gBACnB,2BAA2B,EAAE,CAAC;gBAC9B,mBAAmB,EAAE,CAAC;gBACtB,oBAAoB,EAAE,CAAC;aAC1B;SACJ;KACJ;CACJ,CAAC;AAEF,kBAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { IItem, ValidationInfo, UserProfile } from '../../types';
|
|
2
|
+
/**
|
|
3
|
+
* Validate an item owner's profile description
|
|
4
|
+
*
|
|
5
|
+
* Adding biographical information about helps others know more about the item owner, groups, and the content shared.
|
|
6
|
+
* The profile can connect users with others who have similar interests and establish authority in geographic information, map design, app development, and so on.
|
|
7
|
+
* It can also promote interest in joining groups and using maps and apps being shared.
|
|
8
|
+
* It's useful to include contact information and areas of expertise and interests.
|
|
9
|
+
*
|
|
10
|
+
* Living Atlas specific
|
|
11
|
+
* - Cannot be empty
|
|
12
|
+
* - Has minimum number of words (10)
|
|
13
|
+
* - Has minimum number of sentences (3)
|
|
14
|
+
* - Should contain an email
|
|
15
|
+
* - Should contain a link
|
|
16
|
+
* <br />
|
|
17
|
+
*
|
|
18
|
+
* Living Atlas specific (international)
|
|
19
|
+
* - Cannot be empty
|
|
20
|
+
* - Should contain an email
|
|
21
|
+
* - Should contain a link
|
|
22
|
+
*/
|
|
23
|
+
export declare const isValidUserProfileDescription: (userProfile: UserProfile, item: IItem) => ValidationInfo;
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.isValidUserProfileDescription = void 0;
|
|
7
|
+
const scoringRulesConfig_1 = __importDefault(require("./scoringRulesConfig"));
|
|
8
|
+
const getScoringRules_1 = require("../util/getScoringRules");
|
|
9
|
+
const stringsConfig_1 = require("../util/stringsConfig");
|
|
10
|
+
const assertString_1 = require("../util/assertString");
|
|
11
|
+
const isEmpty_1 = require("../util/isEmpty");
|
|
12
|
+
const isEmail_1 = require("../util/isEmail");
|
|
13
|
+
const isUrl_1 = require("../util/isUrl");
|
|
14
|
+
/**
|
|
15
|
+
* Validate an item owner's profile description
|
|
16
|
+
*
|
|
17
|
+
* Adding biographical information about helps others know more about the item owner, groups, and the content shared.
|
|
18
|
+
* The profile can connect users with others who have similar interests and establish authority in geographic information, map design, app development, and so on.
|
|
19
|
+
* It can also promote interest in joining groups and using maps and apps being shared.
|
|
20
|
+
* It's useful to include contact information and areas of expertise and interests.
|
|
21
|
+
*
|
|
22
|
+
* Living Atlas specific
|
|
23
|
+
* - Cannot be empty
|
|
24
|
+
* - Has minimum number of words (10)
|
|
25
|
+
* - Has minimum number of sentences (3)
|
|
26
|
+
* - Should contain an email
|
|
27
|
+
* - Should contain a link
|
|
28
|
+
* <br />
|
|
29
|
+
*
|
|
30
|
+
* Living Atlas specific (international)
|
|
31
|
+
* - Cannot be empty
|
|
32
|
+
* - Should contain an email
|
|
33
|
+
* - Should contain a link
|
|
34
|
+
*/
|
|
35
|
+
const isValidUserProfileDescription = (userProfile, item) => {
|
|
36
|
+
const { description } = userProfile;
|
|
37
|
+
// scoring rules locale
|
|
38
|
+
const culture = (0, getScoringRules_1.getScoringRulesLocale)(item);
|
|
39
|
+
// scoring rules
|
|
40
|
+
const SCORING = (0, getScoringRules_1.getScoringRules)(item, scoringRulesConfig_1.default);
|
|
41
|
+
const stringsConfig = (0, stringsConfig_1.getStringsConfig)();
|
|
42
|
+
const issues = {
|
|
43
|
+
property: 'userProfileDescription',
|
|
44
|
+
label: stringsConfig.userProfileDescription.LABEL,
|
|
45
|
+
maxScore: SCORING.EMPTY_STRING_SCORE +
|
|
46
|
+
SCORING.USER_PROFILE_DESCRIPTION_HAS_DESCRIPTION +
|
|
47
|
+
SCORING.USER_PROFILE_DESCRIPTION_HAS_MIN_NUM_SENTENCES +
|
|
48
|
+
SCORING.USER_PROFILE_DESCRIPTION_HAS_MIN_NUM_WORDS +
|
|
49
|
+
SCORING.USER_PROFILE_DESCRIPTION_HAS_LINK +
|
|
50
|
+
SCORING.USER_PROFILE_DESCRIPTION_HAS_EMAIL,
|
|
51
|
+
score: SCORING.EMPTY_STRING_SCORE,
|
|
52
|
+
messages: [],
|
|
53
|
+
weight: stringsConfig.userProfileDescription.WEIGHT,
|
|
54
|
+
critical: true,
|
|
55
|
+
};
|
|
56
|
+
if ((0, assertString_1.assertString)(description) === false || (0, isEmpty_1.isEmpty)(description)) {
|
|
57
|
+
issues.messages.push({
|
|
58
|
+
code: stringsConfig.userProfileDescription.EMPTY_STRING_CODE,
|
|
59
|
+
message: stringsConfig.userProfileDescription.EMPTY_STRING_MESSAGE,
|
|
60
|
+
});
|
|
61
|
+
return issues;
|
|
62
|
+
}
|
|
63
|
+
issues.score += SCORING.USER_PROFILE_DESCRIPTION_HAS_DESCRIPTION;
|
|
64
|
+
let nWords = 0;
|
|
65
|
+
let nSentences = 0;
|
|
66
|
+
let nEmailAddresses = 0;
|
|
67
|
+
let nUrls = 0;
|
|
68
|
+
let isAUrl = false;
|
|
69
|
+
let isEmailAddress = false;
|
|
70
|
+
const cleanedDescription = description.replace(/( )/gm, ' ');
|
|
71
|
+
const descriptionArray = cleanedDescription.split(' ');
|
|
72
|
+
for (const word of descriptionArray) {
|
|
73
|
+
// skip empty spaces
|
|
74
|
+
if (!word.length) {
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
if ((0, isEmail_1.isEmail)(word)) {
|
|
78
|
+
isEmailAddress = true;
|
|
79
|
+
nEmailAddresses += 1;
|
|
80
|
+
}
|
|
81
|
+
else if ((0, isUrl_1.isUrl)(word)) {
|
|
82
|
+
isAUrl = true;
|
|
83
|
+
nUrls += 1;
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
// if it is not an email and not a url
|
|
87
|
+
nWords += 1;
|
|
88
|
+
const lastChar = word[word.length - 1];
|
|
89
|
+
if (lastChar === '.' || lastChar === '?' || lastChar === '!') {
|
|
90
|
+
nSentences += 1;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
if (nEmailAddresses > 0) {
|
|
95
|
+
issues.score += SCORING.USER_PROFILE_DESCRIPTION_HAS_EMAIL;
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
issues.messages.push({
|
|
99
|
+
code: stringsConfig.userProfileDescription.NO_VALID_EMAIL_CODE,
|
|
100
|
+
message: stringsConfig.userProfileDescription.NO_VALID_EMAIL_MESSAGE,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
if (nUrls > 0) {
|
|
104
|
+
issues.score += SCORING.USER_PROFILE_DESCRIPTION_HAS_LINK;
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
issues.messages.push({
|
|
108
|
+
code: stringsConfig.userProfileDescription.NO_VALID_URL_CODE,
|
|
109
|
+
message: stringsConfig.userProfileDescription.NO_VALID_URL_MESSAGE,
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
if (culture !== 'international') {
|
|
113
|
+
if (nWords > 10) {
|
|
114
|
+
issues.score += SCORING.USER_PROFILE_DESCRIPTION_HAS_MIN_NUM_WORDS;
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
issues.messages.push({
|
|
118
|
+
code: stringsConfig.userProfileDescription.MIM_NUM_WORDS_CODE,
|
|
119
|
+
message: stringsConfig.userProfileDescription.MIN_NUM_WORDS_MESSAGE,
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
if (nSentences > 2) {
|
|
123
|
+
issues.score +=
|
|
124
|
+
SCORING.USER_PROFILE_DESCRIPTION_HAS_MIN_NUM_SENTENCES;
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
issues.messages.push({
|
|
128
|
+
code: stringsConfig.userProfileDescription
|
|
129
|
+
.MIM_NUM_SENTENCES_CODE,
|
|
130
|
+
message: stringsConfig.userProfileDescription
|
|
131
|
+
.MIN_NUM_SENTENCES_MESSAGE,
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return issues;
|
|
136
|
+
};
|
|
137
|
+
exports.isValidUserProfileDescription = isValidUserProfileDescription;
|
|
138
|
+
//# sourceMappingURL=isValidUserProfileDescription.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isValidUserProfileDescription.js","sourceRoot":"","sources":["../../../src/lib/userProfileDescription/isValidUserProfileDescription.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const config = {
|
|
4
|
+
// Scoring
|
|
5
|
+
SCORING: {
|
|
6
|
+
DEFAULT: {
|
|
7
|
+
WEB_MAP: {
|
|
8
|
+
EMPTY_STRING_SCORE: 0,
|
|
9
|
+
USER_PROFILE_DESCRIPTION_HAS_DESCRIPTION: 1,
|
|
10
|
+
USER_PROFILE_DESCRIPTION_HAS_MIN_NUM_SENTENCES: 2,
|
|
11
|
+
USER_PROFILE_DESCRIPTION_HAS_MIN_NUM_WORDS: 1,
|
|
12
|
+
USER_PROFILE_DESCRIPTION_HAS_LINK: 1,
|
|
13
|
+
USER_PROFILE_DESCRIPTION_HAS_EMAIL: 2,
|
|
14
|
+
},
|
|
15
|
+
WEB_SCENE: {
|
|
16
|
+
EMPTY_STRING_SCORE: 0,
|
|
17
|
+
USER_PROFILE_DESCRIPTION_HAS_DESCRIPTION: 2,
|
|
18
|
+
USER_PROFILE_DESCRIPTION_HAS_MIN_NUM_SENTENCES: 2,
|
|
19
|
+
USER_PROFILE_DESCRIPTION_HAS_MIN_NUM_WORDS: 1,
|
|
20
|
+
USER_PROFILE_DESCRIPTION_HAS_LINK: 1,
|
|
21
|
+
USER_PROFILE_DESCRIPTION_HAS_EMAIL: 2,
|
|
22
|
+
},
|
|
23
|
+
APPLICATION: {
|
|
24
|
+
EMPTY_STRING_SCORE: 0,
|
|
25
|
+
USER_PROFILE_DESCRIPTION_HAS_DESCRIPTION: 1,
|
|
26
|
+
USER_PROFILE_DESCRIPTION_HAS_MIN_NUM_SENTENCES: 2,
|
|
27
|
+
USER_PROFILE_DESCRIPTION_HAS_MIN_NUM_WORDS: 1,
|
|
28
|
+
USER_PROFILE_DESCRIPTION_HAS_LINK: 1,
|
|
29
|
+
USER_PROFILE_DESCRIPTION_HAS_EMAIL: 2,
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
INTERNATIONAL: {
|
|
33
|
+
WEB_MAP: {
|
|
34
|
+
EMPTY_STRING_SCORE: 0,
|
|
35
|
+
USER_PROFILE_DESCRIPTION_HAS_DESCRIPTION: 4,
|
|
36
|
+
USER_PROFILE_DESCRIPTION_HAS_MIN_NUM_SENTENCES: 0,
|
|
37
|
+
USER_PROFILE_DESCRIPTION_HAS_MIN_NUM_WORDS: 0,
|
|
38
|
+
USER_PROFILE_DESCRIPTION_HAS_LINK: 1,
|
|
39
|
+
USER_PROFILE_DESCRIPTION_HAS_EMAIL: 2,
|
|
40
|
+
},
|
|
41
|
+
WEB_SCENE: {
|
|
42
|
+
EMPTY_STRING_SCORE: 0,
|
|
43
|
+
USER_PROFILE_DESCRIPTION_HAS_DESCRIPTION: 5,
|
|
44
|
+
USER_PROFILE_DESCRIPTION_HAS_MIN_NUM_SENTENCES: 0,
|
|
45
|
+
USER_PROFILE_DESCRIPTION_HAS_MIN_NUM_WORDS: 0,
|
|
46
|
+
USER_PROFILE_DESCRIPTION_HAS_LINK: 1,
|
|
47
|
+
USER_PROFILE_DESCRIPTION_HAS_EMAIL: 2,
|
|
48
|
+
},
|
|
49
|
+
APPLICATION: {
|
|
50
|
+
EMPTY_STRING_SCORE: 0,
|
|
51
|
+
USER_PROFILE_DESCRIPTION_HAS_DESCRIPTION: 4,
|
|
52
|
+
USER_PROFILE_DESCRIPTION_HAS_MIN_NUM_SENTENCES: 0,
|
|
53
|
+
USER_PROFILE_DESCRIPTION_HAS_MIN_NUM_WORDS: 0,
|
|
54
|
+
USER_PROFILE_DESCRIPTION_HAS_LINK: 1,
|
|
55
|
+
USER_PROFILE_DESCRIPTION_HAS_EMAIL: 2,
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
exports.default = config;
|
|
61
|
+
//# sourceMappingURL=scoringRulesConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scoringRulesConfig.js","sourceRoot":"","sources":["../../../src/lib/userProfileDescription/scoringRulesConfig.ts"],"names":[],"mappings":";;AAEA,MAAM,MAAM,GAAuB;IAC/B,UAAU;IACV,OAAO,EAAE;QACL,OAAO,EAAE;YACL,OAAO,EAAE;gBACL,kBAAkB,EAAE,CAAC;gBACrB,wCAAwC,EAAE,CAAC;gBAC3C,8CAA8C,EAAE,CAAC;gBACjD,0CAA0C,EAAE,CAAC;gBAC7C,iCAAiC,EAAE,CAAC;gBACpC,kCAAkC,EAAE,CAAC;aACxC;YACD,SAAS,EAAE;gBACP,kBAAkB,EAAE,CAAC;gBACrB,wCAAwC,EAAE,CAAC;gBAC3C,8CAA8C,EAAE,CAAC;gBACjD,0CAA0C,EAAE,CAAC;gBAC7C,iCAAiC,EAAE,CAAC;gBACpC,kCAAkC,EAAE,CAAC;aACxC;YACD,WAAW,EAAE;gBACT,kBAAkB,EAAE,CAAC;gBACrB,wCAAwC,EAAE,CAAC;gBAC3C,8CAA8C,EAAE,CAAC;gBACjD,0CAA0C,EAAE,CAAC;gBAC7C,iCAAiC,EAAE,CAAC;gBACpC,kCAAkC,EAAE,CAAC;aACxC;SACJ;QAED,aAAa,EAAE;YACX,OAAO,EAAE;gBACL,kBAAkB,EAAE,CAAC;gBACrB,wCAAwC,EAAE,CAAC;gBAC3C,8CAA8C,EAAE,CAAC;gBACjD,0CAA0C,EAAE,CAAC;gBAC7C,iCAAiC,EAAE,CAAC;gBACpC,kCAAkC,EAAE,CAAC;aACxC;YACD,SAAS,EAAE;gBACP,kBAAkB,EAAE,CAAC;gBACrB,wCAAwC,EAAE,CAAC;gBAC3C,8CAA8C,EAAE,CAAC;gBACjD,0CAA0C,EAAE,CAAC;gBAC7C,iCAAiC,EAAE,CAAC;gBACpC,kCAAkC,EAAE,CAAC;aACxC;YACD,WAAW,EAAE;gBACT,kBAAkB,EAAE,CAAC;gBACrB,wCAAwC,EAAE,CAAC;gBAC3C,8CAA8C,EAAE,CAAC;gBACjD,0CAA0C,EAAE,CAAC;gBAC7C,iCAAiC,EAAE,CAAC;gBACpC,kCAAkC,EAAE,CAAC;aACxC;SACJ;KACJ;CACJ,CAAC;AAEF,kBAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { IItem, ValidationInfo, UserProfile } from '../../types';
|
|
2
|
+
/**
|
|
3
|
+
* Validate an item owner's profile name
|
|
4
|
+
*
|
|
5
|
+
* Living Atlas specific (local):
|
|
6
|
+
* - Cannot be empty
|
|
7
|
+
* - Cannot contain blacklisted character(s)
|
|
8
|
+
*
|
|
9
|
+
*/
|
|
10
|
+
export declare const isValidUserProfileName: (userProfile: UserProfile, item: IItem) => ValidationInfo;
|