xansql 1.0.8 → 1.0.9

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 (212) hide show
  1. package/core/Xansql.cjs +7 -8
  2. package/core/Xansql.cjs.map +1 -1
  3. package/core/Xansql.d.ts +2 -3
  4. package/core/Xansql.mjs +7 -8
  5. package/core/Xansql.mjs.map +1 -1
  6. package/core/classes/ForeignInfo.cjs +3 -2
  7. package/core/classes/ForeignInfo.cjs.map +1 -1
  8. package/core/classes/ForeignInfo.d.ts +1 -2
  9. package/core/classes/ForeignInfo.mjs +3 -2
  10. package/core/classes/ForeignInfo.mjs.map +1 -1
  11. package/core/classes/Migration/TableMigration.cjs +24 -15
  12. package/core/classes/Migration/TableMigration.cjs.map +1 -1
  13. package/core/classes/Migration/TableMigration.mjs +25 -16
  14. package/core/classes/Migration/TableMigration.mjs.map +1 -1
  15. package/core/classes/Migration/index.cjs +13 -10
  16. package/core/classes/Migration/index.cjs.map +1 -1
  17. package/core/classes/Migration/index.mjs +14 -11
  18. package/core/classes/Migration/index.mjs.map +1 -1
  19. package/core/classes/{ModelFormatter.cjs → ModelFactory.cjs} +82 -56
  20. package/core/classes/ModelFactory.cjs.map +1 -0
  21. package/core/classes/{ModelFormatter.d.ts → ModelFactory.d.ts} +7 -2
  22. package/core/classes/{ModelFormatter.mjs → ModelFactory.mjs} +82 -56
  23. package/core/classes/ModelFactory.mjs.map +1 -0
  24. package/core/types.d.ts +1 -1
  25. package/dialect/MysqlDialect.cjs +7 -4
  26. package/dialect/MysqlDialect.cjs.map +1 -1
  27. package/dialect/MysqlDialect.d.ts +7 -4
  28. package/dialect/MysqlDialect.mjs +7 -4
  29. package/dialect/MysqlDialect.mjs.map +1 -1
  30. package/dialect/PostgresDialect.cjs +5 -2
  31. package/dialect/PostgresDialect.cjs.map +1 -1
  32. package/dialect/PostgresDialect.d.ts +5 -2
  33. package/dialect/PostgresDialect.mjs +5 -2
  34. package/dialect/PostgresDialect.mjs.map +1 -1
  35. package/dialect/SqliteDialect.cjs +3 -2
  36. package/dialect/SqliteDialect.cjs.map +1 -1
  37. package/dialect/SqliteDialect.d.ts +3 -2
  38. package/dialect/SqliteDialect.mjs +3 -2
  39. package/dialect/SqliteDialect.mjs.map +1 -1
  40. package/dialect/XansqlBridge/XansqlBridgeServer.cjs.map +1 -1
  41. package/dialect/XansqlBridge/XansqlBridgeServer.mjs.map +1 -1
  42. package/dialect/XansqlBridge/base.cjs +10 -5
  43. package/dialect/XansqlBridge/base.cjs.map +1 -1
  44. package/dialect/XansqlBridge/base.mjs +10 -5
  45. package/dialect/XansqlBridge/base.mjs.map +1 -1
  46. package/model/Args/WhereArgs.cjs +5 -8
  47. package/model/Args/WhereArgs.cjs.map +1 -1
  48. package/model/Args/WhereArgs.mjs +6 -9
  49. package/model/Args/WhereArgs.mjs.map +1 -1
  50. package/model/Base.cjs +2 -1
  51. package/model/Base.cjs.map +1 -1
  52. package/model/Base.mjs +2 -1
  53. package/model/Base.mjs.map +1 -1
  54. package/model/Executer/Aggregate/SelectArgs.cjs +2 -1
  55. package/model/Executer/Aggregate/SelectArgs.cjs.map +1 -1
  56. package/model/Executer/Aggregate/SelectArgs.mjs +2 -1
  57. package/model/Executer/Aggregate/SelectArgs.mjs.map +1 -1
  58. package/model/Executer/Aggregate/index.cjs +4 -4
  59. package/model/Executer/Aggregate/index.cjs.map +1 -1
  60. package/model/Executer/Aggregate/index.mjs +4 -4
  61. package/model/Executer/Aggregate/index.mjs.map +1 -1
  62. package/model/Executer/Create/CreateDataArgs.cjs +9 -5
  63. package/model/Executer/Create/CreateDataArgs.cjs.map +1 -1
  64. package/model/Executer/Create/CreateDataArgs.mjs +10 -6
  65. package/model/Executer/Create/CreateDataArgs.mjs.map +1 -1
  66. package/model/Executer/Create/index.cjs +1 -1
  67. package/model/Executer/Create/index.cjs.map +1 -1
  68. package/model/Executer/Create/index.mjs +1 -1
  69. package/model/Executer/Create/index.mjs.map +1 -1
  70. package/model/Executer/Delete/index.cjs +2 -1
  71. package/model/Executer/Delete/index.cjs.map +1 -1
  72. package/model/Executer/Delete/index.mjs +2 -1
  73. package/model/Executer/Delete/index.mjs.map +1 -1
  74. package/model/Executer/Find/SelectArgs.cjs +3 -3
  75. package/model/Executer/Find/SelectArgs.cjs.map +1 -1
  76. package/model/Executer/Find/SelectArgs.mjs +3 -3
  77. package/model/Executer/Find/SelectArgs.mjs.map +1 -1
  78. package/model/Executer/Update/UpdateDataArgs.cjs +4 -4
  79. package/model/Executer/Update/UpdateDataArgs.cjs.map +1 -1
  80. package/model/Executer/Update/UpdateDataArgs.mjs +5 -5
  81. package/model/Executer/Update/UpdateDataArgs.mjs.map +1 -1
  82. package/model/Executer/Update/index.cjs +1 -1
  83. package/model/Executer/Update/index.cjs.map +1 -1
  84. package/model/Executer/Update/index.mjs +1 -1
  85. package/model/Executer/Update/index.mjs.map +1 -1
  86. package/model/include/ValueFormatter.cjs +72 -17
  87. package/model/include/ValueFormatter.cjs.map +1 -1
  88. package/model/include/ValueFormatter.d.ts +1 -1
  89. package/model/include/ValueFormatter.mjs +72 -17
  90. package/model/include/ValueFormatter.mjs.map +1 -1
  91. package/model/index.cjs +8 -7
  92. package/model/index.cjs.map +1 -1
  93. package/model/index.mjs +8 -7
  94. package/model/index.mjs.map +1 -1
  95. package/package.json +12 -7
  96. package/utils/index.cjs +5 -2
  97. package/utils/index.cjs.map +1 -1
  98. package/utils/index.d.ts +2 -1
  99. package/utils/index.mjs +5 -3
  100. package/utils/index.mjs.map +1 -1
  101. package/xt/additional/IP.cjs +22 -0
  102. package/xt/additional/IP.cjs.map +1 -0
  103. package/xt/additional/IP.d.ts +6 -0
  104. package/xt/additional/IP.mjs +20 -0
  105. package/xt/additional/IP.mjs.map +1 -0
  106. package/xt/additional/Name.cjs +21 -0
  107. package/xt/additional/Name.cjs.map +1 -0
  108. package/xt/additional/Name.d.ts +6 -0
  109. package/xt/additional/Name.mjs +19 -0
  110. package/xt/additional/Name.mjs.map +1 -0
  111. package/xt/additional/Password.cjs +25 -0
  112. package/xt/additional/Password.cjs.map +1 -0
  113. package/xt/additional/Password.d.ts +6 -0
  114. package/xt/additional/Password.mjs +23 -0
  115. package/xt/additional/Password.mjs.map +1 -0
  116. package/xt/additional/Phone.cjs +21 -0
  117. package/xt/additional/Phone.cjs.map +1 -0
  118. package/xt/additional/Phone.d.ts +6 -0
  119. package/xt/additional/Phone.mjs +19 -0
  120. package/xt/additional/Phone.mjs.map +1 -0
  121. package/xt/additional/Photo.cjs +21 -0
  122. package/xt/additional/Photo.cjs.map +1 -0
  123. package/xt/additional/Photo.d.ts +6 -0
  124. package/xt/additional/Photo.mjs +19 -0
  125. package/xt/additional/Photo.mjs.map +1 -0
  126. package/xt/additional/Slug.cjs +21 -0
  127. package/xt/additional/Slug.cjs.map +1 -0
  128. package/xt/additional/Slug.d.ts +6 -0
  129. package/xt/additional/Slug.mjs +19 -0
  130. package/xt/additional/Slug.mjs.map +1 -0
  131. package/xt/additional/Url.cjs +26 -0
  132. package/xt/additional/Url.cjs.map +1 -0
  133. package/xt/additional/Url.d.ts +6 -0
  134. package/xt/additional/Url.mjs +24 -0
  135. package/xt/additional/Url.mjs.map +1 -0
  136. package/xt/additional/Username.cjs +21 -0
  137. package/xt/additional/Username.cjs.map +1 -0
  138. package/xt/additional/Username.d.ts +6 -0
  139. package/xt/additional/Username.mjs +19 -0
  140. package/xt/additional/Username.mjs.map +1 -0
  141. package/xt/fields/Array.cjs +9 -2
  142. package/xt/fields/Array.cjs.map +1 -1
  143. package/xt/fields/Array.d.ts +2 -0
  144. package/xt/fields/Array.mjs +9 -2
  145. package/xt/fields/Array.mjs.map +1 -1
  146. package/xt/fields/Boolean.cjs +10 -5
  147. package/xt/fields/Boolean.cjs.map +1 -1
  148. package/xt/fields/Boolean.d.ts +2 -0
  149. package/xt/fields/Boolean.mjs +10 -5
  150. package/xt/fields/Boolean.mjs.map +1 -1
  151. package/xt/fields/Date.cjs +12 -12
  152. package/xt/fields/Date.cjs.map +1 -1
  153. package/xt/fields/Date.d.ts +2 -0
  154. package/xt/fields/Date.mjs +12 -12
  155. package/xt/fields/Date.mjs.map +1 -1
  156. package/xt/fields/Enum.cjs +10 -4
  157. package/xt/fields/Enum.cjs.map +1 -1
  158. package/xt/fields/Enum.d.ts +2 -0
  159. package/xt/fields/Enum.mjs +10 -4
  160. package/xt/fields/Enum.mjs.map +1 -1
  161. package/xt/fields/File.cjs +9 -2
  162. package/xt/fields/File.cjs.map +1 -1
  163. package/xt/fields/File.d.ts +2 -0
  164. package/xt/fields/File.mjs +9 -2
  165. package/xt/fields/File.mjs.map +1 -1
  166. package/xt/fields/IDField.cjs +8 -0
  167. package/xt/fields/IDField.cjs.map +1 -1
  168. package/xt/fields/IDField.d.ts +2 -0
  169. package/xt/fields/IDField.mjs +8 -0
  170. package/xt/fields/IDField.mjs.map +1 -1
  171. package/xt/fields/Number.cjs +10 -5
  172. package/xt/fields/Number.cjs.map +1 -1
  173. package/xt/fields/Number.d.ts +2 -0
  174. package/xt/fields/Number.mjs +10 -5
  175. package/xt/fields/Number.mjs.map +1 -1
  176. package/xt/fields/Object.cjs +10 -5
  177. package/xt/fields/Object.cjs.map +1 -1
  178. package/xt/fields/Object.d.ts +2 -0
  179. package/xt/fields/Object.mjs +10 -5
  180. package/xt/fields/Object.mjs.map +1 -1
  181. package/xt/fields/Record.cjs +10 -5
  182. package/xt/fields/Record.cjs.map +1 -1
  183. package/xt/fields/Record.d.ts +2 -0
  184. package/xt/fields/Record.mjs +10 -5
  185. package/xt/fields/Record.mjs.map +1 -1
  186. package/xt/fields/Schema.cjs +12 -1
  187. package/xt/fields/Schema.cjs.map +1 -1
  188. package/xt/fields/Schema.d.ts +4 -1
  189. package/xt/fields/Schema.mjs +12 -1
  190. package/xt/fields/Schema.mjs.map +1 -1
  191. package/xt/fields/String.cjs +12 -9
  192. package/xt/fields/String.cjs.map +1 -1
  193. package/xt/fields/String.d.ts +2 -0
  194. package/xt/fields/String.mjs +12 -9
  195. package/xt/fields/String.mjs.map +1 -1
  196. package/xt/fields/Tuple.cjs +10 -5
  197. package/xt/fields/Tuple.cjs.map +1 -1
  198. package/xt/fields/Tuple.d.ts +2 -0
  199. package/xt/fields/Tuple.mjs +10 -5
  200. package/xt/fields/Tuple.mjs.map +1 -1
  201. package/xt/fields/Union.cjs +10 -5
  202. package/xt/fields/Union.cjs.map +1 -1
  203. package/xt/fields/Union.d.ts +2 -0
  204. package/xt/fields/Union.mjs +10 -5
  205. package/xt/fields/Union.mjs.map +1 -1
  206. package/xt/index.cjs +16 -100
  207. package/xt/index.cjs.map +1 -1
  208. package/xt/index.d.ts +16 -9
  209. package/xt/index.mjs +16 -100
  210. package/xt/index.mjs.map +1 -1
  211. package/core/classes/ModelFormatter.cjs.map +0 -1
  212. package/core/classes/ModelFormatter.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"UpdateDataArgs.cjs","sources":["../../../../src/model/Executer/Update/UpdateDataArgs.ts"],"sourcesContent":["import Model from \"../..\"\nimport Foreign, { ForeignInfoType } from \"../../../core/classes/ForeignInfo\"\nimport XansqlError from \"../../../core/XansqlError\"\nimport XqlDate from \"../../../xt/fields/Date\"\nimport { isArray, isNumber, isObject } from \"../../../utils\"\nimport ValueFormatter from \"../../include/ValueFormatter\"\nimport { DataArgsType, UpdateDataRelationArgs } from \"../../types\"\n\n\ntype DataObject = { [column: string]: any }\ntype RelationObject = {\n [column: string]: {\n args: UpdateDataRelationArgs\n foreign: ForeignInfoType;\n relations?: RelationObject\n }\n}\n\ntype Files = {\n [column: string]: File\n}\n\n\nclass UpdateDataArgs {\n\n /**\n * Generate SQL for data\n * For create mode: (col1, col2, col3) VALUES (val1, val2, val3)\n * For update mode: col1 = val1, col2 = val2, col3 = val3\n */\n readonly data: DataObject = {}\n\n readonly files: Files = {}\n /**\n * Get data object\n * format: { col1: val1, col2: val2, col3: val3 }\n */\n readonly relations: RelationObject = {}\n\n private errors: XansqlError[] = []\n\n constructor(model: Model, data: DataArgsType) {\n\n for (let column in data) {\n const field = model.schema[column]\n let value: any = data[column]\n try {\n\n if (Foreign.is(field)) {\n if (Foreign.isSchema(field)) {\n if (isNumber(value)) {\n this.data[column] = value\n } else {\n throw new XansqlError({\n message: `Invalid value for foreign key column ${model.table}.${column}. Expected number (ID), got ${typeof value}`,\n model: model.table,\n column: column\n });\n }\n } else {\n // relation operation\n if (!isObject(value)) {\n throw new XansqlError({\n message: `Invalid value for relation column ${model.table}.${column}. Expected object for relation operations, got ${typeof value}`,\n model: model.table,\n column: column\n });\n }\n\n if (value.delete && !isObject(value.delete.where)) {\n throw new XansqlError({\n message: `Invalid value for relation delete operation in column ${model.table}.${column}. 'where' field is required and must be an object.`,\n model: model.table,\n column: column\n });\n }\n\n if (value.update && (!isObject(value.update.where) || !isObject(value.update.data))) {\n throw new XansqlError({\n message: `Invalid value for relation update operation in column ${model.table}.${column}. 'where' and 'data' fields are required and must be objects.`,\n model: model.table,\n column: column\n });\n }\n\n if (value.create && (!isObject(value.create.data) && !isArray(value.create.data))) {\n throw new XansqlError({\n message: `Invalid value for relation create operation in column ${model.table}.${column}. 'data' field is required and must be an object or array.`,\n model: model.table,\n column: column\n });\n }\n\n if (value.upsert && (!isObject(value.upsert.where) || !isObject(value.upsert.create) || !isObject(value.upsert.update))) {\n throw new XansqlError({\n message: `Invalid value for relation upsert operation in column ${model.table}.${column}. 'where', 'create', and 'update' fields are required and must be objects.`,\n model: model.table,\n column: column\n });\n }\n\n const foreign = Foreign.get(model, column)\n this.relations[column] = {\n args: value,\n foreign\n }\n }\n } else {\n // check is the field is IDField or created_at or updated_at\n if (model.IDColumn === column || field instanceof XqlDate && (field.meta.update || field.meta.create)) {\n throw new XansqlError({\n message: `Cannot set value for ${model.table}.${column}. It is automatically managed.`,\n model: model.table,\n column: column\n });\n }\n\n if (value instanceof File) {\n this.files[column] = value\n this.data[column] = \"\"\n ValueFormatter.toSql(model, column, value) // for validation\n } else {\n this.data[column] = ValueFormatter.toSql(model, column, value)\n }\n }\n } catch (error) {\n if (error instanceof XansqlError) {\n this.errors.push(error);\n } else {\n throw error\n }\n }\n }\n\n if (this.errors.length > 0) {\n throw this.errors\n }\n\n /**\n * Auto add missing columns with null value for create mode\n * Auto add updated_at column with current timestamp for update mode\n * Skip foreign key columns which are not optional or nullable in create mode\n * Skip ID column in create mode\n * Skip created_at column in update mode\n * Skip updated_at column in create mode\n * Skip columns which are already set in data\n */\n for (let column in model.schema) {\n const field = model.schema[column]\n if (field instanceof XqlDate && field.meta.update) {\n this.data[column] = ValueFormatter.toSql(model, column, new Date())\n }\n }\n\n }\n\n}\n\nexport default UpdateDataArgs"],"names":["Foreign","isNumber","XansqlError","isObject","isArray","XqlDate","ValueFormatter"],"mappings":"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"}
1
+ {"version":3,"file":"UpdateDataArgs.cjs","sources":["../../../../src/model/Executer/Update/UpdateDataArgs.ts"],"sourcesContent":["import Model from \"../..\"\nimport Foreign, { ForeignInfoType } from \"../../../core/classes/ForeignInfo\"\nimport XansqlError from \"../../../core/XansqlError\"\nimport XqlDate from \"../../../xt/fields/Date\"\nimport { iof, isArray, isNumber, isObject } from \"../../../utils\"\nimport ValueFormatter from \"../../include/ValueFormatter\"\nimport { DataArgsType, UpdateDataRelationArgs } from \"../../types\"\n\n\ntype DataObject = { [column: string]: any }\ntype RelationObject = {\n [column: string]: {\n args: UpdateDataRelationArgs\n foreign: ForeignInfoType;\n relations?: RelationObject\n }\n}\n\ntype Files = {\n [column: string]: File\n}\n\n\nclass UpdateDataArgs {\n\n /**\n * Generate SQL for data\n * For create mode: (col1, col2, col3) VALUES (val1, val2, val3)\n * For update mode: col1 = val1, col2 = val2, col3 = val3\n */\n readonly data: DataObject = {}\n\n readonly files: Files = {}\n /**\n * Get data object\n * format: { col1: val1, col2: val2, col3: val3 }\n */\n readonly relations: RelationObject = {}\n\n private errors: XansqlError[] = []\n\n constructor(model: Model, data: DataArgsType) {\n\n for (let column in data) {\n const field = model.schema[column]\n let value: any = data[column]\n try {\n\n if (Foreign.is(field)) {\n if (Foreign.isSchema(field)) {\n if (isNumber(value)) {\n this.data[column] = value\n } else {\n throw new XansqlError({\n message: `Invalid value for foreign key column ${model.table}.${column}. Expected number (ID), got ${typeof value}`,\n model: model.table,\n column: column\n });\n }\n } else {\n // relation operation\n if (!isObject(value)) {\n throw new XansqlError({\n message: `Invalid value for relation column ${model.table}.${column}. Expected object for relation operations, got ${typeof value}`,\n model: model.table,\n column: column\n });\n }\n\n if (value.delete && !isObject(value.delete.where)) {\n throw new XansqlError({\n message: `Invalid value for relation delete operation in column ${model.table}.${column}. 'where' field is required and must be an object.`,\n model: model.table,\n column: column\n });\n }\n\n if (value.update && (!isObject(value.update.where) || !isObject(value.update.data))) {\n throw new XansqlError({\n message: `Invalid value for relation update operation in column ${model.table}.${column}. 'where' and 'data' fields are required and must be objects.`,\n model: model.table,\n column: column\n });\n }\n\n if (value.create && (!isObject(value.create.data) && !isArray(value.create.data))) {\n throw new XansqlError({\n message: `Invalid value for relation create operation in column ${model.table}.${column}. 'data' field is required and must be an object or array.`,\n model: model.table,\n column: column\n });\n }\n\n if (value.upsert && (!isObject(value.upsert.where) || !isObject(value.upsert.create) || !isObject(value.upsert.update))) {\n throw new XansqlError({\n message: `Invalid value for relation upsert operation in column ${model.table}.${column}. 'where', 'create', and 'update' fields are required and must be objects.`,\n model: model.table,\n column: column\n });\n }\n\n const foreign = Foreign.get(model, column)\n this.relations[column] = {\n args: value,\n foreign\n }\n }\n } else {\n // check is the field is IDField or created_at or updated_at\n if (model.IDColumn === column || iof(field, XqlDate) && (field.meta.update || field.meta.create)) {\n throw new XansqlError({\n message: `Cannot set value for ${model.table}.${column}. It is automatically managed.`,\n model: model.table,\n column: column\n });\n }\n\n if (iof(value, File)) {\n this.files[column] = value\n this.data[column] = \"\"\n ValueFormatter.toSql(model, column, value) // for validation\n } else {\n this.data[column] = ValueFormatter.toSql(model, column, value)\n }\n }\n } catch (error: any) {\n if (iof(error, XansqlError)) {\n this.errors.push(error);\n } else {\n throw error\n }\n }\n }\n\n if (this.errors.length > 0) {\n throw this.errors\n }\n\n /**\n * Auto add missing columns with null value for create mode\n * Auto add updated_at column with current timestamp for update mode\n * Skip foreign key columns which are not optional or nullable in create mode\n * Skip ID column in create mode\n * Skip created_at column in update mode\n * Skip updated_at column in create mode\n * Skip columns which are already set in data\n */\n for (let column in model.schema) {\n const field = model.schema[column]\n if (iof(field, XqlDate) && field.meta.update) {\n this.data[column] = ValueFormatter.toSql(model, column, new Date())\n }\n }\n\n }\n\n}\n\nexport default UpdateDataArgs"],"names":["Foreign","isNumber","XansqlError","isObject","isArray","iof","XqlDate","ValueFormatter"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import Foreign from '../../../core/classes/ForeignInfo.mjs';
2
2
  import XansqlError from '../../../core/XansqlError.mjs';
3
3
  import XqlDate from '../../../xt/fields/Date.mjs';
4
- import { isNumber, isObject, isArray } from '../../../utils/index.mjs';
4
+ import { isNumber, isObject, isArray, iof } from '../../../utils/index.mjs';
5
5
  import ValueFormatter from '../../include/ValueFormatter.mjs';
6
6
 
7
7
  class UpdateDataArgs {
@@ -82,14 +82,14 @@ class UpdateDataArgs {
82
82
  }
83
83
  else {
84
84
  // check is the field is IDField or created_at or updated_at
85
- if (model.IDColumn === column || field instanceof XqlDate && (field.meta.update || field.meta.create)) {
85
+ if (model.IDColumn === column || iof(field, XqlDate) && (field.meta.update || field.meta.create)) {
86
86
  throw new XansqlError({
87
87
  message: `Cannot set value for ${model.table}.${column}. It is automatically managed.`,
88
88
  model: model.table,
89
89
  column: column
90
90
  });
91
91
  }
92
- if (value instanceof File) {
92
+ if (iof(value, File)) {
93
93
  this.files[column] = value;
94
94
  this.data[column] = "";
95
95
  ValueFormatter.toSql(model, column, value); // for validation
@@ -100,7 +100,7 @@ class UpdateDataArgs {
100
100
  }
101
101
  }
102
102
  catch (error) {
103
- if (error instanceof XansqlError) {
103
+ if (iof(error, XansqlError)) {
104
104
  this.errors.push(error);
105
105
  }
106
106
  else {
@@ -122,7 +122,7 @@ class UpdateDataArgs {
122
122
  */
123
123
  for (let column in model.schema) {
124
124
  const field = model.schema[column];
125
- if (field instanceof XqlDate && field.meta.update) {
125
+ if (iof(field, XqlDate) && field.meta.update) {
126
126
  this.data[column] = ValueFormatter.toSql(model, column, new Date());
127
127
  }
128
128
  }
@@ -1 +1 @@
1
- {"version":3,"file":"UpdateDataArgs.mjs","sources":["../../../../src/model/Executer/Update/UpdateDataArgs.ts"],"sourcesContent":["import Model from \"../..\"\nimport Foreign, { ForeignInfoType } from \"../../../core/classes/ForeignInfo\"\nimport XansqlError from \"../../../core/XansqlError\"\nimport XqlDate from \"../../../xt/fields/Date\"\nimport { isArray, isNumber, isObject } from \"../../../utils\"\nimport ValueFormatter from \"../../include/ValueFormatter\"\nimport { DataArgsType, UpdateDataRelationArgs } from \"../../types\"\n\n\ntype DataObject = { [column: string]: any }\ntype RelationObject = {\n [column: string]: {\n args: UpdateDataRelationArgs\n foreign: ForeignInfoType;\n relations?: RelationObject\n }\n}\n\ntype Files = {\n [column: string]: File\n}\n\n\nclass UpdateDataArgs {\n\n /**\n * Generate SQL for data\n * For create mode: (col1, col2, col3) VALUES (val1, val2, val3)\n * For update mode: col1 = val1, col2 = val2, col3 = val3\n */\n readonly data: DataObject = {}\n\n readonly files: Files = {}\n /**\n * Get data object\n * format: { col1: val1, col2: val2, col3: val3 }\n */\n readonly relations: RelationObject = {}\n\n private errors: XansqlError[] = []\n\n constructor(model: Model, data: DataArgsType) {\n\n for (let column in data) {\n const field = model.schema[column]\n let value: any = data[column]\n try {\n\n if (Foreign.is(field)) {\n if (Foreign.isSchema(field)) {\n if (isNumber(value)) {\n this.data[column] = value\n } else {\n throw new XansqlError({\n message: `Invalid value for foreign key column ${model.table}.${column}. Expected number (ID), got ${typeof value}`,\n model: model.table,\n column: column\n });\n }\n } else {\n // relation operation\n if (!isObject(value)) {\n throw new XansqlError({\n message: `Invalid value for relation column ${model.table}.${column}. Expected object for relation operations, got ${typeof value}`,\n model: model.table,\n column: column\n });\n }\n\n if (value.delete && !isObject(value.delete.where)) {\n throw new XansqlError({\n message: `Invalid value for relation delete operation in column ${model.table}.${column}. 'where' field is required and must be an object.`,\n model: model.table,\n column: column\n });\n }\n\n if (value.update && (!isObject(value.update.where) || !isObject(value.update.data))) {\n throw new XansqlError({\n message: `Invalid value for relation update operation in column ${model.table}.${column}. 'where' and 'data' fields are required and must be objects.`,\n model: model.table,\n column: column\n });\n }\n\n if (value.create && (!isObject(value.create.data) && !isArray(value.create.data))) {\n throw new XansqlError({\n message: `Invalid value for relation create operation in column ${model.table}.${column}. 'data' field is required and must be an object or array.`,\n model: model.table,\n column: column\n });\n }\n\n if (value.upsert && (!isObject(value.upsert.where) || !isObject(value.upsert.create) || !isObject(value.upsert.update))) {\n throw new XansqlError({\n message: `Invalid value for relation upsert operation in column ${model.table}.${column}. 'where', 'create', and 'update' fields are required and must be objects.`,\n model: model.table,\n column: column\n });\n }\n\n const foreign = Foreign.get(model, column)\n this.relations[column] = {\n args: value,\n foreign\n }\n }\n } else {\n // check is the field is IDField or created_at or updated_at\n if (model.IDColumn === column || field instanceof XqlDate && (field.meta.update || field.meta.create)) {\n throw new XansqlError({\n message: `Cannot set value for ${model.table}.${column}. It is automatically managed.`,\n model: model.table,\n column: column\n });\n }\n\n if (value instanceof File) {\n this.files[column] = value\n this.data[column] = \"\"\n ValueFormatter.toSql(model, column, value) // for validation\n } else {\n this.data[column] = ValueFormatter.toSql(model, column, value)\n }\n }\n } catch (error) {\n if (error instanceof XansqlError) {\n this.errors.push(error);\n } else {\n throw error\n }\n }\n }\n\n if (this.errors.length > 0) {\n throw this.errors\n }\n\n /**\n * Auto add missing columns with null value for create mode\n * Auto add updated_at column with current timestamp for update mode\n * Skip foreign key columns which are not optional or nullable in create mode\n * Skip ID column in create mode\n * Skip created_at column in update mode\n * Skip updated_at column in create mode\n * Skip columns which are already set in data\n */\n for (let column in model.schema) {\n const field = model.schema[column]\n if (field instanceof XqlDate && field.meta.update) {\n this.data[column] = ValueFormatter.toSql(model, column, new Date())\n }\n }\n\n }\n\n}\n\nexport default UpdateDataArgs"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"UpdateDataArgs.mjs","sources":["../../../../src/model/Executer/Update/UpdateDataArgs.ts"],"sourcesContent":["import Model from \"../..\"\nimport Foreign, { ForeignInfoType } from \"../../../core/classes/ForeignInfo\"\nimport XansqlError from \"../../../core/XansqlError\"\nimport XqlDate from \"../../../xt/fields/Date\"\nimport { iof, isArray, isNumber, isObject } from \"../../../utils\"\nimport ValueFormatter from \"../../include/ValueFormatter\"\nimport { DataArgsType, UpdateDataRelationArgs } from \"../../types\"\n\n\ntype DataObject = { [column: string]: any }\ntype RelationObject = {\n [column: string]: {\n args: UpdateDataRelationArgs\n foreign: ForeignInfoType;\n relations?: RelationObject\n }\n}\n\ntype Files = {\n [column: string]: File\n}\n\n\nclass UpdateDataArgs {\n\n /**\n * Generate SQL for data\n * For create mode: (col1, col2, col3) VALUES (val1, val2, val3)\n * For update mode: col1 = val1, col2 = val2, col3 = val3\n */\n readonly data: DataObject = {}\n\n readonly files: Files = {}\n /**\n * Get data object\n * format: { col1: val1, col2: val2, col3: val3 }\n */\n readonly relations: RelationObject = {}\n\n private errors: XansqlError[] = []\n\n constructor(model: Model, data: DataArgsType) {\n\n for (let column in data) {\n const field = model.schema[column]\n let value: any = data[column]\n try {\n\n if (Foreign.is(field)) {\n if (Foreign.isSchema(field)) {\n if (isNumber(value)) {\n this.data[column] = value\n } else {\n throw new XansqlError({\n message: `Invalid value for foreign key column ${model.table}.${column}. Expected number (ID), got ${typeof value}`,\n model: model.table,\n column: column\n });\n }\n } else {\n // relation operation\n if (!isObject(value)) {\n throw new XansqlError({\n message: `Invalid value for relation column ${model.table}.${column}. Expected object for relation operations, got ${typeof value}`,\n model: model.table,\n column: column\n });\n }\n\n if (value.delete && !isObject(value.delete.where)) {\n throw new XansqlError({\n message: `Invalid value for relation delete operation in column ${model.table}.${column}. 'where' field is required and must be an object.`,\n model: model.table,\n column: column\n });\n }\n\n if (value.update && (!isObject(value.update.where) || !isObject(value.update.data))) {\n throw new XansqlError({\n message: `Invalid value for relation update operation in column ${model.table}.${column}. 'where' and 'data' fields are required and must be objects.`,\n model: model.table,\n column: column\n });\n }\n\n if (value.create && (!isObject(value.create.data) && !isArray(value.create.data))) {\n throw new XansqlError({\n message: `Invalid value for relation create operation in column ${model.table}.${column}. 'data' field is required and must be an object or array.`,\n model: model.table,\n column: column\n });\n }\n\n if (value.upsert && (!isObject(value.upsert.where) || !isObject(value.upsert.create) || !isObject(value.upsert.update))) {\n throw new XansqlError({\n message: `Invalid value for relation upsert operation in column ${model.table}.${column}. 'where', 'create', and 'update' fields are required and must be objects.`,\n model: model.table,\n column: column\n });\n }\n\n const foreign = Foreign.get(model, column)\n this.relations[column] = {\n args: value,\n foreign\n }\n }\n } else {\n // check is the field is IDField or created_at or updated_at\n if (model.IDColumn === column || iof(field, XqlDate) && (field.meta.update || field.meta.create)) {\n throw new XansqlError({\n message: `Cannot set value for ${model.table}.${column}. It is automatically managed.`,\n model: model.table,\n column: column\n });\n }\n\n if (iof(value, File)) {\n this.files[column] = value\n this.data[column] = \"\"\n ValueFormatter.toSql(model, column, value) // for validation\n } else {\n this.data[column] = ValueFormatter.toSql(model, column, value)\n }\n }\n } catch (error: any) {\n if (iof(error, XansqlError)) {\n this.errors.push(error);\n } else {\n throw error\n }\n }\n }\n\n if (this.errors.length > 0) {\n throw this.errors\n }\n\n /**\n * Auto add missing columns with null value for create mode\n * Auto add updated_at column with current timestamp for update mode\n * Skip foreign key columns which are not optional or nullable in create mode\n * Skip ID column in create mode\n * Skip created_at column in update mode\n * Skip updated_at column in create mode\n * Skip columns which are already set in data\n */\n for (let column in model.schema) {\n const field = model.schema[column]\n if (iof(field, XqlDate) && field.meta.update) {\n this.data[column] = ValueFormatter.toSql(model, column, new Date())\n }\n }\n\n }\n\n}\n\nexport default UpdateDataArgs"],"names":[],"mappings":"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"}
@@ -56,7 +56,7 @@ class UpdateExecuter {
56
56
  }
57
57
  }
58
58
  }
59
- if (!update.affectedRows) {
59
+ if (!(update === null || update === void 0 ? void 0 : update.affectedRows)) {
60
60
  return [];
61
61
  }
62
62
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../../../src/model/Executer/Update/index.ts"],"sourcesContent":["import Model from \"../..\"\nimport WhereArgs from \"../../Args/WhereArgs\"\nimport { UpdateArgsType } from \"../../types\"\nimport RelationExecuteArgs from \"../../Args/RelationExcuteArgs\"\nimport UpdateDataArgs from \"./UpdateDataArgs\"\nimport { chunkArray } from \"../../../utils/chunker\"\nimport XansqlError from \"../../../core/XansqlError\"\n\n\nclass UpdateExecuter {\n model: Model\n constructor(model: Model) {\n this.model = model\n }\n\n async execute(args: UpdateArgsType) {\n const xansql = this.model.xansql\n const model = this.model\n const upArgs = new UpdateDataArgs(model, args.data)\n const isRelation = args instanceof RelationExecuteArgs\n\n if (Object.keys(args.where).length === 0) {\n throw new XansqlError({\n message: `Update operation on model ${model.table} requires a WHERE clause to prevent accidental update of all records.`,\n model: model.table\n })\n }\n\n const Where = new WhereArgs(model, args.where)\n const fileColumns = Object.keys(upArgs.files)\n const uploadedFileIds: string[] = []\n\n let existing_file_rows: any[] = []\n if (fileColumns.length > 0) {\n existing_file_rows = await model.find({\n where: args.where,\n limit: \"all\",\n select: fileColumns.reduce((acc, col) => {\n acc[col] = true\n return acc\n }, {} as any)\n })\n }\n\n try {\n\n if (existing_file_rows.length > 0) {\n for (let file_col of fileColumns) {\n const filemeta = await xansql.uploadFile(upArgs.files[file_col])\n uploadedFileIds.push(filemeta.fileId)\n upArgs.data[file_col] = `'${JSON.stringify(filemeta)}'`\n }\n }\n const keys = Object.keys(upArgs.data)\n let upsql = keys.map(col => `${col} = ${upArgs.data[col]}`).join(\", \")\n let sql = `UPDATE ${model.table} SET ${upsql} ${Where.sql}`.trim()\n let update = await model.execute(sql)\n\n if (existing_file_rows.length > 0) {\n for (let row of existing_file_rows) {\n for (let file_col of fileColumns) {\n const oldFileMeta = row[file_col]\n if (oldFileMeta) {\n await xansql.deleteFile(oldFileMeta.fileId)\n }\n }\n }\n }\n\n if (!update.affectedRows) {\n return []\n }\n } catch (error: any) {\n // rollback uploaded files\n for (let fileId of uploadedFileIds) {\n await xansql.deleteFile(fileId)\n }\n throw error\n }\n\n\n const updated_rows = await model.find({\n where: args.where,\n limit: \"all\",\n select: {\n [model.IDColumn]: true\n }\n })\n\n\n if (!updated_rows.length) {\n return []\n }\n\n const ids = []\n for (let urow of updated_rows) {\n ids.push(urow[model.IDColumn])\n }\n\n for (let column in upArgs.relations) {\n const relation = upArgs.relations[column]\n const foreign = relation.foreign\n const FModel = xansql.getModel(foreign.table)\n const relArgs = relation.args\n\n // handle delete\n if (relArgs.delete) {\n for (let { chunk } of chunkArray(ids)) {\n await FModel.delete(new RelationExecuteArgs({\n where: {\n ...relArgs.delete.where,\n [foreign.column]: {\n in: chunk\n }\n }\n }) as any)\n }\n }\n\n // handle update\n if (relArgs.update && relArgs.update.data) {\n for (let { chunk } of chunkArray(ids)) {\n await FModel.update(new RelationExecuteArgs({\n data: relArgs.update.data,\n where: {\n ...relArgs.update.where,\n [foreign.column]: {\n in: chunk\n }\n }\n }) as any)\n }\n }\n // handle create\n if (relArgs.create && relArgs.create.data) {\n for (let { chunk } of chunkArray(ids)) {\n for (let id of chunk) {\n if (Array.isArray(relArgs.create.data)) {\n for (let item of relArgs.create.data) {\n await FModel.create(new RelationExecuteArgs({\n data: {\n ...item,\n [foreign.column]: id\n }\n }) as any)\n }\n } else {\n await FModel.create(new RelationExecuteArgs({\n data: {\n ...relArgs.create.data,\n [foreign.column]: id\n }\n }) as any)\n }\n }\n }\n }\n\n // handle upsert\n if (relArgs.upsert && relArgs.upsert.where && relArgs.upsert.create && relArgs.upsert.update) {\n for (let { chunk } of chunkArray(ids)) {\n const has = await FModel.count({\n where: {\n ...relArgs.upsert.where,\n [foreign.column]: {\n in: chunk\n }\n },\n })\n\n if (has) {\n await FModel.update(new RelationExecuteArgs({\n data: relArgs.upsert.update,\n where: {\n ...relArgs.upsert.where,\n [foreign.column]: {\n in: chunk\n }\n }\n }) as any)\n } else {\n for (let id of chunk) {\n await FModel.create(new RelationExecuteArgs({\n data: {\n ...relArgs.upsert.create,\n [foreign.column]: id\n }\n }) as any)\n }\n }\n }\n }\n }\n\n if (args.select || args.aggregate) {\n let results: any[] = []\n for (let { chunk } of chunkArray(ids)) {\n const res = await model.find({\n where: {\n [model.IDColumn]: {\n in: chunk\n }\n },\n limit: \"all\",\n select: args.select || {\n [model.IDColumn]: true\n },\n aggregate: args.aggregate || {},\n distinct: args.select ? undefined : [model.IDColumn],\n orderBy: args.orderBy || {}\n })\n\n results = results.concat(res)\n }\n\n return results\n }\n\n return updated_rows\n }\n\n}\n\nexport default UpdateExecuter"],"names":["UpdateDataArgs","XansqlError","WhereArgs","chunkArray","RelationExecuteArgs"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../../../../src/model/Executer/Update/index.ts"],"sourcesContent":["import Model from \"../..\"\nimport WhereArgs from \"../../Args/WhereArgs\"\nimport { UpdateArgsType } from \"../../types\"\nimport RelationExecuteArgs from \"../../Args/RelationExcuteArgs\"\nimport UpdateDataArgs from \"./UpdateDataArgs\"\nimport { chunkArray } from \"../../../utils/chunker\"\nimport XansqlError from \"../../../core/XansqlError\"\n\n\nclass UpdateExecuter {\n model: Model\n constructor(model: Model) {\n this.model = model\n }\n\n async execute(args: UpdateArgsType) {\n const xansql = this.model.xansql\n const model = this.model\n const upArgs = new UpdateDataArgs(model, args.data)\n\n if (Object.keys(args.where).length === 0) {\n throw new XansqlError({\n message: `Update operation on model ${model.table} requires a WHERE clause to prevent accidental update of all records.`,\n model: model.table\n })\n }\n\n const Where = new WhereArgs(model, args.where)\n const fileColumns = Object.keys(upArgs.files)\n const uploadedFileIds: string[] = []\n\n let existing_file_rows: any[] = []\n if (fileColumns.length > 0) {\n existing_file_rows = await model.find({\n where: args.where,\n limit: \"all\",\n select: fileColumns.reduce((acc, col) => {\n acc[col] = true\n return acc\n }, {} as any)\n })\n }\n\n try {\n\n if (existing_file_rows.length > 0) {\n for (let file_col of fileColumns) {\n const filemeta = await xansql.uploadFile(upArgs.files[file_col])\n uploadedFileIds.push(filemeta.fileId)\n upArgs.data[file_col] = `'${JSON.stringify(filemeta)}'`\n }\n }\n const keys = Object.keys(upArgs.data)\n let upsql = keys.map(col => `${col} = ${upArgs.data[col]}`).join(\", \")\n let sql = `UPDATE ${model.table} SET ${upsql} ${Where.sql}`.trim()\n let update = await model.execute(sql)\n\n if (existing_file_rows.length > 0) {\n for (let row of existing_file_rows) {\n for (let file_col of fileColumns) {\n const oldFileMeta = row[file_col]\n if (oldFileMeta) {\n await xansql.deleteFile(oldFileMeta.fileId)\n }\n }\n }\n }\n\n if (!update?.affectedRows) {\n return []\n }\n } catch (error: any) {\n // rollback uploaded files\n for (let fileId of uploadedFileIds) {\n await xansql.deleteFile(fileId)\n }\n throw error\n }\n\n\n const updated_rows = await model.find({\n where: args.where,\n limit: \"all\",\n select: {\n [model.IDColumn]: true\n }\n })\n\n\n if (!updated_rows.length) {\n return []\n }\n\n const ids = []\n for (let urow of updated_rows) {\n ids.push(urow[model.IDColumn])\n }\n\n for (let column in upArgs.relations) {\n const relation = upArgs.relations[column]\n const foreign = relation.foreign\n const FModel = xansql.getModel(foreign.table)\n const relArgs = relation.args\n\n // handle delete\n if (relArgs.delete) {\n for (let { chunk } of chunkArray(ids)) {\n await FModel.delete(new RelationExecuteArgs({\n where: {\n ...relArgs.delete.where,\n [foreign.column]: {\n in: chunk\n }\n }\n }) as any)\n }\n }\n\n // handle update\n if (relArgs.update && relArgs.update.data) {\n for (let { chunk } of chunkArray(ids)) {\n await FModel.update(new RelationExecuteArgs({\n data: relArgs.update.data,\n where: {\n ...relArgs.update.where,\n [foreign.column]: {\n in: chunk\n }\n }\n }) as any)\n }\n }\n // handle create\n if (relArgs.create && relArgs.create.data) {\n for (let { chunk } of chunkArray(ids)) {\n for (let id of chunk) {\n if (Array.isArray(relArgs.create.data)) {\n for (let item of relArgs.create.data) {\n await FModel.create(new RelationExecuteArgs({\n data: {\n ...item,\n [foreign.column]: id\n }\n }) as any)\n }\n } else {\n await FModel.create(new RelationExecuteArgs({\n data: {\n ...relArgs.create.data,\n [foreign.column]: id\n }\n }) as any)\n }\n }\n }\n }\n\n // handle upsert\n if (relArgs.upsert && relArgs.upsert.where && relArgs.upsert.create && relArgs.upsert.update) {\n for (let { chunk } of chunkArray(ids)) {\n const has = await FModel.count({\n where: {\n ...relArgs.upsert.where,\n [foreign.column]: {\n in: chunk\n }\n },\n })\n\n if (has) {\n await FModel.update(new RelationExecuteArgs({\n data: relArgs.upsert.update,\n where: {\n ...relArgs.upsert.where,\n [foreign.column]: {\n in: chunk\n }\n }\n }) as any)\n } else {\n for (let id of chunk) {\n await FModel.create(new RelationExecuteArgs({\n data: {\n ...relArgs.upsert.create,\n [foreign.column]: id\n }\n }) as any)\n }\n }\n }\n }\n }\n\n if (args.select || args.aggregate) {\n let results: any[] = []\n for (let { chunk } of chunkArray(ids)) {\n const res = await model.find({\n where: {\n [model.IDColumn]: {\n in: chunk\n }\n },\n limit: \"all\",\n select: args.select || {\n [model.IDColumn]: true\n },\n aggregate: args.aggregate || {},\n distinct: args.select ? undefined : [model.IDColumn],\n orderBy: args.orderBy || {}\n })\n\n results = results.concat(res)\n }\n\n return results\n }\n\n return updated_rows\n }\n\n}\n\nexport default UpdateExecuter"],"names":["UpdateDataArgs","XansqlError","WhereArgs","chunkArray","RelationExecuteArgs"],"mappings":"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"}
@@ -54,7 +54,7 @@ class UpdateExecuter {
54
54
  }
55
55
  }
56
56
  }
57
- if (!update.affectedRows) {
57
+ if (!(update === null || update === void 0 ? void 0 : update.affectedRows)) {
58
58
  return [];
59
59
  }
60
60
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../../src/model/Executer/Update/index.ts"],"sourcesContent":["import Model from \"../..\"\nimport WhereArgs from \"../../Args/WhereArgs\"\nimport { UpdateArgsType } from \"../../types\"\nimport RelationExecuteArgs from \"../../Args/RelationExcuteArgs\"\nimport UpdateDataArgs from \"./UpdateDataArgs\"\nimport { chunkArray } from \"../../../utils/chunker\"\nimport XansqlError from \"../../../core/XansqlError\"\n\n\nclass UpdateExecuter {\n model: Model\n constructor(model: Model) {\n this.model = model\n }\n\n async execute(args: UpdateArgsType) {\n const xansql = this.model.xansql\n const model = this.model\n const upArgs = new UpdateDataArgs(model, args.data)\n const isRelation = args instanceof RelationExecuteArgs\n\n if (Object.keys(args.where).length === 0) {\n throw new XansqlError({\n message: `Update operation on model ${model.table} requires a WHERE clause to prevent accidental update of all records.`,\n model: model.table\n })\n }\n\n const Where = new WhereArgs(model, args.where)\n const fileColumns = Object.keys(upArgs.files)\n const uploadedFileIds: string[] = []\n\n let existing_file_rows: any[] = []\n if (fileColumns.length > 0) {\n existing_file_rows = await model.find({\n where: args.where,\n limit: \"all\",\n select: fileColumns.reduce((acc, col) => {\n acc[col] = true\n return acc\n }, {} as any)\n })\n }\n\n try {\n\n if (existing_file_rows.length > 0) {\n for (let file_col of fileColumns) {\n const filemeta = await xansql.uploadFile(upArgs.files[file_col])\n uploadedFileIds.push(filemeta.fileId)\n upArgs.data[file_col] = `'${JSON.stringify(filemeta)}'`\n }\n }\n const keys = Object.keys(upArgs.data)\n let upsql = keys.map(col => `${col} = ${upArgs.data[col]}`).join(\", \")\n let sql = `UPDATE ${model.table} SET ${upsql} ${Where.sql}`.trim()\n let update = await model.execute(sql)\n\n if (existing_file_rows.length > 0) {\n for (let row of existing_file_rows) {\n for (let file_col of fileColumns) {\n const oldFileMeta = row[file_col]\n if (oldFileMeta) {\n await xansql.deleteFile(oldFileMeta.fileId)\n }\n }\n }\n }\n\n if (!update.affectedRows) {\n return []\n }\n } catch (error: any) {\n // rollback uploaded files\n for (let fileId of uploadedFileIds) {\n await xansql.deleteFile(fileId)\n }\n throw error\n }\n\n\n const updated_rows = await model.find({\n where: args.where,\n limit: \"all\",\n select: {\n [model.IDColumn]: true\n }\n })\n\n\n if (!updated_rows.length) {\n return []\n }\n\n const ids = []\n for (let urow of updated_rows) {\n ids.push(urow[model.IDColumn])\n }\n\n for (let column in upArgs.relations) {\n const relation = upArgs.relations[column]\n const foreign = relation.foreign\n const FModel = xansql.getModel(foreign.table)\n const relArgs = relation.args\n\n // handle delete\n if (relArgs.delete) {\n for (let { chunk } of chunkArray(ids)) {\n await FModel.delete(new RelationExecuteArgs({\n where: {\n ...relArgs.delete.where,\n [foreign.column]: {\n in: chunk\n }\n }\n }) as any)\n }\n }\n\n // handle update\n if (relArgs.update && relArgs.update.data) {\n for (let { chunk } of chunkArray(ids)) {\n await FModel.update(new RelationExecuteArgs({\n data: relArgs.update.data,\n where: {\n ...relArgs.update.where,\n [foreign.column]: {\n in: chunk\n }\n }\n }) as any)\n }\n }\n // handle create\n if (relArgs.create && relArgs.create.data) {\n for (let { chunk } of chunkArray(ids)) {\n for (let id of chunk) {\n if (Array.isArray(relArgs.create.data)) {\n for (let item of relArgs.create.data) {\n await FModel.create(new RelationExecuteArgs({\n data: {\n ...item,\n [foreign.column]: id\n }\n }) as any)\n }\n } else {\n await FModel.create(new RelationExecuteArgs({\n data: {\n ...relArgs.create.data,\n [foreign.column]: id\n }\n }) as any)\n }\n }\n }\n }\n\n // handle upsert\n if (relArgs.upsert && relArgs.upsert.where && relArgs.upsert.create && relArgs.upsert.update) {\n for (let { chunk } of chunkArray(ids)) {\n const has = await FModel.count({\n where: {\n ...relArgs.upsert.where,\n [foreign.column]: {\n in: chunk\n }\n },\n })\n\n if (has) {\n await FModel.update(new RelationExecuteArgs({\n data: relArgs.upsert.update,\n where: {\n ...relArgs.upsert.where,\n [foreign.column]: {\n in: chunk\n }\n }\n }) as any)\n } else {\n for (let id of chunk) {\n await FModel.create(new RelationExecuteArgs({\n data: {\n ...relArgs.upsert.create,\n [foreign.column]: id\n }\n }) as any)\n }\n }\n }\n }\n }\n\n if (args.select || args.aggregate) {\n let results: any[] = []\n for (let { chunk } of chunkArray(ids)) {\n const res = await model.find({\n where: {\n [model.IDColumn]: {\n in: chunk\n }\n },\n limit: \"all\",\n select: args.select || {\n [model.IDColumn]: true\n },\n aggregate: args.aggregate || {},\n distinct: args.select ? undefined : [model.IDColumn],\n orderBy: args.orderBy || {}\n })\n\n results = results.concat(res)\n }\n\n return results\n }\n\n return updated_rows\n }\n\n}\n\nexport default UpdateExecuter"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../../src/model/Executer/Update/index.ts"],"sourcesContent":["import Model from \"../..\"\nimport WhereArgs from \"../../Args/WhereArgs\"\nimport { UpdateArgsType } from \"../../types\"\nimport RelationExecuteArgs from \"../../Args/RelationExcuteArgs\"\nimport UpdateDataArgs from \"./UpdateDataArgs\"\nimport { chunkArray } from \"../../../utils/chunker\"\nimport XansqlError from \"../../../core/XansqlError\"\n\n\nclass UpdateExecuter {\n model: Model\n constructor(model: Model) {\n this.model = model\n }\n\n async execute(args: UpdateArgsType) {\n const xansql = this.model.xansql\n const model = this.model\n const upArgs = new UpdateDataArgs(model, args.data)\n\n if (Object.keys(args.where).length === 0) {\n throw new XansqlError({\n message: `Update operation on model ${model.table} requires a WHERE clause to prevent accidental update of all records.`,\n model: model.table\n })\n }\n\n const Where = new WhereArgs(model, args.where)\n const fileColumns = Object.keys(upArgs.files)\n const uploadedFileIds: string[] = []\n\n let existing_file_rows: any[] = []\n if (fileColumns.length > 0) {\n existing_file_rows = await model.find({\n where: args.where,\n limit: \"all\",\n select: fileColumns.reduce((acc, col) => {\n acc[col] = true\n return acc\n }, {} as any)\n })\n }\n\n try {\n\n if (existing_file_rows.length > 0) {\n for (let file_col of fileColumns) {\n const filemeta = await xansql.uploadFile(upArgs.files[file_col])\n uploadedFileIds.push(filemeta.fileId)\n upArgs.data[file_col] = `'${JSON.stringify(filemeta)}'`\n }\n }\n const keys = Object.keys(upArgs.data)\n let upsql = keys.map(col => `${col} = ${upArgs.data[col]}`).join(\", \")\n let sql = `UPDATE ${model.table} SET ${upsql} ${Where.sql}`.trim()\n let update = await model.execute(sql)\n\n if (existing_file_rows.length > 0) {\n for (let row of existing_file_rows) {\n for (let file_col of fileColumns) {\n const oldFileMeta = row[file_col]\n if (oldFileMeta) {\n await xansql.deleteFile(oldFileMeta.fileId)\n }\n }\n }\n }\n\n if (!update?.affectedRows) {\n return []\n }\n } catch (error: any) {\n // rollback uploaded files\n for (let fileId of uploadedFileIds) {\n await xansql.deleteFile(fileId)\n }\n throw error\n }\n\n\n const updated_rows = await model.find({\n where: args.where,\n limit: \"all\",\n select: {\n [model.IDColumn]: true\n }\n })\n\n\n if (!updated_rows.length) {\n return []\n }\n\n const ids = []\n for (let urow of updated_rows) {\n ids.push(urow[model.IDColumn])\n }\n\n for (let column in upArgs.relations) {\n const relation = upArgs.relations[column]\n const foreign = relation.foreign\n const FModel = xansql.getModel(foreign.table)\n const relArgs = relation.args\n\n // handle delete\n if (relArgs.delete) {\n for (let { chunk } of chunkArray(ids)) {\n await FModel.delete(new RelationExecuteArgs({\n where: {\n ...relArgs.delete.where,\n [foreign.column]: {\n in: chunk\n }\n }\n }) as any)\n }\n }\n\n // handle update\n if (relArgs.update && relArgs.update.data) {\n for (let { chunk } of chunkArray(ids)) {\n await FModel.update(new RelationExecuteArgs({\n data: relArgs.update.data,\n where: {\n ...relArgs.update.where,\n [foreign.column]: {\n in: chunk\n }\n }\n }) as any)\n }\n }\n // handle create\n if (relArgs.create && relArgs.create.data) {\n for (let { chunk } of chunkArray(ids)) {\n for (let id of chunk) {\n if (Array.isArray(relArgs.create.data)) {\n for (let item of relArgs.create.data) {\n await FModel.create(new RelationExecuteArgs({\n data: {\n ...item,\n [foreign.column]: id\n }\n }) as any)\n }\n } else {\n await FModel.create(new RelationExecuteArgs({\n data: {\n ...relArgs.create.data,\n [foreign.column]: id\n }\n }) as any)\n }\n }\n }\n }\n\n // handle upsert\n if (relArgs.upsert && relArgs.upsert.where && relArgs.upsert.create && relArgs.upsert.update) {\n for (let { chunk } of chunkArray(ids)) {\n const has = await FModel.count({\n where: {\n ...relArgs.upsert.where,\n [foreign.column]: {\n in: chunk\n }\n },\n })\n\n if (has) {\n await FModel.update(new RelationExecuteArgs({\n data: relArgs.upsert.update,\n where: {\n ...relArgs.upsert.where,\n [foreign.column]: {\n in: chunk\n }\n }\n }) as any)\n } else {\n for (let id of chunk) {\n await FModel.create(new RelationExecuteArgs({\n data: {\n ...relArgs.upsert.create,\n [foreign.column]: id\n }\n }) as any)\n }\n }\n }\n }\n }\n\n if (args.select || args.aggregate) {\n let results: any[] = []\n for (let { chunk } of chunkArray(ids)) {\n const res = await model.find({\n where: {\n [model.IDColumn]: {\n in: chunk\n }\n },\n limit: \"all\",\n select: args.select || {\n [model.IDColumn]: true\n },\n aggregate: args.aggregate || {},\n distinct: args.select ? undefined : [model.IDColumn],\n orderBy: args.orderBy || {}\n })\n\n results = results.concat(res)\n }\n\n return results\n }\n\n return updated_rows\n }\n\n}\n\nexport default UpdateExecuter"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var core_XansqlError = require('../../core/XansqlError.cjs');
4
+ var utils_index = require('../../utils/index.cjs');
4
5
  var xt_fields_Array = require('../../xt/fields/Array.cjs');
5
6
  var xt_fields_Boolean = require('../../xt/fields/Boolean.cjs');
6
7
  var xt_fields_Date = require('../../xt/fields/Date.cjs');
@@ -16,10 +17,6 @@ var xt_fields_Tuple = require('../../xt/fields/Tuple.cjs');
16
17
  var xt_fields_Union = require('../../xt/fields/Union.cjs');
17
18
 
18
19
  class ValueFormatter {
19
- static iof(model, column, ...instances) {
20
- const field = model.schema[column];
21
- return instances.some(instance => field instanceof instance);
22
- }
23
20
  static escape(value) {
24
21
  if (value == null)
25
22
  return '';
@@ -47,27 +44,31 @@ class ValueFormatter {
47
44
  });
48
45
  try {
49
46
  value = field.parse(value);
47
+ const meta = field.meta || {};
50
48
  if (value === undefined || value === null) {
49
+ if (meta.unique) {
50
+ return '';
51
+ }
51
52
  return 'NULL';
52
53
  }
53
- else if (this.iof(model, column, xt_fields_IDField, xt_fields_Number, xt_fields_Schema)) {
54
+ else if (utils_index.iof(field, xt_fields_IDField, xt_fields_Number, xt_fields_Schema)) {
54
55
  return value;
55
56
  }
56
- else if (this.iof(model, column, xt_fields_File)) {
57
+ else if (utils_index.iof(field, xt_fields_File)) {
57
58
  return `'${value.name}'`;
58
59
  }
59
- else if (this.iof(model, column, xt_fields_String, xt_fields_Enum)) {
60
+ else if (utils_index.iof(field, xt_fields_String, xt_fields_Enum)) {
60
61
  return `'${this.escape(value)}'`;
61
62
  }
62
- else if (this.iof(model, column, xt_fields_Object, xt_fields_Record, xt_fields_Array, xt_fields_Tuple, xt_fields_Union)) {
63
+ else if (utils_index.iof(field, xt_fields_Object, xt_fields_Record, xt_fields_Array, xt_fields_Tuple, xt_fields_Union)) {
63
64
  value = JSON.stringify(value);
64
65
  return `'${this.escape(value)}'`;
65
66
  }
66
- else if (this.iof(model, column, xt_fields_Date)) {
67
- if (value instanceof String) {
67
+ else if (utils_index.iof(field, xt_fields_Date)) {
68
+ if (utils_index.iof(value, String)) {
68
69
  value = new Date(value);
69
70
  }
70
- if (!(value instanceof Date) || isNaN(value.getTime())) {
71
+ if (!utils_index.iof(value, Date) || isNaN(value.getTime())) {
71
72
  throw new Error(`Invalid date value for column ${column}: ${value}`);
72
73
  }
73
74
  const pad = (n) => n.toString().padStart(2, '0');
@@ -81,13 +82,13 @@ class ValueFormatter {
81
82
  value = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
82
83
  return `'${value}'`;
83
84
  }
84
- else if (this.iof(model, column, xt_fields_Boolean)) {
85
+ else if (utils_index.iof(model, column, xt_fields_Boolean)) {
85
86
  return value ? 1 : 0;
86
87
  }
87
88
  }
88
89
  catch (error) {
89
90
  throw new core_XansqlError({
90
- message: `${error.message} (in column ${model.table}.${column})`,
91
+ message: `${model.table}.${column}: ${error.message.toLowerCase()}`,
91
92
  model: model.table,
92
93
  column: column
93
94
  });
@@ -99,20 +100,74 @@ class ValueFormatter {
99
100
  throw new Error(`Column ${column} does not exist in model ${model.table}`);
100
101
  if (value === null || value === undefined)
101
102
  return null;
102
- if (this.iof(model, column, xt_fields_IDField, xt_fields_Number, xt_fields_String, xt_fields_File, xt_fields_Enum)) {
103
+ if (utils_index.iof(model, column, xt_fields_IDField, xt_fields_Number, xt_fields_String, xt_fields_File, xt_fields_Enum)) {
103
104
  return value;
104
105
  }
105
- else if (this.iof(model, column, xt_fields_Object, xt_fields_Record, xt_fields_Array, xt_fields_Tuple, xt_fields_Union)) {
106
+ else if (utils_index.iof(model, column, xt_fields_Object, xt_fields_Record, xt_fields_Array, xt_fields_Tuple, xt_fields_Union)) {
106
107
  return JSON.parse(value);
107
108
  }
108
- else if (this.iof(model, column, xt_fields_Date)) {
109
+ else if (utils_index.iof(model, column, xt_fields_Date)) {
109
110
  return new Date(value);
110
111
  }
111
- else if (this.iof(model, column, xt_fields_Boolean)) {
112
+ else if (utils_index.iof(model, column, xt_fields_Boolean)) {
112
113
  return Boolean(value);
113
114
  }
114
115
  return value;
115
116
  }
117
+ static getDefaultSql(model, column) {
118
+ const field = model.schema[column];
119
+ if (!field)
120
+ throw new core_XansqlError({
121
+ message: `Column ${column} does not exist in model ${model.table}`,
122
+ model: model.table,
123
+ column
124
+ });
125
+ try {
126
+ let value = field.parse(undefined);
127
+ const meta = field.meta || {};
128
+ if (!meta.optional) {
129
+ return '';
130
+ }
131
+ if (value === undefined || value === null) {
132
+ return 'DEFAULT NULL';
133
+ }
134
+ else if (utils_index.iof(field, xt_fields_IDField, xt_fields_Number, xt_fields_Schema)) {
135
+ return `DEFAULT ${value}`;
136
+ }
137
+ else if (utils_index.iof(field, xt_fields_String, xt_fields_Enum, xt_fields_File)) {
138
+ return `DEFAULT '${this.escape(value)}'`;
139
+ }
140
+ else if (utils_index.iof(field, xt_fields_Object, xt_fields_Record, xt_fields_Array, xt_fields_Tuple, xt_fields_Union)) {
141
+ value = JSON.stringify(value);
142
+ return `DEFAULT '${this.escape(value)}'`;
143
+ }
144
+ else if (utils_index.iof(field, xt_fields_Date)) {
145
+ const c = new Date();
146
+ let v;
147
+ if (c.toISOString() === value.toISOString()) {
148
+ v = `DEFAULT CURRENT_TIMESTAMP`;
149
+ }
150
+ else {
151
+ v = `DEFAULT '${value}'`;
152
+ }
153
+ if (meta.update) {
154
+ v = ` ${v} ON UPDATE CURRENT_TIMESTAMP`;
155
+ }
156
+ return v;
157
+ }
158
+ else if (utils_index.iof(field, xt_fields_Boolean)) {
159
+ return value ? 'DEFAULT 1' : 'DEFAULT 0';
160
+ }
161
+ }
162
+ catch (error) {
163
+ throw new core_XansqlError({
164
+ message: `Failed to generate default SQL for ${model.table}.${column}: ${error.message}`,
165
+ model: model.table,
166
+ column
167
+ });
168
+ }
169
+ return ''; // fallback: no default
170
+ }
116
171
  }
117
172
 
118
173
  module.exports = ValueFormatter;
@@ -1 +1 @@
1
- {"version":3,"file":"ValueFormatter.cjs","sources":["../../../src/model/include/ValueFormatter.ts"],"sourcesContent":["import Model from \"..\";\nimport XansqlError from \"../../core/XansqlError\";\nimport XqlArray from \"../../xt/fields/Array\";\nimport XqlBoolean from \"../../xt/fields/Boolean\";\nimport XqlDate from \"../../xt/fields/Date\";\nimport XqlEnum from \"../../xt/fields/Enum\";\nimport XqlFile from \"../../xt/fields/File\";\nimport XqlIDField from \"../../xt/fields/IDField\";\nimport XqlNumber from \"../../xt/fields/Number\";\nimport XqlObject from \"../../xt/fields/Object\";\nimport XqlRecord from \"../../xt/fields/Record\";\nimport XqlSchema from \"../../xt/fields/Schema\";\nimport XqlString from \"../../xt/fields/String\";\nimport XqlTuple from \"../../xt/fields/Tuple\";\nimport XqlUnion from \"../../xt/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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"}
1
+ {"version":3,"file":"ValueFormatter.cjs","sources":["../../../src/model/include/ValueFormatter.ts"],"sourcesContent":["import Model from \"..\";\nimport XansqlError from \"../../core/XansqlError\";\nimport { iof } from \"../../utils\";\nimport XqlArray from \"../../xt/fields/Array\";\nimport XqlBoolean from \"../../xt/fields/Boolean\";\nimport XqlDate from \"../../xt/fields/Date\";\nimport XqlEnum from \"../../xt/fields/Enum\";\nimport XqlFile from \"../../xt/fields/File\";\nimport XqlIDField from \"../../xt/fields/IDField\";\nimport XqlNumber from \"../../xt/fields/Number\";\nimport XqlObject from \"../../xt/fields/Object\";\nimport XqlRecord from \"../../xt/fields/Record\";\nimport XqlSchema from \"../../xt/fields/Schema\";\nimport XqlString from \"../../xt/fields/String\";\nimport XqlTuple from \"../../xt/fields/Tuple\";\nimport XqlUnion from \"../../xt/fields/Union\";\n\nclass ValueFormatter {\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 const meta = field.meta || {};\n if (value === undefined || value === null) {\n if (meta.unique) {\n return ''\n }\n return 'NULL';\n } else if (iof(field, XqlIDField, XqlNumber, XqlSchema)) {\n return value\n } else if (iof(field, XqlFile)) {\n return `'${value.name}'`;\n } else if (iof(field, XqlString, XqlEnum)) {\n return `'${this.escape(value)}'`;\n } else if (iof(field, XqlObject, XqlRecord, XqlArray, XqlTuple, XqlUnion)) {\n value = JSON.stringify(value);\n return `'${this.escape(value)}'`;\n } else if (iof(field, XqlDate)) {\n if (iof(value, String)) {\n value = new Date(value as any)\n }\n if (!iof(value, 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 (iof(model, column, XqlBoolean)) {\n return value ? 1 : 0;\n }\n } catch (error: any) {\n throw new XansqlError({\n message: `${model.table}.${column}: ${error.message.toLowerCase()}`,\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 (iof(model, column, XqlIDField, XqlNumber, XqlString, XqlFile, XqlEnum)) {\n return value\n } else if (iof(model, column, XqlObject, XqlRecord, XqlArray, XqlTuple, XqlUnion)) {\n return JSON.parse(value);\n } else if (iof(model, column, XqlDate)) {\n return new Date(value);\n } else if (iof(model, column, XqlBoolean)) {\n return Boolean(value);\n }\n\n return value;\n }\n\n static getDefaultSql(model: Model, column: string) {\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\n });\n\n try {\n let value = field.parse(undefined);\n const meta = field.meta || {};\n if (!meta.optional) {\n return '';\n }\n\n if (value === undefined || value === null) {\n return 'DEFAULT NULL';\n } else if (iof(field, XqlIDField, XqlNumber, XqlSchema)) {\n return `DEFAULT ${value}`;\n } else if (iof(field, XqlString, XqlEnum, XqlFile)) {\n return `DEFAULT '${this.escape(value)}'`;\n } else if (iof(field, XqlObject, XqlRecord, XqlArray, XqlTuple, XqlUnion)) {\n value = JSON.stringify(value);\n return `DEFAULT '${this.escape(value)}'`;\n } else if (iof(field, XqlDate)) {\n const c = new Date()\n let v\n if (c.toISOString() === value.toISOString()) {\n v = `DEFAULT CURRENT_TIMESTAMP`;\n } else {\n v = `DEFAULT '${value}'`;\n }\n if (meta.update) {\n v = ` ${v} ON UPDATE CURRENT_TIMESTAMP`;\n }\n return v\n } else if (iof(field, XqlBoolean)) {\n return value ? 'DEFAULT 1' : 'DEFAULT 0';\n }\n } catch (error: any) {\n throw new XansqlError({\n message: `Failed to generate default SQL for ${model.table}.${column}: ${error.message}`,\n model: model.table,\n column\n });\n }\n\n return ''; // fallback: no default\n }\n\n\n}\n\nexport default ValueFormatter;"],"names":["XansqlError","iof","XqlIDField","XqlNumber","XqlSchema","XqlFile","XqlString","XqlEnum","XqlObject","XqlRecord","XqlArray","XqlTuple","XqlUnion","XqlDate","XqlBoolean"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  import Model from "..";
2
2
  declare class ValueFormatter {
3
- static iof(model: Model, column: string, ...instances: any[]): boolean;
4
3
  private static escape;
5
4
  static toSql(model: Model, column: string, value: any): any;
6
5
  static fromSql(model: Model, column: string, value: any): any;
6
+ static getDefaultSql(model: Model, column: string): any;
7
7
  }
8
8
  export default ValueFormatter;