@xyo-network/crypto-nft-collection-witness-plugin 2.75.14 → 2.75.16

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 (165) hide show
  1. package/dist/browser/Plugin.d.cts +2 -2
  2. package/dist/browser/Plugin.d.mts +2 -2
  3. package/dist/browser/Plugin.d.ts +2 -2
  4. package/dist/browser/Witness.d.cts +3 -2
  5. package/dist/browser/Witness.d.cts.map +1 -1
  6. package/dist/browser/Witness.d.mts +3 -2
  7. package/dist/browser/Witness.d.mts.map +1 -1
  8. package/dist/browser/Witness.d.ts +3 -2
  9. package/dist/browser/Witness.d.ts.map +1 -1
  10. package/dist/browser/index.cjs +2 -2
  11. package/dist/browser/index.cjs.map +1 -1
  12. package/dist/browser/index.js +1 -1
  13. package/dist/browser/index.js.map +1 -1
  14. package/dist/docs.json +785 -388
  15. package/dist/node/Plugin.d.cts +2 -2
  16. package/dist/node/Plugin.d.mts +2 -2
  17. package/dist/node/Plugin.d.ts +2 -2
  18. package/dist/node/Witness.d.cts +3 -2
  19. package/dist/node/Witness.d.cts.map +1 -1
  20. package/dist/node/Witness.d.mts +3 -2
  21. package/dist/node/Witness.d.mts.map +1 -1
  22. package/dist/node/Witness.d.ts +3 -2
  23. package/dist/node/Witness.d.ts.map +1 -1
  24. package/dist/node/index.js +2 -2
  25. package/dist/node/index.js.map +1 -1
  26. package/dist/node/index.mjs +1 -1
  27. package/dist/node/index.mjs.map +1 -1
  28. package/package.json +15 -14
  29. package/src/Witness.ts +3 -2
  30. package/dist/browser/Plugin.cjs +0 -199
  31. package/dist/browser/Plugin.cjs.map +0 -1
  32. package/dist/browser/Plugin.js +0 -182
  33. package/dist/browser/Plugin.js.map +0 -1
  34. package/dist/browser/Witness.cjs +0 -183
  35. package/dist/browser/Witness.cjs.map +0 -1
  36. package/dist/browser/Witness.js +0 -166
  37. package/dist/browser/Witness.js.map +0 -1
  38. package/dist/browser/lib/collectionMetrics/getNftCollectionMetrics.cjs +0 -83
  39. package/dist/browser/lib/collectionMetrics/getNftCollectionMetrics.cjs.map +0 -1
  40. package/dist/browser/lib/collectionMetrics/getNftCollectionMetrics.js +0 -60
  41. package/dist/browser/lib/collectionMetrics/getNftCollectionMetrics.js.map +0 -1
  42. package/dist/browser/lib/collectionMetrics/index.cjs +0 -83
  43. package/dist/browser/lib/collectionMetrics/index.cjs.map +0 -1
  44. package/dist/browser/lib/collectionMetrics/index.js +0 -60
  45. package/dist/browser/lib/collectionMetrics/index.js.map +0 -1
  46. package/dist/browser/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.cjs +0 -49
  47. package/dist/browser/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.cjs.map +0 -1
  48. package/dist/browser/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.js +0 -28
  49. package/dist/browser/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.js.map +0 -1
  50. package/dist/browser/lib/collectionMetrics/lib/calculatePropertyDistribution.cjs +0 -45
  51. package/dist/browser/lib/collectionMetrics/lib/calculatePropertyDistribution.cjs.map +0 -1
  52. package/dist/browser/lib/collectionMetrics/lib/calculatePropertyDistribution.js +0 -24
  53. package/dist/browser/lib/collectionMetrics/lib/calculatePropertyDistribution.js.map +0 -1
  54. package/dist/browser/lib/collectionMetrics/lib/distribution.cjs +0 -19
  55. package/dist/browser/lib/collectionMetrics/lib/distribution.cjs.map +0 -1
  56. package/dist/browser/lib/collectionMetrics/lib/distribution.js +0 -1
  57. package/dist/browser/lib/collectionMetrics/lib/distribution.js.map +0 -1
  58. package/dist/browser/lib/collectionMetrics/lib/index.cjs +0 -72
  59. package/dist/browser/lib/collectionMetrics/lib/index.cjs.map +0 -1
  60. package/dist/browser/lib/collectionMetrics/lib/index.js +0 -49
  61. package/dist/browser/lib/collectionMetrics/lib/index.js.map +0 -1
  62. package/dist/browser/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromOutcomes.cjs +0 -35
  63. package/dist/browser/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromOutcomes.cjs.map +0 -1
  64. package/dist/browser/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromOutcomes.js +0 -14
  65. package/dist/browser/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromOutcomes.js.map +0 -1
  66. package/dist/browser/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.cjs +0 -32
  67. package/dist/browser/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.cjs.map +0 -1
  68. package/dist/browser/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.js +0 -11
  69. package/dist/browser/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.js.map +0 -1
  70. package/dist/browser/lib/collectionMetrics/lib/probabilityDistributions/binomial/index.cjs +0 -46
  71. package/dist/browser/lib/collectionMetrics/lib/probabilityDistributions/binomial/index.cjs.map +0 -1
  72. package/dist/browser/lib/collectionMetrics/lib/probabilityDistributions/binomial/index.js +0 -23
  73. package/dist/browser/lib/collectionMetrics/lib/probabilityDistributions/binomial/index.js.map +0 -1
  74. package/dist/browser/lib/collectionMetrics/lib/probabilityDistributions/index.cjs +0 -46
  75. package/dist/browser/lib/collectionMetrics/lib/probabilityDistributions/index.cjs.map +0 -1
  76. package/dist/browser/lib/collectionMetrics/lib/probabilityDistributions/index.js +0 -23
  77. package/dist/browser/lib/collectionMetrics/lib/probabilityDistributions/index.js.map +0 -1
  78. package/dist/browser/lib/getNftCollectionCount.cjs +0 -44
  79. package/dist/browser/lib/getNftCollectionCount.cjs.map +0 -1
  80. package/dist/browser/lib/getNftCollectionCount.js +0 -23
  81. package/dist/browser/lib/getNftCollectionCount.js.map +0 -1
  82. package/dist/browser/lib/getNftCollectionMetadata.cjs +0 -46
  83. package/dist/browser/lib/getNftCollectionMetadata.cjs.map +0 -1
  84. package/dist/browser/lib/getNftCollectionMetadata.js +0 -25
  85. package/dist/browser/lib/getNftCollectionMetadata.js.map +0 -1
  86. package/dist/browser/lib/getNftCollectionNfts.cjs +0 -60
  87. package/dist/browser/lib/getNftCollectionNfts.cjs.map +0 -1
  88. package/dist/browser/lib/getNftCollectionNfts.js +0 -39
  89. package/dist/browser/lib/getNftCollectionNfts.js.map +0 -1
  90. package/dist/browser/lib/index.cjs +0 -148
  91. package/dist/browser/lib/index.cjs.map +0 -1
  92. package/dist/browser/lib/index.js +0 -125
  93. package/dist/browser/lib/index.js.map +0 -1
  94. package/dist/browser/lib/nonEvaluableContractAddresses.cjs +0 -30
  95. package/dist/browser/lib/nonEvaluableContractAddresses.cjs.map +0 -1
  96. package/dist/browser/lib/nonEvaluableContractAddresses.js +0 -9
  97. package/dist/browser/lib/nonEvaluableContractAddresses.js.map +0 -1
  98. package/dist/node/Plugin.js +0 -206
  99. package/dist/node/Plugin.js.map +0 -1
  100. package/dist/node/Plugin.mjs +0 -185
  101. package/dist/node/Plugin.mjs.map +0 -1
  102. package/dist/node/Witness.js +0 -190
  103. package/dist/node/Witness.js.map +0 -1
  104. package/dist/node/Witness.mjs +0 -169
  105. package/dist/node/Witness.mjs.map +0 -1
  106. package/dist/node/lib/collectionMetrics/getNftCollectionMetrics.js +0 -90
  107. package/dist/node/lib/collectionMetrics/getNftCollectionMetrics.js.map +0 -1
  108. package/dist/node/lib/collectionMetrics/getNftCollectionMetrics.mjs +0 -63
  109. package/dist/node/lib/collectionMetrics/getNftCollectionMetrics.mjs.map +0 -1
  110. package/dist/node/lib/collectionMetrics/index.js +0 -90
  111. package/dist/node/lib/collectionMetrics/index.js.map +0 -1
  112. package/dist/node/lib/collectionMetrics/index.mjs +0 -63
  113. package/dist/node/lib/collectionMetrics/index.mjs.map +0 -1
  114. package/dist/node/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.js +0 -53
  115. package/dist/node/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.js.map +0 -1
  116. package/dist/node/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.mjs +0 -28
  117. package/dist/node/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.mjs.map +0 -1
  118. package/dist/node/lib/collectionMetrics/lib/calculatePropertyDistribution.js +0 -49
  119. package/dist/node/lib/collectionMetrics/lib/calculatePropertyDistribution.js.map +0 -1
  120. package/dist/node/lib/collectionMetrics/lib/calculatePropertyDistribution.mjs +0 -24
  121. package/dist/node/lib/collectionMetrics/lib/calculatePropertyDistribution.mjs.map +0 -1
  122. package/dist/node/lib/collectionMetrics/lib/distribution.js +0 -19
  123. package/dist/node/lib/collectionMetrics/lib/distribution.js.map +0 -1
  124. package/dist/node/lib/collectionMetrics/lib/distribution.mjs +0 -1
  125. package/dist/node/lib/collectionMetrics/lib/distribution.mjs.map +0 -1
  126. package/dist/node/lib/collectionMetrics/lib/index.js +0 -78
  127. package/dist/node/lib/collectionMetrics/lib/index.js.map +0 -1
  128. package/dist/node/lib/collectionMetrics/lib/index.mjs +0 -49
  129. package/dist/node/lib/collectionMetrics/lib/index.mjs.map +0 -1
  130. package/dist/node/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromOutcomes.js +0 -39
  131. package/dist/node/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromOutcomes.js.map +0 -1
  132. package/dist/node/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromOutcomes.mjs +0 -14
  133. package/dist/node/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromOutcomes.mjs.map +0 -1
  134. package/dist/node/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.js +0 -36
  135. package/dist/node/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.js.map +0 -1
  136. package/dist/node/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.mjs +0 -11
  137. package/dist/node/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.mjs.map +0 -1
  138. package/dist/node/lib/collectionMetrics/lib/probabilityDistributions/binomial/index.js +0 -51
  139. package/dist/node/lib/collectionMetrics/lib/probabilityDistributions/binomial/index.js.map +0 -1
  140. package/dist/node/lib/collectionMetrics/lib/probabilityDistributions/binomial/index.mjs +0 -23
  141. package/dist/node/lib/collectionMetrics/lib/probabilityDistributions/binomial/index.mjs.map +0 -1
  142. package/dist/node/lib/collectionMetrics/lib/probabilityDistributions/index.js +0 -51
  143. package/dist/node/lib/collectionMetrics/lib/probabilityDistributions/index.js.map +0 -1
  144. package/dist/node/lib/collectionMetrics/lib/probabilityDistributions/index.mjs +0 -23
  145. package/dist/node/lib/collectionMetrics/lib/probabilityDistributions/index.mjs.map +0 -1
  146. package/dist/node/lib/getNftCollectionCount.js +0 -48
  147. package/dist/node/lib/getNftCollectionCount.js.map +0 -1
  148. package/dist/node/lib/getNftCollectionCount.mjs +0 -23
  149. package/dist/node/lib/getNftCollectionCount.mjs.map +0 -1
  150. package/dist/node/lib/getNftCollectionMetadata.js +0 -50
  151. package/dist/node/lib/getNftCollectionMetadata.js.map +0 -1
  152. package/dist/node/lib/getNftCollectionMetadata.mjs +0 -25
  153. package/dist/node/lib/getNftCollectionMetadata.mjs.map +0 -1
  154. package/dist/node/lib/getNftCollectionNfts.js +0 -64
  155. package/dist/node/lib/getNftCollectionNfts.js.map +0 -1
  156. package/dist/node/lib/getNftCollectionNfts.mjs +0 -39
  157. package/dist/node/lib/getNftCollectionNfts.mjs.map +0 -1
  158. package/dist/node/lib/index.js +0 -158
  159. package/dist/node/lib/index.js.map +0 -1
  160. package/dist/node/lib/index.mjs +0 -128
  161. package/dist/node/lib/index.mjs.map +0 -1
  162. package/dist/node/lib/nonEvaluableContractAddresses.js +0 -34
  163. package/dist/node/lib/nonEvaluableContractAddresses.js.map +0 -1
  164. package/dist/node/lib/nonEvaluableContractAddresses.mjs +0 -9
  165. package/dist/node/lib/nonEvaluableContractAddresses.mjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/Witness.ts","../../src/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.ts","../../src/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.ts","../../src/lib/collectionMetrics/getNftCollectionMetrics.ts","../../src/lib/getNftCollectionCount.ts","../../src/lib/nonEvaluableContractAddresses.ts","../../src/lib/getNftCollectionMetadata.ts","../../src/lib/getNftCollectionNfts.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { PayloadHasher } from '@xyo-network/core'\nimport {\n isNftCollectionWitnessQuery,\n NftCollectionInfo,\n NftCollectionSchema,\n NftCollectionWitnessConfig,\n NftCollectionWitnessConfigSchema,\n} from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport { AnyConfigSchema } from '@xyo-network/module'\nimport { Payload } from '@xyo-network/payload-model'\nimport { AbstractWitness, WitnessParams } from '@xyo-network/witness'\n\nimport { getNftCollectionCount, getNftCollectionMetadata, getNftCollectionMetrics, getNftCollectionNfts } from './lib'\n\nexport type CryptoNftCollectionWitnessParams = WitnessParams<AnyConfigSchema<NftCollectionWitnessConfig>>\n\nconst defaultMaxNfts = 100\n\n/**\n * A \"no operation\" Promise to be used\n * when no action is desired but a Promise\n * is required to be returned\n */\nconst NoOp = Promise.resolve()\n\nexport class CryptoNftCollectionWitness<\n TParams extends CryptoNftCollectionWitnessParams = CryptoNftCollectionWitnessParams,\n> extends AbstractWitness<TParams> {\n static override configSchemas = [NftCollectionWitnessConfigSchema]\n\n protected override async observeHandler(payloads?: Payload[]): Promise<Payload[]> {\n await this.started('throw')\n const queries = payloads?.filter(isNftCollectionWitnessQuery) ?? []\n const observations = await Promise.all(\n queries.map<Promise<NftCollectionInfo>>(async (query) => {\n const address = assertEx(query?.address || this.config.address, 'params.address is required')\n const chainId = assertEx(query?.chainId || this.config.chainId, 'params.chainId is required')\n const maxNfts = query?.maxNfts || defaultMaxNfts\n const [info, total, nfts, archivist] = await Promise.all([\n getNftCollectionMetadata(address, chainId, this.account.private.hex),\n getNftCollectionCount(address, chainId, this.account.private.hex),\n getNftCollectionNfts(address, chainId, this.account.private.hex, maxNfts),\n this.writeArchivist(),\n ])\n const metrics = getNftCollectionMetrics(nfts)\n const [sources] = await Promise.all([\n // Hash all the payloads\n Promise.all(nfts.map((nft) => PayloadHasher.hashAsync(nft))),\n // Insert them into the archivist if we have one\n archivist ? archivist.insert(nfts) : NoOp,\n ])\n const payload: NftCollectionInfo = { ...info, metrics, schema: NftCollectionSchema, sources, total }\n return payload\n }),\n )\n return observations.flat()\n }\n}\n","import { Distribution } from './distribution'\n\nexport const calculateAllPropertiesDistribution = <T>(array: T[]): Distribution<T> => {\n const distribution: Distribution<T> = {}\n\n array.forEach((item) => {\n for (const property in item) {\n if (Object.prototype.hasOwnProperty.call(item, property)) {\n const value = item[property as keyof T]\n if (value !== undefined && value !== null) {\n const valueString = value.toString()\n if (!distribution[property]) {\n distribution[property] = { [valueString]: 1 }\n } else if (!distribution[property]![valueString]) {\n ;(distribution[property] as Record<string, number>)[valueString] = 1\n } else {\n ;(distribution[property] as Record<string, number>)[valueString] += 1\n }\n }\n }\n }\n })\n\n return distribution\n}\n","import { BinomialDistributionParameters } from '@xyo-network/crypto-nft-collection-payload-plugin'\n\n/**\n * Calculates the parameters of a binomial distribution given the number of trials and success probability\n * @param n Number of trials\n * @param p Success probability\n * @returns The binomial distribution parameters\n */\nexport const calculateBinomialParamsFromProbability = (n: number, p: number): BinomialDistributionParameters => {\n // Mean (µ)\n const mean = n * p\n\n // Variance (σ^2)\n const variance = n * p * (1 - p)\n\n // Standard Deviation (σ)\n const stdDev = Math.sqrt(variance)\n\n return { mean, p, stdDev, variance }\n}\n","import { NftCollectionMetrics, NftTraitMetrics } from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport { NftInfoFields, OpenSeaNftAttribute } from '@xyo-network/crypto-nft-payload-plugin'\n\nimport { calculateAllPropertiesDistribution, calculateBinomialParamsFromProbability } from './lib'\n\ntype TraitDistributionEntry = [string, { [key: string]: number }]\n\nexport const getNftCollectionMetrics = (nfts: NftInfoFields[]): NftCollectionMetrics => {\n const traits = nfts\n .map((nft) => nft?.metadata?.attributes as OpenSeaNftAttribute[] | undefined)\n .filter((v): v is OpenSeaNftAttribute[] => v !== undefined)\n .map((attributes) => {\n return Object.fromEntries(attributes.map((attribute) => [attribute.trait_type, attribute.value]))\n })\n const distribution = calculateAllPropertiesDistribution(traits)\n const n = nfts.length\n const attributes = Object.fromEntries(\n Object.entries(distribution)\n .filter((v): v is TraitDistributionEntry => v[1] !== undefined)\n .map(([trait, entries]) => {\n const traitCount = Object.values(entries).reduce((prev, curr) => prev + curr, 0)\n const { p } = calculateBinomialParamsFromProbability(nfts.length, traitCount / n)\n const values = Object.fromEntries(\n Object.entries(entries).map(([value, traitValueCount]) => {\n const { p } = calculateBinomialParamsFromProbability(n, traitValueCount / n)\n const metrics: NftTraitMetrics = { binomial: { p }, count: traitValueCount }\n return [value, metrics]\n }),\n )\n return [trait, { metrics: { binomial: { p }, count: traitCount }, values }]\n }),\n )\n return { metadata: { attributes } }\n}\n","import { Auth, SDK } from '@infura/sdk'\n\nimport { nonEvaluableContractAddresses } from './nonEvaluableContractAddresses'\n\ntype ContractAddressOptions = {\n contractAddress: string\n cursor?: string\n}\n\nexport const getNftCollectionCount = async (\n /**\n * The address of the NFT contract to search for\n */\n contractAddress: string,\n /**\n * The chain ID (1 = Ethereum Mainnet, 4 = Rinkeby, etc.) of the chain to search for NFTs on\n */\n chainId: number,\n // /**\n // * The ethers provider to use to search for NFTs\n // */\n // provider: ExternalProvider | JsonRpcFetchFunc,\n /**\n * The private key of the wallet to use to search for NFTs\n */\n privateKey: string,\n): Promise<number> => {\n if (nonEvaluableContractAddresses.includes(contractAddress.toUpperCase())) {\n throw new Error(`Unable to evaluate collection with contractAddress: ${contractAddress}`)\n }\n const sdk = new SDK(new Auth({ chainId, privateKey, projectId: process.env.INFURA_PROJECT_ID, secretId: process.env.INFURA_PROJECT_SECRET }))\n const opts: ContractAddressOptions = { contractAddress }\n const { total } = await sdk.api.getNFTsForCollection(opts)\n return total\n}\n","/**\n * These contracts are not evaluable for some\n * reason (too large, nonsensical, etc.)\n */\nexport const nonEvaluableContractAddresses = [\n // ENS\n '0xC18360217D8F7Ab5e7c516566761Ea12Ce7F9D72',\n].map((address) => address.toUpperCase())\n","import { Auth, SDK } from '@infura/sdk'\nimport { NftCollectionMetadata } from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport { toTokenType } from '@xyo-network/crypto-nft-payload-plugin'\n\nimport { nonEvaluableContractAddresses } from './nonEvaluableContractAddresses'\n\ntype ContractAddressOptions = {\n contractAddress: string\n cursor?: string\n}\n\nexport const getNftCollectionMetadata = async (\n /**\n * The address of the NFT contract to search for\n */\n contractAddress: string,\n /**\n * The chain ID (1 = Ethereum Mainnet, 4 = Rinkeby, etc.) of the chain to search for NFTs on\n */\n chainId: number,\n // /**\n // * The ethers provider to use to search for NFTs\n // */\n // provider: ExternalProvider | JsonRpcFetchFunc,\n /**\n * The private key of the wallet to use to search for NFTs\n */\n privateKey: string,\n): Promise<Omit<NftCollectionMetadata, 'total'>> => {\n if (nonEvaluableContractAddresses.includes(contractAddress.toUpperCase())) {\n throw new Error(`Unable to evaluate collection with contractAddress: ${contractAddress}`)\n }\n const sdk = new SDK(new Auth({ chainId, privateKey, projectId: process.env.INFURA_PROJECT_ID, secretId: process.env.INFURA_PROJECT_SECRET }))\n const opts: ContractAddressOptions = { contractAddress }\n const { name, symbol, tokenType } = await sdk.api.getContractMetadata(opts)\n const type = toTokenType(tokenType)\n return { address: contractAddress, chainId, name, symbol, type }\n}\n","import { Auth, SDK } from '@infura/sdk'\nimport { NftInfo, NftInfoFields, NftSchema, toTokenType } from '@xyo-network/crypto-nft-payload-plugin'\n\nimport { nonEvaluableContractAddresses } from './nonEvaluableContractAddresses'\n\ntype ContractAddressOptions = {\n contractAddress: string\n cursor?: string\n}\n\nexport const getNftCollectionNfts = async (\n /**\n * The address of the NFT contract to search for\n */\n contractAddress: string,\n /**\n * The chain ID (1 = Ethereum Mainnet, 4 = Rinkeby, etc.) of the chain to search for NFTs on\n */\n chainId: number,\n // /**\n // * The ethers provider to use to search for NFTs\n // */\n // provider: ExternalProvider | JsonRpcFetchFunc,\n /**\n * The private key of the wallet to use to search for NFTs\n */\n privateKey: string,\n /**\n * The maximum number of NFTs to return. Configurable to prevent\n * large wallets from exhausting Infura API credits. Ideally a\n * multiple of 100 as that appears to be the default page size.\n */\n maxNfts = 100,\n): Promise<NftInfo[]> => {\n if (nonEvaluableContractAddresses.includes(contractAddress.toUpperCase())) {\n throw new Error(`Unable to evaluate collection with contractAddress: ${contractAddress}`)\n }\n const sdk = new SDK(new Auth({ chainId, privateKey, projectId: process.env.INFURA_PROJECT_ID, secretId: process.env.INFURA_PROJECT_SECRET }))\n const nfts: NftInfoFields[] = []\n let cursor: string | undefined = undefined\n do {\n const opts: ContractAddressOptions = { contractAddress, cursor }\n const { cursor: nextCursor, pageSize, total, assets } = await sdk.api.getNFTsForCollection(opts)\n const batch: NftInfoFields[] = assets.slice(0, Math.min(pageSize, total - nfts.length)).map((asset) => {\n const { contract: address, type: tokenType, ...rest } = asset\n const type = toTokenType(tokenType)\n return { address, chainId, type, ...rest }\n })\n nfts.push(...batch)\n cursor = nextCursor\n if (nfts.length >= total || !cursor) break\n } while (nfts.length < maxNfts)\n return nfts.map((nft) => {\n return { ...nft, schema: NftSchema }\n })\n}\n"],"mappings":"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","names":["attributes","p","Auth","SDK","SDK","Auth","Auth","SDK","toTokenType","SDK","Auth","toTokenType"]}
@@ -1,83 +0,0 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
-
20
- // src/lib/collectionMetrics/getNftCollectionMetrics.ts
21
- var getNftCollectionMetrics_exports = {};
22
- __export(getNftCollectionMetrics_exports, {
23
- getNftCollectionMetrics: () => getNftCollectionMetrics
24
- });
25
- module.exports = __toCommonJS(getNftCollectionMetrics_exports);
26
-
27
- // src/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.ts
28
- var calculateAllPropertiesDistribution = (array) => {
29
- const distribution = {};
30
- array.forEach((item) => {
31
- for (const property in item) {
32
- if (Object.prototype.hasOwnProperty.call(item, property)) {
33
- const value = item[property];
34
- if (value !== void 0 && value !== null) {
35
- const valueString = value.toString();
36
- if (!distribution[property]) {
37
- distribution[property] = { [valueString]: 1 };
38
- } else if (!distribution[property][valueString]) {
39
- ;
40
- distribution[property][valueString] = 1;
41
- } else {
42
- ;
43
- distribution[property][valueString] += 1;
44
- }
45
- }
46
- }
47
- }
48
- });
49
- return distribution;
50
- };
51
-
52
- // src/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.ts
53
- var calculateBinomialParamsFromProbability = (n, p) => {
54
- const mean = n * p;
55
- const variance = n * p * (1 - p);
56
- const stdDev = Math.sqrt(variance);
57
- return { mean, p, stdDev, variance };
58
- };
59
-
60
- // src/lib/collectionMetrics/getNftCollectionMetrics.ts
61
- var getNftCollectionMetrics = (nfts) => {
62
- const traits = nfts.map((nft) => nft?.metadata?.attributes).filter((v) => v !== void 0).map((attributes2) => {
63
- return Object.fromEntries(attributes2.map((attribute) => [attribute.trait_type, attribute.value]));
64
- });
65
- const distribution = calculateAllPropertiesDistribution(traits);
66
- const n = nfts.length;
67
- const attributes = Object.fromEntries(
68
- Object.entries(distribution).filter((v) => v[1] !== void 0).map(([trait, entries]) => {
69
- const traitCount = Object.values(entries).reduce((prev, curr) => prev + curr, 0);
70
- const { p } = calculateBinomialParamsFromProbability(nfts.length, traitCount / n);
71
- const values = Object.fromEntries(
72
- Object.entries(entries).map(([value, traitValueCount]) => {
73
- const { p: p2 } = calculateBinomialParamsFromProbability(n, traitValueCount / n);
74
- const metrics = { binomial: { p: p2 }, count: traitValueCount };
75
- return [value, metrics];
76
- })
77
- );
78
- return [trait, { metrics: { binomial: { p }, count: traitCount }, values }];
79
- })
80
- );
81
- return { metadata: { attributes } };
82
- };
83
- //# sourceMappingURL=getNftCollectionMetrics.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../src/lib/collectionMetrics/getNftCollectionMetrics.ts","../../../../src/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.ts","../../../../src/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.ts"],"sourcesContent":["import { NftCollectionMetrics, NftTraitMetrics } from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport { NftInfoFields, OpenSeaNftAttribute } from '@xyo-network/crypto-nft-payload-plugin'\n\nimport { calculateAllPropertiesDistribution, calculateBinomialParamsFromProbability } from './lib'\n\ntype TraitDistributionEntry = [string, { [key: string]: number }]\n\nexport const getNftCollectionMetrics = (nfts: NftInfoFields[]): NftCollectionMetrics => {\n const traits = nfts\n .map((nft) => nft?.metadata?.attributes as OpenSeaNftAttribute[] | undefined)\n .filter((v): v is OpenSeaNftAttribute[] => v !== undefined)\n .map((attributes) => {\n return Object.fromEntries(attributes.map((attribute) => [attribute.trait_type, attribute.value]))\n })\n const distribution = calculateAllPropertiesDistribution(traits)\n const n = nfts.length\n const attributes = Object.fromEntries(\n Object.entries(distribution)\n .filter((v): v is TraitDistributionEntry => v[1] !== undefined)\n .map(([trait, entries]) => {\n const traitCount = Object.values(entries).reduce((prev, curr) => prev + curr, 0)\n const { p } = calculateBinomialParamsFromProbability(nfts.length, traitCount / n)\n const values = Object.fromEntries(\n Object.entries(entries).map(([value, traitValueCount]) => {\n const { p } = calculateBinomialParamsFromProbability(n, traitValueCount / n)\n const metrics: NftTraitMetrics = { binomial: { p }, count: traitValueCount }\n return [value, metrics]\n }),\n )\n return [trait, { metrics: { binomial: { p }, count: traitCount }, values }]\n }),\n )\n return { metadata: { attributes } }\n}\n","import { Distribution } from './distribution'\n\nexport const calculateAllPropertiesDistribution = <T>(array: T[]): Distribution<T> => {\n const distribution: Distribution<T> = {}\n\n array.forEach((item) => {\n for (const property in item) {\n if (Object.prototype.hasOwnProperty.call(item, property)) {\n const value = item[property as keyof T]\n if (value !== undefined && value !== null) {\n const valueString = value.toString()\n if (!distribution[property]) {\n distribution[property] = { [valueString]: 1 }\n } else if (!distribution[property]![valueString]) {\n ;(distribution[property] as Record<string, number>)[valueString] = 1\n } else {\n ;(distribution[property] as Record<string, number>)[valueString] += 1\n }\n }\n }\n }\n })\n\n return distribution\n}\n","import { BinomialDistributionParameters } from '@xyo-network/crypto-nft-collection-payload-plugin'\n\n/**\n * Calculates the parameters of a binomial distribution given the number of trials and success probability\n * @param n Number of trials\n * @param p Success probability\n * @returns The binomial distribution parameters\n */\nexport const calculateBinomialParamsFromProbability = (n: number, p: number): BinomialDistributionParameters => {\n // Mean (µ)\n const mean = n * p\n\n // Variance (σ^2)\n const variance = n * p * (1 - p)\n\n // Standard Deviation (σ)\n const stdDev = Math.sqrt(variance)\n\n return { mean, p, stdDev, variance }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEO,IAAM,qCAAqC,CAAI,UAAgC;AACpF,QAAM,eAAgC,CAAC;AAEvC,QAAM,QAAQ,CAAC,SAAS;AACtB,eAAW,YAAY,MAAM;AAC3B,UAAI,OAAO,UAAU,eAAe,KAAK,MAAM,QAAQ,GAAG;AACxD,cAAM,QAAQ,KAAK,QAAmB;AACtC,YAAI,UAAU,UAAa,UAAU,MAAM;AACzC,gBAAM,cAAc,MAAM,SAAS;AACnC,cAAI,CAAC,aAAa,QAAQ,GAAG;AAC3B,yBAAa,QAAQ,IAAI,EAAE,CAAC,WAAW,GAAG,EAAE;AAAA,UAC9C,WAAW,CAAC,aAAa,QAAQ,EAAG,WAAW,GAAG;AAChD;AAAC,YAAC,aAAa,QAAQ,EAA6B,WAAW,IAAI;AAAA,UACrE,OAAO;AACL;AAAC,YAAC,aAAa,QAAQ,EAA6B,WAAW,KAAK;AAAA,UACtE;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO;AACT;;;AChBO,IAAM,yCAAyC,CAAC,GAAW,MAA8C;AAE9G,QAAM,OAAO,IAAI;AAGjB,QAAM,WAAW,IAAI,KAAK,IAAI;AAG9B,QAAM,SAAS,KAAK,KAAK,QAAQ;AAEjC,SAAO,EAAE,MAAM,GAAG,QAAQ,SAAS;AACrC;;;AFZO,IAAM,0BAA0B,CAAC,SAAgD;AACtF,QAAM,SAAS,KACZ,IAAI,CAAC,QAAQ,KAAK,UAAU,UAA+C,EAC3E,OAAO,CAAC,MAAkC,MAAM,MAAS,EACzD,IAAI,CAACA,gBAAe;AACnB,WAAO,OAAO,YAAYA,YAAW,IAAI,CAAC,cAAc,CAAC,UAAU,YAAY,UAAU,KAAK,CAAC,CAAC;AAAA,EAClG,CAAC;AACH,QAAM,eAAe,mCAAmC,MAAM;AAC9D,QAAM,IAAI,KAAK;AACf,QAAM,aAAa,OAAO;AAAA,IACxB,OAAO,QAAQ,YAAY,EACxB,OAAO,CAAC,MAAmC,EAAE,CAAC,MAAM,MAAS,EAC7D,IAAI,CAAC,CAAC,OAAO,OAAO,MAAM;AACzB,YAAM,aAAa,OAAO,OAAO,OAAO,EAAE,OAAO,CAAC,MAAM,SAAS,OAAO,MAAM,CAAC;AAC/E,YAAM,EAAE,EAAE,IAAI,uCAAuC,KAAK,QAAQ,aAAa,CAAC;AAChF,YAAM,SAAS,OAAO;AAAA,QACpB,OAAO,QAAQ,OAAO,EAAE,IAAI,CAAC,CAAC,OAAO,eAAe,MAAM;AACxD,gBAAM,EAAE,GAAAC,GAAE,IAAI,uCAAuC,GAAG,kBAAkB,CAAC;AAC3E,gBAAM,UAA2B,EAAE,UAAU,EAAE,GAAAA,GAAE,GAAG,OAAO,gBAAgB;AAC3E,iBAAO,CAAC,OAAO,OAAO;AAAA,QACxB,CAAC;AAAA,MACH;AACA,aAAO,CAAC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE,GAAG,OAAO,WAAW,GAAG,OAAO,CAAC;AAAA,IAC5E,CAAC;AAAA,EACL;AACA,SAAO,EAAE,UAAU,EAAE,WAAW,EAAE;AACpC;","names":["attributes","p"]}
@@ -1,60 +0,0 @@
1
- // src/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.ts
2
- var calculateAllPropertiesDistribution = (array) => {
3
- const distribution = {};
4
- array.forEach((item) => {
5
- for (const property in item) {
6
- if (Object.prototype.hasOwnProperty.call(item, property)) {
7
- const value = item[property];
8
- if (value !== void 0 && value !== null) {
9
- const valueString = value.toString();
10
- if (!distribution[property]) {
11
- distribution[property] = { [valueString]: 1 };
12
- } else if (!distribution[property][valueString]) {
13
- ;
14
- distribution[property][valueString] = 1;
15
- } else {
16
- ;
17
- distribution[property][valueString] += 1;
18
- }
19
- }
20
- }
21
- }
22
- });
23
- return distribution;
24
- };
25
-
26
- // src/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.ts
27
- var calculateBinomialParamsFromProbability = (n, p) => {
28
- const mean = n * p;
29
- const variance = n * p * (1 - p);
30
- const stdDev = Math.sqrt(variance);
31
- return { mean, p, stdDev, variance };
32
- };
33
-
34
- // src/lib/collectionMetrics/getNftCollectionMetrics.ts
35
- var getNftCollectionMetrics = (nfts) => {
36
- const traits = nfts.map((nft) => nft?.metadata?.attributes).filter((v) => v !== void 0).map((attributes2) => {
37
- return Object.fromEntries(attributes2.map((attribute) => [attribute.trait_type, attribute.value]));
38
- });
39
- const distribution = calculateAllPropertiesDistribution(traits);
40
- const n = nfts.length;
41
- const attributes = Object.fromEntries(
42
- Object.entries(distribution).filter((v) => v[1] !== void 0).map(([trait, entries]) => {
43
- const traitCount = Object.values(entries).reduce((prev, curr) => prev + curr, 0);
44
- const { p } = calculateBinomialParamsFromProbability(nfts.length, traitCount / n);
45
- const values = Object.fromEntries(
46
- Object.entries(entries).map(([value, traitValueCount]) => {
47
- const { p: p2 } = calculateBinomialParamsFromProbability(n, traitValueCount / n);
48
- const metrics = { binomial: { p: p2 }, count: traitValueCount };
49
- return [value, metrics];
50
- })
51
- );
52
- return [trait, { metrics: { binomial: { p }, count: traitCount }, values }];
53
- })
54
- );
55
- return { metadata: { attributes } };
56
- };
57
- export {
58
- getNftCollectionMetrics
59
- };
60
- //# sourceMappingURL=getNftCollectionMetrics.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../src/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.ts","../../../../src/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.ts","../../../../src/lib/collectionMetrics/getNftCollectionMetrics.ts"],"sourcesContent":["import { Distribution } from './distribution'\n\nexport const calculateAllPropertiesDistribution = <T>(array: T[]): Distribution<T> => {\n const distribution: Distribution<T> = {}\n\n array.forEach((item) => {\n for (const property in item) {\n if (Object.prototype.hasOwnProperty.call(item, property)) {\n const value = item[property as keyof T]\n if (value !== undefined && value !== null) {\n const valueString = value.toString()\n if (!distribution[property]) {\n distribution[property] = { [valueString]: 1 }\n } else if (!distribution[property]![valueString]) {\n ;(distribution[property] as Record<string, number>)[valueString] = 1\n } else {\n ;(distribution[property] as Record<string, number>)[valueString] += 1\n }\n }\n }\n }\n })\n\n return distribution\n}\n","import { BinomialDistributionParameters } from '@xyo-network/crypto-nft-collection-payload-plugin'\n\n/**\n * Calculates the parameters of a binomial distribution given the number of trials and success probability\n * @param n Number of trials\n * @param p Success probability\n * @returns The binomial distribution parameters\n */\nexport const calculateBinomialParamsFromProbability = (n: number, p: number): BinomialDistributionParameters => {\n // Mean (µ)\n const mean = n * p\n\n // Variance (σ^2)\n const variance = n * p * (1 - p)\n\n // Standard Deviation (σ)\n const stdDev = Math.sqrt(variance)\n\n return { mean, p, stdDev, variance }\n}\n","import { NftCollectionMetrics, NftTraitMetrics } from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport { NftInfoFields, OpenSeaNftAttribute } from '@xyo-network/crypto-nft-payload-plugin'\n\nimport { calculateAllPropertiesDistribution, calculateBinomialParamsFromProbability } from './lib'\n\ntype TraitDistributionEntry = [string, { [key: string]: number }]\n\nexport const getNftCollectionMetrics = (nfts: NftInfoFields[]): NftCollectionMetrics => {\n const traits = nfts\n .map((nft) => nft?.metadata?.attributes as OpenSeaNftAttribute[] | undefined)\n .filter((v): v is OpenSeaNftAttribute[] => v !== undefined)\n .map((attributes) => {\n return Object.fromEntries(attributes.map((attribute) => [attribute.trait_type, attribute.value]))\n })\n const distribution = calculateAllPropertiesDistribution(traits)\n const n = nfts.length\n const attributes = Object.fromEntries(\n Object.entries(distribution)\n .filter((v): v is TraitDistributionEntry => v[1] !== undefined)\n .map(([trait, entries]) => {\n const traitCount = Object.values(entries).reduce((prev, curr) => prev + curr, 0)\n const { p } = calculateBinomialParamsFromProbability(nfts.length, traitCount / n)\n const values = Object.fromEntries(\n Object.entries(entries).map(([value, traitValueCount]) => {\n const { p } = calculateBinomialParamsFromProbability(n, traitValueCount / n)\n const metrics: NftTraitMetrics = { binomial: { p }, count: traitValueCount }\n return [value, metrics]\n }),\n )\n return [trait, { metrics: { binomial: { p }, count: traitCount }, values }]\n }),\n )\n return { metadata: { attributes } }\n}\n"],"mappings":";AAEO,IAAM,qCAAqC,CAAI,UAAgC;AACpF,QAAM,eAAgC,CAAC;AAEvC,QAAM,QAAQ,CAAC,SAAS;AACtB,eAAW,YAAY,MAAM;AAC3B,UAAI,OAAO,UAAU,eAAe,KAAK,MAAM,QAAQ,GAAG;AACxD,cAAM,QAAQ,KAAK,QAAmB;AACtC,YAAI,UAAU,UAAa,UAAU,MAAM;AACzC,gBAAM,cAAc,MAAM,SAAS;AACnC,cAAI,CAAC,aAAa,QAAQ,GAAG;AAC3B,yBAAa,QAAQ,IAAI,EAAE,CAAC,WAAW,GAAG,EAAE;AAAA,UAC9C,WAAW,CAAC,aAAa,QAAQ,EAAG,WAAW,GAAG;AAChD;AAAC,YAAC,aAAa,QAAQ,EAA6B,WAAW,IAAI;AAAA,UACrE,OAAO;AACL;AAAC,YAAC,aAAa,QAAQ,EAA6B,WAAW,KAAK;AAAA,UACtE;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO;AACT;;;AChBO,IAAM,yCAAyC,CAAC,GAAW,MAA8C;AAE9G,QAAM,OAAO,IAAI;AAGjB,QAAM,WAAW,IAAI,KAAK,IAAI;AAG9B,QAAM,SAAS,KAAK,KAAK,QAAQ;AAEjC,SAAO,EAAE,MAAM,GAAG,QAAQ,SAAS;AACrC;;;ACZO,IAAM,0BAA0B,CAAC,SAAgD;AACtF,QAAM,SAAS,KACZ,IAAI,CAAC,QAAQ,KAAK,UAAU,UAA+C,EAC3E,OAAO,CAAC,MAAkC,MAAM,MAAS,EACzD,IAAI,CAACA,gBAAe;AACnB,WAAO,OAAO,YAAYA,YAAW,IAAI,CAAC,cAAc,CAAC,UAAU,YAAY,UAAU,KAAK,CAAC,CAAC;AAAA,EAClG,CAAC;AACH,QAAM,eAAe,mCAAmC,MAAM;AAC9D,QAAM,IAAI,KAAK;AACf,QAAM,aAAa,OAAO;AAAA,IACxB,OAAO,QAAQ,YAAY,EACxB,OAAO,CAAC,MAAmC,EAAE,CAAC,MAAM,MAAS,EAC7D,IAAI,CAAC,CAAC,OAAO,OAAO,MAAM;AACzB,YAAM,aAAa,OAAO,OAAO,OAAO,EAAE,OAAO,CAAC,MAAM,SAAS,OAAO,MAAM,CAAC;AAC/E,YAAM,EAAE,EAAE,IAAI,uCAAuC,KAAK,QAAQ,aAAa,CAAC;AAChF,YAAM,SAAS,OAAO;AAAA,QACpB,OAAO,QAAQ,OAAO,EAAE,IAAI,CAAC,CAAC,OAAO,eAAe,MAAM;AACxD,gBAAM,EAAE,GAAAC,GAAE,IAAI,uCAAuC,GAAG,kBAAkB,CAAC;AAC3E,gBAAM,UAA2B,EAAE,UAAU,EAAE,GAAAA,GAAE,GAAG,OAAO,gBAAgB;AAC3E,iBAAO,CAAC,OAAO,OAAO;AAAA,QACxB,CAAC;AAAA,MACH;AACA,aAAO,CAAC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE,GAAG,OAAO,WAAW,GAAG,OAAO,CAAC;AAAA,IAC5E,CAAC;AAAA,EACL;AACA,SAAO,EAAE,UAAU,EAAE,WAAW,EAAE;AACpC;","names":["attributes","p"]}
@@ -1,83 +0,0 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
-
20
- // src/lib/collectionMetrics/index.ts
21
- var collectionMetrics_exports = {};
22
- __export(collectionMetrics_exports, {
23
- getNftCollectionMetrics: () => getNftCollectionMetrics
24
- });
25
- module.exports = __toCommonJS(collectionMetrics_exports);
26
-
27
- // src/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.ts
28
- var calculateAllPropertiesDistribution = (array) => {
29
- const distribution = {};
30
- array.forEach((item) => {
31
- for (const property in item) {
32
- if (Object.prototype.hasOwnProperty.call(item, property)) {
33
- const value = item[property];
34
- if (value !== void 0 && value !== null) {
35
- const valueString = value.toString();
36
- if (!distribution[property]) {
37
- distribution[property] = { [valueString]: 1 };
38
- } else if (!distribution[property][valueString]) {
39
- ;
40
- distribution[property][valueString] = 1;
41
- } else {
42
- ;
43
- distribution[property][valueString] += 1;
44
- }
45
- }
46
- }
47
- }
48
- });
49
- return distribution;
50
- };
51
-
52
- // src/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.ts
53
- var calculateBinomialParamsFromProbability = (n, p) => {
54
- const mean = n * p;
55
- const variance = n * p * (1 - p);
56
- const stdDev = Math.sqrt(variance);
57
- return { mean, p, stdDev, variance };
58
- };
59
-
60
- // src/lib/collectionMetrics/getNftCollectionMetrics.ts
61
- var getNftCollectionMetrics = (nfts) => {
62
- const traits = nfts.map((nft) => nft?.metadata?.attributes).filter((v) => v !== void 0).map((attributes2) => {
63
- return Object.fromEntries(attributes2.map((attribute) => [attribute.trait_type, attribute.value]));
64
- });
65
- const distribution = calculateAllPropertiesDistribution(traits);
66
- const n = nfts.length;
67
- const attributes = Object.fromEntries(
68
- Object.entries(distribution).filter((v) => v[1] !== void 0).map(([trait, entries]) => {
69
- const traitCount = Object.values(entries).reduce((prev, curr) => prev + curr, 0);
70
- const { p } = calculateBinomialParamsFromProbability(nfts.length, traitCount / n);
71
- const values = Object.fromEntries(
72
- Object.entries(entries).map(([value, traitValueCount]) => {
73
- const { p: p2 } = calculateBinomialParamsFromProbability(n, traitValueCount / n);
74
- const metrics = { binomial: { p: p2 }, count: traitValueCount };
75
- return [value, metrics];
76
- })
77
- );
78
- return [trait, { metrics: { binomial: { p }, count: traitCount }, values }];
79
- })
80
- );
81
- return { metadata: { attributes } };
82
- };
83
- //# sourceMappingURL=index.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../src/lib/collectionMetrics/index.ts","../../../../src/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.ts","../../../../src/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.ts","../../../../src/lib/collectionMetrics/getNftCollectionMetrics.ts"],"sourcesContent":["export * from './getNftCollectionMetrics'\n","import { Distribution } from './distribution'\n\nexport const calculateAllPropertiesDistribution = <T>(array: T[]): Distribution<T> => {\n const distribution: Distribution<T> = {}\n\n array.forEach((item) => {\n for (const property in item) {\n if (Object.prototype.hasOwnProperty.call(item, property)) {\n const value = item[property as keyof T]\n if (value !== undefined && value !== null) {\n const valueString = value.toString()\n if (!distribution[property]) {\n distribution[property] = { [valueString]: 1 }\n } else if (!distribution[property]![valueString]) {\n ;(distribution[property] as Record<string, number>)[valueString] = 1\n } else {\n ;(distribution[property] as Record<string, number>)[valueString] += 1\n }\n }\n }\n }\n })\n\n return distribution\n}\n","import { BinomialDistributionParameters } from '@xyo-network/crypto-nft-collection-payload-plugin'\n\n/**\n * Calculates the parameters of a binomial distribution given the number of trials and success probability\n * @param n Number of trials\n * @param p Success probability\n * @returns The binomial distribution parameters\n */\nexport const calculateBinomialParamsFromProbability = (n: number, p: number): BinomialDistributionParameters => {\n // Mean (µ)\n const mean = n * p\n\n // Variance (σ^2)\n const variance = n * p * (1 - p)\n\n // Standard Deviation (σ)\n const stdDev = Math.sqrt(variance)\n\n return { mean, p, stdDev, variance }\n}\n","import { NftCollectionMetrics, NftTraitMetrics } from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport { NftInfoFields, OpenSeaNftAttribute } from '@xyo-network/crypto-nft-payload-plugin'\n\nimport { calculateAllPropertiesDistribution, calculateBinomialParamsFromProbability } from './lib'\n\ntype TraitDistributionEntry = [string, { [key: string]: number }]\n\nexport const getNftCollectionMetrics = (nfts: NftInfoFields[]): NftCollectionMetrics => {\n const traits = nfts\n .map((nft) => nft?.metadata?.attributes as OpenSeaNftAttribute[] | undefined)\n .filter((v): v is OpenSeaNftAttribute[] => v !== undefined)\n .map((attributes) => {\n return Object.fromEntries(attributes.map((attribute) => [attribute.trait_type, attribute.value]))\n })\n const distribution = calculateAllPropertiesDistribution(traits)\n const n = nfts.length\n const attributes = Object.fromEntries(\n Object.entries(distribution)\n .filter((v): v is TraitDistributionEntry => v[1] !== undefined)\n .map(([trait, entries]) => {\n const traitCount = Object.values(entries).reduce((prev, curr) => prev + curr, 0)\n const { p } = calculateBinomialParamsFromProbability(nfts.length, traitCount / n)\n const values = Object.fromEntries(\n Object.entries(entries).map(([value, traitValueCount]) => {\n const { p } = calculateBinomialParamsFromProbability(n, traitValueCount / n)\n const metrics: NftTraitMetrics = { binomial: { p }, count: traitValueCount }\n return [value, metrics]\n }),\n )\n return [trait, { metrics: { binomial: { p }, count: traitCount }, values }]\n }),\n )\n return { metadata: { attributes } }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEO,IAAM,qCAAqC,CAAI,UAAgC;AACpF,QAAM,eAAgC,CAAC;AAEvC,QAAM,QAAQ,CAAC,SAAS;AACtB,eAAW,YAAY,MAAM;AAC3B,UAAI,OAAO,UAAU,eAAe,KAAK,MAAM,QAAQ,GAAG;AACxD,cAAM,QAAQ,KAAK,QAAmB;AACtC,YAAI,UAAU,UAAa,UAAU,MAAM;AACzC,gBAAM,cAAc,MAAM,SAAS;AACnC,cAAI,CAAC,aAAa,QAAQ,GAAG;AAC3B,yBAAa,QAAQ,IAAI,EAAE,CAAC,WAAW,GAAG,EAAE;AAAA,UAC9C,WAAW,CAAC,aAAa,QAAQ,EAAG,WAAW,GAAG;AAChD;AAAC,YAAC,aAAa,QAAQ,EAA6B,WAAW,IAAI;AAAA,UACrE,OAAO;AACL;AAAC,YAAC,aAAa,QAAQ,EAA6B,WAAW,KAAK;AAAA,UACtE;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO;AACT;;;AChBO,IAAM,yCAAyC,CAAC,GAAW,MAA8C;AAE9G,QAAM,OAAO,IAAI;AAGjB,QAAM,WAAW,IAAI,KAAK,IAAI;AAG9B,QAAM,SAAS,KAAK,KAAK,QAAQ;AAEjC,SAAO,EAAE,MAAM,GAAG,QAAQ,SAAS;AACrC;;;ACZO,IAAM,0BAA0B,CAAC,SAAgD;AACtF,QAAM,SAAS,KACZ,IAAI,CAAC,QAAQ,KAAK,UAAU,UAA+C,EAC3E,OAAO,CAAC,MAAkC,MAAM,MAAS,EACzD,IAAI,CAACA,gBAAe;AACnB,WAAO,OAAO,YAAYA,YAAW,IAAI,CAAC,cAAc,CAAC,UAAU,YAAY,UAAU,KAAK,CAAC,CAAC;AAAA,EAClG,CAAC;AACH,QAAM,eAAe,mCAAmC,MAAM;AAC9D,QAAM,IAAI,KAAK;AACf,QAAM,aAAa,OAAO;AAAA,IACxB,OAAO,QAAQ,YAAY,EACxB,OAAO,CAAC,MAAmC,EAAE,CAAC,MAAM,MAAS,EAC7D,IAAI,CAAC,CAAC,OAAO,OAAO,MAAM;AACzB,YAAM,aAAa,OAAO,OAAO,OAAO,EAAE,OAAO,CAAC,MAAM,SAAS,OAAO,MAAM,CAAC;AAC/E,YAAM,EAAE,EAAE,IAAI,uCAAuC,KAAK,QAAQ,aAAa,CAAC;AAChF,YAAM,SAAS,OAAO;AAAA,QACpB,OAAO,QAAQ,OAAO,EAAE,IAAI,CAAC,CAAC,OAAO,eAAe,MAAM;AACxD,gBAAM,EAAE,GAAAC,GAAE,IAAI,uCAAuC,GAAG,kBAAkB,CAAC;AAC3E,gBAAM,UAA2B,EAAE,UAAU,EAAE,GAAAA,GAAE,GAAG,OAAO,gBAAgB;AAC3E,iBAAO,CAAC,OAAO,OAAO;AAAA,QACxB,CAAC;AAAA,MACH;AACA,aAAO,CAAC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE,GAAG,OAAO,WAAW,GAAG,OAAO,CAAC;AAAA,IAC5E,CAAC;AAAA,EACL;AACA,SAAO,EAAE,UAAU,EAAE,WAAW,EAAE;AACpC;","names":["attributes","p"]}
@@ -1,60 +0,0 @@
1
- // src/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.ts
2
- var calculateAllPropertiesDistribution = (array) => {
3
- const distribution = {};
4
- array.forEach((item) => {
5
- for (const property in item) {
6
- if (Object.prototype.hasOwnProperty.call(item, property)) {
7
- const value = item[property];
8
- if (value !== void 0 && value !== null) {
9
- const valueString = value.toString();
10
- if (!distribution[property]) {
11
- distribution[property] = { [valueString]: 1 };
12
- } else if (!distribution[property][valueString]) {
13
- ;
14
- distribution[property][valueString] = 1;
15
- } else {
16
- ;
17
- distribution[property][valueString] += 1;
18
- }
19
- }
20
- }
21
- }
22
- });
23
- return distribution;
24
- };
25
-
26
- // src/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.ts
27
- var calculateBinomialParamsFromProbability = (n, p) => {
28
- const mean = n * p;
29
- const variance = n * p * (1 - p);
30
- const stdDev = Math.sqrt(variance);
31
- return { mean, p, stdDev, variance };
32
- };
33
-
34
- // src/lib/collectionMetrics/getNftCollectionMetrics.ts
35
- var getNftCollectionMetrics = (nfts) => {
36
- const traits = nfts.map((nft) => nft?.metadata?.attributes).filter((v) => v !== void 0).map((attributes2) => {
37
- return Object.fromEntries(attributes2.map((attribute) => [attribute.trait_type, attribute.value]));
38
- });
39
- const distribution = calculateAllPropertiesDistribution(traits);
40
- const n = nfts.length;
41
- const attributes = Object.fromEntries(
42
- Object.entries(distribution).filter((v) => v[1] !== void 0).map(([trait, entries]) => {
43
- const traitCount = Object.values(entries).reduce((prev, curr) => prev + curr, 0);
44
- const { p } = calculateBinomialParamsFromProbability(nfts.length, traitCount / n);
45
- const values = Object.fromEntries(
46
- Object.entries(entries).map(([value, traitValueCount]) => {
47
- const { p: p2 } = calculateBinomialParamsFromProbability(n, traitValueCount / n);
48
- const metrics = { binomial: { p: p2 }, count: traitValueCount };
49
- return [value, metrics];
50
- })
51
- );
52
- return [trait, { metrics: { binomial: { p }, count: traitCount }, values }];
53
- })
54
- );
55
- return { metadata: { attributes } };
56
- };
57
- export {
58
- getNftCollectionMetrics
59
- };
60
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../src/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.ts","../../../../src/lib/collectionMetrics/lib/probabilityDistributions/binomial/calculateBinomialParamsFromProbability.ts","../../../../src/lib/collectionMetrics/getNftCollectionMetrics.ts"],"sourcesContent":["import { Distribution } from './distribution'\n\nexport const calculateAllPropertiesDistribution = <T>(array: T[]): Distribution<T> => {\n const distribution: Distribution<T> = {}\n\n array.forEach((item) => {\n for (const property in item) {\n if (Object.prototype.hasOwnProperty.call(item, property)) {\n const value = item[property as keyof T]\n if (value !== undefined && value !== null) {\n const valueString = value.toString()\n if (!distribution[property]) {\n distribution[property] = { [valueString]: 1 }\n } else if (!distribution[property]![valueString]) {\n ;(distribution[property] as Record<string, number>)[valueString] = 1\n } else {\n ;(distribution[property] as Record<string, number>)[valueString] += 1\n }\n }\n }\n }\n })\n\n return distribution\n}\n","import { BinomialDistributionParameters } from '@xyo-network/crypto-nft-collection-payload-plugin'\n\n/**\n * Calculates the parameters of a binomial distribution given the number of trials and success probability\n * @param n Number of trials\n * @param p Success probability\n * @returns The binomial distribution parameters\n */\nexport const calculateBinomialParamsFromProbability = (n: number, p: number): BinomialDistributionParameters => {\n // Mean (µ)\n const mean = n * p\n\n // Variance (σ^2)\n const variance = n * p * (1 - p)\n\n // Standard Deviation (σ)\n const stdDev = Math.sqrt(variance)\n\n return { mean, p, stdDev, variance }\n}\n","import { NftCollectionMetrics, NftTraitMetrics } from '@xyo-network/crypto-nft-collection-payload-plugin'\nimport { NftInfoFields, OpenSeaNftAttribute } from '@xyo-network/crypto-nft-payload-plugin'\n\nimport { calculateAllPropertiesDistribution, calculateBinomialParamsFromProbability } from './lib'\n\ntype TraitDistributionEntry = [string, { [key: string]: number }]\n\nexport const getNftCollectionMetrics = (nfts: NftInfoFields[]): NftCollectionMetrics => {\n const traits = nfts\n .map((nft) => nft?.metadata?.attributes as OpenSeaNftAttribute[] | undefined)\n .filter((v): v is OpenSeaNftAttribute[] => v !== undefined)\n .map((attributes) => {\n return Object.fromEntries(attributes.map((attribute) => [attribute.trait_type, attribute.value]))\n })\n const distribution = calculateAllPropertiesDistribution(traits)\n const n = nfts.length\n const attributes = Object.fromEntries(\n Object.entries(distribution)\n .filter((v): v is TraitDistributionEntry => v[1] !== undefined)\n .map(([trait, entries]) => {\n const traitCount = Object.values(entries).reduce((prev, curr) => prev + curr, 0)\n const { p } = calculateBinomialParamsFromProbability(nfts.length, traitCount / n)\n const values = Object.fromEntries(\n Object.entries(entries).map(([value, traitValueCount]) => {\n const { p } = calculateBinomialParamsFromProbability(n, traitValueCount / n)\n const metrics: NftTraitMetrics = { binomial: { p }, count: traitValueCount }\n return [value, metrics]\n }),\n )\n return [trait, { metrics: { binomial: { p }, count: traitCount }, values }]\n }),\n )\n return { metadata: { attributes } }\n}\n"],"mappings":";AAEO,IAAM,qCAAqC,CAAI,UAAgC;AACpF,QAAM,eAAgC,CAAC;AAEvC,QAAM,QAAQ,CAAC,SAAS;AACtB,eAAW,YAAY,MAAM;AAC3B,UAAI,OAAO,UAAU,eAAe,KAAK,MAAM,QAAQ,GAAG;AACxD,cAAM,QAAQ,KAAK,QAAmB;AACtC,YAAI,UAAU,UAAa,UAAU,MAAM;AACzC,gBAAM,cAAc,MAAM,SAAS;AACnC,cAAI,CAAC,aAAa,QAAQ,GAAG;AAC3B,yBAAa,QAAQ,IAAI,EAAE,CAAC,WAAW,GAAG,EAAE;AAAA,UAC9C,WAAW,CAAC,aAAa,QAAQ,EAAG,WAAW,GAAG;AAChD;AAAC,YAAC,aAAa,QAAQ,EAA6B,WAAW,IAAI;AAAA,UACrE,OAAO;AACL;AAAC,YAAC,aAAa,QAAQ,EAA6B,WAAW,KAAK;AAAA,UACtE;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO;AACT;;;AChBO,IAAM,yCAAyC,CAAC,GAAW,MAA8C;AAE9G,QAAM,OAAO,IAAI;AAGjB,QAAM,WAAW,IAAI,KAAK,IAAI;AAG9B,QAAM,SAAS,KAAK,KAAK,QAAQ;AAEjC,SAAO,EAAE,MAAM,GAAG,QAAQ,SAAS;AACrC;;;ACZO,IAAM,0BAA0B,CAAC,SAAgD;AACtF,QAAM,SAAS,KACZ,IAAI,CAAC,QAAQ,KAAK,UAAU,UAA+C,EAC3E,OAAO,CAAC,MAAkC,MAAM,MAAS,EACzD,IAAI,CAACA,gBAAe;AACnB,WAAO,OAAO,YAAYA,YAAW,IAAI,CAAC,cAAc,CAAC,UAAU,YAAY,UAAU,KAAK,CAAC,CAAC;AAAA,EAClG,CAAC;AACH,QAAM,eAAe,mCAAmC,MAAM;AAC9D,QAAM,IAAI,KAAK;AACf,QAAM,aAAa,OAAO;AAAA,IACxB,OAAO,QAAQ,YAAY,EACxB,OAAO,CAAC,MAAmC,EAAE,CAAC,MAAM,MAAS,EAC7D,IAAI,CAAC,CAAC,OAAO,OAAO,MAAM;AACzB,YAAM,aAAa,OAAO,OAAO,OAAO,EAAE,OAAO,CAAC,MAAM,SAAS,OAAO,MAAM,CAAC;AAC/E,YAAM,EAAE,EAAE,IAAI,uCAAuC,KAAK,QAAQ,aAAa,CAAC;AAChF,YAAM,SAAS,OAAO;AAAA,QACpB,OAAO,QAAQ,OAAO,EAAE,IAAI,CAAC,CAAC,OAAO,eAAe,MAAM;AACxD,gBAAM,EAAE,GAAAC,GAAE,IAAI,uCAAuC,GAAG,kBAAkB,CAAC;AAC3E,gBAAM,UAA2B,EAAE,UAAU,EAAE,GAAAA,GAAE,GAAG,OAAO,gBAAgB;AAC3E,iBAAO,CAAC,OAAO,OAAO;AAAA,QACxB,CAAC;AAAA,MACH;AACA,aAAO,CAAC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE,GAAG,OAAO,WAAW,GAAG,OAAO,CAAC;AAAA,IAC5E,CAAC;AAAA,EACL;AACA,SAAO,EAAE,UAAU,EAAE,WAAW,EAAE;AACpC;","names":["attributes","p"]}
@@ -1,49 +0,0 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
-
20
- // src/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.ts
21
- var calculateAllPropertiesDistribution_exports = {};
22
- __export(calculateAllPropertiesDistribution_exports, {
23
- calculateAllPropertiesDistribution: () => calculateAllPropertiesDistribution
24
- });
25
- module.exports = __toCommonJS(calculateAllPropertiesDistribution_exports);
26
- var calculateAllPropertiesDistribution = (array) => {
27
- const distribution = {};
28
- array.forEach((item) => {
29
- for (const property in item) {
30
- if (Object.prototype.hasOwnProperty.call(item, property)) {
31
- const value = item[property];
32
- if (value !== void 0 && value !== null) {
33
- const valueString = value.toString();
34
- if (!distribution[property]) {
35
- distribution[property] = { [valueString]: 1 };
36
- } else if (!distribution[property][valueString]) {
37
- ;
38
- distribution[property][valueString] = 1;
39
- } else {
40
- ;
41
- distribution[property][valueString] += 1;
42
- }
43
- }
44
- }
45
- }
46
- });
47
- return distribution;
48
- };
49
- //# sourceMappingURL=calculateAllPropertiesDistribution.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../../src/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.ts"],"sourcesContent":["import { Distribution } from './distribution'\n\nexport const calculateAllPropertiesDistribution = <T>(array: T[]): Distribution<T> => {\n const distribution: Distribution<T> = {}\n\n array.forEach((item) => {\n for (const property in item) {\n if (Object.prototype.hasOwnProperty.call(item, property)) {\n const value = item[property as keyof T]\n if (value !== undefined && value !== null) {\n const valueString = value.toString()\n if (!distribution[property]) {\n distribution[property] = { [valueString]: 1 }\n } else if (!distribution[property]![valueString]) {\n ;(distribution[property] as Record<string, number>)[valueString] = 1\n } else {\n ;(distribution[property] as Record<string, number>)[valueString] += 1\n }\n }\n }\n }\n })\n\n return distribution\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEO,IAAM,qCAAqC,CAAI,UAAgC;AACpF,QAAM,eAAgC,CAAC;AAEvC,QAAM,QAAQ,CAAC,SAAS;AACtB,eAAW,YAAY,MAAM;AAC3B,UAAI,OAAO,UAAU,eAAe,KAAK,MAAM,QAAQ,GAAG;AACxD,cAAM,QAAQ,KAAK,QAAmB;AACtC,YAAI,UAAU,UAAa,UAAU,MAAM;AACzC,gBAAM,cAAc,MAAM,SAAS;AACnC,cAAI,CAAC,aAAa,QAAQ,GAAG;AAC3B,yBAAa,QAAQ,IAAI,EAAE,CAAC,WAAW,GAAG,EAAE;AAAA,UAC9C,WAAW,CAAC,aAAa,QAAQ,EAAG,WAAW,GAAG;AAChD;AAAC,YAAC,aAAa,QAAQ,EAA6B,WAAW,IAAI;AAAA,UACrE,OAAO;AACL;AAAC,YAAC,aAAa,QAAQ,EAA6B,WAAW,KAAK;AAAA,UACtE;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO;AACT;","names":[]}
@@ -1,28 +0,0 @@
1
- // src/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.ts
2
- var calculateAllPropertiesDistribution = (array) => {
3
- const distribution = {};
4
- array.forEach((item) => {
5
- for (const property in item) {
6
- if (Object.prototype.hasOwnProperty.call(item, property)) {
7
- const value = item[property];
8
- if (value !== void 0 && value !== null) {
9
- const valueString = value.toString();
10
- if (!distribution[property]) {
11
- distribution[property] = { [valueString]: 1 };
12
- } else if (!distribution[property][valueString]) {
13
- ;
14
- distribution[property][valueString] = 1;
15
- } else {
16
- ;
17
- distribution[property][valueString] += 1;
18
- }
19
- }
20
- }
21
- }
22
- });
23
- return distribution;
24
- };
25
- export {
26
- calculateAllPropertiesDistribution
27
- };
28
- //# sourceMappingURL=calculateAllPropertiesDistribution.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../../src/lib/collectionMetrics/lib/calculateAllPropertiesDistribution.ts"],"sourcesContent":["import { Distribution } from './distribution'\n\nexport const calculateAllPropertiesDistribution = <T>(array: T[]): Distribution<T> => {\n const distribution: Distribution<T> = {}\n\n array.forEach((item) => {\n for (const property in item) {\n if (Object.prototype.hasOwnProperty.call(item, property)) {\n const value = item[property as keyof T]\n if (value !== undefined && value !== null) {\n const valueString = value.toString()\n if (!distribution[property]) {\n distribution[property] = { [valueString]: 1 }\n } else if (!distribution[property]![valueString]) {\n ;(distribution[property] as Record<string, number>)[valueString] = 1\n } else {\n ;(distribution[property] as Record<string, number>)[valueString] += 1\n }\n }\n }\n }\n })\n\n return distribution\n}\n"],"mappings":";AAEO,IAAM,qCAAqC,CAAI,UAAgC;AACpF,QAAM,eAAgC,CAAC;AAEvC,QAAM,QAAQ,CAAC,SAAS;AACtB,eAAW,YAAY,MAAM;AAC3B,UAAI,OAAO,UAAU,eAAe,KAAK,MAAM,QAAQ,GAAG;AACxD,cAAM,QAAQ,KAAK,QAAmB;AACtC,YAAI,UAAU,UAAa,UAAU,MAAM;AACzC,gBAAM,cAAc,MAAM,SAAS;AACnC,cAAI,CAAC,aAAa,QAAQ,GAAG;AAC3B,yBAAa,QAAQ,IAAI,EAAE,CAAC,WAAW,GAAG,EAAE;AAAA,UAC9C,WAAW,CAAC,aAAa,QAAQ,EAAG,WAAW,GAAG;AAChD;AAAC,YAAC,aAAa,QAAQ,EAA6B,WAAW,IAAI;AAAA,UACrE,OAAO;AACL;AAAC,YAAC,aAAa,QAAQ,EAA6B,WAAW,KAAK;AAAA,UACtE;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO;AACT;","names":[]}
@@ -1,45 +0,0 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
-
20
- // src/lib/collectionMetrics/lib/calculatePropertyDistribution.ts
21
- var calculatePropertyDistribution_exports = {};
22
- __export(calculatePropertyDistribution_exports, {
23
- calculatePropertyDistribution: () => calculatePropertyDistribution
24
- });
25
- module.exports = __toCommonJS(calculatePropertyDistribution_exports);
26
- var calculatePropertyDistribution = (array, property) => {
27
- const distribution = {};
28
- array.forEach((item) => {
29
- const value = item[property];
30
- if (value !== void 0 && value !== null) {
31
- const valueString = value.toString();
32
- if (!distribution[property]) {
33
- distribution[property] = { [valueString]: 1 };
34
- } else if (!distribution[property][valueString]) {
35
- ;
36
- distribution[property][valueString] = 1;
37
- } else {
38
- ;
39
- distribution[property][valueString] += 1;
40
- }
41
- }
42
- });
43
- return distribution;
44
- };
45
- //# sourceMappingURL=calculatePropertyDistribution.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../../src/lib/collectionMetrics/lib/calculatePropertyDistribution.ts"],"sourcesContent":["import { Distribution } from './distribution'\n\nexport const calculatePropertyDistribution = <T>(array: T[], property: keyof T): Distribution<T> => {\n const distribution: Distribution<T> = {}\n array.forEach((item) => {\n const value = item[property]\n if (value !== undefined && value !== null) {\n const valueString = value.toString()\n if (!distribution[property]) {\n distribution[property] = { [valueString]: 1 }\n } else if (!distribution[property]![valueString]) {\n ;(distribution[property] as Record<string, number>)[valueString] = 1\n } else {\n ;(distribution[property] as Record<string, number>)[valueString] += 1\n }\n }\n })\n return distribution\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEO,IAAM,gCAAgC,CAAI,OAAY,aAAuC;AAClG,QAAM,eAAgC,CAAC;AACvC,QAAM,QAAQ,CAAC,SAAS;AACtB,UAAM,QAAQ,KAAK,QAAQ;AAC3B,QAAI,UAAU,UAAa,UAAU,MAAM;AACzC,YAAM,cAAc,MAAM,SAAS;AACnC,UAAI,CAAC,aAAa,QAAQ,GAAG;AAC3B,qBAAa,QAAQ,IAAI,EAAE,CAAC,WAAW,GAAG,EAAE;AAAA,MAC9C,WAAW,CAAC,aAAa,QAAQ,EAAG,WAAW,GAAG;AAChD;AAAC,QAAC,aAAa,QAAQ,EAA6B,WAAW,IAAI;AAAA,MACrE,OAAO;AACL;AAAC,QAAC,aAAa,QAAQ,EAA6B,WAAW,KAAK;AAAA,MACtE;AAAA,IACF;AAAA,EACF,CAAC;AACD,SAAO;AACT;","names":[]}
@@ -1,24 +0,0 @@
1
- // src/lib/collectionMetrics/lib/calculatePropertyDistribution.ts
2
- var calculatePropertyDistribution = (array, property) => {
3
- const distribution = {};
4
- array.forEach((item) => {
5
- const value = item[property];
6
- if (value !== void 0 && value !== null) {
7
- const valueString = value.toString();
8
- if (!distribution[property]) {
9
- distribution[property] = { [valueString]: 1 };
10
- } else if (!distribution[property][valueString]) {
11
- ;
12
- distribution[property][valueString] = 1;
13
- } else {
14
- ;
15
- distribution[property][valueString] += 1;
16
- }
17
- }
18
- });
19
- return distribution;
20
- };
21
- export {
22
- calculatePropertyDistribution
23
- };
24
- //# sourceMappingURL=calculatePropertyDistribution.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../../src/lib/collectionMetrics/lib/calculatePropertyDistribution.ts"],"sourcesContent":["import { Distribution } from './distribution'\n\nexport const calculatePropertyDistribution = <T>(array: T[], property: keyof T): Distribution<T> => {\n const distribution: Distribution<T> = {}\n array.forEach((item) => {\n const value = item[property]\n if (value !== undefined && value !== null) {\n const valueString = value.toString()\n if (!distribution[property]) {\n distribution[property] = { [valueString]: 1 }\n } else if (!distribution[property]![valueString]) {\n ;(distribution[property] as Record<string, number>)[valueString] = 1\n } else {\n ;(distribution[property] as Record<string, number>)[valueString] += 1\n }\n }\n })\n return distribution\n}\n"],"mappings":";AAEO,IAAM,gCAAgC,CAAI,OAAY,aAAuC;AAClG,QAAM,eAAgC,CAAC;AACvC,QAAM,QAAQ,CAAC,SAAS;AACtB,UAAM,QAAQ,KAAK,QAAQ;AAC3B,QAAI,UAAU,UAAa,UAAU,MAAM;AACzC,YAAM,cAAc,MAAM,SAAS;AACnC,UAAI,CAAC,aAAa,QAAQ,GAAG;AAC3B,qBAAa,QAAQ,IAAI,EAAE,CAAC,WAAW,GAAG,EAAE;AAAA,MAC9C,WAAW,CAAC,aAAa,QAAQ,EAAG,WAAW,GAAG;AAChD;AAAC,QAAC,aAAa,QAAQ,EAA6B,WAAW,IAAI;AAAA,MACrE,OAAO;AACL;AAAC,QAAC,aAAa,QAAQ,EAA6B,WAAW,KAAK;AAAA,MACtE;AAAA,IACF;AAAA,EACF,CAAC;AACD,SAAO;AACT;","names":[]}
@@ -1,19 +0,0 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __copyProps = (to, from, except, desc) => {
7
- if (from && typeof from === "object" || typeof from === "function") {
8
- for (let key of __getOwnPropNames(from))
9
- if (!__hasOwnProp.call(to, key) && key !== except)
10
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
11
- }
12
- return to;
13
- };
14
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
15
-
16
- // src/lib/collectionMetrics/lib/distribution.ts
17
- var distribution_exports = {};
18
- module.exports = __toCommonJS(distribution_exports);
19
- //# sourceMappingURL=distribution.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../../src/lib/collectionMetrics/lib/distribution.ts"],"sourcesContent":["export type Distribution<T> = {\n [K in keyof T]?: { [value: string]: number }\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAAA;AAAA;","names":[]}
@@ -1 +0,0 @@
1
- //# sourceMappingURL=distribution.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}