@simonbackx/simple-database 1.36.0 → 1.36.3

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 (230) hide show
  1. package/dist/_virtual/_@oxc-project_runtime@0.115.0/helpers/decorate.cjs +9 -0
  2. package/dist/_virtual/_@oxc-project_runtime@0.115.0/helpers/decorate.mjs +9 -0
  3. package/dist/_virtual/_rolldown/runtime.cjs +23 -0
  4. package/dist/index.cjs +22 -0
  5. package/dist/index.d.cts +10 -0
  6. package/dist/index.d.mts +10 -0
  7. package/dist/index.mjs +10 -0
  8. package/dist/src/classes/Column.cjs +134 -0
  9. package/dist/src/classes/Column.d.cts +34 -0
  10. package/dist/src/classes/Column.d.cts.map +1 -0
  11. package/dist/src/classes/Column.d.mts +34 -0
  12. package/dist/src/classes/Column.d.mts.map +1 -0
  13. package/dist/src/classes/Column.mjs +135 -0
  14. package/dist/src/classes/Column.mjs.map +1 -0
  15. package/dist/src/classes/ColumnType.d.cts +5 -0
  16. package/dist/src/classes/ColumnType.d.cts.map +1 -0
  17. package/dist/src/classes/ColumnType.d.mts +5 -0
  18. package/dist/src/classes/ColumnType.d.mts.map +1 -0
  19. package/dist/src/classes/Database.cjs +157 -0
  20. package/dist/src/classes/Database.d.cts +59 -0
  21. package/dist/src/classes/Database.d.cts.map +1 -0
  22. package/dist/src/classes/Database.d.mts +59 -0
  23. package/dist/src/classes/Database.d.mts.map +1 -0
  24. package/dist/src/classes/Database.mjs +155 -0
  25. package/dist/src/classes/Database.mjs.map +1 -0
  26. package/dist/src/classes/DatabaseStoredValue.d.cts +5 -0
  27. package/dist/src/classes/DatabaseStoredValue.d.cts.map +1 -0
  28. package/dist/src/classes/DatabaseStoredValue.d.mts +5 -0
  29. package/dist/src/classes/DatabaseStoredValue.d.mts.map +1 -0
  30. package/dist/src/classes/Factory.cjs +48 -0
  31. package/dist/src/classes/Factory.d.cts +17 -0
  32. package/dist/src/classes/Factory.d.cts.map +1 -0
  33. package/dist/src/classes/Factory.d.mts +17 -0
  34. package/dist/src/classes/Factory.d.mts.map +1 -0
  35. package/dist/src/classes/Factory.mjs +50 -0
  36. package/dist/src/classes/Factory.mjs.map +1 -0
  37. package/dist/src/classes/ManyToManyRelation.cjs +193 -0
  38. package/dist/src/classes/ManyToManyRelation.d.cts +83 -0
  39. package/dist/src/classes/ManyToManyRelation.d.cts.map +1 -0
  40. package/dist/src/classes/ManyToManyRelation.d.mts +83 -0
  41. package/dist/src/classes/ManyToManyRelation.d.mts.map +1 -0
  42. package/dist/src/classes/ManyToManyRelation.mjs +195 -0
  43. package/dist/src/classes/ManyToManyRelation.mjs.map +1 -0
  44. package/dist/src/classes/ManyToOneRelation.cjs +41 -0
  45. package/dist/src/classes/ManyToOneRelation.d.cts +26 -0
  46. package/dist/src/classes/ManyToOneRelation.d.cts.map +1 -0
  47. package/dist/src/classes/ManyToOneRelation.d.mts +26 -0
  48. package/dist/src/classes/ManyToOneRelation.d.mts.map +1 -0
  49. package/dist/src/classes/ManyToOneRelation.mjs +43 -0
  50. package/dist/src/classes/ManyToOneRelation.mjs.map +1 -0
  51. package/dist/src/classes/Migration.cjs +123 -0
  52. package/dist/src/classes/Migration.d.cts +16 -0
  53. package/dist/src/classes/Migration.d.cts.map +1 -0
  54. package/dist/src/classes/Migration.d.mts +16 -0
  55. package/dist/src/classes/Migration.d.mts.map +1 -0
  56. package/dist/src/classes/Migration.mjs +123 -0
  57. package/dist/src/classes/Migration.mjs.map +1 -0
  58. package/dist/src/classes/Model.cjs +459 -0
  59. package/dist/src/classes/Model.d.cts +162 -0
  60. package/dist/src/classes/Model.d.cts.map +1 -0
  61. package/dist/src/classes/Model.d.mts +162 -0
  62. package/dist/src/classes/Model.d.mts.map +1 -0
  63. package/dist/src/classes/Model.mjs +460 -0
  64. package/dist/src/classes/Model.mjs.map +1 -0
  65. package/dist/src/classes/OneToManyRelation.cjs +66 -0
  66. package/dist/src/classes/OneToManyRelation.d.cts +42 -0
  67. package/dist/src/classes/OneToManyRelation.d.cts.map +1 -0
  68. package/dist/src/classes/OneToManyRelation.d.mts +42 -0
  69. package/dist/src/classes/OneToManyRelation.d.mts.map +1 -0
  70. package/dist/src/classes/OneToManyRelation.mjs +68 -0
  71. package/dist/src/classes/OneToManyRelation.mjs.map +1 -0
  72. package/dist/src/classes/data/boys.cjs +1005 -0
  73. package/dist/src/classes/data/boys.mjs +1007 -0
  74. package/dist/src/classes/data/boys.mjs.map +1 -0
  75. package/dist/src/classes/data/family-names.cjs +1005 -0
  76. package/dist/src/classes/data/family-names.mjs +1007 -0
  77. package/dist/src/classes/data/family-names.mjs.map +1 -0
  78. package/dist/src/classes/data/girls.cjs +1004 -0
  79. package/dist/src/classes/data/girls.mjs +1006 -0
  80. package/dist/src/classes/data/girls.mjs.map +1 -0
  81. package/dist/src/decorators/Column.cjs +26 -0
  82. package/dist/src/decorators/Column.d.cts +22 -0
  83. package/dist/src/decorators/Column.d.cts.map +1 -0
  84. package/dist/src/decorators/Column.d.mts +22 -0
  85. package/dist/src/decorators/Column.d.mts.map +1 -0
  86. package/dist/src/decorators/Column.mjs +28 -0
  87. package/dist/src/decorators/Column.mjs.map +1 -0
  88. package/dist/src/models/Migration.cjs +37 -0
  89. package/dist/src/models/Migration.mjs +39 -0
  90. package/dist/src/models/Migration.mjs.map +1 -0
  91. package/package.json +16 -13
  92. package/dist/cjs/index.d.ts +0 -10
  93. package/dist/cjs/index.d.ts.map +0 -1
  94. package/dist/cjs/index.js +0 -13
  95. package/dist/cjs/index.js.map +0 -1
  96. package/dist/cjs/package.json +0 -1
  97. package/dist/cjs/src/classes/Column.d.ts +0 -30
  98. package/dist/cjs/src/classes/Column.d.ts.map +0 -1
  99. package/dist/cjs/src/classes/Column.js +0 -183
  100. package/dist/cjs/src/classes/Column.js.map +0 -1
  101. package/dist/cjs/src/classes/ColumnType.d.ts +0 -2
  102. package/dist/cjs/src/classes/ColumnType.d.ts.map +0 -1
  103. package/dist/cjs/src/classes/ColumnType.js +0 -3
  104. package/dist/cjs/src/classes/ColumnType.js.map +0 -1
  105. package/dist/cjs/src/classes/Database.d.ts +0 -59
  106. package/dist/cjs/src/classes/Database.d.ts.map +0 -1
  107. package/dist/cjs/src/classes/Database.js +0 -176
  108. package/dist/cjs/src/classes/Database.js.map +0 -1
  109. package/dist/cjs/src/classes/DatabaseStoredValue.d.ts +0 -2
  110. package/dist/cjs/src/classes/DatabaseStoredValue.d.ts.map +0 -1
  111. package/dist/cjs/src/classes/DatabaseStoredValue.js +0 -3
  112. package/dist/cjs/src/classes/DatabaseStoredValue.js.map +0 -1
  113. package/dist/cjs/src/classes/Factory.d.ts +0 -14
  114. package/dist/cjs/src/classes/Factory.d.ts.map +0 -1
  115. package/dist/cjs/src/classes/Factory.js +0 -56
  116. package/dist/cjs/src/classes/Factory.js.map +0 -1
  117. package/dist/cjs/src/classes/ManyToManyRelation.d.ts +0 -79
  118. package/dist/cjs/src/classes/ManyToManyRelation.d.ts.map +0 -1
  119. package/dist/cjs/src/classes/ManyToManyRelation.js +0 -258
  120. package/dist/cjs/src/classes/ManyToManyRelation.js.map +0 -1
  121. package/dist/cjs/src/classes/ManyToOneRelation.d.ts +0 -22
  122. package/dist/cjs/src/classes/ManyToOneRelation.d.ts.map +0 -1
  123. package/dist/cjs/src/classes/ManyToOneRelation.js +0 -51
  124. package/dist/cjs/src/classes/ManyToOneRelation.js.map +0 -1
  125. package/dist/cjs/src/classes/Migration.d.ts +0 -14
  126. package/dist/cjs/src/classes/Migration.d.ts.map +0 -1
  127. package/dist/cjs/src/classes/Migration.js +0 -206
  128. package/dist/cjs/src/classes/Migration.js.map +0 -1
  129. package/dist/cjs/src/classes/Model.d.ts +0 -159
  130. package/dist/cjs/src/classes/Model.d.ts.map +0 -1
  131. package/dist/cjs/src/classes/Model.js +0 -640
  132. package/dist/cjs/src/classes/Model.js.map +0 -1
  133. package/dist/cjs/src/classes/OneToManyRelation.d.ts +0 -38
  134. package/dist/cjs/src/classes/OneToManyRelation.d.ts.map +0 -1
  135. package/dist/cjs/src/classes/OneToManyRelation.js +0 -79
  136. package/dist/cjs/src/classes/OneToManyRelation.js.map +0 -1
  137. package/dist/cjs/src/classes/data/boys.d.ts +0 -3
  138. package/dist/cjs/src/classes/data/boys.d.ts.map +0 -1
  139. package/dist/cjs/src/classes/data/boys.js +0 -1005
  140. package/dist/cjs/src/classes/data/boys.js.map +0 -1
  141. package/dist/cjs/src/classes/data/family-names.d.ts +0 -3
  142. package/dist/cjs/src/classes/data/family-names.d.ts.map +0 -1
  143. package/dist/cjs/src/classes/data/family-names.js +0 -1005
  144. package/dist/cjs/src/classes/data/family-names.js.map +0 -1
  145. package/dist/cjs/src/classes/data/girls.d.ts +0 -3
  146. package/dist/cjs/src/classes/data/girls.d.ts.map +0 -1
  147. package/dist/cjs/src/classes/data/girls.js +0 -1004
  148. package/dist/cjs/src/classes/data/girls.js.map +0 -1
  149. package/dist/cjs/src/classes/data/streets.d.ts +0 -3
  150. package/dist/cjs/src/classes/data/streets.d.ts.map +0 -1
  151. package/dist/cjs/src/classes/data/streets.js +0 -296
  152. package/dist/cjs/src/classes/data/streets.js.map +0 -1
  153. package/dist/cjs/src/decorators/Column.d.ts +0 -18
  154. package/dist/cjs/src/decorators/Column.d.ts.map +0 -1
  155. package/dist/cjs/src/decorators/Column.js +0 -39
  156. package/dist/cjs/src/decorators/Column.js.map +0 -1
  157. package/dist/cjs/src/models/Migration.d.ts +0 -11
  158. package/dist/cjs/src/models/Migration.d.ts.map +0 -1
  159. package/dist/cjs/src/models/Migration.js +0 -52
  160. package/dist/cjs/src/models/Migration.js.map +0 -1
  161. package/dist/cjs/tsconfig.cjs.tsbuildinfo +0 -1
  162. package/dist/esm/index.d.ts +0 -10
  163. package/dist/esm/index.d.ts.map +0 -1
  164. package/dist/esm/index.js +0 -10
  165. package/dist/esm/index.js.map +0 -1
  166. package/dist/esm/src/classes/Column.d.ts +0 -30
  167. package/dist/esm/src/classes/Column.d.ts.map +0 -1
  168. package/dist/esm/src/classes/Column.js +0 -179
  169. package/dist/esm/src/classes/Column.js.map +0 -1
  170. package/dist/esm/src/classes/ColumnType.d.ts +0 -2
  171. package/dist/esm/src/classes/ColumnType.d.ts.map +0 -1
  172. package/dist/esm/src/classes/ColumnType.js +0 -2
  173. package/dist/esm/src/classes/ColumnType.js.map +0 -1
  174. package/dist/esm/src/classes/Database.d.ts +0 -59
  175. package/dist/esm/src/classes/Database.d.ts.map +0 -1
  176. package/dist/esm/src/classes/Database.js +0 -171
  177. package/dist/esm/src/classes/Database.js.map +0 -1
  178. package/dist/esm/src/classes/DatabaseStoredValue.d.ts +0 -2
  179. package/dist/esm/src/classes/DatabaseStoredValue.d.ts.map +0 -1
  180. package/dist/esm/src/classes/DatabaseStoredValue.js +0 -2
  181. package/dist/esm/src/classes/DatabaseStoredValue.js.map +0 -1
  182. package/dist/esm/src/classes/Factory.d.ts +0 -14
  183. package/dist/esm/src/classes/Factory.d.ts.map +0 -1
  184. package/dist/esm/src/classes/Factory.js +0 -51
  185. package/dist/esm/src/classes/Factory.js.map +0 -1
  186. package/dist/esm/src/classes/ManyToManyRelation.d.ts +0 -79
  187. package/dist/esm/src/classes/ManyToManyRelation.d.ts.map +0 -1
  188. package/dist/esm/src/classes/ManyToManyRelation.js +0 -254
  189. package/dist/esm/src/classes/ManyToManyRelation.js.map +0 -1
  190. package/dist/esm/src/classes/ManyToOneRelation.d.ts +0 -22
  191. package/dist/esm/src/classes/ManyToOneRelation.d.ts.map +0 -1
  192. package/dist/esm/src/classes/ManyToOneRelation.js +0 -47
  193. package/dist/esm/src/classes/ManyToOneRelation.js.map +0 -1
  194. package/dist/esm/src/classes/Migration.d.ts +0 -14
  195. package/dist/esm/src/classes/Migration.d.ts.map +0 -1
  196. package/dist/esm/src/classes/Migration.js +0 -168
  197. package/dist/esm/src/classes/Migration.js.map +0 -1
  198. package/dist/esm/src/classes/Model.d.ts +0 -159
  199. package/dist/esm/src/classes/Model.d.ts.map +0 -1
  200. package/dist/esm/src/classes/Model.js +0 -635
  201. package/dist/esm/src/classes/Model.js.map +0 -1
  202. package/dist/esm/src/classes/OneToManyRelation.d.ts +0 -38
  203. package/dist/esm/src/classes/OneToManyRelation.d.ts.map +0 -1
  204. package/dist/esm/src/classes/OneToManyRelation.js +0 -75
  205. package/dist/esm/src/classes/OneToManyRelation.js.map +0 -1
  206. package/dist/esm/src/classes/data/boys.d.ts +0 -3
  207. package/dist/esm/src/classes/data/boys.d.ts.map +0 -1
  208. package/dist/esm/src/classes/data/boys.js +0 -1003
  209. package/dist/esm/src/classes/data/boys.js.map +0 -1
  210. package/dist/esm/src/classes/data/family-names.d.ts +0 -3
  211. package/dist/esm/src/classes/data/family-names.d.ts.map +0 -1
  212. package/dist/esm/src/classes/data/family-names.js +0 -1003
  213. package/dist/esm/src/classes/data/family-names.js.map +0 -1
  214. package/dist/esm/src/classes/data/girls.d.ts +0 -3
  215. package/dist/esm/src/classes/data/girls.d.ts.map +0 -1
  216. package/dist/esm/src/classes/data/girls.js +0 -1002
  217. package/dist/esm/src/classes/data/girls.js.map +0 -1
  218. package/dist/esm/src/classes/data/streets.d.ts +0 -3
  219. package/dist/esm/src/classes/data/streets.d.ts.map +0 -1
  220. package/dist/esm/src/classes/data/streets.js +0 -294
  221. package/dist/esm/src/classes/data/streets.js.map +0 -1
  222. package/dist/esm/src/decorators/Column.d.ts +0 -18
  223. package/dist/esm/src/decorators/Column.d.ts.map +0 -1
  224. package/dist/esm/src/decorators/Column.js +0 -36
  225. package/dist/esm/src/decorators/Column.js.map +0 -1
  226. package/dist/esm/src/models/Migration.d.ts +0 -11
  227. package/dist/esm/src/models/Migration.d.ts.map +0 -1
  228. package/dist/esm/src/models/Migration.js +0 -48
  229. package/dist/esm/src/models/Migration.js.map +0 -1
  230. package/dist/esm/tsconfig.esm.tsbuildinfo +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ManyToOneRelation.d.cts","names":[],"sources":["../../../src/classes/ManyToOneRelation.ts"],"mappings":";;;cAGa,iBAAA,kCAAmD,KAAA;EAC5D,KAAA;IAAA,QAAiB,CAAA;EAAA,WAAa,KAAA;EADJ;;;EAM1B,UAAA;EAKU;;;EAAV,QAAA,EAAU,GAAA;cAEE,KAAA;IAAA,QAAiB,CAAA;EAAA,WAAa,KAAA,EAAO,QAAA,EAAU,GAAA;EAM3D,QAAA,CAAS,KAAA,EAAO,KAAA;EAKhB,KAAA,CAAM,KAAA,EAAO,KAAA;EAKb,SAAA,CAAU,UAAA,UAAoB,UAAA;EAKxB,IAAA,WAAe,KAAA,CAAA,CAAO,OAAA,EAAS,CAAA,KAAM,OAAA,EAAS,CAAA,GAAI,MAAA,CAAO,GAAA,EAAK,CAAA;AAAA"}
@@ -0,0 +1,26 @@
1
+ import { Model } from "./Model.mjs";
2
+
3
+ //#region src/classes/ManyToOneRelation.d.ts
4
+ declare class ManyToOneRelation<Key extends keyof any, M extends Model> {
5
+ model: {
6
+ new (): M;
7
+ } & typeof Model;
8
+ /**
9
+ * E.g. addressId
10
+ */
11
+ foreignKey: string;
12
+ /**
13
+ * E.g. address
14
+ */
15
+ modelKey: Key;
16
+ constructor(model: {
17
+ new (): M;
18
+ } & typeof Model, modelKey: Key);
19
+ isLoaded(model: Model): boolean;
20
+ isSet(model: Model): boolean;
21
+ joinQuery(namespaceA: string, namespaceB: string): string;
22
+ load<A extends Model>(modelsA: A[]): Promise<(A & Record<Key, M>)[]>;
23
+ }
24
+ //#endregion
25
+ export { ManyToOneRelation };
26
+ //# sourceMappingURL=ManyToOneRelation.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ManyToOneRelation.d.mts","names":[],"sources":["../../../src/classes/ManyToOneRelation.ts"],"mappings":";;;cAGa,iBAAA,kCAAmD,KAAA;EAC5D,KAAA;IAAA,QAAiB,CAAA;EAAA,WAAa,KAAA;EADJ;;;EAM1B,UAAA;EAKU;;;EAAV,QAAA,EAAU,GAAA;cAEE,KAAA;IAAA,QAAiB,CAAA;EAAA,WAAa,KAAA,EAAO,QAAA,EAAU,GAAA;EAM3D,QAAA,CAAS,KAAA,EAAO,KAAA;EAKhB,KAAA,CAAM,KAAA,EAAO,KAAA;EAKb,SAAA,CAAU,UAAA,UAAoB,UAAA;EAKxB,IAAA,WAAe,KAAA,CAAA,CAAO,OAAA,EAAS,CAAA,KAAM,OAAA,EAAS,CAAA,GAAI,MAAA,CAAO,GAAA,EAAK,CAAA;AAAA"}
@@ -0,0 +1,43 @@
1
+ import { Database } from "./Database.mjs";
2
+ //#region src/classes/ManyToOneRelation.ts
3
+ var ManyToOneRelation = class {
4
+ model;
5
+ /**
6
+ * E.g. addressId
7
+ */
8
+ foreignKey;
9
+ /**
10
+ * E.g. address
11
+ */
12
+ modelKey;
13
+ constructor(model, modelKey) {
14
+ this.model = model;
15
+ this.modelKey = modelKey;
16
+ }
17
+ isLoaded(model) {
18
+ return model[this.modelKey] !== void 0;
19
+ }
20
+ isSet(model) {
21
+ return model[this.modelKey] !== void 0 && model[this.modelKey] !== null;
22
+ }
23
+ joinQuery(namespaceA, namespaceB) {
24
+ return `LEFT JOIN ${this.model.table} as ${namespaceB} on ${namespaceB}.${this.model.primary.name} = ${namespaceA}.${this.foreignKey}\n`;
25
+ }
26
+ async load(modelsA) {
27
+ if (modelsA.length === 0) return [];
28
+ let str = `SELECT ${this.model.getDefaultSelect()} FROM ${this.model.table}\n`;
29
+ str += `WHERE ${this.model.primary.name} IN (?)`;
30
+ const [rows] = await Database.select(str, [modelsA.map((m) => m[this.foreignKey])]);
31
+ const modelsB = this.model.fromRows(rows, this.model.table);
32
+ for (const model of modelsA) {
33
+ const found = modelsB.find((m) => m.getPrimaryKey() === model[this.foreignKey]);
34
+ if (!found) throw new Error("Could not load many to one relation: no match found when loading");
35
+ model.setRelation(this, found);
36
+ }
37
+ return modelsA;
38
+ }
39
+ };
40
+ //#endregion
41
+ export { ManyToOneRelation };
42
+
43
+ //# sourceMappingURL=ManyToOneRelation.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ManyToOneRelation.mjs","names":[],"sources":["../../../src/classes/ManyToOneRelation.ts"],"sourcesContent":["import { Database } from './Database.js';\nimport { Model } from './Model.js';\n\nexport class ManyToOneRelation<Key extends keyof any, M extends Model> {\n model: { new (): M } & typeof Model;\n\n /**\n * E.g. addressId\n */\n foreignKey: string;\n\n /**\n * E.g. address\n */\n modelKey: Key;\n\n constructor(model: { new (): M } & typeof Model, modelKey: Key) {\n this.model = model;\n this.modelKey = modelKey;\n }\n\n /// Whether this relation is loaded\n isLoaded(model: Model) {\n return (model as any)[this.modelKey] !== undefined;\n }\n\n /// Whether this relation is set\n isSet(model: Model): boolean /* model is Model & Record<Key, M> */ {\n return (model as any)[this.modelKey] !== undefined && (model as any)[this.modelKey] !== null;\n }\n\n /// Generate a join query\n joinQuery(namespaceA: string, namespaceB: string): string {\n return `LEFT JOIN ${this.model.table} as ${namespaceB} on ${namespaceB}.${this.model.primary.name} = ${namespaceA}.${this.foreignKey}\\n`;\n }\n\n /// Load the relation of a list of models\n async load<A extends Model>(modelsA: A[]): Promise<(A & Record<Key, M>)[]> {\n if (modelsA.length === 0) {\n return [];\n }\n let str = `SELECT ${this.model.getDefaultSelect()} FROM ${this.model.table}\\n`;\n str += `WHERE ${this.model.primary.name} IN (?)`;\n\n const [rows] = await Database.select(str, [modelsA.map(m => m[this.foreignKey])]);\n const modelsB = this.model.fromRows(rows, this.model.table) as M[];\n\n for (const model of modelsA) {\n const found = modelsB.find(m => m.getPrimaryKey() === model[this.foreignKey]);\n if (!found) {\n throw new Error('Could not load many to one relation: no match found when loading');\n }\n model.setRelation(this, found);\n }\n return modelsA as (A & Record<Key, M>)[];\n }\n}\n"],"mappings":";;AAGA,IAAa,oBAAb,MAAuE;CACnE;;;;CAKA;;;;CAKA;CAEA,YAAY,OAAqC,UAAe;AAC5D,OAAK,QAAQ;AACb,OAAK,WAAW;;CAIpB,SAAS,OAAc;AACnB,SAAQ,MAAc,KAAK,cAAc,KAAA;;CAI7C,MAAM,OAA6D;AAC/D,SAAQ,MAAc,KAAK,cAAc,KAAA,KAAc,MAAc,KAAK,cAAc;;CAI5F,UAAU,YAAoB,YAA4B;AACtD,SAAO,aAAa,KAAK,MAAM,MAAM,MAAM,WAAW,MAAM,WAAW,GAAG,KAAK,MAAM,QAAQ,KAAK,KAAK,WAAW,GAAG,KAAK,WAAW;;CAIzI,MAAM,KAAsB,SAA+C;AACvE,MAAI,QAAQ,WAAW,EACnB,QAAO,EAAE;EAEb,IAAI,MAAM,UAAU,KAAK,MAAM,kBAAkB,CAAC,QAAQ,KAAK,MAAM,MAAM;AAC3E,SAAO,SAAS,KAAK,MAAM,QAAQ,KAAK;EAExC,MAAM,CAAC,QAAQ,MAAM,SAAS,OAAO,KAAK,CAAC,QAAQ,KAAI,MAAK,EAAE,KAAK,YAAY,CAAC,CAAC;EACjF,MAAM,UAAU,KAAK,MAAM,SAAS,MAAM,KAAK,MAAM,MAAM;AAE3D,OAAK,MAAM,SAAS,SAAS;GACzB,MAAM,QAAQ,QAAQ,MAAK,MAAK,EAAE,eAAe,KAAK,MAAM,KAAK,YAAY;AAC7E,OAAI,CAAC,MACD,OAAM,IAAI,MAAM,mEAAmE;AAEvF,SAAM,YAAY,MAAM,MAAM;;AAElC,SAAO"}
@@ -0,0 +1,123 @@
1
+ require("../../_virtual/_rolldown/runtime.cjs");
2
+ const require_Database = require("./Database.cjs");
3
+ const require_Migration = require("../models/Migration.cjs");
4
+ let fs = require("fs");
5
+ let _simonbackx_simple_logging = require("@simonbackx/simple-logging");
6
+ let node_path = require("node:path");
7
+ let node_url = require("node:url");
8
+ //#region src/classes/Migration.ts
9
+ function getDirname() {
10
+ if (typeof __dirname !== "undefined") return __dirname;
11
+ if (require("url").pathToFileURL(__filename).href) return (0, node_path.dirname)((0, node_url.fileURLToPath)(require("url").pathToFileURL(__filename).href));
12
+ throw new Error("Cannot determine __dirname");
13
+ }
14
+ async function fileExists(file) {
15
+ try {
16
+ await fs.promises.access(file);
17
+ return true;
18
+ } catch (e) {
19
+ return false;
20
+ }
21
+ }
22
+ async function getProjectRoot() {
23
+ let path = getDirname();
24
+ for (let index = 0; index < 5; index++) {
25
+ if (await fileExists(path + "/migrations")) return path;
26
+ path += "/..";
27
+ }
28
+ throw new Error("Could not find migrations root");
29
+ }
30
+ async function directoryExists(filePath) {
31
+ try {
32
+ return (await fs.promises.stat(filePath)).isDirectory();
33
+ } catch (err) {
34
+ return false;
35
+ }
36
+ }
37
+ var Migration = class Migration {
38
+ up;
39
+ down;
40
+ constructor(up, down) {
41
+ this.up = up;
42
+ this.down = down;
43
+ }
44
+ /***
45
+ * Given a folder, loop all the folders in that folder and run the migrations in the 'migrations' folder
46
+ */
47
+ static async runAll(folder) {
48
+ const shared = getDirname().split("/").filter((part, index) => part === folder.split("/")[index]).join("/");
49
+ const cwd = folder.replace(shared, "");
50
+ _simonbackx_simple_logging.logger.log(new _simonbackx_simple_logging.StyledText("[Migration]").addClass("migration", "prefix").addTag("migration"), " ", new _simonbackx_simple_logging.StyledText("Running all... ").addClass("migration", "runAll"), new _simonbackx_simple_logging.StyledText(cwd).addClass("migration", "folder").addStyle("dim"));
51
+ process.env.DB_MULTIPLE_STATEMENTS = "true";
52
+ const projectRoot = await getProjectRoot();
53
+ const setupMigration = await this.getMigration(projectRoot + "/migrations/000000000-setup-migrations.sql");
54
+ if (!setupMigration) throw new Error("Setup migration missing");
55
+ await setupMigration.up();
56
+ await require_Migration.Migration.markAsExecuted("000000000-setup-migrations.sql");
57
+ const parts = folder.split("/");
58
+ const firstPart = parts.shift();
59
+ if (firstPart === void 0) throw new Error("Invalid folder path");
60
+ let folderQueue = [firstPart];
61
+ const migrations = [];
62
+ for (const part of parts) if (part === "*") {
63
+ const newQueue = [];
64
+ for (folder of folderQueue) {
65
+ const recursiveFolders = (await fs.promises.readdir(folder, { withFileTypes: true })).filter((dirent) => dirent.isDirectory()).map((dirent) => folder + "/" + dirent.name);
66
+ newQueue.push(...recursiveFolders);
67
+ }
68
+ folderQueue = newQueue;
69
+ } else folderQueue = folderQueue.map((folder) => folder + "/" + part);
70
+ for (const p of folderQueue) if (await directoryExists(p)) {
71
+ const folderFiles = await fs.promises.readdir(p);
72
+ for (const file of folderFiles) {
73
+ const full = p + "/" + file;
74
+ const name = file;
75
+ if (!await require_Migration.Migration.isExecuted(name)) migrations.push([name, full]);
76
+ }
77
+ }
78
+ migrations.sort((a, b) => {
79
+ if (a < b) return -1;
80
+ if (a > b) return 1;
81
+ return 0;
82
+ });
83
+ for (const [name, file] of migrations) {
84
+ const migration = await this.getMigration(file);
85
+ if (!migration) continue;
86
+ _simonbackx_simple_logging.logger.log(new _simonbackx_simple_logging.StyledText("[Migration]").addClass("migration", "prefix").addTag("migration"), " ", new _simonbackx_simple_logging.StyledText("Running ").addClass("migration", "start"), new _simonbackx_simple_logging.StyledText(name).addClass("migration", "start", "name"));
87
+ try {
88
+ await _simonbackx_simple_logging.logger.setContext({
89
+ prefixes: [new _simonbackx_simple_logging.StyledText("[Migration]").addClass("migration", "prefix"), " "],
90
+ tags: ["migration"]
91
+ }, async () => {
92
+ await migration.up();
93
+ await require_Migration.Migration.markAsExecuted(name);
94
+ });
95
+ _simonbackx_simple_logging.logger.log(new _simonbackx_simple_logging.StyledText("[Migration]").addClass("migration", "prefix").addTag("migration"), " ", new _simonbackx_simple_logging.StyledText("✓").addClass("migration", "success", "tag"), " ", new _simonbackx_simple_logging.StyledText("Migration " + name + " ran successfully").addClass("migration", "success", "text"));
96
+ } catch (e) {
97
+ _simonbackx_simple_logging.logger.error(new _simonbackx_simple_logging.StyledText("[Migration]").addClass("migration", "prefix").addTag("migration"), " ", new _simonbackx_simple_logging.StyledText("✗").addClass("migration", "failed", "tag"), " ", new _simonbackx_simple_logging.StyledText("Migration " + name + " failed").addClass("migration", "failed", "text"), " ", new _simonbackx_simple_logging.StyledText(e).addClass("migration", "failed", "error"));
98
+ return false;
99
+ }
100
+ }
101
+ _simonbackx_simple_logging.logger.log(new _simonbackx_simple_logging.StyledText("[Migration]").addClass("migration", "prefix").addTag("migration"), " ", new _simonbackx_simple_logging.StyledText("✨").addClass("migration", "success", "tag", "all"), " ", new _simonbackx_simple_logging.StyledText("All migrations done").addClass("migration", "success", "text", "all"));
102
+ return true;
103
+ }
104
+ static async getMigration(file) {
105
+ let migration;
106
+ if (file.endsWith(".sql")) {
107
+ if (file.endsWith(".down.sql")) return;
108
+ const sqlStatement = await fs.promises.readFile(file, { encoding: "utf-8" });
109
+ migration = new Migration(async () => {
110
+ await require_Database.Database.statement(sqlStatement);
111
+ });
112
+ } else {
113
+ if (file.includes(".test.")) return;
114
+ if (file.endsWith(".d.ts")) return;
115
+ if (!file.endsWith(".ts") && !file.endsWith(".js")) return;
116
+ migration = (await import(file)).default;
117
+ }
118
+ return migration;
119
+ }
120
+ };
121
+ //#endregion
122
+ exports.Migration = Migration;
123
+ exports.fileExists = fileExists;
@@ -0,0 +1,16 @@
1
+ //#region src/classes/Migration.d.ts
2
+ declare function fileExists(file: string): Promise<boolean>;
3
+ type MigrationFunction = () => Promise<void>;
4
+ declare class Migration {
5
+ up: MigrationFunction;
6
+ down: MigrationFunction | undefined;
7
+ constructor(up: MigrationFunction, down?: MigrationFunction);
8
+ /***
9
+ * Given a folder, loop all the folders in that folder and run the migrations in the 'migrations' folder
10
+ */
11
+ static runAll(folder: string): Promise<boolean>;
12
+ static getMigration(file: string): Promise<Migration | undefined>;
13
+ }
14
+ //#endregion
15
+ export { Migration, fileExists };
16
+ //# sourceMappingURL=Migration.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Migration.d.cts","names":[],"sources":["../../../src/classes/Migration.ts"],"mappings":";iBAuBsB,UAAA,CAAW,IAAA,WAAe,OAAA;AAAA,KAqB3C,iBAAA,SAA0B,OAAA;AAAA,cAWlB,SAAA;EACT,EAAA,EAAI,iBAAA;EACJ,IAAA,EAAM,iBAAA;cAEM,EAAA,EAAI,iBAAA,EAAmB,IAAA,GAAO,iBAAA;EAfzC;;;EAAA,OAuBY,MAAA,CAAO,MAAA,WAAiB,OAAA;EAAA,OA8HxB,YAAA,CAAa,IAAA,WAAe,OAAA,CAAQ,SAAA;AAAA"}
@@ -0,0 +1,16 @@
1
+ //#region src/classes/Migration.d.ts
2
+ declare function fileExists(file: string): Promise<boolean>;
3
+ type MigrationFunction = () => Promise<void>;
4
+ declare class Migration {
5
+ up: MigrationFunction;
6
+ down: MigrationFunction | undefined;
7
+ constructor(up: MigrationFunction, down?: MigrationFunction);
8
+ /***
9
+ * Given a folder, loop all the folders in that folder and run the migrations in the 'migrations' folder
10
+ */
11
+ static runAll(folder: string): Promise<boolean>;
12
+ static getMigration(file: string): Promise<Migration | undefined>;
13
+ }
14
+ //#endregion
15
+ export { Migration, fileExists };
16
+ //# sourceMappingURL=Migration.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Migration.d.mts","names":[],"sources":["../../../src/classes/Migration.ts"],"mappings":";iBAuBsB,UAAA,CAAW,IAAA,WAAe,OAAA;AAAA,KAqB3C,iBAAA,SAA0B,OAAA;AAAA,cAWlB,SAAA;EACT,EAAA,EAAI,iBAAA;EACJ,IAAA,EAAM,iBAAA;cAEM,EAAA,EAAI,iBAAA,EAAmB,IAAA,GAAO,iBAAA;EAfzC;;;EAAA,OAuBY,MAAA,CAAO,MAAA,WAAiB,OAAA;EAAA,OA8HxB,YAAA,CAAa,IAAA,WAAe,OAAA,CAAQ,SAAA;AAAA"}
@@ -0,0 +1,123 @@
1
+ import { Database } from "./Database.mjs";
2
+ import { Migration as Migration$1 } from "../models/Migration.mjs";
3
+ import { promises } from "fs";
4
+ import { StyledText, logger } from "@simonbackx/simple-logging";
5
+ import { dirname } from "node:path";
6
+ import { fileURLToPath } from "node:url";
7
+ //#region src/classes/Migration.ts
8
+ function getDirname() {
9
+ if (typeof __dirname !== "undefined") return __dirname;
10
+ if (typeof import.meta !== "undefined" && import.meta.url) return dirname(fileURLToPath(import.meta.url));
11
+ throw new Error("Cannot determine __dirname");
12
+ }
13
+ async function fileExists(file) {
14
+ try {
15
+ await promises.access(file);
16
+ return true;
17
+ } catch (e) {
18
+ return false;
19
+ }
20
+ }
21
+ async function getProjectRoot() {
22
+ let path = getDirname();
23
+ for (let index = 0; index < 5; index++) {
24
+ if (await fileExists(path + "/migrations")) return path;
25
+ path += "/..";
26
+ }
27
+ throw new Error("Could not find migrations root");
28
+ }
29
+ async function directoryExists(filePath) {
30
+ try {
31
+ return (await promises.stat(filePath)).isDirectory();
32
+ } catch (err) {
33
+ return false;
34
+ }
35
+ }
36
+ var Migration = class Migration {
37
+ up;
38
+ down;
39
+ constructor(up, down) {
40
+ this.up = up;
41
+ this.down = down;
42
+ }
43
+ /***
44
+ * Given a folder, loop all the folders in that folder and run the migrations in the 'migrations' folder
45
+ */
46
+ static async runAll(folder) {
47
+ const shared = getDirname().split("/").filter((part, index) => part === folder.split("/")[index]).join("/");
48
+ const cwd = folder.replace(shared, "");
49
+ logger.log(new StyledText("[Migration]").addClass("migration", "prefix").addTag("migration"), " ", new StyledText("Running all... ").addClass("migration", "runAll"), new StyledText(cwd).addClass("migration", "folder").addStyle("dim"));
50
+ process.env.DB_MULTIPLE_STATEMENTS = "true";
51
+ const projectRoot = await getProjectRoot();
52
+ const setupMigration = await this.getMigration(projectRoot + "/migrations/000000000-setup-migrations.sql");
53
+ if (!setupMigration) throw new Error("Setup migration missing");
54
+ await setupMigration.up();
55
+ await Migration$1.markAsExecuted("000000000-setup-migrations.sql");
56
+ const parts = folder.split("/");
57
+ const firstPart = parts.shift();
58
+ if (firstPart === void 0) throw new Error("Invalid folder path");
59
+ let folderQueue = [firstPart];
60
+ const migrations = [];
61
+ for (const part of parts) if (part === "*") {
62
+ const newQueue = [];
63
+ for (folder of folderQueue) {
64
+ const recursiveFolders = (await promises.readdir(folder, { withFileTypes: true })).filter((dirent) => dirent.isDirectory()).map((dirent) => folder + "/" + dirent.name);
65
+ newQueue.push(...recursiveFolders);
66
+ }
67
+ folderQueue = newQueue;
68
+ } else folderQueue = folderQueue.map((folder) => folder + "/" + part);
69
+ for (const p of folderQueue) if (await directoryExists(p)) {
70
+ const folderFiles = await promises.readdir(p);
71
+ for (const file of folderFiles) {
72
+ const full = p + "/" + file;
73
+ const name = file;
74
+ if (!await Migration$1.isExecuted(name)) migrations.push([name, full]);
75
+ }
76
+ }
77
+ migrations.sort((a, b) => {
78
+ if (a < b) return -1;
79
+ if (a > b) return 1;
80
+ return 0;
81
+ });
82
+ for (const [name, file] of migrations) {
83
+ const migration = await this.getMigration(file);
84
+ if (!migration) continue;
85
+ logger.log(new StyledText("[Migration]").addClass("migration", "prefix").addTag("migration"), " ", new StyledText("Running ").addClass("migration", "start"), new StyledText(name).addClass("migration", "start", "name"));
86
+ try {
87
+ await logger.setContext({
88
+ prefixes: [new StyledText("[Migration]").addClass("migration", "prefix"), " "],
89
+ tags: ["migration"]
90
+ }, async () => {
91
+ await migration.up();
92
+ await Migration$1.markAsExecuted(name);
93
+ });
94
+ logger.log(new StyledText("[Migration]").addClass("migration", "prefix").addTag("migration"), " ", new StyledText("✓").addClass("migration", "success", "tag"), " ", new StyledText("Migration " + name + " ran successfully").addClass("migration", "success", "text"));
95
+ } catch (e) {
96
+ logger.error(new StyledText("[Migration]").addClass("migration", "prefix").addTag("migration"), " ", new StyledText("✗").addClass("migration", "failed", "tag"), " ", new StyledText("Migration " + name + " failed").addClass("migration", "failed", "text"), " ", new StyledText(e).addClass("migration", "failed", "error"));
97
+ return false;
98
+ }
99
+ }
100
+ logger.log(new StyledText("[Migration]").addClass("migration", "prefix").addTag("migration"), " ", new StyledText("✨").addClass("migration", "success", "tag", "all"), " ", new StyledText("All migrations done").addClass("migration", "success", "text", "all"));
101
+ return true;
102
+ }
103
+ static async getMigration(file) {
104
+ let migration;
105
+ if (file.endsWith(".sql")) {
106
+ if (file.endsWith(".down.sql")) return;
107
+ const sqlStatement = await promises.readFile(file, { encoding: "utf-8" });
108
+ migration = new Migration(async () => {
109
+ await Database.statement(sqlStatement);
110
+ });
111
+ } else {
112
+ if (file.includes(".test.")) return;
113
+ if (file.endsWith(".d.ts")) return;
114
+ if (!file.endsWith(".ts") && !file.endsWith(".js")) return;
115
+ migration = (await import(file)).default;
116
+ }
117
+ return migration;
118
+ }
119
+ };
120
+ //#endregion
121
+ export { Migration, fileExists };
122
+
123
+ //# sourceMappingURL=Migration.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Migration.mjs","names":["fs","MigrationModel"],"sources":["../../../src/classes/Migration.ts"],"sourcesContent":["import { promises as fs } from 'fs';\n\nimport { Migration as MigrationModel } from '../models/Migration.js';\nimport { Database } from './Database.js';\nimport { logger, StyledText } from '@simonbackx/simple-logging';\nimport { dirname } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nfunction getDirname(): string {\n // CJS environment\n if (typeof __dirname !== 'undefined') {\n return __dirname;\n }\n\n // ESM environment\n // @ts-ignore\n if (typeof import.meta !== 'undefined' && import.meta.url) {\n // @ts-ignore\n return dirname(fileURLToPath(import.meta.url));\n }\n throw new Error('Cannot determine __dirname');\n}\n\nexport async function fileExists(file: string): Promise<boolean> {\n try {\n await fs.access(file);\n return true;\n }\n catch (e) {\n return false;\n }\n}\n\nasync function getProjectRoot() {\n let path = getDirname();\n for (let index = 0; index < 5; index++) {\n if (await fileExists(path + '/migrations')) {\n return path;\n }\n path += '/..';\n }\n throw new Error('Could not find migrations root');\n}\n\ntype MigrationFunction = () => Promise<void>;\n\nasync function directoryExists(filePath: string): Promise<boolean> {\n try {\n return (await fs.stat(filePath)).isDirectory();\n }\n catch (err) {\n return false;\n }\n}\n\nexport class Migration {\n up: MigrationFunction;\n down: MigrationFunction | undefined;\n\n constructor(up: MigrationFunction, down?: MigrationFunction) {\n this.up = up;\n this.down = down;\n }\n\n /***\n * Given a folder, loop all the folders in that folder and run the migrations in the 'migrations' folder\n */\n static async runAll(folder: string): Promise<boolean> {\n const dirname = getDirname();\n\n // Get the current working directory by removing shared part of folder and dirname\n const shared = dirname.split('/').filter((part, index) => part === folder.split('/')[index]).join('/');\n const cwd = folder.replace(shared, '');\n\n logger.log(\n new StyledText('[Migration]').addClass('migration', 'prefix').addTag('migration'),\n ' ',\n new StyledText('Running all... ').addClass('migration', 'runAll'),\n new StyledText(cwd).addClass('migration', 'folder').addStyle('dim'),\n );\n\n process.env.DB_MULTIPLE_STATEMENTS = 'true';\n\n // First check if we have migrations table\n const projectRoot = await getProjectRoot();\n const setupMigration = await this.getMigration(projectRoot + '/migrations/000000000-setup-migrations.sql');\n if (!setupMigration) {\n throw new Error('Setup migration missing');\n }\n await setupMigration.up();\n await MigrationModel.markAsExecuted('000000000-setup-migrations.sql');\n\n const parts = folder.split('/');\n const firstPart = parts.shift();\n if (firstPart === undefined) {\n throw new Error('Invalid folder path');\n }\n let folderQueue: string[] = [firstPart];\n const migrations: [string, string][] = [];\n\n for (const part of parts) {\n if (part === '*') {\n const newQueue: string[] = [];\n for (folder of folderQueue) {\n // Read all directories\n const recursiveFolders = (await fs.readdir(folder, { withFileTypes: true })).filter(dirent => dirent.isDirectory()).map(dirent => folder + '/' + dirent.name);\n newQueue.push(...recursiveFolders);\n }\n folderQueue = newQueue;\n }\n else {\n folderQueue = folderQueue.map(folder => folder + '/' + part);\n }\n }\n\n for (const p of folderQueue) {\n if (await directoryExists(p)) {\n const folderFiles = await fs.readdir(p);\n\n for (const file of folderFiles) {\n const full = p + '/' + file;\n const name = file;\n if (!(await MigrationModel.isExecuted(name))) {\n migrations.push([name, full]);\n }\n }\n }\n }\n\n // Make sure we run the migrations in order\n migrations.sort((a, b) => {\n // It is expected to return a negative value if first argument is less than second argument, zero if they're equal and a positive value otherwise. If omitted, the elements are sorted in ascending, ASCII character order.\n if (a < b) return -1;\n if (a > b) return 1;\n return 0;\n });\n\n for (const [name, file] of migrations) {\n // Check if SQL or TypeScript\n const migration = await this.getMigration(file);\n if (!migration) {\n continue;\n }\n\n logger.log(\n new StyledText('[Migration]').addClass('migration', 'prefix').addTag('migration'),\n ' ',\n new StyledText('Running ').addClass('migration', 'start'),\n new StyledText(name).addClass('migration', 'start', 'name'),\n );\n\n try {\n await logger.setContext({\n prefixes: [new StyledText('[Migration]').addClass('migration', 'prefix'), ' '],\n tags: ['migration'],\n }, async () => {\n await migration.up();\n await MigrationModel.markAsExecuted(name);\n });\n\n logger.log(\n new StyledText('[Migration]').addClass('migration', 'prefix').addTag('migration'),\n ' ',\n new StyledText('✓').addClass('migration', 'success', 'tag'),\n ' ',\n new StyledText('Migration ' + name + ' ran successfully').addClass('migration', 'success', 'text'),\n );\n }\n catch (e) {\n // Logger.errorWithContext({textColor: ['dim', 'red'], prefix: ' FAILED ', addSpace: true, prefixColor: ['bgRed']}, \"Migration \" + name + \" failed\", e)\n logger.error(\n new StyledText('[Migration]').addClass('migration', 'prefix').addTag('migration'),\n ' ',\n new StyledText('✗').addClass('migration', 'failed', 'tag'),\n ' ',\n new StyledText('Migration ' + name + ' failed').addClass('migration', 'failed', 'text'),\n ' ',\n new StyledText(e).addClass('migration', 'failed', 'error'),\n );\n return false;\n }\n }\n\n logger.log(\n new StyledText('[Migration]').addClass('migration', 'prefix').addTag('migration'),\n ' ',\n new StyledText('✨').addClass('migration', 'success', 'tag', 'all'),\n ' ',\n new StyledText('All migrations done').addClass('migration', 'success', 'text', 'all'),\n );\n return true;\n }\n\n static async getMigration(file: string): Promise<Migration | undefined> {\n let migration: Migration;\n if (file.endsWith('.sql')) {\n if (file.endsWith('.down.sql')) {\n // Ignore. This will contain the downgrade implementation.\n return;\n }\n const sqlStatement = await fs.readFile(file, { encoding: 'utf-8' });\n\n migration = new Migration(async () => {\n await Database.statement(sqlStatement);\n });\n }\n else {\n if (file.includes('.test.')) {\n return;\n }\n if (file.endsWith('.d.ts')) {\n return;\n }\n if (!file.endsWith('.ts') && !file.endsWith('.js')) {\n return;\n }\n\n const imported = await import(file);\n migration = imported.default;\n }\n return migration;\n }\n}\n"],"mappings":"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"}