@beechcms/cli 0.4.3 → 0.6.0-preview.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.
- package/coverage/base.css +224 -0
- package/coverage/block-navigation.js +87 -0
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +116 -0
- package/coverage/lcov-report/base.css +224 -0
- package/coverage/lcov-report/block-navigation.js +87 -0
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +116 -0
- package/coverage/lcov-report/prettify.css +1 -0
- package/coverage/lcov-report/prettify.js +2 -0
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +210 -0
- package/coverage/lcov-report/validate.ts.html +628 -0
- package/coverage/lcov.info +180 -0
- package/coverage/prettify.css +1 -0
- package/coverage/prettify.js +2 -0
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +210 -0
- package/coverage/validate.ts.html +628 -0
- package/dist/index.js +241 -72
- package/package.json +9 -5
- package/src/commands/deploy.ts +3 -0
- package/src/commands/init.ts +45 -3
- package/src/commands/onboard.ts +32 -0
- package/src/commands/seed-create.ts +3 -0
- package/src/commands/seed-load.ts +86 -6
- package/src/commands/update.ts +3 -0
- package/src/commands/validate.ts +38 -41
- package/src/index.ts +5 -0
- package/src/lib/schema-diff.ts +91 -5
- package/src/lib/wrangler.ts +27 -4
- package/tsconfig.tsbuildinfo +1 -1
- package/vitest.config.ts +32 -0
|
@@ -0,0 +1,628 @@
|
|
|
1
|
+
|
|
2
|
+
<!doctype html>
|
|
3
|
+
<html lang="en">
|
|
4
|
+
|
|
5
|
+
<head>
|
|
6
|
+
<title>Code coverage report for validate.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> validate.ts</h1>
|
|
23
|
+
<div class='clearfix'>
|
|
24
|
+
|
|
25
|
+
<div class='fl pad1y space-right2'>
|
|
26
|
+
<span class="strong">57.89% </span>
|
|
27
|
+
<span class="quiet">Statements</span>
|
|
28
|
+
<span class='fraction'>77/133</span>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
<div class='fl pad1y space-right2'>
|
|
33
|
+
<span class="strong">82.35% </span>
|
|
34
|
+
<span class="quiet">Branches</span>
|
|
35
|
+
<span class='fraction'>28/34</span>
|
|
36
|
+
</div>
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
<div class='fl pad1y space-right2'>
|
|
40
|
+
<span class="strong">50% </span>
|
|
41
|
+
<span class="quiet">Functions</span>
|
|
42
|
+
<span class='fraction'>1/2</span>
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
<div class='fl pad1y space-right2'>
|
|
47
|
+
<span class="strong">57.89% </span>
|
|
48
|
+
<span class="quiet">Lines</span>
|
|
49
|
+
<span class='fraction'>77/133</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 medium'></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></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span>
|
|
248
|
+
<span class="cline-any cline-neutral"> </span>
|
|
249
|
+
<span class="cline-any cline-neutral"> </span>
|
|
250
|
+
<span class="cline-any cline-yes">1x</span>
|
|
251
|
+
<span class="cline-any cline-neutral"> </span>
|
|
252
|
+
<span class="cline-any cline-yes">1x</span>
|
|
253
|
+
<span class="cline-any cline-neutral"> </span>
|
|
254
|
+
<span class="cline-any cline-neutral"> </span>
|
|
255
|
+
<span class="cline-any cline-neutral"> </span>
|
|
256
|
+
<span class="cline-any cline-neutral"> </span>
|
|
257
|
+
<span class="cline-any cline-neutral"> </span>
|
|
258
|
+
<span class="cline-any cline-neutral"> </span>
|
|
259
|
+
<span class="cline-any cline-neutral"> </span>
|
|
260
|
+
<span class="cline-any cline-neutral"> </span>
|
|
261
|
+
<span class="cline-any cline-neutral"> </span>
|
|
262
|
+
<span class="cline-any cline-neutral"> </span>
|
|
263
|
+
<span class="cline-any cline-neutral"> </span>
|
|
264
|
+
<span class="cline-any cline-neutral"> </span>
|
|
265
|
+
<span class="cline-any cline-yes">1x</span>
|
|
266
|
+
<span class="cline-any cline-yes">8x</span>
|
|
267
|
+
<span class="cline-any cline-neutral"> </span>
|
|
268
|
+
<span class="cline-any cline-neutral"> </span>
|
|
269
|
+
<span class="cline-any cline-yes">8x</span>
|
|
270
|
+
<span class="cline-any cline-yes">15x</span>
|
|
271
|
+
<span class="cline-any cline-yes">15x</span>
|
|
272
|
+
<span class="cline-any cline-yes">24x</span>
|
|
273
|
+
<span class="cline-any cline-yes">9x</span>
|
|
274
|
+
<span class="cline-any cline-yes">1x</span>
|
|
275
|
+
<span class="cline-any cline-yes">1x</span>
|
|
276
|
+
<span class="cline-any cline-yes">1x</span>
|
|
277
|
+
<span class="cline-any cline-yes">1x</span>
|
|
278
|
+
<span class="cline-any cline-yes">9x</span>
|
|
279
|
+
<span class="cline-any cline-yes">24x</span>
|
|
280
|
+
<span class="cline-any cline-yes">15x</span>
|
|
281
|
+
<span class="cline-any cline-yes">1x</span>
|
|
282
|
+
<span class="cline-any cline-yes">1x</span>
|
|
283
|
+
<span class="cline-any cline-yes">15x</span>
|
|
284
|
+
<span class="cline-any cline-neutral"> </span>
|
|
285
|
+
<span class="cline-any cline-neutral"> </span>
|
|
286
|
+
<span class="cline-any cline-yes">8x</span>
|
|
287
|
+
<span class="cline-any cline-yes">15x</span>
|
|
288
|
+
<span class="cline-any cline-yes">15x</span>
|
|
289
|
+
<span class="cline-any cline-yes">24x</span>
|
|
290
|
+
<span class="cline-any cline-yes">5x</span>
|
|
291
|
+
<span class="cline-any cline-yes">1x</span>
|
|
292
|
+
<span class="cline-any cline-yes">1x</span>
|
|
293
|
+
<span class="cline-any cline-neutral"> </span>
|
|
294
|
+
<span class="cline-any cline-yes">1x</span>
|
|
295
|
+
<span class="cline-any cline-yes">1x</span>
|
|
296
|
+
<span class="cline-any cline-yes">5x</span>
|
|
297
|
+
<span class="cline-any cline-yes">24x</span>
|
|
298
|
+
<span class="cline-any cline-yes">15x</span>
|
|
299
|
+
<span class="cline-any cline-yes">1x</span>
|
|
300
|
+
<span class="cline-any cline-yes">1x</span>
|
|
301
|
+
<span class="cline-any cline-yes">15x</span>
|
|
302
|
+
<span class="cline-any cline-neutral"> </span>
|
|
303
|
+
<span class="cline-any cline-neutral"> </span>
|
|
304
|
+
<span class="cline-any cline-yes">8x</span>
|
|
305
|
+
<span class="cline-any cline-yes">8x</span>
|
|
306
|
+
<span class="cline-any cline-yes">8x</span>
|
|
307
|
+
<span class="cline-any cline-yes">15x</span>
|
|
308
|
+
<span class="cline-any cline-yes">15x</span>
|
|
309
|
+
<span class="cline-any cline-yes">24x</span>
|
|
310
|
+
<span class="cline-any cline-yes">5x</span>
|
|
311
|
+
<span class="cline-any cline-yes">24x</span>
|
|
312
|
+
<span class="cline-any cline-no"> </span>
|
|
313
|
+
<span class="cline-any cline-no"> </span>
|
|
314
|
+
<span class="cline-any cline-yes">24x</span>
|
|
315
|
+
<span class="cline-any cline-no"> </span>
|
|
316
|
+
<span class="cline-any cline-no"> </span>
|
|
317
|
+
<span class="cline-any cline-yes">5x</span>
|
|
318
|
+
<span class="cline-any cline-yes">5x</span>
|
|
319
|
+
<span class="cline-any cline-yes">15x</span>
|
|
320
|
+
<span class="cline-any cline-no"> </span>
|
|
321
|
+
<span class="cline-any cline-no"> </span>
|
|
322
|
+
<span class="cline-any cline-yes">15x</span>
|
|
323
|
+
<span class="cline-any cline-yes">8x</span>
|
|
324
|
+
<span class="cline-any cline-neutral"> </span>
|
|
325
|
+
<span class="cline-any cline-neutral"> </span>
|
|
326
|
+
<span class="cline-any cline-neutral"> </span>
|
|
327
|
+
<span class="cline-any cline-neutral"> </span>
|
|
328
|
+
<span class="cline-any cline-yes">8x</span>
|
|
329
|
+
<span class="cline-any cline-yes">8x</span>
|
|
330
|
+
<span class="cline-any cline-yes">6x</span>
|
|
331
|
+
<span class="cline-any cline-yes">6x</span>
|
|
332
|
+
<span class="cline-any cline-yes">6x</span>
|
|
333
|
+
<span class="cline-any cline-yes">1x</span>
|
|
334
|
+
<span class="cline-any cline-yes">1x</span>
|
|
335
|
+
<span class="cline-any cline-yes">1x</span>
|
|
336
|
+
<span class="cline-any cline-yes">6x</span>
|
|
337
|
+
<span class="cline-any cline-neutral"> </span>
|
|
338
|
+
<span class="cline-any cline-neutral"> </span>
|
|
339
|
+
<span class="cline-any cline-yes">8x</span>
|
|
340
|
+
<span class="cline-any cline-neutral"> </span>
|
|
341
|
+
<span class="cline-any cline-yes">8x</span>
|
|
342
|
+
<span class="cline-any cline-yes">15x</span>
|
|
343
|
+
<span class="cline-any cline-neutral"> </span>
|
|
344
|
+
<span class="cline-any cline-yes">15x</span>
|
|
345
|
+
<span class="cline-any cline-no"> </span>
|
|
346
|
+
<span class="cline-any cline-no"> </span>
|
|
347
|
+
<span class="cline-any cline-yes">15x</span>
|
|
348
|
+
<span class="cline-any cline-neutral"> </span>
|
|
349
|
+
<span class="cline-any cline-yes">15x</span>
|
|
350
|
+
<span class="cline-any cline-yes">15x</span>
|
|
351
|
+
<span class="cline-any cline-yes">24x</span>
|
|
352
|
+
<span class="cline-any cline-no"> </span>
|
|
353
|
+
<span class="cline-any cline-no"> </span>
|
|
354
|
+
<span class="cline-any cline-yes">24x</span>
|
|
355
|
+
<span class="cline-any cline-yes">24x</span>
|
|
356
|
+
<span class="cline-any cline-neutral"> </span>
|
|
357
|
+
<span class="cline-any cline-yes">15x</span>
|
|
358
|
+
<span class="cline-any cline-yes">15x</span>
|
|
359
|
+
<span class="cline-any cline-yes">1x</span>
|
|
360
|
+
<span class="cline-any cline-yes">1x</span>
|
|
361
|
+
<span class="cline-any cline-neutral"> </span>
|
|
362
|
+
<span class="cline-any cline-yes">15x</span>
|
|
363
|
+
<span class="cline-any cline-yes">1x</span>
|
|
364
|
+
<span class="cline-any cline-yes">1x</span>
|
|
365
|
+
<span class="cline-any cline-yes">15x</span>
|
|
366
|
+
<span class="cline-any cline-neutral"> </span>
|
|
367
|
+
<span class="cline-any cline-yes">8x</span>
|
|
368
|
+
<span class="cline-any cline-yes">8x</span>
|
|
369
|
+
<span class="cline-any cline-neutral"> </span>
|
|
370
|
+
<span class="cline-any cline-no"> </span>
|
|
371
|
+
<span class="cline-any cline-no"> </span>
|
|
372
|
+
<span class="cline-any cline-neutral"> </span>
|
|
373
|
+
<span class="cline-any cline-no"> </span>
|
|
374
|
+
<span class="cline-any cline-no"> </span>
|
|
375
|
+
<span class="cline-any cline-no"> </span>
|
|
376
|
+
<span class="cline-any cline-no"> </span>
|
|
377
|
+
<span class="cline-any cline-neutral"> </span>
|
|
378
|
+
<span class="cline-any cline-no"> </span>
|
|
379
|
+
<span class="cline-any cline-neutral"> </span>
|
|
380
|
+
<span class="cline-any cline-no"> </span>
|
|
381
|
+
<span class="cline-any cline-no"> </span>
|
|
382
|
+
<span class="cline-any cline-no"> </span>
|
|
383
|
+
<span class="cline-any cline-neutral"> </span>
|
|
384
|
+
<span class="cline-any cline-neutral"> </span>
|
|
385
|
+
<span class="cline-any cline-no"> </span>
|
|
386
|
+
<span class="cline-any cline-no"> </span>
|
|
387
|
+
<span class="cline-any cline-no"> </span>
|
|
388
|
+
<span class="cline-any cline-no"> </span>
|
|
389
|
+
<span class="cline-any cline-no"> </span>
|
|
390
|
+
<span class="cline-any cline-no"> </span>
|
|
391
|
+
<span class="cline-any cline-neutral"> </span>
|
|
392
|
+
<span class="cline-any cline-neutral"> </span>
|
|
393
|
+
<span class="cline-any cline-no"> </span>
|
|
394
|
+
<span class="cline-any cline-no"> </span>
|
|
395
|
+
<span class="cline-any cline-neutral"> </span>
|
|
396
|
+
<span class="cline-any cline-no"> </span>
|
|
397
|
+
<span class="cline-any cline-no"> </span>
|
|
398
|
+
<span class="cline-any cline-no"> </span>
|
|
399
|
+
<span class="cline-any cline-no"> </span>
|
|
400
|
+
<span class="cline-any cline-neutral"> </span>
|
|
401
|
+
<span class="cline-any cline-no"> </span>
|
|
402
|
+
<span class="cline-any cline-no"> </span>
|
|
403
|
+
<span class="cline-any cline-no"> </span>
|
|
404
|
+
<span class="cline-any cline-no"> </span>
|
|
405
|
+
<span class="cline-any cline-no"> </span>
|
|
406
|
+
<span class="cline-any cline-no"> </span>
|
|
407
|
+
<span class="cline-any cline-no"> </span>
|
|
408
|
+
<span class="cline-any cline-no"> </span>
|
|
409
|
+
<span class="cline-any cline-no"> </span>
|
|
410
|
+
<span class="cline-any cline-no"> </span>
|
|
411
|
+
<span class="cline-any cline-neutral"> </span>
|
|
412
|
+
<span class="cline-any cline-no"> </span>
|
|
413
|
+
<span class="cline-any cline-neutral"> </span>
|
|
414
|
+
<span class="cline-any cline-no"> </span>
|
|
415
|
+
<span class="cline-any cline-no"> </span>
|
|
416
|
+
<span class="cline-any cline-neutral"> </span>
|
|
417
|
+
<span class="cline-any cline-no"> </span>
|
|
418
|
+
<span class="cline-any cline-no"> </span>
|
|
419
|
+
<span class="cline-any cline-no"> </span>
|
|
420
|
+
<span class="cline-any cline-no"> </span>
|
|
421
|
+
<span class="cline-any cline-no"> </span>
|
|
422
|
+
<span class="cline-any cline-no"> </span>
|
|
423
|
+
<span class="cline-any cline-no"> </span>
|
|
424
|
+
<span class="cline-any cline-no"> </span>
|
|
425
|
+
<span class="cline-any cline-no"> </span>
|
|
426
|
+
<span class="cline-any cline-no"> </span>
|
|
427
|
+
<span class="cline-any cline-no"> </span>
|
|
428
|
+
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">// SPDX-License-Identifier: MIT
|
|
429
|
+
// Copyright (c) 2024–2026 Flavio De Musso
|
|
430
|
+
|
|
431
|
+
import pc from 'picocolors'
|
|
432
|
+
import type { Seed } from '@beechcms/core'
|
|
433
|
+
import { SEED_REGISTRY, sortSeedsByDependencies } from '@beechcms/core'
|
|
434
|
+
|
|
435
|
+
export interface ValidateOptions {
|
|
436
|
+
registry?: Record<string, Seed> | null
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
export interface SeedValidationError {
|
|
440
|
+
slug: string
|
|
441
|
+
messages: string[]
|
|
442
|
+
/** true = abort seed:load; false = warning only */
|
|
443
|
+
fatal: boolean
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
export function validateSeeds(registry: Record<string, Seed>): SeedValidationError[] {
|
|
447
|
+
const result: SeedValidationError[] = []
|
|
448
|
+
|
|
449
|
+
// ── Fatal check 1: unknown relation targets ──────────────────────────────
|
|
450
|
+
for (const seed of Object.values(registry)) {
|
|
451
|
+
const messages: string[] = []
|
|
452
|
+
for (const branch of seed.branches) {
|
|
453
|
+
if (branch.type === 'relation' && branch.targetSeed) {
|
|
454
|
+
if (!registry[branch.targetSeed]) {
|
|
455
|
+
messages.push(
|
|
456
|
+
`branch '${branch.alias}' targets unknown seed '${branch.targetSeed}'`,
|
|
457
|
+
)
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
if (messages.length > 0) {
|
|
462
|
+
result.push({ slug: seed.slug, messages, fatal: true })
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
// ── Fatal check 2: multi-relation with SET NULL ──────────────────────────
|
|
467
|
+
for (const seed of Object.values(registry)) {
|
|
468
|
+
const messages: string[] = []
|
|
469
|
+
for (const branch of seed.branches) {
|
|
470
|
+
if (branch.type === 'relation' && branch.multiple === true) {
|
|
471
|
+
if (branch.onDelete === 'SET NULL') {
|
|
472
|
+
messages.push(
|
|
473
|
+
`Branch '${branch.alias}': multi-relations cannot use ON DELETE SET NULL. ` +
|
|
474
|
+
`Use 'CASCADE' or 'RESTRICT'.`,
|
|
475
|
+
)
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
if (messages.length > 0) {
|
|
480
|
+
result.push({ slug: seed.slug, messages, fatal: true })
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
// ── Fatal check 3: junction table name collisions ────────────────────────
|
|
485
|
+
{
|
|
486
|
+
const junctionNames = new Set<string>()
|
|
487
|
+
for (const seed of Object.values(registry)) {
|
|
488
|
+
const messages: string[] = []
|
|
489
|
+
for (const branch of seed.branches) {
|
|
490
|
+
if (branch.type !== 'relation' || branch.multiple !== true) continue
|
|
491
|
+
const name = `rel_${seed.slug}_${branch.alias}`
|
|
492
|
+
if (name.length > 256) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
493
|
+
<span class="cstat-no" title="statement not covered" > messages.push(`Junction table name '${name}' exceeds 256 characters (${name.length})`)</span>
|
|
494
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
495
|
+
if (junctionNames.has(name)) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
496
|
+
<span class="cstat-no" title="statement not covered" > messages.push(`Junction table name collision: '${name}' already used by another seed/branch`)</span>
|
|
497
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
498
|
+
junctionNames.add(name)
|
|
499
|
+
}
|
|
500
|
+
if (messages.length > 0) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
501
|
+
<span class="cstat-no" title="statement not covered" > result.push({ slug: seed.slug, messages, fatal: true })</span>
|
|
502
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
// ── Fatal check 4: dependency cycles ────────────────────────────────────
|
|
507
|
+
// Skip if unknown targets were found — sortSeedsByDependencies would throw
|
|
508
|
+
// on the same unknown targets, producing duplicate fatal messages.
|
|
509
|
+
const hasUnknownTargets = result.some(e => e.fatal)
|
|
510
|
+
if (!hasUnknownTargets) {
|
|
511
|
+
try {
|
|
512
|
+
sortSeedsByDependencies(Object.values(registry))
|
|
513
|
+
} catch (err) {
|
|
514
|
+
const msg = err instanceof Error ? err.<span class="branch-0 cbranch-no" title="branch not covered" >message : String(err)</span>
|
|
515
|
+
result.push({ slug: '<graph>', messages: [msg], fatal: true })
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
// ── Warning checks (existing) ────────────────────────────────────────────
|
|
520
|
+
const slugsSeen = new Set<string>()
|
|
521
|
+
|
|
522
|
+
for (const seed of Object.values(registry)) {
|
|
523
|
+
const messages: string[] = []
|
|
524
|
+
|
|
525
|
+
if (slugsSeen.has(seed.slug)) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
526
|
+
<span class="cstat-no" title="statement not covered" > messages.push(`duplicate slug "${seed.slug}" — each seed must have a unique slug`)</span>
|
|
527
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
528
|
+
slugsSeen.add(seed.slug)
|
|
529
|
+
|
|
530
|
+
const aliasesSeen = new Set<string>()
|
|
531
|
+
for (const branch of seed.branches) {
|
|
532
|
+
if (aliasesSeen.has(branch.alias)) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
533
|
+
<span class="cstat-no" title="statement not covered" > messages.push(`duplicate branch alias "${branch.alias}"`)</span>
|
|
534
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
535
|
+
aliasesSeen.add(branch.alias)
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
const allAliases = new Set(seed.branches.map(b => b.alias))
|
|
539
|
+
if (!allAliases.has(seed.displayNameAlias)) {
|
|
540
|
+
messages.push(`displayNameAlias "${seed.displayNameAlias}" not found in branches`)
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
if (messages.length > 0) {
|
|
544
|
+
result.push({ slug: seed.slug, messages, fatal: false })
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
return result
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export async function validate(args: ValidateOptions): Promise<void> {</span></span>
|
|
552
|
+
<span class="cstat-no" title="statement not covered" > const registry = args.registry ?? SEED_REGISTRY</span>
|
|
553
|
+
|
|
554
|
+
<span class="cstat-no" title="statement not covered" > if (Object.keys(registry).length === 0) {</span>
|
|
555
|
+
<span class="cstat-no" title="statement not covered" > console.warn(pc.yellow('\n Warning: SEED_REGISTRY is empty. Create a seeds.ts in your project root.\n'))</span>
|
|
556
|
+
<span class="cstat-no" title="statement not covered" > return</span>
|
|
557
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
558
|
+
|
|
559
|
+
<span class="cstat-no" title="statement not covered" > console.log(pc.cyan('\n beech validate — checking seeds\n'))</span>
|
|
560
|
+
|
|
561
|
+
<span class="cstat-no" title="statement not covered" > const errors = validateSeeds(registry)</span>
|
|
562
|
+
<span class="cstat-no" title="statement not covered" > const fatalErrors = errors.filter(e => e.fatal)</span>
|
|
563
|
+
<span class="cstat-no" title="statement not covered" > const warnings = errors.filter(e => !e.fatal)</span>
|
|
564
|
+
|
|
565
|
+
// Print fatal errors first
|
|
566
|
+
<span class="cstat-no" title="statement not covered" > for (const e of fatalErrors) {</span>
|
|
567
|
+
<span class="cstat-no" title="statement not covered" > console.log(pc.red(` ✗ ${e.slug} (fatal)`))</span>
|
|
568
|
+
<span class="cstat-no" title="statement not covered" > for (const msg of e.messages) {</span>
|
|
569
|
+
<span class="cstat-no" title="statement not covered" > console.log(pc.red(` → ${msg}`))</span>
|
|
570
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
571
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
572
|
+
|
|
573
|
+
// Print per-seed warnings
|
|
574
|
+
<span class="cstat-no" title="statement not covered" > const warningMap = new Map(warnings.map(e => [e.slug, e.messages]))</span>
|
|
575
|
+
<span class="cstat-no" title="statement not covered" > const allWarningSlugsSeen = new Set(warnings.map(e => e.slug))</span>
|
|
576
|
+
|
|
577
|
+
<span class="cstat-no" title="statement not covered" > for (const seed of Object.values(registry)) {</span>
|
|
578
|
+
<span class="cstat-no" title="statement not covered" > const msgs = warningMap.get(seed.slug)</span>
|
|
579
|
+
<span class="cstat-no" title="statement not covered" > if (!msgs) {</span>
|
|
580
|
+
<span class="cstat-no" title="statement not covered" > if (!allWarningSlugsSeen.has(seed.slug)) {</span>
|
|
581
|
+
// only print ✓ if no fatal error for this slug either
|
|
582
|
+
<span class="cstat-no" title="statement not covered" > const hasFatal = fatalErrors.some(e => e.slug === seed.slug)</span>
|
|
583
|
+
<span class="cstat-no" title="statement not covered" > if (!hasFatal) console.log(pc.green(` ✓ ${seed.slug}`))</span>
|
|
584
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
585
|
+
<span class="cstat-no" title="statement not covered" > } else {</span>
|
|
586
|
+
<span class="cstat-no" title="statement not covered" > console.log(pc.yellow(` ⚠ ${seed.slug}`))</span>
|
|
587
|
+
<span class="cstat-no" title="statement not covered" > for (const msg of msgs) {</span>
|
|
588
|
+
<span class="cstat-no" title="statement not covered" > console.log(pc.yellow(` → ${msg}`))</span>
|
|
589
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
590
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
591
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
592
|
+
|
|
593
|
+
<span class="cstat-no" title="statement not covered" > console.log('')</span>
|
|
594
|
+
|
|
595
|
+
<span class="cstat-no" title="statement not covered" > const totalFatal = fatalErrors.reduce((n, e) => n + e.messages.length, 0)</span>
|
|
596
|
+
<span class="cstat-no" title="statement not covered" > const totalWarnings = warnings.reduce((n, e) => n + e.messages.length, 0)</span>
|
|
597
|
+
|
|
598
|
+
<span class="cstat-no" title="statement not covered" > if (totalFatal > 0) {</span>
|
|
599
|
+
<span class="cstat-no" title="statement not covered" > const s = totalFatal !== 1 ? 's' : ''</span>
|
|
600
|
+
<span class="cstat-no" title="statement not covered" > console.log(pc.red(` Found ${totalFatal} fatal error${s}. Fix before loading.\n`))</span>
|
|
601
|
+
<span class="cstat-no" title="statement not covered" > process.exit(1)</span>
|
|
602
|
+
<span class="cstat-no" title="statement not covered" > } else if (totalWarnings > 0) {</span>
|
|
603
|
+
<span class="cstat-no" title="statement not covered" > const s = totalWarnings !== 1 ? 's' : ''</span>
|
|
604
|
+
<span class="cstat-no" title="statement not covered" > console.log(pc.yellow(` Found ${totalWarnings} warning${s}. Review seeds above.\n`))</span>
|
|
605
|
+
<span class="cstat-no" title="statement not covered" > } else {</span>
|
|
606
|
+
<span class="cstat-no" title="statement not covered" > console.log(pc.green(' All seeds valid.\n'))</span>
|
|
607
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
608
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
609
|
+
</pre></td></tr></table></pre>
|
|
610
|
+
|
|
611
|
+
<div class='push'></div><!-- for sticky footer -->
|
|
612
|
+
</div><!-- /wrapper -->
|
|
613
|
+
<div class='footer quiet pad2 space-top1 center small'>
|
|
614
|
+
Code coverage generated by
|
|
615
|
+
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
616
|
+
at 2026-06-03T22:56:37.415Z
|
|
617
|
+
</div>
|
|
618
|
+
<script src="prettify.js"></script>
|
|
619
|
+
<script>
|
|
620
|
+
window.onload = function () {
|
|
621
|
+
prettyPrint();
|
|
622
|
+
};
|
|
623
|
+
</script>
|
|
624
|
+
<script src="sorter.js"></script>
|
|
625
|
+
<script src="block-navigation.js"></script>
|
|
626
|
+
</body>
|
|
627
|
+
</html>
|
|
628
|
+
|