expo-iap 3.2.1 → 3.3.0-rc.2

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 (30) hide show
  1. package/coverage/clover.xml +7 -7
  2. package/coverage/coverage-final.json +5 -5
  3. package/coverage/lcov-report/block-navigation.js +1 -1
  4. package/coverage/lcov-report/index.html +1 -1
  5. package/coverage/lcov-report/sorter.js +7 -21
  6. package/coverage/lcov-report/src/ExpoIap.types.ts.html +1396 -0
  7. package/coverage/lcov-report/src/helpers/index.html +116 -0
  8. package/coverage/lcov-report/src/helpers/subscription.ts.html +499 -0
  9. package/coverage/lcov-report/src/index.html +1 -1
  10. package/coverage/lcov-report/src/index.ts.html +1 -1
  11. package/coverage/lcov-report/src/modules/android.ts.html +1 -1
  12. package/coverage/lcov-report/src/modules/index.html +1 -1
  13. package/coverage/lcov-report/src/modules/ios.ts.html +1 -1
  14. package/coverage/lcov-report/src/onside/ExpoOnsideMarketplaceAvailabilityModule.ts.html +145 -0
  15. package/coverage/lcov-report/src/onside/index.html +131 -0
  16. package/coverage/lcov-report/src/onside/index.ts.html +253 -0
  17. package/coverage/lcov-report/src/types/ExpoIapAndroid.types.ts.html +502 -0
  18. package/coverage/lcov-report/src/types/index.html +116 -0
  19. package/coverage/lcov-report/src/useIAP.ts.html +1654 -0
  20. package/coverage/lcov-report/src/utils/constants.ts.html +127 -0
  21. package/coverage/lcov-report/src/utils/debug.ts.html +1 -1
  22. package/coverage/lcov-report/src/utils/errorMapping.ts.html +1 -1
  23. package/coverage/lcov-report/src/utils/index.html +1 -1
  24. package/ios/expoiap.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  25. package/ios/expoiap.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  26. package/package.json +1 -1
  27. package/plugin/build/withIAP.d.ts +5 -8
  28. package/plugin/build/withIAP.js +3 -12
  29. package/plugin/src/withIAP.ts +9 -18
  30. package/plugin/tsconfig.tsbuildinfo +1 -1
@@ -0,0 +1,116 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for src/helpers</title>
7
+ <meta charset="utf-8" />
8
+ <link rel="stylesheet" href="../../prettify.css" />
9
+ <link rel="stylesheet" href="../../base.css" />
10
+ <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" />
11
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
12
+ <style type='text/css'>
13
+ .coverage-summary .sorter {
14
+ background-image: url(../../sort-arrow-sprite.png);
15
+ }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <div class='wrapper'>
21
+ <div class='pad1'>
22
+ <h1><a href="../../index.html">All files</a> src/helpers</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">96.66% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>58/60</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">92.68% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>38/41</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">100% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>4/4</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">98.24% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>56/57</span>
50
+ </div>
51
+
52
+
53
+ </div>
54
+ <p class="quiet">
55
+ Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
+ </p>
57
+ <template id="filterTemplate">
58
+ <div class="quiet">
59
+ Filter:
60
+ <input type="search" id="fileSearch">
61
+ </div>
62
+ </template>
63
+ </div>
64
+ <div class='status-line high'></div>
65
+ <div class="pad1">
66
+ <table class="coverage-summary">
67
+ <thead>
68
+ <tr>
69
+ <th data-col="file" data-fmt="html" data-html="true" class="file">File</th>
70
+ <th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th>
71
+ <th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th>
72
+ <th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th>
73
+ <th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th>
74
+ <th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th>
75
+ <th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th>
76
+ <th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th>
77
+ <th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th>
78
+ <th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th>
79
+ </tr>
80
+ </thead>
81
+ <tbody><tr>
82
+ <td class="file high" data-value="subscription.ts"><a href="subscription.ts.html">subscription.ts</a></td>
83
+ <td data-value="96.66" class="pic high">
84
+ <div class="chart"><div class="cover-fill" style="width: 96%"></div><div class="cover-empty" style="width: 4%"></div></div>
85
+ </td>
86
+ <td data-value="96.66" class="pct high">96.66%</td>
87
+ <td data-value="60" class="abs high">58/60</td>
88
+ <td data-value="92.68" class="pct high">92.68%</td>
89
+ <td data-value="41" class="abs high">38/41</td>
90
+ <td data-value="100" class="pct high">100%</td>
91
+ <td data-value="4" class="abs high">4/4</td>
92
+ <td data-value="98.24" class="pct high">98.24%</td>
93
+ <td data-value="57" class="abs high">56/57</td>
94
+ </tr>
95
+
96
+ </tbody>
97
+ </table>
98
+ </div>
99
+ <div class='push'></div><!-- for sticky footer -->
100
+ </div><!-- /wrapper -->
101
+ <div class='footer quiet pad2 space-top1 center small'>
102
+ Code coverage generated by
103
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
104
+ at 2025-10-02T12:12:15.204Z
105
+ </div>
106
+ <script src="../../prettify.js"></script>
107
+ <script>
108
+ window.onload = function () {
109
+ prettyPrint();
110
+ };
111
+ </script>
112
+ <script src="../../sorter.js"></script>
113
+ <script src="../../block-navigation.js"></script>
114
+ </body>
115
+ </html>
116
+
@@ -0,0 +1,499 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for src/helpers/subscription.ts</title>
7
+ <meta charset="utf-8" />
8
+ <link rel="stylesheet" href="../../prettify.css" />
9
+ <link rel="stylesheet" href="../../base.css" />
10
+ <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" />
11
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
12
+ <style type='text/css'>
13
+ .coverage-summary .sorter {
14
+ background-image: url(../../sort-arrow-sprite.png);
15
+ }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <div class='wrapper'>
21
+ <div class='pad1'>
22
+ <h1><a href="../../index.html">All files</a> / <a href="index.html">src/helpers</a> subscription.ts</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">96.66% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>58/60</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">92.68% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>38/41</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">100% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>4/4</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">98.24% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>56/57</span>
50
+ </div>
51
+
52
+
53
+ </div>
54
+ <p class="quiet">
55
+ Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
+ </p>
57
+ <template id="filterTemplate">
58
+ <div class="quiet">
59
+ Filter:
60
+ <input type="search" id="fileSearch">
61
+ </div>
62
+ </template>
63
+ </div>
64
+ <div class='status-line high'></div>
65
+ <pre><table class="coverage">
66
+ <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
+ <a name='L2'></a><a href='#L2'>2</a>
68
+ <a name='L3'></a><a href='#L3'>3</a>
69
+ <a name='L4'></a><a href='#L4'>4</a>
70
+ <a name='L5'></a><a href='#L5'>5</a>
71
+ <a name='L6'></a><a href='#L6'>6</a>
72
+ <a name='L7'></a><a href='#L7'>7</a>
73
+ <a name='L8'></a><a href='#L8'>8</a>
74
+ <a name='L9'></a><a href='#L9'>9</a>
75
+ <a name='L10'></a><a href='#L10'>10</a>
76
+ <a name='L11'></a><a href='#L11'>11</a>
77
+ <a name='L12'></a><a href='#L12'>12</a>
78
+ <a name='L13'></a><a href='#L13'>13</a>
79
+ <a name='L14'></a><a href='#L14'>14</a>
80
+ <a name='L15'></a><a href='#L15'>15</a>
81
+ <a name='L16'></a><a href='#L16'>16</a>
82
+ <a name='L17'></a><a href='#L17'>17</a>
83
+ <a name='L18'></a><a href='#L18'>18</a>
84
+ <a name='L19'></a><a href='#L19'>19</a>
85
+ <a name='L20'></a><a href='#L20'>20</a>
86
+ <a name='L21'></a><a href='#L21'>21</a>
87
+ <a name='L22'></a><a href='#L22'>22</a>
88
+ <a name='L23'></a><a href='#L23'>23</a>
89
+ <a name='L24'></a><a href='#L24'>24</a>
90
+ <a name='L25'></a><a href='#L25'>25</a>
91
+ <a name='L26'></a><a href='#L26'>26</a>
92
+ <a name='L27'></a><a href='#L27'>27</a>
93
+ <a name='L28'></a><a href='#L28'>28</a>
94
+ <a name='L29'></a><a href='#L29'>29</a>
95
+ <a name='L30'></a><a href='#L30'>30</a>
96
+ <a name='L31'></a><a href='#L31'>31</a>
97
+ <a name='L32'></a><a href='#L32'>32</a>
98
+ <a name='L33'></a><a href='#L33'>33</a>
99
+ <a name='L34'></a><a href='#L34'>34</a>
100
+ <a name='L35'></a><a href='#L35'>35</a>
101
+ <a name='L36'></a><a href='#L36'>36</a>
102
+ <a name='L37'></a><a href='#L37'>37</a>
103
+ <a name='L38'></a><a href='#L38'>38</a>
104
+ <a name='L39'></a><a href='#L39'>39</a>
105
+ <a name='L40'></a><a href='#L40'>40</a>
106
+ <a name='L41'></a><a href='#L41'>41</a>
107
+ <a name='L42'></a><a href='#L42'>42</a>
108
+ <a name='L43'></a><a href='#L43'>43</a>
109
+ <a name='L44'></a><a href='#L44'>44</a>
110
+ <a name='L45'></a><a href='#L45'>45</a>
111
+ <a name='L46'></a><a href='#L46'>46</a>
112
+ <a name='L47'></a><a href='#L47'>47</a>
113
+ <a name='L48'></a><a href='#L48'>48</a>
114
+ <a name='L49'></a><a href='#L49'>49</a>
115
+ <a name='L50'></a><a href='#L50'>50</a>
116
+ <a name='L51'></a><a href='#L51'>51</a>
117
+ <a name='L52'></a><a href='#L52'>52</a>
118
+ <a name='L53'></a><a href='#L53'>53</a>
119
+ <a name='L54'></a><a href='#L54'>54</a>
120
+ <a name='L55'></a><a href='#L55'>55</a>
121
+ <a name='L56'></a><a href='#L56'>56</a>
122
+ <a name='L57'></a><a href='#L57'>57</a>
123
+ <a name='L58'></a><a href='#L58'>58</a>
124
+ <a name='L59'></a><a href='#L59'>59</a>
125
+ <a name='L60'></a><a href='#L60'>60</a>
126
+ <a name='L61'></a><a href='#L61'>61</a>
127
+ <a name='L62'></a><a href='#L62'>62</a>
128
+ <a name='L63'></a><a href='#L63'>63</a>
129
+ <a name='L64'></a><a href='#L64'>64</a>
130
+ <a name='L65'></a><a href='#L65'>65</a>
131
+ <a name='L66'></a><a href='#L66'>66</a>
132
+ <a name='L67'></a><a href='#L67'>67</a>
133
+ <a name='L68'></a><a href='#L68'>68</a>
134
+ <a name='L69'></a><a href='#L69'>69</a>
135
+ <a name='L70'></a><a href='#L70'>70</a>
136
+ <a name='L71'></a><a href='#L71'>71</a>
137
+ <a name='L72'></a><a href='#L72'>72</a>
138
+ <a name='L73'></a><a href='#L73'>73</a>
139
+ <a name='L74'></a><a href='#L74'>74</a>
140
+ <a name='L75'></a><a href='#L75'>75</a>
141
+ <a name='L76'></a><a href='#L76'>76</a>
142
+ <a name='L77'></a><a href='#L77'>77</a>
143
+ <a name='L78'></a><a href='#L78'>78</a>
144
+ <a name='L79'></a><a href='#L79'>79</a>
145
+ <a name='L80'></a><a href='#L80'>80</a>
146
+ <a name='L81'></a><a href='#L81'>81</a>
147
+ <a name='L82'></a><a href='#L82'>82</a>
148
+ <a name='L83'></a><a href='#L83'>83</a>
149
+ <a name='L84'></a><a href='#L84'>84</a>
150
+ <a name='L85'></a><a href='#L85'>85</a>
151
+ <a name='L86'></a><a href='#L86'>86</a>
152
+ <a name='L87'></a><a href='#L87'>87</a>
153
+ <a name='L88'></a><a href='#L88'>88</a>
154
+ <a name='L89'></a><a href='#L89'>89</a>
155
+ <a name='L90'></a><a href='#L90'>90</a>
156
+ <a name='L91'></a><a href='#L91'>91</a>
157
+ <a name='L92'></a><a href='#L92'>92</a>
158
+ <a name='L93'></a><a href='#L93'>93</a>
159
+ <a name='L94'></a><a href='#L94'>94</a>
160
+ <a name='L95'></a><a href='#L95'>95</a>
161
+ <a name='L96'></a><a href='#L96'>96</a>
162
+ <a name='L97'></a><a href='#L97'>97</a>
163
+ <a name='L98'></a><a href='#L98'>98</a>
164
+ <a name='L99'></a><a href='#L99'>99</a>
165
+ <a name='L100'></a><a href='#L100'>100</a>
166
+ <a name='L101'></a><a href='#L101'>101</a>
167
+ <a name='L102'></a><a href='#L102'>102</a>
168
+ <a name='L103'></a><a href='#L103'>103</a>
169
+ <a name='L104'></a><a href='#L104'>104</a>
170
+ <a name='L105'></a><a href='#L105'>105</a>
171
+ <a name='L106'></a><a href='#L106'>106</a>
172
+ <a name='L107'></a><a href='#L107'>107</a>
173
+ <a name='L108'></a><a href='#L108'>108</a>
174
+ <a name='L109'></a><a href='#L109'>109</a>
175
+ <a name='L110'></a><a href='#L110'>110</a>
176
+ <a name='L111'></a><a href='#L111'>111</a>
177
+ <a name='L112'></a><a href='#L112'>112</a>
178
+ <a name='L113'></a><a href='#L113'>113</a>
179
+ <a name='L114'></a><a href='#L114'>114</a>
180
+ <a name='L115'></a><a href='#L115'>115</a>
181
+ <a name='L116'></a><a href='#L116'>116</a>
182
+ <a name='L117'></a><a href='#L117'>117</a>
183
+ <a name='L118'></a><a href='#L118'>118</a>
184
+ <a name='L119'></a><a href='#L119'>119</a>
185
+ <a name='L120'></a><a href='#L120'>120</a>
186
+ <a name='L121'></a><a href='#L121'>121</a>
187
+ <a name='L122'></a><a href='#L122'>122</a>
188
+ <a name='L123'></a><a href='#L123'>123</a>
189
+ <a name='L124'></a><a href='#L124'>124</a>
190
+ <a name='L125'></a><a href='#L125'>125</a>
191
+ <a name='L126'></a><a href='#L126'>126</a>
192
+ <a name='L127'></a><a href='#L127'>127</a>
193
+ <a name='L128'></a><a href='#L128'>128</a>
194
+ <a name='L129'></a><a href='#L129'>129</a>
195
+ <a name='L130'></a><a href='#L130'>130</a>
196
+ <a name='L131'></a><a href='#L131'>131</a>
197
+ <a name='L132'></a><a href='#L132'>132</a>
198
+ <a name='L133'></a><a href='#L133'>133</a>
199
+ <a name='L134'></a><a href='#L134'>134</a>
200
+ <a name='L135'></a><a href='#L135'>135</a>
201
+ <a name='L136'></a><a href='#L136'>136</a>
202
+ <a name='L137'></a><a href='#L137'>137</a>
203
+ <a name='L138'></a><a href='#L138'>138</a>
204
+ <a name='L139'></a><a href='#L139'>139</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">2x</span>
205
+ <span class="cline-any cline-yes">2x</span>
206
+ <span class="cline-any cline-neutral">&nbsp;</span>
207
+ <span class="cline-any cline-yes">2x</span>
208
+ <span class="cline-any cline-neutral">&nbsp;</span>
209
+ <span class="cline-any cline-neutral">&nbsp;</span>
210
+ <span class="cline-any cline-neutral">&nbsp;</span>
211
+ <span class="cline-any cline-neutral">&nbsp;</span>
212
+ <span class="cline-any cline-neutral">&nbsp;</span>
213
+ <span class="cline-any cline-neutral">&nbsp;</span>
214
+ <span class="cline-any cline-yes">2x</span>
215
+ <span class="cline-any cline-neutral">&nbsp;</span>
216
+ <span class="cline-any cline-neutral">&nbsp;</span>
217
+ <span class="cline-any cline-yes">18x</span>
218
+ <span class="cline-any cline-yes">18x</span>
219
+ <span class="cline-any cline-yes">17x</span>
220
+ <span class="cline-any cline-yes">17x</span>
221
+ <span class="cline-any cline-neutral">&nbsp;</span>
222
+ <span class="cline-any cline-neutral">&nbsp;</span>
223
+ <span class="cline-any cline-yes">17x</span>
224
+ <span class="cline-any cline-neutral">&nbsp;</span>
225
+ <span class="cline-any cline-yes">18x</span>
226
+ <span class="cline-any cline-yes">6x</span>
227
+ <span class="cline-any cline-yes">3x</span>
228
+ <span class="cline-any cline-neutral">&nbsp;</span>
229
+ <span class="cline-any cline-neutral">&nbsp;</span>
230
+ <span class="cline-any cline-neutral">&nbsp;</span>
231
+ <span class="cline-any cline-neutral">&nbsp;</span>
232
+ <span class="cline-any cline-neutral">&nbsp;</span>
233
+ <span class="cline-any cline-yes">15x</span>
234
+ <span class="cline-any cline-neutral">&nbsp;</span>
235
+ <span class="cline-any cline-neutral">&nbsp;</span>
236
+ <span class="cline-any cline-neutral">&nbsp;</span>
237
+ <span class="cline-any cline-yes">15x</span>
238
+ <span class="cline-any cline-yes">1x</span>
239
+ <span class="cline-any cline-neutral">&nbsp;</span>
240
+ <span class="cline-any cline-neutral">&nbsp;</span>
241
+ <span class="cline-any cline-neutral">&nbsp;</span>
242
+ <span class="cline-any cline-yes">14x</span>
243
+ <span class="cline-any cline-yes">11x</span>
244
+ <span class="cline-any cline-yes">10x</span>
245
+ <span class="cline-any cline-neutral">&nbsp;</span>
246
+ <span class="cline-any cline-neutral">&nbsp;</span>
247
+ <span class="cline-any cline-neutral">&nbsp;</span>
248
+ <span class="cline-any cline-yes">1x</span>
249
+ <span class="cline-any cline-yes">1x</span>
250
+ <span class="cline-any cline-neutral">&nbsp;</span>
251
+ <span class="cline-any cline-yes">1x</span>
252
+ <span class="cline-any cline-neutral">&nbsp;</span>
253
+ <span class="cline-any cline-neutral">&nbsp;</span>
254
+ <span class="cline-any cline-neutral">&nbsp;</span>
255
+ <span class="cline-any cline-yes">1x</span>
256
+ <span class="cline-any cline-neutral">&nbsp;</span>
257
+ <span class="cline-any cline-neutral">&nbsp;</span>
258
+ <span class="cline-any cline-neutral">&nbsp;</span>
259
+ <span class="cline-any cline-neutral">&nbsp;</span>
260
+ <span class="cline-any cline-yes">1x</span>
261
+ <span class="cline-any cline-neutral">&nbsp;</span>
262
+ <span class="cline-any cline-neutral">&nbsp;</span>
263
+ <span class="cline-any cline-neutral">&nbsp;</span>
264
+ <span class="cline-any cline-yes">3x</span>
265
+ <span class="cline-any cline-neutral">&nbsp;</span>
266
+ <span class="cline-any cline-yes">3x</span>
267
+ <span class="cline-any cline-neutral">&nbsp;</span>
268
+ <span class="cline-any cline-neutral">&nbsp;</span>
269
+ <span class="cline-any cline-no">&nbsp;</span>
270
+ <span class="cline-any cline-neutral">&nbsp;</span>
271
+ <span class="cline-any cline-neutral">&nbsp;</span>
272
+ <span class="cline-any cline-neutral">&nbsp;</span>
273
+ <span class="cline-any cline-yes">17x</span>
274
+ <span class="cline-any cline-yes">17x</span>
275
+ <span class="cline-any cline-yes">13x</span>
276
+ <span class="cline-any cline-yes">13x</span>
277
+ <span class="cline-any cline-yes">13x</span>
278
+ <span class="cline-any cline-yes">13x</span>
279
+ <span class="cline-any cline-neutral">&nbsp;</span>
280
+ <span class="cline-any cline-neutral">&nbsp;</span>
281
+ <span class="cline-any cline-neutral">&nbsp;</span>
282
+ <span class="cline-any cline-yes">17x</span>
283
+ <span class="cline-any cline-yes">13x</span>
284
+ <span class="cline-any cline-neutral">&nbsp;</span>
285
+ <span class="cline-any cline-neutral">&nbsp;</span>
286
+ <span class="cline-any cline-neutral">&nbsp;</span>
287
+ <span class="cline-any cline-neutral">&nbsp;</span>
288
+ <span class="cline-any cline-neutral">&nbsp;</span>
289
+ <span class="cline-any cline-neutral">&nbsp;</span>
290
+ <span class="cline-any cline-neutral">&nbsp;</span>
291
+ <span class="cline-any cline-neutral">&nbsp;</span>
292
+ <span class="cline-any cline-yes">13x</span>
293
+ <span class="cline-any cline-yes">10x</span>
294
+ <span class="cline-any cline-yes">9x</span>
295
+ <span class="cline-any cline-neutral">&nbsp;</span>
296
+ <span class="cline-any cline-neutral">&nbsp;</span>
297
+ <span class="cline-any cline-yes">9x</span>
298
+ <span class="cline-any cline-neutral">&nbsp;</span>
299
+ <span class="cline-any cline-neutral">&nbsp;</span>
300
+ <span class="cline-any cline-yes">9x</span>
301
+ <span class="cline-any cline-yes">9x</span>
302
+ <span class="cline-any cline-neutral">&nbsp;</span>
303
+ <span class="cline-any cline-neutral">&nbsp;</span>
304
+ <span class="cline-any cline-yes">10x</span>
305
+ <span class="cline-any cline-yes">2x</span>
306
+ <span class="cline-any cline-neutral">&nbsp;</span>
307
+ <span class="cline-any cline-yes">3x</span>
308
+ <span class="cline-any cline-yes">3x</span>
309
+ <span class="cline-any cline-yes">3x</span>
310
+ <span class="cline-any cline-yes">3x</span>
311
+ <span class="cline-any cline-neutral">&nbsp;</span>
312
+ <span class="cline-any cline-neutral">&nbsp;</span>
313
+ <span class="cline-any cline-yes">3x</span>
314
+ <span class="cline-any cline-yes">1x</span>
315
+ <span class="cline-any cline-yes">2x</span>
316
+ <span class="cline-any cline-yes">2x</span>
317
+ <span class="cline-any cline-neutral">&nbsp;</span>
318
+ <span class="cline-any cline-neutral">&nbsp;</span>
319
+ <span class="cline-any cline-neutral">&nbsp;</span>
320
+ <span class="cline-any cline-neutral">&nbsp;</span>
321
+ <span class="cline-any cline-yes">13x</span>
322
+ <span class="cline-any cline-neutral">&nbsp;</span>
323
+ <span class="cline-any cline-neutral">&nbsp;</span>
324
+ <span class="cline-any cline-yes">17x</span>
325
+ <span class="cline-any cline-neutral">&nbsp;</span>
326
+ <span class="cline-any cline-yes">1x</span>
327
+ <span class="cline-any cline-yes">1x</span>
328
+ <span class="cline-any cline-neutral">&nbsp;</span>
329
+ <span class="cline-any cline-neutral">&nbsp;</span>
330
+ <span class="cline-any cline-neutral">&nbsp;</span>
331
+ <span class="cline-any cline-neutral">&nbsp;</span>
332
+ <span class="cline-any cline-neutral">&nbsp;</span>
333
+ <span class="cline-any cline-neutral">&nbsp;</span>
334
+ <span class="cline-any cline-neutral">&nbsp;</span>
335
+ <span class="cline-any cline-neutral">&nbsp;</span>
336
+ <span class="cline-any cline-yes">2x</span>
337
+ <span class="cline-any cline-neutral">&nbsp;</span>
338
+ <span class="cline-any cline-neutral">&nbsp;</span>
339
+ <span class="cline-any cline-yes">4x</span>
340
+ <span class="cline-any cline-yes">4x</span>
341
+ <span class="cline-any cline-neutral">&nbsp;</span>
342
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import {Platform} from 'react-native';
343
+ import {getAvailablePurchases} from '../index';
344
+ import type {ActiveSubscription} from '../types';
345
+ import {ExpoIapConsole} from '../utils/debug';
346
+ &nbsp;
347
+ /**
348
+ * Get all active subscriptions with detailed information
349
+ * @param subscriptionIds - Optional array of subscription product IDs to filter. If not provided, returns all active subscriptions.
350
+ * @returns Promise&lt;ActiveSubscription[]&gt; array of active subscriptions with details
351
+ */
352
+ export const getActiveSubscriptions = async (
353
+ subscriptionIds?: string[],
354
+ ): Promise&lt;ActiveSubscription[]&gt; =&gt; {
355
+ try {
356
+ const purchases = await getAvailablePurchases();
357
+ const currentTime = Date.now();
358
+ const activeSubscriptions: ActiveSubscription[] = [];
359
+ &nbsp;
360
+ // Filter purchases to find active subscriptions
361
+ const filteredPurchases = purchases.filter((purchase) =&gt; {
362
+ // If specific IDs provided, filter by them
363
+ if (subscriptionIds &amp;&amp; subscriptionIds.length &gt; 0) {
364
+ if (!subscriptionIds.includes(purchase.productId)) {
365
+ return false;
366
+ }
367
+ }
368
+ &nbsp;
369
+ // Check if this purchase has subscription-specific fields
370
+ const hasSubscriptionFields =
371
+ ('expirationDateIOS' in purchase &amp;&amp; !!purchase.expirationDateIOS) ||
372
+ 'autoRenewingAndroid' in purchase ||
373
+ ('environmentIOS' in purchase &amp;&amp; !!(purchase as any).environmentIOS);
374
+ &nbsp;
375
+ if (!hasSubscriptionFields) {
376
+ return false;
377
+ }
378
+ &nbsp;
379
+ // Check if it's actually active
380
+ if (Platform.OS === 'ios') {
381
+ if ('expirationDateIOS' in purchase &amp;&amp; purchase.expirationDateIOS) {
382
+ return purchase.expirationDateIOS &gt; currentTime;
383
+ }
384
+ // For iOS purchases without expiration date (like Sandbox), we consider them active
385
+ // if they have the environmentIOS field and were created recently
386
+ if ('environmentIOS' in purchase &amp;&amp; purchase.environmentIOS) {
387
+ const dayInMs = 24 * 60 * 60 * 1000;
388
+ // If no expiration date, consider active if transaction is recent (within 24 hours for Sandbox)
389
+ if (
390
+ !('expirationDateIOS' in purchase) ||
391
+ <span class="branch-1 cbranch-no" title="branch not covered" > !purchase.expirationDateIOS</span>
392
+ ) {
393
+ if (
394
+ purchase.environmentIOS === 'Sandbox' &amp;&amp;
395
+ purchase.transactionDate &amp;&amp;
396
+ currentTime - purchase.transactionDate &lt; dayInMs
397
+ ) {
398
+ return true;
399
+ }
400
+ }
401
+ }
402
+ } else if (Platform.OS === 'android') {
403
+ // For Android, if it's in the purchases list, it's active
404
+ return true;
405
+ }
406
+ &nbsp;
407
+ <span class="cstat-no" title="statement not covered" > return false;</span>
408
+ });
409
+ &nbsp;
410
+ // Deduplicate by transaction identifier (id)
411
+ const seen = new Set&lt;string&gt;();
412
+ const dedupedPurchases = filteredPurchases.filter((p) =&gt; {
413
+ const key = String(p.id);
414
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (seen.has(key)) <span class="cstat-no" title="statement not covered" >return false;</span>
415
+ seen.add(key);
416
+ return true;
417
+ });
418
+ &nbsp;
419
+ // Convert to ActiveSubscription format
420
+ for (const purchase of dedupedPurchases) {
421
+ const subscription: ActiveSubscription = {
422
+ productId: purchase.productId,
423
+ isActive: true,
424
+ transactionId: String(purchase.id),
425
+ purchaseToken: purchase.purchaseToken,
426
+ transactionDate: purchase.transactionDate,
427
+ };
428
+ &nbsp;
429
+ // Add platform-specific details
430
+ if (Platform.OS === 'ios') {
431
+ if ('expirationDateIOS' in purchase &amp;&amp; purchase.expirationDateIOS) {
432
+ subscription.expirationDateIOS = purchase.expirationDateIOS;
433
+ &nbsp;
434
+ // Calculate days until expiration (round to nearest day)
435
+ const daysUntilExpiration = Math.round(
436
+ (purchase.expirationDateIOS - currentTime) / (1000 * 60 * 60 * 24),
437
+ );
438
+ subscription.daysUntilExpirationIOS = daysUntilExpiration;
439
+ subscription.willExpireSoon = daysUntilExpiration &lt;= 7;
440
+ }
441
+ &nbsp;
442
+ if ('environmentIOS' in purchase) {
443
+ subscription.environmentIOS = purchase.environmentIOS ?? <span class="branch-1 cbranch-no" title="branch not covered" >undefined;</span>
444
+ }
445
+ } else if (Platform.OS === 'android') {
446
+ if ('autoRenewingAndroid' in purchase) {
447
+ if (typeof purchase.autoRenewingAndroid !== 'undefined') {
448
+ subscription.autoRenewingAndroid = purchase.autoRenewingAndroid;
449
+ }
450
+ // If auto-renewing is false, subscription will expire soon
451
+ if (purchase.autoRenewingAndroid === false) {
452
+ subscription.willExpireSoon = true;
453
+ } else if (purchase.autoRenewingAndroid === true) {
454
+ subscription.willExpireSoon = false;
455
+ }
456
+ }
457
+ }
458
+ &nbsp;
459
+ activeSubscriptions.push(subscription);
460
+ }
461
+ &nbsp;
462
+ return activeSubscriptions;
463
+ } catch (error) {
464
+ ExpoIapConsole.error('Error getting active subscriptions:', error);
465
+ return [];
466
+ }
467
+ };
468
+ &nbsp;
469
+ /**
470
+ * Check if user has any active subscriptions
471
+ * @param subscriptionIds - Optional array of subscription product IDs to check. If not provided, checks all subscriptions.
472
+ * @returns Promise&lt;boolean&gt; true if user has at least one active subscription
473
+ */
474
+ export const hasActiveSubscriptions = async (
475
+ subscriptionIds?: string[],
476
+ ): Promise&lt;boolean&gt; =&gt; {
477
+ const subscriptions = await getActiveSubscriptions(subscriptionIds);
478
+ return subscriptions.length &gt; 0;
479
+ };
480
+ &nbsp;</pre></td></tr></table></pre>
481
+
482
+ <div class='push'></div><!-- for sticky footer -->
483
+ </div><!-- /wrapper -->
484
+ <div class='footer quiet pad2 space-top1 center small'>
485
+ Code coverage generated by
486
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
487
+ at 2025-10-02T12:12:15.204Z
488
+ </div>
489
+ <script src="../../prettify.js"></script>
490
+ <script>
491
+ window.onload = function () {
492
+ prettyPrint();
493
+ };
494
+ </script>
495
+ <script src="../../sorter.js"></script>
496
+ <script src="../../block-navigation.js"></script>
497
+ </body>
498
+ </html>
499
+
@@ -101,7 +101,7 @@
101
101
  <div class='footer quiet pad2 space-top1 center small'>
102
102
  Code coverage generated by
103
103
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
104
- at 2025-12-13T16:00:09.743Z
104
+ at 2025-12-13T05:45:54.833Z
105
105
  </div>
106
106
  <script src="../prettify.js"></script>
107
107
  <script>
@@ -2554,7 +2554,7 @@ export {<span class="fstat-no" title="function not covered" >ExpoIapConsole}</sp
2554
2554
  <div class='footer quiet pad2 space-top1 center small'>
2555
2555
  Code coverage generated by
2556
2556
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
2557
- at 2025-12-13T16:00:09.743Z
2557
+ at 2025-12-13T05:45:54.833Z
2558
2558
  </div>
2559
2559
  <script src="../prettify.js"></script>
2560
2560
  <script>
@@ -1045,7 +1045,7 @@ export const createBillingProgramReportingDetailsAndroid = async (
1045
1045
  <div class='footer quiet pad2 space-top1 center small'>
1046
1046
  Code coverage generated by
1047
1047
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1048
- at 2025-12-13T16:00:09.743Z
1048
+ at 2025-12-13T05:45:54.833Z
1049
1049
  </div>
1050
1050
  <script src="../../prettify.js"></script>
1051
1051
  <script>