@apollo/client 3.12.0-rc.3 → 3.12.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 (119) hide show
  1. package/CHANGELOG.md +66 -0
  2. package/README.md +2 -0
  3. package/apollo-client.cjs +69 -66
  4. package/apollo-client.cjs.map +1 -1
  5. package/apollo-client.min.cjs +1 -1
  6. package/cache/cache.cjs +4 -165
  7. package/cache/cache.cjs.map +1 -1
  8. package/cache/cache.cjs.native.js +4 -165
  9. package/cache/core/cache.js +1 -1
  10. package/cache/core/cache.js.map +1 -1
  11. package/cache/inmemory/policies.js +1 -1
  12. package/cache/inmemory/policies.js.map +1 -1
  13. package/config/jest/setup.js +0 -2
  14. package/config/jest/setup.js.map +1 -1
  15. package/core/QueryManager.js +1 -1
  16. package/core/QueryManager.js.map +1 -1
  17. package/core/core.cjs +4 -188
  18. package/core/core.cjs.map +1 -1
  19. package/core/core.cjs.native.js +4 -188
  20. package/dev/dev.cjs +37 -37
  21. package/dev/dev.cjs.map +1 -1
  22. package/dev/dev.cjs.native.js +37 -37
  23. package/invariantErrorCodes.js +42 -42
  24. package/link/core/ApolloLink.js +2 -2
  25. package/link/core/core.cjs +2 -2
  26. package/link/core/core.cjs.map +1 -1
  27. package/link/core/core.cjs.native.js +2 -2
  28. package/link/http/checkFetcher.js +1 -1
  29. package/link/http/createHttpLink.js +1 -1
  30. package/link/http/http.cjs +3 -3
  31. package/link/http/http.cjs.map +1 -1
  32. package/link/http/http.cjs.native.js +3 -3
  33. package/link/http/serializeFetchParameter.js +1 -1
  34. package/link/persisted-queries/index.js +2 -2
  35. package/link/persisted-queries/persisted-queries.cjs +2 -2
  36. package/link/persisted-queries/persisted-queries.cjs.map +1 -1
  37. package/link/persisted-queries/persisted-queries.cjs.native.js +2 -2
  38. package/link/utils/toPromise.js +1 -1
  39. package/link/utils/utils.cjs +2 -2
  40. package/link/utils/utils.cjs.map +1 -1
  41. package/link/utils/utils.cjs.native.js +2 -2
  42. package/link/utils/validateOperation.js +1 -1
  43. package/masking/__benches__/types.bench.d.ts +2 -0
  44. package/masking/__benches__/types.bench.js +131 -0
  45. package/masking/__benches__/types.bench.js.map +1 -0
  46. package/masking/index.d.ts +3 -0
  47. package/masking/index.js +3 -1
  48. package/masking/index.js.map +1 -1
  49. package/masking/internal/types.d.ts +114 -9
  50. package/masking/internal/types.js.map +1 -1
  51. package/masking/maskDefinition.d.ts +14 -0
  52. package/{core/masking.js → masking/maskDefinition.js} +6 -77
  53. package/masking/maskDefinition.js.map +1 -0
  54. package/masking/maskFragment.d.ts +4 -0
  55. package/masking/maskFragment.js +43 -0
  56. package/masking/maskFragment.js.map +1 -0
  57. package/masking/maskOperation.d.ts +4 -0
  58. package/masking/maskOperation.js +29 -0
  59. package/masking/maskOperation.js.map +1 -0
  60. package/masking/masking.cjs +202 -0
  61. package/masking/masking.cjs.map +1 -1
  62. package/masking/masking.cjs.native.js +202 -0
  63. package/masking/types.d.ts +4 -4
  64. package/masking/types.js.map +1 -1
  65. package/masking/utils.d.ts +11 -0
  66. package/masking/utils.js +17 -0
  67. package/masking/utils.js.map +1 -0
  68. package/package.json +10 -7
  69. package/react/hoc/hoc.cjs.map +1 -1
  70. package/react/hoc/mutation-hoc.js +3 -2
  71. package/react/hoc/mutation-hoc.js.map +1 -1
  72. package/react/internal/internal.cjs +1 -1
  73. package/react/internal/internal.cjs.map +1 -1
  74. package/react/internal/internal.cjs.native.js +1 -1
  75. package/testing/internal/disposables/index.d.ts +0 -1
  76. package/testing/internal/disposables/index.js +0 -1
  77. package/testing/internal/disposables/index.js.map +1 -1
  78. package/testing/internal/index.d.ts +4 -1
  79. package/testing/internal/index.js +4 -1
  80. package/testing/internal/index.js.map +1 -1
  81. package/testing/internal/rtl/actAsync.d.ts +2 -0
  82. package/testing/internal/rtl/actAsync.js +21 -0
  83. package/testing/internal/rtl/actAsync.js.map +1 -0
  84. package/testing/internal/rtl/renderAsync.d.ts +9 -0
  85. package/testing/internal/rtl/renderAsync.js +23 -0
  86. package/testing/internal/rtl/renderAsync.js.map +1 -0
  87. package/testing/internal/rtl/renderHookAsync.d.ts +8 -0
  88. package/testing/internal/rtl/renderHookAsync.js +45 -0
  89. package/testing/internal/rtl/renderHookAsync.js.map +1 -0
  90. package/testing/internal/scenarios/index.d.ts +10 -0
  91. package/testing/internal/scenarios/index.js +9 -2
  92. package/testing/internal/scenarios/index.js.map +1 -1
  93. package/utilities/globals/globals.cjs +1 -1
  94. package/utilities/globals/globals.cjs.map +1 -1
  95. package/utilities/globals/globals.cjs.native.js +1 -1
  96. package/version.js +1 -1
  97. package/.changeset/brown-readers-smash.md +0 -5
  98. package/.changeset/clean-turkeys-kick.md +0 -5
  99. package/.changeset/cold-apes-bow.md +0 -5
  100. package/.changeset/early-bobcats-eat.md +0 -5
  101. package/.changeset/flat-beans-knock.md +0 -15
  102. package/.changeset/gorgeous-zebras-confess.md +0 -5
  103. package/.changeset/itchy-penguins-worry.md +0 -5
  104. package/.changeset/kind-toys-tie.md +0 -5
  105. package/.changeset/long-zoos-ring.md +0 -5
  106. package/.changeset/mean-bottles-travel.md +0 -5
  107. package/.changeset/nasty-camels-pay.md +0 -36
  108. package/.changeset/nervous-owls-hear.md +0 -5
  109. package/.changeset/nice-countries-share.md +0 -5
  110. package/.changeset/perfect-jobs-flow.md +0 -5
  111. package/.changeset/pre.json +0 -26
  112. package/.changeset/slimy-points-end.md +0 -5
  113. package/.changeset/small-bears-confess.md +0 -5
  114. package/.changeset/wicked-pans-appear.md +0 -5
  115. package/core/masking.d.ts +0 -10
  116. package/core/masking.js.map +0 -1
  117. package/testing/internal/disposables/disableActWarnings.d.ts +0 -9
  118. package/testing/internal/disposables/disableActWarnings.js +0 -15
  119. package/testing/internal/disposables/disableActWarnings.js.map +0 -1
@@ -0,0 +1,131 @@
1
+ import { attest, bench } from "@ark/attest";
2
+ import { expectTypeOf } from "expect-type";
3
+ import { setup } from "@ark/attest";
4
+ setup({
5
+ updateSnapshots: !process.env.CI,
6
+ });
7
+ function test(name, fn) {
8
+ fn(name + ": ");
9
+ }
10
+ test("unmasks deeply nested fragments", function (prefix) {
11
+ bench(prefix + "instantiations", function () {
12
+ return {};
13
+ }).types([5, "instantiations"]);
14
+ bench(prefix + "functionality", function () {
15
+ expectTypeOf().toEqualTypeOf();
16
+ });
17
+ });
18
+ test("unmasks deeply nested fragments", function (prefix) {
19
+ bench(prefix + "instantiations", function () {
20
+ return {};
21
+ }).types([5, "instantiations"]);
22
+ bench(prefix + "functionality", function () {
23
+ expectTypeOf().toEqualTypeOf();
24
+ });
25
+ });
26
+ test("unmasks deeply nested nullable fragments", function (prefix) {
27
+ bench(prefix + "instantiations", function () {
28
+ return {};
29
+ }).types([5, "instantiations"]);
30
+ bench(prefix + "functionality", function () {
31
+ expectTypeOf().toEqualTypeOf();
32
+ });
33
+ });
34
+ test("unmasks DeepPartial types", function (prefix) {
35
+ bench(prefix + "instantiations", function () {
36
+ return {};
37
+ }).types([5, "instantiations"]);
38
+ bench(prefix + "functionality", function () {
39
+ expectTypeOf().toEqualTypeOf();
40
+ });
41
+ });
42
+ test("Unmasked handles odd types", function (prefix) {
43
+ bench(prefix + "empty type instantiations", function () {
44
+ attest();
45
+ }).types([80, "instantiations"]);
46
+ bench(prefix + "empty type functionality", function () {
47
+ expectTypeOf().toEqualTypeOf();
48
+ });
49
+ bench(prefix + "generic record type instantiations", function () {
50
+ attest();
51
+ }).types([99, "instantiations"]);
52
+ bench(prefix + "generic record type functionality", function () {
53
+ expectTypeOf().toEqualTypeOf();
54
+ });
55
+ bench(prefix + "unknown instantiations", function () {
56
+ attest();
57
+ }).types([47, "instantiations"]);
58
+ bench(prefix + "unknown functionality", function () {
59
+ expectTypeOf().toBeUnknown();
60
+ });
61
+ bench(prefix + "any instantiations", function () {
62
+ attest();
63
+ }).types([48, "instantiations"]);
64
+ bench(prefix + "any functionality", function () {
65
+ expectTypeOf().toBeAny();
66
+ });
67
+ });
68
+ test("MaybeMasked handles odd types", function (prefix) {
69
+ bench(prefix + "empty type instantiations", function () {
70
+ attest();
71
+ }).types([76, "instantiations"]);
72
+ bench(prefix + "empty type functionality", function () {
73
+ expectTypeOf().toEqualTypeOf();
74
+ });
75
+ bench(prefix + "generic record type instantiations", function () {
76
+ attest();
77
+ }).types([93, "instantiations"]);
78
+ bench(prefix + "generic record type functionality", function () {
79
+ expectTypeOf().toEqualTypeOf();
80
+ });
81
+ bench(prefix + "unknown instantiations", function () {
82
+ attest();
83
+ }).types([52, "instantiations"]);
84
+ bench(prefix + "unknown functionality", function () {
85
+ expectTypeOf().toBeUnknown();
86
+ });
87
+ bench(prefix + "any instantiations", function () {
88
+ attest();
89
+ }).types([49, "instantiations"]);
90
+ bench(prefix + "any functionality", function () {
91
+ expectTypeOf().toBeAny();
92
+ });
93
+ });
94
+ test("distributed members on MaybeMasked", function (prefix) {
95
+ (function unresolvedGeneric() {
96
+ bench(prefix + "one unresolved generic mixed with null|undefined", function () {
97
+ attest();
98
+ }).types([55, "instantiations"]);
99
+ })();
100
+ (function unresolvedGenerics() {
101
+ bench(prefix + "two unresolved generics distribute", function () {
102
+ attest();
103
+ }).types([61, "instantiations"]);
104
+ })();
105
+ });
106
+ test("deals with overlapping array from parent fragment", function (prefix) {
107
+ bench(prefix + "instantiations", function () {
108
+ return {};
109
+ }).types([5, "instantiations"]);
110
+ bench(prefix + "functionality", function () {
111
+ var _a, _b, _c, _d, _e, _f;
112
+ var x = {};
113
+ // some fields for hovering
114
+ x.id;
115
+ x.artists;
116
+ (_b = (_a = x.artists) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.id;
117
+ (_d = (_c = x.artists) === null || _c === void 0 ? void 0 : _c[0]) === null || _d === void 0 ? void 0 : _d.birthdate;
118
+ (_f = (_e = x.artists) === null || _e === void 0 ? void 0 : _e[0]) === null || _f === void 0 ? void 0 : _f.lastname;
119
+ expectTypeOf(x).branded.toEqualTypeOf();
120
+ });
121
+ });
122
+ test("base type, multiple fragments on sub-types", function (prefix) {
123
+ bench(prefix + "instantiations", function () {
124
+ return {};
125
+ }).types([5, "instantiations"]);
126
+ bench(prefix + "functionality", function () {
127
+ var x = {};
128
+ expectTypeOf(x).branded.toEqualTypeOf();
129
+ });
130
+ });
131
+ //# sourceMappingURL=types.bench.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.bench.js","sourceRoot":"","sources":["../../../src/masking/__benches__/types.bench.ts"],"names":[],"mappings":"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","sourcesContent":["import type { MaybeMasked, Unmasked } from \"../index.js\";\nimport { attest, bench } from \"@ark/attest\";\nimport { expectTypeOf } from \"expect-type\";\nimport type { DeepPartial } from \"../../utilities/index.js\";\n\nimport { setup } from \"@ark/attest\";\n\nsetup({\n updateSnapshots: !process.env.CI,\n});\n\nfunction test(name: string, fn: (name: string) => void) {\n fn(name + \": \");\n}\n\ntype UnrelatedType = {\n __typename: \"Unrelated\";\n} & { \" $fragmentName\"?: \"Unrelated\" } & {\n \" $fragmentRefs\"?: {\n Unrelated: {\n __unrelated: boolean;\n };\n };\n};\n// @ts-ignore\ntype _TypeCacheWarmup = Unmasked<UnrelatedType> | MaybeMasked<UnrelatedType>;\n\ntest(\"unmasks deeply nested fragments\", (prefix) => {\n type UserFieldsFragment = {\n __typename: \"User\";\n id: number;\n age: number;\n } & { \" $fragmentName\"?: \"UserFieldsFragment\" } & {\n \" $fragmentRefs\"?: {\n NameFieldsFragment: NameFieldsFragment;\n JobFieldsFragment: JobFieldsFragment;\n };\n };\n\n type NameFieldsFragment = {\n __typename: \"User\";\n firstName: string;\n lastName: string;\n } & { \" $fragmentName\"?: \"NameFieldsFragment\" };\n\n type JobFieldsFragment = {\n __typename: \"User\";\n job: string;\n } & { \" $fragmentName\"?: \"JobFieldsFragment\" } & {\n \" $fragmentRefs\"?: { CareerFieldsFragment: CareerFieldsFragment };\n };\n\n type CareerFieldsFragment = {\n __typename: \"User\";\n position: string;\n } & { \" $fragmentName\"?: \"CareerFieldsFragment\" };\n\n type Source = UserFieldsFragment;\n\n bench(prefix + \"instantiations\", () => {\n return {} as Unmasked<Source>;\n }).types([5, \"instantiations\"]);\n\n bench(prefix + \"functionality\", () => {\n expectTypeOf<Unmasked<Source>>().toEqualTypeOf<{\n __typename: \"User\";\n id: number;\n age: number;\n firstName: string;\n lastName: string;\n job: string;\n position: string;\n }>();\n });\n});\n\ntest(\"unmasks deeply nested fragments\", (prefix) => {\n type UserFieldsFragment = {\n __typename: \"User\";\n id: number;\n age: number;\n jobs: Array<\n {\n __typename: \"Job\";\n id: string;\n title: string;\n } & { \" $fragmentRefs\"?: { JobFieldsFragment: JobFieldsFragment } }\n >;\n } & { \" $fragmentName\"?: \"UserFieldsFragment\" } & {\n \" $fragmentRefs\"?: {\n NameFieldsFragment: NameFieldsFragment;\n };\n };\n\n type NameFieldsFragment = {\n __typename: \"User\";\n firstName: string;\n lastName: string;\n } & { \" $fragmentName\"?: \"NameFieldsFragment\" };\n\n type JobFieldsFragment = {\n __typename: \"Job\";\n job: string;\n } & { \" $fragmentName\"?: \"JobFieldsFragment\" } & {\n \" $fragmentRefs\"?: { CareerFieldsFragment: CareerFieldsFragment };\n };\n\n type CareerFieldsFragment = {\n __typename: \"Job\";\n position: string;\n } & { \" $fragmentName\"?: \"CareerFieldsFragment\" };\n\n type Source = UserFieldsFragment;\n\n bench(prefix + \"instantiations\", () => {\n return {} as Unmasked<Source>;\n }).types([5, \"instantiations\"]);\n\n bench(prefix + \"functionality\", () => {\n expectTypeOf<Unmasked<Source>>().toEqualTypeOf<{\n __typename: \"User\";\n id: number;\n age: number;\n firstName: string;\n lastName: string;\n jobs: Array<{\n __typename: \"Job\";\n id: string;\n title: string;\n job: string;\n position: string;\n }>;\n }>();\n });\n});\n\ntest(\"unmasks deeply nested nullable fragments\", (prefix) => {\n type UserFieldsFragment = {\n __typename: \"User\";\n id: number;\n age: number;\n career:\n | ({\n __typename: \"Job\";\n id: string;\n title: string;\n } & { \" $fragmentRefs\"?: { JobFieldsFragment: JobFieldsFragment } })\n | null;\n jobs: Array<\n | ({\n __typename: \"Job\";\n id: string;\n title: string;\n } & { \" $fragmentRefs\"?: { JobFieldsFragment: JobFieldsFragment } })\n | null\n >;\n } & { \" $fragmentName\"?: \"UserFieldsFragment\" } & {\n \" $fragmentRefs\"?: {\n NameFieldsFragment: NameFieldsFragment;\n };\n };\n\n type NameFieldsFragment = {\n __typename: \"User\";\n firstName: string;\n lastName: string;\n } & { \" $fragmentName\"?: \"NameFieldsFragment\" };\n\n type JobFieldsFragment = {\n __typename: \"Job\";\n job: string;\n } & { \" $fragmentName\"?: \"JobFieldsFragment\" } & {\n \" $fragmentRefs\"?: { CareerFieldsFragment: CareerFieldsFragment };\n };\n\n type CareerFieldsFragment = {\n __typename: \"Job\";\n position: string;\n } & { \" $fragmentName\"?: \"CareerFieldsFragment\" };\n\n type Source = UserFieldsFragment;\n\n bench(prefix + \"instantiations\", () => {\n return {} as Unmasked<Source>;\n }).types([5, \"instantiations\"]);\n\n bench(prefix + \"functionality\", () => {\n expectTypeOf<Unmasked<Source>>().toEqualTypeOf<{\n __typename: \"User\";\n id: number;\n age: number;\n firstName: string;\n lastName: string;\n career: {\n __typename: \"Job\";\n id: string;\n title: string;\n job: string;\n position: string;\n } | null;\n jobs: Array<{\n __typename: \"Job\";\n id: string;\n title: string;\n job: string;\n position: string;\n } | null>;\n }>();\n });\n});\n\ntest(\"unmasks DeepPartial types\", (prefix) => {\n type UserFieldsFragment = {\n __typename: \"User\";\n id: number;\n age: number;\n } & { \" $fragmentName\"?: \"UserFieldsFragment\" } & {\n \" $fragmentRefs\"?: {\n NameFieldsFragment: NameFieldsFragment;\n };\n };\n\n type NameFieldsFragment = {\n __typename: \"User\";\n firstName: string;\n lastName: string;\n } & { \" $fragmentName\"?: \"NameFieldsFragment\" };\n\n type Source = DeepPartial<UserFieldsFragment>;\n\n bench(prefix + \"instantiations\", () => {\n return {} as Unmasked<Source>;\n }).types([5, \"instantiations\"]);\n\n bench(prefix + \"functionality\", () => {\n expectTypeOf<Unmasked<Source>>().toEqualTypeOf<{\n __typename?: \"User\";\n id?: number;\n age?: number;\n firstName?: string;\n lastName?: string;\n }>();\n });\n});\n\ntest(\"Unmasked handles odd types\", (prefix) => {\n bench(prefix + \"empty type instantiations\", () => {\n attest<{}, Unmasked<{}>>();\n }).types([80, \"instantiations\"]);\n\n bench(prefix + \"empty type functionality\", () => {\n expectTypeOf<Unmasked<{}>>().toEqualTypeOf<{}>();\n });\n\n bench(prefix + \"generic record type instantiations\", () => {\n attest<Record<string, any>, Unmasked<Record<string, any>>>();\n }).types([99, \"instantiations\"]);\n\n bench(prefix + \"generic record type functionality\", () => {\n expectTypeOf<Unmasked<Record<string, any>>>().toEqualTypeOf<\n Record<string, any>\n >();\n });\n\n bench(prefix + \"unknown instantiations\", () => {\n attest<unknown, Unmasked<unknown>>();\n }).types([47, \"instantiations\"]);\n\n bench(prefix + \"unknown functionality\", () => {\n expectTypeOf<Unmasked<unknown>>().toBeUnknown();\n });\n\n bench(prefix + \"any instantiations\", () => {\n attest<any, Unmasked<any>>();\n }).types([48, \"instantiations\"]);\n\n bench(prefix + \"any functionality\", () => {\n expectTypeOf<Unmasked<any>>().toBeAny();\n });\n});\n\ntest(\"MaybeMasked handles odd types\", (prefix) => {\n bench(prefix + \"empty type instantiations\", () => {\n attest<{}, MaybeMasked<{}>>();\n }).types([76, \"instantiations\"]);\n\n bench(prefix + \"empty type functionality\", () => {\n expectTypeOf<MaybeMasked<{}>>().toEqualTypeOf<{}>();\n });\n\n bench(prefix + \"generic record type instantiations\", () => {\n attest<Record<string, any>, MaybeMasked<Record<string, any>>>();\n }).types([93, \"instantiations\"]);\n bench(prefix + \"generic record type functionality\", () => {\n expectTypeOf<MaybeMasked<Record<string, any>>>().toEqualTypeOf<\n Record<string, any>\n >();\n });\n\n bench(prefix + \"unknown instantiations\", () => {\n attest<unknown, MaybeMasked<unknown>>();\n }).types([52, \"instantiations\"]);\n bench(prefix + \"unknown functionality\", () => {\n expectTypeOf<MaybeMasked<unknown>>().toBeUnknown();\n });\n\n bench(prefix + \"any instantiations\", () => {\n attest<any, MaybeMasked<any>>();\n }).types([49, \"instantiations\"]);\n bench(prefix + \"any functionality\", () => {\n expectTypeOf<MaybeMasked<any>>().toBeAny();\n });\n});\n\ntest(\"distributed members on MaybeMasked\", (prefix) => {\n (function unresolvedGeneric<T>() {\n bench(prefix + \"one unresolved generic mixed with null|undefined\", () => {\n attest<\n [MaybeMasked<T> | null | undefined],\n [MaybeMasked<T | null | undefined>]\n >();\n }).types([55, \"instantiations\"]);\n })();\n\n (function unresolvedGenerics<T, V>() {\n bench(prefix + \"two unresolved generics distribute\", () => {\n attest<[MaybeMasked<T> | MaybeMasked<V>], [MaybeMasked<T | V>]>();\n }).types([61, \"instantiations\"]);\n })();\n});\n\ntest(\"deals with overlapping array from parent fragment\", (prefix) => {\n type Source = {\n __typename: \"Track\";\n /** comment: id */\n id: number;\n /** comment: artists */\n artists?: Array<{\n __typename: \"Artist\";\n /** comment: artists.id */\n id: number;\n \" $fragmentRefs\"?: {\n ArtistFragment: ArtistFragment;\n };\n }> | null;\n \" $fragmentRefs\"?: {\n NestedTrackFragment: NestedTrackFragment;\n };\n };\n\n type ArtistFragment = {\n \" $fragmentName\"?: \"Fragment__Artist\";\n __typename: \"Artist\";\n /** comment: artists.birthday */\n birthdate: string;\n };\n\n type NestedTrackFragment = {\n \" $fragmentName\"?: \"Fragment__Track\";\n __typename: \"Track\";\n artists?: Array<{\n __typename: \"Artist\";\n /** comment: artists.lastname */\n lastname: string;\n }> | null;\n };\n\n bench(prefix + \"instantiations\", () => {\n return {} as Unmasked<Source>;\n }).types([5, \"instantiations\"]);\n\n bench(prefix + \"functionality\", () => {\n const x = {} as Unmasked<Source>;\n // some fields for hovering\n x.id;\n x.artists;\n x.artists?.[0]?.id;\n x.artists?.[0]?.birthdate;\n x.artists?.[0]?.lastname;\n expectTypeOf(x).branded.toEqualTypeOf<{\n __typename: \"Track\";\n id: number;\n artists?:\n | Array<{\n __typename: \"Artist\";\n id: number;\n birthdate: string;\n lastname: string;\n }>\n | null\n | undefined;\n }>();\n });\n});\n\ntest(\"base type, multiple fragments on sub-types\", (prefix) => {\n type Source = {\n __typename: \"Track\";\n id: number;\n artists?: Array<{\n __typename: \"Person\" | \"Animatronic\" | \"CartoonCharacter\";\n id: number;\n name: string;\n \" $fragmentRefs\"?: {\n PersonFragment: PersonFragment;\n AnimatronicFragment: AnimatronicFragment;\n CartoonCharacterFragment: CartoonCharacterFragment;\n };\n }> | null;\n };\n\n type PersonFragment = {\n \" $fragmentName\"?: \"Fragment__Person\";\n __typename: \"Person\";\n birthdate: string;\n };\n type AnimatronicFragment = {\n \" $fragmentName\"?: \"Fragment__Animatronic\";\n __typename: \"Animatronic\";\n manufacturer: string;\n warrantyEndDate: string;\n };\n type CartoonCharacterFragment = {\n \" $fragmentName\"?: \"Fragment__CartoonCharacter\";\n __typename: \"CartoonCharacter\";\n animator: string;\n voiceActor: string;\n };\n\n bench(prefix + \"instantiations\", () => {\n return {} as Unmasked<Source>;\n }).types([5, \"instantiations\"]);\n\n bench(prefix + \"functionality\", () => {\n const x = {} as Unmasked<Source>;\n expectTypeOf(x).branded.toEqualTypeOf<{\n __typename: \"Track\";\n id: number;\n artists?:\n | Array<\n | {\n __typename: \"Person\";\n id: number;\n name: string;\n birthdate: string;\n }\n | {\n __typename: \"Animatronic\";\n id: number;\n name: string;\n manufacturer: string;\n warrantyEndDate: string;\n }\n | {\n __typename: \"CartoonCharacter\";\n id: number;\n name: string;\n animator: string;\n voiceActor: string;\n }\n >\n | null\n | undefined;\n }>();\n });\n});\n"]}
@@ -1,2 +1,5 @@
1
1
  export type { DataMasking, FragmentType, Masked, MaskedDocumentNode, MaybeMasked, Unmasked, } from "./types.js";
2
+ export { disableWarningsSlot } from "./utils.js";
3
+ export { maskFragment } from "./maskFragment.js";
4
+ export { maskOperation } from "./maskOperation.js";
2
5
  //# sourceMappingURL=index.d.ts.map
package/masking/index.js CHANGED
@@ -1,2 +1,4 @@
1
- export {};
1
+ export { disableWarningsSlot } from "./utils.js";
2
+ export { maskFragment } from "./maskFragment.js";
3
+ export { maskOperation } from "./maskOperation.js";
2
4
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/masking/index.ts"],"names":[],"mappings":"","sourcesContent":["export type {\n DataMasking,\n FragmentType,\n Masked,\n MaskedDocumentNode,\n MaybeMasked,\n Unmasked,\n} from \"./types.js\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/masking/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC","sourcesContent":["export type {\n DataMasking,\n FragmentType,\n Masked,\n MaskedDocumentNode,\n MaybeMasked,\n Unmasked,\n} from \"./types.js\";\nexport { disableWarningsSlot } from \"./utils.js\";\nexport { maskFragment } from \"./maskFragment.js\";\nexport { maskOperation } from \"./maskOperation.js\";\n"]}
@@ -1,14 +1,119 @@
1
- import type { Prettify, UnionToIntersection } from "../../utilities/index.js";
2
- export type UnwrapFragmentRefs<TData> = TData extends any ? string extends keyof NonNullable<TData> ? TData : " $fragmentRefs" extends keyof NonNullable<TData> ? TData extends {
3
- " $fragmentRefs"?: infer FragmentRefs extends object;
4
- } ? Prettify<{
5
- [K in keyof TData as K extends " $fragmentRefs" ? never : K]: UnwrapFragmentRefs<TData[K]>;
6
- } & CombineFragmentRefs<FragmentRefs>> : never : TData extends Array<infer TItem> ? Array<UnwrapFragmentRefs<TItem>> : TData extends object ? {
1
+ import type { Prettify } from "../../utilities/index.js";
2
+ export type IsAny<T> = 0 extends 1 & T ? true : false;
3
+ export type UnwrapFragmentRefs<TData> = true extends IsAny<TData> ? TData : TData extends any ? string extends keyof TData ? TData : keyof TData extends never ? TData : TData extends {
4
+ " $fragmentRefs"?: infer FragmentRefs;
5
+ } ? UnwrapFragmentRefs<CombineIntersection<Omit<TData, " $fragmentRefs"> | RemoveFragmentName<NonNullable<NonNullable<FragmentRefs>[keyof NonNullable<FragmentRefs>]>>>> : TData extends Array<infer TItem> ? Array<UnwrapFragmentRefs<TItem>> : TData extends object ? {
7
6
  [K in keyof TData]: UnwrapFragmentRefs<TData[K]>;
8
7
  } : TData : never;
9
- type CombineFragmentRefs<FragmentRefs extends Record<string, any>> = UnionToIntersection<{
10
- [K in keyof FragmentRefs]-?: UnwrapFragmentRefs<RemoveFragmentName<FragmentRefs[K]>>;
11
- }[keyof FragmentRefs]>;
8
+ /**
9
+ ```ts
10
+ CombineIntersection<
11
+ | { foo: string }
12
+ | { __typename: "A"; a: string }
13
+ | { __typename: "B"; b1: number }
14
+ | { __typename: "B"; b2: string }
15
+ > =>
16
+ | { foo: string }
17
+ | CombineByTypeName<
18
+ | { __typename: "A"; a: string }
19
+ | { __typename: "B"; b1: number }
20
+ | { __typename: "B"; b2: string }
21
+ >
22
+ ```
23
+ */
24
+ type CombineIntersection<T> = Exclude<T, {
25
+ __typename?: string;
26
+ }> | CombineByTypeName<Extract<T, {
27
+ __typename?: string;
28
+ }>>;
29
+ /**
30
+ ```ts
31
+ CombineByTypeName<
32
+ | { __typename: "A"; a: string }
33
+ | { __typename: "B"; b1: number }
34
+ | { __typename: "B"; b2: string }
35
+ > =>
36
+ | CombineWithArrays<
37
+ | { __typename: "A"; a: string }
38
+ >
39
+ | CombineWithArrays<
40
+ | { __typename: "B"; b1: number }
41
+ | { __typename: "B"; b2: number }
42
+ >
43
+ ```
44
+ */
45
+ type CombineByTypeName<T extends {
46
+ __typename?: string;
47
+ }> = {
48
+ [TypeName in NonNullable<T["__typename"]>]: Prettify<MergeUnions<ExtractByMatchingTypeNames<T, TypeName>>>;
49
+ }[NonNullable<T["__typename"]>];
50
+ /**
51
+ ```ts
52
+ CombineByTypeName<
53
+ | {
54
+ __typename: "Person" | "Animatronic" | "CartoonCharacter";
55
+ id: number;
56
+ name: string;
57
+ }
58
+ | {
59
+ __typename: "Person";
60
+ birthdate: string;
61
+ }
62
+ | {
63
+ __typename: "Animatronic";
64
+ manufacturer: string;
65
+ warrantyEndDate: string;
66
+ }
67
+ | {
68
+ __typename: "CartoonCharacter";
69
+ animator: string;
70
+ voiceActor: string;
71
+ }
72
+ >
73
+ =>
74
+ {
75
+ id: number;
76
+ name: string;
77
+ __typename: "Person";
78
+ birthdate: string;
79
+ } | {
80
+ id: number;
81
+ name: string;
82
+ __typename: "Animatronic";
83
+ manufacturer: string;
84
+ warrantyEndDate: string;
85
+ } | {
86
+ id: number;
87
+ name: string;
88
+ __typename: "CartoonCharacter";
89
+ animator: string;
90
+ voiceActor: string;
91
+ }
92
+ ```
93
+ */
94
+ type ExtractByMatchingTypeNames<Union extends {
95
+ __typename?: string;
96
+ }, TypeName extends string> = Union extends any ? TypeName extends NonNullable<Union["__typename"]> ? Omit<Union, "__typename"> & {
97
+ [K in keyof Union as K extends "__typename" ? K : never]: TypeName;
98
+ } : never : never;
99
+ type MergeUnions<TUnion> = MergeUnionsAcc<TUnion, takeOneFromUnion<TUnion>, never>;
100
+ type DistributedRequiredExclude<T, U> = T extends any ? Required<T> extends Required<U> ? Required<U> extends Required<T> ? never : T : T : T;
101
+ type MergeUnionsAcc<TUnion, Curr, Merged> = [
102
+ Curr
103
+ ] extends [never] ? Merged : MergeUnionsAcc<DistributedRequiredExclude<TUnion, Curr>, takeOneFromUnion<DistributedRequiredExclude<TUnion, Curr>>, [
104
+ Merged
105
+ ] extends [never] ? Curr : MergeObjects<Curr, Merged>>;
106
+ type unionToIntersection<T> = (T extends unknown ? (x: T) => unknown : never) extends ((x: infer U) => unknown) ? U : never;
107
+ type takeOneFromUnion<T> = unionToIntersection<T extends T ? (x: T) => 0 : never> extends ((x: infer U) => 0) ? U : never;
108
+ type MergeObjects<T, U> = Prettify<{
109
+ [k in keyof T]: k extends keyof U ? [
110
+ NonNullable<T[k]>,
111
+ NonNullable<U[k]>
112
+ ] extends ([
113
+ infer TK extends object,
114
+ infer UK extends object
115
+ ]) ? TK extends unknown[] ? UK extends unknown[] ? CombineIntersection<TK[number] | UK[number]>[] | Extract<T[k] | U[k], undefined | null> : T[k] : CombineIntersection<TK | UK> | Extract<T[k] | U[k], undefined | null> : T[k] : T[k];
116
+ } & Pick<U, Exclude<keyof U, keyof T>>>;
12
117
  export type RemoveMaskedMarker<T> = Omit<T, "__masked">;
13
118
  export type RemoveFragmentName<T> = T extends any ? Omit<T, " $fragmentName"> : T;
14
119
  export type ContainsFragmentsRefs<TData> = TData extends object ? " $fragmentRefs" extends keyof TData ? true : ContainsFragmentsRefs<TData[keyof TData]> : false;
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/masking/internal/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { Prettify, UnionToIntersection } from \"../../utilities/index.js\";\n\nexport type UnwrapFragmentRefs<TData> =\n TData extends any ?\n // Leave TData alone if it is Record<string, any> and not a specific shape\n string extends keyof NonNullable<TData> ? TData\n : \" $fragmentRefs\" extends keyof NonNullable<TData> ?\n TData extends { \" $fragmentRefs\"?: infer FragmentRefs extends object } ?\n Prettify<\n {\n [K in keyof TData as K extends \" $fragmentRefs\" ? never\n : K]: UnwrapFragmentRefs<TData[K]>;\n } & CombineFragmentRefs<FragmentRefs>\n >\n : never\n : TData extends Array<infer TItem> ? Array<UnwrapFragmentRefs<TItem>>\n : TData extends object ?\n { [K in keyof TData]: UnwrapFragmentRefs<TData[K]> }\n : TData\n : never;\n\ntype CombineFragmentRefs<FragmentRefs extends Record<string, any>> =\n UnionToIntersection<\n {\n [K in keyof FragmentRefs]-?: UnwrapFragmentRefs<\n RemoveFragmentName<FragmentRefs[K]>\n >;\n }[keyof FragmentRefs]\n >;\n\nexport type RemoveMaskedMarker<T> = Omit<T, \"__masked\">;\n// force distrubution when T is a union with | undefined\nexport type RemoveFragmentName<T> =\n T extends any ? Omit<T, \" $fragmentName\"> : T;\n\nexport type ContainsFragmentsRefs<TData> =\n TData extends object ?\n \" $fragmentRefs\" extends keyof TData ?\n true\n : ContainsFragmentsRefs<TData[keyof TData]>\n : false;\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/masking/internal/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { Prettify } from \"../../utilities/index.js\";\n\nexport type IsAny<T> = 0 extends 1 & T ? true : false;\n\nexport type UnwrapFragmentRefs<TData> =\n true extends IsAny<TData> ? TData\n : TData extends any ?\n // Leave TData alone if it is Record<string, any> and not a specific shape\n string extends keyof TData ? TData\n : // short-circuit on empty object\n keyof TData extends never ? TData\n : TData extends { \" $fragmentRefs\"?: infer FragmentRefs } ?\n UnwrapFragmentRefs<\n CombineIntersection<\n | Omit<TData, \" $fragmentRefs\">\n | RemoveFragmentName<\n NonNullable<\n NonNullable<FragmentRefs>[keyof NonNullable<FragmentRefs>]\n >\n >\n >\n >\n : TData extends Array<infer TItem> ? Array<UnwrapFragmentRefs<TItem>>\n : TData extends object ?\n {\n [K in keyof TData]: UnwrapFragmentRefs<TData[K]>;\n }\n : TData\n : never;\n\n/**\n```ts\nCombineIntersection<\n | { foo: string }\n | { __typename: \"A\"; a: string }\n | { __typename: \"B\"; b1: number }\n | { __typename: \"B\"; b2: string }\n> =>\n | { foo: string }\n | CombineByTypeName<\n | { __typename: \"A\"; a: string }\n | { __typename: \"B\"; b1: number }\n | { __typename: \"B\"; b2: string }\n >\n```\n */\ntype CombineIntersection<T> =\n | Exclude<T, { __typename?: string }>\n | CombineByTypeName<Extract<T, { __typename?: string }>>;\n/**\n```ts\n CombineByTypeName<\n | { __typename: \"A\"; a: string }\n | { __typename: \"B\"; b1: number }\n | { __typename: \"B\"; b2: string }\n > =>\n | CombineWithArrays<\n | { __typename: \"A\"; a: string }\n >\n | CombineWithArrays<\n | { __typename: \"B\"; b1: number }\n | { __typename: \"B\"; b2: number }\n >\n```\n */\ntype CombineByTypeName<T extends { __typename?: string }> = {\n [TypeName in NonNullable<T[\"__typename\"]>]: Prettify<\n MergeUnions<ExtractByMatchingTypeNames<T, TypeName>>\n >;\n}[NonNullable<T[\"__typename\"]>];\n\n/**\n```ts\nCombineByTypeName<\n | {\n __typename: \"Person\" | \"Animatronic\" | \"CartoonCharacter\";\n id: number;\n name: string;\n }\n | {\n __typename: \"Person\";\n birthdate: string;\n }\n | {\n __typename: \"Animatronic\";\n manufacturer: string;\n warrantyEndDate: string;\n }\n | {\n __typename: \"CartoonCharacter\";\n animator: string;\n voiceActor: string;\n }\n>\n =>\n{\n id: number;\n name: string;\n __typename: \"Person\";\n birthdate: string;\n} | {\n id: number;\n name: string;\n __typename: \"Animatronic\";\n manufacturer: string;\n warrantyEndDate: string;\n} | {\n id: number;\n name: string;\n __typename: \"CartoonCharacter\";\n animator: string;\n voiceActor: string;\n}\n```\n */\ntype ExtractByMatchingTypeNames<\n Union extends { __typename?: string },\n TypeName extends string,\n> = Union extends any ?\n TypeName extends NonNullable<Union[\"__typename\"]> ?\n Omit<Union, \"__typename\"> & {\n // preserve `?`, which `& { __typename: TypeName }` would not do\n [K in keyof Union as K extends \"__typename\" ? K : never]: TypeName;\n }\n : never\n: never;\n\ntype MergeUnions<TUnion> = MergeUnionsAcc<\n TUnion,\n takeOneFromUnion<TUnion>,\n never\n>;\n\ntype DistributedRequiredExclude<T, U> =\n T extends any ?\n Required<T> extends Required<U> ?\n Required<U> extends Required<T> ?\n never\n : T\n : T\n : T;\n\ntype MergeUnionsAcc<TUnion, Curr, Merged> =\n [Curr] extends [never] ? Merged\n : MergeUnionsAcc<\n DistributedRequiredExclude<TUnion, Curr>,\n takeOneFromUnion<DistributedRequiredExclude<TUnion, Curr>>,\n [Merged] extends [never] ? Curr : MergeObjects<Curr, Merged>\n >;\ntype unionToIntersection<T> =\n (T extends unknown ? (x: T) => unknown : never) extends (\n (x: infer U) => unknown\n ) ?\n U\n : never;\n\ntype takeOneFromUnion<T> =\n unionToIntersection<T extends T ? (x: T) => 0 : never> extends (\n (x: infer U) => 0\n ) ?\n U\n : never;\n\ntype MergeObjects<T, U> = Prettify<\n {\n [k in keyof T]: k extends keyof U ?\n [NonNullable<T[k]>, NonNullable<U[k]>] extends (\n [infer TK extends object, infer UK extends object]\n ) ?\n TK extends unknown[] ?\n UK extends unknown[] ?\n | CombineIntersection<TK[number] | UK[number]>[]\n | Extract<T[k] | U[k], undefined | null>\n : T[k]\n : CombineIntersection<TK | UK> | Extract<T[k] | U[k], undefined | null>\n : T[k]\n : T[k];\n } & Pick<U, Exclude<keyof U, keyof T>>\n>;\n\nexport type RemoveMaskedMarker<T> = Omit<T, \"__masked\">;\n// force distrubution when T is a union with | undefined\nexport type RemoveFragmentName<T> =\n T extends any ? Omit<T, \" $fragmentName\"> : T;\n\nexport type ContainsFragmentsRefs<TData> =\n TData extends object ?\n \" $fragmentRefs\" extends keyof TData ?\n true\n : ContainsFragmentsRefs<TData[keyof TData]>\n : false;\n"]}
@@ -0,0 +1,14 @@
1
+ import type { SelectionSetNode } from "graphql";
2
+ import type { FragmentMap } from "../utilities/index.js";
3
+ import type { ApolloCache } from "../cache/index.js";
4
+ interface MaskingContext {
5
+ operationType: "query" | "mutation" | "subscription" | "fragment";
6
+ operationName: string | undefined;
7
+ fragmentMap: FragmentMap;
8
+ cache: ApolloCache<unknown>;
9
+ mutableTargets: WeakMap<any, any>;
10
+ knownChanged: WeakSet<any>;
11
+ }
12
+ export declare function maskDefinition(data: Record<string, any>, selectionSet: SelectionSetNode, context: MaskingContext): any;
13
+ export {};
14
+ //# sourceMappingURL=maskDefinition.d.ts.map
@@ -1,72 +1,8 @@
1
1
  import { Kind } from "graphql";
2
- import { createFragmentMap, resultKeyNameFromField, getFragmentDefinitions, getFragmentMaskMode, getOperationDefinition, maybeDeepFreeze, canUseWeakMap, canUseWeakSet, } from "../utilities/index.js";
2
+ import { getFragmentMaskMode, maybeDeepFreeze, resultKeyNameFromField, } from "../utilities/index.js";
3
+ import { disableWarningsSlot } from "./utils.js";
3
4
  import { invariant } from "../utilities/globals/index.js";
4
- import { equal } from "@wry/equality";
5
- import { Slot } from "optimism";
6
- var MapImpl = canUseWeakMap ? WeakMap : Map;
7
- var SetImpl = canUseWeakSet ? WeakSet : Set;
8
- // Contextual slot that allows us to disable accessor warnings on fields when in
9
- // migrate mode.
10
- export var disableWarningsSlot = new Slot();
11
- export function maskOperation(data, document, cache) {
12
- var _a;
13
- if (!cache.fragmentMatches) {
14
- if (globalThis.__DEV__ !== false) {
15
- warnOnImproperCacheImplementation();
16
- }
17
- return data;
18
- }
19
- var definition = getOperationDefinition(document);
20
- invariant(definition, 38);
21
- if (data == null) {
22
- // Maintain the original `null` or `undefined` value
23
- return data;
24
- }
25
- return maskDefinition(data, definition.selectionSet, {
26
- operationType: definition.operation,
27
- operationName: (_a = definition.name) === null || _a === void 0 ? void 0 : _a.value,
28
- fragmentMap: createFragmentMap(getFragmentDefinitions(document)),
29
- cache: cache,
30
- mutableTargets: new MapImpl(),
31
- knownChanged: new SetImpl(),
32
- });
33
- }
34
- export function maskFragment(data, document, cache, fragmentName) {
35
- if (!cache.fragmentMatches) {
36
- if (globalThis.__DEV__ !== false) {
37
- warnOnImproperCacheImplementation();
38
- }
39
- return data;
40
- }
41
- var fragments = document.definitions.filter(function (node) {
42
- return node.kind === Kind.FRAGMENT_DEFINITION;
43
- });
44
- if (typeof fragmentName === "undefined") {
45
- invariant(fragments.length === 1, 39, fragments.length);
46
- fragmentName = fragments[0].name.value;
47
- }
48
- var fragment = fragments.find(function (fragment) { return fragment.name.value === fragmentName; });
49
- invariant(!!fragment, 40, fragmentName);
50
- if (data == null) {
51
- // Maintain the original `null` or `undefined` value
52
- return data;
53
- }
54
- if (equal(data, {})) {
55
- // Return early and skip the masking algorithm if we don't have any data
56
- // yet. This can happen when cache.diff returns an empty object which is
57
- // used from watchFragment.
58
- return data;
59
- }
60
- return maskDefinition(data, fragment.selectionSet, {
61
- operationType: "fragment",
62
- operationName: fragment.name.value,
63
- fragmentMap: createFragmentMap(getFragmentDefinitions(document)),
64
- cache: cache,
65
- mutableTargets: new MapImpl(),
66
- knownChanged: new SetImpl(),
67
- });
68
- }
69
- function maskDefinition(data, selectionSet, context) {
5
+ export function maskDefinition(data, selectionSet, context) {
70
6
  return disableWarningsSlot.withValue(true, function () {
71
7
  var masked = maskSelectionSet(data, selectionSet, context, false);
72
8
  if (Object.isFrozen(data)) {
@@ -152,7 +88,7 @@ function maskSelectionSet(data, selectionSet, context, migration, path) {
152
88
  var fragment = context.fragmentMap[fragmentName] ||
153
89
  (context.fragmentMap[fragmentName] =
154
90
  context.cache.lookupFragment(fragmentName));
155
- invariant(fragment, 41, fragmentName);
91
+ invariant(fragment, 47, fragmentName);
156
92
  var mode = getFragmentMaskMode(selection);
157
93
  if (mode !== "mask") {
158
94
  value = maskSelectionSet(data, fragment.selectionSet, context, mode === "migrate", path);
@@ -178,7 +114,7 @@ function getAccessorWarningDescriptor(fieldName, value, path, operationName, ope
178
114
  if (disableWarningsSlot.getValue()) {
179
115
  return value;
180
116
  }
181
- globalThis.__DEV__ !== false && invariant.warn(42, operationName ?
117
+ globalThis.__DEV__ !== false && invariant.warn(48, operationName ?
182
118
  "".concat(operationType, " '").concat(operationName, "'")
183
119
  : "anonymous ".concat(operationType), "".concat(path, ".").concat(fieldName).replace(/^\./, ""));
184
120
  getValue = function () { return value; };
@@ -195,11 +131,4 @@ function getAccessorWarningDescriptor(fieldName, value, path, operationName, ope
195
131
  configurable: true,
196
132
  };
197
133
  }
198
- var issuedWarning = false;
199
- function warnOnImproperCacheImplementation() {
200
- if (!issuedWarning) {
201
- issuedWarning = true;
202
- globalThis.__DEV__ !== false && invariant.warn(43);
203
- }
204
- }
205
- //# sourceMappingURL=masking.js.map
134
+ //# sourceMappingURL=maskDefinition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"maskDefinition.js","sourceRoot":"","sources":["../../src/masking/maskDefinition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE/B,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAW1D,MAAM,UAAU,cAAc,CAC5B,IAAyB,EACzB,YAA8B,EAC9B,OAAuB;IAEvB,OAAO,mBAAmB,CAAC,SAAS,CAAC,IAAI,EAAE;QACzC,IAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;QAEpE,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,eAAe,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,gBAAgB,CACvB,IAAyB,EACzB,cAAiC;IAEjC,IAAI,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7B,OAAO,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAED,IAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACrE,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IACxC,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,SAAS,gBAAgB,CACvB,IAAS,EACT,YAA8B,EAC9B,OAAuB,EACvB,SAAkB,EAClB,IAAyB;;IAEjB,IAAA,YAAY,GAAK,OAAO,aAAZ,CAAa;IACjC,IAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;IAE5D,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,KAA4B,UAA0B,EAA1B,KAAA,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,EAA1B,cAA0B,EAA1B,IAA0B,EAAE,CAAC;YAA9C,IAAA,WAAa,EAAZ,KAAK,QAAA,EAAE,IAAI,QAAA;YACrB,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBAClB,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;gBACnB,SAAS;YACX,CAAC;YAED,IAAM,MAAM,GAAG,gBAAgB,CAC7B,IAAI,EACJ,YAAY,EACZ,OAAO,EACP,SAAS,EACT,OAAO,CAAC,CAAC,CAAC,UAAG,IAAI,IAAI,EAAE,cAAI,KAAK,MAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAC7C,CAAC;YACF,IAAI,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC7B,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACzB,CAAC;YAED,IAAI,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC;QACvB,CAAC;QAED,OAAO,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9C,CAAC;IAED,KAAwB,UAAuB,EAAvB,KAAA,YAAY,CAAC,UAAU,EAAvB,cAAuB,EAAvB,IAAuB,EAAE,CAAC;QAA7C,IAAM,SAAS,SAAA;QAClB,IAAI,KAAK,SAAK,CAAC;QAEf,4DAA4D;QAC5D,yDAAyD;QACzD,IAAI,SAAS,EAAE,CAAC;YACd,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;QAED,IAAI,SAAS,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;YAClC,IAAM,OAAO,GAAG,sBAAsB,CAAC,SAAS,CAAC,CAAC;YAClD,IAAM,iBAAiB,GAAG,SAAS,CAAC,YAAY,CAAC;YAEjD,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC;YAEvC,IAAI,KAAK,KAAK,KAAK,CAAC,EAAE,CAAC;gBACrB,SAAS;YACX,CAAC;YAED,IAAI,iBAAiB,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACxC,IAAM,MAAM,GAAG,gBAAgB,CAC7B,IAAI,CAAC,OAAO,CAAC,EACb,iBAAiB,EACjB,OAAO,EACP,SAAS,EACT,OAAO,CAAC,CAAC,CAAC,UAAG,IAAI,IAAI,EAAE,cAAI,OAAO,CAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAC9C,CAAC;gBAEF,IAAI,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC7B,KAAK,GAAG,MAAM,CAAC;gBACjB,CAAC;YACH,CAAC;YAED,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,IAAI,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC;YACxB,CAAC;YACD,IAAI,OAAO,EAAE,CAAC;gBACZ,IACE,SAAS;oBACT,OAAO,KAAK,YAAY;oBACxB,qDAAqD;oBACrD,yDAAyD;oBACzD,sDAAsD;oBACtD,wBAAwB;oBACxB,CAAC,CAAA,MAAA,MAAM,CAAC,wBAAwB,CAAC,IAAI,EAAE,OAAO,CAAC,0CAAE,KAAK,CAAA,EACtD,CAAC;oBACD,MAAM,CAAC,cAAc,CACnB,IAAI,EACJ,OAAO,EACP,4BAA4B,CAC1B,OAAO,EACP,KAAK,EACL,IAAI,IAAI,EAAE,EACV,OAAO,CAAC,aAAa,EACrB,OAAO,CAAC,aAAa,CACtB,CACF,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC;oBACrB,IAAI,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC;gBACxB,CAAC;YACH,CAAC;QACH,CAAC;QAED,IACE,SAAS,CAAC,IAAI,KAAK,IAAI,CAAC,eAAe;YACvC,CAAC,CAAC,SAAS,CAAC,aAAa;gBACvB,OAAO,CAAC,KAAK,CAAC,eAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,EAC7D,CAAC;YACD,KAAK,GAAG,gBAAgB,CACtB,IAAI,EACJ,SAAS,CAAC,YAAY,EACtB,OAAO,EACP,SAAS,EACT,IAAI,CACL,CAAC;QACJ,CAAC;QAED,IAAI,SAAS,CAAC,IAAI,KAAK,IAAI,CAAC,eAAe,EAAE,CAAC;YAC5C,IAAM,YAAY,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;YAC1C,IAAM,QAAQ,GACZ,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC;gBACjC,CAAC,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC;oBAChC,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,YAAY,CAAE,CAAC,CAAC;YACjD,SAAS,CACP,QAAQ,EACR,yCAAyC,EACzC,YAAY,CACb,CAAC;YAEF,IAAM,IAAI,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;YAE5C,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;gBACpB,KAAK,GAAG,gBAAgB,CACtB,IAAI,EACJ,QAAQ,CAAC,YAAY,EACrB,OAAO,EACP,IAAI,KAAK,SAAS,EAClB,IAAI,CACL,CAAC;YACJ,CAAC;QACH,CAAC;QAED,IAAI,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5B,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAED,IAAI,YAAY,IAAI,IAAI,IAAI,CAAC,CAAC,YAAY,IAAI,IAAI,CAAC,EAAE,CAAC;QACpD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;IACpC,CAAC;IAED,oEAAoE;IACpE,iEAAiE;IACjE,mDAAmD;IACnD,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;QAC1D,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAED,OAAO,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9C,CAAC;AAED,SAAS,4BAA4B,CACnC,SAAiB,EACjB,KAAU,EACV,IAAY,EACZ,aAAiC,EACjC,aAAqB;IAErB,IAAI,QAAQ,GAAG;QACb,IAAI,mBAAmB,CAAC,QAAQ,EAAE,EAAE,CAAC;YACnC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,SAAS,CAAC,IAAI,CACZ,yJAAyJ,EACzJ,aAAa,CAAC,CAAC;YACb,UAAG,aAAa,eAAK,aAAa,MAAG;YACvC,CAAC,CAAC,oBAAa,aAAa,CAAE,EAC9B,UAAG,IAAI,cAAI,SAAS,CAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAC1C,CAAC;QAEF,QAAQ,GAAG,cAAM,OAAA,KAAK,EAAL,CAAK,CAAC;QAEvB,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IAEF,OAAO;QACL,GAAG;YACD,OAAO,QAAQ,EAAE,CAAC;QACpB,CAAC;QACD,GAAG,YAAC,QAAQ;YACV,QAAQ,GAAG,cAAM,OAAA,QAAQ,EAAR,CAAQ,CAAC;QAC5B,CAAC;QACD,UAAU,EAAE,IAAI;QAChB,YAAY,EAAE,IAAI;KACnB,CAAC;AACJ,CAAC","sourcesContent":["import { Kind } from \"graphql\";\nimport type { FragmentDefinitionNode, SelectionSetNode } from \"graphql\";\nimport {\n getFragmentMaskMode,\n maybeDeepFreeze,\n resultKeyNameFromField,\n} from \"../utilities/index.js\";\nimport type { FragmentMap } from \"../utilities/index.js\";\nimport type { ApolloCache } from \"../cache/index.js\";\nimport { disableWarningsSlot } from \"./utils.js\";\nimport { invariant } from \"../utilities/globals/index.js\";\n\ninterface MaskingContext {\n operationType: \"query\" | \"mutation\" | \"subscription\" | \"fragment\";\n operationName: string | undefined;\n fragmentMap: FragmentMap;\n cache: ApolloCache<unknown>;\n mutableTargets: WeakMap<any, any>;\n knownChanged: WeakSet<any>;\n}\n\nexport function maskDefinition(\n data: Record<string, any>,\n selectionSet: SelectionSetNode,\n context: MaskingContext\n) {\n return disableWarningsSlot.withValue(true, () => {\n const masked = maskSelectionSet(data, selectionSet, context, false);\n\n if (Object.isFrozen(data)) {\n maybeDeepFreeze(masked);\n }\n return masked;\n });\n}\n\nfunction getMutableTarget(\n data: Record<string, any>,\n mutableTargets: WeakMap<any, any>\n): typeof data {\n if (mutableTargets.has(data)) {\n return mutableTargets.get(data);\n }\n\n const mutableTarget = Array.isArray(data) ? [] : Object.create(null);\n mutableTargets.set(data, mutableTarget);\n return mutableTarget;\n}\n\nfunction maskSelectionSet(\n data: any,\n selectionSet: SelectionSetNode,\n context: MaskingContext,\n migration: boolean,\n path?: string | undefined\n): typeof data {\n const { knownChanged } = context;\n const memo = getMutableTarget(data, context.mutableTargets);\n\n if (Array.isArray(data)) {\n for (const [index, item] of Array.from(data.entries())) {\n if (item === null) {\n memo[index] = null;\n continue;\n }\n\n const masked = maskSelectionSet(\n item,\n selectionSet,\n context,\n migration,\n __DEV__ ? `${path || \"\"}[${index}]` : void 0\n );\n if (knownChanged.has(masked)) {\n knownChanged.add(memo);\n }\n\n memo[index] = masked;\n }\n\n return knownChanged.has(memo) ? memo : data;\n }\n\n for (const selection of selectionSet.selections) {\n let value: any;\n\n // we later want to add acessor warnings to the final result\n // so we need a new object to add the accessor warning to\n if (migration) {\n knownChanged.add(memo);\n }\n\n if (selection.kind === Kind.FIELD) {\n const keyName = resultKeyNameFromField(selection);\n const childSelectionSet = selection.selectionSet;\n\n value = memo[keyName] || data[keyName];\n\n if (value === void 0) {\n continue;\n }\n\n if (childSelectionSet && value !== null) {\n const masked = maskSelectionSet(\n data[keyName],\n childSelectionSet,\n context,\n migration,\n __DEV__ ? `${path || \"\"}.${keyName}` : void 0\n );\n\n if (knownChanged.has(masked)) {\n value = masked;\n }\n }\n\n if (!__DEV__) {\n memo[keyName] = value;\n }\n if (__DEV__) {\n if (\n migration &&\n keyName !== \"__typename\" &&\n // either the field is not present in the memo object\n // or it has a `get` descriptor, not a `value` descriptor\n // => it is a warning accessor and we can overwrite it\n // with another accessor\n !Object.getOwnPropertyDescriptor(memo, keyName)?.value\n ) {\n Object.defineProperty(\n memo,\n keyName,\n getAccessorWarningDescriptor(\n keyName,\n value,\n path || \"\",\n context.operationName,\n context.operationType\n )\n );\n } else {\n delete memo[keyName];\n memo[keyName] = value;\n }\n }\n }\n\n if (\n selection.kind === Kind.INLINE_FRAGMENT &&\n (!selection.typeCondition ||\n context.cache.fragmentMatches!(selection, data.__typename))\n ) {\n value = maskSelectionSet(\n data,\n selection.selectionSet,\n context,\n migration,\n path\n );\n }\n\n if (selection.kind === Kind.FRAGMENT_SPREAD) {\n const fragmentName = selection.name.value;\n const fragment: FragmentDefinitionNode | null =\n context.fragmentMap[fragmentName] ||\n (context.fragmentMap[fragmentName] =\n context.cache.lookupFragment(fragmentName)!);\n invariant(\n fragment,\n \"Could not find fragment with name '%s'.\",\n fragmentName\n );\n\n const mode = getFragmentMaskMode(selection);\n\n if (mode !== \"mask\") {\n value = maskSelectionSet(\n data,\n fragment.selectionSet,\n context,\n mode === \"migrate\",\n path\n );\n }\n }\n\n if (knownChanged.has(value)) {\n knownChanged.add(memo);\n }\n }\n\n if (\"__typename\" in data && !(\"__typename\" in memo)) {\n memo.__typename = data.__typename;\n }\n\n // This check prevents cases where masked fields may accidentally be\n // returned as part of this object when the fragment also selects\n // additional fields from the same child selection.\n if (Object.keys(memo).length !== Object.keys(data).length) {\n knownChanged.add(memo);\n }\n\n return knownChanged.has(memo) ? memo : data;\n}\n\nfunction getAccessorWarningDescriptor(\n fieldName: string,\n value: any,\n path: string,\n operationName: string | undefined,\n operationType: string\n): PropertyDescriptor {\n let getValue = () => {\n if (disableWarningsSlot.getValue()) {\n return value;\n }\n\n invariant.warn(\n \"Accessing unmasked field on %s at path '%s'. This field will not be available when masking is enabled. Please read the field from the fragment instead.\",\n operationName ?\n `${operationType} '${operationName}'`\n : `anonymous ${operationType}`,\n `${path}.${fieldName}`.replace(/^\\./, \"\")\n );\n\n getValue = () => value;\n\n return value;\n };\n\n return {\n get() {\n return getValue();\n },\n set(newValue) {\n getValue = () => newValue;\n },\n enumerable: true,\n configurable: true,\n };\n}\n"]}
@@ -0,0 +1,4 @@
1
+ import type { ApolloCache, DocumentNode, TypedDocumentNode } from "../core/index.js";
2
+ /** @internal */
3
+ export declare function maskFragment<TData = unknown>(data: TData, document: TypedDocumentNode<TData> | DocumentNode, cache: ApolloCache<unknown>, fragmentName?: string): TData;
4
+ //# sourceMappingURL=maskFragment.d.ts.map
@@ -0,0 +1,43 @@
1
+ import { Kind } from "graphql";
2
+ import { MapImpl, SetImpl, warnOnImproperCacheImplementation, } from "./utils.js";
3
+ import { invariant } from "../utilities/globals/index.js";
4
+ import equal from "@wry/equality";
5
+ import { maskDefinition } from "./maskDefinition.js";
6
+ import { createFragmentMap, getFragmentDefinitions, } from "../utilities/index.js";
7
+ /** @internal */
8
+ export function maskFragment(data, document, cache, fragmentName) {
9
+ if (!cache.fragmentMatches) {
10
+ if (globalThis.__DEV__ !== false) {
11
+ warnOnImproperCacheImplementation();
12
+ }
13
+ return data;
14
+ }
15
+ var fragments = document.definitions.filter(function (node) {
16
+ return node.kind === Kind.FRAGMENT_DEFINITION;
17
+ });
18
+ if (typeof fragmentName === "undefined") {
19
+ invariant(fragments.length === 1, 49, fragments.length);
20
+ fragmentName = fragments[0].name.value;
21
+ }
22
+ var fragment = fragments.find(function (fragment) { return fragment.name.value === fragmentName; });
23
+ invariant(!!fragment, 50, fragmentName);
24
+ if (data == null) {
25
+ // Maintain the original `null` or `undefined` value
26
+ return data;
27
+ }
28
+ if (equal(data, {})) {
29
+ // Return early and skip the masking algorithm if we don't have any data
30
+ // yet. This can happen when cache.diff returns an empty object which is
31
+ // used from watchFragment.
32
+ return data;
33
+ }
34
+ return maskDefinition(data, fragment.selectionSet, {
35
+ operationType: "fragment",
36
+ operationName: fragment.name.value,
37
+ fragmentMap: createFragmentMap(getFragmentDefinitions(document)),
38
+ cache: cache,
39
+ mutableTargets: new MapImpl(),
40
+ knownChanged: new SetImpl(),
41
+ });
42
+ }
43
+ //# sourceMappingURL=maskFragment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"maskFragment.js","sourceRoot":"","sources":["../../src/masking/maskFragment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAO/B,OAAO,EACL,OAAO,EACP,OAAO,EACP,iCAAiC,GAClC,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAC1D,OAAO,KAAK,MAAM,eAAe,CAAC;AAClC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EACL,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAE/B,gBAAgB;AAChB,MAAM,UAAU,YAAY,CAC1B,IAAW,EACX,QAAiD,EACjD,KAA2B,EAC3B,YAAqB;IAErB,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC;QAC3B,IAAI,OAAO,EAAE,CAAC;YACZ,iCAAiC,EAAE,CAAC;QACtC,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAM,SAAS,GAAG,QAAQ,CAAC,WAAW,CAAC,MAAM,CAC3C,UAAC,IAAI;QACH,OAAA,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,mBAAmB;IAAtC,CAAsC,CACzC,CAAC;IAEF,IAAI,OAAO,YAAY,KAAK,WAAW,EAAE,CAAC;QACxC,SAAS,CACP,SAAS,CAAC,MAAM,KAAK,CAAC,EACtB,2FAA6F,EAC7F,SAAS,CAAC,MAAM,CACjB,CAAC;QACF,YAAY,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;IACzC,CAAC;IAED,IAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAC7B,UAAC,QAAQ,IAAK,OAAA,QAAQ,CAAC,IAAI,CAAC,KAAK,KAAK,YAAY,EAApC,CAAoC,CACnD,CAAC;IAEF,SAAS,CACP,CAAC,CAAC,QAAQ,EACV,2CAAyC,EACzC,YAAY,CACb,CAAC;IAEF,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;QACjB,oDAAoD;QACpD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC;QACpB,wEAAwE;QACxE,wEAAwE;QACxE,2BAA2B;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,YAAY,EAAE;QACjD,aAAa,EAAE,UAAU;QACzB,aAAa,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK;QAClC,WAAW,EAAE,iBAAiB,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC;QAChE,KAAK,OAAA;QACL,cAAc,EAAE,IAAI,OAAO,EAAE;QAC7B,YAAY,EAAE,IAAI,OAAO,EAAE;KAC5B,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { Kind } from \"graphql\";\nimport type { FragmentDefinitionNode } from \"graphql\";\nimport type {\n ApolloCache,\n DocumentNode,\n TypedDocumentNode,\n} from \"../core/index.js\";\nimport {\n MapImpl,\n SetImpl,\n warnOnImproperCacheImplementation,\n} from \"./utils.js\";\nimport { invariant } from \"../utilities/globals/index.js\";\nimport equal from \"@wry/equality\";\nimport { maskDefinition } from \"./maskDefinition.js\";\nimport {\n createFragmentMap,\n getFragmentDefinitions,\n} from \"../utilities/index.js\";\n\n/** @internal */\nexport function maskFragment<TData = unknown>(\n data: TData,\n document: TypedDocumentNode<TData> | DocumentNode,\n cache: ApolloCache<unknown>,\n fragmentName?: string\n): TData {\n if (!cache.fragmentMatches) {\n if (__DEV__) {\n warnOnImproperCacheImplementation();\n }\n\n return data;\n }\n\n const fragments = document.definitions.filter(\n (node): node is FragmentDefinitionNode =>\n node.kind === Kind.FRAGMENT_DEFINITION\n );\n\n if (typeof fragmentName === \"undefined\") {\n invariant(\n fragments.length === 1,\n `Found %s fragments. \\`fragmentName\\` must be provided when there is not exactly 1 fragment.`,\n fragments.length\n );\n fragmentName = fragments[0].name.value;\n }\n\n const fragment = fragments.find(\n (fragment) => fragment.name.value === fragmentName\n );\n\n invariant(\n !!fragment,\n `Could not find fragment with name \"%s\".`,\n fragmentName\n );\n\n if (data == null) {\n // Maintain the original `null` or `undefined` value\n return data;\n }\n\n if (equal(data, {})) {\n // Return early and skip the masking algorithm if we don't have any data\n // yet. This can happen when cache.diff returns an empty object which is\n // used from watchFragment.\n return data;\n }\n\n return maskDefinition(data, fragment.selectionSet, {\n operationType: \"fragment\",\n operationName: fragment.name.value,\n fragmentMap: createFragmentMap(getFragmentDefinitions(document)),\n cache,\n mutableTargets: new MapImpl(),\n knownChanged: new SetImpl(),\n });\n}\n"]}
@@ -0,0 +1,4 @@
1
+ import type { ApolloCache, DocumentNode, TypedDocumentNode } from "../core/index.js";
2
+ /** @internal */
3
+ export declare function maskOperation<TData = unknown>(data: TData, document: DocumentNode | TypedDocumentNode<TData>, cache: ApolloCache<unknown>): TData;
4
+ //# sourceMappingURL=maskOperation.d.ts.map
@@ -0,0 +1,29 @@
1
+ import { invariant } from "../utilities/globals/index.js";
2
+ import { createFragmentMap, getFragmentDefinitions, getOperationDefinition, } from "../utilities/index.js";
3
+ import { maskDefinition } from "./maskDefinition.js";
4
+ import { MapImpl, SetImpl, warnOnImproperCacheImplementation, } from "./utils.js";
5
+ /** @internal */
6
+ export function maskOperation(data, document, cache) {
7
+ var _a;
8
+ if (!cache.fragmentMatches) {
9
+ if (globalThis.__DEV__ !== false) {
10
+ warnOnImproperCacheImplementation();
11
+ }
12
+ return data;
13
+ }
14
+ var definition = getOperationDefinition(document);
15
+ invariant(definition, 51);
16
+ if (data == null) {
17
+ // Maintain the original `null` or `undefined` value
18
+ return data;
19
+ }
20
+ return maskDefinition(data, definition.selectionSet, {
21
+ operationType: definition.operation,
22
+ operationName: (_a = definition.name) === null || _a === void 0 ? void 0 : _a.value,
23
+ fragmentMap: createFragmentMap(getFragmentDefinitions(document)),
24
+ cache: cache,
25
+ mutableTargets: new MapImpl(),
26
+ knownChanged: new SetImpl(),
27
+ });
28
+ }
29
+ //# sourceMappingURL=maskOperation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"maskOperation.js","sourceRoot":"","sources":["../../src/masking/maskOperation.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAC1D,OAAO,EACL,iBAAiB,EACjB,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EACL,OAAO,EACP,OAAO,EACP,iCAAiC,GAClC,MAAM,YAAY,CAAC;AAEpB,gBAAgB;AAChB,MAAM,UAAU,aAAa,CAC3B,IAAW,EACX,QAAiD,EACjD,KAA2B;;IAE3B,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC;QAC3B,IAAI,OAAO,EAAE,CAAC;YACZ,iCAAiC,EAAE,CAAC;QACtC,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAM,UAAU,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IAEpD,SAAS,CACP,UAAU,EACV,6EAA6E,CAC9E,CAAC;IAEF,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;QACjB,oDAAoD;QACpD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,cAAc,CAAC,IAAI,EAAE,UAAU,CAAC,YAAY,EAAE;QACnD,aAAa,EAAE,UAAU,CAAC,SAAS;QACnC,aAAa,EAAE,MAAA,UAAU,CAAC,IAAI,0CAAE,KAAK;QACrC,WAAW,EAAE,iBAAiB,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC;QAChE,KAAK,OAAA;QACL,cAAc,EAAE,IAAI,OAAO,EAAE;QAC7B,YAAY,EAAE,IAAI,OAAO,EAAE;KAC5B,CAAC,CAAC;AACL,CAAC","sourcesContent":["import type {\n ApolloCache,\n DocumentNode,\n TypedDocumentNode,\n} from \"../core/index.js\";\nimport { invariant } from \"../utilities/globals/index.js\";\nimport {\n createFragmentMap,\n getFragmentDefinitions,\n getOperationDefinition,\n} from \"../utilities/index.js\";\nimport { maskDefinition } from \"./maskDefinition.js\";\nimport {\n MapImpl,\n SetImpl,\n warnOnImproperCacheImplementation,\n} from \"./utils.js\";\n\n/** @internal */\nexport function maskOperation<TData = unknown>(\n data: TData,\n document: DocumentNode | TypedDocumentNode<TData>,\n cache: ApolloCache<unknown>\n): TData {\n if (!cache.fragmentMatches) {\n if (__DEV__) {\n warnOnImproperCacheImplementation();\n }\n\n return data;\n }\n\n const definition = getOperationDefinition(document);\n\n invariant(\n definition,\n \"Expected a parsed GraphQL document with a query, mutation, or subscription.\"\n );\n\n if (data == null) {\n // Maintain the original `null` or `undefined` value\n return data;\n }\n\n return maskDefinition(data, definition.selectionSet, {\n operationType: definition.operation,\n operationName: definition.name?.value,\n fragmentMap: createFragmentMap(getFragmentDefinitions(document)),\n cache,\n mutableTargets: new MapImpl(),\n knownChanged: new SetImpl(),\n });\n}\n"]}