@xyo-network/crypto-nft-diviner-score-plugin 2.75.3 → 2.75.4

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 (60) hide show
  1. package/dist/browser/Diviner.js +359 -5
  2. package/dist/browser/Diviner.js.map +1 -1
  3. package/dist/browser/Plugin.js +389 -2
  4. package/dist/browser/Plugin.js.map +1 -1
  5. package/dist/browser/index.js +407 -4
  6. package/dist/browser/index.js.map +1 -1
  7. package/dist/browser/lib/index.js +354 -1
  8. package/dist/browser/lib/index.js.map +1 -1
  9. package/dist/browser/lib/rating/analyzeNft.js +340 -2
  10. package/dist/browser/lib/rating/analyzeNft.js.map +1 -1
  11. package/dist/browser/lib/rating/criteria/index.js +340 -1
  12. package/dist/browser/lib/rating/criteria/index.js.map +1 -1
  13. package/dist/browser/lib/rating/criteria/scoring/contract.js +2 -1
  14. package/dist/browser/lib/rating/criteria/scoring/contract.js.map +1 -1
  15. package/dist/browser/lib/rating/criteria/scoring/index.js +339 -5
  16. package/dist/browser/lib/rating/criteria/scoring/index.js.map +1 -1
  17. package/dist/browser/lib/rating/criteria/scoring/lib/index.js +19 -2
  18. package/dist/browser/lib/rating/criteria/scoring/lib/index.js.map +1 -1
  19. package/dist/browser/lib/rating/criteria/scoring/lib/isValidPositiveBigNumber.js +12 -2
  20. package/dist/browser/lib/rating/criteria/scoring/lib/isValidPositiveBigNumber.js.map +1 -1
  21. package/dist/browser/lib/rating/criteria/scoring/lib/toBigNumber.js +2 -1
  22. package/dist/browser/lib/rating/criteria/scoring/lib/toBigNumber.js.map +1 -1
  23. package/dist/browser/lib/rating/criteria/scoring/metadata/animationUrl.js +21 -3
  24. package/dist/browser/lib/rating/criteria/scoring/metadata/animationUrl.js.map +1 -1
  25. package/dist/browser/lib/rating/criteria/scoring/metadata/attributes/evaluateAttributes.js +10 -9
  26. package/dist/browser/lib/rating/criteria/scoring/metadata/attributes/evaluateAttributes.js.map +1 -1
  27. package/dist/browser/lib/rating/criteria/scoring/metadata/attributes/index.js +81 -1
  28. package/dist/browser/lib/rating/criteria/scoring/metadata/attributes/index.js.map +1 -1
  29. package/dist/browser/lib/rating/criteria/scoring/metadata/backgroundColor.js +4 -3
  30. package/dist/browser/lib/rating/criteria/scoring/metadata/backgroundColor.js.map +1 -1
  31. package/dist/browser/lib/rating/criteria/scoring/metadata/description.js +3 -2
  32. package/dist/browser/lib/rating/criteria/scoring/metadata/description.js.map +1 -1
  33. package/dist/browser/lib/rating/criteria/scoring/metadata/externalUrl.js +21 -3
  34. package/dist/browser/lib/rating/criteria/scoring/metadata/externalUrl.js.map +1 -1
  35. package/dist/browser/lib/rating/criteria/scoring/metadata/image.js +22 -4
  36. package/dist/browser/lib/rating/criteria/scoring/metadata/image.js.map +1 -1
  37. package/dist/browser/lib/rating/criteria/scoring/metadata/imageData.js +5 -4
  38. package/dist/browser/lib/rating/criteria/scoring/metadata/imageData.js.map +1 -1
  39. package/dist/browser/lib/rating/criteria/scoring/metadata/index.js +263 -9
  40. package/dist/browser/lib/rating/criteria/scoring/metadata/index.js.map +1 -1
  41. package/dist/browser/lib/rating/criteria/scoring/metadata/lib/index.js +24 -1
  42. package/dist/browser/lib/rating/criteria/scoring/metadata/lib/index.js.map +1 -1
  43. package/dist/browser/lib/rating/criteria/scoring/metadata/lib/urlHelpers.js +7 -6
  44. package/dist/browser/lib/rating/criteria/scoring/metadata/lib/urlHelpers.js.map +1 -1
  45. package/dist/browser/lib/rating/criteria/scoring/metadata/name.js +3 -2
  46. package/dist/browser/lib/rating/criteria/scoring/metadata/name.js.map +1 -1
  47. package/dist/browser/lib/rating/criteria/scoring/metadata/youtubeUrl.js +21 -3
  48. package/dist/browser/lib/rating/criteria/scoring/metadata/youtubeUrl.js.map +1 -1
  49. package/dist/browser/lib/rating/criteria/scoring/supply.js +20 -2
  50. package/dist/browser/lib/rating/criteria/scoring/supply.js.map +1 -1
  51. package/dist/browser/lib/rating/criteria/scoring/tokenId.js +20 -2
  52. package/dist/browser/lib/rating/criteria/scoring/tokenId.js.map +1 -1
  53. package/dist/browser/lib/rating/criteria/scoring/type.js +2 -1
  54. package/dist/browser/lib/rating/criteria/scoring/type.js.map +1 -1
  55. package/dist/browser/lib/rating/criteria/scoringCriteria.js +319 -18
  56. package/dist/browser/lib/rating/criteria/scoringCriteria.js.map +1 -1
  57. package/dist/browser/lib/rating/index.js +354 -1
  58. package/dist/browser/lib/rating/index.js.map +1 -1
  59. package/dist/docs.json +14 -14
  60. package/package.json +14 -14
@@ -1,2 +1,82 @@
1
- export * from "./evaluateAttributes";
1
+ // src/lib/rating/criteria/scoring/metadata/attributes/evaluateAttributes.ts
2
+ import { incrementPossible, incrementTotal, incrementTotalAndPossible } from "@xyo-network/crypto-nft-score-model";
3
+ var isDate = (value) => {
4
+ if (isNumber(value)) {
5
+ try {
6
+ new Date(value);
7
+ return true;
8
+ } catch (error) {
9
+ return false;
10
+ }
11
+ }
12
+ return false;
13
+ };
14
+ var isNumber = (value) => typeof value === "number";
15
+ var isPercentage = (value) => isNumber(value) && value >= 0 && value <= 100;
16
+ var isNonEmptyString = (value) => typeof value === "string" && value.length > 0;
17
+ var isNonEmptyStringOrNumber = (value) => value === "number" || isNonEmptyString(value);
18
+ var evaluateNftAttributes = (nft) => !nft?.metadata?.attributes ? [0, 1] : evaluateAttributes(nft?.metadata?.attributes);
19
+ var evaluateAttributes = (attributes) => {
20
+ if (!attributes || !Array.isArray(attributes) || attributes.length === 0)
21
+ return [0, 1];
22
+ const score = [0, 0];
23
+ for (const attribute of attributes) {
24
+ const [attributeTotal, attributePossible] = evaluateAttribute(attribute);
25
+ incrementTotalAndPossible(score, attributeTotal, attributePossible);
26
+ }
27
+ return [1, 1];
28
+ };
29
+ var evaluateAttribute = (attribute) => {
30
+ const score = [0, 1];
31
+ const max_value = attribute?.max_value;
32
+ const trait_type = attribute?.trait_type;
33
+ const value = attribute?.value;
34
+ if (!attribute || typeof attribute !== "object" || !isNonEmptyString(trait_type) || !isNonEmptyStringOrNumber(value))
35
+ return score;
36
+ incrementTotal(score);
37
+ incrementPossible(score);
38
+ if (validDisplayType(attribute))
39
+ incrementTotal(score);
40
+ if (max_value !== void 0) {
41
+ incrementPossible(score);
42
+ if (isNumber(max_value) && isNumber(value) && value <= max_value)
43
+ incrementTotal(score);
44
+ }
45
+ return score;
46
+ };
47
+ var validDisplayType = (attribute) => {
48
+ switch (attribute?.display_type) {
49
+ case "number":
50
+ case "boost_number": {
51
+ if (isNumber(attribute?.value))
52
+ return true;
53
+ break;
54
+ }
55
+ case "boost_percentage": {
56
+ if (isPercentage(attribute?.value))
57
+ return true;
58
+ break;
59
+ }
60
+ case "date": {
61
+ if (isDate(attribute?.value))
62
+ return true;
63
+ break;
64
+ }
65
+ case "string":
66
+ case void 0: {
67
+ if (isNonEmptyString(attribute?.value))
68
+ return true;
69
+ break;
70
+ }
71
+ default: {
72
+ break;
73
+ }
74
+ }
75
+ return false;
76
+ };
77
+ export {
78
+ evaluateAttribute,
79
+ evaluateAttributes,
80
+ evaluateNftAttributes
81
+ };
2
82
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../../src/lib/rating/criteria/scoring/metadata/attributes/index.ts"],"sourcesContent":["export * from './evaluateAttributes'\n"],"mappings":"AAAA,cAAc;","names":[]}
1
+ {"version":3,"sources":["../../../../../../../../src/lib/rating/criteria/scoring/metadata/attributes/evaluateAttributes.ts"],"sourcesContent":["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 (error) {\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 ? [0, 1] : evaluateAttributes(nft?.metadata?.attributes)\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"],"mappings":";AACA,SAAS,mBAAmB,gBAAgB,iCAA8C;AAE1F,IAAM,SAAS,CAAC,UAAkC;AAChD,MAAI,SAAS,KAAK,GAAG;AACnB,QAAI;AACF,UAAI,KAAK,KAAK;AACd,aAAO;AAAA,IACT,SAAS,OAAO;AACd,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,QACpC,CAAC,KAAK,UAAU,aAAa,CAAC,GAAG,CAAC,IAAI,mBAAmB,KAAK,UAAU,UAAU;AAE7E,IAAM,qBAAqB,CAAC,eAA8E;AAC/G,MAAI,CAAC,cAAc,CAAC,MAAM,QAAQ,UAAU,KAAK,WAAW,WAAW;AAAG,WAAO,CAAC,GAAG,CAAC;AACtF,QAAM,QAAqB,CAAC,GAAG,CAAC;AAChC,aAAW,aAAa,YAAY;AAClC,UAAM,CAAC,gBAAgB,iBAAiB,IAAI,kBAAkB,SAAS;AACvE,8BAA0B,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,WAAW;AAC7B,QAAM,aAAa,WAAW;AAC9B,QAAM,QAAQ,WAAW;AAGzB,MAAI,CAAC,aAAa,OAAO,cAAc,YAAY,CAAC,iBAAiB,UAAU,KAAK,CAAC,yBAAyB,KAAK;AAAG,WAAO;AAC7H,iBAAe,KAAK;AAGpB,oBAAkB,KAAK;AACvB,MAAI,iBAAiB,SAAS;AAAG,mBAAe,KAAK;AAGrD,MAAI,cAAc,QAAW;AAC3B,sBAAkB,KAAK;AACvB,QAAI,SAAS,SAAS,KAAK,SAAS,KAAK,KAAK,SAAS;AAAW,qBAAe,KAAK;AAAA,EACxF;AAEA,SAAO;AACT;AAEA,IAAM,mBAAmB,CAAC,cAA4C;AACpE,UAAQ,WAAW,cAAc;AAAA,IAC/B,KAAK;AAAA,IACL,KAAK,gBAAgB;AACnB,UAAI,SAAS,WAAW,KAAK;AAAG,eAAO;AACvC;AAAA,IACF;AAAA,IACA,KAAK,oBAAoB;AACvB,UAAI,aAAa,WAAW,KAAK;AAAG,eAAO;AAC3C;AAAA,IACF;AAAA,IACA,KAAK,QAAQ;AACX,UAAI,OAAO,WAAW,KAAK;AAAG,eAAO;AACrC;AAAA,IACF;AAAA,IACA,KAAK;AAAA,IACL,KAAK,QAAW;AACd,UAAI,iBAAiB,WAAW,KAAK;AAAG,eAAO;AAC/C;AAAA,IACF;AAAA,IACA,SAAS;AACP;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;","names":[]}
@@ -1,9 +1,10 @@
1
+ // src/lib/rating/criteria/scoring/metadata/backgroundColor.ts
1
2
  import { incrementPossible, incrementTotal, incrementTotalAndPossible, PASS } from "@xyo-network/crypto-nft-score-model";
2
- const isHexColor = /^[0-9A-F]{6}$/i;
3
- const scoreNftBackgroundColor = (nft) => {
3
+ var isHexColor = /^[0-9A-F]{6}$/i;
4
+ var scoreNftBackgroundColor = (nft) => {
4
5
  return scoreBackgroundColor(nft.metadata?.background_color);
5
6
  };
6
- const scoreBackgroundColor = (background_color) => {
7
+ var scoreBackgroundColor = (background_color) => {
7
8
  const score = [0, 0];
8
9
  if (background_color === void 0 || background_color === null)
9
10
  return PASS;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/lib/rating/criteria/scoring/metadata/backgroundColor.ts"],"sourcesContent":["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 = /^[0-9A-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 (!background_color.toUpperCase().match(isHexColor)) return score\n return incrementTotal(score)\n}\n"],"mappings":"AACA,SAAS,mBAAmB,gBAAgB,2BAA2B,YAAyB;AAEhG,MAAM,aAAa;AAEZ,MAAM,0BAA0B,CAAC,QAA2D;AACjG,SAAO,qBAAqB,IAAI,UAAU,gBAAgB;AAC5D;AAEO,MAAM,uBAAuB,CAAC,qBAA2C;AAC9E,QAAM,QAAqB,CAAC,GAAG,CAAC;AAChC,MAAI,qBAAqB,UAAa,qBAAqB;AAAM,WAAO;AACxE,oBAAkB,KAAK;AACvB,MAAI,OAAO,qBAAqB;AAAU,WAAO;AACjD,4BAA0B,KAAK;AAC/B,MAAI,CAAC,iBAAiB,YAAY,EAAE,MAAM,UAAU;AAAG,WAAO;AAC9D,SAAO,eAAe,KAAK;AAC7B;","names":[]}
1
+ {"version":3,"sources":["../../../../../../../src/lib/rating/criteria/scoring/metadata/backgroundColor.ts"],"sourcesContent":["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 = /^[0-9A-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 (!background_color.toUpperCase().match(isHexColor)) return score\n return incrementTotal(score)\n}\n"],"mappings":";AACA,SAAS,mBAAmB,gBAAgB,2BAA2B,YAAyB;AAEhG,IAAM,aAAa;AAEZ,IAAM,0BAA0B,CAAC,QAA2D;AACjG,SAAO,qBAAqB,IAAI,UAAU,gBAAgB;AAC5D;AAEO,IAAM,uBAAuB,CAAC,qBAA2C;AAC9E,QAAM,QAAqB,CAAC,GAAG,CAAC;AAChC,MAAI,qBAAqB,UAAa,qBAAqB;AAAM,WAAO;AACxE,oBAAkB,KAAK;AACvB,MAAI,OAAO,qBAAqB;AAAU,WAAO;AACjD,4BAA0B,KAAK;AAC/B,MAAI,CAAC,iBAAiB,YAAY,EAAE,MAAM,UAAU;AAAG,WAAO;AAC9D,SAAO,eAAe,KAAK;AAC7B;","names":[]}
@@ -1,8 +1,9 @@
1
+ // src/lib/rating/criteria/scoring/metadata/description.ts
1
2
  import { incrementTotal } from "@xyo-network/crypto-nft-score-model";
2
- const scoreNftDescription = (nft) => {
3
+ var scoreNftDescription = (nft) => {
3
4
  return scoreDescription(nft.metadata?.description);
4
5
  };
5
- const scoreDescription = (description) => {
6
+ var scoreDescription = (description) => {
6
7
  const score = [0, 1];
7
8
  if (!description || typeof description !== "string")
8
9
  return score;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/lib/rating/criteria/scoring/metadata/description.ts"],"sourcesContent":["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"],"mappings":"AACA,SAAS,sBAAmC;AAErC,MAAM,sBAAsB,CAAC,QAA2D;AAC7F,SAAO,iBAAiB,IAAI,UAAU,WAAW;AACnD;AAEO,MAAM,mBAAmB,CAAC,gBAAsC;AACrE,QAAM,QAAqB,CAAC,GAAG,CAAC;AAChC,MAAI,CAAC,eAAe,OAAO,gBAAgB;AAAU,WAAO;AAC5D,SAAO,eAAe,KAAK;AAC7B;","names":[]}
1
+ {"version":3,"sources":["../../../../../../../src/lib/rating/criteria/scoring/metadata/description.ts"],"sourcesContent":["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"],"mappings":";AACA,SAAS,sBAAmC;AAErC,IAAM,sBAAsB,CAAC,QAA2D;AAC7F,SAAO,iBAAiB,IAAI,UAAU,WAAW;AACnD;AAEO,IAAM,mBAAmB,CAAC,gBAAsC;AACrE,QAAM,QAAqB,CAAC,GAAG,CAAC;AAChC,MAAI,CAAC,eAAe,OAAO,gBAAgB;AAAU,WAAO;AAC5D,SAAO,eAAe,KAAK;AAC7B;","names":[]}
@@ -1,9 +1,27 @@
1
+ // src/lib/rating/criteria/scoring/metadata/externalUrl.ts
1
2
  import { incrementTotal } from "@xyo-network/crypto-nft-score-model";
2
- import { isSecure, isValidUrl } from "./lib";
3
- const scoreNftExternalUrl = (nft) => {
3
+
4
+ // src/lib/rating/criteria/scoring/metadata/lib/urlHelpers.ts
5
+ import { URL } from "@xylabs/url";
6
+ var web3Protocols = ["ipfs:", "ar:"];
7
+ var toUrl = (url) => {
8
+ if (!url)
9
+ return void 0;
10
+ try {
11
+ return new URL(url);
12
+ } catch (e) {
13
+ return void 0;
14
+ }
15
+ };
16
+ var isValidUrl = (url) => toUrl(url) !== void 0;
17
+ var isWeb3 = (url) => web3Protocols.some((protocol) => protocol === toUrl(url)?.protocol);
18
+ var isSecure = (url) => isWeb3(url) || toUrl(url)?.protocol === "https:";
19
+
20
+ // src/lib/rating/criteria/scoring/metadata/externalUrl.ts
21
+ var scoreNftExternalUrl = (nft) => {
4
22
  return scoreExternalUrl(nft?.metadata?.external_url);
5
23
  };
6
- const scoreExternalUrl = (external_url) => {
24
+ var scoreExternalUrl = (external_url) => {
7
25
  const score = [0, 2];
8
26
  if (external_url === void 0 || external_url === null || typeof external_url !== "string" || !isValidUrl(external_url))
9
27
  return score;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/lib/rating/criteria/scoring/metadata/externalUrl.ts"],"sourcesContent":["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"],"mappings":"AACA,SAAS,sBAAmC;AAE5C,SAAS,UAAU,kBAAkB;AAE9B,MAAM,sBAAsB,CAAC,QAA2D;AAC7F,SAAO,iBAAiB,KAAK,UAAU,YAAY;AACrD;AACO,MAAM,mBAAmB,CAAC,iBAAuC;AACtE,QAAM,QAAqB,CAAC,GAAG,CAAC;AAChC,MAAI,iBAAiB,UAAa,iBAAiB,QAAQ,OAAO,iBAAiB,YAAY,CAAC,WAAW,YAAY;AAAG,WAAO;AACjI,iBAAe,KAAK;AACpB,MAAI,CAAC,SAAS,YAAY;AAAG,WAAO;AACpC,SAAO,eAAe,KAAK;AAC7B;","names":[]}
1
+ {"version":3,"sources":["../../../../../../../src/lib/rating/criteria/scoring/metadata/externalUrl.ts","../../../../../../../src/lib/rating/criteria/scoring/metadata/lib/urlHelpers.ts"],"sourcesContent":["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 { 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 (e) {\n return undefined\n }\n}\n\nexport const isValidUrl = (url?: string | null): boolean => toUrl(url) !== undefined\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"],"mappings":";AACA,SAAS,sBAAmC;;;ACD5C,SAAS,WAAW;AAEb,IAAM,gBAAgB,CAAC,SAAS,KAAK;AAErC,IAAM,QAAQ,CAAC,QAAyC;AAC7D,MAAI,CAAC;AAAK,WAAO;AACjB,MAAI;AACF,WAAO,IAAI,IAAI,GAAG;AAAA,EACpB,SAAS,GAAG;AACV,WAAO;AAAA,EACT;AACF;AAEO,IAAM,aAAa,CAAC,QAAiC,MAAM,GAAG,MAAM;AACpE,IAAM,SAAS,CAAC,QAAiC,cAAc,KAAK,CAAC,aAAa,aAAa,MAAM,GAAG,GAAG,QAAQ;AAEnH,IAAM,WAAW,CAAC,QAAiC,OAAO,GAAG,KAAK,MAAM,GAAG,GAAG,aAAa;;;ADX3F,IAAM,sBAAsB,CAAC,QAA2D;AAC7F,SAAO,iBAAiB,KAAK,UAAU,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;AAAG,WAAO;AACjI,iBAAe,KAAK;AACpB,MAAI,CAAC,SAAS,YAAY;AAAG,WAAO;AACpC,SAAO,eAAe,KAAK;AAC7B;","names":[]}
@@ -1,14 +1,32 @@
1
+ // src/lib/rating/criteria/scoring/metadata/image.ts
1
2
  import { incrementTotal, PASS } from "@xyo-network/crypto-nft-score-model";
2
- import { isSecure, isValidUrl, isWeb3 } from "./lib";
3
- const MaxPossibleImageScore = 3;
4
- const scoreNftImage = (nft) => {
3
+
4
+ // src/lib/rating/criteria/scoring/metadata/lib/urlHelpers.ts
5
+ import { URL } from "@xylabs/url";
6
+ var web3Protocols = ["ipfs:", "ar:"];
7
+ var toUrl = (url) => {
8
+ if (!url)
9
+ return void 0;
10
+ try {
11
+ return new URL(url);
12
+ } catch (e) {
13
+ return void 0;
14
+ }
15
+ };
16
+ var isValidUrl = (url) => toUrl(url) !== void 0;
17
+ var isWeb3 = (url) => web3Protocols.some((protocol) => protocol === toUrl(url)?.protocol);
18
+ var isSecure = (url) => isWeb3(url) || toUrl(url)?.protocol === "https:";
19
+
20
+ // src/lib/rating/criteria/scoring/metadata/image.ts
21
+ var MaxPossibleImageScore = 3;
22
+ var scoreNftImage = (nft) => {
5
23
  if (!nft?.metadata?.image) {
6
24
  return nft.metadata?.image_data ? PASS : [0, MaxPossibleImageScore];
7
25
  } else {
8
26
  return scoreImage(nft.metadata?.image);
9
27
  }
10
28
  };
11
- const scoreImage = (image) => {
29
+ var scoreImage = (image) => {
12
30
  const score = [0, MaxPossibleImageScore];
13
31
  if (!image || typeof image !== "string" || !isValidUrl(image))
14
32
  return score;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/lib/rating/criteria/scoring/metadata/image.ts"],"sourcesContent":["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 // but there is image data, skip this scoring criteria, otherwise fail it completely\n return nft.metadata?.image_data ? PASS : [0, MaxPossibleImageScore]\n } else {\n return scoreImage(nft.metadata?.image)\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"],"mappings":"AACA,SAAS,gBAAgB,YAAyB;AAElD,SAAS,UAAU,YAAY,cAAc;AAE7C,MAAM,wBAAwB;AAEvB,MAAM,gBAAgB,CAAC,QAA2D;AAEvF,MAAI,CAAC,KAAK,UAAU,OAAO;AAEzB,WAAO,IAAI,UAAU,aAAa,OAAO,CAAC,GAAG,qBAAqB;AAAA,EACpE,OAAO;AACL,WAAO,WAAW,IAAI,UAAU,KAAK;AAAA,EACvC;AACF;AAEO,MAAM,aAAa,CAAC,UAAgC;AACzD,QAAM,QAAqB,CAAC,GAAG,qBAAqB;AACpD,MAAI,CAAC,SAAS,OAAO,UAAU,YAAY,CAAC,WAAW,KAAK;AAAG,WAAO;AACtE,iBAAe,KAAK;AACpB,MAAI,CAAC,SAAS,KAAK;AAAG,WAAO;AAC7B,iBAAe,KAAK;AACpB,MAAI,CAAC,OAAO,KAAK;AAAG,WAAO;AAC3B,iBAAe,KAAK;AACpB,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../../../../../../src/lib/rating/criteria/scoring/metadata/image.ts","../../../../../../../src/lib/rating/criteria/scoring/metadata/lib/urlHelpers.ts"],"sourcesContent":["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 // but there is image data, skip this scoring criteria, otherwise fail it completely\n return nft.metadata?.image_data ? PASS : [0, MaxPossibleImageScore]\n } else {\n return scoreImage(nft.metadata?.image)\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 { 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 (e) {\n return undefined\n }\n}\n\nexport const isValidUrl = (url?: string | null): boolean => toUrl(url) !== undefined\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"],"mappings":";AACA,SAAS,gBAAgB,YAAyB;;;ACDlD,SAAS,WAAW;AAEb,IAAM,gBAAgB,CAAC,SAAS,KAAK;AAErC,IAAM,QAAQ,CAAC,QAAyC;AAC7D,MAAI,CAAC;AAAK,WAAO;AACjB,MAAI;AACF,WAAO,IAAI,IAAI,GAAG;AAAA,EACpB,SAAS,GAAG;AACV,WAAO;AAAA,EACT;AACF;AAEO,IAAM,aAAa,CAAC,QAAiC,MAAM,GAAG,MAAM;AACpE,IAAM,SAAS,CAAC,QAAiC,cAAc,KAAK,CAAC,aAAa,aAAa,MAAM,GAAG,GAAG,QAAQ;AAEnH,IAAM,WAAW,CAAC,QAAiC,OAAO,GAAG,KAAK,MAAM,GAAG,GAAG,aAAa;;;ADXlG,IAAM,wBAAwB;AAEvB,IAAM,gBAAgB,CAAC,QAA2D;AAEvF,MAAI,CAAC,KAAK,UAAU,OAAO;AAEzB,WAAO,IAAI,UAAU,aAAa,OAAO,CAAC,GAAG,qBAAqB;AAAA,EACpE,OAAO;AACL,WAAO,WAAW,IAAI,UAAU,KAAK;AAAA,EACvC;AACF;AAEO,IAAM,aAAa,CAAC,UAAgC;AACzD,QAAM,QAAqB,CAAC,GAAG,qBAAqB;AACpD,MAAI,CAAC,SAAS,OAAO,UAAU,YAAY,CAAC,WAAW,KAAK;AAAG,WAAO;AACtE,iBAAe,KAAK;AACpB,MAAI,CAAC,SAAS,KAAK;AAAG,WAAO;AAC7B,iBAAe,KAAK;AACpB,MAAI,CAAC,OAAO,KAAK;AAAG,WAAO;AAC3B,iBAAe,KAAK;AACpB,SAAO;AACT;","names":[]}
@@ -1,7 +1,8 @@
1
+ // src/lib/rating/criteria/scoring/metadata/imageData.ts
1
2
  import { PASS } from "@xyo-network/crypto-nft-score-model";
2
3
  import { parse } from "svg-parser";
3
- const MaxPossibleImageDataScore = 1;
4
- const isValidImageData = (image_data) => {
4
+ var MaxPossibleImageDataScore = 1;
5
+ var isValidImageData = (image_data) => {
5
6
  if (!image_data.startsWith("<svg"))
6
7
  return false;
7
8
  try {
@@ -11,14 +12,14 @@ const isValidImageData = (image_data) => {
11
12
  return false;
12
13
  }
13
14
  };
14
- const scoreNftImageData = (nft) => {
15
+ var scoreNftImageData = (nft) => {
15
16
  if (!nft?.metadata?.image_data) {
16
17
  return nft.metadata?.image ? PASS : [0, MaxPossibleImageDataScore];
17
18
  } else {
18
19
  return scoreImageData(nft.metadata?.image_data);
19
20
  }
20
21
  };
21
- const scoreImageData = (image_data) => {
22
+ var scoreImageData = (image_data) => {
22
23
  return !image_data || typeof image_data !== "string" || !isValidImageData(image_data) ? [0, MaxPossibleImageDataScore] : [MaxPossibleImageDataScore, MaxPossibleImageDataScore];
23
24
  };
24
25
  export {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/lib/rating/criteria/scoring/metadata/imageData.ts"],"sourcesContent":["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 (error) {\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 // but there is an image, skip this scoring criteria, otherwise fail it completely\n return nft.metadata?.image ? PASS : [0, MaxPossibleImageDataScore]\n } else {\n return scoreImageData(nft.metadata?.image_data)\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"],"mappings":"AACA,SAAS,YAAyB;AAClC,SAAS,aAAa;AAEtB,MAAM,4BAA4B;AAIlC,MAAM,mBAAmB,CAAC,eAAgC;AAExD,MAAI,CAAC,WAAW,WAAW,MAAM;AAAG,WAAO;AAC3C,MAAI;AAEF,UAAM,UAAU;AAChB,WAAO;AAAA,EACT,SAAS,OAAO;AACd,WAAO;AAAA,EACT;AACF;AAEO,MAAM,oBAAoB,CAAC,QAA2D;AAE3F,MAAI,CAAC,KAAK,UAAU,YAAY;AAE9B,WAAO,IAAI,UAAU,QAAQ,OAAO,CAAC,GAAG,yBAAyB;AAAA,EACnE,OAAO;AACL,WAAO,eAAe,IAAI,UAAU,UAAU;AAAA,EAChD;AACF;AAEO,MAAM,iBAAiB,CAAC,eAAqC;AAClE,SAAO,CAAC,cAAc,OAAO,eAAe,YAAY,CAAC,iBAAiB,UAAU,IAChF,CAAC,GAAG,yBAAyB,IAC7B,CAAC,2BAA2B,yBAAyB;AAC3D;","names":[]}
1
+ {"version":3,"sources":["../../../../../../../src/lib/rating/criteria/scoring/metadata/imageData.ts"],"sourcesContent":["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 (error) {\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 // but there is an image, skip this scoring criteria, otherwise fail it completely\n return nft.metadata?.image ? PASS : [0, MaxPossibleImageDataScore]\n } else {\n return scoreImageData(nft.metadata?.image_data)\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"],"mappings":";AACA,SAAS,YAAyB;AAClC,SAAS,aAAa;AAEtB,IAAM,4BAA4B;AAIlC,IAAM,mBAAmB,CAAC,eAAgC;AAExD,MAAI,CAAC,WAAW,WAAW,MAAM;AAAG,WAAO;AAC3C,MAAI;AAEF,UAAM,UAAU;AAChB,WAAO;AAAA,EACT,SAAS,OAAO;AACd,WAAO;AAAA,EACT;AACF;AAEO,IAAM,oBAAoB,CAAC,QAA2D;AAE3F,MAAI,CAAC,KAAK,UAAU,YAAY;AAE9B,WAAO,IAAI,UAAU,QAAQ,OAAO,CAAC,GAAG,yBAAyB;AAAA,EACnE,OAAO;AACL,WAAO,eAAe,IAAI,UAAU,UAAU;AAAA,EAChD;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;","names":[]}
@@ -1,10 +1,264 @@
1
- export * from "./animationUrl";
2
- export * from "./attributes";
3
- export * from "./backgroundColor";
4
- export * from "./description";
5
- export * from "./externalUrl";
6
- export * from "./image";
7
- export * from "./imageData";
8
- export * from "./name";
9
- export * from "./youtubeUrl";
1
+ // src/lib/rating/criteria/scoring/metadata/animationUrl.ts
2
+ import { incrementPossible, incrementTotal, incrementTotalAndPossible, PASS } from "@xyo-network/crypto-nft-score-model";
3
+
4
+ // src/lib/rating/criteria/scoring/metadata/lib/urlHelpers.ts
5
+ import { URL } from "@xylabs/url";
6
+ var web3Protocols = ["ipfs:", "ar:"];
7
+ var toUrl = (url) => {
8
+ if (!url)
9
+ return void 0;
10
+ try {
11
+ return new URL(url);
12
+ } catch (e) {
13
+ return void 0;
14
+ }
15
+ };
16
+ var isValidUrl = (url) => toUrl(url) !== void 0;
17
+ var isWeb3 = (url) => web3Protocols.some((protocol) => protocol === toUrl(url)?.protocol);
18
+ var isSecure = (url) => isWeb3(url) || toUrl(url)?.protocol === "https:";
19
+
20
+ // src/lib/rating/criteria/scoring/metadata/animationUrl.ts
21
+ var scoreNftAnimationUrl = (nft) => {
22
+ return scoreAnimationUrl(nft.metadata?.animation_url);
23
+ };
24
+ var scoreAnimationUrl = (animation_url) => {
25
+ const score = [0, 0];
26
+ if (animation_url === void 0 || animation_url === null)
27
+ return PASS;
28
+ incrementPossible(score);
29
+ if (typeof animation_url !== "string")
30
+ return score;
31
+ incrementTotalAndPossible(score);
32
+ if (!isValidUrl(animation_url))
33
+ return score;
34
+ incrementTotalAndPossible(score);
35
+ if (!isSecure(animation_url))
36
+ return score;
37
+ incrementTotalAndPossible(score);
38
+ if (!isWeb3(animation_url))
39
+ return score;
40
+ return incrementTotal(score);
41
+ };
42
+
43
+ // src/lib/rating/criteria/scoring/metadata/attributes/evaluateAttributes.ts
44
+ import { incrementPossible as incrementPossible2, incrementTotal as incrementTotal2, incrementTotalAndPossible as incrementTotalAndPossible2 } from "@xyo-network/crypto-nft-score-model";
45
+ var isDate = (value) => {
46
+ if (isNumber(value)) {
47
+ try {
48
+ new Date(value);
49
+ return true;
50
+ } catch (error) {
51
+ return false;
52
+ }
53
+ }
54
+ return false;
55
+ };
56
+ var isNumber = (value) => typeof value === "number";
57
+ var isPercentage = (value) => isNumber(value) && value >= 0 && value <= 100;
58
+ var isNonEmptyString = (value) => typeof value === "string" && value.length > 0;
59
+ var isNonEmptyStringOrNumber = (value) => value === "number" || isNonEmptyString(value);
60
+ var evaluateNftAttributes = (nft) => !nft?.metadata?.attributes ? [0, 1] : evaluateAttributes(nft?.metadata?.attributes);
61
+ var evaluateAttributes = (attributes) => {
62
+ if (!attributes || !Array.isArray(attributes) || attributes.length === 0)
63
+ return [0, 1];
64
+ const score = [0, 0];
65
+ for (const attribute of attributes) {
66
+ const [attributeTotal, attributePossible] = evaluateAttribute(attribute);
67
+ incrementTotalAndPossible2(score, attributeTotal, attributePossible);
68
+ }
69
+ return [1, 1];
70
+ };
71
+ var evaluateAttribute = (attribute) => {
72
+ const score = [0, 1];
73
+ const max_value = attribute?.max_value;
74
+ const trait_type = attribute?.trait_type;
75
+ const value = attribute?.value;
76
+ if (!attribute || typeof attribute !== "object" || !isNonEmptyString(trait_type) || !isNonEmptyStringOrNumber(value))
77
+ return score;
78
+ incrementTotal2(score);
79
+ incrementPossible2(score);
80
+ if (validDisplayType(attribute))
81
+ incrementTotal2(score);
82
+ if (max_value !== void 0) {
83
+ incrementPossible2(score);
84
+ if (isNumber(max_value) && isNumber(value) && value <= max_value)
85
+ incrementTotal2(score);
86
+ }
87
+ return score;
88
+ };
89
+ var validDisplayType = (attribute) => {
90
+ switch (attribute?.display_type) {
91
+ case "number":
92
+ case "boost_number": {
93
+ if (isNumber(attribute?.value))
94
+ return true;
95
+ break;
96
+ }
97
+ case "boost_percentage": {
98
+ if (isPercentage(attribute?.value))
99
+ return true;
100
+ break;
101
+ }
102
+ case "date": {
103
+ if (isDate(attribute?.value))
104
+ return true;
105
+ break;
106
+ }
107
+ case "string":
108
+ case void 0: {
109
+ if (isNonEmptyString(attribute?.value))
110
+ return true;
111
+ break;
112
+ }
113
+ default: {
114
+ break;
115
+ }
116
+ }
117
+ return false;
118
+ };
119
+
120
+ // src/lib/rating/criteria/scoring/metadata/backgroundColor.ts
121
+ import { incrementPossible as incrementPossible3, incrementTotal as incrementTotal3, incrementTotalAndPossible as incrementTotalAndPossible3, PASS as PASS2 } from "@xyo-network/crypto-nft-score-model";
122
+ var isHexColor = /^[0-9A-F]{6}$/i;
123
+ var scoreNftBackgroundColor = (nft) => {
124
+ return scoreBackgroundColor(nft.metadata?.background_color);
125
+ };
126
+ var scoreBackgroundColor = (background_color) => {
127
+ const score = [0, 0];
128
+ if (background_color === void 0 || background_color === null)
129
+ return PASS2;
130
+ incrementPossible3(score);
131
+ if (typeof background_color !== "string")
132
+ return score;
133
+ incrementTotalAndPossible3(score);
134
+ if (!background_color.toUpperCase().match(isHexColor))
135
+ return score;
136
+ return incrementTotal3(score);
137
+ };
138
+
139
+ // src/lib/rating/criteria/scoring/metadata/description.ts
140
+ import { incrementTotal as incrementTotal4 } from "@xyo-network/crypto-nft-score-model";
141
+ var scoreNftDescription = (nft) => {
142
+ return scoreDescription(nft.metadata?.description);
143
+ };
144
+ var scoreDescription = (description) => {
145
+ const score = [0, 1];
146
+ if (!description || typeof description !== "string")
147
+ return score;
148
+ return incrementTotal4(score);
149
+ };
150
+
151
+ // src/lib/rating/criteria/scoring/metadata/externalUrl.ts
152
+ import { incrementTotal as incrementTotal5 } from "@xyo-network/crypto-nft-score-model";
153
+ var scoreNftExternalUrl = (nft) => {
154
+ return scoreExternalUrl(nft?.metadata?.external_url);
155
+ };
156
+ var scoreExternalUrl = (external_url) => {
157
+ const score = [0, 2];
158
+ if (external_url === void 0 || external_url === null || typeof external_url !== "string" || !isValidUrl(external_url))
159
+ return score;
160
+ incrementTotal5(score);
161
+ if (!isSecure(external_url))
162
+ return score;
163
+ return incrementTotal5(score);
164
+ };
165
+
166
+ // src/lib/rating/criteria/scoring/metadata/image.ts
167
+ import { incrementTotal as incrementTotal6, PASS as PASS3 } from "@xyo-network/crypto-nft-score-model";
168
+ var MaxPossibleImageScore = 3;
169
+ var scoreNftImage = (nft) => {
170
+ if (!nft?.metadata?.image) {
171
+ return nft.metadata?.image_data ? PASS3 : [0, MaxPossibleImageScore];
172
+ } else {
173
+ return scoreImage(nft.metadata?.image);
174
+ }
175
+ };
176
+ var scoreImage = (image) => {
177
+ const score = [0, MaxPossibleImageScore];
178
+ if (!image || typeof image !== "string" || !isValidUrl(image))
179
+ return score;
180
+ incrementTotal6(score);
181
+ if (!isSecure(image))
182
+ return score;
183
+ incrementTotal6(score);
184
+ if (!isWeb3(image))
185
+ return score;
186
+ incrementTotal6(score);
187
+ return score;
188
+ };
189
+
190
+ // src/lib/rating/criteria/scoring/metadata/imageData.ts
191
+ import { PASS as PASS4 } from "@xyo-network/crypto-nft-score-model";
192
+ import { parse } from "svg-parser";
193
+ var MaxPossibleImageDataScore = 1;
194
+ var isValidImageData = (image_data) => {
195
+ if (!image_data.startsWith("<svg"))
196
+ return false;
197
+ try {
198
+ parse(image_data);
199
+ return true;
200
+ } catch (error) {
201
+ return false;
202
+ }
203
+ };
204
+ var scoreNftImageData = (nft) => {
205
+ if (!nft?.metadata?.image_data) {
206
+ return nft.metadata?.image ? PASS4 : [0, MaxPossibleImageDataScore];
207
+ } else {
208
+ return scoreImageData(nft.metadata?.image_data);
209
+ }
210
+ };
211
+ var scoreImageData = (image_data) => {
212
+ return !image_data || typeof image_data !== "string" || !isValidImageData(image_data) ? [0, MaxPossibleImageDataScore] : [MaxPossibleImageDataScore, MaxPossibleImageDataScore];
213
+ };
214
+
215
+ // src/lib/rating/criteria/scoring/metadata/name.ts
216
+ import { incrementTotal as incrementTotal7 } from "@xyo-network/crypto-nft-score-model";
217
+ var scoreNftName = (nft) => {
218
+ return scoreName(nft.metadata?.name);
219
+ };
220
+ var scoreName = (name) => {
221
+ const score = [0, 1];
222
+ if (!name || typeof name !== "string")
223
+ return score;
224
+ return incrementTotal7(score);
225
+ };
226
+
227
+ // src/lib/rating/criteria/scoring/metadata/youtubeUrl.ts
228
+ import { incrementTotal as incrementTotal8, PASS as PASS5 } from "@xyo-network/crypto-nft-score-model";
229
+ var scoreNftYoutubeUrl = (nft) => {
230
+ return scoreYoutubeUrl(nft?.metadata?.youtube_url);
231
+ };
232
+ var scoreYoutubeUrl = (youtube_url) => {
233
+ if (youtube_url === void 0 || youtube_url === null)
234
+ return PASS5;
235
+ const score = [0, 2];
236
+ if (typeof youtube_url !== "string" || !isValidUrl(youtube_url))
237
+ return score;
238
+ incrementTotal8(score);
239
+ if (!isSecure(youtube_url))
240
+ return score;
241
+ return incrementTotal8(score);
242
+ };
243
+ export {
244
+ evaluateAttribute,
245
+ evaluateAttributes,
246
+ evaluateNftAttributes,
247
+ scoreAnimationUrl,
248
+ scoreBackgroundColor,
249
+ scoreDescription,
250
+ scoreExternalUrl,
251
+ scoreImage,
252
+ scoreImageData,
253
+ scoreName,
254
+ scoreNftAnimationUrl,
255
+ scoreNftBackgroundColor,
256
+ scoreNftDescription,
257
+ scoreNftExternalUrl,
258
+ scoreNftImage,
259
+ scoreNftImageData,
260
+ scoreNftName,
261
+ scoreNftYoutubeUrl,
262
+ scoreYoutubeUrl
263
+ };
10
264
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/lib/rating/criteria/scoring/metadata/index.ts"],"sourcesContent":["export * from './animationUrl'\nexport * from './attributes'\nexport * from './backgroundColor'\nexport * from './description'\nexport * from './externalUrl'\nexport * from './image'\nexport * from './imageData'\nexport * from './name'\nexport * from './youtubeUrl'\n"],"mappings":"AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;","names":[]}
1
+ {"version":3,"sources":["../../../../../../../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"],"sourcesContent":["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 (e) {\n return undefined\n }\n}\n\nexport const isValidUrl = (url?: string | null): boolean => toUrl(url) !== undefined\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 (error) {\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 ? [0, 1] : evaluateAttributes(nft?.metadata?.attributes)\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 = /^[0-9A-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 (!background_color.toUpperCase().match(isHexColor)) 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 // but there is image data, skip this scoring criteria, otherwise fail it completely\n return nft.metadata?.image_data ? PASS : [0, MaxPossibleImageScore]\n } else {\n return scoreImage(nft.metadata?.image)\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 (error) {\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 // but there is an image, skip this scoring criteria, otherwise fail it completely\n return nft.metadata?.image ? PASS : [0, MaxPossibleImageDataScore]\n } else {\n return scoreImageData(nft.metadata?.image_data)\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"],"mappings":"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","names":["incrementPossible","incrementTotal","incrementTotalAndPossible","incrementPossible","incrementTotal","incrementTotalAndPossible","PASS","incrementTotal","incrementTotal","incrementTotal","incrementTotal","PASS","PASS","incrementTotal","PASS","incrementTotal","incrementTotal","PASS","PASS","incrementTotal"]}
@@ -1,2 +1,25 @@
1
- export * from "./urlHelpers";
1
+ // src/lib/rating/criteria/scoring/metadata/lib/urlHelpers.ts
2
+ import { URL } from "@xylabs/url";
3
+ var web3Protocols = ["ipfs:", "ar:"];
4
+ var toUrl = (url) => {
5
+ if (!url)
6
+ return void 0;
7
+ try {
8
+ return new URL(url);
9
+ } catch (e) {
10
+ return void 0;
11
+ }
12
+ };
13
+ var isValidUrl = (url) => toUrl(url) !== void 0;
14
+ var isWeb3 = (url) => web3Protocols.some((protocol) => protocol === toUrl(url)?.protocol);
15
+ var isWeb2 = (url) => !isWeb3(url);
16
+ var isSecure = (url) => isWeb3(url) || toUrl(url)?.protocol === "https:";
17
+ export {
18
+ isSecure,
19
+ isValidUrl,
20
+ isWeb2,
21
+ isWeb3,
22
+ toUrl,
23
+ web3Protocols
24
+ };
2
25
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../../src/lib/rating/criteria/scoring/metadata/lib/index.ts"],"sourcesContent":["export * from './urlHelpers'\n"],"mappings":"AAAA,cAAc;","names":[]}
1
+ {"version":3,"sources":["../../../../../../../../src/lib/rating/criteria/scoring/metadata/lib/urlHelpers.ts"],"sourcesContent":["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 (e) {\n return undefined\n }\n}\n\nexport const isValidUrl = (url?: string | null): boolean => toUrl(url) !== undefined\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"],"mappings":";AAAA,SAAS,WAAW;AAEb,IAAM,gBAAgB,CAAC,SAAS,KAAK;AAErC,IAAM,QAAQ,CAAC,QAAyC;AAC7D,MAAI,CAAC;AAAK,WAAO;AACjB,MAAI;AACF,WAAO,IAAI,IAAI,GAAG;AAAA,EACpB,SAAS,GAAG;AACV,WAAO;AAAA,EACT;AACF;AAEO,IAAM,aAAa,CAAC,QAAiC,MAAM,GAAG,MAAM;AACpE,IAAM,SAAS,CAAC,QAAiC,cAAc,KAAK,CAAC,aAAa,aAAa,MAAM,GAAG,GAAG,QAAQ;AACnH,IAAM,SAAS,CAAC,QAAiC,CAAC,OAAO,GAAG;AAC5D,IAAM,WAAW,CAAC,QAAiC,OAAO,GAAG,KAAK,MAAM,GAAG,GAAG,aAAa;","names":[]}