@zoralabs/zdk-alpha
Advanced tools
Comparing version 0.0.23 to 0.0.24
@@ -1,2 +0,2 @@ | ||
import { getSdk, Chain, Network, NetworkInput, TokenInput, TokensQueryInput, TokensQueryFilter, CollectionsQueryInput, CollectionSortKeySortInput, TokenSortInput, AggregateAttributesQueryVariables, OwnersByCountQueryVariables, SalesVolumeQueryVariables, EventsQueryInput, EventsQueryFilter, EventSortKeySortInput, MarketSortKeySortInput, MarketsQueryFilter, MarketsQueryInput, MintsQueryFilter, MintsQueryInput, MintSortKeySortInput, FloorPriceQueryVariables, NftCountQueryVariables, FullTextSearchQueryVariables, TokenQueryVariables } from './queries/queries-sdk'; | ||
import { getSdk, Chain, Network, NetworkInput, TokenInput, TokensQueryInput, TokensQueryFilter, CollectionsQueryInput, CollectionSortKeySortInput, TokenSortInput, AggregateAttributesQueryVariables, OwnersByCountQueryVariables, SalesVolumeQueryVariables, EventsQueryInput, EventsQueryFilter, EventSortKeySortInput, MarketSortKeySortInput, MarketsQueryFilter, MarketsQueryInput, MintsQueryFilter, MintsQueryInput, MintSortKeySortInput, FloorPriceQueryVariables, NftCountQueryVariables, FullTextSearchQueryVariables, TokenQueryVariables, SalesQueryInput, SaleSortKeySortInput, SalesQueryFilter } from './queries/queries-sdk'; | ||
export { Chain as ZDKChain, Network as ZDKNetwork }; | ||
@@ -41,2 +41,8 @@ export declare type OverrideNetworksOption = NetworkInput[]; | ||
} & SharedQueryParams; | ||
declare type SalesQueryArgs = { | ||
where: SalesQueryInput; | ||
sort: SaleSortKeySortInput; | ||
filter: SalesQueryFilter; | ||
includeFullDetails: boolean; | ||
} & SharedQueryParams; | ||
export interface ListOptions<SortInput> { | ||
@@ -52,2 +58,5 @@ networks?: OverrideNetworksOption; | ||
export declare type TokenQueryList = TokenInput; | ||
declare type OptionalNetwork<K> = Omit<K, 'networks'> & { | ||
networks?: OverrideNetworksOption; | ||
}; | ||
export declare class ZDK { | ||
@@ -62,14 +71,15 @@ endpoint: string; | ||
tokens: ({ where, filter, pagination, networks, sort, includeFullDetails, includeSalesHistory, }: TokensQueryArgs) => Promise<import("./queries/queries-sdk").TokensQuery>; | ||
token: ({ token, network, includeFullDetails }: TokenQueryVariables) => Promise<import("./queries/queries-sdk").TokenQuery>; | ||
token: ({ token, network, includeFullDetails, }: OptionalNetwork<TokenQueryVariables>) => Promise<import("./queries/queries-sdk").TokenQuery>; | ||
events: ({ networks, filter, pagination, sort, where, }: EventsQueryArgs) => Promise<import("./queries/queries-sdk").EventsQuery>; | ||
markets: ({ networks, filter, pagination, sort, where, includeFullDetails, }: MarketQueryArgs) => Promise<import("./queries/queries-sdk").MarketsQuery>; | ||
mints: ({ networks, filter, pagination, sort, where, includeFullDetails, }: MintsQueryArgs) => Promise<import("./queries/queries-sdk").MintsQuery>; | ||
sales: ({ where, pagination, networks, sort, filter, includeFullDetails, }: SalesQueryArgs) => Promise<import("./queries/queries-sdk").SalesQuery>; | ||
collections: ({ where, pagination, networks, sort, includeFullDetails, }: CollectionsQueryArgs) => Promise<import("./queries/queries-sdk").CollectionsQuery>; | ||
ownersByCount: ({ where, networks, pagination, }: OwnersByCountQueryVariables) => Promise<import("./queries/queries-sdk").OwnersByCountQuery>; | ||
aggregateAttributes: ({ where, networks, }: AggregateAttributesQueryVariables) => Promise<import("./queries/queries-sdk").AggregateAttributesQuery>; | ||
salesVolume: ({ where, networks, timeFilter, }: SalesVolumeQueryVariables) => Promise<import("./queries/queries-sdk").SalesVolumeQuery>; | ||
ownerCount: ({ where, networks }: OwnersByCountQueryVariables) => Promise<import("./queries/queries-sdk").OwnerCountQuery>; | ||
floorPrice: ({ where, networks }: FloorPriceQueryVariables) => Promise<import("./queries/queries-sdk").FloorPriceQuery>; | ||
nftCount: ({ where, networks }: NftCountQueryVariables) => Promise<import("./queries/queries-sdk").NftCountQuery>; | ||
search: ({ pagination, query }: FullTextSearchQueryVariables) => Promise<import("./queries/queries-sdk").FullTextSearchQuery>; | ||
ownersByCount: ({ where, pagination, networks, }: OptionalNetwork<OwnersByCountQueryVariables>) => Promise<import("./queries/queries-sdk").OwnersByCountQuery>; | ||
aggregateAttributes: ({ where, networks, }: OptionalNetwork<AggregateAttributesQueryVariables>) => Promise<import("./queries/queries-sdk").AggregateAttributesQuery>; | ||
salesVolume: ({ where, networks, timeFilter, }: OptionalNetwork<SalesVolumeQueryVariables>) => Promise<import("./queries/queries-sdk").SalesVolumeQuery>; | ||
ownerCount: ({ where, networks, }: OptionalNetwork<OwnersByCountQueryVariables>) => Promise<import("./queries/queries-sdk").OwnerCountQuery>; | ||
floorPrice: ({ where, networks, }: OptionalNetwork<FloorPriceQueryVariables>) => Promise<import("./queries/queries-sdk").FloorPriceQuery>; | ||
nftCount: ({ where, networks, }: OptionalNetwork<NftCountQueryVariables>) => Promise<import("./queries/queries-sdk").NftCountQuery>; | ||
search: ({ pagination, query, filter }: FullTextSearchQueryVariables) => Promise<import("./queries/queries-sdk").FullTextSearchQuery>; | ||
} |
@@ -14,5 +14,2 @@ "use strict"; | ||
this.defaultMaxPageSize = 200; | ||
// private fetch(url: string, options: any) { | ||
// return axios({url, ...options}); | ||
// } | ||
this.getNetworksOption = (networks) => { | ||
@@ -44,3 +41,3 @@ return { | ||
}); | ||
this.token = async ({ token, network, includeFullDetails }) => await this.sdk.token({ | ||
this.token = async ({ token, network = this.defaultNetworks[0], includeFullDetails, }) => await this.sdk.token({ | ||
token, | ||
@@ -82,2 +79,13 @@ network, | ||
}); | ||
this.sales = async ({ where, pagination, networks, sort, filter, includeFullDetails = false, }) => this.sdk.sales({ | ||
where, | ||
filter, | ||
...this.getPaginationOptions(pagination), | ||
...this.getNetworksOption(networks), | ||
sort: { | ||
sortDirection: (sort === null || sort === void 0 ? void 0 : sort.sortDirection) || queries_sdk_1.SortDirection.Desc, | ||
sortKey: (sort === null || sort === void 0 ? void 0 : sort.sortKey) || queries_sdk_1.SaleSortKey.Time, | ||
}, | ||
includeFullDetails, | ||
}); | ||
this.collections = async ({ where, pagination, networks, sort, includeFullDetails = false, }) => this.sdk.collections({ | ||
@@ -93,3 +101,3 @@ where, | ||
}); | ||
this.ownersByCount = async ({ where, networks, pagination, }) => this.sdk.ownersByCount({ | ||
this.ownersByCount = async ({ where, pagination, networks = this.defaultNetworks, }) => this.sdk.ownersByCount({ | ||
where, | ||
@@ -99,4 +107,4 @@ networks, | ||
}); | ||
this.aggregateAttributes = async ({ where, networks, }) => this.sdk.aggregateAttributes({ where, networks }); | ||
this.salesVolume = async ({ where, networks, timeFilter, }) => this.sdk.salesVolume({ | ||
this.aggregateAttributes = async ({ where, networks = this.defaultNetworks, }) => this.sdk.aggregateAttributes({ where, networks }); | ||
this.salesVolume = async ({ where, networks = this.defaultNetworks, timeFilter, }) => this.sdk.salesVolume({ | ||
where, | ||
@@ -106,16 +114,17 @@ networks, | ||
}); | ||
this.ownerCount = async ({ where, networks }) => this.sdk.ownerCount({ | ||
this.ownerCount = async ({ where, networks = this.defaultNetworks, }) => this.sdk.ownerCount({ | ||
where, | ||
networks, | ||
}); | ||
this.floorPrice = async ({ where, networks }) => this.sdk.floorPrice({ | ||
this.floorPrice = async ({ where, networks = this.defaultNetworks, }) => this.sdk.floorPrice({ | ||
where, | ||
networks, | ||
}); | ||
this.nftCount = async ({ where, networks }) => this.sdk.nftCount({ | ||
this.nftCount = async ({ where, networks = this.defaultNetworks, }) => this.sdk.nftCount({ | ||
where, | ||
networks, | ||
}); | ||
this.search = async ({ pagination, query }) => this.sdk.fullTextSearch({ | ||
this.search = async ({ pagination, query, filter }) => this.sdk.fullTextSearch({ | ||
pagination, | ||
filter, | ||
query, | ||
@@ -122,0 +131,0 @@ }); |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.NftCountDocument = exports.OwnerCountDocument = exports.SalesVolumeDocument = exports.OwnersByCountDocument = exports.AggregateAttributesDocument = exports.TokenDocument = exports.TokensDocument = exports.CollectionsDocument = exports.MintsDocument = exports.MarketsDocument = exports.EventsDocument = exports.OwnerCountInfoFragmentDoc = exports.PageInfoDefaultFragmentDoc = exports.CollectionDetailsFragmentDoc = exports.CollectionInfoFragmentDoc = exports.TokenDetailsFragmentDoc = exports.EventInfoFragmentDoc = exports.TokenInfoFragmentDoc = exports.FullMediaFragmentDoc = exports.MintDetailsFragmentDoc = exports.TokenContractInfoFragmentDoc = exports.MarketDetailsFragmentDoc = exports.MarketPropertiesFullFragmentDoc = exports.V3AskPropertiesFragmentDoc = exports.V2AuctionMarketPropertiesFragmentDoc = exports.MarketInfoFragmentDoc = exports.SaleInfoFragmentDoc = exports.PriceSummaryFragmentDoc = exports.TransactionDetailsFragmentDoc = exports.V3AskStatus = exports.V3AskEventType = exports.V2AuctionStatus = exports.V2AuctionEventType = exports.V1MarketEventType = exports.V1MarketEntityStatus = exports.TokenSortKey = exports.SortDirection = exports.SaleType = exports.SaleSortKey = exports.Network = exports.MintSortKey = exports.MediaType = exports.MarketType = exports.MarketStatus = exports.MarketSortKey = exports.MarketCategory = exports.EventType = exports.EventSortKey = exports.CollectionSortKey = exports.Chain = void 0; | ||
exports.getSdk = exports.FullTextSearchDocument = exports.FloorPriceDocument = void 0; | ||
exports.SalesVolumeDocument = exports.OwnersByCountDocument = exports.AggregateAttributesDocument = exports.TokenDocument = exports.TokensDocument = exports.SalesDocument = exports.CollectionsDocument = exports.MintsDocument = exports.MarketsDocument = exports.EventsDocument = exports.OwnerCountInfoFragmentDoc = exports.PageInfoDefaultFragmentDoc = exports.CollectionDetailsFragmentDoc = exports.CollectionInfoFragmentDoc = exports.TokenDetailsFragmentDoc = exports.EventInfoFragmentDoc = exports.TokenInfoFragmentDoc = exports.FullMediaFragmentDoc = exports.MintDetailsFragmentDoc = exports.TokenContractInfoFragmentDoc = exports.MarketDetailsFragmentDoc = exports.MarketPropertiesFullFragmentDoc = exports.V3AskPropertiesFragmentDoc = exports.V2AuctionMarketPropertiesFragmentDoc = exports.MarketInfoFragmentDoc = exports.SaleInfoFragmentDoc = exports.PriceSummaryFragmentDoc = exports.TransactionDetailsFragmentDoc = exports.V3AskStatus = exports.V3AskEventType = exports.V2AuctionStatus = exports.V2AuctionEventType = exports.V1MarketEventType = exports.V1MarketEntityStatus = exports.TokenSortKey = exports.SortDirection = exports.SearchableEntity = exports.SaleType = exports.SaleSortKey = exports.Network = exports.MintSortKey = exports.MediaType = exports.MarketType = exports.MarketStatus = exports.MarketSortKey = exports.MarketCategory = exports.EventType = exports.EventSortKey = exports.CollectionSortKey = exports.Chain = void 0; | ||
exports.getSdk = exports.FullTextSearchDocument = exports.FloorPriceDocument = exports.NftCountDocument = exports.OwnerCountDocument = void 0; | ||
const tslib_1 = require("tslib"); | ||
@@ -97,2 +97,7 @@ const graphql_tag_1 = (0, tslib_1.__importDefault)(require("graphql-tag")); | ||
})(SaleType = exports.SaleType || (exports.SaleType = {})); | ||
var SearchableEntity; | ||
(function (SearchableEntity) { | ||
SearchableEntity["Collection"] = "COLLECTION"; | ||
SearchableEntity["Token"] = "TOKEN"; | ||
})(SearchableEntity = exports.SearchableEntity || (exports.SearchableEntity = {})); | ||
var SortDirection; | ||
@@ -533,2 +538,30 @@ (function (SortDirection) { | ||
${exports.CollectionDetailsFragmentDoc}`; | ||
exports.SalesDocument = (0, graphql_tag_1.default) ` | ||
query sales($networks: [NetworkInput!]!, $where: SalesQueryInput!, $filter: SalesQueryFilter, $sort: SaleSortKeySortInput!, $pagination: PaginationInput!, $includeFullDetails: Boolean!) { | ||
sales( | ||
networks: $networks | ||
where: $where | ||
filter: $filter | ||
sort: $sort | ||
pagination: $pagination | ||
) { | ||
hasNextPage | ||
pageInfo { | ||
limit | ||
offset | ||
} | ||
nodes { | ||
sale { | ||
...SaleInfo | ||
} | ||
token { | ||
...TokenInfo | ||
...TokenDetails @include(if: $includeFullDetails) | ||
} | ||
} | ||
} | ||
} | ||
${exports.SaleInfoFragmentDoc} | ||
${exports.TokenInfoFragmentDoc} | ||
${exports.TokenDetailsFragmentDoc}`; | ||
exports.TokensDocument = (0, graphql_tag_1.default) ` | ||
@@ -563,8 +596,2 @@ query tokens($networks: [NetworkInput!]!, $where: TokensQueryInput, $filter: TokensQueryFilter, $pagination: PaginationInput!, $sort: TokenSortInput!, $includeFullDetails: Boolean!, $includeSalesHistory: Boolean!) { | ||
} | ||
events( | ||
pagination: {limit: 10, offset: 0} | ||
sort: {sortKey: CREATED, sortDirection: DESC} | ||
) { | ||
...EventInfo | ||
} | ||
} | ||
@@ -577,4 +604,3 @@ } | ||
${exports.TokenDetailsFragmentDoc} | ||
${exports.SaleInfoFragmentDoc} | ||
${exports.EventInfoFragmentDoc}`; | ||
${exports.SaleInfoFragmentDoc}`; | ||
exports.TokenDocument = (0, graphql_tag_1.default) ` | ||
@@ -675,4 +701,4 @@ query token($network: NetworkInput!, $token: TokenInput!, $includeFullDetails: Boolean!) { | ||
exports.FullTextSearchDocument = (0, graphql_tag_1.default) ` | ||
query fullTextSearch($pagination: SearchPaginationInput!, $query: SearchQuery!) { | ||
search(pagination: $pagination, query: $query) { | ||
query fullTextSearch($pagination: SearchPaginationInput!, $query: SearchQueryInput!, $filter: SearchFilter) { | ||
search(pagination: $pagination, query: $query, filter: $filter) { | ||
hasNextPage | ||
@@ -708,2 +734,5 @@ pageInfo { | ||
}, | ||
sales(variables, requestHeaders) { | ||
return withWrapper((wrappedRequestHeaders) => client.request(exports.SalesDocument, variables, { ...requestHeaders, ...wrappedRequestHeaders }), 'sales'); | ||
}, | ||
tokens(variables, requestHeaders) { | ||
@@ -710,0 +739,0 @@ return withWrapper((wrappedRequestHeaders) => client.request(exports.TokensDocument, variables, { ...requestHeaders, ...wrappedRequestHeaders }), 'tokens'); |
export type { AggregateAttributesQueryVariables, CollectionSortKey, CollectionSortKeySortInput, CollectionsQuery, CollectionsQueryInput, SortDirection, TokenInput, TokenSortKey, TokensQuery, SalesVolumeQueryVariables, OwnersByCountQueryVariables, TokensQueryFilter, TokensQueryInput, } from './queries/queries-sdk'; | ||
import { CollectionsQuery, TokensQuery } from './queries/queries-sdk'; | ||
import { CollectionsQuery, TokenQuery, TokensQuery } from './queries/queries-sdk'; | ||
export declare type CollectionResponseList = CollectionsQuery['collections']['nodes']; | ||
export declare type CollectionResponseItem = CollectionResponseList[0]; | ||
export declare type TokenResponseList = TokensQuery['tokens']['nodes']; | ||
export declare type TokenResponseItem = TokenResponseList[0]; | ||
export declare type TokensResponseList = TokensQuery['tokens']['nodes']; | ||
export declare type TokensResponseItem = TokensResponseList[0]; | ||
export declare type TokenResponseItem = NonNullable<TokenQuery['token']>; |
{ | ||
"name": "@zoralabs/zdk-alpha", | ||
"version": "0.0.23", | ||
"version": "0.0.24", | ||
"description": "ZDK alpha for fetching data from graphql api", | ||
@@ -21,2 +21,3 @@ "repository": "https://github.com/ourzora/zdk-alpha", | ||
"@graphql-codegen/cli": "2.5.0", | ||
"@changesets/cli": "^2.22.0", | ||
"@graphql-codegen/typescript": "2.4.3", | ||
@@ -46,3 +47,3 @@ "@graphql-codegen/typescript-graphql-request": "4.3.4", | ||
"publish-prerelease": "npm publish --access public --tag=pre-release", | ||
"typegen": "graphql-code-generator", | ||
"gen-graphql-types": "graphql-code-generator", | ||
"test": "jest", | ||
@@ -64,3 +65,2 @@ "download-schemas": "npx get-graphql-schema $ZDK_ENDPOINT > graph-schemas/indexer-graph.graphql", | ||
"dependencies": { | ||
"@changesets/cli": "^2.22.0", | ||
"big.js": "^6.1.0", | ||
@@ -79,2 +79,2 @@ "changeset": "^0.2.6", | ||
} | ||
} | ||
} |
Sorry, the diff of this file is too big to display
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
156126
8
4286
22
- Removed@changesets/cli@^2.22.0
- Removed@babel/runtime@7.25.7(transitive)
- Removed@changesets/apply-release-plan@7.0.5(transitive)
- Removed@changesets/assemble-release-plan@6.0.4(transitive)
- Removed@changesets/changelog-git@0.2.0(transitive)
- Removed@changesets/cli@2.27.9(transitive)
- Removed@changesets/config@3.0.3(transitive)
- Removed@changesets/errors@0.2.0(transitive)
- Removed@changesets/get-dependents-graph@2.1.2(transitive)
- Removed@changesets/get-release-plan@4.0.4(transitive)
- Removed@changesets/get-version-range-type@0.4.0(transitive)
- Removed@changesets/git@3.0.1(transitive)
- Removed@changesets/logger@0.1.1(transitive)
- Removed@changesets/parse@0.4.0(transitive)
- Removed@changesets/pre@2.0.1(transitive)
- Removed@changesets/read@0.6.1(transitive)
- Removed@changesets/should-skip-package@0.1.1(transitive)
- Removed@changesets/types@4.1.06.0.0(transitive)
- Removed@changesets/write@0.3.2(transitive)
- Removed@manypkg/find-root@1.1.0(transitive)
- Removed@manypkg/get-packages@1.1.3(transitive)
- Removed@nodelib/fs.scandir@2.1.5(transitive)
- Removed@nodelib/fs.stat@2.0.5(transitive)
- Removed@nodelib/fs.walk@1.2.8(transitive)
- Removed@types/node@12.20.55(transitive)
- Removedansi-colors@4.1.3(transitive)
- Removedansi-regex@5.0.1(transitive)
- Removedargparse@1.0.10(transitive)
- Removedarray-union@2.1.0(transitive)
- Removedbetter-path-resolve@1.0.0(transitive)
- Removedbraces@3.0.3(transitive)
- Removedchardet@0.7.0(transitive)
- Removedci-info@3.9.0(transitive)
- Removedcross-spawn@5.1.0(transitive)
- Removeddetect-indent@6.1.0(transitive)
- Removeddir-glob@3.0.1(transitive)
- Removedenquirer@2.4.1(transitive)
- Removedesprima@4.0.1(transitive)
- Removedextendable-error@0.1.7(transitive)
- Removedexternal-editor@3.1.0(transitive)
- Removedfast-glob@3.3.2(transitive)
- Removedfastq@1.17.1(transitive)
- Removedfill-range@7.1.1(transitive)
- Removedfind-up@4.1.0(transitive)
- Removedfs-extra@7.0.18.1.0(transitive)
- Removedglob-parent@5.1.2(transitive)
- Removedglobby@11.1.0(transitive)
- Removedgraceful-fs@4.2.11(transitive)
- Removedhuman-id@1.0.2(transitive)
- Removediconv-lite@0.4.24(transitive)
- Removedignore@5.3.2(transitive)
- Removedis-extglob@2.1.1(transitive)
- Removedis-glob@4.0.3(transitive)
- Removedis-number@7.0.0(transitive)
- Removedis-subdir@1.2.0(transitive)
- Removedis-windows@1.0.2(transitive)
- Removedisexe@2.0.0(transitive)
- Removedjs-yaml@3.14.1(transitive)
- Removedjsonfile@4.0.0(transitive)
- Removedlocate-path@5.0.0(transitive)
- Removedlodash.startcase@4.4.0(transitive)
- Removedlru-cache@4.1.5(transitive)
- Removedmerge2@1.4.1(transitive)
- Removedmicromatch@4.0.8(transitive)
- Removedmri@1.2.0(transitive)
- Removedos-tmpdir@1.0.2(transitive)
- Removedoutdent@0.5.0(transitive)
- Removedp-filter@2.1.0(transitive)
- Removedp-limit@2.3.0(transitive)
- Removedp-locate@4.1.0(transitive)
- Removedp-map@2.1.0(transitive)
- Removedp-try@2.2.0(transitive)
- Removedpackage-manager-detector@0.2.0(transitive)
- Removedpath-exists@4.0.0(transitive)
- Removedpath-type@4.0.0(transitive)
- Removedpicocolors@1.1.0(transitive)
- Removedpicomatch@2.3.1(transitive)
- Removedpify@4.0.1(transitive)
- Removedprettier@2.8.8(transitive)
- Removedpseudomap@1.0.2(transitive)
- Removedqueue-microtask@1.2.3(transitive)
- Removedread-yaml-file@1.1.0(transitive)
- Removedregenerator-runtime@0.14.1(transitive)
- Removedresolve-from@5.0.0(transitive)
- Removedreusify@1.0.4(transitive)
- Removedrun-parallel@1.2.0(transitive)
- Removedsafer-buffer@2.1.2(transitive)
- Removedsemver@7.6.3(transitive)
- Removedshebang-command@1.2.0(transitive)
- Removedshebang-regex@1.0.0(transitive)
- Removedsignal-exit@3.0.7(transitive)
- Removedslash@3.0.0(transitive)
- Removedspawndamnit@2.0.0(transitive)
- Removedsprintf-js@1.0.3(transitive)
- Removedstrip-ansi@6.0.1(transitive)
- Removedstrip-bom@3.0.0(transitive)
- Removedterm-size@2.2.1(transitive)
- Removedtmp@0.0.33(transitive)
- Removedto-regex-range@5.0.1(transitive)
- Removeduniversalify@0.1.2(transitive)
- Removedwhich@1.3.1(transitive)
- Removedyallist@2.1.2(transitive)