@xyo-network/crypto-nft-diviner-score-plugin 2.97.0-rc.1 → 2.97.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 (148) hide show
  1. package/dist/browser/Diviner.d.cts +2 -6
  2. package/dist/browser/Diviner.d.cts.map +1 -1
  3. package/dist/browser/Diviner.d.mts +2 -6
  4. package/dist/browser/Diviner.d.mts.map +1 -1
  5. package/dist/browser/Diviner.d.ts +2 -6
  6. package/dist/browser/Diviner.d.ts.map +1 -1
  7. package/dist/browser/Plugin.d.cts +7 -7
  8. package/dist/browser/Plugin.d.mts +7 -7
  9. package/dist/browser/Plugin.d.ts +7 -7
  10. package/dist/browser/index.cjs +1 -371
  11. package/dist/browser/index.cjs.map +1 -1
  12. package/dist/browser/index.js +1 -352
  13. package/dist/browser/index.js.map +1 -1
  14. package/dist/browser/lib/rating/analyzeNft.d.cts.map +1 -1
  15. package/dist/browser/lib/rating/analyzeNft.d.mts.map +1 -1
  16. package/dist/browser/lib/rating/analyzeNft.d.ts.map +1 -1
  17. package/dist/browser/lib/rating/criteria/scoring/metadata/animationUrl.d.cts.map +1 -1
  18. package/dist/browser/lib/rating/criteria/scoring/metadata/animationUrl.d.mts.map +1 -1
  19. package/dist/browser/lib/rating/criteria/scoring/metadata/animationUrl.d.ts.map +1 -1
  20. package/dist/browser/lib/rating/criteria/scoring/metadata/attributes/evaluateAttributes.d.cts.map +1 -1
  21. package/dist/browser/lib/rating/criteria/scoring/metadata/attributes/evaluateAttributes.d.mts.map +1 -1
  22. package/dist/browser/lib/rating/criteria/scoring/metadata/attributes/evaluateAttributes.d.ts.map +1 -1
  23. package/dist/browser/lib/rating/criteria/scoring/metadata/backgroundColor.d.cts.map +1 -1
  24. package/dist/browser/lib/rating/criteria/scoring/metadata/backgroundColor.d.mts.map +1 -1
  25. package/dist/browser/lib/rating/criteria/scoring/metadata/backgroundColor.d.ts.map +1 -1
  26. package/dist/browser/lib/rating/criteria/scoring/metadata/description.d.cts.map +1 -1
  27. package/dist/browser/lib/rating/criteria/scoring/metadata/description.d.mts.map +1 -1
  28. package/dist/browser/lib/rating/criteria/scoring/metadata/description.d.ts.map +1 -1
  29. package/dist/browser/lib/rating/criteria/scoring/metadata/externalUrl.d.cts.map +1 -1
  30. package/dist/browser/lib/rating/criteria/scoring/metadata/externalUrl.d.mts.map +1 -1
  31. package/dist/browser/lib/rating/criteria/scoring/metadata/externalUrl.d.ts.map +1 -1
  32. package/dist/browser/lib/rating/criteria/scoring/metadata/image.d.cts.map +1 -1
  33. package/dist/browser/lib/rating/criteria/scoring/metadata/image.d.mts.map +1 -1
  34. package/dist/browser/lib/rating/criteria/scoring/metadata/image.d.ts.map +1 -1
  35. package/dist/browser/lib/rating/criteria/scoring/metadata/imageData.d.cts.map +1 -1
  36. package/dist/browser/lib/rating/criteria/scoring/metadata/imageData.d.mts.map +1 -1
  37. package/dist/browser/lib/rating/criteria/scoring/metadata/imageData.d.ts.map +1 -1
  38. package/dist/browser/lib/rating/criteria/scoring/metadata/name.d.cts.map +1 -1
  39. package/dist/browser/lib/rating/criteria/scoring/metadata/name.d.mts.map +1 -1
  40. package/dist/browser/lib/rating/criteria/scoring/metadata/name.d.ts.map +1 -1
  41. package/dist/browser/lib/rating/criteria/scoring/metadata/youtubeUrl.d.cts.map +1 -1
  42. package/dist/browser/lib/rating/criteria/scoring/metadata/youtubeUrl.d.mts.map +1 -1
  43. package/dist/browser/lib/rating/criteria/scoring/metadata/youtubeUrl.d.ts.map +1 -1
  44. package/dist/browser/lib/rating/criteria/scoring/tokenId.d.cts +0 -6
  45. package/dist/browser/lib/rating/criteria/scoring/tokenId.d.cts.map +1 -1
  46. package/dist/browser/lib/rating/criteria/scoring/tokenId.d.mts +0 -6
  47. package/dist/browser/lib/rating/criteria/scoring/tokenId.d.mts.map +1 -1
  48. package/dist/browser/lib/rating/criteria/scoring/tokenId.d.ts +0 -6
  49. package/dist/browser/lib/rating/criteria/scoring/tokenId.d.ts.map +1 -1
  50. package/dist/neutral/Diviner.d.cts +2 -6
  51. package/dist/neutral/Diviner.d.cts.map +1 -1
  52. package/dist/neutral/Diviner.d.mts +2 -6
  53. package/dist/neutral/Diviner.d.mts.map +1 -1
  54. package/dist/neutral/Diviner.d.ts +2 -6
  55. package/dist/neutral/Diviner.d.ts.map +1 -1
  56. package/dist/neutral/Plugin.d.cts +7 -7
  57. package/dist/neutral/Plugin.d.mts +7 -7
  58. package/dist/neutral/Plugin.d.ts +7 -7
  59. package/dist/neutral/index.cjs +1 -371
  60. package/dist/neutral/index.cjs.map +1 -1
  61. package/dist/neutral/index.js +1 -352
  62. package/dist/neutral/index.js.map +1 -1
  63. package/dist/neutral/lib/rating/analyzeNft.d.cts.map +1 -1
  64. package/dist/neutral/lib/rating/analyzeNft.d.mts.map +1 -1
  65. package/dist/neutral/lib/rating/analyzeNft.d.ts.map +1 -1
  66. package/dist/neutral/lib/rating/criteria/scoring/metadata/animationUrl.d.cts.map +1 -1
  67. package/dist/neutral/lib/rating/criteria/scoring/metadata/animationUrl.d.mts.map +1 -1
  68. package/dist/neutral/lib/rating/criteria/scoring/metadata/animationUrl.d.ts.map +1 -1
  69. package/dist/neutral/lib/rating/criteria/scoring/metadata/attributes/evaluateAttributes.d.cts.map +1 -1
  70. package/dist/neutral/lib/rating/criteria/scoring/metadata/attributes/evaluateAttributes.d.mts.map +1 -1
  71. package/dist/neutral/lib/rating/criteria/scoring/metadata/attributes/evaluateAttributes.d.ts.map +1 -1
  72. package/dist/neutral/lib/rating/criteria/scoring/metadata/backgroundColor.d.cts.map +1 -1
  73. package/dist/neutral/lib/rating/criteria/scoring/metadata/backgroundColor.d.mts.map +1 -1
  74. package/dist/neutral/lib/rating/criteria/scoring/metadata/backgroundColor.d.ts.map +1 -1
  75. package/dist/neutral/lib/rating/criteria/scoring/metadata/description.d.cts.map +1 -1
  76. package/dist/neutral/lib/rating/criteria/scoring/metadata/description.d.mts.map +1 -1
  77. package/dist/neutral/lib/rating/criteria/scoring/metadata/description.d.ts.map +1 -1
  78. package/dist/neutral/lib/rating/criteria/scoring/metadata/externalUrl.d.cts.map +1 -1
  79. package/dist/neutral/lib/rating/criteria/scoring/metadata/externalUrl.d.mts.map +1 -1
  80. package/dist/neutral/lib/rating/criteria/scoring/metadata/externalUrl.d.ts.map +1 -1
  81. package/dist/neutral/lib/rating/criteria/scoring/metadata/image.d.cts.map +1 -1
  82. package/dist/neutral/lib/rating/criteria/scoring/metadata/image.d.mts.map +1 -1
  83. package/dist/neutral/lib/rating/criteria/scoring/metadata/image.d.ts.map +1 -1
  84. package/dist/neutral/lib/rating/criteria/scoring/metadata/imageData.d.cts.map +1 -1
  85. package/dist/neutral/lib/rating/criteria/scoring/metadata/imageData.d.mts.map +1 -1
  86. package/dist/neutral/lib/rating/criteria/scoring/metadata/imageData.d.ts.map +1 -1
  87. package/dist/neutral/lib/rating/criteria/scoring/metadata/name.d.cts.map +1 -1
  88. package/dist/neutral/lib/rating/criteria/scoring/metadata/name.d.mts.map +1 -1
  89. package/dist/neutral/lib/rating/criteria/scoring/metadata/name.d.ts.map +1 -1
  90. package/dist/neutral/lib/rating/criteria/scoring/metadata/youtubeUrl.d.cts.map +1 -1
  91. package/dist/neutral/lib/rating/criteria/scoring/metadata/youtubeUrl.d.mts.map +1 -1
  92. package/dist/neutral/lib/rating/criteria/scoring/metadata/youtubeUrl.d.ts.map +1 -1
  93. package/dist/neutral/lib/rating/criteria/scoring/tokenId.d.cts +0 -6
  94. package/dist/neutral/lib/rating/criteria/scoring/tokenId.d.cts.map +1 -1
  95. package/dist/neutral/lib/rating/criteria/scoring/tokenId.d.mts +0 -6
  96. package/dist/neutral/lib/rating/criteria/scoring/tokenId.d.mts.map +1 -1
  97. package/dist/neutral/lib/rating/criteria/scoring/tokenId.d.ts +0 -6
  98. package/dist/neutral/lib/rating/criteria/scoring/tokenId.d.ts.map +1 -1
  99. package/dist/node/Diviner.d.cts +2 -6
  100. package/dist/node/Diviner.d.cts.map +1 -1
  101. package/dist/node/Diviner.d.mts +2 -6
  102. package/dist/node/Diviner.d.mts.map +1 -1
  103. package/dist/node/Diviner.d.ts +2 -6
  104. package/dist/node/Diviner.d.ts.map +1 -1
  105. package/dist/node/Plugin.d.cts +7 -7
  106. package/dist/node/Plugin.d.mts +7 -7
  107. package/dist/node/Plugin.d.ts +7 -7
  108. package/dist/node/index.cjs +1 -396
  109. package/dist/node/index.cjs.map +1 -1
  110. package/dist/node/index.js +1 -369
  111. package/dist/node/index.js.map +1 -1
  112. package/dist/node/lib/rating/analyzeNft.d.cts.map +1 -1
  113. package/dist/node/lib/rating/analyzeNft.d.mts.map +1 -1
  114. package/dist/node/lib/rating/analyzeNft.d.ts.map +1 -1
  115. package/dist/node/lib/rating/criteria/scoring/metadata/animationUrl.d.cts.map +1 -1
  116. package/dist/node/lib/rating/criteria/scoring/metadata/animationUrl.d.mts.map +1 -1
  117. package/dist/node/lib/rating/criteria/scoring/metadata/animationUrl.d.ts.map +1 -1
  118. package/dist/node/lib/rating/criteria/scoring/metadata/attributes/evaluateAttributes.d.cts.map +1 -1
  119. package/dist/node/lib/rating/criteria/scoring/metadata/attributes/evaluateAttributes.d.mts.map +1 -1
  120. package/dist/node/lib/rating/criteria/scoring/metadata/attributes/evaluateAttributes.d.ts.map +1 -1
  121. package/dist/node/lib/rating/criteria/scoring/metadata/backgroundColor.d.cts.map +1 -1
  122. package/dist/node/lib/rating/criteria/scoring/metadata/backgroundColor.d.mts.map +1 -1
  123. package/dist/node/lib/rating/criteria/scoring/metadata/backgroundColor.d.ts.map +1 -1
  124. package/dist/node/lib/rating/criteria/scoring/metadata/description.d.cts.map +1 -1
  125. package/dist/node/lib/rating/criteria/scoring/metadata/description.d.mts.map +1 -1
  126. package/dist/node/lib/rating/criteria/scoring/metadata/description.d.ts.map +1 -1
  127. package/dist/node/lib/rating/criteria/scoring/metadata/externalUrl.d.cts.map +1 -1
  128. package/dist/node/lib/rating/criteria/scoring/metadata/externalUrl.d.mts.map +1 -1
  129. package/dist/node/lib/rating/criteria/scoring/metadata/externalUrl.d.ts.map +1 -1
  130. package/dist/node/lib/rating/criteria/scoring/metadata/image.d.cts.map +1 -1
  131. package/dist/node/lib/rating/criteria/scoring/metadata/image.d.mts.map +1 -1
  132. package/dist/node/lib/rating/criteria/scoring/metadata/image.d.ts.map +1 -1
  133. package/dist/node/lib/rating/criteria/scoring/metadata/imageData.d.cts.map +1 -1
  134. package/dist/node/lib/rating/criteria/scoring/metadata/imageData.d.mts.map +1 -1
  135. package/dist/node/lib/rating/criteria/scoring/metadata/imageData.d.ts.map +1 -1
  136. package/dist/node/lib/rating/criteria/scoring/metadata/name.d.cts.map +1 -1
  137. package/dist/node/lib/rating/criteria/scoring/metadata/name.d.mts.map +1 -1
  138. package/dist/node/lib/rating/criteria/scoring/metadata/name.d.ts.map +1 -1
  139. package/dist/node/lib/rating/criteria/scoring/metadata/youtubeUrl.d.cts.map +1 -1
  140. package/dist/node/lib/rating/criteria/scoring/metadata/youtubeUrl.d.mts.map +1 -1
  141. package/dist/node/lib/rating/criteria/scoring/metadata/youtubeUrl.d.ts.map +1 -1
  142. package/dist/node/lib/rating/criteria/scoring/tokenId.d.cts +0 -6
  143. package/dist/node/lib/rating/criteria/scoring/tokenId.d.cts.map +1 -1
  144. package/dist/node/lib/rating/criteria/scoring/tokenId.d.mts +0 -6
  145. package/dist/node/lib/rating/criteria/scoring/tokenId.d.mts.map +1 -1
  146. package/dist/node/lib/rating/criteria/scoring/tokenId.d.ts +0 -6
  147. package/dist/node/lib/rating/criteria/scoring/tokenId.d.ts.map +1 -1
  148. package/package.json +16 -17
@@ -1,370 +1,2 @@
1
- // src/Diviner.ts
2
- import {
3
- isNftInfo,
4
- NftScoreDivinerConfigSchema,
5
- NftScoreSchema
6
- } from "@xyo-network/crypto-nft-payload-plugin";
7
- import { AbstractDiviner } from "@xyo-network/diviner-abstract";
8
- import { PayloadBuilder } from "@xyo-network/payload-builder";
9
-
10
- // src/lib/rating/criteria/scoring/contract.ts
11
- import { FAIL, PASS } from "@xyo-network/crypto-nft-score-model";
12
- import { isAddress } from "ethers";
13
- var scoreContractAddress = (nft) => {
14
- if (!nft.address) return FAIL;
15
- if (typeof nft.address !== "string") return FAIL;
16
- if (!isAddress(nft.address)) return FAIL;
17
- return PASS;
18
- };
19
-
20
- // src/lib/rating/criteria/scoring/metadata/animationUrl.ts
21
- import { incrementPossible, incrementTotal, incrementTotalAndPossible, PASS as PASS2 } from "@xyo-network/crypto-nft-score-model";
22
-
23
- // src/lib/rating/criteria/scoring/metadata/lib/urlHelpers.ts
24
- import { URL } from "@xylabs/url";
25
- var web3Protocols = ["ipfs:", "ar:"];
26
- var toUrl = (url) => {
27
- if (!url) return void 0;
28
- try {
29
- return new URL(url);
30
- } catch {
31
- return void 0;
32
- }
33
- };
34
- var isValidUrl = (url) => toUrl(url) !== void 0;
35
- var isWeb3 = (url) => web3Protocols.some((protocol) => {
36
- var _a;
37
- return protocol === ((_a = toUrl(url)) == null ? void 0 : _a.protocol);
38
- });
39
- var isSecure = (url) => {
40
- var _a;
41
- return isWeb3(url) || ((_a = toUrl(url)) == null ? void 0 : _a.protocol) === "https:";
42
- };
43
-
44
- // src/lib/rating/criteria/scoring/metadata/animationUrl.ts
45
- var scoreNftAnimationUrl = (nft) => {
46
- var _a;
47
- return scoreAnimationUrl((_a = nft.metadata) == null ? void 0 : _a.animation_url);
48
- };
49
- var scoreAnimationUrl = (animation_url) => {
50
- const score = [0, 0];
51
- if (animation_url === void 0 || animation_url === null) return PASS2;
52
- incrementPossible(score);
53
- if (typeof animation_url !== "string") return score;
54
- incrementTotalAndPossible(score);
55
- if (!isValidUrl(animation_url)) return score;
56
- incrementTotalAndPossible(score);
57
- if (!isSecure(animation_url)) return score;
58
- incrementTotalAndPossible(score);
59
- if (!isWeb3(animation_url)) return score;
60
- return incrementTotal(score);
61
- };
62
-
63
- // src/lib/rating/criteria/scoring/metadata/attributes/evaluateAttributes.ts
64
- import { incrementPossible as incrementPossible2, incrementTotal as incrementTotal2, incrementTotalAndPossible as incrementTotalAndPossible2 } from "@xyo-network/crypto-nft-score-model";
65
- var isDate = (value) => {
66
- if (isNumber(value)) {
67
- try {
68
- new Date(value);
69
- return true;
70
- } catch {
71
- return false;
72
- }
73
- }
74
- return false;
75
- };
76
- var isNumber = (value) => typeof value === "number";
77
- var isPercentage = (value) => isNumber(value) && value >= 0 && value <= 100;
78
- var isNonEmptyString = (value) => typeof value === "string" && value.length > 0;
79
- var isNonEmptyStringOrNumber = (value) => value === "number" || isNonEmptyString(value);
80
- var evaluateNftAttributes = (nft) => {
81
- var _a, _b;
82
- return ((_a = nft == null ? void 0 : nft.metadata) == null ? void 0 : _a.attributes) ? evaluateAttributes((_b = nft == null ? void 0 : nft.metadata) == null ? void 0 : _b.attributes) : [0, 1];
83
- };
84
- var evaluateAttributes = (attributes) => {
85
- if (!attributes || !Array.isArray(attributes) || attributes.length === 0) return [0, 1];
86
- const score = [0, 0];
87
- for (const attribute of attributes) {
88
- const [attributeTotal, attributePossible] = evaluateAttribute(attribute);
89
- incrementTotalAndPossible2(score, attributeTotal, attributePossible);
90
- }
91
- return [1, 1];
92
- };
93
- var evaluateAttribute = (attribute) => {
94
- const score = [0, 1];
95
- const max_value = attribute == null ? void 0 : attribute.max_value;
96
- const trait_type = attribute == null ? void 0 : attribute.trait_type;
97
- const value = attribute == null ? void 0 : attribute.value;
98
- if (!attribute || typeof attribute !== "object" || !isNonEmptyString(trait_type) || !isNonEmptyStringOrNumber(value)) return score;
99
- incrementTotal2(score);
100
- incrementPossible2(score);
101
- if (validDisplayType(attribute)) incrementTotal2(score);
102
- if (max_value !== void 0) {
103
- incrementPossible2(score);
104
- if (isNumber(max_value) && isNumber(value) && value <= max_value) incrementTotal2(score);
105
- }
106
- return score;
107
- };
108
- var validDisplayType = (attribute) => {
109
- switch (attribute == null ? void 0 : attribute.display_type) {
110
- case "number":
111
- case "boost_number": {
112
- if (isNumber(attribute == null ? void 0 : attribute.value)) return true;
113
- break;
114
- }
115
- case "boost_percentage": {
116
- if (isPercentage(attribute == null ? void 0 : attribute.value)) return true;
117
- break;
118
- }
119
- case "date": {
120
- if (isDate(attribute == null ? void 0 : attribute.value)) return true;
121
- break;
122
- }
123
- case "string":
124
- case void 0: {
125
- if (isNonEmptyString(attribute == null ? void 0 : attribute.value)) return true;
126
- break;
127
- }
128
- default: {
129
- break;
130
- }
131
- }
132
- return false;
133
- };
134
-
135
- // src/lib/rating/criteria/scoring/metadata/backgroundColor.ts
136
- import { incrementPossible as incrementPossible3, incrementTotal as incrementTotal3, incrementTotalAndPossible as incrementTotalAndPossible3, PASS as PASS3 } from "@xyo-network/crypto-nft-score-model";
137
- var isHexColor = /^[\da-f]{6}$/i;
138
- var scoreNftBackgroundColor = (nft) => {
139
- var _a;
140
- return scoreBackgroundColor((_a = nft.metadata) == null ? void 0 : _a.background_color);
141
- };
142
- var scoreBackgroundColor = (background_color) => {
143
- const score = [0, 0];
144
- if (background_color === void 0 || background_color === null) return PASS3;
145
- incrementPossible3(score);
146
- if (typeof background_color !== "string") return score;
147
- incrementTotalAndPossible3(score);
148
- if (!isHexColor.test(background_color.toUpperCase())) return score;
149
- return incrementTotal3(score);
150
- };
151
-
152
- // src/lib/rating/criteria/scoring/metadata/description.ts
153
- import { incrementTotal as incrementTotal4 } from "@xyo-network/crypto-nft-score-model";
154
- var scoreNftDescription = (nft) => {
155
- var _a;
156
- return scoreDescription((_a = nft.metadata) == null ? void 0 : _a.description);
157
- };
158
- var scoreDescription = (description) => {
159
- const score = [0, 1];
160
- if (!description || typeof description !== "string") return score;
161
- return incrementTotal4(score);
162
- };
163
-
164
- // src/lib/rating/criteria/scoring/metadata/externalUrl.ts
165
- import { incrementTotal as incrementTotal5 } from "@xyo-network/crypto-nft-score-model";
166
- var scoreNftExternalUrl = (nft) => {
167
- var _a;
168
- return scoreExternalUrl((_a = nft == null ? void 0 : nft.metadata) == null ? void 0 : _a.external_url);
169
- };
170
- var scoreExternalUrl = (external_url) => {
171
- const score = [0, 2];
172
- if (external_url === void 0 || external_url === null || typeof external_url !== "string" || !isValidUrl(external_url)) return score;
173
- incrementTotal5(score);
174
- if (!isSecure(external_url)) return score;
175
- return incrementTotal5(score);
176
- };
177
-
178
- // src/lib/rating/criteria/scoring/metadata/image.ts
179
- import { incrementTotal as incrementTotal6, PASS as PASS4 } from "@xyo-network/crypto-nft-score-model";
180
- var MaxPossibleImageScore = 3;
181
- var scoreNftImage = (nft) => {
182
- var _a, _b, _c;
183
- if ((_a = nft == null ? void 0 : nft.metadata) == null ? void 0 : _a.image) {
184
- return scoreImage((_b = nft.metadata) == null ? void 0 : _b.image);
185
- } else {
186
- return ((_c = nft.metadata) == null ? void 0 : _c.image_data) ? PASS4 : [0, MaxPossibleImageScore];
187
- }
188
- };
189
- var scoreImage = (image) => {
190
- const score = [0, MaxPossibleImageScore];
191
- if (!image || typeof image !== "string" || !isValidUrl(image)) return score;
192
- incrementTotal6(score);
193
- if (!isSecure(image)) return score;
194
- incrementTotal6(score);
195
- if (!isWeb3(image)) return score;
196
- incrementTotal6(score);
197
- return score;
198
- };
199
-
200
- // src/lib/rating/criteria/scoring/metadata/imageData.ts
201
- import { PASS as PASS5 } from "@xyo-network/crypto-nft-score-model";
202
- import { parse } from "svg-parser";
203
- var MaxPossibleImageDataScore = 1;
204
- var isValidImageData = (image_data) => {
205
- if (!image_data.startsWith("<svg")) return false;
206
- try {
207
- parse(image_data);
208
- return true;
209
- } catch {
210
- return false;
211
- }
212
- };
213
- var scoreNftImageData = (nft) => {
214
- var _a, _b, _c;
215
- if ((_a = nft == null ? void 0 : nft.metadata) == null ? void 0 : _a.image_data) {
216
- return scoreImageData((_b = nft.metadata) == null ? void 0 : _b.image_data);
217
- } else {
218
- return ((_c = nft.metadata) == null ? void 0 : _c.image) ? PASS5 : [0, MaxPossibleImageDataScore];
219
- }
220
- };
221
- var scoreImageData = (image_data) => {
222
- return !image_data || typeof image_data !== "string" || !isValidImageData(image_data) ? [0, MaxPossibleImageDataScore] : [MaxPossibleImageDataScore, MaxPossibleImageDataScore];
223
- };
224
-
225
- // src/lib/rating/criteria/scoring/metadata/name.ts
226
- import { incrementTotal as incrementTotal7 } from "@xyo-network/crypto-nft-score-model";
227
- var scoreNftName = (nft) => {
228
- var _a;
229
- return scoreName((_a = nft.metadata) == null ? void 0 : _a.name);
230
- };
231
- var scoreName = (name) => {
232
- const score = [0, 1];
233
- if (!name || typeof name !== "string") return score;
234
- return incrementTotal7(score);
235
- };
236
-
237
- // src/lib/rating/criteria/scoring/metadata/youtubeUrl.ts
238
- import { incrementTotal as incrementTotal8, PASS as PASS6 } from "@xyo-network/crypto-nft-score-model";
239
- var scoreNftYoutubeUrl = (nft) => {
240
- var _a;
241
- return scoreYoutubeUrl((_a = nft == null ? void 0 : nft.metadata) == null ? void 0 : _a.youtube_url);
242
- };
243
- var scoreYoutubeUrl = (youtube_url) => {
244
- if (youtube_url === void 0 || youtube_url === null) return PASS6;
245
- const score = [0, 2];
246
- if (typeof youtube_url !== "string" || !isValidUrl(youtube_url)) return score;
247
- incrementTotal8(score);
248
- if (!isSecure(youtube_url)) return score;
249
- return incrementTotal8(score);
250
- };
251
-
252
- // src/lib/rating/criteria/scoring/supply.ts
253
- import { FAIL as FAIL2, PASS as PASS7 } from "@xyo-network/crypto-nft-score-model";
254
- var scoreSupply = (nft) => {
255
- if (!nft.supply) return FAIL2;
256
- if (typeof nft.supply !== "string") return FAIL2;
257
- try {
258
- return BigInt(nft.tokenId) >= 0n && BigInt(nft.tokenId) < 2n ** 256n ? PASS7 : FAIL2;
259
- } catch {
260
- return FAIL2;
261
- }
262
- };
263
-
264
- // src/lib/rating/criteria/scoring/tokenId.ts
265
- import { FAIL as FAIL3, PASS as PASS8 } from "@xyo-network/crypto-nft-score-model";
266
- var scoreTokenId = (nft) => {
267
- if (!nft.tokenId) return FAIL3;
268
- if (typeof nft.tokenId !== "string") return FAIL3;
269
- try {
270
- return BigInt(nft.tokenId) >= 0n && BigInt(nft.tokenId) < 2n ** 256n ? PASS8 : FAIL3;
271
- } catch {
272
- return FAIL3;
273
- }
274
- };
275
-
276
- // src/lib/rating/criteria/scoring/type.ts
277
- import { FAIL as FAIL4, PASS as PASS9 } from "@xyo-network/crypto-nft-score-model";
278
- var scoreType = (nft) => {
279
- if (!nft.type) return FAIL4;
280
- if (typeof nft.type !== "string") return FAIL4;
281
- const type = nft.type.toUpperCase();
282
- if (type !== "ERC721" && type !== "ERC1155") return FAIL4;
283
- return PASS9;
284
- };
285
-
286
- // src/lib/rating/criteria/scoringCriteria.ts
287
- var attributesScoringCriteria = {
288
- Attributes: { score: evaluateNftAttributes, weight: 1 }
289
- };
290
- var metadataScoringCriteria = {
291
- "Animation URL": { score: scoreNftAnimationUrl, weight: 1 },
292
- "Background Color": { score: scoreNftBackgroundColor, weight: 1 },
293
- Description: { score: scoreNftDescription, weight: 1 },
294
- "External Url": { score: scoreNftExternalUrl, weight: 1 },
295
- Image: { score: scoreNftImage, weight: 1 },
296
- "Image Data": { score: scoreNftImageData, weight: 1 },
297
- Name: { score: scoreNftName, weight: 1 },
298
- "YouTube URL": { score: scoreNftYoutubeUrl, weight: 1 },
299
- ...attributesScoringCriteria
300
- };
301
- var scoringCriteria = {
302
- "Contract Address": { score: scoreContractAddress, weight: 1 },
303
- Supply: { score: scoreSupply, weight: 1 },
304
- "Token Id": { score: scoreTokenId, weight: 1 },
305
- Type: { score: scoreType, weight: 1 },
306
- ...metadataScoringCriteria
307
- };
308
-
309
- // src/lib/rating/analyzeNft.ts
310
- var analyzeNft = async (nft) => {
311
- const result = Object.fromEntries(
312
- await Promise.all(
313
- Object.entries(scoringCriteria).map(async ([key, { score, weight }]) => {
314
- const rawScore = await score(nft);
315
- const weighted = rawScore.map((v) => v * weight);
316
- return [key, weighted];
317
- })
318
- )
319
- );
320
- return result;
321
- };
322
-
323
- // src/Diviner.ts
324
- var toNftScorePayload = (nftInfo, scores) => {
325
- const { address, chainId, type } = nftInfo;
326
- return { address, chainId, schema: NftScoreSchema, scores, type };
327
- };
328
- var isNftScore = (payload) => payload.schema === NftScoreSchema;
329
- var NftScoreDiviner = class extends AbstractDiviner {
330
- static configSchemas = [...super.configSchemas, NftScoreDivinerConfigSchema];
331
- static defaultConfigSchema = NftScoreDivinerConfigSchema;
332
- divineHandler = async (payloads) => {
333
- const nftInfos = (payloads == null ? void 0 : payloads.filter(isNftInfo)) ?? [];
334
- const results = await Promise.all(
335
- nftInfos.map(async (nftInfo) => {
336
- const [score, sourceHash] = await Promise.all([
337
- // Analyze the NFT
338
- toNftScorePayload(nftInfo, await analyzeNft(nftInfo)),
339
- // Hash the source payload
340
- PayloadBuilder.dataHash(nftInfo)
341
- ]);
342
- return { ...score, sources: [sourceHash] };
343
- })
344
- );
345
- return results;
346
- };
347
- };
348
-
349
- // src/Plugin.ts
350
- import { NftSchema } from "@xyo-network/crypto-nft-payload-plugin";
351
- import { PayloadSetSchema } from "@xyo-network/payload-model";
352
- import { createPayloadSetDivinerPlugin } from "@xyo-network/payloadset-plugin";
353
- var NftScoreDivinerPlugin = () => createPayloadSetDivinerPlugin(
354
- { required: { [NftSchema]: 1 }, schema: PayloadSetSchema },
355
- {
356
- diviner: async (params) => {
357
- const result = await NftScoreDiviner.create(params);
358
- return result;
359
- }
360
- }
361
- );
362
- export {
363
- NftScoreDiviner,
364
- NftScoreDivinerPlugin,
365
- analyzeNft,
366
- NftScoreDivinerPlugin as default,
367
- isNftScore,
368
- scoringCriteria
369
- };
1
+ import{isNftInfo as Oe,NftScoreDivinerConfigSchema as Y,NftScoreSchema as j}from"@xyo-network/crypto-nft-payload-plugin";import{AbstractDiviner as Te}from"@xyo-network/diviner-abstract";import{PayloadBuilder as Ue}from"@xyo-network/payload-builder";import{FAIL as p,PASS as M}from"@xyo-network/crypto-nft-score-model";import{isAddress as q}from"ethers";var x=e=>e.address?typeof e.address!="string"?p:q(e.address)?M:p:p;import{incrementPossible as J,incrementTotal as Q,incrementTotalAndPossible as N,PASS as X}from"@xyo-network/crypto-nft-score-model";import{URL as $}from"@xylabs/url";var G=["ipfs:","ar:"],u=e=>{if(e)try{return new $(e)}catch{return}},s=e=>u(e)!==void 0,c=e=>G.some(r=>{var o;return r===((o=u(e))==null?void 0:o.protocol)});var i=e=>{var r;return c(e)||((r=u(e))==null?void 0:r.protocol)==="https:"};var A=e=>{var r;return Z((r=e.metadata)==null?void 0:r.animation_url)},Z=e=>{let r=[0,0];return e==null?X:(J(r),typeof e!="string"||(N(r),!s(e))||(N(r),!i(e))||(N(r),!c(e))?r:Q(r))};import{incrementPossible as h,incrementTotal as g,incrementTotalAndPossible as _}from"@xyo-network/crypto-nft-score-model";var ee=e=>{if(a(e))try{return new Date(e),!0}catch{return!1}return!1},a=e=>typeof e=="number",re=e=>a(e)&&e>=0&&e<=100,I=e=>typeof e=="string"&&e.length>0,oe=e=>e==="number"||I(e),w=e=>{var r,o;return(r=e==null?void 0:e.metadata)!=null&&r.attributes?te((o=e==null?void 0:e.metadata)==null?void 0:o.attributes):[0,1]},te=e=>{if(!e||!Array.isArray(e)||e.length===0)return[0,1];let r=[0,0];for(let o of e){let[t,n]=ne(o);_(r,t,n)}return[1,1]},ne=e=>{let r=[0,1],o=e==null?void 0:e.max_value,t=e==null?void 0:e.trait_type,n=e==null?void 0:e.value;return!e||typeof e!="object"||!I(t)||!oe(n)||(g(r),h(r),se(e)&&g(r),o!==void 0&&(h(r),a(o)&&a(n)&&n<=o&&g(r))),r},se=e=>{switch(e==null?void 0:e.display_type){case"number":case"boost_number":{if(a(e==null?void 0:e.value))return!0;break}case"boost_percentage":{if(re(e==null?void 0:e.value))return!0;break}case"date":{if(ee(e==null?void 0:e.value))return!0;break}case"string":case void 0:{if(I(e==null?void 0:e.value))return!0;break}default:break}return!1};import{incrementPossible as ie,incrementTotal as ce,incrementTotalAndPossible as ae,PASS as fe}from"@xyo-network/crypto-nft-score-model";var le=/^[\da-f]{6}$/i,k=e=>{var r;return me((r=e.metadata)==null?void 0:r.background_color)},me=e=>{let r=[0,0];return e==null?fe:(ie(r),typeof e!="string"||(ae(r),!le.test(e.toUpperCase()))?r:ce(r))};import{incrementTotal as de}from"@xyo-network/crypto-nft-score-model";var v=e=>{var r;return Se((r=e.metadata)==null?void 0:r.description)},Se=e=>{let r=[0,1];return!e||typeof e!="string"?r:de(r)};import{incrementTotal as D}from"@xyo-network/crypto-nft-score-model";var C=e=>{var r;return pe((r=e==null?void 0:e.metadata)==null?void 0:r.external_url)},pe=e=>{let r=[0,2];return e==null||typeof e!="string"||!s(e)||(D(r),!i(e))?r:D(r)};import{incrementTotal as y,PASS as ue}from"@xyo-network/crypto-nft-score-model";var O=3,T=e=>{var r,o,t;return(r=e==null?void 0:e.metadata)!=null&&r.image?Ne((o=e.metadata)==null?void 0:o.image):(t=e.metadata)!=null&&t.image_data?ue:[0,O]},Ne=e=>{let r=[0,O];return!e||typeof e!="string"||!s(e)||(y(r),!i(e))||(y(r),!c(e))||y(r),r};import{PASS as ge}from"@xyo-network/crypto-nft-score-model";import{parse as Ie}from"svg-parser";var f=1,ye=e=>{if(!e.startsWith("<svg"))return!1;try{return Ie(e),!0}catch{return!1}},U=e=>{var r,o,t;return(r=e==null?void 0:e.metadata)!=null&&r.image_data?Fe((o=e.metadata)==null?void 0:o.image_data):(t=e.metadata)!=null&&t.image?ge:[0,f]},Fe=e=>!e||typeof e!="string"||!ye(e)?[0,f]:[f,f];import{incrementTotal as Pe}from"@xyo-network/crypto-nft-score-model";var b=e=>{var r;return xe((r=e.metadata)==null?void 0:r.name)},xe=e=>{let r=[0,1];return!e||typeof e!="string"?r:Pe(r)};import{incrementTotal as B,PASS as Ae}from"@xyo-network/crypto-nft-score-model";var E=e=>{var r;return he((r=e==null?void 0:e.metadata)==null?void 0:r.youtube_url)},he=e=>{if(e==null)return Ae;let r=[0,2];return typeof e!="string"||!s(e)||(B(r),!i(e))?r:B(r)};import{FAIL as l,PASS as we}from"@xyo-network/crypto-nft-score-model";var L=e=>{if(!e.supply)return l;if(typeof e.supply!="string")return l;try{return BigInt(e.tokenId)>=0n&&BigInt(e.tokenId)<2n**256n?we:l}catch{return l}};import{FAIL as m,PASS as ke}from"@xyo-network/crypto-nft-score-model";var R=e=>{if(!e.tokenId)return m;if(typeof e.tokenId!="string")return m;try{return BigInt(e.tokenId)>=0n&&BigInt(e.tokenId)<2n**256n?ke:m}catch{return m}};import{FAIL as F,PASS as ve}from"@xyo-network/crypto-nft-score-model";var V=e=>{if(!e.type)return F;if(typeof e.type!="string")return F;let r=e.type.toUpperCase();return r!=="ERC721"&&r!=="ERC1155"?F:ve};var De={Attributes:{score:w,weight:1}},Ce={"Animation URL":{score:A,weight:1},"Background Color":{score:k,weight:1},Description:{score:v,weight:1},"External Url":{score:C,weight:1},Image:{score:T,weight:1},"Image Data":{score:U,weight:1},Name:{score:b,weight:1},"YouTube URL":{score:E,weight:1},...De},W={"Contract Address":{score:x,weight:1},Supply:{score:L,weight:1},"Token Id":{score:R,weight:1},Type:{score:V,weight:1},...Ce};var H=async e=>Object.fromEntries(await Promise.all(Object.entries(W).map(async([o,{score:t,weight:n}])=>{let S=(await t(e)).map(z=>z*n);return[o,S]})));var be=(e,r)=>{let{address:o,chainId:t,type:n}=e;return{address:o,chainId:t,schema:j,scores:r,type:n}},jr=e=>e.schema===j,d=class extends Te{static configSchemas=[...super.configSchemas,Y];static defaultConfigSchema=Y;divineHandler=async r=>{let o=(r==null?void 0:r.filter(Oe))??[];return await Promise.all(o.map(async n=>{let[P,S]=await Promise.all([be(n,await H(n)),Ue.dataHash(n)]);return{...P,sources:[S]}}))}};import{NftSchema as Be}from"@xyo-network/crypto-nft-payload-plugin";import{PayloadSetSchema as Ee}from"@xyo-network/payload-model";import{createPayloadSetDivinerPlugin as Le}from"@xyo-network/payloadset-plugin";var K=()=>Le({required:{[Be]:1},schema:Ee},{diviner:async e=>await d.create(e)});export{d as NftScoreDiviner,K as NftScoreDivinerPlugin,H as analyzeNft,K as default,jr as isNftScore,W as scoringCriteria};
370
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/Diviner.ts","../../src/lib/rating/criteria/scoring/contract.ts","../../src/lib/rating/criteria/scoring/metadata/animationUrl.ts","../../src/lib/rating/criteria/scoring/metadata/lib/urlHelpers.ts","../../src/lib/rating/criteria/scoring/metadata/attributes/evaluateAttributes.ts","../../src/lib/rating/criteria/scoring/metadata/backgroundColor.ts","../../src/lib/rating/criteria/scoring/metadata/description.ts","../../src/lib/rating/criteria/scoring/metadata/externalUrl.ts","../../src/lib/rating/criteria/scoring/metadata/image.ts","../../src/lib/rating/criteria/scoring/metadata/imageData.ts","../../src/lib/rating/criteria/scoring/metadata/name.ts","../../src/lib/rating/criteria/scoring/metadata/youtubeUrl.ts","../../src/lib/rating/criteria/scoring/supply.ts","../../src/lib/rating/criteria/scoring/tokenId.ts","../../src/lib/rating/criteria/scoring/type.ts","../../src/lib/rating/criteria/scoringCriteria.ts","../../src/lib/rating/analyzeNft.ts","../../src/Plugin.ts"],"sourcesContent":["import {\n isNftInfo,\n NftInfo,\n NftScore,\n NftScoreDivinerConfig,\n NftScoreDivinerConfigSchema,\n NftScoreSchema,\n} from '@xyo-network/crypto-nft-payload-plugin'\nimport { AbstractDiviner } from '@xyo-network/diviner-abstract'\nimport { DivinerParams } from '@xyo-network/diviner-model'\nimport { AnyConfigSchema } from '@xyo-network/module-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload, Schema } from '@xyo-network/payload-model'\n\nimport { analyzeNft, NftAnalysis } from './lib'\n\nexport type NftScoreDivinerParams = DivinerParams<AnyConfigSchema<NftScoreDivinerConfig>>\n\nconst toNftScorePayload = (nftInfo: NftInfo, scores: NftAnalysis): NftScore => {\n const { address, chainId, type } = nftInfo\n return { address, chainId, schema: NftScoreSchema, scores, type }\n}\n\nexport const isNftScore = (payload: Payload): payload is NftScore => payload.schema === NftScoreSchema\n\nexport class NftScoreDiviner<TParams extends NftScoreDivinerParams = NftScoreDivinerParams> extends AbstractDiviner<TParams> {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, NftScoreDivinerConfigSchema]\n static override readonly defaultConfigSchema: Schema = NftScoreDivinerConfigSchema\n\n protected override divineHandler = async (payloads?: Payload[]): Promise<Payload[]> => {\n const nftInfos = payloads?.filter(isNftInfo) ?? []\n const results = await Promise.all(\n nftInfos.map<Promise<NftScore>>(async (nftInfo) => {\n const [score, sourceHash] = await Promise.all([\n // Analyze the NFT\n toNftScorePayload(nftInfo, await analyzeNft(nftInfo)),\n // Hash the source payload\n PayloadBuilder.dataHash(nftInfo),\n ])\n return { ...score, sources: [sourceHash] }\n }),\n )\n return results\n }\n}\n","import { NftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport { FAIL, PASS, PassFailScoringFunction } from '@xyo-network/crypto-nft-score-model'\nimport { isAddress } from 'ethers'\n\nexport const scoreContractAddress: PassFailScoringFunction<NftInfoFields> = (nft: NftInfoFields) => {\n if (!nft.address) return FAIL\n if (typeof nft.address !== 'string') return FAIL\n if (!isAddress(nft.address)) return FAIL\n return PASS\n}\n","import { NftInfoFields, OpenSeaNftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport { incrementPossible, incrementTotal, incrementTotalAndPossible, PASS, ScaledScore } from '@xyo-network/crypto-nft-score-model'\n\nimport { isSecure, isValidUrl, isWeb3 } from './lib'\n\nexport const scoreNftAnimationUrl = (nft: NftInfoFields | OpenSeaNftInfoFields): ScaledScore => {\n return scoreAnimationUrl(nft.metadata?.animation_url)\n}\n\nexport const scoreAnimationUrl = (animation_url: unknown): ScaledScore => {\n const score: ScaledScore = [0, 0]\n if (animation_url === undefined || animation_url === null) return PASS\n incrementPossible(score)\n if (typeof animation_url !== 'string') return score\n incrementTotalAndPossible(score)\n if (!isValidUrl(animation_url)) return score\n incrementTotalAndPossible(score)\n if (!isSecure(animation_url)) return score\n incrementTotalAndPossible(score)\n if (!isWeb3(animation_url)) return score\n return incrementTotal(score)\n}\n","import { URL } from '@xylabs/url'\n\nexport const web3Protocols = ['ipfs:', 'ar:']\n\nexport const toUrl = (url?: string | null): URL | undefined => {\n if (!url) return undefined\n try {\n return new URL(url)\n } catch {\n return undefined\n }\n}\n\nexport const isValidUrl = (url?: string | null): boolean => toUrl(url) !== undefined\n// eslint-disable-next-line unicorn/prefer-includes\nexport const isWeb3 = (url?: string | null): boolean => web3Protocols.some((protocol) => protocol === toUrl(url)?.protocol)\nexport const isWeb2 = (url?: string | null): boolean => !isWeb3(url)\nexport const isSecure = (url?: string | null): boolean => isWeb3(url) || toUrl(url)?.protocol === 'https:'\n","import { NftAttribute, NftInfoFields, OpenSeaNftAttribute, OpenSeaNftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport { incrementPossible, incrementTotal, incrementTotalAndPossible, ScaledScore } from '@xyo-network/crypto-nft-score-model'\n\nconst isDate = (value: unknown): value is Date => {\n if (isNumber(value)) {\n try {\n new Date(value)\n return true\n } catch {\n return false\n }\n }\n return false\n}\n\nconst isNumber = (value: unknown): value is number => typeof value === 'number'\n\nconst isPercentage = (value: unknown): boolean => isNumber(value) && value >= 0 && value <= 100\n\nconst isNonEmptyString = (value: unknown): value is string => typeof value === 'string' && value.length > 0\n\nconst isNonEmptyStringOrNumber = (value: unknown): value is string | number => value === 'number' || isNonEmptyString(value)\n\nexport const evaluateNftAttributes = (nft: NftInfoFields | OpenSeaNftInfoFields): ScaledScore =>\n nft?.metadata?.attributes ? evaluateAttributes(nft?.metadata?.attributes) : [0, 1]\n\nexport const evaluateAttributes = (attributes: NftAttribute[] | OpenSeaNftAttribute[] | unknown): ScaledScore => {\n if (!attributes || !Array.isArray(attributes) || attributes.length === 0) return [0, 1]\n const score: ScaledScore = [0, 0]\n for (const attribute of attributes) {\n const [attributeTotal, attributePossible] = evaluateAttribute(attribute)\n incrementTotalAndPossible(score, attributeTotal, attributePossible)\n }\n return [1, 1]\n}\n\nexport const evaluateAttribute = (attribute: OpenSeaNftAttribute): ScaledScore => {\n const score: ScaledScore = [0, 1]\n const max_value = attribute?.max_value\n const trait_type = attribute?.trait_type\n const value = attribute?.value\n\n // Validate trait_type & value\n if (!attribute || typeof attribute !== 'object' || !isNonEmptyString(trait_type) || !isNonEmptyStringOrNumber(value)) return score\n incrementTotal(score)\n\n // Validate display_type\n incrementPossible(score)\n if (validDisplayType(attribute)) incrementTotal(score)\n\n // Validate max_value\n if (max_value !== undefined) {\n incrementPossible(score)\n if (isNumber(max_value) && isNumber(value) && value <= max_value) incrementTotal(score)\n }\n\n return score\n}\n\nconst validDisplayType = (attribute: OpenSeaNftAttribute): boolean => {\n switch (attribute?.display_type) {\n case 'number':\n case 'boost_number': {\n if (isNumber(attribute?.value)) return true\n break\n }\n case 'boost_percentage': {\n if (isPercentage(attribute?.value)) return true\n break\n }\n case 'date': {\n if (isDate(attribute?.value)) return true\n break\n }\n case 'string':\n case undefined: {\n if (isNonEmptyString(attribute?.value)) return true\n break\n }\n default: {\n break\n }\n }\n return false\n}\n","import { NftInfoFields, OpenSeaNftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport { incrementPossible, incrementTotal, incrementTotalAndPossible, PASS, ScaledScore } from '@xyo-network/crypto-nft-score-model'\n\nconst isHexColor = /^[\\da-f]{6}$/i\n\nexport const scoreNftBackgroundColor = (nft: NftInfoFields | OpenSeaNftInfoFields): ScaledScore => {\n return scoreBackgroundColor(nft.metadata?.background_color)\n}\n\nexport const scoreBackgroundColor = (background_color: unknown): ScaledScore => {\n const score: ScaledScore = [0, 0]\n if (background_color === undefined || background_color === null) return PASS\n incrementPossible(score)\n if (typeof background_color !== 'string') return score\n incrementTotalAndPossible(score)\n if (!isHexColor.test(background_color.toUpperCase())) return score\n return incrementTotal(score)\n}\n","import { NftInfoFields, OpenSeaNftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport { incrementTotal, ScaledScore } from '@xyo-network/crypto-nft-score-model'\n\nexport const scoreNftDescription = (nft: NftInfoFields | OpenSeaNftInfoFields): ScaledScore => {\n return scoreDescription(nft.metadata?.description)\n}\n\nexport const scoreDescription = (description: unknown): ScaledScore => {\n const score: ScaledScore = [0, 1]\n if (!description || typeof description !== 'string') return score\n return incrementTotal(score)\n}\n","import { NftInfoFields, OpenSeaNftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport { incrementTotal, ScaledScore } from '@xyo-network/crypto-nft-score-model'\n\nimport { isSecure, isValidUrl } from './lib'\n\nexport const scoreNftExternalUrl = (nft: NftInfoFields | OpenSeaNftInfoFields): ScaledScore => {\n return scoreExternalUrl(nft?.metadata?.external_url)\n}\nexport const scoreExternalUrl = (external_url: unknown): ScaledScore => {\n const score: ScaledScore = [0, 2]\n if (external_url === undefined || external_url === null || typeof external_url !== 'string' || !isValidUrl(external_url)) return score\n incrementTotal(score)\n if (!isSecure(external_url)) return score\n return incrementTotal(score)\n}\n","import { NftInfoFields, OpenSeaNftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport { incrementTotal, PASS, ScaledScore } from '@xyo-network/crypto-nft-score-model'\n\nimport { isSecure, isValidUrl, isWeb3 } from './lib'\n\nconst MaxPossibleImageScore = 3\n\nexport const scoreNftImage = (nft: NftInfoFields | OpenSeaNftInfoFields): ScaledScore => {\n // If there's no image data\n if (nft?.metadata?.image) {\n return scoreImage(nft.metadata?.image)\n } else {\n // but there is image data, skip this scoring criteria, otherwise fail it completely\n return nft.metadata?.image_data ? PASS : [0, MaxPossibleImageScore]\n }\n}\n\nexport const scoreImage = (image: unknown): ScaledScore => {\n const score: ScaledScore = [0, MaxPossibleImageScore]\n if (!image || typeof image !== 'string' || !isValidUrl(image)) return score\n incrementTotal(score)\n if (!isSecure(image)) return score\n incrementTotal(score)\n if (!isWeb3(image)) return score\n incrementTotal(score)\n return score\n}\n","import { NftInfoFields, OpenSeaNftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport { PASS, ScaledScore } from '@xyo-network/crypto-nft-score-model'\nimport { parse } from 'svg-parser'\n\nconst MaxPossibleImageDataScore = 1\n\n// NOTE: There is probably a deeper check we can do\n// here, but this is a good start\nconst isValidImageData = (image_data: string): boolean => {\n // If it doesn't start with an svg tag, it's not an svg\n if (!image_data.startsWith('<svg')) return false\n try {\n // If it can't be parsed, it's not an svg\n parse(image_data)\n return true\n } catch {\n return false\n }\n}\n\nexport const scoreNftImageData = (nft: NftInfoFields | OpenSeaNftInfoFields): ScaledScore => {\n // If there's no image data\n if (nft?.metadata?.image_data) {\n return scoreImageData(nft.metadata?.image_data)\n } else {\n // but there is an image, skip this scoring criteria, otherwise fail it completely\n return nft.metadata?.image ? PASS : [0, MaxPossibleImageDataScore]\n }\n}\n\nexport const scoreImageData = (image_data: unknown): ScaledScore => {\n return !image_data || typeof image_data !== 'string' || !isValidImageData(image_data) ?\n [0, MaxPossibleImageDataScore]\n : [MaxPossibleImageDataScore, MaxPossibleImageDataScore]\n}\n","import { NftInfoFields, OpenSeaNftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport { incrementTotal, ScaledScore } from '@xyo-network/crypto-nft-score-model'\n\nexport const scoreNftName = (nft: NftInfoFields | OpenSeaNftInfoFields): ScaledScore => {\n return scoreName(nft.metadata?.name)\n}\nexport const scoreName = (name: unknown): ScaledScore => {\n const score: ScaledScore = [0, 1]\n if (!name || typeof name !== 'string') return score\n return incrementTotal(score)\n}\n","import { NftInfoFields, OpenSeaNftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport { incrementTotal, PASS, ScaledScore } from '@xyo-network/crypto-nft-score-model'\n\nimport { isSecure, isValidUrl } from './lib'\n\nexport const scoreNftYoutubeUrl = (nft: NftInfoFields | OpenSeaNftInfoFields): ScaledScore => {\n return scoreYoutubeUrl(nft?.metadata?.youtube_url)\n}\nexport const scoreYoutubeUrl = (youtube_url: unknown): ScaledScore => {\n if (youtube_url === undefined || youtube_url === null) return PASS\n const score: ScaledScore = [0, 2]\n if (typeof youtube_url !== 'string' || !isValidUrl(youtube_url)) return score\n incrementTotal(score)\n if (!isSecure(youtube_url)) return score\n return incrementTotal(score)\n}\n","import { NftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport { FAIL, PASS, PassFailScoringFunction } from '@xyo-network/crypto-nft-score-model'\n\nexport const scoreSupply: PassFailScoringFunction<NftInfoFields> = (nft: NftInfoFields) => {\n if (!nft.supply) return FAIL\n if (typeof nft.supply !== 'string') return FAIL\n try {\n return BigInt(nft.tokenId) >= 0n && BigInt(nft.tokenId) < 2n ** 256n ? PASS : FAIL\n } catch {\n return FAIL\n }\n}\n","import { NftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport { FAIL, PASS, PassFailScoringFunction } from '@xyo-network/crypto-nft-score-model'\n\n/**\n * Callers SHALL NOT assume that ID numbers have any specific pattern to them, and\n * MUST treat the ID as a \"black box\"\n * @param nft\n * @returns\n */\nexport const scoreTokenId: PassFailScoringFunction<NftInfoFields> = (nft: NftInfoFields) => {\n if (!nft.tokenId) return FAIL\n if (typeof nft.tokenId !== 'string') return FAIL\n try {\n return BigInt(nft.tokenId) >= 0n && BigInt(nft.tokenId) < 2n ** 256n ? PASS : FAIL\n } catch {\n return FAIL\n }\n}\n","import { NftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport { FAIL, PASS, PassFailScoringFunction } from '@xyo-network/crypto-nft-score-model'\n\nexport const scoreType: PassFailScoringFunction<NftInfoFields> = (nft: NftInfoFields) => {\n if (!nft.type) return FAIL\n if (typeof nft.type !== 'string') return FAIL\n const type = nft.type.toUpperCase()\n if (type !== 'ERC721' && type !== 'ERC1155') return FAIL\n return PASS\n}\n","import {\n evaluateNftAttributes,\n scoreContractAddress,\n scoreNftAnimationUrl,\n scoreNftBackgroundColor,\n scoreNftDescription,\n scoreNftExternalUrl,\n scoreNftImage,\n scoreNftImageData,\n scoreNftName,\n scoreNftYoutubeUrl,\n scoreSupply,\n scoreTokenId,\n scoreType,\n} from './scoring'\n\nconst attributesScoringCriteria = {\n Attributes: { score: evaluateNftAttributes, weight: 1 },\n}\n\nconst metadataScoringCriteria = {\n 'Animation URL': { score: scoreNftAnimationUrl, weight: 1 },\n 'Background Color': { score: scoreNftBackgroundColor, weight: 1 },\n Description: { score: scoreNftDescription, weight: 1 },\n 'External Url': { score: scoreNftExternalUrl, weight: 1 },\n Image: { score: scoreNftImage, weight: 1 },\n 'Image Data': { score: scoreNftImageData, weight: 1 },\n Name: { score: scoreNftName, weight: 1 },\n 'YouTube URL': { score: scoreNftYoutubeUrl, weight: 1 },\n ...attributesScoringCriteria,\n}\n\nexport const scoringCriteria = {\n 'Contract Address': { score: scoreContractAddress, weight: 1 },\n Supply: { score: scoreSupply, weight: 1 },\n 'Token Id': { score: scoreTokenId, weight: 1 },\n Type: { score: scoreType, weight: 1 },\n ...metadataScoringCriteria,\n}\n","import { NftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport { Score } from '@xyo-network/crypto-nft-score-model'\n\nimport { scoringCriteria } from './criteria'\n\nexport type ScoringCriteriaKey = keyof typeof scoringCriteria & PropertyKey\n\nexport type NftAnalysis = {\n [key in ScoringCriteriaKey]: Score\n}\n\nexport const analyzeNft = async (\n /**\n * The NFT to evaluate\n */\n nft: NftInfoFields,\n): Promise<NftAnalysis> => {\n const result = Object.fromEntries(\n await Promise.all(\n Object.entries(scoringCriteria).map(async ([key, { score, weight }]) => {\n const rawScore = await score(nft)\n const weighted = rawScore.map((v) => v * weight) as Score\n return [key, weighted] as const\n }),\n ),\n ) as NftAnalysis\n return result\n}\n","import { NftSchema } from '@xyo-network/crypto-nft-payload-plugin'\nimport { PayloadSetSchema } from '@xyo-network/payload-model'\nimport { createPayloadSetDivinerPlugin } from '@xyo-network/payloadset-plugin'\n\nimport { NftScoreDiviner } from './Diviner'\n\nexport const NftScoreDivinerPlugin = () =>\n createPayloadSetDivinerPlugin<NftScoreDiviner>(\n { required: { [NftSchema]: 1 }, schema: PayloadSetSchema },\n {\n diviner: async (params) => {\n const result = await NftScoreDiviner.create(params)\n return result\n },\n },\n )\n"],"mappings":";AAAA;AAAA,EACE;AAAA,EAIA;AAAA,EACA;AAAA,OACK;AACP,SAAS,uBAAuB;AAGhC,SAAS,sBAAsB;;;ACV/B,SAAS,MAAM,YAAqC;AACpD,SAAS,iBAAiB;AAEnB,IAAM,uBAA+D,CAAC,QAAuB;AAClG,MAAI,CAAC,IAAI,QAAS,QAAO;AACzB,MAAI,OAAO,IAAI,YAAY,SAAU,QAAO;AAC5C,MAAI,CAAC,UAAU,IAAI,OAAO,EAAG,QAAO;AACpC,SAAO;AACT;;;ACRA,SAAS,mBAAmB,gBAAgB,2BAA2B,QAAAA,aAAyB;;;ACDhG,SAAS,WAAW;AAEb,IAAM,gBAAgB,CAAC,SAAS,KAAK;AAErC,IAAM,QAAQ,CAAC,QAAyC;AAC7D,MAAI,CAAC,IAAK,QAAO;AACjB,MAAI;AACF,WAAO,IAAI,IAAI,GAAG;AAAA,EACpB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,IAAM,aAAa,CAAC,QAAiC,MAAM,GAAG,MAAM;AAEpE,IAAM,SAAS,CAAC,QAAiC,cAAc,KAAK,CAAC,aAAU;AAftF;AAeyF,wBAAa,WAAM,GAAG,MAAT,mBAAY;AAAA,CAAQ;AAEnH,IAAM,WAAW,CAAC,QAA8B;AAjBvD;AAiB0D,gBAAO,GAAG,OAAK,WAAM,GAAG,MAAT,mBAAY,cAAa;AAAA;;;ADZ3F,IAAM,uBAAuB,CAAC,QAA2D;AALhG;AAME,SAAO,mBAAkB,SAAI,aAAJ,mBAAc,aAAa;AACtD;AAEO,IAAM,oBAAoB,CAAC,kBAAwC;AACxE,QAAM,QAAqB,CAAC,GAAG,CAAC;AAChC,MAAI,kBAAkB,UAAa,kBAAkB,KAAM,QAAOC;AAClE,oBAAkB,KAAK;AACvB,MAAI,OAAO,kBAAkB,SAAU,QAAO;AAC9C,4BAA0B,KAAK;AAC/B,MAAI,CAAC,WAAW,aAAa,EAAG,QAAO;AACvC,4BAA0B,KAAK;AAC/B,MAAI,CAAC,SAAS,aAAa,EAAG,QAAO;AACrC,4BAA0B,KAAK;AAC/B,MAAI,CAAC,OAAO,aAAa,EAAG,QAAO;AACnC,SAAO,eAAe,KAAK;AAC7B;;;AEpBA,SAAS,qBAAAC,oBAAmB,kBAAAC,iBAAgB,6BAAAC,kCAA8C;AAE1F,IAAM,SAAS,CAAC,UAAkC;AAChD,MAAI,SAAS,KAAK,GAAG;AACnB,QAAI;AACF,UAAI,KAAK,KAAK;AACd,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,IAAM,WAAW,CAAC,UAAoC,OAAO,UAAU;AAEvE,IAAM,eAAe,CAAC,UAA4B,SAAS,KAAK,KAAK,SAAS,KAAK,SAAS;AAE5F,IAAM,mBAAmB,CAAC,UAAoC,OAAO,UAAU,YAAY,MAAM,SAAS;AAE1G,IAAM,2BAA2B,CAAC,UAA6C,UAAU,YAAY,iBAAiB,KAAK;AAEpH,IAAM,wBAAwB,CAAC,QAAwD;AAvB9F;AAwBE,2CAAK,aAAL,mBAAe,cAAa,oBAAmB,gCAAK,aAAL,mBAAe,UAAU,IAAI,CAAC,GAAG,CAAC;AAAA;AAE5E,IAAM,qBAAqB,CAAC,eAA8E;AAC/G,MAAI,CAAC,cAAc,CAAC,MAAM,QAAQ,UAAU,KAAK,WAAW,WAAW,EAAG,QAAO,CAAC,GAAG,CAAC;AACtF,QAAM,QAAqB,CAAC,GAAG,CAAC;AAChC,aAAW,aAAa,YAAY;AAClC,UAAM,CAAC,gBAAgB,iBAAiB,IAAI,kBAAkB,SAAS;AACvE,IAAAA,2BAA0B,OAAO,gBAAgB,iBAAiB;AAAA,EACpE;AACA,SAAO,CAAC,GAAG,CAAC;AACd;AAEO,IAAM,oBAAoB,CAAC,cAAgD;AAChF,QAAM,QAAqB,CAAC,GAAG,CAAC;AAChC,QAAM,YAAY,uCAAW;AAC7B,QAAM,aAAa,uCAAW;AAC9B,QAAM,QAAQ,uCAAW;AAGzB,MAAI,CAAC,aAAa,OAAO,cAAc,YAAY,CAAC,iBAAiB,UAAU,KAAK,CAAC,yBAAyB,KAAK,EAAG,QAAO;AAC7H,EAAAD,gBAAe,KAAK;AAGpB,EAAAD,mBAAkB,KAAK;AACvB,MAAI,iBAAiB,SAAS,EAAG,CAAAC,gBAAe,KAAK;AAGrD,MAAI,cAAc,QAAW;AAC3B,IAAAD,mBAAkB,KAAK;AACvB,QAAI,SAAS,SAAS,KAAK,SAAS,KAAK,KAAK,SAAS,UAAW,CAAAC,gBAAe,KAAK;AAAA,EACxF;AAEA,SAAO;AACT;AAEA,IAAM,mBAAmB,CAAC,cAA4C;AACpE,UAAQ,uCAAW,cAAc;AAAA,IAC/B,KAAK;AAAA,IACL,KAAK,gBAAgB;AACnB,UAAI,SAAS,uCAAW,KAAK,EAAG,QAAO;AACvC;AAAA,IACF;AAAA,IACA,KAAK,oBAAoB;AACvB,UAAI,aAAa,uCAAW,KAAK,EAAG,QAAO;AAC3C;AAAA,IACF;AAAA,IACA,KAAK,QAAQ;AACX,UAAI,OAAO,uCAAW,KAAK,EAAG,QAAO;AACrC;AAAA,IACF;AAAA,IACA,KAAK;AAAA,IACL,KAAK,QAAW;AACd,UAAI,iBAAiB,uCAAW,KAAK,EAAG,QAAO;AAC/C;AAAA,IACF;AAAA,IACA,SAAS;AACP;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;;;ACnFA,SAAS,qBAAAE,oBAAmB,kBAAAC,iBAAgB,6BAAAC,4BAA2B,QAAAC,aAAyB;AAEhG,IAAM,aAAa;AAEZ,IAAM,0BAA0B,CAAC,QAA2D;AALnG;AAME,SAAO,sBAAqB,SAAI,aAAJ,mBAAc,gBAAgB;AAC5D;AAEO,IAAM,uBAAuB,CAAC,qBAA2C;AAC9E,QAAM,QAAqB,CAAC,GAAG,CAAC;AAChC,MAAI,qBAAqB,UAAa,qBAAqB,KAAM,QAAOA;AACxE,EAAAH,mBAAkB,KAAK;AACvB,MAAI,OAAO,qBAAqB,SAAU,QAAO;AACjD,EAAAE,2BAA0B,KAAK;AAC/B,MAAI,CAAC,WAAW,KAAK,iBAAiB,YAAY,CAAC,EAAG,QAAO;AAC7D,SAAOD,gBAAe,KAAK;AAC7B;;;AChBA,SAAS,kBAAAG,uBAAmC;AAErC,IAAM,sBAAsB,CAAC,QAA2D;AAH/F;AAIE,SAAO,kBAAiB,SAAI,aAAJ,mBAAc,WAAW;AACnD;AAEO,IAAM,mBAAmB,CAAC,gBAAsC;AACrE,QAAM,QAAqB,CAAC,GAAG,CAAC;AAChC,MAAI,CAAC,eAAe,OAAO,gBAAgB,SAAU,QAAO;AAC5D,SAAOA,gBAAe,KAAK;AAC7B;;;ACVA,SAAS,kBAAAC,uBAAmC;AAIrC,IAAM,sBAAsB,CAAC,QAA2D;AAL/F;AAME,SAAO,kBAAiB,gCAAK,aAAL,mBAAe,YAAY;AACrD;AACO,IAAM,mBAAmB,CAAC,iBAAuC;AACtE,QAAM,QAAqB,CAAC,GAAG,CAAC;AAChC,MAAI,iBAAiB,UAAa,iBAAiB,QAAQ,OAAO,iBAAiB,YAAY,CAAC,WAAW,YAAY,EAAG,QAAO;AACjI,EAAAC,gBAAe,KAAK;AACpB,MAAI,CAAC,SAAS,YAAY,EAAG,QAAO;AACpC,SAAOA,gBAAe,KAAK;AAC7B;;;ACbA,SAAS,kBAAAC,iBAAgB,QAAAC,aAAyB;AAIlD,IAAM,wBAAwB;AAEvB,IAAM,gBAAgB,CAAC,QAA2D;AAPzF;AASE,OAAI,gCAAK,aAAL,mBAAe,OAAO;AACxB,WAAO,YAAW,SAAI,aAAJ,mBAAc,KAAK;AAAA,EACvC,OAAO;AAEL,aAAO,SAAI,aAAJ,mBAAc,cAAaC,QAAO,CAAC,GAAG,qBAAqB;AAAA,EACpE;AACF;AAEO,IAAM,aAAa,CAAC,UAAgC;AACzD,QAAM,QAAqB,CAAC,GAAG,qBAAqB;AACpD,MAAI,CAAC,SAAS,OAAO,UAAU,YAAY,CAAC,WAAW,KAAK,EAAG,QAAO;AACtE,EAAAC,gBAAe,KAAK;AACpB,MAAI,CAAC,SAAS,KAAK,EAAG,QAAO;AAC7B,EAAAA,gBAAe,KAAK;AACpB,MAAI,CAAC,OAAO,KAAK,EAAG,QAAO;AAC3B,EAAAA,gBAAe,KAAK;AACpB,SAAO;AACT;;;ACzBA,SAAS,QAAAC,aAAyB;AAClC,SAAS,aAAa;AAEtB,IAAM,4BAA4B;AAIlC,IAAM,mBAAmB,CAAC,eAAgC;AAExD,MAAI,CAAC,WAAW,WAAW,MAAM,EAAG,QAAO;AAC3C,MAAI;AAEF,UAAM,UAAU;AAChB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,IAAM,oBAAoB,CAAC,QAA2D;AApB7F;AAsBE,OAAI,gCAAK,aAAL,mBAAe,YAAY;AAC7B,WAAO,gBAAe,SAAI,aAAJ,mBAAc,UAAU;AAAA,EAChD,OAAO;AAEL,aAAO,SAAI,aAAJ,mBAAc,SAAQA,QAAO,CAAC,GAAG,yBAAyB;AAAA,EACnE;AACF;AAEO,IAAM,iBAAiB,CAAC,eAAqC;AAClE,SAAO,CAAC,cAAc,OAAO,eAAe,YAAY,CAAC,iBAAiB,UAAU,IAChF,CAAC,GAAG,yBAAyB,IAC7B,CAAC,2BAA2B,yBAAyB;AAC3D;;;ACjCA,SAAS,kBAAAC,uBAAmC;AAErC,IAAM,eAAe,CAAC,QAA2D;AAHxF;AAIE,SAAO,WAAU,SAAI,aAAJ,mBAAc,IAAI;AACrC;AACO,IAAM,YAAY,CAAC,SAA+B;AACvD,QAAM,QAAqB,CAAC,GAAG,CAAC;AAChC,MAAI,CAAC,QAAQ,OAAO,SAAS,SAAU,QAAO;AAC9C,SAAOA,gBAAe,KAAK;AAC7B;;;ACTA,SAAS,kBAAAC,iBAAgB,QAAAC,aAAyB;AAI3C,IAAM,qBAAqB,CAAC,QAA2D;AAL9F;AAME,SAAO,iBAAgB,gCAAK,aAAL,mBAAe,WAAW;AACnD;AACO,IAAM,kBAAkB,CAAC,gBAAsC;AACpE,MAAI,gBAAgB,UAAa,gBAAgB,KAAM,QAAOC;AAC9D,QAAM,QAAqB,CAAC,GAAG,CAAC;AAChC,MAAI,OAAO,gBAAgB,YAAY,CAAC,WAAW,WAAW,EAAG,QAAO;AACxE,EAAAC,gBAAe,KAAK;AACpB,MAAI,CAAC,SAAS,WAAW,EAAG,QAAO;AACnC,SAAOA,gBAAe,KAAK;AAC7B;;;ACdA,SAAS,QAAAC,OAAM,QAAAC,aAAqC;AAE7C,IAAM,cAAsD,CAAC,QAAuB;AACzF,MAAI,CAAC,IAAI,OAAQ,QAAOD;AACxB,MAAI,OAAO,IAAI,WAAW,SAAU,QAAOA;AAC3C,MAAI;AACF,WAAO,OAAO,IAAI,OAAO,KAAK,MAAM,OAAO,IAAI,OAAO,IAAI,MAAM,OAAOC,QAAOD;AAAA,EAChF,QAAQ;AACN,WAAOA;AAAA,EACT;AACF;;;ACVA,SAAS,QAAAE,OAAM,QAAAC,aAAqC;AAQ7C,IAAM,eAAuD,CAAC,QAAuB;AAC1F,MAAI,CAAC,IAAI,QAAS,QAAOD;AACzB,MAAI,OAAO,IAAI,YAAY,SAAU,QAAOA;AAC5C,MAAI;AACF,WAAO,OAAO,IAAI,OAAO,KAAK,MAAM,OAAO,IAAI,OAAO,IAAI,MAAM,OAAOC,QAAOD;AAAA,EAChF,QAAQ;AACN,WAAOA;AAAA,EACT;AACF;;;AChBA,SAAS,QAAAE,OAAM,QAAAC,aAAqC;AAE7C,IAAM,YAAoD,CAAC,QAAuB;AACvF,MAAI,CAAC,IAAI,KAAM,QAAOD;AACtB,MAAI,OAAO,IAAI,SAAS,SAAU,QAAOA;AACzC,QAAM,OAAO,IAAI,KAAK,YAAY;AAClC,MAAI,SAAS,YAAY,SAAS,UAAW,QAAOA;AACpD,SAAOC;AACT;;;ACOA,IAAM,4BAA4B;AAAA,EAChC,YAAY,EAAE,OAAO,uBAAuB,QAAQ,EAAE;AACxD;AAEA,IAAM,0BAA0B;AAAA,EAC9B,iBAAiB,EAAE,OAAO,sBAAsB,QAAQ,EAAE;AAAA,EAC1D,oBAAoB,EAAE,OAAO,yBAAyB,QAAQ,EAAE;AAAA,EAChE,aAAa,EAAE,OAAO,qBAAqB,QAAQ,EAAE;AAAA,EACrD,gBAAgB,EAAE,OAAO,qBAAqB,QAAQ,EAAE;AAAA,EACxD,OAAO,EAAE,OAAO,eAAe,QAAQ,EAAE;AAAA,EACzC,cAAc,EAAE,OAAO,mBAAmB,QAAQ,EAAE;AAAA,EACpD,MAAM,EAAE,OAAO,cAAc,QAAQ,EAAE;AAAA,EACvC,eAAe,EAAE,OAAO,oBAAoB,QAAQ,EAAE;AAAA,EACtD,GAAG;AACL;AAEO,IAAM,kBAAkB;AAAA,EAC7B,oBAAoB,EAAE,OAAO,sBAAsB,QAAQ,EAAE;AAAA,EAC7D,QAAQ,EAAE,OAAO,aAAa,QAAQ,EAAE;AAAA,EACxC,YAAY,EAAE,OAAO,cAAc,QAAQ,EAAE;AAAA,EAC7C,MAAM,EAAE,OAAO,WAAW,QAAQ,EAAE;AAAA,EACpC,GAAG;AACL;;;AC3BO,IAAM,aAAa,OAIxB,QACyB;AACzB,QAAM,SAAS,OAAO;AAAA,IACpB,MAAM,QAAQ;AAAA,MACZ,OAAO,QAAQ,eAAe,EAAE,IAAI,OAAO,CAAC,KAAK,EAAE,OAAO,OAAO,CAAC,MAAM;AACtE,cAAM,WAAW,MAAM,MAAM,GAAG;AAChC,cAAM,WAAW,SAAS,IAAI,CAAC,MAAM,IAAI,MAAM;AAC/C,eAAO,CAAC,KAAK,QAAQ;AAAA,MACvB,CAAC;AAAA,IACH;AAAA,EACF;AACA,SAAO;AACT;;;AhBTA,IAAM,oBAAoB,CAAC,SAAkB,WAAkC;AAC7E,QAAM,EAAE,SAAS,SAAS,KAAK,IAAI;AACnC,SAAO,EAAE,SAAS,SAAS,QAAQ,gBAAgB,QAAQ,KAAK;AAClE;AAEO,IAAM,aAAa,CAAC,YAA0C,QAAQ,WAAW;AAEjF,IAAM,kBAAN,cAA6F,gBAAyB;AAAA,EAC3H,OAAyB,gBAA0B,CAAC,GAAG,MAAM,eAAe,2BAA2B;AAAA,EACvG,OAAyB,sBAA8B;AAAA,EAEpC,gBAAgB,OAAO,aAA6C;AACrF,UAAM,YAAW,qCAAU,OAAO,eAAc,CAAC;AACjD,UAAM,UAAU,MAAM,QAAQ;AAAA,MAC5B,SAAS,IAAuB,OAAO,YAAY;AACjD,cAAM,CAAC,OAAO,UAAU,IAAI,MAAM,QAAQ,IAAI;AAAA;AAAA,UAE5C,kBAAkB,SAAS,MAAM,WAAW,OAAO,CAAC;AAAA;AAAA,UAEpD,eAAe,SAAS,OAAO;AAAA,QACjC,CAAC;AACD,eAAO,EAAE,GAAG,OAAO,SAAS,CAAC,UAAU,EAAE;AAAA,MAC3C,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT;AACF;;;AiB5CA,SAAS,iBAAiB;AAC1B,SAAS,wBAAwB;AACjC,SAAS,qCAAqC;AAIvC,IAAM,wBAAwB,MACnC;AAAA,EACE,EAAE,UAAU,EAAE,CAAC,SAAS,GAAG,EAAE,GAAG,QAAQ,iBAAiB;AAAA,EACzD;AAAA,IACE,SAAS,OAAO,WAAW;AACzB,YAAM,SAAS,MAAM,gBAAgB,OAAO,MAAM;AAClD,aAAO;AAAA,IACT;AAAA,EACF;AACF;","names":["PASS","PASS","incrementPossible","incrementTotal","incrementTotalAndPossible","incrementPossible","incrementTotal","incrementTotalAndPossible","PASS","incrementTotal","incrementTotal","incrementTotal","incrementTotal","PASS","PASS","incrementTotal","PASS","incrementTotal","incrementTotal","PASS","PASS","incrementTotal","FAIL","PASS","FAIL","PASS","FAIL","PASS"]}
1
+ {"version":3,"sources":["../../src/Diviner.ts","../../src/lib/rating/criteria/scoring/contract.ts","../../src/lib/rating/criteria/scoring/metadata/animationUrl.ts","../../src/lib/rating/criteria/scoring/metadata/lib/urlHelpers.ts","../../src/lib/rating/criteria/scoring/metadata/attributes/evaluateAttributes.ts","../../src/lib/rating/criteria/scoring/metadata/backgroundColor.ts","../../src/lib/rating/criteria/scoring/metadata/description.ts","../../src/lib/rating/criteria/scoring/metadata/externalUrl.ts","../../src/lib/rating/criteria/scoring/metadata/image.ts","../../src/lib/rating/criteria/scoring/metadata/imageData.ts","../../src/lib/rating/criteria/scoring/metadata/name.ts","../../src/lib/rating/criteria/scoring/metadata/youtubeUrl.ts","../../src/lib/rating/criteria/scoring/supply.ts","../../src/lib/rating/criteria/scoring/tokenId.ts","../../src/lib/rating/criteria/scoring/type.ts","../../src/lib/rating/criteria/scoringCriteria.ts","../../src/lib/rating/analyzeNft.ts","../../src/Plugin.ts"],"sourcesContent":["import {\n isNftInfo,\n NftInfo,\n NftScore,\n NftScoreDivinerConfig,\n NftScoreDivinerConfigSchema,\n NftScoreSchema,\n} from '@xyo-network/crypto-nft-payload-plugin'\nimport { AbstractDiviner } from '@xyo-network/diviner-abstract'\nimport { DivinerParams } from '@xyo-network/diviner-model'\nimport { AnyConfigSchema } from '@xyo-network/module-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload, Schema } from '@xyo-network/payload-model'\n\nimport { analyzeNft, NftAnalysis } from './lib'\n\nexport type NftScoreDivinerParams = DivinerParams<AnyConfigSchema<NftScoreDivinerConfig>>\n\nconst toNftScorePayload = (nftInfo: NftInfo, scores: NftAnalysis): NftScore => {\n const { address, chainId, type } = nftInfo\n return { address, chainId, schema: NftScoreSchema, scores, type }\n}\n\nexport const isNftScore = (payload: Payload): payload is NftScore => payload.schema === NftScoreSchema\n\nexport class NftScoreDiviner<TParams extends NftScoreDivinerParams = NftScoreDivinerParams> extends AbstractDiviner<TParams> {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, NftScoreDivinerConfigSchema]\n static override readonly defaultConfigSchema: Schema = NftScoreDivinerConfigSchema\n\n protected override divineHandler = async (payloads?: Payload[]): Promise<Payload[]> => {\n const nftInfos = payloads?.filter(isNftInfo) ?? []\n const results = await Promise.all(\n nftInfos.map<Promise<NftScore>>(async (nftInfo) => {\n const [score, sourceHash] = await Promise.all([\n // Analyze the NFT\n toNftScorePayload(nftInfo, await analyzeNft(nftInfo)),\n // Hash the source payload\n PayloadBuilder.dataHash(nftInfo),\n ])\n return { ...score, sources: [sourceHash] }\n }),\n )\n return results\n }\n}\n","import { NftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport { FAIL, PASS, PassFailScoringFunction } from '@xyo-network/crypto-nft-score-model'\nimport { isAddress } from 'ethers'\n\nexport const scoreContractAddress: PassFailScoringFunction<NftInfoFields> = (nft: NftInfoFields) => {\n if (!nft.address) return FAIL\n if (typeof nft.address !== 'string') return FAIL\n if (!isAddress(nft.address)) return FAIL\n return PASS\n}\n","import { NftInfoFields, OpenSeaNftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport { incrementPossible, incrementTotal, incrementTotalAndPossible, PASS, ScaledScore } from '@xyo-network/crypto-nft-score-model'\n\nimport { isSecure, isValidUrl, isWeb3 } from './lib'\n\nexport const scoreNftAnimationUrl = (nft: NftInfoFields | OpenSeaNftInfoFields): ScaledScore => {\n return scoreAnimationUrl(nft.metadata?.animation_url)\n}\n\nexport const scoreAnimationUrl = (animation_url: unknown): ScaledScore => {\n const score: ScaledScore = [0, 0]\n if (animation_url === undefined || animation_url === null) return PASS\n incrementPossible(score)\n if (typeof animation_url !== 'string') return score\n incrementTotalAndPossible(score)\n if (!isValidUrl(animation_url)) return score\n incrementTotalAndPossible(score)\n if (!isSecure(animation_url)) return score\n incrementTotalAndPossible(score)\n if (!isWeb3(animation_url)) return score\n return incrementTotal(score)\n}\n","import { URL } from '@xylabs/url'\n\nexport const web3Protocols = ['ipfs:', 'ar:']\n\nexport const toUrl = (url?: string | null): URL | undefined => {\n if (!url) return undefined\n try {\n return new URL(url)\n } catch {\n return undefined\n }\n}\n\nexport const isValidUrl = (url?: string | null): boolean => toUrl(url) !== undefined\n// eslint-disable-next-line unicorn/prefer-includes\nexport const isWeb3 = (url?: string | null): boolean => web3Protocols.some((protocol) => protocol === toUrl(url)?.protocol)\nexport const isWeb2 = (url?: string | null): boolean => !isWeb3(url)\nexport const isSecure = (url?: string | null): boolean => isWeb3(url) || toUrl(url)?.protocol === 'https:'\n","import { NftAttribute, NftInfoFields, OpenSeaNftAttribute, OpenSeaNftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport { incrementPossible, incrementTotal, incrementTotalAndPossible, ScaledScore } from '@xyo-network/crypto-nft-score-model'\n\nconst isDate = (value: unknown): value is Date => {\n if (isNumber(value)) {\n try {\n new Date(value)\n return true\n } catch {\n return false\n }\n }\n return false\n}\n\nconst isNumber = (value: unknown): value is number => typeof value === 'number'\n\nconst isPercentage = (value: unknown): boolean => isNumber(value) && value >= 0 && value <= 100\n\nconst isNonEmptyString = (value: unknown): value is string => typeof value === 'string' && value.length > 0\n\nconst isNonEmptyStringOrNumber = (value: unknown): value is string | number => value === 'number' || isNonEmptyString(value)\n\nexport const evaluateNftAttributes = (nft: NftInfoFields | OpenSeaNftInfoFields): ScaledScore =>\n nft?.metadata?.attributes ? evaluateAttributes(nft?.metadata?.attributes) : [0, 1]\n\nexport const evaluateAttributes = (attributes: NftAttribute[] | OpenSeaNftAttribute[] | unknown): ScaledScore => {\n if (!attributes || !Array.isArray(attributes) || attributes.length === 0) return [0, 1]\n const score: ScaledScore = [0, 0]\n for (const attribute of attributes) {\n const [attributeTotal, attributePossible] = evaluateAttribute(attribute)\n incrementTotalAndPossible(score, attributeTotal, attributePossible)\n }\n return [1, 1]\n}\n\nexport const evaluateAttribute = (attribute: OpenSeaNftAttribute): ScaledScore => {\n const score: ScaledScore = [0, 1]\n const max_value = attribute?.max_value\n const trait_type = attribute?.trait_type\n const value = attribute?.value\n\n // Validate trait_type & value\n if (!attribute || typeof attribute !== 'object' || !isNonEmptyString(trait_type) || !isNonEmptyStringOrNumber(value)) return score\n incrementTotal(score)\n\n // Validate display_type\n incrementPossible(score)\n if (validDisplayType(attribute)) incrementTotal(score)\n\n // Validate max_value\n if (max_value !== undefined) {\n incrementPossible(score)\n if (isNumber(max_value) && isNumber(value) && value <= max_value) incrementTotal(score)\n }\n\n return score\n}\n\nconst validDisplayType = (attribute: OpenSeaNftAttribute): boolean => {\n switch (attribute?.display_type) {\n case 'number':\n case 'boost_number': {\n if (isNumber(attribute?.value)) return true\n break\n }\n case 'boost_percentage': {\n if (isPercentage(attribute?.value)) return true\n break\n }\n case 'date': {\n if (isDate(attribute?.value)) return true\n break\n }\n case 'string':\n case undefined: {\n if (isNonEmptyString(attribute?.value)) return true\n break\n }\n default: {\n break\n }\n }\n return false\n}\n","import { NftInfoFields, OpenSeaNftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport { incrementPossible, incrementTotal, incrementTotalAndPossible, PASS, ScaledScore } from '@xyo-network/crypto-nft-score-model'\n\nconst isHexColor = /^[\\da-f]{6}$/i\n\nexport const scoreNftBackgroundColor = (nft: NftInfoFields | OpenSeaNftInfoFields): ScaledScore => {\n return scoreBackgroundColor(nft.metadata?.background_color)\n}\n\nexport const scoreBackgroundColor = (background_color: unknown): ScaledScore => {\n const score: ScaledScore = [0, 0]\n if (background_color === undefined || background_color === null) return PASS\n incrementPossible(score)\n if (typeof background_color !== 'string') return score\n incrementTotalAndPossible(score)\n if (!isHexColor.test(background_color.toUpperCase())) return score\n return incrementTotal(score)\n}\n","import { NftInfoFields, OpenSeaNftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport { incrementTotal, ScaledScore } from '@xyo-network/crypto-nft-score-model'\n\nexport const scoreNftDescription = (nft: NftInfoFields | OpenSeaNftInfoFields): ScaledScore => {\n return scoreDescription(nft.metadata?.description)\n}\n\nexport const scoreDescription = (description: unknown): ScaledScore => {\n const score: ScaledScore = [0, 1]\n if (!description || typeof description !== 'string') return score\n return incrementTotal(score)\n}\n","import { NftInfoFields, OpenSeaNftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport { incrementTotal, ScaledScore } from '@xyo-network/crypto-nft-score-model'\n\nimport { isSecure, isValidUrl } from './lib'\n\nexport const scoreNftExternalUrl = (nft: NftInfoFields | OpenSeaNftInfoFields): ScaledScore => {\n return scoreExternalUrl(nft?.metadata?.external_url)\n}\nexport const scoreExternalUrl = (external_url: unknown): ScaledScore => {\n const score: ScaledScore = [0, 2]\n if (external_url === undefined || external_url === null || typeof external_url !== 'string' || !isValidUrl(external_url)) return score\n incrementTotal(score)\n if (!isSecure(external_url)) return score\n return incrementTotal(score)\n}\n","import { NftInfoFields, OpenSeaNftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport { incrementTotal, PASS, ScaledScore } from '@xyo-network/crypto-nft-score-model'\n\nimport { isSecure, isValidUrl, isWeb3 } from './lib'\n\nconst MaxPossibleImageScore = 3\n\nexport const scoreNftImage = (nft: NftInfoFields | OpenSeaNftInfoFields): ScaledScore => {\n // If there's no image data\n if (nft?.metadata?.image) {\n return scoreImage(nft.metadata?.image)\n } else {\n // but there is image data, skip this scoring criteria, otherwise fail it completely\n return nft.metadata?.image_data ? PASS : [0, MaxPossibleImageScore]\n }\n}\n\nexport const scoreImage = (image: unknown): ScaledScore => {\n const score: ScaledScore = [0, MaxPossibleImageScore]\n if (!image || typeof image !== 'string' || !isValidUrl(image)) return score\n incrementTotal(score)\n if (!isSecure(image)) return score\n incrementTotal(score)\n if (!isWeb3(image)) return score\n incrementTotal(score)\n return score\n}\n","import { NftInfoFields, OpenSeaNftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport { PASS, ScaledScore } from '@xyo-network/crypto-nft-score-model'\nimport { parse } from 'svg-parser'\n\nconst MaxPossibleImageDataScore = 1\n\n// NOTE: There is probably a deeper check we can do\n// here, but this is a good start\nconst isValidImageData = (image_data: string): boolean => {\n // If it doesn't start with an svg tag, it's not an svg\n if (!image_data.startsWith('<svg')) return false\n try {\n // If it can't be parsed, it's not an svg\n parse(image_data)\n return true\n } catch {\n return false\n }\n}\n\nexport const scoreNftImageData = (nft: NftInfoFields | OpenSeaNftInfoFields): ScaledScore => {\n // If there's no image data\n if (nft?.metadata?.image_data) {\n return scoreImageData(nft.metadata?.image_data)\n } else {\n // but there is an image, skip this scoring criteria, otherwise fail it completely\n return nft.metadata?.image ? PASS : [0, MaxPossibleImageDataScore]\n }\n}\n\nexport const scoreImageData = (image_data: unknown): ScaledScore => {\n return !image_data || typeof image_data !== 'string' || !isValidImageData(image_data) ?\n [0, MaxPossibleImageDataScore]\n : [MaxPossibleImageDataScore, MaxPossibleImageDataScore]\n}\n","import { NftInfoFields, OpenSeaNftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport { incrementTotal, ScaledScore } from '@xyo-network/crypto-nft-score-model'\n\nexport const scoreNftName = (nft: NftInfoFields | OpenSeaNftInfoFields): ScaledScore => {\n return scoreName(nft.metadata?.name)\n}\nexport const scoreName = (name: unknown): ScaledScore => {\n const score: ScaledScore = [0, 1]\n if (!name || typeof name !== 'string') return score\n return incrementTotal(score)\n}\n","import { NftInfoFields, OpenSeaNftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport { incrementTotal, PASS, ScaledScore } from '@xyo-network/crypto-nft-score-model'\n\nimport { isSecure, isValidUrl } from './lib'\n\nexport const scoreNftYoutubeUrl = (nft: NftInfoFields | OpenSeaNftInfoFields): ScaledScore => {\n return scoreYoutubeUrl(nft?.metadata?.youtube_url)\n}\nexport const scoreYoutubeUrl = (youtube_url: unknown): ScaledScore => {\n if (youtube_url === undefined || youtube_url === null) return PASS\n const score: ScaledScore = [0, 2]\n if (typeof youtube_url !== 'string' || !isValidUrl(youtube_url)) return score\n incrementTotal(score)\n if (!isSecure(youtube_url)) return score\n return incrementTotal(score)\n}\n","import { NftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport { FAIL, PASS, PassFailScoringFunction } from '@xyo-network/crypto-nft-score-model'\n\nexport const scoreSupply: PassFailScoringFunction<NftInfoFields> = (nft: NftInfoFields) => {\n if (!nft.supply) return FAIL\n if (typeof nft.supply !== 'string') return FAIL\n try {\n return BigInt(nft.tokenId) >= 0n && BigInt(nft.tokenId) < 2n ** 256n ? PASS : FAIL\n } catch {\n return FAIL\n }\n}\n","import { NftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport { FAIL, PASS, PassFailScoringFunction } from '@xyo-network/crypto-nft-score-model'\n\n/**\n * Callers SHALL NOT assume that ID numbers have any specific pattern to them, and\n * MUST treat the ID as a \"black box\"\n * @param nft\n * @returns\n */\nexport const scoreTokenId: PassFailScoringFunction<NftInfoFields> = (nft: NftInfoFields) => {\n if (!nft.tokenId) return FAIL\n if (typeof nft.tokenId !== 'string') return FAIL\n try {\n return BigInt(nft.tokenId) >= 0n && BigInt(nft.tokenId) < 2n ** 256n ? PASS : FAIL\n } catch {\n return FAIL\n }\n}\n","import { NftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport { FAIL, PASS, PassFailScoringFunction } from '@xyo-network/crypto-nft-score-model'\n\nexport const scoreType: PassFailScoringFunction<NftInfoFields> = (nft: NftInfoFields) => {\n if (!nft.type) return FAIL\n if (typeof nft.type !== 'string') return FAIL\n const type = nft.type.toUpperCase()\n if (type !== 'ERC721' && type !== 'ERC1155') return FAIL\n return PASS\n}\n","import {\n evaluateNftAttributes,\n scoreContractAddress,\n scoreNftAnimationUrl,\n scoreNftBackgroundColor,\n scoreNftDescription,\n scoreNftExternalUrl,\n scoreNftImage,\n scoreNftImageData,\n scoreNftName,\n scoreNftYoutubeUrl,\n scoreSupply,\n scoreTokenId,\n scoreType,\n} from './scoring'\n\nconst attributesScoringCriteria = {\n Attributes: { score: evaluateNftAttributes, weight: 1 },\n}\n\nconst metadataScoringCriteria = {\n 'Animation URL': { score: scoreNftAnimationUrl, weight: 1 },\n 'Background Color': { score: scoreNftBackgroundColor, weight: 1 },\n Description: { score: scoreNftDescription, weight: 1 },\n 'External Url': { score: scoreNftExternalUrl, weight: 1 },\n Image: { score: scoreNftImage, weight: 1 },\n 'Image Data': { score: scoreNftImageData, weight: 1 },\n Name: { score: scoreNftName, weight: 1 },\n 'YouTube URL': { score: scoreNftYoutubeUrl, weight: 1 },\n ...attributesScoringCriteria,\n}\n\nexport const scoringCriteria = {\n 'Contract Address': { score: scoreContractAddress, weight: 1 },\n Supply: { score: scoreSupply, weight: 1 },\n 'Token Id': { score: scoreTokenId, weight: 1 },\n Type: { score: scoreType, weight: 1 },\n ...metadataScoringCriteria,\n}\n","import { NftInfoFields } from '@xyo-network/crypto-nft-payload-plugin'\nimport { Score } from '@xyo-network/crypto-nft-score-model'\n\nimport { scoringCriteria } from './criteria'\n\nexport type ScoringCriteriaKey = keyof typeof scoringCriteria & PropertyKey\n\nexport type NftAnalysis = {\n [key in ScoringCriteriaKey]: Score\n}\n\nexport const analyzeNft = async (\n /**\n * The NFT to evaluate\n */\n nft: NftInfoFields,\n): Promise<NftAnalysis> => {\n const result = Object.fromEntries(\n await Promise.all(\n Object.entries(scoringCriteria).map(async ([key, { score, weight }]) => {\n const rawScore = await score(nft)\n const weighted = rawScore.map((v) => v * weight) as Score\n return [key, weighted] as const\n }),\n ),\n ) as NftAnalysis\n return result\n}\n","import { NftSchema } from '@xyo-network/crypto-nft-payload-plugin'\nimport { PayloadSetSchema } from '@xyo-network/payload-model'\nimport { createPayloadSetDivinerPlugin } from '@xyo-network/payloadset-plugin'\n\nimport { NftScoreDiviner } from './Diviner'\n\nexport const NftScoreDivinerPlugin = () =>\n createPayloadSetDivinerPlugin<NftScoreDiviner>(\n { required: { [NftSchema]: 1 }, schema: PayloadSetSchema },\n {\n diviner: async (params) => {\n const result = await NftScoreDiviner.create(params)\n return result\n },\n },\n )\n"],"mappings":"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","names":["isNftInfo","NftScoreDivinerConfigSchema","NftScoreSchema","AbstractDiviner","PayloadBuilder","FAIL","PASS","isAddress","scoreContractAddress","nft","incrementPossible","incrementTotal","incrementTotalAndPossible","PASS","URL","web3Protocols","toUrl","url","isValidUrl","isWeb3","protocol","_a","isSecure","url","_a","isWeb3","toUrl","scoreNftAnimationUrl","nft","_a","scoreAnimationUrl","animation_url","score","PASS","incrementPossible","incrementTotalAndPossible","isValidUrl","isSecure","isWeb3","incrementTotal","incrementPossible","incrementTotal","incrementTotalAndPossible","isDate","value","isNumber","isPercentage","isNonEmptyString","isNonEmptyStringOrNumber","evaluateNftAttributes","nft","_a","_b","evaluateAttributes","attributes","score","attribute","attributeTotal","attributePossible","evaluateAttribute","max_value","trait_type","validDisplayType","incrementPossible","incrementTotal","incrementTotalAndPossible","PASS","isHexColor","scoreNftBackgroundColor","nft","_a","scoreBackgroundColor","background_color","score","incrementTotal","scoreNftDescription","nft","_a","scoreDescription","description","score","incrementTotal","scoreNftExternalUrl","nft","_a","scoreExternalUrl","external_url","score","isValidUrl","incrementTotal","isSecure","incrementTotal","PASS","MaxPossibleImageScore","scoreNftImage","nft","_a","_b","_c","scoreImage","PASS","image","score","isValidUrl","incrementTotal","isSecure","isWeb3","PASS","parse","MaxPossibleImageDataScore","isValidImageData","image_data","scoreNftImageData","nft","_a","_b","_c","scoreImageData","incrementTotal","scoreNftName","nft","_a","scoreName","name","score","incrementTotal","PASS","scoreNftYoutubeUrl","nft","_a","scoreYoutubeUrl","youtube_url","PASS","score","isValidUrl","incrementTotal","isSecure","FAIL","PASS","scoreSupply","nft","FAIL","PASS","scoreTokenId","nft","FAIL","PASS","scoreType","nft","type","attributesScoringCriteria","evaluateNftAttributes","metadataScoringCriteria","scoreNftAnimationUrl","scoreNftBackgroundColor","scoreNftDescription","scoreNftExternalUrl","scoreNftImage","scoreNftImageData","scoreNftName","scoreNftYoutubeUrl","scoringCriteria","scoreContractAddress","scoreSupply","scoreTokenId","scoreType","analyzeNft","nft","scoringCriteria","key","score","weight","weighted","v","toNftScorePayload","nftInfo","scores","address","chainId","type","NftScoreSchema","isNftScore","payload","NftScoreDiviner","AbstractDiviner","NftScoreDivinerConfigSchema","payloads","nftInfos","isNftInfo","score","sourceHash","analyzeNft","PayloadBuilder","NftSchema","PayloadSetSchema","createPayloadSetDivinerPlugin","NftScoreDivinerPlugin","createPayloadSetDivinerPlugin","NftSchema","PayloadSetSchema","params","NftScoreDiviner"]}
@@ -1 +1 @@
1
- {"version":3,"file":"analyzeNft.d.ts","sourceRoot":"","sources":["../../../../src/lib/rating/analyzeNft.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAA;AACtE,OAAO,EAAE,KAAK,EAAE,MAAM,qCAAqC,CAAA;AAE3D,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAE5C,MAAM,MAAM,kBAAkB,GAAG,MAAM,OAAO,eAAe,GAAG,WAAW,CAAA;AAE3E,MAAM,MAAM,WAAW,GAAG;KACvB,GAAG,IAAI,kBAAkB,GAAG,KAAK;CACnC,CAAA;AAED,eAAO,MAAM,UAAU,QAIhB,aAAa,KACjB,QAAQ,WAAW,CAWrB,CAAA"}
1
+ {"version":3,"file":"analyzeNft.d.ts","sourceRoot":"","sources":["../../../../src/lib/rating/analyzeNft.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAA;AACtE,OAAO,EAAE,KAAK,EAAE,MAAM,qCAAqC,CAAA;AAE3D,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAE5C,MAAM,MAAM,kBAAkB,GAAG,MAAM,OAAO,eAAe,GAAG,WAAW,CAAA;AAE3E,MAAM,MAAM,WAAW,GAAG;KACvB,GAAG,IAAI,kBAAkB,GAAG,KAAK;CACnC,CAAA;AAED,eAAO,MAAM,UAAU,QAIhB,aAAa,KACjB,OAAO,CAAC,WAAW,CAWrB,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"analyzeNft.d.ts","sourceRoot":"","sources":["../../../../src/lib/rating/analyzeNft.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAA;AACtE,OAAO,EAAE,KAAK,EAAE,MAAM,qCAAqC,CAAA;AAE3D,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAE5C,MAAM,MAAM,kBAAkB,GAAG,MAAM,OAAO,eAAe,GAAG,WAAW,CAAA;AAE3E,MAAM,MAAM,WAAW,GAAG;KACvB,GAAG,IAAI,kBAAkB,GAAG,KAAK;CACnC,CAAA;AAED,eAAO,MAAM,UAAU,QAIhB,aAAa,KACjB,QAAQ,WAAW,CAWrB,CAAA"}
1
+ {"version":3,"file":"analyzeNft.d.ts","sourceRoot":"","sources":["../../../../src/lib/rating/analyzeNft.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAA;AACtE,OAAO,EAAE,KAAK,EAAE,MAAM,qCAAqC,CAAA;AAE3D,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAE5C,MAAM,MAAM,kBAAkB,GAAG,MAAM,OAAO,eAAe,GAAG,WAAW,CAAA;AAE3E,MAAM,MAAM,WAAW,GAAG;KACvB,GAAG,IAAI,kBAAkB,GAAG,KAAK;CACnC,CAAA;AAED,eAAO,MAAM,UAAU,QAIhB,aAAa,KACjB,OAAO,CAAC,WAAW,CAWrB,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"analyzeNft.d.ts","sourceRoot":"","sources":["../../../../src/lib/rating/analyzeNft.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAA;AACtE,OAAO,EAAE,KAAK,EAAE,MAAM,qCAAqC,CAAA;AAE3D,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAE5C,MAAM,MAAM,kBAAkB,GAAG,MAAM,OAAO,eAAe,GAAG,WAAW,CAAA;AAE3E,MAAM,MAAM,WAAW,GAAG;KACvB,GAAG,IAAI,kBAAkB,GAAG,KAAK;CACnC,CAAA;AAED,eAAO,MAAM,UAAU,QAIhB,aAAa,KACjB,QAAQ,WAAW,CAWrB,CAAA"}
1
+ {"version":3,"file":"analyzeNft.d.ts","sourceRoot":"","sources":["../../../../src/lib/rating/analyzeNft.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAA;AACtE,OAAO,EAAE,KAAK,EAAE,MAAM,qCAAqC,CAAA;AAE3D,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAE5C,MAAM,MAAM,kBAAkB,GAAG,MAAM,OAAO,eAAe,GAAG,WAAW,CAAA;AAE3E,MAAM,MAAM,WAAW,GAAG;KACvB,GAAG,IAAI,kBAAkB,GAAG,KAAK;CACnC,CAAA;AAED,eAAO,MAAM,UAAU,QAIhB,aAAa,KACjB,OAAO,CAAC,WAAW,CAWrB,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"animationUrl.d.ts","sourceRoot":"","sources":["../../../../../../../src/lib/rating/criteria/scoring/metadata/animationUrl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAA;AAC5F,OAAO,EAAsE,WAAW,EAAE,MAAM,qCAAqC,CAAA;AAIrI,eAAO,MAAM,oBAAoB,QAAS,aAAa,GAAG,oBAAoB,gBAE7E,CAAA;AAED,eAAO,MAAM,iBAAiB,kBAAmB,OAAO,gBAYvD,CAAA"}
1
+ {"version":3,"file":"animationUrl.d.ts","sourceRoot":"","sources":["../../../../../../../src/lib/rating/criteria/scoring/metadata/animationUrl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAA;AAC5F,OAAO,EAAsE,WAAW,EAAE,MAAM,qCAAqC,CAAA;AAIrI,eAAO,MAAM,oBAAoB,QAAS,aAAa,GAAG,oBAAoB,KAAG,WAEhF,CAAA;AAED,eAAO,MAAM,iBAAiB,kBAAmB,OAAO,KAAG,WAY1D,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"animationUrl.d.ts","sourceRoot":"","sources":["../../../../../../../src/lib/rating/criteria/scoring/metadata/animationUrl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAA;AAC5F,OAAO,EAAsE,WAAW,EAAE,MAAM,qCAAqC,CAAA;AAIrI,eAAO,MAAM,oBAAoB,QAAS,aAAa,GAAG,oBAAoB,gBAE7E,CAAA;AAED,eAAO,MAAM,iBAAiB,kBAAmB,OAAO,gBAYvD,CAAA"}
1
+ {"version":3,"file":"animationUrl.d.ts","sourceRoot":"","sources":["../../../../../../../src/lib/rating/criteria/scoring/metadata/animationUrl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAA;AAC5F,OAAO,EAAsE,WAAW,EAAE,MAAM,qCAAqC,CAAA;AAIrI,eAAO,MAAM,oBAAoB,QAAS,aAAa,GAAG,oBAAoB,KAAG,WAEhF,CAAA;AAED,eAAO,MAAM,iBAAiB,kBAAmB,OAAO,KAAG,WAY1D,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"animationUrl.d.ts","sourceRoot":"","sources":["../../../../../../../src/lib/rating/criteria/scoring/metadata/animationUrl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAA;AAC5F,OAAO,EAAsE,WAAW,EAAE,MAAM,qCAAqC,CAAA;AAIrI,eAAO,MAAM,oBAAoB,QAAS,aAAa,GAAG,oBAAoB,gBAE7E,CAAA;AAED,eAAO,MAAM,iBAAiB,kBAAmB,OAAO,gBAYvD,CAAA"}
1
+ {"version":3,"file":"animationUrl.d.ts","sourceRoot":"","sources":["../../../../../../../src/lib/rating/criteria/scoring/metadata/animationUrl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAA;AAC5F,OAAO,EAAsE,WAAW,EAAE,MAAM,qCAAqC,CAAA;AAIrI,eAAO,MAAM,oBAAoB,QAAS,aAAa,GAAG,oBAAoB,KAAG,WAEhF,CAAA;AAED,eAAO,MAAM,iBAAiB,kBAAmB,OAAO,KAAG,WAY1D,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"evaluateAttributes.d.ts","sourceRoot":"","sources":["../../../../../../../../src/lib/rating/criteria/scoring/metadata/attributes/evaluateAttributes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAA;AAC/H,OAAO,EAAgE,WAAW,EAAE,MAAM,qCAAqC,CAAA;AAsB/H,eAAO,MAAM,qBAAqB,QAAS,aAAa,GAAG,oBAAoB,gBACK,CAAA;AAEpF,eAAO,MAAM,kBAAkB,eAAgB,YAAY,EAAE,GAAG,mBAAmB,EAAE,GAAG,OAAO,gBAQ9F,CAAA;AAED,eAAO,MAAM,iBAAiB,cAAe,mBAAmB,gBAqB/D,CAAA"}
1
+ {"version":3,"file":"evaluateAttributes.d.ts","sourceRoot":"","sources":["../../../../../../../../src/lib/rating/criteria/scoring/metadata/attributes/evaluateAttributes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAA;AAC/H,OAAO,EAAgE,WAAW,EAAE,MAAM,qCAAqC,CAAA;AAsB/H,eAAO,MAAM,qBAAqB,QAAS,aAAa,GAAG,oBAAoB,KAAG,WACE,CAAA;AAEpF,eAAO,MAAM,kBAAkB,eAAgB,YAAY,EAAE,GAAG,mBAAmB,EAAE,GAAG,OAAO,KAAG,WAQjG,CAAA;AAED,eAAO,MAAM,iBAAiB,cAAe,mBAAmB,KAAG,WAqBlE,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"evaluateAttributes.d.ts","sourceRoot":"","sources":["../../../../../../../../src/lib/rating/criteria/scoring/metadata/attributes/evaluateAttributes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAA;AAC/H,OAAO,EAAgE,WAAW,EAAE,MAAM,qCAAqC,CAAA;AAsB/H,eAAO,MAAM,qBAAqB,QAAS,aAAa,GAAG,oBAAoB,gBACK,CAAA;AAEpF,eAAO,MAAM,kBAAkB,eAAgB,YAAY,EAAE,GAAG,mBAAmB,EAAE,GAAG,OAAO,gBAQ9F,CAAA;AAED,eAAO,MAAM,iBAAiB,cAAe,mBAAmB,gBAqB/D,CAAA"}
1
+ {"version":3,"file":"evaluateAttributes.d.ts","sourceRoot":"","sources":["../../../../../../../../src/lib/rating/criteria/scoring/metadata/attributes/evaluateAttributes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAA;AAC/H,OAAO,EAAgE,WAAW,EAAE,MAAM,qCAAqC,CAAA;AAsB/H,eAAO,MAAM,qBAAqB,QAAS,aAAa,GAAG,oBAAoB,KAAG,WACE,CAAA;AAEpF,eAAO,MAAM,kBAAkB,eAAgB,YAAY,EAAE,GAAG,mBAAmB,EAAE,GAAG,OAAO,KAAG,WAQjG,CAAA;AAED,eAAO,MAAM,iBAAiB,cAAe,mBAAmB,KAAG,WAqBlE,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"evaluateAttributes.d.ts","sourceRoot":"","sources":["../../../../../../../../src/lib/rating/criteria/scoring/metadata/attributes/evaluateAttributes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAA;AAC/H,OAAO,EAAgE,WAAW,EAAE,MAAM,qCAAqC,CAAA;AAsB/H,eAAO,MAAM,qBAAqB,QAAS,aAAa,GAAG,oBAAoB,gBACK,CAAA;AAEpF,eAAO,MAAM,kBAAkB,eAAgB,YAAY,EAAE,GAAG,mBAAmB,EAAE,GAAG,OAAO,gBAQ9F,CAAA;AAED,eAAO,MAAM,iBAAiB,cAAe,mBAAmB,gBAqB/D,CAAA"}
1
+ {"version":3,"file":"evaluateAttributes.d.ts","sourceRoot":"","sources":["../../../../../../../../src/lib/rating/criteria/scoring/metadata/attributes/evaluateAttributes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAA;AAC/H,OAAO,EAAgE,WAAW,EAAE,MAAM,qCAAqC,CAAA;AAsB/H,eAAO,MAAM,qBAAqB,QAAS,aAAa,GAAG,oBAAoB,KAAG,WACE,CAAA;AAEpF,eAAO,MAAM,kBAAkB,eAAgB,YAAY,EAAE,GAAG,mBAAmB,EAAE,GAAG,OAAO,KAAG,WAQjG,CAAA;AAED,eAAO,MAAM,iBAAiB,cAAe,mBAAmB,KAAG,WAqBlE,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"backgroundColor.d.ts","sourceRoot":"","sources":["../../../../../../../src/lib/rating/criteria/scoring/metadata/backgroundColor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAA;AAC5F,OAAO,EAAsE,WAAW,EAAE,MAAM,qCAAqC,CAAA;AAIrI,eAAO,MAAM,uBAAuB,QAAS,aAAa,GAAG,oBAAoB,gBAEhF,CAAA;AAED,eAAO,MAAM,oBAAoB,qBAAsB,OAAO,gBAQ7D,CAAA"}
1
+ {"version":3,"file":"backgroundColor.d.ts","sourceRoot":"","sources":["../../../../../../../src/lib/rating/criteria/scoring/metadata/backgroundColor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAA;AAC5F,OAAO,EAAsE,WAAW,EAAE,MAAM,qCAAqC,CAAA;AAIrI,eAAO,MAAM,uBAAuB,QAAS,aAAa,GAAG,oBAAoB,KAAG,WAEnF,CAAA;AAED,eAAO,MAAM,oBAAoB,qBAAsB,OAAO,KAAG,WAQhE,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"backgroundColor.d.ts","sourceRoot":"","sources":["../../../../../../../src/lib/rating/criteria/scoring/metadata/backgroundColor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAA;AAC5F,OAAO,EAAsE,WAAW,EAAE,MAAM,qCAAqC,CAAA;AAIrI,eAAO,MAAM,uBAAuB,QAAS,aAAa,GAAG,oBAAoB,gBAEhF,CAAA;AAED,eAAO,MAAM,oBAAoB,qBAAsB,OAAO,gBAQ7D,CAAA"}
1
+ {"version":3,"file":"backgroundColor.d.ts","sourceRoot":"","sources":["../../../../../../../src/lib/rating/criteria/scoring/metadata/backgroundColor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAA;AAC5F,OAAO,EAAsE,WAAW,EAAE,MAAM,qCAAqC,CAAA;AAIrI,eAAO,MAAM,uBAAuB,QAAS,aAAa,GAAG,oBAAoB,KAAG,WAEnF,CAAA;AAED,eAAO,MAAM,oBAAoB,qBAAsB,OAAO,KAAG,WAQhE,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"backgroundColor.d.ts","sourceRoot":"","sources":["../../../../../../../src/lib/rating/criteria/scoring/metadata/backgroundColor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAA;AAC5F,OAAO,EAAsE,WAAW,EAAE,MAAM,qCAAqC,CAAA;AAIrI,eAAO,MAAM,uBAAuB,QAAS,aAAa,GAAG,oBAAoB,gBAEhF,CAAA;AAED,eAAO,MAAM,oBAAoB,qBAAsB,OAAO,gBAQ7D,CAAA"}
1
+ {"version":3,"file":"backgroundColor.d.ts","sourceRoot":"","sources":["../../../../../../../src/lib/rating/criteria/scoring/metadata/backgroundColor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAA;AAC5F,OAAO,EAAsE,WAAW,EAAE,MAAM,qCAAqC,CAAA;AAIrI,eAAO,MAAM,uBAAuB,QAAS,aAAa,GAAG,oBAAoB,KAAG,WAEnF,CAAA;AAED,eAAO,MAAM,oBAAoB,qBAAsB,OAAO,KAAG,WAQhE,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"description.d.ts","sourceRoot":"","sources":["../../../../../../../src/lib/rating/criteria/scoring/metadata/description.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAA;AAC5F,OAAO,EAAkB,WAAW,EAAE,MAAM,qCAAqC,CAAA;AAEjF,eAAO,MAAM,mBAAmB,QAAS,aAAa,GAAG,oBAAoB,gBAE5E,CAAA;AAED,eAAO,MAAM,gBAAgB,gBAAiB,OAAO,gBAIpD,CAAA"}
1
+ {"version":3,"file":"description.d.ts","sourceRoot":"","sources":["../../../../../../../src/lib/rating/criteria/scoring/metadata/description.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAA;AAC5F,OAAO,EAAkB,WAAW,EAAE,MAAM,qCAAqC,CAAA;AAEjF,eAAO,MAAM,mBAAmB,QAAS,aAAa,GAAG,oBAAoB,KAAG,WAE/E,CAAA;AAED,eAAO,MAAM,gBAAgB,gBAAiB,OAAO,KAAG,WAIvD,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"description.d.ts","sourceRoot":"","sources":["../../../../../../../src/lib/rating/criteria/scoring/metadata/description.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAA;AAC5F,OAAO,EAAkB,WAAW,EAAE,MAAM,qCAAqC,CAAA;AAEjF,eAAO,MAAM,mBAAmB,QAAS,aAAa,GAAG,oBAAoB,gBAE5E,CAAA;AAED,eAAO,MAAM,gBAAgB,gBAAiB,OAAO,gBAIpD,CAAA"}
1
+ {"version":3,"file":"description.d.ts","sourceRoot":"","sources":["../../../../../../../src/lib/rating/criteria/scoring/metadata/description.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAA;AAC5F,OAAO,EAAkB,WAAW,EAAE,MAAM,qCAAqC,CAAA;AAEjF,eAAO,MAAM,mBAAmB,QAAS,aAAa,GAAG,oBAAoB,KAAG,WAE/E,CAAA;AAED,eAAO,MAAM,gBAAgB,gBAAiB,OAAO,KAAG,WAIvD,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"description.d.ts","sourceRoot":"","sources":["../../../../../../../src/lib/rating/criteria/scoring/metadata/description.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAA;AAC5F,OAAO,EAAkB,WAAW,EAAE,MAAM,qCAAqC,CAAA;AAEjF,eAAO,MAAM,mBAAmB,QAAS,aAAa,GAAG,oBAAoB,gBAE5E,CAAA;AAED,eAAO,MAAM,gBAAgB,gBAAiB,OAAO,gBAIpD,CAAA"}
1
+ {"version":3,"file":"description.d.ts","sourceRoot":"","sources":["../../../../../../../src/lib/rating/criteria/scoring/metadata/description.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAA;AAC5F,OAAO,EAAkB,WAAW,EAAE,MAAM,qCAAqC,CAAA;AAEjF,eAAO,MAAM,mBAAmB,QAAS,aAAa,GAAG,oBAAoB,KAAG,WAE/E,CAAA;AAED,eAAO,MAAM,gBAAgB,gBAAiB,OAAO,KAAG,WAIvD,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"externalUrl.d.ts","sourceRoot":"","sources":["../../../../../../../src/lib/rating/criteria/scoring/metadata/externalUrl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAA;AAC5F,OAAO,EAAkB,WAAW,EAAE,MAAM,qCAAqC,CAAA;AAIjF,eAAO,MAAM,mBAAmB,QAAS,aAAa,GAAG,oBAAoB,gBAE5E,CAAA;AACD,eAAO,MAAM,gBAAgB,iBAAkB,OAAO,gBAMrD,CAAA"}
1
+ {"version":3,"file":"externalUrl.d.ts","sourceRoot":"","sources":["../../../../../../../src/lib/rating/criteria/scoring/metadata/externalUrl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAA;AAC5F,OAAO,EAAkB,WAAW,EAAE,MAAM,qCAAqC,CAAA;AAIjF,eAAO,MAAM,mBAAmB,QAAS,aAAa,GAAG,oBAAoB,KAAG,WAE/E,CAAA;AACD,eAAO,MAAM,gBAAgB,iBAAkB,OAAO,KAAG,WAMxD,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"externalUrl.d.ts","sourceRoot":"","sources":["../../../../../../../src/lib/rating/criteria/scoring/metadata/externalUrl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAA;AAC5F,OAAO,EAAkB,WAAW,EAAE,MAAM,qCAAqC,CAAA;AAIjF,eAAO,MAAM,mBAAmB,QAAS,aAAa,GAAG,oBAAoB,gBAE5E,CAAA;AACD,eAAO,MAAM,gBAAgB,iBAAkB,OAAO,gBAMrD,CAAA"}
1
+ {"version":3,"file":"externalUrl.d.ts","sourceRoot":"","sources":["../../../../../../../src/lib/rating/criteria/scoring/metadata/externalUrl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAA;AAC5F,OAAO,EAAkB,WAAW,EAAE,MAAM,qCAAqC,CAAA;AAIjF,eAAO,MAAM,mBAAmB,QAAS,aAAa,GAAG,oBAAoB,KAAG,WAE/E,CAAA;AACD,eAAO,MAAM,gBAAgB,iBAAkB,OAAO,KAAG,WAMxD,CAAA"}