xansql 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 (232) hide show
  1. package/Types/fields/Array.d.ts +7 -0
  2. package/Types/fields/Array.js +6 -0
  3. package/Types/fields/Array.js.map +1 -0
  4. package/Types/fields/Array.mjs +6 -0
  5. package/Types/fields/Array.mjs.map +1 -0
  6. package/Types/fields/Boolean.d.ts +8 -0
  7. package/Types/fields/Boolean.js +11 -0
  8. package/Types/fields/Boolean.js.map +1 -0
  9. package/Types/fields/Boolean.mjs +11 -0
  10. package/Types/fields/Boolean.mjs.map +1 -0
  11. package/Types/fields/Date.d.ts +10 -0
  12. package/Types/fields/Date.js +22 -0
  13. package/Types/fields/Date.js.map +1 -0
  14. package/Types/fields/Date.mjs +22 -0
  15. package/Types/fields/Date.mjs.map +1 -0
  16. package/Types/fields/Enum.d.ts +8 -0
  17. package/Types/fields/Enum.js +10 -0
  18. package/Types/fields/Enum.js.map +1 -0
  19. package/Types/fields/Enum.mjs +10 -0
  20. package/Types/fields/Enum.mjs.map +1 -0
  21. package/Types/fields/File.d.ts +7 -0
  22. package/Types/fields/File.js +6 -0
  23. package/Types/fields/File.js.map +1 -0
  24. package/Types/fields/File.mjs +6 -0
  25. package/Types/fields/File.mjs.map +1 -0
  26. package/Types/fields/IDField.d.ts +6 -0
  27. package/Types/fields/IDField.js +2 -0
  28. package/Types/fields/IDField.js.map +1 -0
  29. package/Types/fields/IDField.mjs +2 -0
  30. package/Types/fields/IDField.mjs.map +1 -0
  31. package/Types/fields/Number.d.ts +8 -0
  32. package/Types/fields/Number.js +11 -0
  33. package/Types/fields/Number.js.map +1 -0
  34. package/Types/fields/Number.mjs +11 -0
  35. package/Types/fields/Number.mjs.map +1 -0
  36. package/Types/fields/Object.d.ts +8 -0
  37. package/Types/fields/Object.js +11 -0
  38. package/Types/fields/Object.js.map +1 -0
  39. package/Types/fields/Object.mjs +11 -0
  40. package/Types/fields/Object.mjs.map +1 -0
  41. package/Types/fields/Record.d.ts +8 -0
  42. package/Types/fields/Record.js +11 -0
  43. package/Types/fields/Record.js.map +1 -0
  44. package/Types/fields/Record.mjs +11 -0
  45. package/Types/fields/Record.mjs.map +1 -0
  46. package/Types/fields/Schema.d.ts +16 -0
  47. package/Types/fields/Schema.js +34 -0
  48. package/Types/fields/Schema.js.map +1 -0
  49. package/Types/fields/Schema.mjs +34 -0
  50. package/Types/fields/Schema.mjs.map +1 -0
  51. package/Types/fields/String.d.ts +10 -0
  52. package/Types/fields/String.js +20 -0
  53. package/Types/fields/String.js.map +1 -0
  54. package/Types/fields/String.mjs +20 -0
  55. package/Types/fields/String.mjs.map +1 -0
  56. package/Types/fields/Tuple.d.ts +8 -0
  57. package/Types/fields/Tuple.js +11 -0
  58. package/Types/fields/Tuple.js.map +1 -0
  59. package/Types/fields/Tuple.mjs +11 -0
  60. package/Types/fields/Tuple.mjs.map +1 -0
  61. package/Types/fields/Union.d.ts +8 -0
  62. package/Types/fields/Union.js +11 -0
  63. package/Types/fields/Union.js.map +1 -0
  64. package/Types/fields/Union.mjs +11 -0
  65. package/Types/fields/Union.mjs.map +1 -0
  66. package/Types/index.d.ts +56 -0
  67. package/Types/index.js +129 -0
  68. package/Types/index.js.map +1 -0
  69. package/Types/index.mjs +129 -0
  70. package/Types/index.mjs.map +1 -0
  71. package/Types/types.d.ts +20 -0
  72. package/core/ExcuteMeta.d.ts +11 -0
  73. package/core/ExcuteMeta.js +22 -0
  74. package/core/ExcuteMeta.js.map +1 -0
  75. package/core/ExcuteMeta.mjs +22 -0
  76. package/core/ExcuteMeta.mjs.map +1 -0
  77. package/core/Xansql.d.ts +46 -0
  78. package/core/Xansql.js +132 -0
  79. package/core/Xansql.js.map +1 -0
  80. package/core/Xansql.mjs +132 -0
  81. package/core/Xansql.mjs.map +1 -0
  82. package/core/XansqlError.js +11 -0
  83. package/core/XansqlError.js.map +1 -0
  84. package/core/XansqlError.mjs +11 -0
  85. package/core/XansqlError.mjs.map +1 -0
  86. package/core/XansqlResult.d.ts +12 -0
  87. package/core/XansqlResult.js +32 -0
  88. package/core/XansqlResult.js.map +1 -0
  89. package/core/XansqlResult.mjs +32 -0
  90. package/core/XansqlResult.mjs.map +1 -0
  91. package/core/classes/EventManager.d.ts +72 -0
  92. package/core/classes/EventManager.js +21 -0
  93. package/core/classes/EventManager.js.map +1 -0
  94. package/core/classes/EventManager.mjs +21 -0
  95. package/core/classes/EventManager.mjs.map +1 -0
  96. package/core/classes/ForeignInfo.js +51 -0
  97. package/core/classes/ForeignInfo.js.map +1 -0
  98. package/core/classes/ForeignInfo.mjs +51 -0
  99. package/core/classes/ForeignInfo.mjs.map +1 -0
  100. package/core/classes/Migration/ForeingMigration.d.ts +12 -0
  101. package/core/classes/Migration/ForeingMigration.js +52 -0
  102. package/core/classes/Migration/ForeingMigration.js.map +1 -0
  103. package/core/classes/Migration/ForeingMigration.mjs +52 -0
  104. package/core/classes/Migration/ForeingMigration.mjs.map +1 -0
  105. package/core/classes/Migration/IndexMigration.d.ts +12 -0
  106. package/core/classes/Migration/IndexMigration.js +49 -0
  107. package/core/classes/Migration/IndexMigration.js.map +1 -0
  108. package/core/classes/Migration/IndexMigration.mjs +49 -0
  109. package/core/classes/Migration/IndexMigration.mjs.map +1 -0
  110. package/core/classes/Migration/TableMigration.d.ts +33 -0
  111. package/core/classes/Migration/TableMigration.js +215 -0
  112. package/core/classes/Migration/TableMigration.js.map +1 -0
  113. package/core/classes/Migration/TableMigration.mjs +215 -0
  114. package/core/classes/Migration/TableMigration.mjs.map +1 -0
  115. package/core/classes/Migration/index.d.ts +12 -0
  116. package/core/classes/Migration/index.js +189 -0
  117. package/core/classes/Migration/index.js.map +1 -0
  118. package/core/classes/Migration/index.mjs +189 -0
  119. package/core/classes/Migration/index.mjs.map +1 -0
  120. package/core/classes/ModelFormatter.js +166 -0
  121. package/core/classes/ModelFormatter.js.map +1 -0
  122. package/core/classes/ModelFormatter.mjs +166 -0
  123. package/core/classes/ModelFormatter.mjs.map +1 -0
  124. package/core/classes/TypesGenerator.d.ts +13 -0
  125. package/core/classes/TypesGenerator.js +170 -0
  126. package/core/classes/TypesGenerator.js.map +1 -0
  127. package/core/classes/TypesGenerator.mjs +170 -0
  128. package/core/classes/TypesGenerator.mjs.map +1 -0
  129. package/core/classes/XansqlConfig.js +33 -0
  130. package/core/classes/XansqlConfig.js.map +1 -0
  131. package/core/classes/XansqlConfig.mjs +33 -0
  132. package/core/classes/XansqlConfig.mjs.map +1 -0
  133. package/core/classes/XansqlFetch.js +304 -0
  134. package/core/classes/XansqlFetch.js.map +1 -0
  135. package/core/classes/XansqlFetch.mjs +304 -0
  136. package/core/classes/XansqlFetch.mjs.map +1 -0
  137. package/core/classes/XansqlTransaction.d.ts +13 -0
  138. package/core/classes/XansqlTransaction.js +46 -0
  139. package/core/classes/XansqlTransaction.js.map +1 -0
  140. package/core/classes/XansqlTransaction.mjs +46 -0
  141. package/core/classes/XansqlTransaction.mjs.map +1 -0
  142. package/core/type.d.ts +117 -0
  143. package/index.d.ts +3 -0
  144. package/index.js +1 -0
  145. package/index.js.map +1 -0
  146. package/index.mjs +1 -0
  147. package/index.mjs.map +1 -0
  148. package/model/Args/RelationExcuteArgs.js +5 -0
  149. package/model/Args/RelationExcuteArgs.js.map +1 -0
  150. package/model/Args/RelationExcuteArgs.mjs +5 -0
  151. package/model/Args/RelationExcuteArgs.mjs.map +1 -0
  152. package/model/Args/WhereArgs.js +226 -0
  153. package/model/Args/WhereArgs.js.map +1 -0
  154. package/model/Args/WhereArgs.mjs +226 -0
  155. package/model/Args/WhereArgs.mjs.map +1 -0
  156. package/model/Base.d.ts +26 -0
  157. package/model/Base.js +64 -0
  158. package/model/Base.js.map +1 -0
  159. package/model/Base.mjs +64 -0
  160. package/model/Base.mjs.map +1 -0
  161. package/model/Executer/Aggregate/SelectArgs.js +59 -0
  162. package/model/Executer/Aggregate/SelectArgs.js.map +1 -0
  163. package/model/Executer/Aggregate/SelectArgs.mjs +59 -0
  164. package/model/Executer/Aggregate/SelectArgs.mjs.map +1 -0
  165. package/model/Executer/Aggregate/index.js +59 -0
  166. package/model/Executer/Aggregate/index.js.map +1 -0
  167. package/model/Executer/Aggregate/index.mjs +59 -0
  168. package/model/Executer/Aggregate/index.mjs.map +1 -0
  169. package/model/Executer/Create/CreateDataArgs.js +145 -0
  170. package/model/Executer/Create/CreateDataArgs.js.map +1 -0
  171. package/model/Executer/Create/CreateDataArgs.mjs +145 -0
  172. package/model/Executer/Create/CreateDataArgs.mjs.map +1 -0
  173. package/model/Executer/Create/index.js +101 -0
  174. package/model/Executer/Create/index.js.map +1 -0
  175. package/model/Executer/Create/index.mjs +101 -0
  176. package/model/Executer/Create/index.mjs.map +1 -0
  177. package/model/Executer/Delete/index.js +112 -0
  178. package/model/Executer/Delete/index.js.map +1 -0
  179. package/model/Executer/Delete/index.mjs +112 -0
  180. package/model/Executer/Delete/index.mjs.map +1 -0
  181. package/model/Executer/Find/DistinctArgs.js +32 -0
  182. package/model/Executer/Find/DistinctArgs.js.map +1 -0
  183. package/model/Executer/Find/DistinctArgs.mjs +32 -0
  184. package/model/Executer/Find/DistinctArgs.mjs.map +1 -0
  185. package/model/Executer/Find/LimitArgs.js +31 -0
  186. package/model/Executer/Find/LimitArgs.js.map +1 -0
  187. package/model/Executer/Find/LimitArgs.mjs +31 -0
  188. package/model/Executer/Find/LimitArgs.mjs.map +1 -0
  189. package/model/Executer/Find/OrderByArgs.js +29 -0
  190. package/model/Executer/Find/OrderByArgs.js.map +1 -0
  191. package/model/Executer/Find/OrderByArgs.mjs +29 -0
  192. package/model/Executer/Find/OrderByArgs.mjs.map +1 -0
  193. package/model/Executer/Find/SelectArgs.js +119 -0
  194. package/model/Executer/Find/SelectArgs.js.map +1 -0
  195. package/model/Executer/Find/SelectArgs.mjs +119 -0
  196. package/model/Executer/Find/SelectArgs.mjs.map +1 -0
  197. package/model/Executer/Find/index.js +338 -0
  198. package/model/Executer/Find/index.js.map +1 -0
  199. package/model/Executer/Find/index.mjs +338 -0
  200. package/model/Executer/Find/index.mjs.map +1 -0
  201. package/model/Executer/Update/UpdateDataArgs.js +124 -0
  202. package/model/Executer/Update/UpdateDataArgs.js.map +1 -0
  203. package/model/Executer/Update/UpdateDataArgs.mjs +124 -0
  204. package/model/Executer/Update/UpdateDataArgs.mjs.map +1 -0
  205. package/model/Executer/Update/index.js +207 -0
  206. package/model/Executer/Update/index.js.map +1 -0
  207. package/model/Executer/Update/index.mjs +207 -0
  208. package/model/Executer/Update/index.mjs.map +1 -0
  209. package/model/include/ValueFormatter.js +99 -0
  210. package/model/include/ValueFormatter.js.map +1 -0
  211. package/model/include/ValueFormatter.mjs +99 -0
  212. package/model/include/ValueFormatter.mjs.map +1 -0
  213. package/model/index.d.ts +29 -0
  214. package/model/index.js +236 -0
  215. package/model/index.js.map +1 -0
  216. package/model/index.mjs +236 -0
  217. package/model/index.mjs.map +1 -0
  218. package/model/type.d.ts +106 -0
  219. package/package.json +32 -0
  220. package/readme.md +359 -0
  221. package/utils/chunker.js +53 -0
  222. package/utils/chunker.js.map +1 -0
  223. package/utils/chunker.mjs +53 -0
  224. package/utils/chunker.mjs.map +1 -0
  225. package/utils/index.js +49 -0
  226. package/utils/index.js.map +1 -0
  227. package/utils/index.mjs +49 -0
  228. package/utils/index.mjs.map +1 -0
  229. package/utils/sha256.js +66 -0
  230. package/utils/sha256.js.map +1 -0
  231. package/utils/sha256.mjs +66 -0
  232. package/utils/sha256.mjs.map +1 -0
@@ -0,0 +1,99 @@
1
+ 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var XansqlError=require('../../core/XansqlError.js'),Array=require('../../Types/fields/Array.js'),Boolean$1=require('../../Types/fields/Boolean.js'),Date$1=require('../../Types/fields/Date.js'),Enum=require('../../Types/fields/Enum.js'),File=require('../../Types/fields/File.js'),IDField=require('../../Types/fields/IDField.js'),Number=require('../../Types/fields/Number.js'),Object$1=require('../../Types/fields/Object.js'),Record=require('../../Types/fields/Record.js'),Schema=require('../../Types/fields/Schema.js'),String$1=require('../../Types/fields/String.js'),Tuple=require('../../Types/fields/Tuple.js'),Union=require('../../Types/fields/Union.js');class ValueFormatter {
2
+ static iof(model, column, ...instances) {
3
+ const field = model.schema[column];
4
+ return instances.some(instance => field instanceof instance);
5
+ }
6
+ static escape(value) {
7
+ if (value == null)
8
+ return '';
9
+ let s = String(value);
10
+ // Standard SQL: escape single quotes by doubling them
11
+ s = s.replace(/'/g, "''");
12
+ // Guard against control chars and backslashes (safer across engines)
13
+ s = s
14
+ .replace(/\\/g, '\\\\') // backslash
15
+ .replace(/\x00/g, '\\0') // null byte
16
+ .replace(/\n/g, '\\n') // newline
17
+ .replace(/\r/g, '\\r') // carriage return
18
+ .replace(/\t/g, '\\t') // tab
19
+ .replace(/\x08/g, '\\b') // backspace
20
+ .replace(/\x1a/g, '\\Z'); // Ctrl+Z (notably MySQL)
21
+ return s;
22
+ }
23
+ static toSql(model, column, value) {
24
+ const field = model.schema[column];
25
+ if (!field)
26
+ throw new XansqlError.default({
27
+ message: `Column ${column} does not exist in model ${model.table}`,
28
+ model: model.table,
29
+ column: column
30
+ });
31
+ try {
32
+ value = field.parse(value);
33
+ if (value === undefined || value === null) {
34
+ return 'NULL';
35
+ }
36
+ else if (this.iof(model, column, IDField.default, Number.default, Schema.default)) {
37
+ return value;
38
+ }
39
+ else if (this.iof(model, column, File.default)) {
40
+ return `'${value.name}'`;
41
+ }
42
+ else if (this.iof(model, column, String$1.default, Enum.default)) {
43
+ return `'${this.escape(value)}'`;
44
+ }
45
+ else if (this.iof(model, column, Object$1.default, Record.default, Array.default, Tuple.default, Union.default)) {
46
+ value = JSON.stringify(value);
47
+ return `'${this.escape(value)}'`;
48
+ }
49
+ else if (this.iof(model, column, Date$1.default)) {
50
+ if (value instanceof String) {
51
+ value = new Date(value);
52
+ }
53
+ if (!(value instanceof Date) || isNaN(value.getTime())) {
54
+ throw new Error(`Invalid date value for column ${column}: ${value}`);
55
+ }
56
+ const pad = (n) => n.toString().padStart(2, '0');
57
+ let date = value;
58
+ const year = date.getUTCFullYear();
59
+ const month = pad(date.getUTCMonth() + 1); // months are 0-indexed
60
+ const day = pad(date.getUTCDate());
61
+ const hours = pad(date.getUTCHours());
62
+ const minutes = pad(date.getUTCMinutes());
63
+ const seconds = pad(date.getUTCSeconds());
64
+ value = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
65
+ return `'${value}'`;
66
+ }
67
+ else if (this.iof(model, column, Boolean$1.default)) {
68
+ return value ? 1 : 0;
69
+ }
70
+ }
71
+ catch (error) {
72
+ throw new XansqlError.default({
73
+ message: `${error.message} (in column ${model.table}.${column})`,
74
+ model: model.table,
75
+ column: column
76
+ });
77
+ }
78
+ }
79
+ static fromSql(model, column, value) {
80
+ const field = model.schema[column];
81
+ if (!field)
82
+ throw new Error(`Column ${column} does not exist in model ${model.table}`);
83
+ if (value === null || value === undefined)
84
+ return null;
85
+ if (this.iof(model, column, IDField.default, Number.default, String$1.default, File.default, Enum.default)) {
86
+ return value;
87
+ }
88
+ else if (this.iof(model, column, Object$1.default, Record.default, Array.default, Tuple.default, Union.default)) {
89
+ return JSON.parse(value);
90
+ }
91
+ else if (this.iof(model, column, Date$1.default)) {
92
+ return new Date(value);
93
+ }
94
+ else if (this.iof(model, column, Boolean$1.default)) {
95
+ return Boolean(value);
96
+ }
97
+ return value;
98
+ }
99
+ }exports.default=ValueFormatter;//# sourceMappingURL=ValueFormatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ValueFormatter.js","sources":["../../../src/model/include/ValueFormatter.ts"],"sourcesContent":["import Model from \"..\";\nimport XansqlError from \"../../core/XansqlError\";\nimport XqlArray from \"../../Types/fields/Array\";\nimport XqlBoolean from \"../../Types/fields/Boolean\";\nimport XqlDate from \"../../Types/fields/Date\";\nimport XqlEnum from \"../../Types/fields/Enum\";\nimport XqlFile from \"../../Types/fields/File\";\nimport XqlIDField from \"../../Types/fields/IDField\";\nimport XqlNumber from \"../../Types/fields/Number\";\nimport XqlObject from \"../../Types/fields/Object\";\nimport XqlRecord from \"../../Types/fields/Record\";\nimport XqlSchema from \"../../Types/fields/Schema\";\nimport XqlString from \"../../Types/fields/String\";\nimport XqlTuple from \"../../Types/fields/Tuple\";\nimport XqlUnion from \"../../Types/fields/Union\";\n\nclass ValueFormatter {\n static iof(model: Model, column: string, ...instances: any[]) {\n const field = model.schema[column];\n return instances.some(instance => field instanceof instance);\n }\n\n private static escape(value: string) {\n if (value == null) return ''\n let s = String(value)\n\n // Standard SQL: escape single quotes by doubling them\n s = s.replace(/'/g, \"''\")\n\n // Guard against control chars and backslashes (safer across engines)\n s = s\n .replace(/\\\\/g, '\\\\\\\\') // backslash\n .replace(/\\x00/g, '\\\\0') // null byte\n .replace(/\\n/g, '\\\\n') // newline\n .replace(/\\r/g, '\\\\r') // carriage return\n .replace(/\\t/g, '\\\\t') // tab\n .replace(/\\x08/g, '\\\\b') // backspace\n .replace(/\\x1a/g, '\\\\Z') // Ctrl+Z (notably MySQL)\n\n return s\n }\n\n static toSql(model: Model, column: string, value: any) {\n const field = model.schema[column];\n if (!field) throw new XansqlError({\n message: `Column ${column} does not exist in model ${model.table}`,\n model: model.table,\n column: column\n });\n try {\n value = field.parse(value);\n if (value === undefined || value === null) {\n return 'NULL';\n } else if (this.iof(model, column, XqlIDField, XqlNumber, XqlSchema)) {\n return value\n } else if (this.iof(model, column, XqlFile)) {\n return `'${value.name}'`;\n } else if (this.iof(model, column, XqlString, XqlEnum)) {\n return `'${this.escape(value)}'`;\n } else if (this.iof(model, column, XqlObject, XqlRecord, XqlArray, XqlTuple, XqlUnion)) {\n value = JSON.stringify(value);\n return `'${this.escape(value)}'`;\n } else if (this.iof(model, column, XqlDate)) {\n if (value instanceof String) {\n value = new Date(value as any)\n }\n if (!(value instanceof Date) || isNaN(value.getTime())) {\n throw new Error(`Invalid date value for column ${column}: ${value}`);\n }\n\n const pad = (n: number) => n.toString().padStart(2, '0');\n let date = value as Date;\n const year = date.getUTCFullYear();\n const month = pad(date.getUTCMonth() + 1); // months are 0-indexed\n const day = pad(date.getUTCDate());\n const hours = pad(date.getUTCHours());\n const minutes = pad(date.getUTCMinutes());\n const seconds = pad(date.getUTCSeconds());\n value = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;\n return `'${value}'`;\n } else if (this.iof(model, column, XqlBoolean)) {\n return value ? 1 : 0;\n }\n } catch (error: any) {\n throw new XansqlError({\n message: `${error.message} (in column ${model.table}.${column})`,\n model: model.table,\n column: column\n });\n }\n }\n\n static fromSql(model: Model, column: string, value: any) {\n const field = model.schema[column];\n if (!field) throw new Error(`Column ${column} does not exist in model ${model.table}`);\n if (value === null || value === undefined) return null\n\n if (this.iof(model, column, XqlIDField, XqlNumber, XqlString, XqlFile, XqlEnum)) {\n return value\n } else if (this.iof(model, column, XqlObject, XqlRecord, XqlArray, XqlTuple, XqlUnion)) {\n return JSON.parse(value);\n } else if (this.iof(model, column, XqlDate)) {\n return new Date(value);\n } else if (this.iof(model, column, XqlBoolean)) {\n return Boolean(value);\n }\n\n return value;\n }\n\n}\n\nexport default ValueFormatter;"],"names":["XansqlError","XqlIDField","XqlNumber","XqlSchema","XqlFile","XqlString","XqlEnum","XqlObject","XqlRecord","XqlArray","XqlTuple","XqlUnion","XqlDate","XqlBoolean"],"mappings":"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"}
@@ -0,0 +1,99 @@
1
+ import XansqlError from'../../core/XansqlError.mjs';import XqlArray from'../../Types/fields/Array.mjs';import XqlBoolean from'../../Types/fields/Boolean.mjs';import XqlDate from'../../Types/fields/Date.mjs';import XqlEnum from'../../Types/fields/Enum.mjs';import XqlFile from'../../Types/fields/File.mjs';import XqlIDField from'../../Types/fields/IDField.mjs';import XqlNumber from'../../Types/fields/Number.mjs';import XqlObject from'../../Types/fields/Object.mjs';import XqlRecord from'../../Types/fields/Record.mjs';import XqlSchema from'../../Types/fields/Schema.mjs';import XqlString from'../../Types/fields/String.mjs';import XqlTuple from'../../Types/fields/Tuple.mjs';import XqlUnion from'../../Types/fields/Union.mjs';class ValueFormatter {
2
+ static iof(model, column, ...instances) {
3
+ const field = model.schema[column];
4
+ return instances.some(instance => field instanceof instance);
5
+ }
6
+ static escape(value) {
7
+ if (value == null)
8
+ return '';
9
+ let s = String(value);
10
+ // Standard SQL: escape single quotes by doubling them
11
+ s = s.replace(/'/g, "''");
12
+ // Guard against control chars and backslashes (safer across engines)
13
+ s = s
14
+ .replace(/\\/g, '\\\\') // backslash
15
+ .replace(/\x00/g, '\\0') // null byte
16
+ .replace(/\n/g, '\\n') // newline
17
+ .replace(/\r/g, '\\r') // carriage return
18
+ .replace(/\t/g, '\\t') // tab
19
+ .replace(/\x08/g, '\\b') // backspace
20
+ .replace(/\x1a/g, '\\Z'); // Ctrl+Z (notably MySQL)
21
+ return s;
22
+ }
23
+ static toSql(model, column, value) {
24
+ const field = model.schema[column];
25
+ if (!field)
26
+ throw new XansqlError({
27
+ message: `Column ${column} does not exist in model ${model.table}`,
28
+ model: model.table,
29
+ column: column
30
+ });
31
+ try {
32
+ value = field.parse(value);
33
+ if (value === undefined || value === null) {
34
+ return 'NULL';
35
+ }
36
+ else if (this.iof(model, column, XqlIDField, XqlNumber, XqlSchema)) {
37
+ return value;
38
+ }
39
+ else if (this.iof(model, column, XqlFile)) {
40
+ return `'${value.name}'`;
41
+ }
42
+ else if (this.iof(model, column, XqlString, XqlEnum)) {
43
+ return `'${this.escape(value)}'`;
44
+ }
45
+ else if (this.iof(model, column, XqlObject, XqlRecord, XqlArray, XqlTuple, XqlUnion)) {
46
+ value = JSON.stringify(value);
47
+ return `'${this.escape(value)}'`;
48
+ }
49
+ else if (this.iof(model, column, XqlDate)) {
50
+ if (value instanceof String) {
51
+ value = new Date(value);
52
+ }
53
+ if (!(value instanceof Date) || isNaN(value.getTime())) {
54
+ throw new Error(`Invalid date value for column ${column}: ${value}`);
55
+ }
56
+ const pad = (n) => n.toString().padStart(2, '0');
57
+ let date = value;
58
+ const year = date.getUTCFullYear();
59
+ const month = pad(date.getUTCMonth() + 1); // months are 0-indexed
60
+ const day = pad(date.getUTCDate());
61
+ const hours = pad(date.getUTCHours());
62
+ const minutes = pad(date.getUTCMinutes());
63
+ const seconds = pad(date.getUTCSeconds());
64
+ value = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
65
+ return `'${value}'`;
66
+ }
67
+ else if (this.iof(model, column, XqlBoolean)) {
68
+ return value ? 1 : 0;
69
+ }
70
+ }
71
+ catch (error) {
72
+ throw new XansqlError({
73
+ message: `${error.message} (in column ${model.table}.${column})`,
74
+ model: model.table,
75
+ column: column
76
+ });
77
+ }
78
+ }
79
+ static fromSql(model, column, value) {
80
+ const field = model.schema[column];
81
+ if (!field)
82
+ throw new Error(`Column ${column} does not exist in model ${model.table}`);
83
+ if (value === null || value === undefined)
84
+ return null;
85
+ if (this.iof(model, column, XqlIDField, XqlNumber, XqlString, XqlFile, XqlEnum)) {
86
+ return value;
87
+ }
88
+ else if (this.iof(model, column, XqlObject, XqlRecord, XqlArray, XqlTuple, XqlUnion)) {
89
+ return JSON.parse(value);
90
+ }
91
+ else if (this.iof(model, column, XqlDate)) {
92
+ return new Date(value);
93
+ }
94
+ else if (this.iof(model, column, XqlBoolean)) {
95
+ return Boolean(value);
96
+ }
97
+ return value;
98
+ }
99
+ }export{ValueFormatter as default};//# sourceMappingURL=ValueFormatter.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ValueFormatter.mjs","sources":["../../../src/model/include/ValueFormatter.ts"],"sourcesContent":["import Model from \"..\";\nimport XansqlError from \"../../core/XansqlError\";\nimport XqlArray from \"../../Types/fields/Array\";\nimport XqlBoolean from \"../../Types/fields/Boolean\";\nimport XqlDate from \"../../Types/fields/Date\";\nimport XqlEnum from \"../../Types/fields/Enum\";\nimport XqlFile from \"../../Types/fields/File\";\nimport XqlIDField from \"../../Types/fields/IDField\";\nimport XqlNumber from \"../../Types/fields/Number\";\nimport XqlObject from \"../../Types/fields/Object\";\nimport XqlRecord from \"../../Types/fields/Record\";\nimport XqlSchema from \"../../Types/fields/Schema\";\nimport XqlString from \"../../Types/fields/String\";\nimport XqlTuple from \"../../Types/fields/Tuple\";\nimport XqlUnion from \"../../Types/fields/Union\";\n\nclass ValueFormatter {\n static iof(model: Model, column: string, ...instances: any[]) {\n const field = model.schema[column];\n return instances.some(instance => field instanceof instance);\n }\n\n private static escape(value: string) {\n if (value == null) return ''\n let s = String(value)\n\n // Standard SQL: escape single quotes by doubling them\n s = s.replace(/'/g, \"''\")\n\n // Guard against control chars and backslashes (safer across engines)\n s = s\n .replace(/\\\\/g, '\\\\\\\\') // backslash\n .replace(/\\x00/g, '\\\\0') // null byte\n .replace(/\\n/g, '\\\\n') // newline\n .replace(/\\r/g, '\\\\r') // carriage return\n .replace(/\\t/g, '\\\\t') // tab\n .replace(/\\x08/g, '\\\\b') // backspace\n .replace(/\\x1a/g, '\\\\Z') // Ctrl+Z (notably MySQL)\n\n return s\n }\n\n static toSql(model: Model, column: string, value: any) {\n const field = model.schema[column];\n if (!field) throw new XansqlError({\n message: `Column ${column} does not exist in model ${model.table}`,\n model: model.table,\n column: column\n });\n try {\n value = field.parse(value);\n if (value === undefined || value === null) {\n return 'NULL';\n } else if (this.iof(model, column, XqlIDField, XqlNumber, XqlSchema)) {\n return value\n } else if (this.iof(model, column, XqlFile)) {\n return `'${value.name}'`;\n } else if (this.iof(model, column, XqlString, XqlEnum)) {\n return `'${this.escape(value)}'`;\n } else if (this.iof(model, column, XqlObject, XqlRecord, XqlArray, XqlTuple, XqlUnion)) {\n value = JSON.stringify(value);\n return `'${this.escape(value)}'`;\n } else if (this.iof(model, column, XqlDate)) {\n if (value instanceof String) {\n value = new Date(value as any)\n }\n if (!(value instanceof Date) || isNaN(value.getTime())) {\n throw new Error(`Invalid date value for column ${column}: ${value}`);\n }\n\n const pad = (n: number) => n.toString().padStart(2, '0');\n let date = value as Date;\n const year = date.getUTCFullYear();\n const month = pad(date.getUTCMonth() + 1); // months are 0-indexed\n const day = pad(date.getUTCDate());\n const hours = pad(date.getUTCHours());\n const minutes = pad(date.getUTCMinutes());\n const seconds = pad(date.getUTCSeconds());\n value = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;\n return `'${value}'`;\n } else if (this.iof(model, column, XqlBoolean)) {\n return value ? 1 : 0;\n }\n } catch (error: any) {\n throw new XansqlError({\n message: `${error.message} (in column ${model.table}.${column})`,\n model: model.table,\n column: column\n });\n }\n }\n\n static fromSql(model: Model, column: string, value: any) {\n const field = model.schema[column];\n if (!field) throw new Error(`Column ${column} does not exist in model ${model.table}`);\n if (value === null || value === undefined) return null\n\n if (this.iof(model, column, XqlIDField, XqlNumber, XqlString, XqlFile, XqlEnum)) {\n return value\n } else if (this.iof(model, column, XqlObject, XqlRecord, XqlArray, XqlTuple, XqlUnion)) {\n return JSON.parse(value);\n } else if (this.iof(model, column, XqlDate)) {\n return new Date(value);\n } else if (this.iof(model, column, XqlBoolean)) {\n return Boolean(value);\n }\n\n return value;\n }\n\n}\n\nexport default ValueFormatter;"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { XansqlResultArray } from '../core/XansqlResult.js';
2
+ import ModelBase from './Base.js';
3
+ import { CreateArgsType, UpdateArgsType, DeleteArgsType, FindArgsType, AggregateArgsType, WhereArgsType } from './type.js';
4
+
5
+ declare class Model extends ModelBase {
6
+ create(args: CreateArgsType): Promise<XansqlResultArray<any>>;
7
+ update(args: UpdateArgsType): Promise<XansqlResultArray<any>>;
8
+ delete(args: DeleteArgsType): Promise<XansqlResultArray<any>>;
9
+ find(args: FindArgsType): Promise<XansqlResultArray<any>>;
10
+ aggregate(args: AggregateArgsType): Promise<XansqlResultArray<any>>;
11
+ truncate(): Promise<void>;
12
+ paginate(page: number, args?: Omit<FindArgsType, "limit"> & {
13
+ perpage?: number;
14
+ }): Promise<{
15
+ page: number;
16
+ perpage: number;
17
+ pagecount: number;
18
+ rowcount: number;
19
+ results: XansqlResultArray<any>;
20
+ }>;
21
+ count(where: WhereArgsType): Promise<number>;
22
+ min(column: string, where: WhereArgsType): Promise<number>;
23
+ max(column: string, where: WhereArgsType): Promise<number>;
24
+ sum(column: string, where: WhereArgsType): Promise<number>;
25
+ avg(column: string, where: WhereArgsType): Promise<number>;
26
+ exists(where: WhereArgsType): Promise<boolean>;
27
+ }
28
+
29
+ export { Model as default };
package/model/index.js ADDED
@@ -0,0 +1,236 @@
1
+ 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var XansqlError=require('../core/XansqlError.js'),XansqlResult=require('../core/XansqlResult.js'),RelationExcuteArgs=require('./Args/RelationExcuteArgs.js'),Base=require('./Base.js'),index$4=require('./Executer/Aggregate/index.js'),index=require('./Executer/Create/index.js'),index$2=require('./Executer/Delete/index.js'),index$3=require('./Executer/Find/index.js'),index$1=require('./Executer/Update/index.js');class Model extends Base.default {
2
+ async create(args) {
3
+ const xansql = this.xansql;
4
+ const isRelArgs = args instanceof RelationExcuteArgs.default;
5
+ if (isRelArgs)
6
+ args = args.args;
7
+ try {
8
+ if (!isRelArgs)
9
+ await xansql.XansqlTransaction.begin();
10
+ args = await this.callHook("beforeCreate", args) || args;
11
+ // event emit BEFORE_CREATE
12
+ const executer = new index.default(this);
13
+ await xansql.EventManager.emit("BEFORE_CREATE", { model: this, args });
14
+ let results = await executer.execute(args);
15
+ await xansql.EventManager.emit("CREATE", { model: this, results, args });
16
+ results = await this.callHook("afterCreate", results, args) || results;
17
+ if (!isRelArgs)
18
+ await xansql.XansqlTransaction.commit();
19
+ return XansqlResult.XansqlResult(results);
20
+ }
21
+ catch (error) {
22
+ if (!isRelArgs)
23
+ await xansql.XansqlTransaction.rollback();
24
+ const r = XansqlResult.XansqlResult([]);
25
+ if (error instanceof Array && error[0] instanceof XansqlError.default) {
26
+ for (let err of error) {
27
+ r.setError(err.column, err.message);
28
+ }
29
+ }
30
+ else {
31
+ r.setError("create", error.message);
32
+ }
33
+ return r;
34
+ }
35
+ }
36
+ async update(args) {
37
+ const xansql = this.xansql;
38
+ const isRelArgs = args instanceof RelationExcuteArgs.default;
39
+ if (isRelArgs)
40
+ args = args.args;
41
+ try {
42
+ if (!isRelArgs)
43
+ await xansql.XansqlTransaction.begin();
44
+ args = await this.callHook("beforeUpdate", args) || args;
45
+ const executer = new index$1.default(this);
46
+ await xansql.EventManager.emit("BEFORE_UPDATE", { model: this, args });
47
+ let result = await executer.execute(args);
48
+ await xansql.EventManager.emit("UPDATE", { model: this, results: result, args });
49
+ result = await this.callHook("afterUpdate", result, args) || result;
50
+ if (!isRelArgs)
51
+ await xansql.XansqlTransaction.commit();
52
+ return XansqlResult.XansqlResult(result);
53
+ }
54
+ catch (error) {
55
+ if (!isRelArgs)
56
+ await xansql.XansqlTransaction.rollback();
57
+ const r = XansqlResult.XansqlResult([]);
58
+ if (error instanceof Array && error[0] instanceof XansqlError.default) {
59
+ for (let err of error) {
60
+ r.setError(err.column, err.message);
61
+ }
62
+ }
63
+ else {
64
+ r.setError("create", error.message);
65
+ }
66
+ return r;
67
+ }
68
+ }
69
+ async delete(args) {
70
+ const xansql = this.xansql;
71
+ const isRelArgs = args instanceof RelationExcuteArgs.default;
72
+ if (isRelArgs)
73
+ args = args.args;
74
+ try {
75
+ if (!isRelArgs)
76
+ await xansql.XansqlTransaction.begin();
77
+ args = await this.callHook("beforeDelete", args) || args;
78
+ const executer = new index$2.default(this);
79
+ await xansql.EventManager.emit("BEFORE_DELETE", { model: this, args });
80
+ let result = await executer.execute(args);
81
+ await xansql.EventManager.emit("DELETE", { model: this, results: result, args });
82
+ result = await this.callHook("afterDelete", result, args) || result;
83
+ if (!isRelArgs)
84
+ await xansql.XansqlTransaction.commit();
85
+ return XansqlResult.XansqlResult(result);
86
+ }
87
+ catch (error) {
88
+ if (!isRelArgs)
89
+ await xansql.XansqlTransaction.rollback();
90
+ const r = XansqlResult.XansqlResult([]);
91
+ r.setError("delete", error.message);
92
+ return r;
93
+ }
94
+ }
95
+ async find(args) {
96
+ const isRelArgs = args instanceof RelationExcuteArgs.default;
97
+ if (isRelArgs)
98
+ args = args.args;
99
+ try {
100
+ args = await this.callHook("beforeFind", args) || args;
101
+ const executer = new index$3.default(this, async (row) => {
102
+ return await this.callHook('transform', row) || row;
103
+ });
104
+ await this.xansql.EventManager.emit("BEFORE_FIND", { model: this, args });
105
+ let result = await executer.execute(args);
106
+ await this.xansql.EventManager.emit("FIND", { model: this, results: result, args });
107
+ result = await this.callHook("afterFind", result, args) || result;
108
+ return XansqlResult.XansqlResult(result);
109
+ }
110
+ catch (error) {
111
+ const r = XansqlResult.XansqlResult([]);
112
+ r.setError("find", error.message);
113
+ return r;
114
+ }
115
+ }
116
+ async aggregate(args) {
117
+ const isRelArgs = args instanceof RelationExcuteArgs.default;
118
+ if (isRelArgs)
119
+ args = args.args;
120
+ try {
121
+ args = await this.callHook("beforeAggregate", args) || args;
122
+ const executer = new index$4.default(this);
123
+ await this.xansql.EventManager.emit("BEFORE_AGGREGATE", { model: this, args });
124
+ let result = await executer.execute(args);
125
+ await this.xansql.EventManager.emit("AGGREGATE", { model: this, results: result, args });
126
+ result = await this.callHook("afterAggregate", result, args) || result;
127
+ return XansqlResult.XansqlResult(result);
128
+ }
129
+ catch (error) {
130
+ const r = XansqlResult.XansqlResult([]);
131
+ r.setError("aggregate", error.message);
132
+ return r;
133
+ }
134
+ }
135
+ async truncate() {
136
+ await this.xansql.execute(`TRUNCATE TABLE ${this.table}`);
137
+ }
138
+ async paginate(page, args) {
139
+ const perpage = (args === null || args === void 0 ? void 0 : args.perpage) || 20;
140
+ const skip = (page - 1) * perpage;
141
+ const results = await this.find(Object.assign(Object.assign({}, args), { limit: {
142
+ take: perpage,
143
+ skip
144
+ } }));
145
+ const total = await this.count((args === null || args === void 0 ? void 0 : args.where) || {});
146
+ return {
147
+ page,
148
+ perpage,
149
+ pagecount: Math.ceil(total / perpage),
150
+ rowcount: total,
151
+ results
152
+ };
153
+ }
154
+ async count(where) {
155
+ const res = await this.aggregate({
156
+ where,
157
+ select: {
158
+ [this.IDColumn]: {
159
+ count: true
160
+ }
161
+ }
162
+ });
163
+ return res.length ? res[0][`count_${this.IDColumn}`] : 0;
164
+ }
165
+ async min(column, where) {
166
+ if (!(column in this.schema)) {
167
+ throw new XansqlError.default({
168
+ message: `Column "${column}" does not exist in table "${this.table}"`,
169
+ model: this.table,
170
+ });
171
+ }
172
+ const res = await this.aggregate({
173
+ where,
174
+ select: {
175
+ [column]: {
176
+ min: true
177
+ }
178
+ }
179
+ });
180
+ return res.length ? res[0][`min_${column}`] : 0;
181
+ }
182
+ async max(column, where) {
183
+ if (!(column in this.schema)) {
184
+ throw new XansqlError.default({
185
+ message: `Column "${column}" does not exist in table "${this.table}"`,
186
+ model: this.table,
187
+ });
188
+ }
189
+ const res = await this.aggregate({
190
+ where,
191
+ select: {
192
+ [column]: {
193
+ max: true
194
+ }
195
+ }
196
+ });
197
+ return res.length ? res[0][`max_${column}`] : 0;
198
+ }
199
+ async sum(column, where) {
200
+ if (!(column in this.schema)) {
201
+ throw new XansqlError.default({
202
+ message: `Column "${column}" does not exist in table "${this.table}"`,
203
+ model: this.table,
204
+ });
205
+ }
206
+ const res = await this.aggregate({
207
+ where,
208
+ select: {
209
+ [column]: {
210
+ sum: true
211
+ }
212
+ }
213
+ });
214
+ return res.length ? res[0][`sum_${column}`] : 0;
215
+ }
216
+ async avg(column, where) {
217
+ if (!(column in this.schema)) {
218
+ throw new XansqlError.default({
219
+ message: `Column "${column}" does not exist in table "${this.table}"`,
220
+ model: this.table,
221
+ });
222
+ }
223
+ const res = await this.aggregate({
224
+ where,
225
+ select: {
226
+ [column]: {
227
+ avg: true
228
+ }
229
+ }
230
+ });
231
+ return res.length ? res[0][`avg_${column}`] : 0;
232
+ }
233
+ async exists(where) {
234
+ return !!(await this.count({ where }));
235
+ }
236
+ }exports.default=Model;//# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../src/model/index.ts"],"sourcesContent":["import XansqlError from \"../core/XansqlError\";\nimport { XansqlResult, XansqlResultArray } from \"../core/XansqlResult\";\nimport RelationExecuteArgs from \"./Args/RelationExcuteArgs\";\nimport ModelBase from \"./Base\";\nimport AggregateExecuter from \"./Executer/Aggregate\";\nimport CreateExecuter from \"./Executer/Create\";\nimport DeleteExecuter from \"./Executer/Delete\";\nimport FindExecuter from \"./Executer/Find\";\nimport UpdateExecuter from \"./Executer/Update\";\nimport { AggregateArgsType, CreateArgsType, DeleteArgsType, FindArgsType, UpdateArgsType, WhereArgsType } from \"./type\";\n\nclass Model extends ModelBase {\n\n async create(args: CreateArgsType): Promise<XansqlResultArray<any>> {\n const xansql = this.xansql;\n const isRelArgs = args instanceof RelationExecuteArgs\n if (isRelArgs) args = (args as any).args\n\n try {\n if (!isRelArgs) await xansql.XansqlTransaction.begin()\n args = await this.callHook(\"beforeCreate\", args) || args\n\n // event emit BEFORE_CREATE\n const executer = new CreateExecuter(this);\n await xansql.EventManager.emit(\"BEFORE_CREATE\", { model: this, args });\n let results: any = await executer.execute(args);\n await xansql.EventManager.emit(\"CREATE\", { model: this, results, args });\n\n results = await this.callHook(\"afterCreate\", results, args) || results\n if (!isRelArgs) await xansql.XansqlTransaction.commit()\n return XansqlResult(results)\n } catch (error: any) {\n if (!isRelArgs) await xansql.XansqlTransaction.rollback()\n const r = XansqlResult([])\n if (error instanceof Array && error[0] instanceof XansqlError) {\n for (let err of error) {\n r.setError(err.column, err.message);\n }\n } else {\n r.setError(\"create\", error.message);\n }\n return r\n }\n }\n\n async update(args: UpdateArgsType): Promise<XansqlResultArray<any>> {\n const xansql = this.xansql;\n const isRelArgs = args instanceof RelationExecuteArgs\n if (isRelArgs) args = (args as any).args\n\n try {\n if (!isRelArgs) await xansql.XansqlTransaction.begin()\n\n args = await this.callHook(\"beforeUpdate\", args) || args\n const executer = new UpdateExecuter(this);\n await xansql.EventManager.emit(\"BEFORE_UPDATE\", { model: this, args });\n let result: any = await executer.execute(args);\n await xansql.EventManager.emit(\"UPDATE\", { model: this, results: result, args });\n result = await this.callHook(\"afterUpdate\", result, args) || result\n\n if (!isRelArgs) await xansql.XansqlTransaction.commit()\n return XansqlResult(result)\n } catch (error: any) {\n if (!isRelArgs) await xansql.XansqlTransaction.rollback()\n const r = XansqlResult([])\n if (error instanceof Array && error[0] instanceof XansqlError) {\n for (let err of error) {\n r.setError(err.column, err.message);\n }\n } else {\n r.setError(\"create\", error.message);\n }\n return r\n }\n }\n\n async delete(args: DeleteArgsType): Promise<XansqlResultArray<any>> {\n const xansql = this.xansql;\n const isRelArgs = args instanceof RelationExecuteArgs\n if (isRelArgs) args = (args as any).args\n\n try {\n if (!isRelArgs) await xansql.XansqlTransaction.begin()\n\n args = await this.callHook(\"beforeDelete\", args) || args\n const executer = new DeleteExecuter(this);\n await xansql.EventManager.emit(\"BEFORE_DELETE\", { model: this, args });\n let result: any = await executer.execute(args);\n await xansql.EventManager.emit(\"DELETE\", { model: this, results: result, args });\n result = await this.callHook(\"afterDelete\", result, args) || result\n\n if (!isRelArgs) await xansql.XansqlTransaction.commit()\n return XansqlResult(result)\n } catch (error) {\n if (!isRelArgs) await xansql.XansqlTransaction.rollback()\n const r = XansqlResult([])\n r.setError(\"delete\", (error as Error).message);\n return r\n }\n }\n\n async find(args: FindArgsType): Promise<XansqlResultArray<any>> {\n const isRelArgs = args instanceof RelationExecuteArgs\n if (isRelArgs) args = (args as any).args\n\n try {\n args = await this.callHook(\"beforeFind\", args) || args\n const executer = new FindExecuter(this, async (row: any) => {\n return await this.callHook('transform', row) || row\n });\n await this.xansql.EventManager.emit(\"BEFORE_FIND\", { model: this, args });\n let result = await executer.execute(args);\n await this.xansql.EventManager.emit(\"FIND\", { model: this, results: result, args });\n result = await this.callHook(\"afterFind\", result, args) || result\n return XansqlResult(result)\n } catch (error) {\n const r = XansqlResult([])\n r.setError(\"find\", (error as Error).message);\n return r\n }\n }\n\n async aggregate(args: AggregateArgsType): Promise<XansqlResultArray<any>> {\n const isRelArgs = args instanceof RelationExecuteArgs\n if (isRelArgs) args = (args as any).args\n try {\n args = await this.callHook(\"beforeAggregate\", args) || args\n const executer = new AggregateExecuter(this);\n await this.xansql.EventManager.emit(\"BEFORE_AGGREGATE\", { model: this, args });\n let result = await executer.execute(args);\n await this.xansql.EventManager.emit(\"AGGREGATE\", { model: this, results: result, args });\n\n result = await this.callHook(\"afterAggregate\", result, args) || result\n return XansqlResult(result)\n } catch (error) {\n const r = XansqlResult([])\n r.setError(\"aggregate\", (error as Error).message);\n return r\n }\n }\n\n async truncate() {\n await this.xansql.execute(`TRUNCATE TABLE ${this.table}`);\n }\n\n async paginate(page: number, args?: Omit<FindArgsType, \"limit\"> & { perpage?: number }) {\n const perpage = args?.perpage || 20;\n const skip = (page - 1) * perpage;\n const results = await this.find({\n ...args,\n limit: {\n take: perpage,\n skip\n }\n })\n const total = await this.count(args?.where || {})\n return {\n page,\n perpage,\n pagecount: Math.ceil(total / perpage),\n rowcount: total,\n results\n }\n }\n\n async count(where: WhereArgsType): Promise<number> {\n const res: any[] = await this.aggregate({\n where,\n select: {\n [this.IDColumn]: {\n count: true\n }\n }\n })\n return res.length ? res[0][`count_${this.IDColumn}`] : 0\n }\n\n async min(column: string, where: WhereArgsType): Promise<number> {\n if (!(column in this.schema)) {\n throw new XansqlError({\n message: `Column \"${column}\" does not exist in table \"${this.table}\"`,\n model: this.table,\n });\n }\n const res: any[] = await this.aggregate({\n where,\n select: {\n [column]: {\n min: true\n }\n }\n })\n return res.length ? res[0][`min_${column}`] : 0\n }\n\n async max(column: string, where: WhereArgsType): Promise<number> {\n if (!(column in this.schema)) {\n throw new XansqlError({\n message: `Column \"${column}\" does not exist in table \"${this.table}\"`,\n model: this.table,\n });\n }\n const res: any[] = await this.aggregate({\n where,\n select: {\n [column]: {\n max: true\n }\n }\n })\n return res.length ? res[0][`max_${column}`] : 0\n }\n\n async sum(column: string, where: WhereArgsType): Promise<number> {\n if (!(column in this.schema)) {\n throw new XansqlError({\n message: `Column \"${column}\" does not exist in table \"${this.table}\"`,\n model: this.table,\n });\n }\n const res: any[] = await this.aggregate({\n where,\n select: {\n [column]: {\n sum: true\n }\n }\n })\n return res.length ? res[0][`sum_${column}`] : 0\n }\n\n async avg(column: string, where: WhereArgsType): Promise<number> {\n if (!(column in this.schema)) {\n throw new XansqlError({\n message: `Column \"${column}\" does not exist in table \"${this.table}\"`,\n model: this.table,\n });\n }\n const res: any[] = await this.aggregate({\n where,\n select: {\n [column]: {\n avg: true\n }\n }\n })\n return res.length ? res[0][`avg_${column}`] : 0\n }\n\n async exists(where: WhereArgsType): Promise<boolean> {\n return !!(await this.count({ where }))\n }\n\n // end Helpers Methods\n // async createIndex(column: string) {\n // const { IndexMigration } = this.xansql.XansqlMigration.TableMigration;\n // const indexsql = IndexMigration.buildCreate(this.table, column);\n // try {\n // let executeId = undefined;\n // if (typeof window !== \"undefined\") {\n // executeId = ExecuteMeta.set({\n // model: this,\n // action: \"CREATE_INDEX\",\n // modelType: \"main\",\n // args: {}\n // });\n // }\n // await this.xansql.execute(indexsql, executeId);\n // } catch (error) {\n // throw new Error(\"Index already exists\");\n // }\n // }\n\n // async dropIndex(column: string) {\n // const { IndexMigration } = this.xansql.XansqlMigration.TableMigration;\n // const indexsql = IndexMigration.buildDrop(this.table, column);\n // let executeId = undefined;\n // if (typeof window !== \"undefined\") {\n // executeId = ExecuteMeta.set({\n // model: this,\n // action: \"DROP_INDEX\",\n // modelType: \"main\",\n // args: {}\n // });\n // }\n // await this.xansql.execute(indexsql, executeId);\n // }\n\n // async addColumn(column: string) {\n // const { TableMigration } = this.xansql.XansqlMigration;\n // if (!(column in this.schema)) {\n // throw new Error(`Column ${column} already exists in table ${this.table}`);\n // }\n\n // const field = this.schema[column] as XqlFields;\n // if (!field) {\n // throw new Error(`Field definition for column ${column} is missing in schema for table ${this.table}`);\n // }\n // const sqlColumn = TableMigration.buildColumn(this.table, column);\n // let sql = `ALTER TABLE ${this.table} ADD COLUMN ${sqlColumn};`;\n // let executeId = undefined;\n // if (typeof window !== \"undefined\") {\n // executeId = ExecuteMeta.set({\n // model: this,\n // action: \"ADD_COLUMN\",\n // modelType: \"main\",\n // args: {}\n // });\n // }\n // await this.xansql.execute(sql, executeId);\n // this.schema[column] = field;\n\n // // add foreign key if exists\n // const meta = field.meta || {};\n // if (Foreign.isSchema(field)) {\n // const info = Foreign.get(this, column)\n // const fkSql = TableMigration.ForeignKeyMigration.buildCreate(this.table, column, info.table, info.relation.main);\n // let executeId = undefined;\n // if (typeof window !== \"undefined\") {\n // executeId = ExecuteMeta.set({\n // model: this,\n // action: \"ADD_FOREIGN_KEY\",\n // modelType: \"main\",\n // args: {}\n // });\n // }\n // await this.xansql.execute(`ALTER TABLE ${this.table} ADD ${fkSql};`, executeId);\n // }\n\n // // add index if exists\n // if (meta.index) {\n // const indexSql = TableMigration.IndexMigration.buildCreate(this.table, column);\n // let executeId = undefined;\n // if (typeof window !== \"undefined\") {\n // executeId = ExecuteMeta.set({\n // model: this,\n // action: \"CREATE_INDEX\",\n // modelType: \"main\",\n // args: {}\n // });\n // }\n // await this.xansql.execute(indexSql, executeId);\n // }\n\n // }\n\n // async renameColumn(oldColumn: string, newColumn: string) {\n // if (!(oldColumn in this.schema)) {\n // throw new Error(`Column ${oldColumn} does not exist in table ${this.table}`);\n // }\n // if (newColumn in this.schema) {\n // throw new Error(`Column ${newColumn} already exists in table ${this.table}`);\n // }\n // const engine = this.xansql.config.dialect.engine;\n // let sql = ``;\n\n // if (engine === 'mysql') {\n // sql = `ALTER TABLE ${this.table} CHANGE COLUMN ${oldColumn} ${newColumn} ${this.xansql.XansqlMigration.TableMigration.buildColumn(this.table, oldColumn)};`;\n // } else if (engine === 'postgresql') {\n // sql = `ALTER TABLE ${this.table} RENAME COLUMN ${oldColumn} TO ${newColumn};`;\n // } else if (engine === 'sqlite') {\n // throw new Error(`Renaming columns is not supported in SQLite`);\n // }\n // let executeId = undefined;\n // if (typeof window !== \"undefined\") {\n // executeId = ExecuteMeta.set({\n // model: this,\n // action: \"RENAME_COLUMN\",\n // modelType: \"main\",\n // args: {}\n // });\n // }\n // await this.xansql.execute(sql, executeId);\n // const field = this.schema[oldColumn];\n // delete this.schema[oldColumn];\n // this.schema[newColumn] = field;\n\n // // rename foreign key if exists\n // const fieldMeta = field.meta || {};\n // if (Foreign.isSchema(field)) {\n // const fkOld = this.xansql.XansqlMigration.TableMigration.ForeignKeyMigration.identifier(this.table, oldColumn);\n // const fkNew = this.xansql.XansqlMigration.TableMigration.ForeignKeyMigration.identifier(this.table, newColumn);\n // let fsql = ``;\n // if (engine === 'mysql') {\n // fsql = `ALTER TABLE ${this.table} DROP FOREIGN KEY ${fkOld}, ADD CONSTRAINT ${fkNew} FOREIGN KEY (${newColumn}) REFERENCES ${Foreign.get(this, newColumn).table}(${Foreign.get(this, newColumn).relation.main});`;\n // } else if (engine === 'postgresql') {\n // fsql = `ALTER TABLE ${this.table} RENAME CONSTRAINT ${fkOld} TO ${fkNew};`;\n // } else if (engine === 'sqlite') {\n // throw new Error(`Renaming foreign keys is not supported in SQLite`);\n // }\n // let executeId = undefined;\n // if (typeof window !== \"undefined\") {\n // executeId = ExecuteMeta.set({\n // model: this,\n // action: \"DROP_FOREIGN_KEY\",\n // modelType: \"main\",\n // args: {}\n // });\n // }\n // await this.xansql.execute(fsql, executeId);\n // }\n\n // // rename index if exists\n // if (fieldMeta.index) {\n // const indexOld = this.xansql.XansqlMigration.TableMigration.IndexMigration.identifier(this.table, oldColumn);\n // const indexNew = this.xansql.XansqlMigration.TableMigration.IndexMigration.identifier(this.table, newColumn);\n // let isql = ``;\n // if (engine === 'mysql') {\n // isql = `ALTER TABLE ${this.table} DROP INDEX ${indexOld}, ADD INDEX ${indexNew} (${newColumn});`;\n // } else if (engine === 'postgresql') {\n // isql = `ALTER INDEX ${indexOld} RENAME TO ${indexNew};`;\n // } else if (engine === 'sqlite') {\n // throw new Error(`Renaming indexes is not supported in SQLite`);\n // }\n // let executeId = undefined;\n // if (typeof window !== \"undefined\") {\n // executeId = ExecuteMeta.set({\n // model: this,\n // action: \"DROP_INDEX\",\n // modelType: \"main\",\n // args: {}\n // });\n // }\n // await this.xansql.execute(isql, executeId);\n // }\n // }\n\n // async dropColumn(column: string) {\n\n // let sql = `ALTER TABLE ${this.table} DROP COLUMN ${column};`;\n // let executeId = undefined;\n // if (typeof window !== \"undefined\") {\n // executeId = ExecuteMeta.set({\n // model: this,\n // action: \"DROP_COLUMN\",\n // modelType: \"main\",\n // args: {}\n // });\n // }\n // await this.xansql.execute(sql, executeId);\n // const field = this.schema[column];\n // delete this.schema[column];\n // const fieldMeta = field.meta || {};\n\n // // drop foreign key if exists\n // if (Foreign.isSchema(field)) {\n // const fkSql = this.xansql.XansqlMigration.TableMigration.ForeignKeyMigration.buildDrop(this.table, column);\n // let executeId = undefined;\n // if (typeof window !== \"undefined\") {\n // executeId = ExecuteMeta.set({\n // model: this,\n // action: \"ADD_FOREIGN_KEY\",\n // modelType: \"main\",\n // args: {}\n // });\n // }\n // await this.xansql.execute(fkSql, executeId);\n // }\n\n // // drop index if exists\n // if (fieldMeta.index) {\n // const indexSql = this.xansql.XansqlMigration.TableMigration.IndexMigration.buildDrop(this.table, column);\n // let executeId = undefined;\n // if (typeof window !== \"undefined\") {\n // executeId = ExecuteMeta.set({\n // model: this,\n // action: \"CREATE_INDEX\",\n // modelType: \"main\",\n // args: {}\n // });\n // }\n // await this.xansql.execute(indexSql, executeId);\n // }\n // }\n\n}\n\nexport default Model;\n"],"names":["ModelBase","RelationExecuteArgs","CreateExecuter","XansqlResult","XansqlError","UpdateExecuter","DeleteExecuter","FindExecuter","AggregateExecuter"],"mappings":"keAWA,MAAM,KAAM,SAAQA,YAAS,CAAA;IAE1B,MAAM,MAAM,CAAC,IAAoB,EAAA;AAC9B,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM;AAC1B,QAAA,MAAM,SAAS,GAAG,IAAI,YAAYC,0BAAmB;AACrD,QAAA,IAAI,SAAS;AAAE,YAAA,IAAI,GAAI,IAAY,CAAC,IAAI;AAExC,QAAA,IAAI;AACD,YAAA,IAAI,CAAC,SAAS;AAAE,gBAAA,MAAM,MAAM,CAAC,iBAAiB,CAAC,KAAK,EAAE;AACtD,YAAA,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,IAAI,CAAC,IAAI,IAAI;;AAGxD,YAAA,MAAM,QAAQ,GAAG,IAAIC,aAAc,CAAC,IAAI,CAAC;AACzC,YAAA,MAAM,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;YACtE,IAAI,OAAO,GAAQ,MAAM,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC;AAC/C,YAAA,MAAM,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAExE,YAAA,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,OAAO;AACtE,YAAA,IAAI,CAAC,SAAS;AAAE,gBAAA,MAAM,MAAM,CAAC,iBAAiB,CAAC,MAAM,EAAE;AACvD,YAAA,OAAOC,yBAAY,CAAC,OAAO,CAAC;QAC/B;QAAE,OAAO,KAAU,EAAE;AAClB,YAAA,IAAI,CAAC,SAAS;AAAE,gBAAA,MAAM,MAAM,CAAC,iBAAiB,CAAC,QAAQ,EAAE;AACzD,YAAA,MAAM,CAAC,GAAGA,yBAAY,CAAC,EAAE,CAAC;YAC1B,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,YAAYC,mBAAW,EAAE;AAC5D,gBAAA,KAAK,IAAI,GAAG,IAAI,KAAK,EAAE;oBACpB,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC;gBACtC;YACH;iBAAO;gBACJ,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC;YACtC;AACA,YAAA,OAAO,CAAC;QACX;IACH;IAEA,MAAM,MAAM,CAAC,IAAoB,EAAA;AAC9B,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM;AAC1B,QAAA,MAAM,SAAS,GAAG,IAAI,YAAYH,0BAAmB;AACrD,QAAA,IAAI,SAAS;AAAE,YAAA,IAAI,GAAI,IAAY,CAAC,IAAI;AAExC,QAAA,IAAI;AACD,YAAA,IAAI,CAAC,SAAS;AAAE,gBAAA,MAAM,MAAM,CAAC,iBAAiB,CAAC,KAAK,EAAE;AAEtD,YAAA,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,IAAI,CAAC,IAAI,IAAI;AACxD,YAAA,MAAM,QAAQ,GAAG,IAAII,eAAc,CAAC,IAAI,CAAC;AACzC,YAAA,MAAM,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;YACtE,IAAI,MAAM,GAAQ,MAAM,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC;YAC9C,MAAM,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AAChF,YAAA,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,MAAM;AAEnE,YAAA,IAAI,CAAC,SAAS;AAAE,gBAAA,MAAM,MAAM,CAAC,iBAAiB,CAAC,MAAM,EAAE;AACvD,YAAA,OAAOF,yBAAY,CAAC,MAAM,CAAC;QAC9B;QAAE,OAAO,KAAU,EAAE;AAClB,YAAA,IAAI,CAAC,SAAS;AAAE,gBAAA,MAAM,MAAM,CAAC,iBAAiB,CAAC,QAAQ,EAAE;AACzD,YAAA,MAAM,CAAC,GAAGA,yBAAY,CAAC,EAAE,CAAC;YAC1B,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,YAAYC,mBAAW,EAAE;AAC5D,gBAAA,KAAK,IAAI,GAAG,IAAI,KAAK,EAAE;oBACpB,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC;gBACtC;YACH;iBAAO;gBACJ,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC;YACtC;AACA,YAAA,OAAO,CAAC;QACX;IACH;IAEA,MAAM,MAAM,CAAC,IAAoB,EAAA;AAC9B,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM;AAC1B,QAAA,MAAM,SAAS,GAAG,IAAI,YAAYH,0BAAmB;AACrD,QAAA,IAAI,SAAS;AAAE,YAAA,IAAI,GAAI,IAAY,CAAC,IAAI;AAExC,QAAA,IAAI;AACD,YAAA,IAAI,CAAC,SAAS;AAAE,gBAAA,MAAM,MAAM,CAAC,iBAAiB,CAAC,KAAK,EAAE;AAEtD,YAAA,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,IAAI,CAAC,IAAI,IAAI;AACxD,YAAA,MAAM,QAAQ,GAAG,IAAIK,eAAc,CAAC,IAAI,CAAC;AACzC,YAAA,MAAM,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;YACtE,IAAI,MAAM,GAAQ,MAAM,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC;YAC9C,MAAM,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AAChF,YAAA,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,MAAM;AAEnE,YAAA,IAAI,CAAC,SAAS;AAAE,gBAAA,MAAM,MAAM,CAAC,iBAAiB,CAAC,MAAM,EAAE;AACvD,YAAA,OAAOH,yBAAY,CAAC,MAAM,CAAC;QAC9B;QAAE,OAAO,KAAK,EAAE;AACb,YAAA,IAAI,CAAC,SAAS;AAAE,gBAAA,MAAM,MAAM,CAAC,iBAAiB,CAAC,QAAQ,EAAE;AACzD,YAAA,MAAM,CAAC,GAAGA,yBAAY,CAAC,EAAE,CAAC;YAC1B,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAG,KAAe,CAAC,OAAO,CAAC;AAC9C,YAAA,OAAO,CAAC;QACX;IACH;IAEA,MAAM,IAAI,CAAC,IAAkB,EAAA;AAC1B,QAAA,MAAM,SAAS,GAAG,IAAI,YAAYF,0BAAmB;AACrD,QAAA,IAAI,SAAS;AAAE,YAAA,IAAI,GAAI,IAAY,CAAC,IAAI;AAExC,QAAA,IAAI;AACD,YAAA,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,IAAI,CAAC,IAAI,IAAI;YACtD,MAAM,QAAQ,GAAG,IAAIM,eAAY,CAAC,IAAI,EAAE,OAAO,GAAQ,KAAI;gBACxD,OAAO,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,GAAG,CAAC,IAAI,GAAG;AACtD,YAAA,CAAC,CAAC;AACF,YAAA,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;YACzE,IAAI,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC;YACzC,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AACnF,YAAA,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,MAAM;AACjE,YAAA,OAAOJ,yBAAY,CAAC,MAAM,CAAC;QAC9B;QAAE,OAAO,KAAK,EAAE;AACb,YAAA,MAAM,CAAC,GAAGA,yBAAY,CAAC,EAAE,CAAC;YAC1B,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAG,KAAe,CAAC,OAAO,CAAC;AAC5C,YAAA,OAAO,CAAC;QACX;IACH;IAEA,MAAM,SAAS,CAAC,IAAuB,EAAA;AACpC,QAAA,MAAM,SAAS,GAAG,IAAI,YAAYF,0BAAmB;AACrD,QAAA,IAAI,SAAS;AAAE,YAAA,IAAI,GAAI,IAAY,CAAC,IAAI;AACxC,QAAA,IAAI;AACD,YAAA,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,iBAAiB,EAAE,IAAI,CAAC,IAAI,IAAI;AAC3D,YAAA,MAAM,QAAQ,GAAG,IAAIO,eAAiB,CAAC,IAAI,CAAC;AAC5C,YAAA,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;YAC9E,IAAI,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC;YACzC,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AAExF,YAAA,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,MAAM;AACtE,YAAA,OAAOL,yBAAY,CAAC,MAAM,CAAC;QAC9B;QAAE,OAAO,KAAK,EAAE;AACb,YAAA,MAAM,CAAC,GAAGA,yBAAY,CAAC,EAAE,CAAC;YAC1B,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAG,KAAe,CAAC,OAAO,CAAC;AACjD,YAAA,OAAO,CAAC;QACX;IACH;AAEA,IAAA,MAAM,QAAQ,GAAA;AACX,QAAA,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA,eAAA,EAAkB,IAAI,CAAC,KAAK,CAAA,CAAE,CAAC;IAC5D;AAEA,IAAA,MAAM,QAAQ,CAAC,IAAY,EAAE,IAAyD,EAAA;AACnF,QAAA,MAAM,OAAO,GAAG,CAAA,IAAI,KAAA,IAAA,IAAJ,IAAI,KAAA,MAAA,GAAA,MAAA,GAAJ,IAAI,CAAE,OAAO,KAAI,EAAE;QACnC,MAAM,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,OAAO;QACjC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EACzB,IAAI,CAAA,EAAA,EACP,KAAK,EAAE;AACJ,gBAAA,IAAI,EAAE,OAAO;gBACb;AACF,aAAA,EAAA,CAAA,CACF;AACF,QAAA,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,CAAA,IAAI,KAAA,IAAA,IAAJ,IAAI,uBAAJ,IAAI,CAAE,KAAK,KAAI,EAAE,CAAC;QACjD,OAAO;YACJ,IAAI;YACJ,OAAO;YACP,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC;AACrC,YAAA,QAAQ,EAAE,KAAK;YACf;SACF;IACJ;IAEA,MAAM,KAAK,CAAC,KAAoB,EAAA;AAC7B,QAAA,MAAM,GAAG,GAAU,MAAM,IAAI,CAAC,SAAS,CAAC;YACrC,KAAK;AACL,YAAA,MAAM,EAAE;AACL,gBAAA,CAAC,IAAI,CAAC,QAAQ,GAAG;AACd,oBAAA,KAAK,EAAE;AACT;AACH;AACH,SAAA,CAAC;QACF,OAAO,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA,MAAA,EAAS,IAAI,CAAC,QAAQ,CAAA,CAAE,CAAC,GAAG,CAAC;IAC3D;AAEA,IAAA,MAAM,GAAG,CAAC,MAAc,EAAE,KAAoB,EAAA;QAC3C,IAAI,EAAE,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE;YAC3B,MAAM,IAAIC,mBAAW,CAAC;AACnB,gBAAA,OAAO,EAAE,CAAA,QAAA,EAAW,MAAM,8BAA8B,IAAI,CAAC,KAAK,CAAA,CAAA,CAAG;gBACrE,KAAK,EAAE,IAAI,CAAC,KAAK;AACnB,aAAA,CAAC;QACL;AACA,QAAA,MAAM,GAAG,GAAU,MAAM,IAAI,CAAC,SAAS,CAAC;YACrC,KAAK;AACL,YAAA,MAAM,EAAE;gBACL,CAAC,MAAM,GAAG;AACP,oBAAA,GAAG,EAAE;AACP;AACH;AACH,SAAA,CAAC;AACF,QAAA,OAAO,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA,IAAA,EAAO,MAAM,CAAA,CAAE,CAAC,GAAG,CAAC;IAClD;AAEA,IAAA,MAAM,GAAG,CAAC,MAAc,EAAE,KAAoB,EAAA;QAC3C,IAAI,EAAE,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE;YAC3B,MAAM,IAAIA,mBAAW,CAAC;AACnB,gBAAA,OAAO,EAAE,CAAA,QAAA,EAAW,MAAM,8BAA8B,IAAI,CAAC,KAAK,CAAA,CAAA,CAAG;gBACrE,KAAK,EAAE,IAAI,CAAC,KAAK;AACnB,aAAA,CAAC;QACL;AACA,QAAA,MAAM,GAAG,GAAU,MAAM,IAAI,CAAC,SAAS,CAAC;YACrC,KAAK;AACL,YAAA,MAAM,EAAE;gBACL,CAAC,MAAM,GAAG;AACP,oBAAA,GAAG,EAAE;AACP;AACH;AACH,SAAA,CAAC;AACF,QAAA,OAAO,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA,IAAA,EAAO,MAAM,CAAA,CAAE,CAAC,GAAG,CAAC;IAClD;AAEA,IAAA,MAAM,GAAG,CAAC,MAAc,EAAE,KAAoB,EAAA;QAC3C,IAAI,EAAE,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE;YAC3B,MAAM,IAAIA,mBAAW,CAAC;AACnB,gBAAA,OAAO,EAAE,CAAA,QAAA,EAAW,MAAM,8BAA8B,IAAI,CAAC,KAAK,CAAA,CAAA,CAAG;gBACrE,KAAK,EAAE,IAAI,CAAC,KAAK;AACnB,aAAA,CAAC;QACL;AACA,QAAA,MAAM,GAAG,GAAU,MAAM,IAAI,CAAC,SAAS,CAAC;YACrC,KAAK;AACL,YAAA,MAAM,EAAE;gBACL,CAAC,MAAM,GAAG;AACP,oBAAA,GAAG,EAAE;AACP;AACH;AACH,SAAA,CAAC;AACF,QAAA,OAAO,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA,IAAA,EAAO,MAAM,CAAA,CAAE,CAAC,GAAG,CAAC;IAClD;AAEA,IAAA,MAAM,GAAG,CAAC,MAAc,EAAE,KAAoB,EAAA;QAC3C,IAAI,EAAE,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE;YAC3B,MAAM,IAAIA,mBAAW,CAAC;AACnB,gBAAA,OAAO,EAAE,CAAA,QAAA,EAAW,MAAM,8BAA8B,IAAI,CAAC,KAAK,CAAA,CAAA,CAAG;gBACrE,KAAK,EAAE,IAAI,CAAC,KAAK;AACnB,aAAA,CAAC;QACL;AACA,QAAA,MAAM,GAAG,GAAU,MAAM,IAAI,CAAC,SAAS,CAAC;YACrC,KAAK;AACL,YAAA,MAAM,EAAE;gBACL,CAAC,MAAM,GAAG;AACP,oBAAA,GAAG,EAAE;AACP;AACH;AACH,SAAA,CAAC;AACF,QAAA,OAAO,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA,IAAA,EAAO,MAAM,CAAA,CAAE,CAAC,GAAG,CAAC;IAClD;IAEA,MAAM,MAAM,CAAC,KAAoB,EAAA;AAC9B,QAAA,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IACzC;AAgOF"}