@c15t/backend 0.0.1-rc.24 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/.turbo/turbo-build.log +5 -5
  2. package/dist/index.cjs +1 -1
  3. package/dist/index.js +1 -1
  4. package/dist/pkgs/logger/types.d.ts +1 -1
  5. package/dist/pkgs/logger/types.d.ts.map +1 -1
  6. package/package.json +2 -3
  7. package/src/pkgs/logger/types.ts +1 -5
  8. package/.turbo/turbo-fmt.log +0 -7
  9. package/.turbo/turbo-test.log +0 -551
  10. package/coverage/coverage-final.json +0 -83
  11. package/coverage/coverage-summary.json +0 -84
  12. package/coverage/html/backend/index.html +0 -116
  13. package/coverage/html/backend/rslib.config.ts.html +0 -424
  14. package/coverage/html/backend/src/core.ts.html +0 -796
  15. package/coverage/html/backend/src/index.html +0 -131
  16. package/coverage/html/backend/src/init.ts.html +0 -1072
  17. package/coverage/html/backend/src/integrations/cloudflare.ts.html +0 -889
  18. package/coverage/html/backend/src/integrations/index.html +0 -146
  19. package/coverage/html/backend/src/integrations/next.ts.html +0 -691
  20. package/coverage/html/backend/src/integrations/node.ts.html +0 -505
  21. package/coverage/html/backend/src/pkgs/api-router/hooks/index.html +0 -116
  22. package/coverage/html/backend/src/pkgs/api-router/hooks/processor.ts.html +0 -538
  23. package/coverage/html/backend/src/pkgs/api-router/index.html +0 -131
  24. package/coverage/html/backend/src/pkgs/api-router/index.ts.html +0 -529
  25. package/coverage/html/backend/src/pkgs/api-router/telemetry.ts.html +0 -334
  26. package/coverage/html/backend/src/pkgs/api-router/utils/cors.ts.html +0 -304
  27. package/coverage/html/backend/src/pkgs/api-router/utils/define-route.ts.html +0 -1315
  28. package/coverage/html/backend/src/pkgs/api-router/utils/index.html +0 -146
  29. package/coverage/html/backend/src/pkgs/api-router/utils/ip.ts.html +0 -361
  30. package/coverage/html/backend/src/pkgs/data-model/fields/field-factory.ts.html +0 -709
  31. package/coverage/html/backend/src/pkgs/data-model/fields/id-generator.ts.html +0 -256
  32. package/coverage/html/backend/src/pkgs/data-model/fields/index.html +0 -161
  33. package/coverage/html/backend/src/pkgs/data-model/fields/superjson-utils.ts.html +0 -136
  34. package/coverage/html/backend/src/pkgs/data-model/fields/zod-fields.ts.html +0 -496
  35. package/coverage/html/backend/src/pkgs/data-model/hooks/create-hooks.ts.html +0 -349
  36. package/coverage/html/backend/src/pkgs/data-model/hooks/index.html +0 -176
  37. package/coverage/html/backend/src/pkgs/data-model/hooks/update-hooks.ts.html +0 -358
  38. package/coverage/html/backend/src/pkgs/data-model/hooks/update-many-hooks.ts.html +0 -613
  39. package/coverage/html/backend/src/pkgs/data-model/hooks/utils.ts.html +0 -538
  40. package/coverage/html/backend/src/pkgs/data-model/hooks/with-hooks-factory.ts.html +0 -289
  41. package/coverage/html/backend/src/pkgs/db-adapters/adapter-factory.ts.html +0 -277
  42. package/coverage/html/backend/src/pkgs/db-adapters/adapters/drizzle-adapter/drizzle-adapter.ts.html +0 -2212
  43. package/coverage/html/backend/src/pkgs/db-adapters/adapters/drizzle-adapter/index.html +0 -116
  44. package/coverage/html/backend/src/pkgs/db-adapters/adapters/index.html +0 -116
  45. package/coverage/html/backend/src/pkgs/db-adapters/adapters/kysely-adapter/dialect.ts.html +0 -676
  46. package/coverage/html/backend/src/pkgs/db-adapters/adapters/kysely-adapter/index.html +0 -131
  47. package/coverage/html/backend/src/pkgs/db-adapters/adapters/kysely-adapter/kysely-adapter.ts.html +0 -3637
  48. package/coverage/html/backend/src/pkgs/db-adapters/adapters/kysely-adapter/tests/index.html +0 -116
  49. package/coverage/html/backend/src/pkgs/db-adapters/adapters/kysely-adapter/tests/test-utils.ts.html +0 -1417
  50. package/coverage/html/backend/src/pkgs/db-adapters/adapters/memory-adapter/index.html +0 -116
  51. package/coverage/html/backend/src/pkgs/db-adapters/adapters/memory-adapter/memory-adapter.ts.html +0 -2074
  52. package/coverage/html/backend/src/pkgs/db-adapters/adapters/prisma-adapter/index.html +0 -116
  53. package/coverage/html/backend/src/pkgs/db-adapters/adapters/prisma-adapter/prisma-adapter.ts.html +0 -1837
  54. package/coverage/html/backend/src/pkgs/db-adapters/adapters/test.ts.html +0 -316
  55. package/coverage/html/backend/src/pkgs/db-adapters/index.html +0 -131
  56. package/coverage/html/backend/src/pkgs/db-adapters/utils.ts.html +0 -238
  57. package/coverage/html/backend/src/pkgs/logger/console-formatter.ts.html +0 -310
  58. package/coverage/html/backend/src/pkgs/logger/index.html +0 -176
  59. package/coverage/html/backend/src/pkgs/logger/log-levels.ts.html +0 -223
  60. package/coverage/html/backend/src/pkgs/logger/logger-factory.ts.html +0 -448
  61. package/coverage/html/backend/src/pkgs/logger/result-logging.ts.html +0 -487
  62. package/coverage/html/backend/src/pkgs/logger/telemetry.ts.html +0 -373
  63. package/coverage/html/backend/src/pkgs/migrations/get-migration.ts.html +0 -343
  64. package/coverage/html/backend/src/pkgs/migrations/get-schema/get-schema.ts.html +0 -217
  65. package/coverage/html/backend/src/pkgs/migrations/get-schema/index.html +0 -146
  66. package/coverage/html/backend/src/pkgs/migrations/get-schema/process-fields.ts.html +0 -280
  67. package/coverage/html/backend/src/pkgs/migrations/get-schema/process-tables.ts.html +0 -289
  68. package/coverage/html/backend/src/pkgs/migrations/index.html +0 -176
  69. package/coverage/html/backend/src/pkgs/migrations/migration-builders.ts.html +0 -595
  70. package/coverage/html/backend/src/pkgs/migrations/migration-execution.ts.html +0 -301
  71. package/coverage/html/backend/src/pkgs/migrations/schema-comparison.ts.html +0 -691
  72. package/coverage/html/backend/src/pkgs/migrations/type-mapping.ts.html +0 -817
  73. package/coverage/html/backend/src/pkgs/results/core/error-class.ts.html +0 -1012
  74. package/coverage/html/backend/src/pkgs/results/core/error-codes.ts.html +0 -703
  75. package/coverage/html/backend/src/pkgs/results/core/index.html +0 -146
  76. package/coverage/html/backend/src/pkgs/results/core/tracing.ts.html +0 -280
  77. package/coverage/html/backend/src/pkgs/results/create-telemetry-options.ts.html +0 -271
  78. package/coverage/html/backend/src/pkgs/results/h3-integration.ts.html +0 -511
  79. package/coverage/html/backend/src/pkgs/results/index.html +0 -131
  80. package/coverage/html/backend/src/pkgs/results/pipeline/index.html +0 -131
  81. package/coverage/html/backend/src/pkgs/results/pipeline/retrieval-pipeline.ts.html +0 -649
  82. package/coverage/html/backend/src/pkgs/results/pipeline/validation-pipeline.ts.html +0 -577
  83. package/coverage/html/backend/src/pkgs/results/results/index.html +0 -131
  84. package/coverage/html/backend/src/pkgs/results/results/recovery-utils.ts.html +0 -628
  85. package/coverage/html/backend/src/pkgs/results/results/result-helpers.ts.html +0 -1234
  86. package/coverage/html/backend/src/pkgs/utils/env.ts.html +0 -337
  87. package/coverage/html/backend/src/pkgs/utils/index.html +0 -131
  88. package/coverage/html/backend/src/pkgs/utils/url.ts.html +0 -400
  89. package/coverage/html/backend/src/routes/index.html +0 -176
  90. package/coverage/html/backend/src/routes/index.ts.html +0 -121
  91. package/coverage/html/backend/src/routes/set-consent.ts.html +0 -832
  92. package/coverage/html/backend/src/routes/show-consent-banner.ts.html +0 -478
  93. package/coverage/html/backend/src/routes/status.ts.html +0 -268
  94. package/coverage/html/backend/src/routes/verify-consent.ts.html +0 -703
  95. package/coverage/html/backend/src/schema/audit-log/index.html +0 -146
  96. package/coverage/html/backend/src/schema/audit-log/registry.ts.html +0 -436
  97. package/coverage/html/backend/src/schema/audit-log/schema.ts.html +0 -223
  98. package/coverage/html/backend/src/schema/audit-log/table.ts.html +0 -640
  99. package/coverage/html/backend/src/schema/consent/index.html +0 -146
  100. package/coverage/html/backend/src/schema/consent/registry.ts.html +0 -616
  101. package/coverage/html/backend/src/schema/consent/schema.ts.html +0 -238
  102. package/coverage/html/backend/src/schema/consent/table.ts.html +0 -748
  103. package/coverage/html/backend/src/schema/consent-policy/index.html +0 -146
  104. package/coverage/html/backend/src/schema/consent-policy/registry.ts.html +0 -1063
  105. package/coverage/html/backend/src/schema/consent-policy/schema.ts.html +0 -265
  106. package/coverage/html/backend/src/schema/consent-policy/table.ts.html +0 -535
  107. package/coverage/html/backend/src/schema/consent-purpose/index.html +0 -146
  108. package/coverage/html/backend/src/schema/consent-purpose/registry.ts.html +0 -589
  109. package/coverage/html/backend/src/schema/consent-purpose/schema.ts.html +0 -259
  110. package/coverage/html/backend/src/schema/consent-purpose/table.ts.html +0 -547
  111. package/coverage/html/backend/src/schema/consent-record/index.html +0 -131
  112. package/coverage/html/backend/src/schema/consent-record/schema.ts.html +0 -211
  113. package/coverage/html/backend/src/schema/consent-record/table.ts.html +0 -457
  114. package/coverage/html/backend/src/schema/create-registry.ts.html +0 -148
  115. package/coverage/html/backend/src/schema/definition.ts.html +0 -685
  116. package/coverage/html/backend/src/schema/domain/index.html +0 -146
  117. package/coverage/html/backend/src/schema/domain/registry.ts.html +0 -973
  118. package/coverage/html/backend/src/schema/domain/schema.ts.html +0 -214
  119. package/coverage/html/backend/src/schema/domain/table.ts.html +0 -496
  120. package/coverage/html/backend/src/schema/index.html +0 -146
  121. package/coverage/html/backend/src/schema/schemas.ts.html +0 -166
  122. package/coverage/html/backend/src/schema/subject/index.html +0 -146
  123. package/coverage/html/backend/src/schema/subject/registry.ts.html +0 -973
  124. package/coverage/html/backend/src/schema/subject/schema.ts.html +0 -208
  125. package/coverage/html/backend/src/schema/subject/table.ts.html +0 -499
  126. package/coverage/html/base.css +0 -224
  127. package/coverage/html/block-navigation.js +0 -87
  128. package/coverage/html/favicon.png +0 -0
  129. package/coverage/html/index.html +0 -581
  130. package/coverage/html/prettify.css +0 -1
  131. package/coverage/html/prettify.js +0 -2
  132. package/coverage/html/sort-arrow-sprite.png +0 -0
  133. package/coverage/html/sorter.js +0 -196
@@ -1,685 +0,0 @@
1
-
2
- <!doctype html>
3
- <html lang="en">
4
-
5
- <head>
6
- <title>Code coverage report for backend/src/schema/definition.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">backend/src/schema</a> definition.ts</h1>
23
- <div class='clearfix'>
24
-
25
- <div class='fl pad1y space-right2'>
26
- <span class="strong">30.43% </span>
27
- <span class="quiet">Statements</span>
28
- <span class='fraction'>7/23</span>
29
- </div>
30
-
31
-
32
- <div class='fl pad1y space-right2'>
33
- <span class="strong">25% </span>
34
- <span class="quiet">Branches</span>
35
- <span class='fraction'>3/12</span>
36
- </div>
37
-
38
-
39
- <div class='fl pad1y space-right2'>
40
- <span class="strong">66.66% </span>
41
- <span class="quiet">Functions</span>
42
- <span class='fraction'>2/3</span>
43
- </div>
44
-
45
-
46
- <div class='fl pad1y space-right2'>
47
- <span class="strong">30.43% </span>
48
- <span class="quiet">Lines</span>
49
- <span class='fraction'>7/23</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 low'></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>
254
- <a name='L189'></a><a href='#L189'>189</a>
255
- <a name='L190'></a><a href='#L190'>190</a>
256
- <a name='L191'></a><a href='#L191'>191</a>
257
- <a name='L192'></a><a href='#L192'>192</a>
258
- <a name='L193'></a><a href='#L193'>193</a>
259
- <a name='L194'></a><a href='#L194'>194</a>
260
- <a name='L195'></a><a href='#L195'>195</a>
261
- <a name='L196'></a><a href='#L196'>196</a>
262
- <a name='L197'></a><a href='#L197'>197</a>
263
- <a name='L198'></a><a href='#L198'>198</a>
264
- <a name='L199'></a><a href='#L199'>199</a>
265
- <a name='L200'></a><a href='#L200'>200</a>
266
- <a name='L201'></a><a href='#L201'>201</a></td><td class="line-coverage quiet"><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-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-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-yes">6x</span>
305
- <span class="cline-any cline-yes">40x</span>
306
- <span class="cline-any cline-yes">18x</span>
307
- <span class="cline-any cline-yes">18x</span>
308
- <span class="cline-any cline-yes">18x</span>
309
- <span class="cline-any cline-neutral">&nbsp;</span>
310
- <span class="cline-any cline-no">&nbsp;</span>
311
- <span class="cline-any cline-no">&nbsp;</span>
312
- <span class="cline-any cline-neutral">&nbsp;</span>
313
- <span class="cline-any cline-neutral">&nbsp;</span>
314
- <span class="cline-any cline-neutral">&nbsp;</span>
315
- <span class="cline-any cline-neutral">&nbsp;</span>
316
- <span class="cline-any cline-neutral">&nbsp;</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-no">&nbsp;</span>
320
- <span class="cline-any cline-neutral">&nbsp;</span>
321
- <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</span>
325
- <span class="cline-any cline-neutral">&nbsp;</span>
326
- <span class="cline-any cline-neutral">&nbsp;</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-yes">40x</span>
336
- <span class="cline-any cline-neutral">&nbsp;</span>
337
- <span class="cline-any cline-yes">40x</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-neutral">&nbsp;</span>
349
- <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
354
- <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
359
- <span class="cline-any cline-neutral">&nbsp;</span>
360
- <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</span>
389
- <span class="cline-any cline-neutral">&nbsp;</span>
390
- <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</span>
408
- <span class="cline-any cline-neutral">&nbsp;</span>
409
- <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</span>
415
- <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</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-no">&nbsp;</span>
425
- <span class="cline-any cline-no">&nbsp;</span>
426
- <span class="cline-any cline-neutral">&nbsp;</span>
427
- <span class="cline-any cline-no">&nbsp;</span>
428
- <span class="cline-any cline-no">&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-no">&nbsp;</span>
433
- <span class="cline-any cline-no">&nbsp;</span>
434
- <span class="cline-any cline-no">&nbsp;</span>
435
- <span class="cline-any cline-no">&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-neutral">&nbsp;</span>
440
- <span class="cline-any cline-neutral">&nbsp;</span>
441
- <span class="cline-any cline-neutral">&nbsp;</span>
442
- <span class="cline-any cline-neutral">&nbsp;</span>
443
- <span class="cline-any cline-neutral">&nbsp;</span>
444
- <span class="cline-any cline-neutral">&nbsp;</span>
445
- <span class="cline-any cline-neutral">&nbsp;</span>
446
- <span class="cline-any cline-neutral">&nbsp;</span>
447
- <span class="cline-any cline-neutral">&nbsp;</span>
448
- <span class="cline-any cline-neutral">&nbsp;</span>
449
- <span class="cline-any cline-neutral">&nbsp;</span>
450
- <span class="cline-any cline-neutral">&nbsp;</span>
451
- <span class="cline-any cline-neutral">&nbsp;</span>
452
- <span class="cline-any cline-neutral">&nbsp;</span>
453
- <span class="cline-any cline-neutral">&nbsp;</span>
454
- <span class="cline-any cline-no">&nbsp;</span>
455
- <span class="cline-any cline-no">&nbsp;</span>
456
- <span class="cline-any cline-neutral">&nbsp;</span>
457
- <span class="cline-any cline-no">&nbsp;</span>
458
- <span class="cline-any cline-no">&nbsp;</span>
459
- <span class="cline-any cline-neutral">&nbsp;</span>
460
- <span class="cline-any cline-neutral">&nbsp;</span>
461
- <span class="cline-any cline-neutral">&nbsp;</span>
462
- <span class="cline-any cline-neutral">&nbsp;</span>
463
- <span class="cline-any cline-no">&nbsp;</span>
464
- <span class="cline-any cline-neutral">&nbsp;</span>
465
- <span class="cline-any cline-neutral">&nbsp;</span>
466
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { ZodError } from 'node_modules/zod/lib/ZodError';
467
- import type { Field, PluginSchema } from '~/pkgs/data-model';
468
- import { logger } from '~/pkgs/logger';
469
- import type { C15TOptions } from '~/types';
470
- import { getAuditLogTable } from './audit-log/table';
471
- import { getConsentPolicyTable } from './consent-policy/table';
472
- import { getPurposeTable } from './consent-purpose/table';
473
- import { getConsentRecordTable } from './consent-record/table';
474
- import { getConsentTable } from './consent/table';
475
- import { getDomainTable } from './domain/table';
476
- import type { InferTableShape } from './schemas';
477
- import { getSubjectTable } from './subject/table';
478
- &nbsp;
479
- /**
480
- * Retrieves all consent-related database table definitions
481
- *
482
- * This function combines the core tables with any additional tables
483
- * defined by plugins. It handles merging plugin-defined fields with
484
- * the standard tables and ensures all table definitions are properly
485
- * structured for use by database adapters.
486
- *
487
- * @param options - The c15t configuration options
488
- * @returns A complete schema mapping containing all table definitions
489
- *
490
- * @remarks
491
- * Each table definition includes both field definitions and the physical
492
- * entity name used in the database. Plugins can extend core tables by
493
- * defining additional fields, which will be merged with the standard fields.
494
- *
495
- * @example
496
- * ```typescript
497
- * // Get all tables with default configuration
498
- * const tables = getConsentTables(options);
499
- *
500
- * // Access fields for the consent table
501
- * const consentFields = tables.consent.fields;
502
- * ```
503
- */
504
- export const getConsentTables = (options: C15TOptions) =&gt; {
505
- const pluginSchema = options.plugins?.reduce((acc, plugin) =&gt; {
506
- const schema = plugin.schema;
507
- <span class="missing-if-branch" title="else path not taken" >E</span>if (!schema) {
508
- return acc;
509
- }
510
- <span class="cstat-no" title="statement not covered" > for (const [key, value] of Object.entries(schema)) {</span>
511
- <span class="cstat-no" title="statement not covered" > acc[key] = {</span>
512
- fields: {
513
- ...acc[key]?.fields,
514
- ...(value as { fields: Record&lt;string, Field&gt; }).fields,
515
- },
516
- entityName: key,
517
- };
518
- }
519
- <span class="cstat-no" title="statement not covered" > return acc;</span>
520
- }, {} as PluginSchema);
521
- &nbsp;
522
- const {
523
- subject,
524
- consentPurpose,
525
- consentPolicy,
526
- domain,
527
- geoLocation,
528
- consent,
529
- consentPurposeJunction,
530
- record,
531
- consentGeoLocation,
532
- consentWithdrawal,
533
- auditLog,
534
- ...pluginTables
535
- } = pluginSchema || {};
536
- &nbsp;
537
- return {
538
- subject: getSubjectTable(options, subject?.fields),
539
- consentPurpose: getPurposeTable(options, consentPurpose?.fields),
540
- consentPolicy: getConsentPolicyTable(options, consentPolicy?.fields),
541
- domain: getDomainTable(options, domain?.fields),
542
- consent: getConsentTable(options, consent?.fields),
543
- consentRecord: getConsentRecordTable(options, record?.fields),
544
- auditLog: getAuditLogTable(options, auditLog?.fields),
545
- ...pluginTables,
546
- };
547
- };
548
- &nbsp;
549
- /**
550
- * Type representing the complete database schema for c15t
551
- *
552
- * This type captures the full structure of all tables in the database,
553
- * including core tables and any plugin-defined tables. It's derived from
554
- * the return type of `getConsentTables()`.
555
- *
556
- * @remarks
557
- * This is a key type for type-safety throughout the codebase, as it
558
- * ensures that table names and field references are validated at compile time.
559
- * It's used as a basis for many other type definitions in the database layer.
560
- *
561
- * @example
562
- * ```typescript
563
- * // Type-safe reference to a specific table
564
- * function processTable&lt;TableName extends keyof C15TDBSchema&gt;(
565
- * tableName: TableName,
566
- * data: Record&lt;string, unknown&gt;
567
- * ) {
568
- * const tableFields = getConsentTables(options)[tableName].fields;
569
- * // Process with type safety...
570
- * }
571
- * ```
572
- */
573
- export type C15TDBSchema = ReturnType&lt;typeof getConsentTables&gt;;
574
- &nbsp;
575
- /**
576
- * Type to get all output fields of a table by its name
577
- * This type extracts only the fields that are included in output operations,
578
- * automatically excluding fields marked with { returned: false }.
579
- * It also resolves relationships between tables.
580
- */
581
- export type EntityOutputFields&lt;TableName extends keyof C15TDBSchema&gt; =
582
- InferTableShape&lt;TableName&gt;;
583
- &nbsp;
584
- /**
585
- * Validates output data against table schema using Zod
586
- *
587
- * This function validates and transforms output data according to the
588
- * schema definition for a specific table. It ensures that all values match
589
- * their expected types and excludes fields marked as not to be returned.
590
- *
591
- * @typeParam TableName - The table name from C15TDBSchema
592
- * @param tableName - The name of the table to validate against
593
- * @param data - The data to validate
594
- * @param options - The C15TOptions instance
595
- * @returns Validated and typed data
596
- * @throws {Error} If the table is not found or validation fails
597
- *
598
- * @remarks
599
- * This function is particularly useful for validating data received from
600
- * external sources or database adapters before processing it in application logic.
601
- *
602
- * @example
603
- * ```typescript
604
- * // Validate data retrieved from an external API
605
- * try {
606
- * const validSubjectOutput = validateEntityOutput(
607
- * 'subject',
608
- * fetchedSubjectData,
609
- * options
610
- * );
611
- *
612
- * // validSubjectOutput is now typed as EntityOutputFields&lt;'subject'&gt;
613
- * displaySubjectProfile(validSubjectOutput);
614
- * } catch (error) {
615
- * console.error('Output validation failed:', error.message);
616
- * }
617
- * ```
618
- */
619
- export function <span class="fstat-no" title="function not covered" >validateEntityOutput&lt;TableName extends keyof C15TDBSchema&gt;(</span>
620
- tableName: TableName,
621
- data: Record&lt;string, unknown&gt;,
622
- options: C15TOptions
623
- ): EntityOutputFields&lt;TableName&gt; {
624
- const tables = <span class="cstat-no" title="statement not covered" >getConsentTables(options);</span>
625
- const table = <span class="cstat-no" title="statement not covered" >tables[tableName];</span>
626
- &nbsp;
627
- <span class="cstat-no" title="statement not covered" > if (!table) {</span>
628
- <span class="cstat-no" title="statement not covered" > throw new Error(`Table ${tableName} not found`);</span>
629
- }
630
- &nbsp;
631
- // Pre-process data: Convert date strings to Date objects
632
- const processedData = <span class="cstat-no" title="statement not covered" >{ ...data };</span>
633
- <span class="cstat-no" title="statement not covered" > for (const [field, def] of Object.entries(table.fields)) {</span>
634
- <span class="cstat-no" title="statement not covered" > if (def.type === 'date' &amp;&amp; typeof processedData[field] === 'string') {</span>
635
- <span class="cstat-no" title="statement not covered" > processedData[field] = new Date(processedData[field] as string);</span>
636
- }
637
- }
638
- &nbsp;
639
- // This is useful for debugging validation issues
640
- // console.log('[validateEntityOutput] Debug data:', {
641
- // fields: Object.fromEntries(
642
- // Object.entries(table.fields).map(([key, field]) =&gt; [
643
- // key,
644
- // {
645
- // type: field.type,
646
- // required: field.required,
647
- // value: processedData[field.fieldName as keyof typeof processedData],
648
- // },
649
- // ])
650
- // ),
651
- // });
652
- &nbsp;
653
- // Validate and return data using Zod schema
654
- <span class="cstat-no" title="statement not covered" > try {</span>
655
- <span class="cstat-no" title="statement not covered" > return table.schema.parse(processedData) as EntityOutputFields&lt;TableName&gt;;</span>
656
- } catch (error) {
657
- <span class="cstat-no" title="statement not covered" > if (error instanceof ZodError) {</span>
658
- <span class="cstat-no" title="statement not covered" > logger.error(</span>
659
- `[validateEntityOutput] Validation failed for table ${String(tableName)}`,
660
- { table, issues: error.issues }
661
- );
662
- }
663
- <span class="cstat-no" title="statement not covered" > throw error;</span>
664
- }
665
- }
666
- &nbsp;</pre></td></tr></table></pre>
667
-
668
- <div class='push'></div><!-- for sticky footer -->
669
- </div><!-- /wrapper -->
670
- <div class='footer quiet pad2 space-top1 center small'>
671
- Code coverage generated by
672
- <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
673
- at 2025-04-14T10:55:46.797Z
674
- </div>
675
- <script src="../../../prettify.js"></script>
676
- <script>
677
- window.onload = function () {
678
- prettyPrint();
679
- };
680
- </script>
681
- <script src="../../../sorter.js"></script>
682
- <script src="../../../block-navigation.js"></script>
683
- </body>
684
- </html>
685
-