prostgles-server 4.0.57 → 4.0.59

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 (221) hide show
  1. package/dist/DboBuilder/getColumns.d.ts.map +1 -1
  2. package/dist/DboBuilder/getColumns.js +1 -13
  3. package/dist/DboBuilder/getColumns.js.map +1 -1
  4. package/dist/DboBuilder/runSQL.js +2 -2
  5. package/dist/DboBuilder/runSQL.js.map +1 -1
  6. package/dist/Prostgles.d.ts.map +1 -1
  7. package/dist/PubSubManager/PubSubManager.d.ts +1 -1
  8. package/dist/PubSubManager/PubSubManager.d.ts.map +1 -1
  9. package/dist/PubSubManager/PubSubManager.js +14 -1
  10. package/dist/PubSubManager/PubSubManager.js.map +1 -1
  11. package/lib/DboBuilder/getColumns.ts +1 -18
  12. package/lib/DboBuilder/runSQL.ts +2 -2
  13. package/lib/Prostgles.ts +3 -3
  14. package/lib/PubSubManager/PubSubManager.ts +14 -1
  15. package/package.json +2 -2
  16. package/tests/client/PID.txt +1 -1
  17. package/tests/client/package.json +2 -2
  18. package/tests/client/tsconfig.json +2 -1
  19. package/tests/isomorphic_queries.ts +11 -9
  20. package/tests/server/DBoGenerated.d.ts +1 -1
  21. package/tests/server/dboTypeCheck.ts +3 -3
  22. package/tests/server/index.ts +7 -6
  23. package/tests/server/package-lock.json +1 -1
  24. package/tests/server/package.json +3 -3
  25. package/tests/server/publishTypeCheck.ts +1 -1
  26. package/tests/server/tsconfig.json +3 -2
  27. package/tests/test.sh +2 -0
  28. package/dist/FileManager.d.ts +0 -143
  29. package/dist/FileManager.d.ts.map +0 -1
  30. package/dist/FileManager.js +0 -646
  31. package/dist/FileManager.js.map +0 -1
  32. package/dist/TableConfig.d.ts +0 -267
  33. package/dist/TableConfig.d.ts.map +0 -1
  34. package/dist/TableConfig.js +0 -463
  35. package/dist/TableConfig.js.map +0 -1
  36. package/dist/validation.d.ts +0 -126
  37. package/dist/validation.d.ts.map +0 -1
  38. package/dist/validation.js +0 -405
  39. package/dist/validation.js.map +0 -1
  40. package/lib/AuthHandler.d.ts +0 -187
  41. package/lib/AuthHandler.d.ts.map +0 -1
  42. package/lib/AuthHandler.js +0 -478
  43. package/lib/DBEventsManager.d.ts +0 -38
  44. package/lib/DBEventsManager.d.ts.map +0 -1
  45. package/lib/DBEventsManager.js +0 -140
  46. package/lib/DBSchemaBuilder.d.ts +0 -13
  47. package/lib/DBSchemaBuilder.d.ts.map +0 -1
  48. package/lib/DBSchemaBuilder.js +0 -145
  49. package/lib/DboBuilder/QueryBuilder/Functions.d.ts +0 -64
  50. package/lib/DboBuilder/QueryBuilder/Functions.d.ts.map +0 -1
  51. package/lib/DboBuilder/QueryBuilder/Functions.js +0 -984
  52. package/lib/DboBuilder/QueryBuilder/QueryBuilder.d.ts +0 -73
  53. package/lib/DboBuilder/QueryBuilder/QueryBuilder.d.ts.map +0 -1
  54. package/lib/DboBuilder/QueryBuilder/QueryBuilder.js +0 -335
  55. package/lib/DboBuilder/QueryBuilder/makeSelectQuery.d.ts +0 -8
  56. package/lib/DboBuilder/QueryBuilder/makeSelectQuery.d.ts.map +0 -1
  57. package/lib/DboBuilder/QueryBuilder/makeSelectQuery.js +0 -227
  58. package/lib/DboBuilder/TableHandler.d.ts +0 -37
  59. package/lib/DboBuilder/TableHandler.d.ts.map +0 -1
  60. package/lib/DboBuilder/TableHandler.js +0 -213
  61. package/lib/DboBuilder/ViewHandler.d.ts +0 -119
  62. package/lib/DboBuilder/ViewHandler.d.ts.map +0 -1
  63. package/lib/DboBuilder/ViewHandler.js +0 -1023
  64. package/lib/DboBuilder/delete.d.ts +0 -6
  65. package/lib/DboBuilder/delete.d.ts.map +0 -1
  66. package/lib/DboBuilder/delete.js +0 -128
  67. package/lib/DboBuilder/find.d.ts +0 -8
  68. package/lib/DboBuilder/find.d.ts.map +0 -1
  69. package/lib/DboBuilder/find.js +0 -91
  70. package/lib/DboBuilder/getColumns.d.ts +0 -12
  71. package/lib/DboBuilder/getColumns.d.ts.map +0 -1
  72. package/lib/DboBuilder/getColumns.js +0 -92
  73. package/lib/DboBuilder/getCondition.d.ts +0 -22
  74. package/lib/DboBuilder/getCondition.d.ts.map +0 -1
  75. package/lib/DboBuilder/getCondition.js +0 -236
  76. package/lib/DboBuilder/getSubscribeRelatedTables.d.ts +0 -20
  77. package/lib/DboBuilder/getSubscribeRelatedTables.d.ts.map +0 -1
  78. package/lib/DboBuilder/getSubscribeRelatedTables.js +0 -152
  79. package/lib/DboBuilder/getTablesForSchemaPostgresSQL.d.ts +0 -3
  80. package/lib/DboBuilder/getTablesForSchemaPostgresSQL.d.ts.map +0 -1
  81. package/lib/DboBuilder/getTablesForSchemaPostgresSQL.js +0 -207
  82. package/lib/DboBuilder/insert.d.ts +0 -6
  83. package/lib/DboBuilder/insert.d.ts.map +0 -1
  84. package/lib/DboBuilder/insert.js +0 -180
  85. package/lib/DboBuilder/insertDataParse.d.ts +0 -12
  86. package/lib/DboBuilder/insertDataParse.d.ts.map +0 -1
  87. package/lib/DboBuilder/insertDataParse.js +0 -253
  88. package/lib/DboBuilder/parseUpdateRules.d.ts +0 -18
  89. package/lib/DboBuilder/parseUpdateRules.d.ts.map +0 -1
  90. package/lib/DboBuilder/parseUpdateRules.js +0 -123
  91. package/lib/DboBuilder/runSQL.d.ts +0 -7
  92. package/lib/DboBuilder/runSQL.d.ts.map +0 -1
  93. package/lib/DboBuilder/runSQL.js +0 -135
  94. package/lib/DboBuilder/subscribe.d.ts +0 -20
  95. package/lib/DboBuilder/subscribe.d.ts.map +0 -1
  96. package/lib/DboBuilder/subscribe.js +0 -90
  97. package/lib/DboBuilder/update.d.ts +0 -6
  98. package/lib/DboBuilder/update.d.ts.map +0 -1
  99. package/lib/DboBuilder/update.js +0 -151
  100. package/lib/DboBuilder/uploadFile.d.ts +0 -7
  101. package/lib/DboBuilder/uploadFile.d.ts.map +0 -1
  102. package/lib/DboBuilder/uploadFile.js +0 -53
  103. package/lib/DboBuilder.d.ts +0 -306
  104. package/lib/DboBuilder.d.ts.map +0 -1
  105. package/lib/DboBuilder.js +0 -745
  106. package/lib/Event_Trigger_Tags.d.ts +0 -4
  107. package/lib/Event_Trigger_Tags.d.ts.map +0 -1
  108. package/lib/Event_Trigger_Tags.js +0 -116
  109. package/lib/FileManager/FileManager.d.ts +0 -135
  110. package/lib/FileManager/FileManager.d.ts.map +0 -1
  111. package/lib/FileManager/FileManager.js +0 -303
  112. package/lib/FileManager/initFileManager.d.ts +0 -4
  113. package/lib/FileManager/initFileManager.d.ts.map +0 -1
  114. package/lib/FileManager/initFileManager.js +0 -231
  115. package/lib/FileManager/parseFile.d.ts +0 -15
  116. package/lib/FileManager/parseFile.d.ts.map +0 -1
  117. package/lib/FileManager/parseFile.js +0 -58
  118. package/lib/FileManager/upload.d.ts +0 -6
  119. package/lib/FileManager/upload.d.ts.map +0 -1
  120. package/lib/FileManager/upload.js +0 -98
  121. package/lib/FileManager/uploadStream.d.ts +0 -5
  122. package/lib/FileManager/uploadStream.d.ts.map +0 -1
  123. package/lib/FileManager/uploadStream.js +0 -92
  124. package/lib/Filtering.d.ts +0 -15
  125. package/lib/Filtering.d.ts.map +0 -1
  126. package/lib/Filtering.js +0 -336
  127. package/lib/JSONBValidation/validate_jsonb_schema_sql.d.ts +0 -4
  128. package/lib/JSONBValidation/validate_jsonb_schema_sql.d.ts.map +0 -1
  129. package/lib/JSONBValidation/validate_jsonb_schema_sql.js +0 -500
  130. package/lib/JSONBValidation/validation.d.ts +0 -9
  131. package/lib/JSONBValidation/validation.d.ts.map +0 -1
  132. package/lib/JSONBValidation/validation.js +0 -131
  133. package/lib/PostgresNotifListenManager.d.ts +0 -28
  134. package/lib/PostgresNotifListenManager.d.ts.map +0 -1
  135. package/lib/PostgresNotifListenManager.js +0 -134
  136. package/lib/Prostgles.d.ts +0 -289
  137. package/lib/Prostgles.d.ts.map +0 -1
  138. package/lib/Prostgles.js +0 -685
  139. package/lib/PubSubManager/PubSubManager.d.ts +0 -175
  140. package/lib/PubSubManager/PubSubManager.d.ts.map +0 -1
  141. package/lib/PubSubManager/PubSubManager.js +0 -452
  142. package/lib/PubSubManager/addSub.d.ts +0 -8
  143. package/lib/PubSubManager/addSub.d.ts.map +0 -1
  144. package/lib/PubSubManager/addSub.js +0 -166
  145. package/lib/PubSubManager/addSync.d.ts +0 -8
  146. package/lib/PubSubManager/addSync.d.ts.map +0 -1
  147. package/lib/PubSubManager/addSync.js +0 -109
  148. package/lib/PubSubManager/getInitQuery.d.ts +0 -9
  149. package/lib/PubSubManager/getInitQuery.d.ts.map +0 -1
  150. package/lib/PubSubManager/getInitQuery.js +0 -552
  151. package/lib/PubSubManager/initPubSubManager.d.ts +0 -3
  152. package/lib/PubSubManager/initPubSubManager.d.ts.map +0 -1
  153. package/lib/PubSubManager/initPubSubManager.js +0 -116
  154. package/lib/PubSubManager/notifListener.d.ts +0 -5
  155. package/lib/PubSubManager/notifListener.d.ts.map +0 -1
  156. package/lib/PubSubManager/notifListener.js +0 -100
  157. package/lib/PubSubManager/pushSubData.d.ts +0 -3
  158. package/lib/PubSubManager/pushSubData.d.ts.map +0 -1
  159. package/lib/PubSubManager/pushSubData.js +0 -51
  160. package/lib/PublishParser.d.ts +0 -284
  161. package/lib/PublishParser.d.ts.map +0 -1
  162. package/lib/PublishParser.js +0 -421
  163. package/lib/SchemaWatch.d.ts +0 -13
  164. package/lib/SchemaWatch.d.ts.map +0 -1
  165. package/lib/SchemaWatch.js +0 -35
  166. package/lib/SyncReplication.d.ts +0 -34
  167. package/lib/SyncReplication.d.ts.map +0 -1
  168. package/lib/SyncReplication.js +0 -412
  169. package/lib/TableConfig/TableConfig.d.ts +0 -284
  170. package/lib/TableConfig/TableConfig.d.ts.map +0 -1
  171. package/lib/TableConfig/TableConfig.js +0 -437
  172. package/lib/TableConfig/getColumnDefinitionQuery.d.ts +0 -27
  173. package/lib/TableConfig/getColumnDefinitionQuery.d.ts.map +0 -1
  174. package/lib/TableConfig/getColumnDefinitionQuery.js +0 -87
  175. package/lib/TableConfig/getConstraintDefinitionQueries.d.ts +0 -34
  176. package/lib/TableConfig/getConstraintDefinitionQueries.d.ts.map +0 -1
  177. package/lib/TableConfig/getConstraintDefinitionQueries.js +0 -65
  178. package/lib/TableConfig/getFutureTableSchema.d.ts +0 -15
  179. package/lib/TableConfig/getFutureTableSchema.d.ts.map +0 -1
  180. package/lib/TableConfig/getFutureTableSchema.js +0 -43
  181. package/lib/TableConfig/getTableColumnQueries.d.ts +0 -16
  182. package/lib/TableConfig/getTableColumnQueries.d.ts.map +0 -1
  183. package/lib/TableConfig/getTableColumnQueries.js +0 -107
  184. package/lib/index.d.ts +0 -5
  185. package/lib/index.d.ts.map +0 -1
  186. package/lib/index.js +0 -7
  187. package/lib/shortestPath.d.ts +0 -10
  188. package/lib/shortestPath.d.ts.map +0 -1
  189. package/lib/shortestPath.js +0 -111
  190. package/lib/utils.d.ts +0 -3
  191. package/lib/utils.d.ts.map +0 -1
  192. package/lib/utils.js +0 -12
  193. package/tests/client/index.d.ts +0 -2
  194. package/tests/client/index.d.ts.map +0 -1
  195. package/tests/client/index.js +0 -80
  196. package/tests/client/index.js.map +0 -1
  197. package/tests/client_only_queries.d.ts +0 -4
  198. package/tests/client_only_queries.d.ts.map +0 -1
  199. package/tests/client_only_queries.js +0 -282
  200. package/tests/config_test/DBoGenerated.d.ts +0 -388
  201. package/tests/config_test/index.js +0 -174
  202. package/tests/config_test/index.js.map +0 -1
  203. package/tests/isomorphic_queries.d.ts +0 -9
  204. package/tests/isomorphic_queries.d.ts.map +0 -1
  205. package/tests/isomorphic_queries.js +0 -773
  206. package/tests/manual_test/DBoGenerated.d.ts +0 -398
  207. package/tests/manual_test/index.d.ts +0 -2
  208. package/tests/manual_test/index.d.ts.map +0 -1
  209. package/tests/manual_test/index.js +0 -65
  210. package/tests/server/dboTypeCheck.d.ts +0 -2
  211. package/tests/server/dboTypeCheck.d.ts.map +0 -1
  212. package/tests/server/dboTypeCheck.js +0 -27
  213. package/tests/server/index.d.ts +0 -2
  214. package/tests/server/index.d.ts.map +0 -1
  215. package/tests/server/index.js +0 -507
  216. package/tests/server/publishTypeCheck.d.ts +0 -2
  217. package/tests/server/publishTypeCheck.d.ts.map +0 -1
  218. package/tests/server/publishTypeCheck.js +0 -130
  219. package/tests/server_only_queries.d.ts +0 -2
  220. package/tests/server_only_queries.d.ts.map +0 -1
  221. package/tests/server_only_queries.js +0 -19
@@ -1,500 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.validate_jsonb_schema_sql = exports.JSONB_DATA_TYPES = exports.VALIDATE_SCHEMA_FUNCNAME = void 0;
4
- const prostgles_types_1 = require("prostgles-types");
5
- const PubSubManager_1 = require("../PubSubManager/PubSubManager");
6
- const raiseException = (err) => `
7
- IF (context->'silent')::BOOLEAN = TRUE THEN
8
- RETURN FALSE;
9
- ELSE
10
- RAISE EXCEPTION ${err} USING HINT = path, COLUMN = colname, TABLE = tablename, CONSTRAINT = 'validate_jsonb_schema: ' || jsonb_pretty(jsonb_schema::JSONB);
11
- END IF;
12
- `;
13
- exports.VALIDATE_SCHEMA_FUNCNAME = "validate_jsonb_schema";
14
- exports.JSONB_DATA_TYPES = [
15
- ...prostgles_types_1.DATA_TYPES,
16
- "Lookup", "Lookup[]"
17
- ];
18
- exports.validate_jsonb_schema_sql = `
19
-
20
- /*
21
- * ${PubSubManager_1.PubSubManager.EXCLUDE_QUERY_FROM_SCHEMA_WATCH_ID}
22
- */
23
-
24
- CREATE OR REPLACE FUNCTION ${exports.VALIDATE_SCHEMA_FUNCNAME}(
25
- jsonb_schema TEXT,
26
- data JSONB,
27
- context JSONB DEFAULT '{}'::JSONB, /* { table: string; column: string; silent: boolean } */
28
- checked_path TEXT[] DEFAULT ARRAY[]::TEXT[]
29
- ) RETURNS boolean AS
30
- $f$
31
- DECLARE
32
- sub_schema RECORD;
33
- array_element RECORD;
34
- obj_key_val RECORD;
35
- schema JSONB;
36
- path text;
37
- allowed_types text[] = '{${exports.JSONB_DATA_TYPES.join(",")}}';
38
- typeStr TEXT = NULL;
39
- optional boolean;
40
- nullable boolean;
41
- colname TEXT = COALESCE(context->>'column', '');
42
- tablename TEXT = COALESCE(context->>'table', '');
43
- oneof JSONB;
44
- arrayof JSONB;
45
- lookup_data_def_schema TEXT = $d$
46
- {
47
- "type": { "enum": ["data", "data-def"] },
48
- "table": "string",
49
- "column": "string",
50
- "lookup": { "type": "any", "optional": true },
51
- "isArray": { "type": "boolean", "optional": true },
52
- "filter": { "optional": true, "type": "any" },
53
- "isFullRow": { "optional": true, "type": {
54
- "displayColumns": { "optional": true, "type": "string[]" }
55
- }},
56
- "searchColumns": { "optional": true, "type": "string[]" },
57
- "showInRowCard": { "optional": true, "type": "any" }
58
- }
59
-
60
- $d$;
61
- lookup_schema_schema TEXT = $d$
62
- {
63
- "type": { "enum": ["schema"] },
64
- "object": { "enum": ["table", "column"] },
65
- "isArray": { "type": "boolean", "optional": true },
66
- "lookup": { "type": "any", "optional": true },
67
- "filter": { "optional": true, "type": "any" }
68
- }
69
- $d$;
70
-
71
- extra_keys TEXT[];
72
-
73
- /* Used for oneOf schema errors */
74
- v_state TEXT;
75
- v_msg TEXT;
76
- v_detail TEXT;
77
- v_hint TEXT;
78
- v_context TEXT;
79
- v_one_of_errors TEXT;
80
-
81
- BEGIN
82
- path = concat_ws(', ',
83
- 'Path: ' || array_to_string(checked_path, '.'),
84
- 'Data: ' || data::TEXT,
85
- 'JSONBSchema: ' || schema::TEXT
86
- );
87
-
88
- IF length(jsonb_schema) = 0 THEN
89
- ${raiseException(`'Empty schema. %', path`)}
90
- END IF;
91
-
92
- /* Sometimes text comes double quoted from jsonb, e.g.: '"string"' */
93
- jsonb_schema = CASE WHEN jsonb_schema::text ilike '"%"' THEN LEFT(RIGHT(jsonb_schema::text, -1), -1) ELSE jsonb_schema END;
94
-
95
- /* 'string' */
96
- IF ARRAY[jsonb_schema] <@ allowed_types THEN
97
- schema = jsonb_build_object('type', jsonb_schema);
98
- /* { "type": ... } */
99
- ELSIF BTRIM(replace(jsonb_schema,E'\n','')) ILIKE '{%' THEN
100
- schema = jsonb_schema::JSONB;
101
- ELSE
102
- ${raiseException(`$$Invalid schema. Expecting 'typename' or { "type": "typename" } but received: %, %$$, jsonb_schema, path`)}
103
- END IF;
104
-
105
-
106
- nullable = COALESCE((schema->>'nullable')::BOOLEAN, FALSE);
107
- IF data IS NULL OR jsonb_typeof(data) = 'null' THEN
108
- IF NOT nullable THEN
109
- ${raiseException(`'Is not nullable. %', path`)}
110
- ELSE
111
- RETURN true;
112
- END IF;
113
- END IF;
114
-
115
- IF schema ? 'enum' THEN
116
- IF
117
- jsonb_typeof(schema->'enum') != 'array' OR
118
- jsonb_array_length(schema->'enum') < 1
119
- THEN
120
- ${raiseException(`'Invalid schema enum (%) .Must be a non empty array %', schema->'enum', path`)}
121
- END IF;
122
-
123
- IF NOT jsonb_build_array(data) <@ (schema->'enum') THEN
124
- ${raiseException(`'Data not in allowed enum list (%), %', schema->'enum', path`)}
125
- END IF;
126
-
127
- ELSIF schema ? 'lookup' THEN
128
-
129
- /* TODO: Finish validating data-def */
130
- IF (schema->'lookup'->>'type' = 'data-def') THEN
131
- RETURN TRUE;
132
- END IF;
133
-
134
- /* Validate lookup schema */
135
- IF NOT ${exports.VALIDATE_SCHEMA_FUNCNAME}(
136
- '{ "oneOfType": [' || concat_ws(',',lookup_data_def_schema, lookup_schema_schema) || '] }',
137
- schema->'lookup',
138
- context,
139
- checked_path || '.schema'::TEXT
140
- ) THEN
141
-
142
- RETURN FALSE;
143
- END IF;
144
-
145
- RETURN ${exports.VALIDATE_SCHEMA_FUNCNAME}(
146
- CASE WHEN schema->'lookup'->>'type' = 'data-def' THEN
147
- lookup_data_def_schema
148
- WHEN schema->'lookup'->>'type' = 'schema' THEN
149
- (
150
- CASE WHEN schema->'lookup'->>'object' = 'table' THEN
151
- 'string' || (CASE WHEN (schema->'lookup'->'isArray')::BOOLEAN THEN '[]' ELSE '' END)
152
- ELSE
153
- '{ "type": { "table": "string", "column": "string' || (CASE WHEN (schema->'lookup'->'isArray')::BOOLEAN THEN '[]' ELSE '' END) || '" } }'
154
- END
155
- )
156
- ELSE
157
- (CASE WHEN (schema->'lookup'->'isArray')::BOOLEAN THEN 'any[]' ELSE 'any' END)
158
- END,
159
- data,
160
- context,
161
- checked_path
162
- );
163
-
164
- ELSIF schema ? 'type' THEN
165
-
166
- IF jsonb_typeof(schema->'type') = 'string' THEN
167
- typeStr = schema->>'type';
168
- IF NOT ARRAY[typeStr] <@ allowed_types THEN
169
- ${raiseException(`'Bad schema type "%", allowed types: %. %',typeStr, allowed_types, path`)}
170
- END IF;
171
-
172
- /** Primitive array */
173
- IF typeStr LIKE '%[]' THEN
174
-
175
- typeStr = left(typeStr, -2);
176
-
177
- IF jsonb_typeof(data) != 'array' THEN
178
- ${raiseException(`'Types not matching. Expecting an array. %', path`)}
179
- END IF;
180
-
181
- FOR array_element IN
182
- SELECT value, row_number() OVER() -1 as idx
183
- FROM jsonb_array_elements(data)
184
- LOOP
185
- IF NOT ${exports.VALIDATE_SCHEMA_FUNCNAME}(
186
- CASE WHEN schema->'allowedValues' IS NOT NULL THEN
187
- jsonb_build_object('type', typeStr, 'allowedValues', schema->'allowedValues')::TEXT
188
- ELSE typeStr END,
189
- array_element.value,
190
- context,
191
- checked_path || array_element.idx::TEXT
192
- ) THEN
193
-
194
- RETURN FALSE;
195
- END IF;
196
- END LOOP;
197
-
198
- RETURN TRUE;
199
-
200
- /** Primitive */
201
- ELSE
202
-
203
- IF (
204
- typeStr = 'number' AND jsonb_typeof(data) != typeStr OR
205
- (typeStr = 'integer' AND (jsonb_typeof(data) != 'number' OR ceil(data::NUMERIC) != floor(data::NUMERIC))) OR
206
- typeStr = 'boolean' AND jsonb_typeof(data) != typeStr OR
207
- typeStr = 'string' AND jsonb_typeof(data) != typeStr OR
208
- typeStr = 'any' AND jsonb_typeof(data) = 'null'
209
- ) THEN
210
- ${raiseException(`'Data type not matching. Expected: %, Actual: %, %', typeStr, jsonb_typeof(data), path`)}
211
- END IF;
212
-
213
- IF schema ? 'allowedValues' AND NOT(jsonb_build_array(data) <@ (schema->'allowedValues')) THEN
214
- IF (
215
- SELECT COUNT(distinct jsonb_typeof(value))
216
- FROM jsonb_array_elements(schema->'allowedValues')
217
- ) > 1 THEN
218
- ${raiseException(`'Invalid schema. schema.allowedValues (%) contains more than one data type . %', schema->>'allowedValues', path`)}
219
- END IF;
220
-
221
- IF EXISTS(
222
- SELECT 1
223
- FROM jsonb_array_elements(schema->'allowedValues')
224
- WHERE jsonb_typeof(value) != jsonb_typeof(data)
225
- ) THEN
226
- ${raiseException(`'Invalid schema. schema.allowedValues (%) contains contains values not matchine the schema.type %', schema->>'allowedValues', path`)}
227
- END IF;
228
-
229
- ${raiseException(`'Data not in allowedValues (%). %', schema->>'allowedValues', path`)}
230
-
231
- END IF;
232
-
233
- END IF;
234
-
235
- /* Object */
236
- ELSIF jsonb_typeof(schema->'type') = 'object' THEN
237
-
238
- IF jsonb_typeof(data) != 'object' THEN
239
- ${raiseException(`E'Expecting an object: \n %', path`)}
240
- END IF;
241
-
242
- extra_keys = ARRAY(SELECT k FROM (
243
- SELECT jsonb_object_keys(data) as k
244
- EXCEPT
245
- SELECT jsonb_object_keys(schema->'type') as k
246
- ) t);
247
-
248
- IF array_length(extra_keys, 1) > 0 THEN
249
- ${raiseException(`E'Object contains % invalid keys: [ % ] \n %', array_length(extra_keys, 1)::TEXT, array_to_string(extra_keys, ', '), path`)}
250
- END IF;
251
-
252
- FOR sub_schema IN
253
- SELECT key, value
254
- FROM jsonb_each(schema->'type')
255
- LOOP
256
-
257
- optional = COALESCE((sub_schema.value->>'optional')::BOOLEAN, FALSE);
258
- IF NOT (data ? sub_schema.key) THEN
259
- IF NOT optional THEN
260
- ${raiseException(`'Types not matching. Required property ("%") is missing. %', sub_schema.key , path`)}
261
- END IF;
262
-
263
- ELSIF NOT ${exports.VALIDATE_SCHEMA_FUNCNAME}(
264
- -- sub_schema.value::TEXT,
265
- CASE WHEN jsonb_typeof(sub_schema.value) = 'string' THEN TRIM(both '"' from sub_schema.value::TEXT) ELSE sub_schema.value::TEXT END,
266
- data->sub_schema.key,
267
- context,
268
- checked_path || sub_schema.key
269
- ) THEN
270
- RETURN false;
271
- END IF;
272
-
273
- END LOOP;
274
-
275
- RETURN TRUE;
276
- ELSE
277
- ${raiseException(`'Unexpected schema.type ( % ), %',jsonb_typeof(schema->'type'), path`)}
278
- END IF;
279
-
280
- /* oneOfType: [{ key_name: { type: "string" } }] */
281
- ELSIF (schema ? 'oneOf' OR schema ? 'oneOfType') THEN
282
-
283
- oneof = COALESCE(schema->'oneOf', schema->'oneOfType');
284
-
285
- IF jsonb_typeof(oneof) != 'array' THEN
286
- ${raiseException(`'Unexpected oneOf schema. Expecting an array of objects but received: % , %', oneof::TEXT, path`)}
287
- END IF;
288
-
289
- FOR sub_schema IN
290
- SELECT CASE WHEN schema ? 'oneOfType' THEN jsonb_build_object('type', value) ELSE value END as value,
291
- row_number() over() - 1 as idx
292
- FROM jsonb_array_elements(oneof)
293
- LOOP
294
-
295
- BEGIN
296
-
297
- IF ${exports.VALIDATE_SCHEMA_FUNCNAME}(
298
- sub_schema.value::TEXT,
299
- data,
300
- context,
301
- checked_path
302
- ) THEN
303
- RETURN true;
304
- END IF;
305
-
306
- /* Ignore exceptions in case the last schema will match */
307
- EXCEPTION WHEN others THEN
308
-
309
- GET STACKED DIAGNOSTICS
310
- v_state = returned_sqlstate,
311
- v_msg = message_text,
312
- v_detail = pg_exception_detail,
313
- v_hint = pg_exception_hint,
314
- v_context = pg_exception_context;
315
-
316
- /* Ignore duplicate errors */
317
- IF v_one_of_errors IS NULL OR v_one_of_errors NOT ilike '%' || v_msg || '%' THEN
318
- v_one_of_errors = concat_ws(
319
- E'\n\n',
320
- v_one_of_errors,
321
- concat_ws(
322
- ', ',
323
- 'Schema index ' || sub_schema.idx::TEXT || ' error:',
324
- 'state: ' || v_state,
325
- 'message: ' || v_msg,
326
- 'detail: ' || v_detail,
327
- 'hint: ' || v_hint
328
- -- 'context: ' || v_context
329
- )
330
- );
331
- END IF;
332
- END;
333
-
334
- END LOOP;
335
-
336
- ${raiseException(`E'No oneOf schemas matching:\n % ), %', v_one_of_errors, path`)}
337
-
338
- /* arrayOfType: { key_name: { type: "string" } } */
339
- ELSIF (schema ? 'arrayOf' OR schema ? 'arrayOfType') THEN
340
-
341
- arrayof = COALESCE(schema->'arrayOf', schema->'arrayOfType');
342
-
343
- IF jsonb_typeof(data) != 'array' THEN
344
- ${raiseException(`'% is not an array.', path`)}
345
- END IF;
346
-
347
- FOR array_element IN
348
- SELECT value, row_number() OVER() -1 as idx
349
- FROM jsonb_array_elements(data)
350
- LOOP
351
- IF NOT ${exports.VALIDATE_SCHEMA_FUNCNAME}(
352
- ( CASE WHEN schema ? 'arrayOf'
353
- THEN
354
- schema->'arrayOf'
355
- ELSE
356
- (schema - 'arrayOfType' || jsonb_build_object('type', schema->'arrayOfType'))
357
- END
358
- )::TEXT,
359
- array_element.value,
360
- context,
361
- checked_path || array_element.idx::TEXT
362
- ) THEN
363
- RETURN false;
364
- END IF;
365
- END LOOP;
366
-
367
- /* record: { keysEnum?: string[], values?: FieldType } */
368
- ELSIF schema ? 'record' THEN
369
- IF
370
- jsonb_typeof(schema->'record') != 'object' OR
371
- NOT (schema->'record') ? 'keysEnum'
372
- AND NOT (schema->'record') ? 'values'
373
- THEN
374
- ${raiseException(`'Invalid/empty record schema. Expecting a non empty record of: { keysEnum?: string[]; values?: FieldType } : %, %', schema, path`)}
375
- END IF;
376
-
377
- IF jsonb_typeof(data) != 'object' THEN
378
- ${raiseException(`'% is not an object.', path`)}
379
- END IF;
380
-
381
- FOR obj_key_val IN
382
- SELECT jsonb_build_object('key', key, 'value', value) as obj
383
- FROM jsonb_each(data)
384
- LOOP
385
- RETURN (CASE WHEN NOT (schema->'record') ? 'keysEnum' THEN TRUE ELSE ${exports.VALIDATE_SCHEMA_FUNCNAME}(
386
- jsonb_build_object('enum', schema->'record'->'keysEnum')::TEXT,
387
- (obj_key_val.obj)->'key',
388
- context,
389
- checked_path || ARRAY[(obj_key_val.obj)->>'key']
390
- ) END)
391
- AND
392
- (CASE WHEN NOT (schema->'record') ? 'values' THEN TRUE ELSE ${exports.VALIDATE_SCHEMA_FUNCNAME}(
393
- schema->'record'->>'values',
394
- (obj_key_val.obj)->'value',
395
- context,
396
- checked_path || ARRAY[(obj_key_val.obj)->>'key']
397
- ) END);
398
- END LOOP;
399
-
400
- ELSE
401
- ${raiseException(`'Unexpected schema: %, %', schema, path`)}
402
- END IF;
403
-
404
- RETURN true;
405
- END;
406
- $f$ LANGUAGE 'plpgsql' IMMUTABLE;
407
-
408
- COMMENT ON FUNCTION ${exports.VALIDATE_SCHEMA_FUNCNAME} /* ${PubSubManager_1.PubSubManager.EXCLUDE_QUERY_FROM_SCHEMA_WATCH_ID} */
409
- IS $$prostgles-server internal function used in column CHECK conditions to validate jsonb data against a column schema specified in tableConfig.
410
- Example usage:
411
- validate_jsonb_schema(
412
- '{ "type": { "a": "number[]" } }',
413
- '{ "a": [2] }'
414
- )
415
- $$;
416
-
417
-
418
- /* TESTS */
419
-
420
- SELECT ${exports.VALIDATE_SCHEMA_FUNCNAME}(
421
- '{ "enum": ["a", "b", 2] }',
422
- '"a"'::JSONB
423
- );
424
-
425
-
426
- SELECT ${exports.VALIDATE_SCHEMA_FUNCNAME}(
427
- '{ "record": { "keysEnum": ["a", "b"] , "values": { "enum": [1, 2] } } }',
428
- '{"a": 1, "b": 2 }'::JSONB
429
- );
430
-
431
- SELECT ${exports.VALIDATE_SCHEMA_FUNCNAME}(
432
- '{ "record": { "keysEnum": ["a", "b"] , "values": { "enum": [1, 2] } } }',
433
- '{"a": 1 }'::JSONB
434
- );
435
-
436
- SELECT ${exports.VALIDATE_SCHEMA_FUNCNAME}(
437
- '{ "record": { "keysEnum": ["a", "b"] , "values": { "enum": [1, 2] } } }',
438
- '{ }'::JSONB
439
- );
440
-
441
- SELECT ${exports.VALIDATE_SCHEMA_FUNCNAME}(
442
- '{ "record": { "keysEnum": ["a", "b"] } }',
443
- '{"a": 1, "b": 2 }'::JSONB
444
- );
445
- SELECT ${exports.VALIDATE_SCHEMA_FUNCNAME}(
446
- '{ "enum": ["a", "b", 2] }',
447
- '2'::JSONB
448
- );
449
-
450
- SELECT ${exports.VALIDATE_SCHEMA_FUNCNAME}(
451
- '{
452
- "oneOfType": [
453
- { "a": "string" } ,
454
- {
455
- "a": {
456
- "type": "boolean",
457
- "allowedValues": [false],
458
- "optional": true
459
- }
460
- }
461
- ]
462
- }',
463
- '{ "a": false }'
464
- );
465
-
466
- SELECT ${exports.VALIDATE_SCHEMA_FUNCNAME}(
467
- '{ "arrayOfType": { "a": "string", "narr": { "arrayOfType": { "a": { "type": "string", "optional": false, "nullable": true } } } } }',
468
- '[{ "a": "ddd", "narr": [{ "a": null }] }]'::JSONB
469
- );
470
-
471
- SELECT ${exports.VALIDATE_SCHEMA_FUNCNAME}(
472
- '{ "type": { "a": { "type": "integer[]", "allowedValues": [2] } } }'::TEXT,
473
- '{ "a": [2, 2] }'
474
- );
475
-
476
- SELECT ${exports.VALIDATE_SCHEMA_FUNCNAME}(
477
- '{ "type": { "a": { "type": "string[]", "allowedValues": ["2"] } } }'::TEXT,
478
- '{ "a": ["2"] }'
479
- );
480
-
481
- SELECT ${exports.VALIDATE_SCHEMA_FUNCNAME}('{ "type": "any"}', '{}');
482
-
483
- SELECT ${exports.VALIDATE_SCHEMA_FUNCNAME}('{ "type": { "a": { "enum": ["a"] } } }', '{ "a": "a"}');
484
-
485
- SELECT ${exports.VALIDATE_SCHEMA_FUNCNAME}('{ "arrayOfType": { "a": { "enum": ["a"] } } }', '[{ "a": "a"}]');
486
-
487
-
488
- SELECT ${exports.VALIDATE_SCHEMA_FUNCNAME}('{ "lookup": { "type": "data", "table": "tblName", "column": "colName" } }', '{}');
489
- SELECT ${exports.VALIDATE_SCHEMA_FUNCNAME}('{ "lookup": { "type": "data", "table": "tblName", "column": "colName", "isArray": true } }', '[{}]');
490
- SELECT ${exports.VALIDATE_SCHEMA_FUNCNAME}('{ "lookup": { "type": "schema", "object": "table" } }', '"tblName"'::JSONB);
491
- SELECT ${exports.VALIDATE_SCHEMA_FUNCNAME}('{ "lookup": { "type": "schema", "object": "table", "isArray": true } }', '["tblName"]');
492
- SELECT ${exports.VALIDATE_SCHEMA_FUNCNAME}('{ "lookup": { "type": "schema", "object": "column" } }', '{ "table": "tblName", "column": "colName" }');
493
- SELECT ${exports.VALIDATE_SCHEMA_FUNCNAME}('{ "lookup": { "type": "schema", "object": "column", "isArray": true } }', '{ "table": "tblName", "column": ["colName"] }');
494
-
495
- SELECT ${exports.VALIDATE_SCHEMA_FUNCNAME}('{ "type": "time"}', '"22:22"');
496
- SELECT ${exports.VALIDATE_SCHEMA_FUNCNAME}('{ "type": "Date"}', '"2222-22-22"');
497
-
498
-
499
- SELECT ${exports.VALIDATE_SCHEMA_FUNCNAME}('{ "oneOf": ["number"]}','2');
500
- `;
@@ -1,9 +0,0 @@
1
- import { JSONB, TableSchema } from "prostgles-types";
2
- export declare function validate<T>(obj: T, key: keyof T, rawFieldType: JSONB.FieldType): boolean;
3
- export declare function validateSchema<S extends JSONB.ObjectType["type"]>(schema: S, obj: JSONB.GetObjectType<S>, objName?: string, optional?: boolean): void;
4
- type ColOpts = {
5
- nullable?: boolean;
6
- };
7
- export declare function getJSONBSchemaTSTypes(schema: JSONB.JSONBSchema, colOpts: ColOpts, outerLeading: string, tables: TableSchema[]): string;
8
- export {};
9
- //# sourceMappingURL=validation.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8B,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAYjF,wBAAgB,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC,SAAS,GAAG,OAAO,CAqBxF;AAED,wBAAgB,cAAc,CAAC,CAAC,SAAS,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,UAAQ,QAG5I;AAGD,KAAK,OAAO,GAAG;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAGtC,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,KAAK,CAAC,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,QAAK,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,CA2FnI"}
@@ -1,131 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getJSONBSchemaTSTypes = exports.validateSchema = exports.validate = void 0;
4
- const prostgles_types_1 = require("prostgles-types");
5
- const DboBuilder_1 = require("../DboBuilder");
6
- const PubSubManager_1 = require("../PubSubManager/PubSubManager");
7
- const getFieldTypeObj = (rawFieldType) => {
8
- if (typeof rawFieldType === "string")
9
- return { type: rawFieldType };
10
- return rawFieldType;
11
- };
12
- function validate(obj, key, rawFieldType) {
13
- let err = `The provided value for ${JSON.stringify(key)} is of invalid type. Expecting `;
14
- const val = obj[key];
15
- const fieldType = getFieldTypeObj(rawFieldType);
16
- if ("type" in fieldType && fieldType.type) {
17
- if (typeof fieldType.type !== "string") {
18
- (0, prostgles_types_1.getKeys)(fieldType.type).forEach(subKey => {
19
- validate(val, subKey, fieldType.type[subKey]);
20
- });
21
- }
22
- err += fieldType.type;
23
- if (fieldType.type === "boolean" && typeof val !== fieldType.type)
24
- throw new Error(err);
25
- if (fieldType.type === "string" && typeof val !== fieldType.type)
26
- throw new Error(err);
27
- if (fieldType.type === "number" && !Number.isFinite(val))
28
- throw new Error(err);
29
- if (fieldType.type === "integer" && !Number.isInteger(val))
30
- throw new Error(err);
31
- }
32
- else if (fieldType.enum) {
33
- err += `on of: ${fieldType.enum}`;
34
- if (!fieldType.enum.includes(val))
35
- throw new Error(err);
36
- }
37
- return true;
38
- }
39
- exports.validate = validate;
40
- function validateSchema(schema, obj, objName, optional = false) {
41
- if ((!schema || (0, prostgles_types_1.isEmpty)(schema)) && !optional)
42
- throw new Error(`Expecting ${objName} to be defined`);
43
- (0, prostgles_types_1.getKeys)(schema).forEach(k => validate(obj, k, schema[k]));
44
- }
45
- exports.validateSchema = validateSchema;
46
- function getJSONBSchemaTSTypes(schema, colOpts, outerLeading = "", tables) {
47
- const getFieldType = (rawFieldType, isOneOf = false, innerLeading = "", depth = 0) => {
48
- const fieldType = getFieldTypeObj(rawFieldType);
49
- const nullType = (fieldType.nullable ? `null | ` : "");
50
- /** Primitives */
51
- if (typeof fieldType?.type === "string") {
52
- const correctType = fieldType.type
53
- .replace("integer", "number")
54
- .replace("time", "string")
55
- .replace("timestamp", "string")
56
- .replace("Date", "string");
57
- if (fieldType.allowedValues && fieldType.type.endsWith("[]")) {
58
- return nullType + ` (${fieldType.allowedValues.map(v => JSON.stringify(v)).join(" | ")})[]`;
59
- }
60
- return nullType + correctType;
61
- /** Object */
62
- }
63
- else if ((0, prostgles_types_1.isObject)(fieldType.type)) {
64
- const addSemicolonIfMissing = (v) => v.trim().endsWith(";") ? v : (v.trim() + ";");
65
- const { type } = fieldType;
66
- const spacing = isOneOf ? " " : " ";
67
- let objDef = ` {${spacing}` + (0, prostgles_types_1.getKeys)(type).map(k => {
68
- const fieldType = getFieldTypeObj(type[k]);
69
- return `${spacing}${k}${fieldType.optional ? "?" : ""}: ` + addSemicolonIfMissing(getFieldType(fieldType, true, undefined, depth + 1));
70
- }).join(" ") + `${spacing}}`;
71
- if (!isOneOf) {
72
- objDef = addSemicolonIfMissing(objDef);
73
- }
74
- /** Keep single line */
75
- if (isOneOf) {
76
- objDef = objDef.split("\n").join("");
77
- }
78
- return nullType + objDef;
79
- }
80
- else if (fieldType?.enum) {
81
- return nullType + fieldType.enum.map(v => (0, PubSubManager_1.asValue)(v)).join(" | ");
82
- }
83
- else if (fieldType?.oneOf || fieldType?.oneOfType) {
84
- const oneOf = fieldType?.oneOf || fieldType?.oneOfType.map(type => ({ type }));
85
- return (fieldType.nullable ? `\n${innerLeading} | null` : "") + oneOf.map(v => `\n${innerLeading} | ` + getFieldType(v, true, undefined, depth + 1)).join("");
86
- }
87
- else if (fieldType?.arrayOf || fieldType?.arrayOfType) {
88
- const arrayOf = fieldType?.arrayOf || { type: fieldType?.arrayOfType };
89
- return `${fieldType.nullable ? `null | ` : ""} ( ${getFieldType(arrayOf, true, undefined, depth + 1)} )[]`;
90
- }
91
- else if (fieldType?.record) {
92
- const { keysEnum, values } = fieldType.record;
93
- // TODO: ensure props with undefined values are not allowed in the TS type
94
- return `${fieldType.nullable ? `null |` : ""} Partial<Record<${keysEnum?.map(v => (0, PubSubManager_1.asValue)(v)).join(" | ") ?? "string"}, ${!values ? "any" : getFieldType(values, true, undefined, depth + 1)}>>`;
95
- }
96
- else if (fieldType?.lookup) {
97
- const l = fieldType.lookup;
98
- if (l.type === "data-def") {
99
- return `${fieldType.nullable ? `null |` : ""} ${getFieldType({
100
- type: {
101
- table: "string",
102
- column: "string",
103
- filter: { record: {}, optional: true },
104
- isArray: { type: "boolean", optional: true },
105
- searchColumns: { type: "string[]", optional: true },
106
- isFullRow: { optional: true, type: {
107
- displayColumns: { type: "string[]", optional: true }
108
- } },
109
- showInRowCard: { optional: true, record: {} }
110
- }
111
- })}`;
112
- }
113
- const isSChema = l.type === "schema";
114
- let type = isSChema ? (l.object === "table" ? "string" : `{ "table": string; "column": string; }`) : "";
115
- if (!isSChema) {
116
- const cols = tables.find(t => t.name === l.table)?.columns;
117
- if (!l.isFullRow) {
118
- type = (0, DboBuilder_1.postgresToTsType)(cols?.find(c => c.name === l.column)?.udt_name ?? "text");
119
- }
120
- else {
121
- type = !cols ? "any" : `{ ${cols.map(c => `${JSON.stringify(c.name)}: ${c.is_nullable ? "null | " : ""} ${(0, DboBuilder_1.postgresToTsType)(c.udt_name)}; `).join(" ")} }`;
122
- }
123
- }
124
- return `${fieldType.nullable ? `null | ` : ""}${type}${l.isArray ? "[]" : ""}`;
125
- }
126
- else
127
- throw "Unexpected getSchemaTSTypes: " + JSON.stringify({ fieldType, schema }, null, 2);
128
- };
129
- return getFieldType({ ...schema, nullable: colOpts.nullable }, undefined, outerLeading);
130
- }
131
- exports.getJSONBSchemaTSTypes = getJSONBSchemaTSTypes;
@@ -1,28 +0,0 @@
1
- import { DB } from "./Prostgles";
2
- import pg from "pg-promise/typescript/pg-subset";
3
- import pgPromise from "pg-promise";
4
- export type PrglNotifListener = (args: {
5
- length: number;
6
- processId: number;
7
- channel: string;
8
- payload: string;
9
- name: string;
10
- }) => void;
11
- export declare class PostgresNotifListenManager {
12
- connection?: pgPromise.IConnected<{}, pg.IClient>;
13
- db_pg: DB;
14
- notifListener: PrglNotifListener;
15
- db_channel_name: string;
16
- isListening: any;
17
- client?: pg.IClient;
18
- static create: (db_pg: DB, notifListener: PrglNotifListener, db_channel_name: string) => Promise<PostgresNotifListenManager>;
19
- constructor(db_pg: DB, notifListener: PrglNotifListener, db_channel_name: string, noInit?: boolean);
20
- init(): Promise<PostgresNotifListenManager>;
21
- isReady(): any;
22
- startListening(): Promise<unknown>;
23
- destroyed: boolean;
24
- destroy: () => void;
25
- stopListening: () => void;
26
- reconnect(delay?: number | undefined, maxAttempts?: number | undefined): Promise<unknown>;
27
- }
28
- //# sourceMappingURL=PostgresNotifListenManager.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"PostgresNotifListenManager.d.ts","sourceRoot":"","sources":["PostgresNotifListenManager.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,MAAM,iCAAiC,CAAC;AACjD,OAAO,SAAS,MAAM,YAAY,CAAC;AAEnC,MAAM,MAAM,iBAAiB,GAAG,CAAC,IAAI,EAAE;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CAChB,KAAK,IAAI,CAAC;AAEX,qBAAa,0BAA0B;IACnC,UAAU,CAAC,EAAE,SAAS,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC;IAClD,KAAK,EAAE,EAAE,CAAC;IACV,aAAa,EAAE,iBAAiB,CAAC;IACjC,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,GAAG,CAAC;IACjB,MAAM,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC;IAEpB,MAAM,CAAC,MAAM,6BAA8B,iBAAiB,mBAAmB,MAAM,KAAG,QAAQ,0BAA0B,CAAC,CAG1H;gBAEW,KAAK,EAAE,EAAE,EAAE,aAAa,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,UAAQ;IAS1F,IAAI,IAAI,OAAO,CAAC,0BAA0B,CAAC;IAQjD,OAAO;IAIP,cAAc;IA+Bd,SAAS,UAAS;IAClB,OAAO,aAMN;IAED,aAAa,aAKZ;IAED,SAAS,CAAC,KAAK,GAAE,MAAM,GAAG,SAAa,EAAE,WAAW,GAAE,MAAM,GAAG,SAAa;CA0D/E"}