@mapbox/cloudfriend 9.2.1 → 9.3.1

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 (71) hide show
  1. package/.claude/settings.local.json +8 -0
  2. package/.idea/cloudfriend.iml +9 -0
  3. package/.idea/codeStyles/Project.xml +7 -0
  4. package/.idea/codeStyles/codeStyleConfig.xml +5 -0
  5. package/.idea/inspectionProfiles/Project_Default.xml +6 -0
  6. package/.idea/misc.xml +6 -0
  7. package/.idea/modules.xml +8 -0
  8. package/.idea/vcs.xml +6 -0
  9. package/.nyc_output/6686e513-03b6-415d-9b8b-0fcde7a4e430.json +1 -0
  10. package/.nyc_output/f58a557c-a1c0-4dcc-83c5-bbca4d01baf9.json +1 -0
  11. package/.nyc_output/processinfo/6686e513-03b6-415d-9b8b-0fcde7a4e430.json +1 -0
  12. package/.nyc_output/processinfo/f58a557c-a1c0-4dcc-83c5-bbca4d01baf9.json +1 -0
  13. package/.nyc_output/processinfo/index.json +1 -0
  14. package/cfniceberg_createtable.yaml +71 -0
  15. package/changelog.md +4 -0
  16. package/coverage/clover.xml +83 -51
  17. package/coverage/coverage-final.json +32 -31
  18. package/coverage/lcov-report/cloudfriend/bin/build-template.js.html +1 -1
  19. package/coverage/lcov-report/cloudfriend/bin/index.html +1 -1
  20. package/coverage/lcov-report/cloudfriend/bin/validate-template.js.html +1 -1
  21. package/coverage/lcov-report/cloudfriend/index.html +1 -1
  22. package/coverage/lcov-report/cloudfriend/index.js.html +1 -1
  23. package/coverage/lcov-report/cloudfriend/lib/build.js.html +1 -1
  24. package/coverage/lcov-report/cloudfriend/lib/conditions.js.html +1 -1
  25. package/coverage/lcov-report/cloudfriend/lib/index.html +1 -1
  26. package/coverage/lcov-report/cloudfriend/lib/intrinsic.js.html +2 -2
  27. package/coverage/lcov-report/cloudfriend/lib/merge.js.html +16 -16
  28. package/coverage/lcov-report/cloudfriend/lib/pseudo.js.html +1 -1
  29. package/coverage/lcov-report/cloudfriend/lib/rules.js.html +1 -1
  30. package/coverage/lcov-report/cloudfriend/lib/shortcuts/cross-account-role.js.html +1 -1
  31. package/coverage/lcov-report/cloudfriend/lib/shortcuts/event-lambda.js.html +1 -1
  32. package/coverage/lcov-report/cloudfriend/lib/shortcuts/glue-database.js.html +1 -1
  33. package/coverage/lcov-report/cloudfriend/lib/shortcuts/glue-iceberg-table.js.html +646 -0
  34. package/coverage/lcov-report/cloudfriend/lib/shortcuts/glue-json-table.js.html +1 -1
  35. package/coverage/lcov-report/cloudfriend/lib/shortcuts/glue-orc-table.js.html +1 -1
  36. package/coverage/lcov-report/cloudfriend/lib/shortcuts/glue-parquet-table.js.html +1 -1
  37. package/coverage/lcov-report/cloudfriend/lib/shortcuts/glue-presto-view.js.html +1 -1
  38. package/coverage/lcov-report/cloudfriend/lib/shortcuts/glue-spark-view.js.html +1 -1
  39. package/coverage/lcov-report/cloudfriend/lib/shortcuts/glue-table.js.html +1 -1
  40. package/coverage/lcov-report/cloudfriend/lib/shortcuts/hookshot.js.html +1 -1
  41. package/coverage/lcov-report/cloudfriend/lib/shortcuts/index.html +24 -9
  42. package/coverage/lcov-report/cloudfriend/lib/shortcuts/index.js.html +5 -2
  43. package/coverage/lcov-report/cloudfriend/lib/shortcuts/kinesis-firehose-base.js.html +1 -1
  44. package/coverage/lcov-report/cloudfriend/lib/shortcuts/lambda.js.html +1 -1
  45. package/coverage/lcov-report/cloudfriend/lib/shortcuts/log-subscription-lambda.js.html +1 -1
  46. package/coverage/lcov-report/cloudfriend/lib/shortcuts/queue-lambda.js.html +1 -1
  47. package/coverage/lcov-report/cloudfriend/lib/shortcuts/queue.js.html +1 -1
  48. package/coverage/lcov-report/cloudfriend/lib/shortcuts/role.js.html +1 -1
  49. package/coverage/lcov-report/cloudfriend/lib/shortcuts/s3-kinesis-firehose.js.html +1 -1
  50. package/coverage/lcov-report/cloudfriend/lib/shortcuts/scheduled-lambda.js.html +1 -1
  51. package/coverage/lcov-report/cloudfriend/lib/shortcuts/service-role.js.html +1 -1
  52. package/coverage/lcov-report/cloudfriend/lib/shortcuts/stream-lambda.js.html +1 -1
  53. package/coverage/lcov-report/cloudfriend/lib/validate.js.html +1 -1
  54. package/coverage/lcov-report/index.html +19 -19
  55. package/coverage/lcov.info +107 -28
  56. package/lib/shortcuts/api.md +37 -0
  57. package/lib/shortcuts/glue-iceberg-table.js +187 -0
  58. package/lib/shortcuts/index.js +1 -0
  59. package/package.json +2 -2
  60. package/requirements.dev.txt +2 -2
  61. package/test/fixtures/shortcuts/glue-iceberg-table-defaults.json +41 -0
  62. package/test/fixtures/shortcuts/glue-iceberg-table-no-defaults.json +39 -0
  63. package/test/fixtures/shortcuts/glue-iceberg-table-with-all-optimizers.json +101 -0
  64. package/test/fixtures/shortcuts/glue-iceberg-table-with-both-optimizers.json +80 -0
  65. package/test/fixtures/shortcuts/glue-iceberg-table-with-compaction-custom.json +68 -0
  66. package/test/fixtures/shortcuts/glue-iceberg-table-with-compaction-defaults.json +57 -0
  67. package/test/fixtures/shortcuts/glue-iceberg-table-with-optimizer-custom.json +75 -0
  68. package/test/fixtures/shortcuts/glue-iceberg-table-with-optimizer-defaults.json +64 -0
  69. package/test/fixtures/shortcuts/glue-iceberg-table-with-orphan-deletion-custom.json +74 -0
  70. package/test/fixtures/shortcuts/glue-iceberg-table-with-orphan-deletion-defaults.json +62 -0
  71. package/test/shortcuts.test.js +294 -3
@@ -0,0 +1,646 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for cloudfriend/lib/shortcuts/glue-iceberg-table.js</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">cloudfriend/lib/shortcuts</a> glue-iceberg-table.js</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">93.54% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>29/31</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">94.59% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>35/37</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'>2/2</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">93.1% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>27/29</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>
205
+ <a name='L140'></a><a href='#L140'>140</a>
206
+ <a name='L141'></a><a href='#L141'>141</a>
207
+ <a name='L142'></a><a href='#L142'>142</a>
208
+ <a name='L143'></a><a href='#L143'>143</a>
209
+ <a name='L144'></a><a href='#L144'>144</a>
210
+ <a name='L145'></a><a href='#L145'>145</a>
211
+ <a name='L146'></a><a href='#L146'>146</a>
212
+ <a name='L147'></a><a href='#L147'>147</a>
213
+ <a name='L148'></a><a href='#L148'>148</a>
214
+ <a name='L149'></a><a href='#L149'>149</a>
215
+ <a name='L150'></a><a href='#L150'>150</a>
216
+ <a name='L151'></a><a href='#L151'>151</a>
217
+ <a name='L152'></a><a href='#L152'>152</a>
218
+ <a name='L153'></a><a href='#L153'>153</a>
219
+ <a name='L154'></a><a href='#L154'>154</a>
220
+ <a name='L155'></a><a href='#L155'>155</a>
221
+ <a name='L156'></a><a href='#L156'>156</a>
222
+ <a name='L157'></a><a href='#L157'>157</a>
223
+ <a name='L158'></a><a href='#L158'>158</a>
224
+ <a name='L159'></a><a href='#L159'>159</a>
225
+ <a name='L160'></a><a href='#L160'>160</a>
226
+ <a name='L161'></a><a href='#L161'>161</a>
227
+ <a name='L162'></a><a href='#L162'>162</a>
228
+ <a name='L163'></a><a href='#L163'>163</a>
229
+ <a name='L164'></a><a href='#L164'>164</a>
230
+ <a name='L165'></a><a href='#L165'>165</a>
231
+ <a name='L166'></a><a href='#L166'>166</a>
232
+ <a name='L167'></a><a href='#L167'>167</a>
233
+ <a name='L168'></a><a href='#L168'>168</a>
234
+ <a name='L169'></a><a href='#L169'>169</a>
235
+ <a name='L170'></a><a href='#L170'>170</a>
236
+ <a name='L171'></a><a href='#L171'>171</a>
237
+ <a name='L172'></a><a href='#L172'>172</a>
238
+ <a name='L173'></a><a href='#L173'>173</a>
239
+ <a name='L174'></a><a href='#L174'>174</a>
240
+ <a name='L175'></a><a href='#L175'>175</a>
241
+ <a name='L176'></a><a href='#L176'>176</a>
242
+ <a name='L177'></a><a href='#L177'>177</a>
243
+ <a name='L178'></a><a href='#L178'>178</a>
244
+ <a name='L179'></a><a href='#L179'>179</a>
245
+ <a name='L180'></a><a href='#L180'>180</a>
246
+ <a name='L181'></a><a href='#L181'>181</a>
247
+ <a name='L182'></a><a href='#L182'>182</a>
248
+ <a name='L183'></a><a href='#L183'>183</a>
249
+ <a name='L184'></a><a href='#L184'>184</a>
250
+ <a name='L185'></a><a href='#L185'>185</a>
251
+ <a name='L186'></a><a href='#L186'>186</a>
252
+ <a name='L187'></a><a href='#L187'>187</a>
253
+ <a name='L188'></a><a href='#L188'>188</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
254
+ <span class="cline-any cline-neutral">&nbsp;</span>
255
+ <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</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-neutral">&nbsp;</span>
265
+ <span class="cline-any cline-neutral">&nbsp;</span>
266
+ <span class="cline-any cline-neutral">&nbsp;</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-neutral">&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-neutral">&nbsp;</span>
274
+ <span class="cline-any cline-neutral">&nbsp;</span>
275
+ <span class="cline-any cline-neutral">&nbsp;</span>
276
+ <span class="cline-any cline-neutral">&nbsp;</span>
277
+ <span class="cline-any cline-neutral">&nbsp;</span>
278
+ <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</span>
283
+ <span class="cline-any cline-neutral">&nbsp;</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-yes">15x</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-neutral">&nbsp;</span>
293
+ <span class="cline-any cline-neutral">&nbsp;</span>
294
+ <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</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-neutral">&nbsp;</span>
301
+ <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</span>
305
+ <span class="cline-any cline-neutral">&nbsp;</span>
306
+ <span class="cline-any cline-neutral">&nbsp;</span>
307
+ <span class="cline-any cline-neutral">&nbsp;</span>
308
+ <span class="cline-any cline-neutral">&nbsp;</span>
309
+ <span class="cline-any cline-yes">14x</span>
310
+ <span class="cline-any cline-neutral">&nbsp;</span>
311
+ <span class="cline-any cline-neutral">&nbsp;</span>
312
+ <span class="cline-any cline-yes">14x</span>
313
+ <span class="cline-any cline-yes">66x</span>
314
+ <span class="cline-any cline-yes">1x</span>
315
+ <span class="cline-any cline-neutral">&nbsp;</span>
316
+ <span class="cline-any cline-yes">13x</span>
317
+ <span class="cline-any cline-yes">1x</span>
318
+ <span class="cline-any cline-neutral">&nbsp;</span>
319
+ <span class="cline-any cline-yes">12x</span>
320
+ <span class="cline-any cline-yes">1x</span>
321
+ <span class="cline-any cline-neutral">&nbsp;</span>
322
+ <span class="cline-any cline-yes">11x</span>
323
+ <span class="cline-any cline-yes">1x</span>
324
+ <span class="cline-any cline-neutral">&nbsp;</span>
325
+ <span class="cline-any cline-neutral">&nbsp;</span>
326
+ <span class="cline-any cline-yes">10x</span>
327
+ <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</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-neutral">&nbsp;</span>
340
+ <span class="cline-any cline-neutral">&nbsp;</span>
341
+ <span class="cline-any cline-neutral">&nbsp;</span>
342
+ <span class="cline-any cline-neutral">&nbsp;</span>
343
+ <span class="cline-any cline-neutral">&nbsp;</span>
344
+ <span class="cline-any cline-neutral">&nbsp;</span>
345
+ <span class="cline-any cline-neutral">&nbsp;</span>
346
+ <span class="cline-any cline-neutral">&nbsp;</span>
347
+ <span class="cline-any cline-neutral">&nbsp;</span>
348
+ <span class="cline-any cline-yes">10x</span>
349
+ <span class="cline-any cline-no">&nbsp;</span>
350
+ <span class="cline-any cline-neutral">&nbsp;</span>
351
+ <span class="cline-any cline-neutral">&nbsp;</span>
352
+ <span class="cline-any cline-neutral">&nbsp;</span>
353
+ <span class="cline-any cline-yes">10x</span>
354
+ <span class="cline-any cline-no">&nbsp;</span>
355
+ <span class="cline-any cline-neutral">&nbsp;</span>
356
+ <span class="cline-any cline-neutral">&nbsp;</span>
357
+ <span class="cline-any cline-neutral">&nbsp;</span>
358
+ <span class="cline-any cline-yes">10x</span>
359
+ <span class="cline-any cline-yes">4x</span>
360
+ <span class="cline-any cline-yes">4x</span>
361
+ <span class="cline-any cline-neutral">&nbsp;</span>
362
+ <span class="cline-any cline-neutral">&nbsp;</span>
363
+ <span class="cline-any cline-neutral">&nbsp;</span>
364
+ <span class="cline-any cline-neutral">&nbsp;</span>
365
+ <span class="cline-any cline-neutral">&nbsp;</span>
366
+ <span class="cline-any cline-neutral">&nbsp;</span>
367
+ <span class="cline-any cline-neutral">&nbsp;</span>
368
+ <span class="cline-any cline-neutral">&nbsp;</span>
369
+ <span class="cline-any cline-neutral">&nbsp;</span>
370
+ <span class="cline-any cline-neutral">&nbsp;</span>
371
+ <span class="cline-any cline-neutral">&nbsp;</span>
372
+ <span class="cline-any cline-neutral">&nbsp;</span>
373
+ <span class="cline-any cline-neutral">&nbsp;</span>
374
+ <span class="cline-any cline-neutral">&nbsp;</span>
375
+ <span class="cline-any cline-neutral">&nbsp;</span>
376
+ <span class="cline-any cline-neutral">&nbsp;</span>
377
+ <span class="cline-any cline-neutral">&nbsp;</span>
378
+ <span class="cline-any cline-neutral">&nbsp;</span>
379
+ <span class="cline-any cline-neutral">&nbsp;</span>
380
+ <span class="cline-any cline-neutral">&nbsp;</span>
381
+ <span class="cline-any cline-neutral">&nbsp;</span>
382
+ <span class="cline-any cline-neutral">&nbsp;</span>
383
+ <span class="cline-any cline-neutral">&nbsp;</span>
384
+ <span class="cline-any cline-neutral">&nbsp;</span>
385
+ <span class="cline-any cline-neutral">&nbsp;</span>
386
+ <span class="cline-any cline-neutral">&nbsp;</span>
387
+ <span class="cline-any cline-neutral">&nbsp;</span>
388
+ <span class="cline-any cline-yes">10x</span>
389
+ <span class="cline-any cline-yes">4x</span>
390
+ <span class="cline-any cline-yes">4x</span>
391
+ <span class="cline-any cline-neutral">&nbsp;</span>
392
+ <span class="cline-any cline-neutral">&nbsp;</span>
393
+ <span class="cline-any cline-neutral">&nbsp;</span>
394
+ <span class="cline-any cline-neutral">&nbsp;</span>
395
+ <span class="cline-any cline-neutral">&nbsp;</span>
396
+ <span class="cline-any cline-neutral">&nbsp;</span>
397
+ <span class="cline-any cline-neutral">&nbsp;</span>
398
+ <span class="cline-any cline-neutral">&nbsp;</span>
399
+ <span class="cline-any cline-neutral">&nbsp;</span>
400
+ <span class="cline-any cline-neutral">&nbsp;</span>
401
+ <span class="cline-any cline-neutral">&nbsp;</span>
402
+ <span class="cline-any cline-neutral">&nbsp;</span>
403
+ <span class="cline-any cline-neutral">&nbsp;</span>
404
+ <span class="cline-any cline-neutral">&nbsp;</span>
405
+ <span class="cline-any cline-neutral">&nbsp;</span>
406
+ <span class="cline-any cline-neutral">&nbsp;</span>
407
+ <span class="cline-any cline-yes">10x</span>
408
+ <span class="cline-any cline-yes">3x</span>
409
+ <span class="cline-any cline-yes">3x</span>
410
+ <span class="cline-any cline-neutral">&nbsp;</span>
411
+ <span class="cline-any cline-neutral">&nbsp;</span>
412
+ <span class="cline-any cline-neutral">&nbsp;</span>
413
+ <span class="cline-any cline-neutral">&nbsp;</span>
414
+ <span class="cline-any cline-yes">3x</span>
415
+ <span class="cline-any cline-yes">1x</span>
416
+ <span class="cline-any cline-neutral">&nbsp;</span>
417
+ <span class="cline-any cline-neutral">&nbsp;</span>
418
+ <span class="cline-any cline-yes">3x</span>
419
+ <span class="cline-any cline-neutral">&nbsp;</span>
420
+ <span class="cline-any cline-neutral">&nbsp;</span>
421
+ <span class="cline-any cline-neutral">&nbsp;</span>
422
+ <span class="cline-any cline-neutral">&nbsp;</span>
423
+ <span class="cline-any cline-neutral">&nbsp;</span>
424
+ <span class="cline-any cline-neutral">&nbsp;</span>
425
+ <span class="cline-any cline-neutral">&nbsp;</span>
426
+ <span class="cline-any cline-neutral">&nbsp;</span>
427
+ <span class="cline-any cline-neutral">&nbsp;</span>
428
+ <span class="cline-any cline-neutral">&nbsp;</span>
429
+ <span class="cline-any cline-neutral">&nbsp;</span>
430
+ <span class="cline-any cline-neutral">&nbsp;</span>
431
+ <span class="cline-any cline-neutral">&nbsp;</span>
432
+ <span class="cline-any cline-neutral">&nbsp;</span>
433
+ <span class="cline-any cline-neutral">&nbsp;</span>
434
+ <span class="cline-any cline-neutral">&nbsp;</span>
435
+ <span class="cline-any cline-neutral">&nbsp;</span>
436
+ <span class="cline-any cline-neutral">&nbsp;</span>
437
+ <span class="cline-any cline-neutral">&nbsp;</span>
438
+ <span class="cline-any cline-neutral">&nbsp;</span>
439
+ <span class="cline-any cline-yes">2x</span>
440
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">'use strict';
441
+ &nbsp;
442
+ /**
443
+ * Create a Glue table backed by Apache Iceberg format on S3.
444
+ *
445
+ * @param {Object} options - Options for creating an Iceberg table.
446
+ * @param {String} options.LogicalName - The logical name of the Glue Table within the CloudFormation template.
447
+ * @param {String} options.Name - The name of the table.
448
+ * @param {String} options.DatabaseName - The name of the database the table resides in.
449
+ * @param {String} options.Location - The physical location of the table (S3 URI). Required.
450
+ * @param {Object} options.Schema - Full Iceberg schema definition with Type: "struct" and Fields array.
451
+ * Each field must have Id (integer), Name (string), Type (string or object for complex types), and Required (boolean).
452
+ * See [AWS
453
+ * documentation](https://docs.aws.amazon.com/glue/latest/webapi/API_IcebergSchema.html).
454
+ * @param {Object} [options.PartitionSpec] - Iceberg partition specification. See [AWS
455
+ * documentation](https://docs.aws.amazon.com/glue/latest/webapi/API_IcebergPartitionSpec.html).
456
+ * @param {Object} [options.WriteOrder] - Iceberg write order specification. See [AWS
457
+ * documentation](https://docs.aws.amazon.com/glue/latest/webapi/API_IcebergSortOrder.html).
458
+ * @param {String} [options.CatalogId=AccountId] - The AWS account ID for the account in which to create the table.
459
+ * @param {String} [options.IcebergVersion='2'] - The table version for the Iceberg table.
460
+ * @param {Boolean} [options.EnableOptimizer=false] - Whether to enable the snapshot retention optimizer.
461
+ * @param {String} [options.OptimizerRoleArn=undefined] - The ARN of the IAM role for the retention optimizer. Required if EnableOptimizer is true.
462
+ * @param {Number} [options.SnapshotRetentionPeriodInDays=5] - The number of days to retain snapshots.
463
+ * @param {Number} [options.NumberOfSnapshotsToRetain=1] - The minimum number of snapshots to retain.
464
+ * @param {Boolean} [options.CleanExpiredFiles=true] - Whether to delete expired data files after expiring snapshots.
465
+ * @param {Boolean} [options.EnableCompaction=false] - Whether to enable the compaction optimizer.
466
+ * @param {String} [options.CompactionRoleArn=undefined] - The ARN of the IAM role for the compaction optimizer. Required if EnableCompaction is true.
467
+ * @param {Boolean} [options.EnableOrphanFileDeletion=false] - Whether to enable the orphan file deletion optimizer.
468
+ * @param {String} [options.OrphanFileDeletionRoleArn=undefined] - The ARN of the IAM role for the orphan file deletion optimizer. Required if EnableOrphanFileDeletion is true.
469
+ * @param {Number} [options.OrphanFileRetentionPeriodInDays=3] - The number of days to retain orphan files before deleting them.
470
+ * @param {String} [options.OrphanFileDeletionLocation=undefined] - The S3 location to scan for orphan files.
471
+ */
472
+ class GlueIcebergTable {
473
+ constructor(options) {
474
+ if (!options) throw new Error('Options required');
475
+ const {
476
+ LogicalName,
477
+ Name,
478
+ DatabaseName,
479
+ Location,
480
+ Schema,
481
+ PartitionSpec,
482
+ WriteOrder,
483
+ CatalogId = { Ref: 'AWS::AccountId' },
484
+ IcebergVersion = '2',
485
+ EnableOptimizer = false,
486
+ OptimizerRoleArn,
487
+ SnapshotRetentionPeriodInDays = 5,
488
+ NumberOfSnapshotsToRetain = 1,
489
+ CleanExpiredFiles = true,
490
+ EnableCompaction = false,
491
+ CompactionRoleArn,
492
+ EnableOrphanFileDeletion = false,
493
+ OrphanFileDeletionRoleArn,
494
+ OrphanFileRetentionPeriodInDays = 3,
495
+ OrphanFileDeletionLocation
496
+ } = options;
497
+ &nbsp;
498
+ // Validate required fields
499
+ const required = [LogicalName, Name, DatabaseName, Location, Schema];
500
+ if (required.some((variable) =&gt; !variable))
501
+ throw new Error('You must provide a LogicalName, Name, DatabaseName, Location, and Schema');
502
+ &nbsp;
503
+ if (EnableOptimizer &amp;&amp; !OptimizerRoleArn)
504
+ throw new Error('You must provide an OptimizerRoleArn when EnableOptimizer is true');
505
+ &nbsp;
506
+ if (EnableCompaction &amp;&amp; !CompactionRoleArn)
507
+ throw new Error('You must provide a CompactionRoleArn when EnableCompaction is true');
508
+ &nbsp;
509
+ if (EnableOrphanFileDeletion &amp;&amp; !OrphanFileDeletionRoleArn)
510
+ throw new Error('You must provide an OrphanFileDeletionRoleArn when EnableOrphanFileDeletion is true');
511
+ &nbsp;
512
+ // Build the Iceberg table resource (no TableInput!)
513
+ this.Resources = {
514
+ [LogicalName]: {
515
+ Type: 'AWS::Glue::Table',
516
+ Properties: {
517
+ CatalogId,
518
+ DatabaseName,
519
+ Name,
520
+ OpenTableFormatInput: {
521
+ IcebergInput: {
522
+ MetadataOperation: 'CREATE', // NOTE: this is _always_ CREATE because it's about creating a new metadata version, not creating a new table
523
+ Version: IcebergVersion,
524
+ IcebergTableInput: {
525
+ Location,
526
+ Schema
527
+ }
528
+ }
529
+ }
530
+ }
531
+ }
532
+ };
533
+ &nbsp;
534
+ // Add optional PartitionSpec if provided
535
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (PartitionSpec) {
536
+ <span class="cstat-no" title="statement not covered" > this.Resources[LogicalName].Properties.OpenTableFormatInput.IcebergInput.IcebergTableInput.PartitionSpec = PartitionSpec;</span>
537
+ }
538
+ &nbsp;
539
+ // Add optional WriteOrder if provided
540
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (WriteOrder) {
541
+ <span class="cstat-no" title="statement not covered" > this.Resources[LogicalName].Properties.OpenTableFormatInput.IcebergInput.IcebergTableInput.WriteOrder = WriteOrder;</span>
542
+ }
543
+ &nbsp;
544
+ // Optionally add TableOptimizer for configuring snapshot retention
545
+ if (EnableOptimizer) {
546
+ const optimizerLogicalName = `${LogicalName}RetentionOptimizer`;
547
+ this.Resources[optimizerLogicalName] = {
548
+ Type: 'AWS::Glue::TableOptimizer',
549
+ DependsOn: LogicalName,
550
+ Properties: {
551
+ CatalogId,
552
+ DatabaseName,
553
+ TableName: Name,
554
+ Type: 'retention',
555
+ TableOptimizerConfiguration: {
556
+ RoleArn: OptimizerRoleArn,
557
+ Enabled: true,
558
+ RetentionConfiguration: {
559
+ IcebergConfiguration: {
560
+ SnapshotRetentionPeriodInDays,
561
+ NumberOfSnapshotsToRetain,
562
+ CleanExpiredFiles
563
+ }
564
+ }
565
+ }
566
+ }
567
+ };
568
+ }
569
+ &nbsp;
570
+ // Optionally add TableOptimizer for compaction
571
+ // NOTE: CloudFormation does not support CompactionConfiguration properties
572
+ // (strategy, minInputFiles, deleteFileThreshold). These must be configured
573
+ // via AWS CLI/API after stack creation, or will use AWS defaults.
574
+ // See: https://github.com/aws-cloudformation/cloudformation-coverage-roadmap/issues/2257
575
+ if (EnableCompaction) {
576
+ const compactionLogicalName = `${LogicalName}CompactionOptimizer`;
577
+ this.Resources[compactionLogicalName] = {
578
+ Type: 'AWS::Glue::TableOptimizer',
579
+ DependsOn: LogicalName,
580
+ Properties: {
581
+ CatalogId,
582
+ DatabaseName,
583
+ TableName: Name,
584
+ Type: 'compaction',
585
+ TableOptimizerConfiguration: {
586
+ RoleArn: CompactionRoleArn,
587
+ Enabled: true
588
+ }
589
+ }
590
+ };
591
+ }
592
+ &nbsp;
593
+ // Optionally add TableOptimizer for orphan file deletion
594
+ if (EnableOrphanFileDeletion) {
595
+ const orphanLogicalName = `${LogicalName}OrphanFileDeletionOptimizer`;
596
+ const icebergConfiguration = {
597
+ OrphanFileRetentionPeriodInDays
598
+ };
599
+ &nbsp;
600
+ // Only add Location if specified, otherwise it defaults to table location
601
+ if (OrphanFileDeletionLocation) {
602
+ icebergConfiguration.Location = OrphanFileDeletionLocation;
603
+ }
604
+ &nbsp;
605
+ this.Resources[orphanLogicalName] = {
606
+ Type: 'AWS::Glue::TableOptimizer',
607
+ DependsOn: LogicalName,
608
+ Properties: {
609
+ CatalogId,
610
+ DatabaseName,
611
+ TableName: Name,
612
+ Type: 'orphan_file_deletion',
613
+ TableOptimizerConfiguration: {
614
+ RoleArn: OrphanFileDeletionRoleArn,
615
+ Enabled: true,
616
+ OrphanFileDeletionConfiguration: {
617
+ IcebergConfiguration: icebergConfiguration
618
+ }
619
+ }
620
+ }
621
+ };
622
+ }
623
+ }
624
+ }
625
+ &nbsp;
626
+ module.exports = GlueIcebergTable;
627
+ &nbsp;</pre></td></tr></table></pre>
628
+
629
+ <div class='push'></div><!-- for sticky footer -->
630
+ </div><!-- /wrapper -->
631
+ <div class='footer quiet pad2 space-top1 center small'>
632
+ Code coverage generated by
633
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
634
+ at 2026-02-09T18:26:12.950Z
635
+ </div>
636
+ <script src="../../../prettify.js"></script>
637
+ <script>
638
+ window.onload = function () {
639
+ prettyPrint();
640
+ };
641
+ </script>
642
+ <script src="../../../sorter.js"></script>
643
+ <script src="../../../block-navigation.js"></script>
644
+ </body>
645
+ </html>
646
+