fontdue-js 3.7.0 → 3.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/README.md +8 -5
  3. package/dist/__generated__/AddToCartBannerQuery.graphql.d.ts +1 -1
  4. package/dist/__generated__/AddToCartBannerQuery.graphql.js +16 -10
  5. package/dist/__generated__/AddToCartBanner_item.graphql.d.ts +4 -1
  6. package/dist/__generated__/AddToCartBanner_item.graphql.js +7 -2
  7. package/dist/__generated__/AddToCartBanner_order.graphql.d.ts +4 -1
  8. package/dist/__generated__/AddToCartBanner_order.graphql.js +6 -1
  9. package/dist/__generated__/BuyButtonIDQuery.graphql.d.ts +3 -3
  10. package/dist/__generated__/BuyButtonIDQuery.graphql.js +31 -16
  11. package/dist/__generated__/BuyButtonPackIDQuery.graphql.d.ts +21 -0
  12. package/dist/__generated__/BuyButtonPackIDQuery.graphql.js +129 -0
  13. package/dist/__generated__/BuyButtonPackSlugQuery.graphql.d.ts +25 -0
  14. package/dist/__generated__/BuyButtonPackSlugQuery.graphql.js +167 -0
  15. package/dist/__generated__/BuyButtonSlugQuery.graphql.d.ts +3 -3
  16. package/dist/__generated__/BuyButtonSlugQuery.graphql.js +45 -17
  17. package/dist/__generated__/BuyButton_product.graphql.d.ts +27 -0
  18. package/dist/__generated__/BuyButton_product.graphql.js +72 -0
  19. package/dist/__generated__/CartItemProduct_product.graphql.d.ts +1 -1
  20. package/dist/__generated__/CartItemProduct_product.graphql.js +7 -2
  21. package/dist/__generated__/CartOrderCompleteOrderMutation.graphql.d.ts +1 -1
  22. package/dist/__generated__/CartOrderCompleteOrderMutation.graphql.js +26 -20
  23. package/dist/__generated__/CartOrderRemoveDiscountMutation.graphql.d.ts +1 -1
  24. package/dist/__generated__/CartOrderRemoveDiscountMutation.graphql.js +26 -20
  25. package/dist/__generated__/CartOrderUpdateMutation.graphql.d.ts +1 -1
  26. package/dist/__generated__/CartOrderUpdateMutation.graphql.js +26 -20
  27. package/dist/__generated__/CartQuery.graphql.d.ts +1 -1
  28. package/dist/__generated__/CartQuery.graphql.js +26 -20
  29. package/dist/__generated__/CartStateUpdateMutation.graphql.d.ts +1 -1
  30. package/dist/__generated__/CartStateUpdateMutation.graphql.js +26 -20
  31. package/dist/__generated__/CheckoutUpdateCustomerMutation.graphql.d.ts +1 -1
  32. package/dist/__generated__/CheckoutUpdateCustomerMutation.graphql.js +26 -20
  33. package/dist/__generated__/CheckoutUpdateOrderMutation.graphql.d.ts +1 -1
  34. package/dist/__generated__/CheckoutUpdateOrderMutation.graphql.js +26 -20
  35. package/dist/__generated__/CollectionAa_Query.graphql.d.ts +1 -1
  36. package/dist/__generated__/CollectionAa_Query.graphql.js +20 -14
  37. package/dist/__generated__/CollectionAa_product.graphql.d.ts +7 -1
  38. package/dist/__generated__/CollectionAa_product.graphql.js +22 -16
  39. package/dist/__generated__/NodePasswordFormElementIDQuery.graphql.d.ts +3 -3
  40. package/dist/__generated__/NodePasswordFormElementIDQuery.graphql.js +9 -9
  41. package/dist/__generated__/NodePasswordFormElementPackSlugQuery.graphql.d.ts +25 -0
  42. package/dist/__generated__/NodePasswordFormElementPackSlugQuery.graphql.js +108 -0
  43. package/dist/__generated__/PrecartAddToCartMutation.graphql.d.ts +1 -1
  44. package/dist/__generated__/PrecartAddToCartMutation.graphql.js +32 -26
  45. package/dist/__generated__/StoreModalCartQuery.graphql.d.ts +1 -1
  46. package/dist/__generated__/StoreModalCartQuery.graphql.js +37 -31
  47. package/dist/__generated__/StoreModalIndexPackItem_fontPack.graphql.d.ts +23 -0
  48. package/dist/__generated__/StoreModalIndexPackItem_fontPack.graphql.js +58 -0
  49. package/dist/__generated__/StoreModalIndexQuery.graphql.d.ts +9 -1
  50. package/dist/__generated__/StoreModalIndexQuery.graphql.js +174 -110
  51. package/dist/__generated__/StoreModalPackButton_fontPack.graphql.d.ts +33 -0
  52. package/dist/__generated__/StoreModalPackButton_fontPack.graphql.js +119 -0
  53. package/dist/__generated__/StoreModalPack_fontPack.graphql.d.ts +45 -0
  54. package/dist/__generated__/StoreModalPack_fontPack.graphql.js +150 -0
  55. package/dist/__generated__/StoreModalProductContent_collection.graphql.d.ts +3 -2
  56. package/dist/__generated__/StoreModalProductContent_collection.graphql.js +36 -19
  57. package/dist/__generated__/{StoreModalProductLicenseSelection_collection.graphql.d.ts → StoreModalProductLicenseSelection_licenseable.graphql.d.ts} +6 -6
  58. package/dist/__generated__/{StoreModalProductLicenseSelection_collection.graphql.js → StoreModalProductLicenseSelection_licenseable.graphql.js} +5 -5
  59. package/dist/__generated__/StoreModalProductQuery.graphql.d.ts +1 -1
  60. package/dist/__generated__/StoreModalProductQuery.graphql.js +159 -103
  61. package/dist/__generated__/StoreModalProductRefetchQuery.graphql.d.ts +1 -1
  62. package/dist/__generated__/StoreModalProductRefetchQuery.graphql.js +184 -128
  63. package/dist/__generated__/StoreModalProductSlugQuery.graphql.d.ts +5 -1
  64. package/dist/__generated__/StoreModalProductSlugQuery.graphql.js +248 -171
  65. package/dist/__generated__/StoreModalProductSummaryRefetchQuery.graphql.d.ts +1 -1
  66. package/dist/__generated__/StoreModalProductSummaryRefetchQuery.graphql.js +9 -4
  67. package/dist/__generated__/StoreModalProductSummary_viewer.graphql.d.ts +7 -1
  68. package/dist/__generated__/StoreModalProductSummary_viewer.graphql.js +7 -2
  69. package/dist/__generated__/TestFontsFormUpdateCustomerMutation.graphql.d.ts +1 -1
  70. package/dist/__generated__/TestFontsFormUpdateCustomerMutation.graphql.js +26 -20
  71. package/dist/__generated__/TestFontsForm_Query.graphql.d.ts +14 -2
  72. package/dist/__generated__/TestFontsForm_Query.graphql.js +76 -18
  73. package/dist/__generated__/productState_Query.graphql.d.ts +99 -1
  74. package/dist/__generated__/productState_Query.graphql.js +43 -4
  75. package/dist/__generated__/productState_fontPack.graphql.d.ts +111 -0
  76. package/dist/__generated__/productState_fontPack.graphql.js +117 -0
  77. package/dist/__tests__/bundleSelectionOrder.test.js +2 -0
  78. package/dist/__tests__/collectionBundleSelection.test.js +2 -0
  79. package/dist/__tests__/fontPackSelection.test.js +435 -0
  80. package/dist/__tests__/licenseExclusions.test.js +2 -0
  81. package/dist/__tests__/storeModalPackButton.test.js +102 -0
  82. package/dist/__tests__/storeModalPackUnlisted.test.js +112 -0
  83. package/dist/__tests__/storeModalRoutes.test.js +9 -0
  84. package/dist/__tests__/testFontsFamilyChoice.test.js +150 -0
  85. package/dist/components/AddToCartBanner/index.js +1 -1
  86. package/dist/components/BuyButton/index.d.ts +29 -9
  87. package/dist/components/BuyButton/index.js +123 -26
  88. package/dist/components/BuyButton/index.server.d.ts +4 -2
  89. package/dist/components/BuyButton/index.server.js +24 -3
  90. package/dist/components/Cart/CartItem/CartItemProduct.js +3 -3
  91. package/dist/components/CollectionAa/index.js +2 -2
  92. package/dist/components/ConfigContext.d.ts +11 -0
  93. package/dist/components/ConfigContext.js +7 -1
  94. package/dist/components/NodePasswordForm/NodePasswordFormElement.d.ts +1 -1
  95. package/dist/components/NodePasswordForm/NodePasswordFormElement.js +45 -21
  96. package/dist/components/NodePasswordForm/index.d.ts +7 -4
  97. package/dist/components/NodePasswordForm/index.js +6 -6
  98. package/dist/components/Root/productState.js +57 -7
  99. package/dist/components/StoreModal/StoreModalFamily.d.ts +7 -0
  100. package/dist/components/StoreModal/StoreModalFamily.js +7 -5
  101. package/dist/components/StoreModal/StoreModalIndex.js +13 -3
  102. package/dist/components/StoreModal/StoreModalIndexEntry.d.ts +13 -0
  103. package/dist/components/StoreModal/StoreModalIndexEntry.js +43 -0
  104. package/dist/components/StoreModal/StoreModalIndexItem.js +7 -30
  105. package/dist/components/StoreModal/StoreModalIndexPackItem.d.ts +7 -0
  106. package/dist/components/StoreModal/StoreModalIndexPackItem.js +21 -0
  107. package/dist/components/StoreModal/StoreModalPack.d.ts +9 -0
  108. package/dist/components/StoreModal/StoreModalPack.js +79 -0
  109. package/dist/components/StoreModal/StoreModalPackButton.d.ts +8 -0
  110. package/dist/components/StoreModal/StoreModalPackButton.js +53 -0
  111. package/dist/components/StoreModal/StoreModalProduct.js +38 -15
  112. package/dist/components/StoreModalProductLicenseSelection/index.d.ts +3 -3
  113. package/dist/components/StoreModalProductLicenseSelection/index.js +6 -6
  114. package/dist/components/StoreModalProductSummary/index.js +1 -1
  115. package/dist/components/TestFontsForm/TestFontsFormElement.d.ts +4 -1
  116. package/dist/components/TestFontsForm/TestFontsFormElement.js +11 -3
  117. package/dist/components/TestFontsForm/index.d.ts +6 -3
  118. package/dist/components/TestFontsForm/index.js +82 -13
  119. package/dist/components/TestFontsForm/index.server.js +2 -1
  120. package/dist/components/TestFontsForm/variables.d.ts +8 -0
  121. package/dist/components/TestFontsForm/variables.js +22 -0
  122. package/dist/components/elements/StoreModalFamily/index.d.ts +1 -1
  123. package/dist/components/elements/StoreModalFamily/index.js +1 -1
  124. package/dist/fontdue.css +13 -0
  125. package/dist/reducer.d.ts +7 -0
  126. package/dist/reducer.js +9 -0
  127. package/dist/selection.d.ts +5 -1
  128. package/dist/selection.js +61 -16
  129. package/dist/storeModalRoutes.js +5 -4
  130. package/dist/version.js +1 -1
  131. package/package.json +1 -1
  132. package/dist/__generated__/BuyButton_collection.graphql.d.ts +0 -25
  133. package/dist/__generated__/BuyButton_collection.graphql.js +0 -49
  134. package/fontdue.css +0 -2733
  135. package/fontdue.css.map +0 -1
package/dist/selection.js CHANGED
@@ -19,8 +19,14 @@
19
19
  * wins, then the one with the fewest SKUs – so a variable font comes along with
20
20
  * a collection bundle priced like its static family, and a family beats its two
21
21
  * halves at the same price.
22
+ *
23
+ * On a product page, a pick the page shows only sits inside SKUs the page shows
24
+ * (see `viewedProduct`).
22
25
  */
23
26
 
27
+ // The product page being viewed and every SKU its fetch returned – what the
28
+ // page renders.
29
+
24
30
  // Nodes the exact search may visit per part of the catalog before it settles
25
31
  // for the best combination found so far. Real catalogs finish far below it; it
26
32
  // only bounds pathological ones.
@@ -159,6 +165,23 @@ const containersOf = (index, pick) => {
159
165
  return containers;
160
166
  };
161
167
 
168
+ // The containers a pick may sit inside. Every product the buyer has seen – or
169
+ // has a BuyButton for on the host page – stays in the catalog, so on a product
170
+ // page a pick the page shows only sits inside SKUs the page shows. Otherwise a
171
+ // font pack seen earlier would take a member family's styles on the family's
172
+ // own page, with a SKU that page doesn't show (even a family sold only by the
173
+ // style), and a family seen earlier would take the pack page's partial block
174
+ // of its styles (FD-79). A SKU granting exactly the pick's styles at its price
175
+ // is the pick as far as the index goes – only one of two such twins is
176
+ // offered – so it always stays.
177
+ const holdersOf = (index, pick, viewed) => {
178
+ const containers = containersOf(index, pick);
179
+ if (!(viewed !== null && viewed !== void 0 && viewed.skuIds.has(pick))) return containers;
180
+ const size = index.granted.get(pick).size;
181
+ const price = index.catalog.skuPrices[pick];
182
+ return containers.filter(skuId => viewed.skuIds.has(skuId) || index.granted.get(skuId).size === size && index.catalog.skuPrices[skuId] === price);
183
+ };
184
+
162
185
  // The parts a pick's styles belong to.
163
186
  const partsOf = (index, pick) => {
164
187
  const cached = index.parts.get(pick);
@@ -199,27 +222,30 @@ const notNull = value => value !== null;
199
222
  * cheapestSkuIds(['sku:bold', 'sku:regular', 'sku:light'], catalog)
200
223
  * // => ['sku:light+regular+bold'] rather than a pair plus a single
201
224
  */
202
- export const cheapestSkuIds = (picks, catalog) => cheapestCombination(picks, catalog).skuIds;
203
- const selectionCost = (picks, catalog) => cheapestCombination(picks, catalog).cost;
204
- const cheapestCombination = (picks, catalog) => {
225
+ export const cheapestSkuIds = function (picks, catalog) {
226
+ let viewed = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
227
+ return cheapestCombination(picks, catalog, viewed).skuIds;
228
+ };
229
+ const selectionCost = (picks, catalog, viewed) => cheapestCombination(picks, catalog, viewed).cost;
230
+ const cheapestCombination = (picks, catalog, viewed) => {
205
231
  const index = indexFor(catalog);
206
232
  const priceable = [...new Set(picks)].filter(pick => index.granted.has(pick)).sort();
207
- return cover(priceable, new Set(), index) ?? EMPTY_COVER;
233
+ return cover(priceable, new Set(), index, viewed) ?? EMPTY_COVER;
208
234
  };
209
235
 
210
236
  // The cheapest cover of `picks` (sorted) without the `excluded` bridges, or
211
237
  // null when some pick has nowhere to sit without them.
212
- const cover = (picks, excluded, index) => {
238
+ const cover = (picks, excluded, index, viewed) => {
213
239
  if (picks.length === 0) return EMPTY_COVER;
214
- const key = `${picks.join(',')}#${[...excluded].sort().join(',')}`;
240
+ const key = `${picks.join(',')}#${[...excluded].sort().join(',')}@${(viewed === null || viewed === void 0 ? void 0 : viewed.id) ?? ''}`;
215
241
  if (index.covers.has(key)) return index.covers.get(key);
216
- const result = coverUncached(picks, excluded, index);
242
+ const result = coverUncached(picks, excluded, index, viewed);
217
243
  if (index.covers.size >= MEMO_LIMIT) index.covers.clear();
218
244
  index.covers.set(key, result);
219
245
  return result;
220
246
  };
221
- const coverUncached = (picks, excluded, index) => {
222
- const available = new Map(picks.map(pick => [pick, containersOf(index, pick).filter(id => !excluded.has(id))]));
247
+ const coverUncached = (picks, excluded, index, viewed) => {
248
+ const available = new Map(picks.map(pick => [pick, holdersOf(index, pick, viewed).filter(id => !excluded.has(id))]));
223
249
  if (picks.some(pick => available.get(pick).length === 0)) return null;
224
250
  const parts = [...new Set(picks.flatMap(pick => [...partsOf(index, pick)]))];
225
251
  if (parts.length === 1) return branchAndBound(picks, available, index);
@@ -248,7 +274,7 @@ const coverUncached = (picks, excluded, index) => {
248
274
  const [part] = partsOf(index, pick);
249
275
  picksByGroup[groupOfPart.get(part)].push(pick);
250
276
  }
251
- const covers = picksByGroup.map(group => cover(group, excluded, index));
277
+ const covers = picksByGroup.map(group => cover(group, excluded, index, viewed));
252
278
  return covers.every(notNull) ? combine(covers) : null;
253
279
  }
254
280
 
@@ -258,13 +284,13 @@ const coverUncached = (picks, excluded, index) => {
258
284
  bridge
259
285
  } = joining[0];
260
286
  const withoutBridge = new Set([...excluded, bridge]);
261
- const rest = cover(picks.filter(pick => !available.get(pick).includes(bridge)), withoutBridge, index);
287
+ const rest = cover(picks.filter(pick => !available.get(pick).includes(bridge)), withoutBridge, index, viewed);
262
288
  const including = rest && combine([{
263
289
  skuIds: [bridge],
264
290
  cost: index.catalog.skuPrices[bridge],
265
291
  granted: index.granted.get(bridge)
266
292
  }, rest]);
267
- const excluding = cover(picks, withoutBridge, index);
293
+ const excluding = cover(picks, withoutBridge, index, viewed);
268
294
  if (!including || !excluding) return including ?? excluding;
269
295
  return isBetter(including, excluding) ? including : excluding;
270
296
  };
@@ -393,6 +419,23 @@ const greedyCover = (options, all) => {
393
419
  // Selection state
394
420
  // ---------------------------------------------------------------------------
395
421
 
422
+ const viewedSkuIdsCache = new WeakMap();
423
+
424
+ // The product page the Store Modal is on – as the page reports it, so one
425
+ // opened by slug counts the same as one opened by id – or null off a product
426
+ // page and while the product's fetch is still in flight. productState records
427
+ // every SKU a product's fetch returned, which is what its page renders.
428
+ const viewedProduct = state => {
429
+ const productId = state.viewedProductId;
430
+ const skuIds = productId ? state.productSkuIds[productId] : undefined;
431
+ if (!productId || !skuIds) return null;
432
+ if (!viewedSkuIdsCache.has(skuIds)) viewedSkuIdsCache.set(skuIds, new Set(skuIds));
433
+ return {
434
+ id: productId,
435
+ skuIds: viewedSkuIdsCache.get(skuIds)
436
+ };
437
+ };
438
+
396
439
  /**
397
440
  * Re-derives `selectedSkuIds` from the picks. A pick whose styles or price
398
441
  * aren't known yet – selected from the host page before its product data
@@ -400,7 +443,7 @@ const greedyCover = (options, all) => {
400
443
  */
401
444
  export const repriceSelection = state => {
402
445
  const unpriceable = state.requestedSkuIds.filter(skuId => !isPriceable(state, skuId));
403
- const skuIds = union(cheapestSkuIds(state.requestedSkuIds, state), unpriceable);
446
+ const skuIds = union(cheapestSkuIds(state.requestedSkuIds, state, viewedProduct(state)), unpriceable);
404
447
  const unchanged = selectedSkuIdList(state).length === skuIds.length && skuIds.every(skuId => state.selectedSkuIds[skuId]);
405
448
  return unchanged ? state : {
406
449
  ...state,
@@ -476,18 +519,20 @@ const costCache = new WeakMap();
476
519
  */
477
520
  export const additionalCost = (state, skuId) => {
478
521
  if (!isPriceable(state, skuId)) return null;
522
+ const viewed = viewedProduct(state);
479
523
  let cache = costCache.get(state.requestedSkuIds);
480
- if (!cache || cache.skuStyleIds !== state.skuStyleIds || cache.skuPrices !== state.skuPrices) {
524
+ if (!cache || cache.skuStyleIds !== state.skuStyleIds || cache.skuPrices !== state.skuPrices || cache.viewedId !== ((viewed === null || viewed === void 0 ? void 0 : viewed.id) ?? null)) {
481
525
  cache = {
482
526
  skuStyleIds: state.skuStyleIds,
483
527
  skuPrices: state.skuPrices,
484
- base: selectionCost(state.requestedSkuIds, state),
528
+ viewedId: (viewed === null || viewed === void 0 ? void 0 : viewed.id) ?? null,
529
+ base: selectionCost(state.requestedSkuIds, state, viewed),
485
530
  costs: new Map()
486
531
  };
487
532
  costCache.set(state.requestedSkuIds, cache);
488
533
  }
489
534
  if (!cache.costs.has(skuId)) {
490
- const withSku = selectionCost(union(state.requestedSkuIds, [skuId]), state);
535
+ const withSku = selectionCost(union(state.requestedSkuIds, [skuId]), state, viewed);
491
536
  cache.costs.set(skuId, withSku - cache.base);
492
537
  }
493
538
  return cache.costs.get(skuId);
@@ -28,10 +28,11 @@ function isGlobalId(value) {
28
28
  * `index` has to carry the configured `indexExcludeTags` — a route dispatched
29
29
  * without them lists collections the store front deliberately leaves out.
30
30
  *
31
- * A product is addressed by either its collection id or its slug, the same two
32
- * identifiers `BuyButton` takes. The route passes whichever it was given
33
- * through to the product query; a slug that names nothing (or names an article
34
- * rather than a collection) lands on the modal's "Collection not found".
31
+ * A product (a collection or a font pack) is addressed by either its id or its
32
+ * slug, the same two identifiers `BuyButton` takes. The route passes whichever
33
+ * it was given through to the product query; a slug that names nothing (or
34
+ * names an article rather than a product) lands on the modal's "Product not
35
+ * found".
35
36
  */
36
37
  const routes = {
37
38
  '^index$': config => ({
package/dist/version.js CHANGED
@@ -8,4 +8,4 @@
8
8
  // (Fontage.ClientVersions) to spot sites that need to upgrade before a
9
9
  // feature that depends on a newer client can work for them.
10
10
  export const CLIENT_VERSION_HEADER = 'fontdue-client-version';
11
- export const version = "3.7.0";
11
+ export const version = "3.9.0";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fontdue-js",
3
- "version": "3.7.0",
3
+ "version": "3.9.0",
4
4
  "type": "module",
5
5
  "scripts": {
6
6
  "build": "npm run relay && run-p build-js build-css build-ts",
@@ -1,25 +0,0 @@
1
- /**
2
- * @generated SignedSource<<2e0d1867d52ad59c939fc952ee3f136a>>
3
- * @lightSyntaxTransform
4
- * @nogrep
5
- */
6
- import { ReaderFragment } from 'relay-runtime';
7
- import { FragmentRefs } from "relay-runtime";
8
- export type BuyButton_collection$data = {
9
- readonly fontStyles: ReadonlyArray<{
10
- readonly sku: {
11
- readonly id: string;
12
- } | null;
13
- }>;
14
- readonly id: string;
15
- readonly sku: {
16
- readonly id: string;
17
- } | null;
18
- readonly " $fragmentType": "BuyButton_collection";
19
- };
20
- export type BuyButton_collection$key = {
21
- readonly " $data"?: BuyButton_collection$data;
22
- readonly " $fragmentSpreads": FragmentRefs<"BuyButton_collection">;
23
- };
24
- declare const node: ReaderFragment;
25
- export default node;
@@ -1,49 +0,0 @@
1
- /**
2
- * @generated SignedSource<<2e0d1867d52ad59c939fc952ee3f136a>>
3
- * @lightSyntaxTransform
4
- * @nogrep
5
- */
6
-
7
- /* tslint:disable */
8
- /* eslint-disable */
9
- // @ts-nocheck
10
-
11
- const node = function () {
12
- var v0 = {
13
- "alias": null,
14
- "args": null,
15
- "kind": "ScalarField",
16
- "name": "id",
17
- "storageKey": null
18
- },
19
- v1 = {
20
- "alias": null,
21
- "args": null,
22
- "concreteType": "Sku",
23
- "kind": "LinkedField",
24
- "name": "sku",
25
- "plural": false,
26
- "selections": [v0 /*: any*/],
27
- "storageKey": null
28
- };
29
- return {
30
- "argumentDefinitions": [],
31
- "kind": "Fragment",
32
- "metadata": null,
33
- "name": "BuyButton_collection",
34
- "selections": [v0 /*: any*/, v1 /*: any*/, {
35
- "alias": null,
36
- "args": null,
37
- "concreteType": "FontStyle",
38
- "kind": "LinkedField",
39
- "name": "fontStyles",
40
- "plural": true,
41
- "selections": [v1 /*: any*/],
42
- "storageKey": null
43
- }],
44
- "type": "FontCollection",
45
- "abstractKey": null
46
- };
47
- }();
48
- node.hash = "9c47030d7450494449d4aa5bda16e27e";
49
- export default node;