@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.
Files changed (153) hide show
  1. package/LICENSE +101 -0
  2. package/README.md +196 -0
  3. package/dist/index.d.ts +17 -0
  4. package/dist/index.js +35 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/lib/accessInformation/isValidAccessInformation.d.ts +10 -0
  7. package/dist/lib/accessInformation/isValidAccessInformation.js +48 -0
  8. package/dist/lib/accessInformation/isValidAccessInformation.js.map +1 -0
  9. package/dist/lib/accessInformation/scoringRulesConfig.d.ts +3 -0
  10. package/dist/lib/accessInformation/scoringRulesConfig.js +37 -0
  11. package/dist/lib/accessInformation/scoringRulesConfig.js.map +1 -0
  12. package/dist/lib/config.d.ts +6 -0
  13. package/dist/lib/config.js +61 -0
  14. package/dist/lib/config.js.map +1 -0
  15. package/dist/lib/description/isValidDescription.d.ts +18 -0
  16. package/dist/lib/description/isValidDescription.js +95 -0
  17. package/dist/lib/description/isValidDescription.js.map +1 -0
  18. package/dist/lib/description/scoringRulesConfig.d.ts +3 -0
  19. package/dist/lib/description/scoringRulesConfig.js +49 -0
  20. package/dist/lib/description/scoringRulesConfig.js.map +1 -0
  21. package/dist/lib/layers/isValidLayerCount.d.ts +12 -0
  22. package/dist/lib/layers/isValidLayerCount.js +148 -0
  23. package/dist/lib/layers/isValidLayerCount.js.map +1 -0
  24. package/dist/lib/layers/scoringRulesConfig.d.ts +3 -0
  25. package/dist/lib/layers/scoringRulesConfig.js +49 -0
  26. package/dist/lib/layers/scoringRulesConfig.js.map +1 -0
  27. package/dist/lib/licenseInfo/isValidLicenseInfo.d.ts +36 -0
  28. package/dist/lib/licenseInfo/isValidLicenseInfo.js +108 -0
  29. package/dist/lib/licenseInfo/isValidLicenseInfo.js.map +1 -0
  30. package/dist/lib/licenseInfo/scoringRulesConfig.d.ts +3 -0
  31. package/dist/lib/licenseInfo/scoringRulesConfig.js +49 -0
  32. package/dist/lib/licenseInfo/scoringRulesConfig.js.map +1 -0
  33. package/dist/lib/sharing/isValidAccess.d.ts +22 -0
  34. package/dist/lib/sharing/isValidAccess.js +79 -0
  35. package/dist/lib/sharing/isValidAccess.js.map +1 -0
  36. package/dist/lib/sharing/scoringRulesConfig.d.ts +3 -0
  37. package/dist/lib/sharing/scoringRulesConfig.js +49 -0
  38. package/dist/lib/sharing/scoringRulesConfig.js.map +1 -0
  39. package/dist/lib/ssl/isValidSSL.d.ts +14 -0
  40. package/dist/lib/ssl/isValidSSL.js +62 -0
  41. package/dist/lib/ssl/isValidSSL.js.map +1 -0
  42. package/dist/lib/ssl/scoringRulesConfig.d.ts +3 -0
  43. package/dist/lib/ssl/scoringRulesConfig.js +43 -0
  44. package/dist/lib/ssl/scoringRulesConfig.js.map +1 -0
  45. package/dist/lib/summary/isValidSummary.d.ts +17 -0
  46. package/dist/lib/summary/isValidSummary.js +114 -0
  47. package/dist/lib/summary/isValidSummary.js.map +1 -0
  48. package/dist/lib/summary/scoringRulesConfig.d.ts +3 -0
  49. package/dist/lib/summary/scoringRulesConfig.js +55 -0
  50. package/dist/lib/summary/scoringRulesConfig.js.map +1 -0
  51. package/dist/lib/tags/isValidTags.d.ts +14 -0
  52. package/dist/lib/tags/isValidTags.js +82 -0
  53. package/dist/lib/tags/isValidTags.js.map +1 -0
  54. package/dist/lib/tags/scoringRulesConfig.d.ts +3 -0
  55. package/dist/lib/tags/scoringRulesConfig.js +43 -0
  56. package/dist/lib/tags/scoringRulesConfig.js.map +1 -0
  57. package/dist/lib/thumbnail/isValidThumbnail.d.ts +10 -0
  58. package/dist/lib/thumbnail/isValidThumbnail.js +90 -0
  59. package/dist/lib/thumbnail/isValidThumbnail.js.map +1 -0
  60. package/dist/lib/thumbnail/scoringRulesConfig.d.ts +3 -0
  61. package/dist/lib/thumbnail/scoringRulesConfig.js +43 -0
  62. package/dist/lib/thumbnail/scoringRulesConfig.js.map +1 -0
  63. package/dist/lib/title/isValidTitle.d.ts +23 -0
  64. package/dist/lib/title/isValidTitle.js +128 -0
  65. package/dist/lib/title/isValidTitle.js.map +1 -0
  66. package/dist/lib/title/scoringRulesConfig.d.ts +3 -0
  67. package/dist/lib/title/scoringRulesConfig.js +54 -0
  68. package/dist/lib/title/scoringRulesConfig.js.map +1 -0
  69. package/dist/lib/userProfileDescription/isValidUserProfileDescription.d.ts +23 -0
  70. package/dist/lib/userProfileDescription/isValidUserProfileDescription.js +138 -0
  71. package/dist/lib/userProfileDescription/isValidUserProfileDescription.js.map +1 -0
  72. package/dist/lib/userProfileDescription/scoringRulesConfig.d.ts +3 -0
  73. package/dist/lib/userProfileDescription/scoringRulesConfig.js +61 -0
  74. package/dist/lib/userProfileDescription/scoringRulesConfig.js.map +1 -0
  75. package/dist/lib/userProfileName/isValidUserProfileName.d.ts +10 -0
  76. package/dist/lib/userProfileName/isValidUserProfileName.js +60 -0
  77. package/dist/lib/userProfileName/isValidUserProfileName.js.map +1 -0
  78. package/dist/lib/userProfileName/scoringRulesConfig.d.ts +3 -0
  79. package/dist/lib/userProfileName/scoringRulesConfig.js +43 -0
  80. package/dist/lib/userProfileName/scoringRulesConfig.js.map +1 -0
  81. package/dist/lib/userProfileThumbnail/isValidUserProfileThumbnail.d.ts +22 -0
  82. package/dist/lib/userProfileThumbnail/isValidUserProfileThumbnail.js +62 -0
  83. package/dist/lib/userProfileThumbnail/isValidUserProfileThumbnail.js.map +1 -0
  84. package/dist/lib/userProfileThumbnail/scoringRulesConfig.d.ts +3 -0
  85. package/dist/lib/userProfileThumbnail/scoringRulesConfig.js +37 -0
  86. package/dist/lib/userProfileThumbnail/scoringRulesConfig.js.map +1 -0
  87. package/dist/lib/util/assertString.d.ts +11 -0
  88. package/dist/lib/util/assertString.js +20 -0
  89. package/dist/lib/util/assertString.js.map +1 -0
  90. package/dist/lib/util/contains.d.ts +7 -0
  91. package/dist/lib/util/contains.js +17 -0
  92. package/dist/lib/util/contains.js.map +1 -0
  93. package/dist/lib/util/getNumberOfStrings.d.ts +6 -0
  94. package/dist/lib/util/getNumberOfStrings.js +25 -0
  95. package/dist/lib/util/getNumberOfStrings.js.map +1 -0
  96. package/dist/lib/util/getScoringRules.d.ts +21 -0
  97. package/dist/lib/util/getScoringRules.js +99 -0
  98. package/dist/lib/util/getScoringRules.js.map +1 -0
  99. package/dist/lib/util/getThumbnailFileName.d.ts +15 -0
  100. package/dist/lib/util/getThumbnailFileName.js +26 -0
  101. package/dist/lib/util/getThumbnailFileName.js.map +1 -0
  102. package/dist/lib/util/isArcGISDomain.d.ts +6 -0
  103. package/dist/lib/util/isArcGISDomain.js +16 -0
  104. package/dist/lib/util/isArcGISDomain.js.map +1 -0
  105. package/dist/lib/util/isArcGISOnlineReservedThumbnailName.d.ts +6 -0
  106. package/dist/lib/util/isArcGISOnlineReservedThumbnailName.js +19 -0
  107. package/dist/lib/util/isArcGISOnlineReservedThumbnailName.js.map +1 -0
  108. package/dist/lib/util/isDefined.d.ts +8 -0
  109. package/dist/lib/util/isDefined.js +15 -0
  110. package/dist/lib/util/isDefined.js.map +1 -0
  111. package/dist/lib/util/isEmail.d.ts +6 -0
  112. package/dist/lib/util/isEmail.js +14 -0
  113. package/dist/lib/util/isEmail.js.map +1 -0
  114. package/dist/lib/util/isEmpty.d.ts +6 -0
  115. package/dist/lib/util/isEmpty.js +17 -0
  116. package/dist/lib/util/isEmpty.js.map +1 -0
  117. package/dist/lib/util/isFeatureCollection.d.ts +7 -0
  118. package/dist/lib/util/isFeatureCollection.js +13 -0
  119. package/dist/lib/util/isFeatureCollection.js.map +1 -0
  120. package/dist/lib/util/isHosted.d.ts +7 -0
  121. package/dist/lib/util/isHosted.js +17 -0
  122. package/dist/lib/util/isHosted.js.map +1 -0
  123. package/dist/lib/util/isSecureProtocol.d.ts +6 -0
  124. package/dist/lib/util/isSecureProtocol.js +16 -0
  125. package/dist/lib/util/isSecureProtocol.js.map +1 -0
  126. package/dist/lib/util/isUppercase.d.ts +4 -0
  127. package/dist/lib/util/isUppercase.js +14 -0
  128. package/dist/lib/util/isUppercase.js.map +1 -0
  129. package/dist/lib/util/isUrl.d.ts +4 -0
  130. package/dist/lib/util/isUrl.js +12 -0
  131. package/dist/lib/util/isUrl.js.map +1 -0
  132. package/dist/lib/util/matches.d.ts +12 -0
  133. package/dist/lib/util/matches.js +22 -0
  134. package/dist/lib/util/matches.js.map +1 -0
  135. package/dist/lib/util/stringsConfig.d.ts +17 -0
  136. package/dist/lib/util/stringsConfig.js +42 -0
  137. package/dist/lib/util/stringsConfig.js.map +1 -0
  138. package/dist/lib/util/toString.d.ts +11 -0
  139. package/dist/lib/util/toString.js +31 -0
  140. package/dist/lib/util/toString.js.map +1 -0
  141. package/dist/lib/validate/validate.d.ts +11 -0
  142. package/dist/lib/validate/validate.js +62 -0
  143. package/dist/lib/validate/validate.js.map +1 -0
  144. package/dist/locale/de.json +195 -0
  145. package/dist/locale/en.json +195 -0
  146. package/dist/locale/es.json +195 -0
  147. package/dist/locale/fr.json +195 -0
  148. package/dist/locale/ja.json +195 -0
  149. package/dist/locale/pt-br.json +195 -0
  150. package/dist/types/index.d.ts +114 -0
  151. package/dist/types/index.js +16 -0
  152. package/dist/types/index.js.map +1 -0
  153. 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,3 @@
1
+ import { ScoringRulesConfig } from '../../types';
2
+ declare const config: ScoringRulesConfig;
3
+ export default config;
@@ -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":"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"}
@@ -0,0 +1,3 @@
1
+ import { ScoringRulesConfig } from '../../types';
2
+ declare const config: ScoringRulesConfig;
3
+ export default config;
@@ -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(/(&#10;&#13;)/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,3 @@
1
+ import { ScoringRulesConfig } from '../../types';
2
+ declare const config: ScoringRulesConfig;
3
+ export default config;
@@ -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;