@skalfa/skalfa-api-core 1.0.2

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 (249) hide show
  1. package/.github/workflows/publish.yml +40 -0
  2. package/dist/auth/auth.d.ts +19 -0
  3. package/dist/auth/auth.js +227 -0
  4. package/dist/auth/auth.js.map +1 -0
  5. package/dist/auth/index.d.ts +1 -0
  6. package/dist/auth/index.js +2 -0
  7. package/dist/auth/index.js.map +1 -0
  8. package/dist/auth.util.d.ts +19 -0
  9. package/dist/auth.util.js +183 -0
  10. package/dist/auth.util.js.map +1 -0
  11. package/dist/commands/cli.d.ts +1 -0
  12. package/dist/commands/cli.js +78 -0
  13. package/dist/commands/cli.js.map +1 -0
  14. package/dist/commands/make/basic-controller.d.ts +2 -0
  15. package/dist/commands/make/basic-controller.js +40 -0
  16. package/dist/commands/make/basic-controller.js.map +1 -0
  17. package/dist/commands/make/basic-migration.d.ts +5 -0
  18. package/dist/commands/make/basic-migration.js +60 -0
  19. package/dist/commands/make/basic-migration.js.map +1 -0
  20. package/dist/commands/make/basic-model.d.ts +2 -0
  21. package/dist/commands/make/basic-model.js +25 -0
  22. package/dist/commands/make/basic-model.js.map +1 -0
  23. package/dist/commands/make/basic-seeder.d.ts +3 -0
  24. package/dist/commands/make/basic-seeder.js +32 -0
  25. package/dist/commands/make/basic-seeder.js.map +1 -0
  26. package/dist/commands/make/blueprint.d.ts +2 -0
  27. package/dist/commands/make/blueprint.js +29 -0
  28. package/dist/commands/make/blueprint.js.map +1 -0
  29. package/dist/commands/make/da-migration.d.ts +5 -0
  30. package/dist/commands/make/da-migration.js +60 -0
  31. package/dist/commands/make/da-migration.js.map +1 -0
  32. package/dist/commands/make/light-controller.d.ts +3 -0
  33. package/dist/commands/make/light-controller.js +54 -0
  34. package/dist/commands/make/light-controller.js.map +1 -0
  35. package/dist/commands/make/light-model.d.ts +3 -0
  36. package/dist/commands/make/light-model.js +50 -0
  37. package/dist/commands/make/light-model.js.map +1 -0
  38. package/dist/commands/make/mail.d.ts +2 -0
  39. package/dist/commands/make/mail.js +41 -0
  40. package/dist/commands/make/mail.js.map +1 -0
  41. package/dist/commands/make/notification.d.ts +2 -0
  42. package/dist/commands/make/notification.js +33 -0
  43. package/dist/commands/make/notification.js.map +1 -0
  44. package/dist/commands/make/queue.d.ts +2 -0
  45. package/dist/commands/make/queue.js +35 -0
  46. package/dist/commands/make/queue.js.map +1 -0
  47. package/dist/commands/runner/barrels.d.ts +3 -0
  48. package/dist/commands/runner/barrels.js +78 -0
  49. package/dist/commands/runner/barrels.js.map +1 -0
  50. package/dist/commands/runner/blueprint/controller-generation.d.ts +1 -0
  51. package/dist/commands/runner/blueprint/controller-generation.js +147 -0
  52. package/dist/commands/runner/blueprint/controller-generation.js.map +1 -0
  53. package/dist/commands/runner/blueprint/documentation-generation.d.ts +6 -0
  54. package/dist/commands/runner/blueprint/documentation-generation.js +337 -0
  55. package/dist/commands/runner/blueprint/documentation-generation.js.map +1 -0
  56. package/dist/commands/runner/blueprint/migration-generation.d.ts +1 -0
  57. package/dist/commands/runner/blueprint/migration-generation.js +120 -0
  58. package/dist/commands/runner/blueprint/migration-generation.js.map +1 -0
  59. package/dist/commands/runner/blueprint/model-generation.d.ts +1 -0
  60. package/dist/commands/runner/blueprint/model-generation.js +122 -0
  61. package/dist/commands/runner/blueprint/model-generation.js.map +1 -0
  62. package/dist/commands/runner/blueprint/runner.d.ts +23 -0
  63. package/dist/commands/runner/blueprint/runner.js +139 -0
  64. package/dist/commands/runner/blueprint/runner.js.map +1 -0
  65. package/dist/commands/runner/blueprint/seeder-generation.d.ts +1 -0
  66. package/dist/commands/runner/blueprint/seeder-generation.js +40 -0
  67. package/dist/commands/runner/blueprint/seeder-generation.js.map +1 -0
  68. package/dist/commands/runner/da-migration.d.ts +39 -0
  69. package/dist/commands/runner/da-migration.js +262 -0
  70. package/dist/commands/runner/da-migration.js.map +1 -0
  71. package/dist/commands/runner/migration.d.ts +11 -0
  72. package/dist/commands/runner/migration.js +188 -0
  73. package/dist/commands/runner/migration.js.map +1 -0
  74. package/dist/commands/runner/seeder.d.ts +3 -0
  75. package/dist/commands/runner/seeder.js +40 -0
  76. package/dist/commands/runner/seeder.js.map +1 -0
  77. package/dist/commands/stubs/index.d.ts +14 -0
  78. package/dist/commands/stubs/index.js +277 -0
  79. package/dist/commands/stubs/index.js.map +1 -0
  80. package/dist/context/context.d.ts +7 -0
  81. package/dist/context/context.js +11 -0
  82. package/dist/context/context.js.map +1 -0
  83. package/dist/context/index.d.ts +1 -0
  84. package/dist/context/index.js +2 -0
  85. package/dist/context/index.js.map +1 -0
  86. package/dist/context.util.d.ts +7 -0
  87. package/dist/context.util.js +11 -0
  88. package/dist/context.util.js.map +1 -0
  89. package/dist/controller/controller.d.ts +118 -0
  90. package/dist/controller/controller.js +147 -0
  91. package/dist/controller/controller.js.map +1 -0
  92. package/dist/controller/index.d.ts +1 -0
  93. package/dist/controller/index.js +2 -0
  94. package/dist/controller/index.js.map +1 -0
  95. package/dist/controller.util.d.ts +118 -0
  96. package/dist/controller.util.js +144 -0
  97. package/dist/controller.util.js.map +1 -0
  98. package/dist/conversion/conversion.d.ts +8 -0
  99. package/dist/conversion/conversion.js +52 -0
  100. package/dist/conversion/conversion.js.map +1 -0
  101. package/dist/conversion/index.d.ts +1 -0
  102. package/dist/conversion/index.js +2 -0
  103. package/dist/conversion/index.js.map +1 -0
  104. package/dist/conversion.util.d.ts +8 -0
  105. package/dist/conversion.util.js +52 -0
  106. package/dist/conversion.util.js.map +1 -0
  107. package/dist/db/db.d.ts +84 -0
  108. package/dist/db/db.js +177 -0
  109. package/dist/db/db.js.map +1 -0
  110. package/dist/db/index.d.ts +1 -0
  111. package/dist/db/index.js +2 -0
  112. package/dist/db/index.js.map +1 -0
  113. package/dist/db.util.d.ts +84 -0
  114. package/dist/db.util.js +177 -0
  115. package/dist/db.util.js.map +1 -0
  116. package/dist/index.d.ts +21 -0
  117. package/dist/index.js +14 -0
  118. package/dist/index.js.map +1 -0
  119. package/dist/logger/index.d.ts +1 -0
  120. package/dist/logger/index.js +2 -0
  121. package/dist/logger/index.js.map +1 -0
  122. package/dist/logger/logger.d.ts +30 -0
  123. package/dist/logger/logger.js +126 -0
  124. package/dist/logger/logger.js.map +1 -0
  125. package/dist/logger.util.d.ts +30 -0
  126. package/dist/logger.util.js +126 -0
  127. package/dist/logger.util.js.map +1 -0
  128. package/dist/mail/index.d.ts +1 -0
  129. package/dist/mail/index.js +2 -0
  130. package/dist/mail/index.js.map +1 -0
  131. package/dist/mail/mail.d.ts +21 -0
  132. package/dist/mail/mail.js +53 -0
  133. package/dist/mail/mail.js.map +1 -0
  134. package/dist/mail.util.d.ts +21 -0
  135. package/dist/mail.util.js +53 -0
  136. package/dist/mail.util.js.map +1 -0
  137. package/dist/middleware/index.d.ts +1 -0
  138. package/dist/middleware/index.js +2 -0
  139. package/dist/middleware/index.js.map +1 -0
  140. package/dist/middleware/middleware.d.ts +263 -0
  141. package/dist/middleware/middleware.js +233 -0
  142. package/dist/middleware/middleware.js.map +1 -0
  143. package/dist/middleware.util.d.ts +263 -0
  144. package/dist/middleware.util.js +233 -0
  145. package/dist/middleware.util.js.map +1 -0
  146. package/dist/model/index.d.ts +3 -0
  147. package/dist/model/index.js +4 -0
  148. package/dist/model/index.js.map +1 -0
  149. package/dist/model/model.d.ts +204 -0
  150. package/dist/model/model.js +1495 -0
  151. package/dist/model/model.js.map +1 -0
  152. package/dist/model.util.d.ts +204 -0
  153. package/dist/model.util.js +1495 -0
  154. package/dist/model.util.js.map +1 -0
  155. package/dist/permission/index.d.ts +1 -0
  156. package/dist/permission/index.js +2 -0
  157. package/dist/permission/index.js.map +1 -0
  158. package/dist/permission/permission.d.ts +38 -0
  159. package/dist/permission/permission.js +91 -0
  160. package/dist/permission/permission.js.map +1 -0
  161. package/dist/permission.util.d.ts +38 -0
  162. package/dist/permission.util.js +91 -0
  163. package/dist/permission.util.js.map +1 -0
  164. package/dist/registry/index.d.ts +1 -0
  165. package/dist/registry/index.js +2 -0
  166. package/dist/registry/index.js.map +1 -0
  167. package/dist/registry/registry.d.ts +28 -0
  168. package/dist/registry/registry.js +19 -0
  169. package/dist/registry/registry.js.map +1 -0
  170. package/dist/registry.util.d.ts +28 -0
  171. package/dist/registry.util.js +19 -0
  172. package/dist/registry.util.js.map +1 -0
  173. package/dist/route/index.d.ts +1 -0
  174. package/dist/route/index.js +2 -0
  175. package/dist/route/index.js.map +1 -0
  176. package/dist/route/route.d.ts +1 -0
  177. package/dist/route/route.js +12 -0
  178. package/dist/route/route.js.map +1 -0
  179. package/dist/route.util.d.ts +1 -0
  180. package/dist/route.util.js +12 -0
  181. package/dist/route.util.js.map +1 -0
  182. package/dist/storage/index.d.ts +1 -0
  183. package/dist/storage/index.js +2 -0
  184. package/dist/storage/index.js.map +1 -0
  185. package/dist/storage/storage.d.ts +56 -0
  186. package/dist/storage/storage.js +86 -0
  187. package/dist/storage/storage.js.map +1 -0
  188. package/dist/storage.util.d.ts +56 -0
  189. package/dist/storage.util.js +82 -0
  190. package/dist/storage.util.js.map +1 -0
  191. package/dist/validation/index.d.ts +1 -0
  192. package/dist/validation/index.js +2 -0
  193. package/dist/validation/index.js.map +1 -0
  194. package/dist/validation/validation.d.ts +7 -0
  195. package/dist/validation/validation.js +245 -0
  196. package/dist/validation/validation.js.map +1 -0
  197. package/dist/validation.util.d.ts +7 -0
  198. package/dist/validation.util.js +237 -0
  199. package/dist/validation.util.js.map +1 -0
  200. package/package.json +34 -0
  201. package/src/auth/auth.ts +282 -0
  202. package/src/auth/index.ts +1 -0
  203. package/src/commands/cli.ts +89 -0
  204. package/src/commands/make/basic-controller.ts +49 -0
  205. package/src/commands/make/basic-migration.ts +89 -0
  206. package/src/commands/make/basic-model.ts +32 -0
  207. package/src/commands/make/basic-seeder.ts +38 -0
  208. package/src/commands/make/blueprint.ts +36 -0
  209. package/src/commands/make/da-migration.ts +90 -0
  210. package/src/commands/make/light-controller.ts +67 -0
  211. package/src/commands/make/light-model.ts +61 -0
  212. package/src/commands/make/mail.ts +51 -0
  213. package/src/commands/make/notification.ts +43 -0
  214. package/src/commands/make/queue.ts +45 -0
  215. package/src/commands/runner/barrels.ts +85 -0
  216. package/src/commands/runner/blueprint/controller-generation.ts +194 -0
  217. package/src/commands/runner/blueprint/documentation-generation.ts +463 -0
  218. package/src/commands/runner/blueprint/migration-generation.ts +153 -0
  219. package/src/commands/runner/blueprint/model-generation.ts +149 -0
  220. package/src/commands/runner/blueprint/runner.ts +181 -0
  221. package/src/commands/runner/blueprint/seeder-generation.ts +55 -0
  222. package/src/commands/runner/da-migration.ts +333 -0
  223. package/src/commands/runner/migration.ts +245 -0
  224. package/src/commands/runner/seeder.ts +44 -0
  225. package/src/commands/stubs/index.ts +289 -0
  226. package/src/context/context.ts +17 -0
  227. package/src/context/index.ts +1 -0
  228. package/src/controller/controller.ts +240 -0
  229. package/src/controller/index.ts +1 -0
  230. package/src/conversion/conversion.ts +65 -0
  231. package/src/conversion/index.ts +1 -0
  232. package/src/index.ts +22 -0
  233. package/src/logger/index.ts +1 -0
  234. package/src/logger/logger.ts +177 -0
  235. package/src/mail/index.ts +1 -0
  236. package/src/mail/mail.ts +86 -0
  237. package/src/middleware/index.ts +1 -0
  238. package/src/middleware/middleware.ts +289 -0
  239. package/src/permission/index.ts +1 -0
  240. package/src/permission/permission.ts +136 -0
  241. package/src/registry/index.ts +1 -0
  242. package/src/registry/registry.ts +37 -0
  243. package/src/route/index.ts +1 -0
  244. package/src/route/route.ts +12 -0
  245. package/src/storage/index.ts +1 -0
  246. package/src/storage/storage.ts +107 -0
  247. package/src/validation/index.ts +1 -0
  248. package/src/validation/validation.ts +346 -0
  249. package/tsconfig.json +23 -0
@@ -0,0 +1,262 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import { Command } from "commander";
4
+ import { logger } from "@utils";
5
+ // @ts-ignore
6
+ import * as utils from "@utils";
7
+ const da = utils.da;
8
+ const daClient = utils.daClient;
9
+ const DW_MIGRATIONS_DIR = path.resolve("./src/database/da.migrations");
10
+ const MIGRATION_TABLE = `${process.env.DA_DATABASE || "default"}.migrations`;
11
+ // ================================
12
+ // ## Create Migration Table
13
+ // ================================
14
+ async function ensureMigrationTable() {
15
+ if (!da) {
16
+ logger.error("ClickHouse connection (da) is not available. Ensure @skalfa/da is installed.");
17
+ process.exit(1);
18
+ }
19
+ await da.exec(`
20
+ CREATE TABLE IF NOT EXISTS ${MIGRATION_TABLE} (
21
+ name String,
22
+ executed_at DateTime DEFAULT now()
23
+ )
24
+ ENGINE = MergeTree()
25
+ ORDER BY (name)
26
+ `);
27
+ }
28
+ // ================================
29
+ // ## Ensure OLAP Database Exists
30
+ // ================================
31
+ async function ensureDatabaseExists() {
32
+ // @ts-ignore
33
+ const { createClient } = await import("@clickhouse/client");
34
+ let dac = createClient({
35
+ url: "http://" + (process.env.DA_HOST || '127.0.0.1') + ':' + (process.env.DA_PORT || '8123'),
36
+ username: process.env.DA_USERNAME || 'default',
37
+ password: process.env.DA_PASSWORD || '',
38
+ });
39
+ logger.info(`Database ${process.env.DA_DATABASE || "default"} not found. Create new database...`);
40
+ await dac.query({ query: `CREATE DATABASE IF NOT EXISTS ${process.env.DA_DATABASE || "default"}` });
41
+ logger.info(`Database ${process.env.DA_DATABASE || "default"} successfully created.`);
42
+ }
43
+ // ================================
44
+ // ## GET LIST OF APPLIED MIGRATIONS
45
+ // ================================
46
+ async function getMigratedNames() {
47
+ try {
48
+ const rows = (await da.from("migrations").select("name").get());
49
+ return rows.map((r) => r.name);
50
+ }
51
+ catch {
52
+ return [];
53
+ }
54
+ }
55
+ // ================================
56
+ // ## SAVE MIGRATION RECORD
57
+ // ================================
58
+ async function recordMigration(name) {
59
+ await daClient.insert({ table: "migrations", values: [{ name }], format: "JSONEachRow" });
60
+ }
61
+ // ================================
62
+ // ## RUN ALL MIGRATIONS
63
+ // ================================
64
+ export const daMigrateCommand = new Command("da:migrate")
65
+ .description("Run all OLAP (ClickHouse) migrations")
66
+ .action(async () => {
67
+ logger.info("Preparing run migration...");
68
+ await ensureDatabaseExists();
69
+ await ensureMigrationTable();
70
+ const applied = await getMigratedNames();
71
+ if (!fs.existsSync(DW_MIGRATIONS_DIR)) {
72
+ logger.info("No OLAP migrations directory found.");
73
+ process.exit(0);
74
+ }
75
+ const files = getMigrationFiles(DW_MIGRATIONS_DIR).sort((a, b) => a.localeCompare(b));
76
+ let count = 0;
77
+ for (const file of files) {
78
+ if (applied.includes(file))
79
+ continue;
80
+ const relative = path.relative(DW_MIGRATIONS_DIR, file);
81
+ if (applied.includes(relative))
82
+ continue;
83
+ const filePath = file;
84
+ const migrationPath = path.relative(DW_MIGRATIONS_DIR, filePath);
85
+ if (applied.includes(migrationPath))
86
+ continue;
87
+ const mod = await import(filePath);
88
+ if (!mod.default)
89
+ continue;
90
+ const migration = new mod.default();
91
+ if (typeof migration.up !== "function") {
92
+ logger.error(`Migration file ${file} missing up()`);
93
+ continue;
94
+ }
95
+ await migration.up();
96
+ await recordMigration(migrationPath);
97
+ logger.info(`Migrated: ${migrationPath}`);
98
+ count++;
99
+ }
100
+ if (count === 0)
101
+ logger.info("Nothing to migrate.");
102
+ else
103
+ logger.info(`Success run all migration!`);
104
+ process.exit(0);
105
+ });
106
+ // ================================
107
+ // ## FRESH MIGRATE (DROP ALL)
108
+ // ================================
109
+ export const daMigrateFreshCommand = new Command("da:migrate:fresh")
110
+ .description("DROP ALL OLAP TABLES and rerun migrations")
111
+ .action(async () => {
112
+ logger.info("Preparing run migrations...");
113
+ if (!da) {
114
+ logger.error("ClickHouse connection (da) is not available.");
115
+ process.exit(1);
116
+ }
117
+ const tables = (await da.select("name").from("system.tables").where("database", "=", process.env.DA_DATABASE || "elysia_light").get());
118
+ for (const t of tables) {
119
+ await da.exec(`DROP TABLE IF EXISTS ${t.name}`);
120
+ }
121
+ await ensureMigrationTable();
122
+ logger.info("Database has been freshed......");
123
+ if (!fs.existsSync(DW_MIGRATIONS_DIR)) {
124
+ logger.info("No OLAP migrations directory found.");
125
+ process.exit(0);
126
+ }
127
+ const files = getMigrationFiles(DW_MIGRATIONS_DIR).sort((a, b) => a.localeCompare(b));
128
+ for (const file of files) {
129
+ const filePath = file;
130
+ const migrationPath = path.relative(DW_MIGRATIONS_DIR, filePath);
131
+ const mod = await import(filePath);
132
+ if (!mod.default)
133
+ continue;
134
+ const migration = new mod.default();
135
+ await migration.up();
136
+ await recordMigration(migrationPath);
137
+ logger.info(`Migrated: ${migrationPath}`);
138
+ }
139
+ logger.info(`Success run all migration!`);
140
+ process.exit(0);
141
+ });
142
+ function getMigrationFiles(dir) {
143
+ if (!fs.existsSync(dir))
144
+ return [];
145
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
146
+ let files = [];
147
+ for (const entry of entries) {
148
+ const fullPath = path.join(dir, entry.name);
149
+ if (entry.isDirectory()) {
150
+ files = files.concat(getMigrationFiles(fullPath));
151
+ }
152
+ else if (entry.isFile() && entry.name.endsWith(".ts")) {
153
+ files.push(fullPath);
154
+ }
155
+ }
156
+ return files;
157
+ }
158
+ // ==============================>
159
+ // ## DA / OLAP : Migration
160
+ // ==============================>
161
+ export class DAMigration {
162
+ raw(query) {
163
+ return this.exec(query);
164
+ }
165
+ async exec(query) {
166
+ if (!daClient) {
167
+ logger.error("daClient is not available.");
168
+ return;
169
+ }
170
+ await daClient.query({ query });
171
+ return;
172
+ }
173
+ createTable(name, callback, options) {
174
+ const builder = new TableBuilder(name);
175
+ callback(builder);
176
+ const sql = builder.build(options);
177
+ return this.exec(sql);
178
+ }
179
+ dropTable(name) {
180
+ return this.exec(`DROP TABLE IF EXISTS ${name}`);
181
+ }
182
+ alterTable(name, callback) {
183
+ const builder = new AlterBuilder(name);
184
+ callback(builder);
185
+ const sql = builder.build();
186
+ return this.exec(sql);
187
+ }
188
+ }
189
+ export class TableBuilder {
190
+ constructor(table) {
191
+ this.columns = [];
192
+ this.table = table;
193
+ }
194
+ uuid(name = "id") {
195
+ this.columns.push(`${name} UUID DEFAULT generateUUIDv7()`);
196
+ }
197
+ string(name) {
198
+ this.columns.push(`${name} String`);
199
+ }
200
+ uint64(name) {
201
+ this.columns.push(`${name} UInt64`);
202
+ }
203
+ int32(name) {
204
+ this.columns.push(`${name} Int32`);
205
+ }
206
+ json(name) {
207
+ this.columns.push(`${name} JSON`);
208
+ }
209
+ dateTime(name) {
210
+ this.columns.push(`${name} DateTime`);
211
+ }
212
+ build(options) {
213
+ const engine = options?.engine || "MergeTree";
214
+ const orderBy = options?.orderBy?.join(", ") || "id";
215
+ const partition = options?.partitionBy ? `PARTITION BY ${options.partitionBy}` : "";
216
+ const ttl = options?.ttl ? `TTL ${options.ttl}` : "";
217
+ return `
218
+ CREATE TABLE IF NOT EXISTS ${this.table} (
219
+ ${this.columns.join(",\n ")}
220
+ )
221
+ ENGINE = ${engine}
222
+ ${partition}
223
+ ORDER BY (${orderBy})
224
+ ${ttl}
225
+ `.trim();
226
+ }
227
+ }
228
+ // ====================================>
229
+ // ## DA / OLAP : Alter Builder (ALTER TABLE)
230
+ // ====================================>
231
+ export class AlterBuilder {
232
+ constructor(table) {
233
+ this.actions = [];
234
+ this.table = table;
235
+ }
236
+ addColumn(name, type, defaultValue) {
237
+ const def = defaultValue !== undefined ? ` DEFAULT ${this.format(defaultValue)}` : "";
238
+ this.actions.push(`ADD COLUMN IF NOT EXISTS ${name} ${type}${def}`);
239
+ }
240
+ dropColumn(name) {
241
+ this.actions.push(`DROP COLUMN IF EXISTS ${name}`);
242
+ }
243
+ modifyColumn(name, newType) {
244
+ this.actions.push(`MODIFY COLUMN ${name} ${newType}`);
245
+ }
246
+ commentColumn(name, comment) {
247
+ this.actions.push(`COMMENT COLUMN ${name} '${comment.replace(/'/g, "''")}'`);
248
+ }
249
+ format(value) {
250
+ if (typeof value === "string")
251
+ return `'${value.replace(/'/g, "''")}'`;
252
+ if (value === null)
253
+ return "NULL";
254
+ if (typeof value === "boolean")
255
+ return value ? "1" : "0";
256
+ return value;
257
+ }
258
+ build() {
259
+ return `ALTER TABLE ${this.table} \n${this.actions.join("\n")} `;
260
+ }
261
+ }
262
+ //# sourceMappingURL=da-migration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"da-migration.js","sourceRoot":"","sources":["../../../src/commands/runner/da-migration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { Command } from "commander";
2
+ declare module "knex" {
3
+ namespace Knex {
4
+ interface CreateTableBuilder {
5
+ foreignIdFor(tableName: string, column?: string): Knex.ColumnBuilder;
6
+ softDelete(column?: string): Knex.ColumnBuilder;
7
+ }
8
+ }
9
+ }
10
+ export declare const migrateCommand: Command;
11
+ export declare const migrateFreshCommand: Command;
@@ -0,0 +1,188 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import knex from "knex";
4
+ import { Command } from "commander";
5
+ import { conversion, logger } from "@utils";
6
+ import { runSeeder } from "./seeder";
7
+ const TableBuilder = require("knex/lib/schema/tablebuilder");
8
+ TableBuilder.prototype.foreignIdFor = function (tableName, column = `${conversion.strSingular(tableName)}_id`) {
9
+ return this.bigInteger(column).unsigned().index();
10
+ };
11
+ TableBuilder.prototype.softDelete = function (column = `deleted_at`) {
12
+ return this.timestamp(column).index();
13
+ };
14
+ // =====================================>
15
+ // ## Command: migrate
16
+ // =====================================>
17
+ export const migrateCommand = new Command("migrate")
18
+ .description("Run all migration")
19
+ .option("--seed", "Run seeder after migrate")
20
+ .action(async (options) => {
21
+ await ensureDatabaseExists(process.env.DB_DATABASE || "db_elysia_light");
22
+ const { db } = await import("@skalfa/skalfa-orm");
23
+ if (!db) {
24
+ logger.error("Database connection (db) is not available. Ensure @skalfa/skalfa-orm is installed.");
25
+ process.exit(1);
26
+ }
27
+ const hasTable = await db.schema.hasTable("migrations");
28
+ if (!hasTable) {
29
+ await db.schema.createTable("migrations", (table) => {
30
+ table.increments("id").primary();
31
+ table.string("name").notNullable();
32
+ table.timestamp("batch").defaultTo(db.raw("CURRENT_TIMESTAMP"));
33
+ });
34
+ }
35
+ await runMigrationFile();
36
+ if (options.seed) {
37
+ await runSeeder();
38
+ }
39
+ process.exit(0);
40
+ });
41
+ // =====================================>
42
+ // ## Command: migrate:fresh
43
+ // =====================================>
44
+ export const migrateFreshCommand = new Command("migrate:fresh")
45
+ .description("Fresh and run all migration")
46
+ .option("--seed", "Run seeder after migrate")
47
+ .action(async (options) => {
48
+ await ensureDatabaseExists(process.env.DB_DATABASE || "db_elysia_light");
49
+ const { db } = await import("@skalfa/skalfa-orm");
50
+ if (!db) {
51
+ logger.error("Database connection (db) is not available. Ensure @skalfa/skalfa-orm is installed.");
52
+ process.exit(1);
53
+ }
54
+ await db.raw(`DROP SCHEMA public CASCADE;`);
55
+ await db.raw(`CREATE SCHEMA public;`);
56
+ logger.info("Database schema has been freshed...");
57
+ await db.schema.createTable("migrations", (table) => {
58
+ table.increments("id").primary();
59
+ table.string("name").notNullable();
60
+ table.timestamp("batch").defaultTo(db.raw("CURRENT_TIMESTAMP"));
61
+ });
62
+ await runMigrationFile();
63
+ if (options.seed) {
64
+ await runSeeder();
65
+ }
66
+ process.exit(0);
67
+ });
68
+ // =====================================>
69
+ // ## Command: migration helpers
70
+ // =====================================>
71
+ async function runMigrationFile() {
72
+ const { db } = await import("@skalfa/skalfa-orm");
73
+ if (!db) {
74
+ logger.error("Database connection (db) is not available.");
75
+ return;
76
+ }
77
+ const migrations = await db.table("migrations").select("name");
78
+ const migrated = migrations.map((row) => row.name);
79
+ const migrationsDir = fs.existsSync(path.resolve("./database/migrations"))
80
+ ? path.resolve("./database/migrations")
81
+ : path.resolve("./src/database/migrations");
82
+ if (!fs.existsSync(migrationsDir)) {
83
+ logger.info("No migrations directory found.");
84
+ return;
85
+ }
86
+ const files = getMigrationFiles(migrationsDir).sort((a, b) => a.localeCompare(b));
87
+ let countMigrated = 0;
88
+ logger.info("Running migrations...");
89
+ for (const file of files) {
90
+ const migrationFile = path.relative(migrationsDir, file);
91
+ if (migrated.includes(migrationFile))
92
+ continue;
93
+ const mod = await import(file);
94
+ if (mod.up) {
95
+ await mod.up(db);
96
+ await db.table("migrations").insert({ name: migrationFile });
97
+ logger.info(`Migrated: ${migrationFile}`);
98
+ }
99
+ countMigrated++;
100
+ }
101
+ if (countMigrated > 0) {
102
+ logger.info(`Success run all migration!`);
103
+ }
104
+ else {
105
+ logger.info(`Nothing to migrate!`);
106
+ }
107
+ }
108
+ function getMigrationFiles(dir, baseDir = dir) {
109
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
110
+ let files = [];
111
+ for (const entry of entries) {
112
+ const fullPath = path.join(dir, entry.name);
113
+ if (entry.isDirectory()) {
114
+ files = files.concat(getMigrationFiles(fullPath));
115
+ }
116
+ else if (entry.isFile() && entry.name.endsWith(".ts")) {
117
+ files.push(fullPath);
118
+ }
119
+ }
120
+ return files;
121
+ }
122
+ async function ensureDatabaseExists(databaseName) {
123
+ const driver = (process.env.DB_CONNECTION || "pg").toLowerCase();
124
+ switch (driver) {
125
+ case "pg":
126
+ case "pgsql": {
127
+ const tempDb = knex({
128
+ client: "pg",
129
+ connection: {
130
+ host: process.env.DB_HOST || "127.0.0.1",
131
+ port: Number(process.env.DB_PORT) || 5432,
132
+ user: process.env.DB_USERNAME || "postgres",
133
+ password: process.env.DB_PASSWORD || "password",
134
+ database: "postgres",
135
+ },
136
+ });
137
+ try {
138
+ const result = await tempDb
139
+ .select("datname")
140
+ .from("pg_database")
141
+ .where("datname", databaseName)
142
+ .first();
143
+ if (!result) {
144
+ logger.info(`Database ${databaseName} not found. Create new database...`);
145
+ await tempDb.raw(`CREATE DATABASE "${databaseName}"`);
146
+ logger.info(`Database ${databaseName} successfully created.`);
147
+ }
148
+ }
149
+ catch (err) {
150
+ logger.error(`Check or create database error: ${err}`);
151
+ }
152
+ finally {
153
+ await tempDb.destroy();
154
+ }
155
+ break;
156
+ }
157
+ case "mysql":
158
+ case "mysql2": {
159
+ const tempDb = knex({
160
+ client: "mysql2",
161
+ connection: {
162
+ host: process.env.DB_HOST || "127.0.0.1",
163
+ port: Number(process.env.DB_PORT) || 3306,
164
+ user: process.env.DB_USERNAME || "root",
165
+ password: process.env.DB_PASSWORD || "",
166
+ },
167
+ });
168
+ try {
169
+ const [rows] = await tempDb.raw(`SHOW DATABASES LIKE ?`, [databaseName]);
170
+ if (!rows || rows.length === 0) {
171
+ logger.info(`Database ${databaseName} not found. Create new database...`);
172
+ await tempDb.raw(`CREATE DATABASE \`${databaseName}\``);
173
+ logger.info(`Database ${databaseName} successfully created.`);
174
+ }
175
+ }
176
+ catch (err) {
177
+ logger.error(`Check or create database error: ${err}`);
178
+ }
179
+ finally {
180
+ await tempDb.destroy();
181
+ }
182
+ break;
183
+ }
184
+ default:
185
+ throw new Error(`Driver ${driver} belum didukung oleh ensureDatabaseExists().`);
186
+ }
187
+ }
188
+ //# sourceMappingURL=migration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration.js","sourceRoot":"","sources":["../../../src/commands/runner/migration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,IAAc,MAAM,MAAM,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAWrC,MAAM,YAAY,GAAG,OAAO,CAAC,8BAA8B,CAAC,CAAC;AAE7D,YAAY,CAAC,SAAS,CAAC,YAAY,GAAG,UAEpC,SAAiB,EACjB,MAAM,GAAG,GAAG,UAAU,CAAC,WAAW,CAAC,SAAS,CAAC,KAAK;IAElD,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC;AACpD,CAAC,CAAC;AAEF,YAAY,CAAC,SAAS,CAAC,UAAU,GAAG,UAElC,MAAM,GAAG,YAAY;IAErB,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC;AACxC,CAAC,CAAC;AAEF,yCAAyC;AACzC,sBAAsB;AACtB,yCAAyC;AACzC,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC;KACjD,WAAW,CAAC,mBAAmB,CAAC;KAChC,MAAM,CAAC,QAAQ,EAAE,0BAA0B,CAAC;KAC5C,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,oBAAoB,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,iBAAiB,CAAC,CAAC;IAEzE,MAAM,EAAE,EAAE,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAElD,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,MAAM,CAAC,KAAK,CAAC,oFAAoF,CAAC,CAAC;QACnG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IACxD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,YAAY,EAAE,CAAC,KAAU,EAAE,EAAE;YACvD,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;YACjC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;YACnC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,gBAAgB,EAAE,CAAC;IAEzB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,SAAS,EAAE,CAAC;IACpB,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEL,yCAAyC;AACzC,4BAA4B;AAC5B,yCAAyC;AACzC,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,OAAO,CAAC,eAAe,CAAC;KAC5D,WAAW,CAAC,6BAA6B,CAAC;KAC1C,MAAM,CAAC,QAAQ,EAAE,0BAA0B,CAAC;KAC5C,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,oBAAoB,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,iBAAiB,CAAC,CAAC;IAEzE,MAAM,EAAE,EAAE,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAElD,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,MAAM,CAAC,KAAK,CAAC,oFAAoF,CAAC,CAAC;QACnG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,EAAE,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;IAC5C,MAAM,EAAE,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IAEtC,MAAM,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;IAEnD,MAAM,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,YAAY,EAAE,CAAC,KAAU,EAAE,EAAE;QACvD,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;QACjC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QACnC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,MAAM,gBAAgB,EAAE,CAAC;IAEzB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,SAAS,EAAE,CAAC;IACpB,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEL,yCAAyC;AACzC,gCAAgC;AAChC,yCAAyC;AACzC,KAAK,UAAU,gBAAgB;IAC7B,MAAM,EAAE,EAAE,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAElD,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,MAAM,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAC3D,OAAO;IACT,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC/D,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAExD,MAAM,aAAa,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;QACxE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,uBAAuB,CAAC;QACvC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;IAC9C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;QAC9C,OAAO;IACT,CAAC;IACD,MAAM,KAAK,GAAG,iBAAiB,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IAElF,IAAI,aAAa,GAAG,CAAC,CAAC;IAEtB,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IAErC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;QAEzD,IAAI,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC;YAAE,SAAS;QAE/C,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QAE/B,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;YACX,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACjB,MAAM,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC;YAC7D,MAAM,CAAC,IAAI,CAAC,aAAa,aAAa,EAAE,CAAC,CAAC;QAC5C,CAAC;QAED,aAAa,EAAE,CAAC;IAClB,CAAC;IAED,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;IAC5C,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IACrC,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAW,EAAE,OAAO,GAAG,GAAG;IACnD,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAE7D,IAAI,KAAK,GAAa,EAAE,CAAC;IAEzB,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAE5C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC;QACpD,CAAC;aAAM,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACxD,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAC,YAAoB;IACtD,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IAEjE,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,IAAI,CAAC;QACV,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,MAAM,GAAG,IAAI,CAAC;gBAClB,MAAM,EAAE,IAAI;gBACZ,UAAU,EAAE;oBACV,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,WAAW;oBACxC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI;oBACzC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,UAAU;oBAC3C,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,UAAU;oBAC/C,QAAQ,EAAE,UAAU;iBACrB;aACF,CAAC,CAAC;YAEH,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,MAAM;qBACxB,MAAM,CAAC,SAAS,CAAC;qBACjB,IAAI,CAAC,aAAa,CAAC;qBACnB,KAAK,CAAC,SAAS,EAAE,YAAY,CAAC;qBAC9B,KAAK,EAAE,CAAC;gBAEX,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,MAAM,CAAC,IAAI,CAAC,YAAY,YAAY,oCAAoC,CAAC,CAAC;oBAC1E,MAAM,MAAM,CAAC,GAAG,CAAC,oBAAoB,YAAY,GAAG,CAAC,CAAC;oBACtD,MAAM,CAAC,IAAI,CAAC,YAAY,YAAY,wBAAwB,CAAC,CAAC;gBAChE,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,KAAK,CAAC,mCAAmC,GAAG,EAAE,CAAC,CAAC;YACzD,CAAC;oBAAS,CAAC;gBACT,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;YACzB,CAAC;YAED,MAAM;QACR,CAAC;QAED,KAAK,OAAO,CAAC;QACb,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,MAAM,GAAG,IAAI,CAAC;gBAClB,MAAM,EAAE,QAAQ;gBAChB,UAAU,EAAE;oBACV,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,WAAW;oBACxC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI;oBACzC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,MAAM;oBACvC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE;iBACxC;aACF,CAAC,CAAC;YAEH,IAAI,CAAC;gBACH,MAAM,CAAC,IAAI,CAAC,GAAQ,MAAM,MAAM,CAAC,GAAG,CAClC,uBAAuB,EACvB,CAAC,YAAY,CAAC,CACf,CAAC;gBAEF,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC/B,MAAM,CAAC,IAAI,CAAC,YAAY,YAAY,oCAAoC,CAAC,CAAC;oBAC1E,MAAM,MAAM,CAAC,GAAG,CAAC,qBAAqB,YAAY,IAAI,CAAC,CAAC;oBACxD,MAAM,CAAC,IAAI,CAAC,YAAY,YAAY,wBAAwB,CAAC,CAAC;gBAChE,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,KAAK,CAAC,mCAAmC,GAAG,EAAE,CAAC,CAAC;YACzD,CAAC;oBAAS,CAAC;gBACT,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;YACzB,CAAC;YAED,MAAM;QACR,CAAC;QAED;YACE,MAAM,IAAI,KAAK,CAAC,UAAU,MAAM,8CAA8C,CAAC,CAAC;IACpF,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const seederCommand: Command;
3
+ export declare const runSeeder: () => Promise<void>;
@@ -0,0 +1,40 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import { Command } from "commander";
4
+ import { logger } from "@utils";
5
+ // =====================================>
6
+ // ## Command: seeder
7
+ // =====================================>
8
+ export const seederCommand = new Command("seeder")
9
+ .description("Run all database seeders")
10
+ .action(async () => {
11
+ try {
12
+ await runSeeder();
13
+ process.exit(0);
14
+ }
15
+ catch (error) {
16
+ logger.error(`Error running seeds: ${error}`);
17
+ process.exit(1);
18
+ }
19
+ });
20
+ export const runSeeder = async () => {
21
+ const seedersDir = fs.existsSync(path.join(process.cwd(), "database", "seeders"))
22
+ ? path.join(process.cwd(), "database", "seeders")
23
+ : path.join(process.cwd(), "src", "database", "seeders");
24
+ if (!fs.existsSync(seedersDir)) {
25
+ logger.info("No seeders directory found.");
26
+ return;
27
+ }
28
+ const files = fs.readdirSync(seedersDir).filter(f => f.endsWith(".ts"));
29
+ logger.info("Running seeders...");
30
+ for (const file of files) {
31
+ const seederPath = path.join(seedersDir, file);
32
+ const { default: seeder } = await import(seederPath);
33
+ if (typeof seeder === "function") {
34
+ await seeder();
35
+ logger.info(`Planted: ${file}`);
36
+ }
37
+ }
38
+ logger.info("Success run all seeders!");
39
+ };
40
+ //# sourceMappingURL=seeder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seeder.js","sourceRoot":"","sources":["../../../src/commands/runner/seeder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,yCAAyC;AACzC,qBAAqB;AACrB,yCAAyC;AACzC,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,0BAA0B,CAAC;KACvC,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,IAAI,CAAC;QACH,MAAM,SAAS,EAAE,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,wBAAwB,KAAK,EAAE,CAAC,CAAC;QAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,IAAI,EAAE;IAClC,MAAM,UAAU,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;QAC/E,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,SAAS,CAAC;QACjD,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;IAC3D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QAC3C,OAAO;IACT,CAAC;IACD,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IAExE,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IAElC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAC/C,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;QAErD,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE,CAAC;YACjC,MAAM,MAAM,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;AAC1C,CAAC,CAAC"}
@@ -0,0 +1,14 @@
1
+ export declare const basicControllerStub = "import type { ControllerContext } from \"elysia\"\n\nexport class {{ name }} {\n // ========================================>\n // ## Display a listing of the resource.\n // ========================================>\n static async index(c: ControllerContext) {\n // something amazing\n }\n\n\n // =============================================>\n // ## Store a newly created resource.\n // =============================================>\n static async store(c: ControllerContext) {\n // something amazing\n }\n\n\n // ============================================>\n // ## Update the specified resource.\n // ============================================>\n static async update(c: ControllerContext) {\n // something amazing\n }\n\n\n // ===============================================>\n // ## Remove the specified resource.\n // ===============================================>\n static async destroy(c: ControllerContext) {\n // something amazing\n }\n}";
2
+ export declare const basicMigrationStub = "import type { Knex } from \"knex\"\n\nexport async function up(knex: Knex): Promise<void> {\n await knex.schema.createTable(\"{{ tableName }}\", (table) => {\n table.bigIncrements('id').primary()\n // your table schema\n table.timestamps(true, true)\n table.softDelete()\n })\n}";
3
+ export declare const basicModelStub = "import { Model } from '@utils'\n\nexport class {{ name }} extends Model {\n // something amazing\n}";
4
+ export declare const basicSeederStub = "import { {{ model }} } from \"@models\";\n\nexport default async function {{ name }}() {\n // =========================>\n // ## Seed the application's database\n // =========================>\n \n await {{ model }}.query().insert([]);\n}\n";
5
+ export declare const blueprintStub = "[\n {\n \"model\" : \"\",\n \"schema\" : {},\n \"relations\": {},\n \"controllers\": {},\n \"migrations\" : true,\n \"seeders\" : [],\n \"documentation\": true\n }\n]";
6
+ export declare const daMigrationStub = "import { DAMigration } from \"@utils\"\n\nexport default class {{ className }} extends DAMigration {\n async up() { \n await this.createTable(\"{{ tableName }}\",(table) => {\n table.uuid()\n }, {\n engine: \"MergeTree\",\n })\n }\n}\n";
7
+ export declare const lightControllerStub = "{{ marker }}\nimport type { ControllerContext } from \"elysia\"\nimport { permission } from '@utils'\nimport { {{ model }} } from '@models'\n\n\n\n// ========================================>\n// ## Permission of the resource.\n// ========================================>\nconst p = permission.register({\n \"{{ permission_code }}\": {\n name: \"{{ permission_name }}\",\n accesses: {\n \"00\": \"Melihat\",\n \"01\": \"Membuat\",\n \"02\": \"Mengubah\",\n \"03\": \"Menghapus\",\n }\n }\n})\n\n\n\nexport class {{ name }} {\n // ========================================>\n // ## Display a listing of the resource.\n // ========================================>\n static async index(c: ControllerContext) {\n p.have(\"{{ permission_code }}.00\").guard(c)\n\n const { data, total } = await {{ model }}.query().resolve(c)\n \n c.responseData(data, total)\n }\n\n\n // =============================================>\n // ## Store a newly created resource.\n // =============================================>\n static async store(c: ControllerContext) {\n p.have(\"{{ permission_code }}.01\").guard(c)\n\n c.validation<{{ model }}>({{{ validations }}})\n\n let record = {}\n\n try {\n record = await (new {{ model }}).pump(c.payload) \n } catch (err) {\n c.responseError(err as Error, \"Create {{ model }}\")\n }\n\n c.responseSaved(record)\n }\n\n\n // ============================================>\n // ## Update the specified resource.\n // ============================================>\n static async update(c: ControllerContext) {\n p.have(\"{{ permission_code }}.02\").guard(c)\n\n const record = await {{ model }}.query().findOrNotFound(c.params.id)\n\n c.validation<{{ model }}>({{{ validations }}})\n\n try {\n await record.pump(c.payload)\n } catch (err) {\n c.responseError(err as Error, \"Update {{ model }}\")\n }\n \n c.responseSaved(record)\n }\n\n\n // ===============================================>\n // ## Remove the specified resource.\n // ===============================================>\n static async destroy(c: ControllerContext) {\n p.have(\"{{ permission_code }}.03\").guard(c)\n\n const record = await {{ model }}.query().findOrNotFound(c.params.id)\n \n try {\n await record.delete()\n } catch (err) {\n c.responseError(err as Error, \"Delete {{ model }}\")\n }\n\n c.responseSuccess(record)\n }\n}\n";
8
+ export declare const lightMigrationStub = "{{ marker }}\nimport type { Knex } from \"knex\"\n\nexport async function up(knex: Knex): Promise<void> {\n await knex.schema.createTable(\"{{ tableName }}\", (table) => {\n table.bigIncrements('id').primary()\n{{ schemas }}\n table.timestamps(true, true)\n table.softDelete()\n })\n\n{{ pivot }}\n}";
9
+ export declare const lightModelStub = "{{ marker }}\nimport { Model, SoftDelete{{ import_utils }} } from '@utils'\n{{ import }}\n\nexport class {{ name }} extends Model {\n // =====================>\n // ## Field\n // =====================>\n{{ fields }}\n\n @SoftDelete()\n deleted_at!: Date\n\n\n // =========================>\n // ## Relations\n // =========================>\n{{ relations }}\n\n\n // =====================>\n // ## Attribute\n // =====================>\n{{ attributes }}\n\n\n // =====================>\n // ## Hook\n // =====================>\n\n}\n";
10
+ export declare const lightSeederStub = "{{ marker }}\nimport { {{ model }} } from \"@models\";\n\nexport default async function {{ name }}Seeder() {\n // =========================>\n // ## Seed the application's database\n // =========================>\n \n await (new {{ model }}).pump([\n {{ seeders }}\n ]);\n}\n";
11
+ export declare const mailStub = "import { renderMailTemplate, sendMail } from \"@utils\"\n\nexport async function {{ name }}Mail(to: string) {\n const content = renderMailTemplate(\"{{ name }}\", {\n title: \"{{ title }}\",\n })\n\n const send = await sendMail({\n subject: \"{{ title }}\",\n to: to,\n content: content\n })\n \n return send;\n}\n";
12
+ export declare const notificationStub = "import { queue } from \"@utils\";\n\nexport async function {{ name }}Notification(payload: Record<string,any>) {\n await queue.add('notification', { payload })\n}\n";
13
+ export declare const queueStub = "import { queue } from '@utils'\n\nexport const {{ name }}QueueWorker = () => {\n queue.worker(\"{{ worker_name }}\", async (payload) => {\n \n })\n}\n";
14
+ export declare const routeStub = "import { Elysia } from 'elysia'\nimport { api, middleware } from '@utils'\nimport { \n\n} from '@controllers'\n\nexport const {{ name }}Routes = (app: Elysia) => app.group('/{{ path }}', (route) => {\n\n return route;\n})\n";