mahameru 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (218) hide show
  1. package/README.md +28 -0
  2. package/dist/api.error.cjs +107 -0
  3. package/dist/api.error.cjs.map +1 -0
  4. package/dist/api.error.d.cts +65 -0
  5. package/dist/api.error.d.ts +65 -0
  6. package/dist/api.error.js +83 -0
  7. package/dist/api.error.js.map +1 -0
  8. package/dist/base-class/base.controller.cjs +148 -0
  9. package/dist/base-class/base.controller.cjs.map +1 -0
  10. package/dist/base-class/base.controller.d.cts +38 -0
  11. package/dist/base-class/base.controller.d.ts +38 -0
  12. package/dist/base-class/base.controller.js +126 -0
  13. package/dist/base-class/base.controller.js.map +1 -0
  14. package/dist/base-class/base.entity.cjs +79 -0
  15. package/dist/base-class/base.entity.cjs.map +1 -0
  16. package/dist/base-class/base.entity.d.cts +8 -0
  17. package/dist/base-class/base.entity.d.ts +8 -0
  18. package/dist/base-class/base.entity.js +57 -0
  19. package/dist/base-class/base.entity.js.map +1 -0
  20. package/dist/base-class/base.model.cjs +204 -0
  21. package/dist/base-class/base.model.cjs.map +1 -0
  22. package/dist/base-class/base.model.d.cts +68 -0
  23. package/dist/base-class/base.model.d.ts +68 -0
  24. package/dist/base-class/base.model.js +182 -0
  25. package/dist/base-class/base.model.js.map +1 -0
  26. package/dist/base-class/base.service.cjs +37 -0
  27. package/dist/base-class/base.service.cjs.map +1 -0
  28. package/dist/base-class/base.service.d.cts +5 -0
  29. package/dist/base-class/base.service.d.ts +5 -0
  30. package/dist/base-class/base.service.js +15 -0
  31. package/dist/base-class/base.service.js.map +1 -0
  32. package/dist/base-class/index.cjs +392 -0
  33. package/dist/base-class/index.cjs.map +1 -0
  34. package/dist/base-class/index.d.cts +6 -0
  35. package/dist/base-class/index.d.ts +6 -0
  36. package/dist/base-class/index.js +365 -0
  37. package/dist/base-class/index.js.map +1 -0
  38. package/dist/cli/index.cjs +706 -0
  39. package/dist/cli/index.cjs.map +1 -0
  40. package/dist/cli/index.d.cts +3 -0
  41. package/dist/cli/index.d.ts +3 -0
  42. package/dist/cli/index.js +681 -0
  43. package/dist/cli/index.js.map +1 -0
  44. package/dist/cli/scripts/on-build.cjs +56 -0
  45. package/dist/cli/scripts/on-build.cjs.map +1 -0
  46. package/dist/cli/scripts/on-build.d.cts +3 -0
  47. package/dist/cli/scripts/on-build.d.ts +3 -0
  48. package/dist/cli/scripts/on-build.js +28 -0
  49. package/dist/cli/scripts/on-build.js.map +1 -0
  50. package/dist/cli/scripts/on-dev.cjs +483 -0
  51. package/dist/cli/scripts/on-dev.cjs.map +1 -0
  52. package/dist/cli/scripts/on-dev.d.cts +5 -0
  53. package/dist/cli/scripts/on-dev.d.ts +5 -0
  54. package/dist/cli/scripts/on-dev.js +449 -0
  55. package/dist/cli/scripts/on-dev.js.map +1 -0
  56. package/dist/cli/scripts/on-init.cjs +96 -0
  57. package/dist/cli/scripts/on-init.cjs.map +1 -0
  58. package/dist/cli/scripts/on-init.d.cts +3 -0
  59. package/dist/cli/scripts/on-init.d.ts +3 -0
  60. package/dist/cli/scripts/on-init.js +68 -0
  61. package/dist/cli/scripts/on-init.js.map +1 -0
  62. package/dist/cli/scripts/on-start.cjs +55 -0
  63. package/dist/cli/scripts/on-start.cjs.map +1 -0
  64. package/dist/cli/scripts/on-start.d.cts +3 -0
  65. package/dist/cli/scripts/on-start.d.ts +3 -0
  66. package/dist/cli/scripts/on-start.js +27 -0
  67. package/dist/cli/scripts/on-start.js.map +1 -0
  68. package/dist/client.cjs +405 -0
  69. package/dist/client.cjs.map +1 -0
  70. package/dist/client.d.cts +7 -0
  71. package/dist/client.d.ts +7 -0
  72. package/dist/client.js +371 -0
  73. package/dist/client.js.map +1 -0
  74. package/dist/constants.cjs +51 -0
  75. package/dist/constants.cjs.map +1 -0
  76. package/dist/constants.d.cts +7 -0
  77. package/dist/constants.d.ts +7 -0
  78. package/dist/constants.js +16 -0
  79. package/dist/constants.js.map +1 -0
  80. package/dist/database/column/index.cjs +34 -0
  81. package/dist/database/column/index.cjs.map +1 -0
  82. package/dist/database/column/index.d.cts +2 -0
  83. package/dist/database/column/index.d.ts +2 -0
  84. package/dist/database/column/index.js +8 -0
  85. package/dist/database/column/index.js.map +1 -0
  86. package/dist/database/index.cjs +83 -0
  87. package/dist/database/index.cjs.map +1 -0
  88. package/dist/database/index.d.cts +2 -0
  89. package/dist/database/index.d.ts +2 -0
  90. package/dist/database/index.js +60 -0
  91. package/dist/database/index.js.map +1 -0
  92. package/dist/database/snake-naming-strategy.class.cjs +78 -0
  93. package/dist/database/snake-naming-strategy.class.cjs.map +1 -0
  94. package/dist/database/snake-naming-strategy.class.d.cts +16 -0
  95. package/dist/database/snake-naming-strategy.class.d.ts +16 -0
  96. package/dist/database/snake-naming-strategy.class.js +56 -0
  97. package/dist/database/snake-naming-strategy.class.js.map +1 -0
  98. package/dist/error.cjs +46 -0
  99. package/dist/error.cjs.map +1 -0
  100. package/dist/error.d.cts +10 -0
  101. package/dist/error.d.ts +10 -0
  102. package/dist/error.js +28 -0
  103. package/dist/error.js.map +1 -0
  104. package/dist/express/app.cjs +233 -0
  105. package/dist/express/app.cjs.map +1 -0
  106. package/dist/express/app.d.cts +16 -0
  107. package/dist/express/app.d.ts +16 -0
  108. package/dist/express/app.js +205 -0
  109. package/dist/express/app.js.map +1 -0
  110. package/dist/express/index.cjs +239 -0
  111. package/dist/express/index.cjs.map +1 -0
  112. package/dist/express/index.d.cts +3 -0
  113. package/dist/express/index.d.ts +3 -0
  114. package/dist/express/index.js +205 -0
  115. package/dist/express/index.js.map +1 -0
  116. package/dist/express/middleware/cors.middleware.cjs +54 -0
  117. package/dist/express/middleware/cors.middleware.cjs.map +1 -0
  118. package/dist/express/middleware/cors.middleware.d.cts +9 -0
  119. package/dist/express/middleware/cors.middleware.d.ts +9 -0
  120. package/dist/express/middleware/cors.middleware.js +26 -0
  121. package/dist/express/middleware/cors.middleware.js.map +1 -0
  122. package/dist/express/middleware/error.middleware.cjs +136 -0
  123. package/dist/express/middleware/error.middleware.cjs.map +1 -0
  124. package/dist/express/middleware/error.middleware.d.cts +5 -0
  125. package/dist/express/middleware/error.middleware.d.ts +5 -0
  126. package/dist/express/middleware/error.middleware.js +116 -0
  127. package/dist/express/middleware/error.middleware.js.map +1 -0
  128. package/dist/express/middleware/filter.middleware.cjs +38 -0
  129. package/dist/express/middleware/filter.middleware.cjs.map +1 -0
  130. package/dist/express/middleware/filter.middleware.d.cts +5 -0
  131. package/dist/express/middleware/filter.middleware.d.ts +5 -0
  132. package/dist/express/middleware/filter.middleware.js +20 -0
  133. package/dist/express/middleware/filter.middleware.js.map +1 -0
  134. package/dist/express/middleware/index.cjs +206 -0
  135. package/dist/express/middleware/index.cjs.map +1 -0
  136. package/dist/express/middleware/index.d.cts +19 -0
  137. package/dist/express/middleware/index.d.ts +19 -0
  138. package/dist/express/middleware/index.js +169 -0
  139. package/dist/express/middleware/index.js.map +1 -0
  140. package/dist/express/middleware/not-found.middleware.cjs +79 -0
  141. package/dist/express/middleware/not-found.middleware.cjs.map +1 -0
  142. package/dist/express/middleware/not-found.middleware.d.cts +5 -0
  143. package/dist/express/middleware/not-found.middleware.d.ts +5 -0
  144. package/dist/express/middleware/not-found.middleware.js +59 -0
  145. package/dist/express/middleware/not-found.middleware.js.map +1 -0
  146. package/dist/generator.cjs +258 -0
  147. package/dist/generator.cjs.map +1 -0
  148. package/dist/generator.d.cts +10 -0
  149. package/dist/generator.d.ts +10 -0
  150. package/dist/generator.js +220 -0
  151. package/dist/generator.js.map +1 -0
  152. package/dist/http.cjs +82 -0
  153. package/dist/http.cjs.map +1 -0
  154. package/dist/http.d.cts +11 -0
  155. package/dist/http.d.ts +11 -0
  156. package/dist/http.js +64 -0
  157. package/dist/http.js.map +1 -0
  158. package/dist/index.cjs +831 -0
  159. package/dist/index.cjs.map +1 -0
  160. package/dist/index.d.cts +19 -0
  161. package/dist/index.d.ts +19 -0
  162. package/dist/index.js +783 -0
  163. package/dist/index.js.map +1 -0
  164. package/dist/lib/create-env-file.cjs +69 -0
  165. package/dist/lib/create-env-file.cjs.map +1 -0
  166. package/dist/lib/create-env-file.d.cts +3 -0
  167. package/dist/lib/create-env-file.d.ts +3 -0
  168. package/dist/lib/create-env-file.js +31 -0
  169. package/dist/lib/create-env-file.js.map +1 -0
  170. package/dist/lib/helper.cjs +94 -0
  171. package/dist/lib/helper.cjs.map +1 -0
  172. package/dist/lib/helper.d.cts +13 -0
  173. package/dist/lib/helper.d.ts +13 -0
  174. package/dist/lib/helper.js +62 -0
  175. package/dist/lib/helper.js.map +1 -0
  176. package/dist/lib/model.generator.cjs +212 -0
  177. package/dist/lib/model.generator.cjs.map +1 -0
  178. package/dist/lib/model.generator.d.cts +29 -0
  179. package/dist/lib/model.generator.d.ts +29 -0
  180. package/dist/lib/model.generator.js +174 -0
  181. package/dist/lib/model.generator.js.map +1 -0
  182. package/dist/lib/pre-init-dev-script.cjs +336 -0
  183. package/dist/lib/pre-init-dev-script.cjs.map +1 -0
  184. package/dist/lib/pre-init-dev-script.d.cts +2 -0
  185. package/dist/lib/pre-init-dev-script.d.ts +2 -0
  186. package/dist/lib/pre-init-dev-script.js +311 -0
  187. package/dist/lib/pre-init-dev-script.js.map +1 -0
  188. package/dist/mahameru.cjs +397 -0
  189. package/dist/mahameru.cjs.map +1 -0
  190. package/dist/mahameru.d.cts +78 -0
  191. package/dist/mahameru.d.ts +78 -0
  192. package/dist/mahameru.js +359 -0
  193. package/dist/mahameru.js.map +1 -0
  194. package/dist/request.cjs +35 -0
  195. package/dist/request.cjs.map +1 -0
  196. package/dist/request.d.cts +4 -0
  197. package/dist/request.d.ts +4 -0
  198. package/dist/request.js +13 -0
  199. package/dist/request.js.map +1 -0
  200. package/dist/response.cjs +35 -0
  201. package/dist/response.cjs.map +1 -0
  202. package/dist/response.d.cts +4 -0
  203. package/dist/response.d.ts +4 -0
  204. package/dist/response.js +13 -0
  205. package/dist/response.js.map +1 -0
  206. package/dist/types.cjs +1 -0
  207. package/dist/types.cjs.map +1 -0
  208. package/dist/types.d.cts +2 -0
  209. package/dist/types.d.ts +2 -0
  210. package/dist/types.js +1 -0
  211. package/dist/types.js.map +1 -0
  212. package/dist/utils/import-dynamic-module.cjs +34 -0
  213. package/dist/utils/import-dynamic-module.cjs.map +1 -0
  214. package/dist/utils/import-dynamic-module.d.cts +3 -0
  215. package/dist/utils/import-dynamic-module.d.ts +3 -0
  216. package/dist/utils/import-dynamic-module.js +12 -0
  217. package/dist/utils/import-dynamic-module.js.map +1 -0
  218. package/package.json +70 -0
@@ -0,0 +1,311 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
+
4
+ // src/lib/pre-init-dev-script.ts
5
+ import { readdir, stat, writeFile } from "fs/promises";
6
+ import path2 from "path";
7
+ import { pathToFileURL } from "url";
8
+
9
+ // src/lib/model.generator.ts
10
+ import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from "fs";
11
+ import path from "path";
12
+
13
+ // src/constants.ts
14
+ import { dirname } from "path";
15
+ import { fileURLToPath } from "url";
16
+ var root = process.cwd();
17
+ var __filename = fileURLToPath(import.meta.url);
18
+ var __dirname = dirname(__filename);
19
+ var isCommonJS = typeof module !== "undefined" && !!module.exports;
20
+ var isESModule = !isCommonJS;
21
+
22
+ // src/lib/model.generator.ts
23
+ var ModelGenerator = class {
24
+ static {
25
+ __name(this, "ModelGenerator");
26
+ }
27
+ options;
28
+ constructor(options) {
29
+ this.options = options;
30
+ if (!existsSync(this.options.entitiesPath)) {
31
+ throw new Error(`Entities folder not found: ${this.options.entitiesPath}`);
32
+ }
33
+ }
34
+ generate() {
35
+ const entityFiles = this.getEntityFiles();
36
+ for (const entityFileName of entityFiles) {
37
+ this.generateEntityModel(entityFileName);
38
+ }
39
+ this.createModelIndexFileTemplate();
40
+ return;
41
+ }
42
+ generateEntityModel(entityFileName) {
43
+ const modelName = entityFileName.replace(/\.entity\.ts$/, "");
44
+ const entityPath = path.join(this.options.entitiesPath, entityFileName);
45
+ const modelPath = path.join(this.options.outputPath);
46
+ if (!existsSync(entityPath)) throw new Error(`Entity tidak ditemukan: ${entityPath}`);
47
+ const entityClassName = this.detectClassName(entityPath, modelName);
48
+ this.writeModelFiles(modelPath, [
49
+ {
50
+ name: `${modelName}.model.ts`,
51
+ content: this.createEntityModelTemplate({
52
+ entityPath,
53
+ entityClassName
54
+ })
55
+ }
56
+ ]);
57
+ this.createModelIndexFileTemplate();
58
+ }
59
+ createEntityModelTemplate(options) {
60
+ const entityRelativeFilePath = path.relative(this.options.outputPath, options.entityPath).replace(/\\/g, "/");
61
+ return `import { BaseModel } from 'mahameru';
62
+ import { ${options.entityClassName} } from '${entityRelativeFilePath.replace(".ts", isESModule ? this.options.includeExtensionOnBareModuleImport ? `.${this.options.includeExtensionOnBareModuleImport}` : ".js" : this.options.includeExtensionOnBareModuleImport || "")}';
63
+ import type { DataSource } from 'typeorm';
64
+
65
+ export class ${options.entityClassName}Model extends BaseModel<${options.entityClassName}> {
66
+ constructor(dataSource: DataSource) {
67
+ super(dataSource, ${options.entityClassName})
68
+ }
69
+ }
70
+ `;
71
+ }
72
+ createModelIndexFileTemplate() {
73
+ const modelFiles = this.getModelFiles();
74
+ const dataSourceFilePathRelative = this.resolveImportPath(path.relative(this.options.outputPath, this.options.dataSourceFilePath).replace(/\\/g, "/"));
75
+ let contents = `import dataSource from '${this.options.includeExtensionOnBareModuleImport ? dataSourceFilePathRelative + "/index." + this.options.includeExtensionOnBareModuleImport : dataSourceFilePathRelative}';
76
+
77
+ `;
78
+ for (const model of modelFiles) {
79
+ const modelFilePath = path.join(this.options.outputPath, model);
80
+ if (!existsSync(modelFilePath)) continue;
81
+ const modelClassName = this.detectClassName(modelFilePath, this.resolveImportPath(model));
82
+ contents += `import { ${modelClassName} } from './${this.resolveImportPath(model)}';
83
+ `;
84
+ }
85
+ contents += `
86
+ `;
87
+ for (const model of modelFiles) {
88
+ const modelFilePath = path.join(this.options.outputPath, model);
89
+ if (!existsSync(modelFilePath)) continue;
90
+ const modelClassName = this.detectClassName(modelFilePath, this.resolveImportPath(model));
91
+ const camelName = this.toCamelCase(modelClassName);
92
+ contents += `const ${camelName} = new ${modelClassName}(dataSource)
93
+ `;
94
+ }
95
+ contents += `
96
+ export type {
97
+ `;
98
+ for (const model of modelFiles) {
99
+ const modelFilePath = path.join(this.options.outputPath, model);
100
+ if (!existsSync(modelFilePath)) continue;
101
+ const modelClassName = this.detectClassName(modelFilePath, this.resolveImportPath(model));
102
+ contents += ` ${modelClassName},
103
+ `;
104
+ }
105
+ contents += `}
106
+ `;
107
+ contents += `
108
+ const models = {
109
+ `;
110
+ for (const model of modelFiles) {
111
+ const modelFilePath = path.join(this.options.outputPath, model);
112
+ if (!existsSync(modelFilePath)) continue;
113
+ const modelClassName = this.detectClassName(modelFilePath, this.resolveImportPath(model));
114
+ const camelName = this.toCamelCase(modelClassName);
115
+ contents += ` ${camelName},
116
+ `;
117
+ }
118
+ contents += `}
119
+
120
+ export type Models = typeof models
121
+ export { models }
122
+ `;
123
+ this.writeFile(path.join(this.options.outputPath, "index.ts"), contents);
124
+ }
125
+ resolveImportPath(importPath) {
126
+ const extension = this.options.includeExtensionOnBareModuleImport ? `.${this.options.includeExtensionOnBareModuleImport}` : "";
127
+ return importPath.replace(".ts", extension);
128
+ }
129
+ writeFile(filePath, content) {
130
+ writeFileSync(filePath, content, "utf8");
131
+ return true;
132
+ }
133
+ getEntityFiles() {
134
+ return readdirSync(this.options.entitiesPath).filter((fileName) => fileName.endsWith(".entity.ts")).sort();
135
+ }
136
+ getModelFiles() {
137
+ return readdirSync(this.options.outputPath).filter((fileName) => fileName.endsWith(".model.ts")).sort();
138
+ }
139
+ writeModelFiles(modelPath, files) {
140
+ mkdirSync(modelPath, {
141
+ recursive: true
142
+ });
143
+ for (const file of files) {
144
+ this.writeFileIfMissing(path.join(modelPath, file.name), file.content);
145
+ }
146
+ }
147
+ writeFileIfMissing(filePath, content) {
148
+ if (existsSync(filePath)) {
149
+ this.log("warn", `[skip] ${filePath}`);
150
+ return false;
151
+ }
152
+ writeFileSync(filePath, content, "utf8");
153
+ this.log("log", `[create] ${filePath}`);
154
+ return true;
155
+ }
156
+ detectClassName(filePath, fallbackName) {
157
+ const content = readFileSync(filePath, "utf8");
158
+ const match = content.match(/export\s+(?:abstract\s+)?class\s+([A-Za-z_$][A-Za-z0-9_$]*)/);
159
+ return match?.[1] ?? this.toPascalCase(fallbackName);
160
+ }
161
+ toPascalCase(value) {
162
+ return value.split(/[-_\s.]+/).filter(Boolean).map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join("");
163
+ }
164
+ toCamelCase(value) {
165
+ const pascalCase = this.toPascalCase(value);
166
+ return pascalCase.charAt(0).toLowerCase() + pascalCase.slice(1);
167
+ }
168
+ log(type, message) {
169
+ if (!this.options.debug) return;
170
+ if (type === "error") console.error(message);
171
+ else if (type === "warn") console.warn(message);
172
+ else if (type === "log") console.log(message);
173
+ else throw new Error(`Unknown log type: ${type}`);
174
+ }
175
+ };
176
+
177
+ // src/lib/pre-init-dev-script.ts
178
+ import { existsSync as existsSync2 } from "fs";
179
+ import { TORMDTOGenerator } from "typeorm-dto-generator";
180
+
181
+ // src/lib/helper.ts
182
+ function toKebabCase(str) {
183
+ return str.replace(/([a-z])([A-Z])/g, "$1-$2").toLowerCase();
184
+ }
185
+ __name(toKebabCase, "toKebabCase");
186
+
187
+ // src/lib/pre-init-dev-script.ts
188
+ import { parseArgs } from "util";
189
+ (async () => {
190
+ try {
191
+ const { values } = parseArgs({
192
+ args: process.argv.slice(2),
193
+ options: {
194
+ "init-db": {
195
+ type: "boolean",
196
+ default: false
197
+ }
198
+ }
199
+ });
200
+ if (values["init-db"]) {
201
+ const root2 = process.cwd();
202
+ const srcPath = path2.join(root2, "src");
203
+ const databasesDir = path2.join(root2, "src", "databases");
204
+ await generateEntitiesIndexFiles(databasesDir);
205
+ await generateModels({
206
+ srcPath,
207
+ databasesDir
208
+ });
209
+ await generateDTO(srcPath, databasesDir);
210
+ }
211
+ } catch (error) {
212
+ console.error(error);
213
+ process.exit(1);
214
+ }
215
+ })();
216
+ async function generateEntitiesIndexFiles(databasesDir) {
217
+ const resultScanDir = await readdir(databasesDir);
218
+ if (resultScanDir.length === 0) return;
219
+ for (const fileOrDirName of resultScanDir) {
220
+ const fileOrDirPath = path2.join(databasesDir, fileOrDirName);
221
+ const fileStat = await stat(fileOrDirPath).catch(() => null);
222
+ if (fileStat?.isFile()) continue;
223
+ await generateEntitiesIndexFile(fileOrDirPath);
224
+ }
225
+ }
226
+ __name(generateEntitiesIndexFiles, "generateEntitiesIndexFiles");
227
+ async function generateEntitiesIndexFile(databaseDir) {
228
+ const entitiesPath = path2.join(databaseDir, "entities");
229
+ const indexFilePath = path2.join(entitiesPath, "index.ts");
230
+ const resultScanEntities = await readdir(entitiesPath).catch(() => []);
231
+ if (resultScanEntities.length === 0) return;
232
+ const entities = [];
233
+ for (const entityFile of resultScanEntities) {
234
+ if (entityFile === "index.ts" || entityFile === "index.js" || !entityFile.endsWith(".entity.ts")) continue;
235
+ const entityFilePath = path2.join(entitiesPath, entityFile);
236
+ const entityStat = await stat(entityFilePath).catch(() => null);
237
+ if (!entityStat?.isFile()) continue;
238
+ const fileUrl = pathToFileURL(entityFilePath).href;
239
+ const module2 = await import(fileUrl);
240
+ const exportNames = Object.keys(module2);
241
+ for (const exportName of exportNames) {
242
+ const exportValue = module2[exportName];
243
+ if (isClass(exportValue)) {
244
+ entities.push({
245
+ className: exportValue.name,
246
+ fileName: entityFile.replace(/\.ts$/, ".js")
247
+ });
248
+ }
249
+ }
250
+ }
251
+ if (entities.length === 0) return;
252
+ const importStatements = entities.map((e) => `import { ${e.className} } from './${e.fileName}';`).join("\n");
253
+ const classNamesOnly = entities.map((e) => e.className).join(", ");
254
+ const contents = `${importStatements}
255
+
256
+ export const entities = [${entities.map((e) => e.className).join(", ")}]
257
+
258
+ export { ${classNamesOnly} };
259
+ `;
260
+ await writeFile(indexFilePath, contents, "utf-8");
261
+ }
262
+ __name(generateEntitiesIndexFile, "generateEntitiesIndexFile");
263
+ async function generateModels({ srcPath, databasesDir }) {
264
+ const resultScanDBDir = await readdir(databasesDir);
265
+ if (resultScanDBDir.length === 0) return;
266
+ for (const fileOrDirName of resultScanDBDir) {
267
+ const fileOrDirPath = path2.join(databasesDir, fileOrDirName);
268
+ const fileStat = await stat(fileOrDirPath).catch(() => null);
269
+ if (fileStat?.isFile()) continue;
270
+ const entitiesPath = path2.join(databasesDir, fileOrDirName, "entities");
271
+ if (!existsSync2(entitiesPath)) continue;
272
+ const outputPath = path2.join(srcPath, "models", fileOrDirName);
273
+ const dataSourceFilePath = path2.join(databasesDir, fileOrDirName);
274
+ const generator = new ModelGenerator({
275
+ dbName: toKebabCase(fileOrDirName),
276
+ srcPath,
277
+ entitiesPath,
278
+ outputPath,
279
+ dataSourceFilePath,
280
+ includeExtensionOnBareModuleImport: "js",
281
+ debug: true
282
+ });
283
+ generator.generate();
284
+ }
285
+ }
286
+ __name(generateModels, "generateModels");
287
+ async function generateDTO(srcPath, databasesDir) {
288
+ const resultScanDir = await readdir(databasesDir);
289
+ if (resultScanDir.length === 0) return;
290
+ for (const fileOrDirName of resultScanDir) {
291
+ const fileOrDirPath = path2.join(databasesDir, fileOrDirName);
292
+ const fileStat = await stat(fileOrDirPath).catch(() => null);
293
+ if (fileStat?.isFile()) continue;
294
+ const dto = new TORMDTOGenerator({
295
+ entityPaths: [
296
+ path2.join(fileOrDirPath, "entities", "*.entity.ts")
297
+ ],
298
+ dtoOutputDir: path2.join(srcPath, "types"),
299
+ mapperOutputFile: path2.join(srcPath, "common", "dto", fileOrDirName + ".dto-mapper.ts"),
300
+ debug: true,
301
+ includeExtensionOnImports: "js"
302
+ });
303
+ await dto.run();
304
+ }
305
+ }
306
+ __name(generateDTO, "generateDTO");
307
+ function isClass(v) {
308
+ return typeof v === "function" && /^\s*class\s+/.test(v.toString());
309
+ }
310
+ __name(isClass, "isClass");
311
+ //# sourceMappingURL=pre-init-dev-script.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/pre-init-dev-script.ts","../../src/lib/model.generator.ts","../../src/constants.ts","../../src/lib/helper.ts"],"sourcesContent":["import { readdir, stat, writeFile } from \"node:fs/promises\"\r\nimport path from \"node:path\"\r\nimport { pathToFileURL } from \"node:url\"\r\nimport { ModelGenerator } from \"./model.generator.js\"\r\nimport { existsSync } from \"node:fs\"\r\nimport { TORMDTOGenerator } from \"typeorm-dto-generator\"\r\nimport { toKebabCase } from \"./helper.js\"\r\nimport { parseArgs } from \"node:util\"\r\n\r\n(async () => {\r\n try {\r\n const { values } = parseArgs({\r\n args: process.argv.slice(2),\r\n options: {\r\n 'init-db': { type: 'boolean', default: false },\r\n }\r\n })\r\n\r\n if (values['init-db']) {\r\n const root = process.cwd()\r\n const srcPath = path.join(root, 'src')\r\n const databasesDir = path.join(root, 'src', 'databases')\r\n await generateEntitiesIndexFiles(databasesDir)\r\n await generateModels({\r\n srcPath,\r\n databasesDir\r\n })\r\n await generateDTO(srcPath, databasesDir)\r\n }\r\n } catch (error) {\r\n console.error(error)\r\n\r\n process.exit(1)\r\n }\r\n})()\r\n\r\nasync function generateEntitiesIndexFiles(databasesDir: string) {\r\n const resultScanDir = await readdir(databasesDir)\r\n\r\n if (resultScanDir.length === 0)\r\n return\r\n\r\n for (const fileOrDirName of resultScanDir) {\r\n const fileOrDirPath = path.join(databasesDir, fileOrDirName)\r\n const fileStat = await stat(fileOrDirPath).catch(() => null)\r\n\r\n if (fileStat?.isFile())\r\n continue\r\n\r\n await generateEntitiesIndexFile(fileOrDirPath)\r\n }\r\n}\r\n\r\nasync function generateEntitiesIndexFile(databaseDir: string) {\r\n const entitiesPath = path.join(databaseDir, 'entities');\r\n const indexFilePath = path.join(entitiesPath, 'index.ts')\r\n const resultScanEntities = await readdir(entitiesPath).catch(() => []);\r\n\r\n if (resultScanEntities.length === 0) return;\r\n\r\n const entities: { className: string; fileName: string }[] = [];\r\n\r\n for (const entityFile of resultScanEntities) {\r\n if (entityFile === 'index.ts' || entityFile === 'index.js' || !entityFile.endsWith('.entity.ts'))\r\n continue;\r\n\r\n const entityFilePath = path.join(entitiesPath, entityFile);\r\n const entityStat = await stat(entityFilePath).catch(() => null);\r\n\r\n if (!entityStat?.isFile()) continue;\r\n\r\n const fileUrl = pathToFileURL(entityFilePath).href;\r\n const module = await import(fileUrl);\r\n const exportNames = Object.keys(module);\r\n\r\n for (const exportName of exportNames) {\r\n const exportValue = module[exportName];\r\n\r\n if (isClass(exportValue)) {\r\n entities.push({\r\n className: exportValue.name,\r\n fileName: entityFile.replace(/\\.ts$/, '.js')\r\n });\r\n }\r\n }\r\n }\r\n\r\n if (entities.length === 0) return;\r\n\r\n const importStatements = entities\r\n .map(e => `import { ${e.className} } from './${e.fileName}';`)\r\n .join('\\n');\r\n\r\n const classNamesOnly = entities.map(e => e.className).join(', ');\r\n\r\n const contents = `${importStatements}\r\n\r\nexport const entities = [${entities.map(e => e.className).join(', ')}]\r\n\r\nexport { ${classNamesOnly} };\r\n`;\r\n\r\n await writeFile(indexFilePath, contents, 'utf-8');\r\n}\r\n\r\nasync function generateModels({ srcPath, databasesDir }: { srcPath: string; databasesDir: string }) {\r\n const resultScanDBDir = await readdir(databasesDir)\r\n\r\n if (resultScanDBDir.length === 0)\r\n return\r\n\r\n for (const fileOrDirName of resultScanDBDir) {\r\n const fileOrDirPath = path.join(databasesDir, fileOrDirName)\r\n const fileStat = await stat(fileOrDirPath).catch(() => null)\r\n\r\n if (fileStat?.isFile())\r\n continue\r\n\r\n const entitiesPath = path.join(databasesDir, fileOrDirName, 'entities')\r\n\r\n if (!existsSync(entitiesPath))\r\n continue\r\n\r\n const outputPath = path.join(srcPath, 'models', fileOrDirName)\r\n const dataSourceFilePath = path.join(databasesDir, fileOrDirName)\r\n\r\n const generator = new ModelGenerator({\r\n dbName: toKebabCase(fileOrDirName),\r\n srcPath,\r\n entitiesPath,\r\n outputPath,\r\n dataSourceFilePath,\r\n includeExtensionOnBareModuleImport: 'js',\r\n debug: true\r\n })\r\n\r\n generator.generate()\r\n }\r\n}\r\n\r\nasync function generateDTO(srcPath: string, databasesDir: string) {\r\n const resultScanDir = await readdir(databasesDir)\r\n\r\n if (resultScanDir.length === 0)\r\n return\r\n\r\n for (const fileOrDirName of resultScanDir) {\r\n const fileOrDirPath = path.join(databasesDir, fileOrDirName)\r\n const fileStat = await stat(fileOrDirPath).catch(() => null)\r\n\r\n if (fileStat?.isFile())\r\n continue\r\n\r\n const dto = new TORMDTOGenerator({\r\n entityPaths: [path.join(fileOrDirPath, 'entities', '*.entity.ts')],\r\n dtoOutputDir: path.join(srcPath, 'types'),\r\n mapperOutputFile: path.join(srcPath, 'common', 'dto', fileOrDirName + '.dto-mapper.ts'),\r\n debug: true,\r\n includeExtensionOnImports: 'js'\r\n })\r\n\r\n await dto.run()\r\n }\r\n}\r\n\r\nfunction isClass(v: unknown): boolean {\r\n return typeof v === 'function' && /^\\s*class\\s+/.test(v.toString());\r\n}","import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from 'fs'\r\nimport path from 'path'\r\nimport { isESModule } from '../constants.js'\r\n\r\ntype ModelGeneratorOptions = {\r\n dbName: string\r\n srcPath: string\r\n entitiesPath: string\r\n outputPath: string\r\n dataSourceFilePath: string\r\n includeExtensionOnBareModuleImport?: 'ts' | 'js'\r\n debug?: boolean\r\n}\r\n\r\nexport class ModelGenerator {\r\n constructor(private options: ModelGeneratorOptions) {\r\n if (!existsSync(this.options.entitiesPath)) {\r\n throw new Error(`Entities folder not found: ${this.options.entitiesPath}`)\r\n }\r\n }\r\n\r\n generate() {\r\n const entityFiles = this.getEntityFiles()\r\n\r\n for (const entityFileName of entityFiles) {\r\n this.generateEntityModel(entityFileName)\r\n }\r\n\r\n this.createModelIndexFileTemplate()\r\n\r\n return\r\n }\r\n\r\n generateEntityModel(entityFileName: string) {\r\n const modelName = entityFileName.replace(/\\.entity\\.ts$/, '')\r\n const entityPath = path.join(this.options.entitiesPath, entityFileName)\r\n const modelPath = path.join(this.options.outputPath)\r\n\r\n if (!existsSync(entityPath))\r\n throw new Error(`Entity tidak ditemukan: ${entityPath}`)\r\n\r\n const entityClassName = this.detectClassName(entityPath, modelName)\r\n\r\n this.writeModelFiles(modelPath, [\r\n {\r\n name: `${modelName}.model.ts`,\r\n content: this.createEntityModelTemplate({\r\n entityPath,\r\n entityClassName\r\n })\r\n }\r\n ])\r\n\r\n this.createModelIndexFileTemplate()\r\n }\r\n\r\n private createEntityModelTemplate(options: { entityPath: string; entityClassName: string; }) {\r\n const entityRelativeFilePath = path.relative(this.options.outputPath, options.entityPath).replace(/\\\\/g, '/')\r\n\r\n return `import { BaseModel } from 'mahameru';\r\nimport { ${options.entityClassName} } from '${entityRelativeFilePath.replace('.ts', isESModule ? (this.options.includeExtensionOnBareModuleImport ? `.${this.options.includeExtensionOnBareModuleImport}` : '.js') : (this.options.includeExtensionOnBareModuleImport || ''))}';\r\nimport type { DataSource } from 'typeorm';\r\n\r\nexport class ${options.entityClassName}Model extends BaseModel<${options.entityClassName}> {\r\n constructor(dataSource: DataSource) {\r\n super(dataSource, ${options.entityClassName})\r\n }\r\n}\r\n`\r\n }\r\n\r\n private createModelIndexFileTemplate() {\r\n const modelFiles = this.getModelFiles()\r\n const dataSourceFilePathRelative = this.resolveImportPath(path.relative(this.options.outputPath, this.options.dataSourceFilePath).replace(/\\\\/g, '/'))\r\n\r\n let contents = `import dataSource from '${this.options.includeExtensionOnBareModuleImport ? dataSourceFilePathRelative + '/index.' + this.options.includeExtensionOnBareModuleImport : dataSourceFilePathRelative}';\\n\\n`;\r\n\r\n for (const model of modelFiles) {\r\n const modelFilePath = path.join(this.options.outputPath, model)\r\n\r\n if (!existsSync(modelFilePath)) continue\r\n\r\n const modelClassName = this.detectClassName(modelFilePath, this.resolveImportPath(model))\r\n\r\n contents += `import { ${modelClassName} } from './${this.resolveImportPath(model)}';\\n`;\r\n }\r\n\r\n contents += `\\n`;\r\n\r\n for (const model of modelFiles) {\r\n const modelFilePath = path.join(this.options.outputPath, model)\r\n\r\n if (!existsSync(modelFilePath)) continue\r\n\r\n const modelClassName = this.detectClassName(modelFilePath, this.resolveImportPath(model))\r\n const camelName = this.toCamelCase(modelClassName)\r\n contents += `const ${camelName} = new ${modelClassName}(dataSource)\\n`;\r\n }\r\n\r\n contents += `\\nexport type {\\n`;\r\n\r\n for (const model of modelFiles) {\r\n const modelFilePath = path.join(this.options.outputPath, model)\r\n\r\n if (!existsSync(modelFilePath)) continue\r\n\r\n const modelClassName = this.detectClassName(modelFilePath, this.resolveImportPath(model))\r\n contents += `\\t${modelClassName},\\n`;\r\n }\r\n\r\n contents += `}\\n`;\r\n\r\n contents += `\\nconst models = {\\n`;\r\n\r\n for (const model of modelFiles) {\r\n const modelFilePath = path.join(this.options.outputPath, model)\r\n\r\n if (!existsSync(modelFilePath)) continue\r\n\r\n const modelClassName = this.detectClassName(modelFilePath, this.resolveImportPath(model))\r\n const camelName = this.toCamelCase(modelClassName)\r\n contents += `\\t${camelName},\\n`;\r\n }\r\n\r\n contents += `}\\n\\nexport type Models = typeof models\\nexport { models }\\n`;\r\n\r\n this.writeFile(path.join(this.options.outputPath, 'index.ts'), contents)\r\n }\r\n\r\n private resolveImportPath(importPath: string) {\r\n const extension = this.options.includeExtensionOnBareModuleImport ? `.${this.options.includeExtensionOnBareModuleImport}` : ''\r\n\r\n return importPath.replace('.ts', extension)\r\n }\r\n\r\n private writeFile(filePath: string, content: string) {\r\n writeFileSync(filePath, content, 'utf8')\r\n // this.log('warn',`[create] ${filePath}`)\r\n\r\n return true\r\n }\r\n\r\n private getEntityFiles() {\r\n return readdirSync(this.options.entitiesPath)\r\n .filter(fileName => fileName.endsWith('.entity.ts'))\r\n .sort()\r\n }\r\n\r\n private getModelFiles() {\r\n return readdirSync(this.options.outputPath)\r\n .filter(fileName => fileName.endsWith('.model.ts'))\r\n .sort()\r\n }\r\n\r\n private writeModelFiles(modelPath: string, files: { name: string; content: string }[]) {\r\n mkdirSync(modelPath, {\r\n recursive: true\r\n })\r\n\r\n for (const file of files) {\r\n this.writeFileIfMissing(path.join(modelPath, file.name), file.content)\r\n }\r\n }\r\n\r\n private writeFileIfMissing(filePath: string, content: string) {\r\n if (existsSync(filePath)) {\r\n this.log('warn', `[skip] ${filePath}`)\r\n\r\n return false\r\n }\r\n\r\n writeFileSync(filePath, content, 'utf8')\r\n this.log('log', `[create] ${filePath}`)\r\n\r\n return true\r\n }\r\n\r\n private detectClassName(filePath: string, fallbackName: string) {\r\n const content = readFileSync(filePath, 'utf8')\r\n const match = content.match(/export\\s+(?:abstract\\s+)?class\\s+([A-Za-z_$][A-Za-z0-9_$]*)/)\r\n\r\n return match?.[1] ?? this.toPascalCase(fallbackName)\r\n }\r\n\r\n private toPascalCase(value: string) {\r\n return value\r\n .split(/[-_\\s.]+/)\r\n .filter(Boolean)\r\n .map(part => part.charAt(0).toUpperCase() + part.slice(1))\r\n .join('')\r\n }\r\n\r\n toCamelCase(value: string) {\r\n const pascalCase = this.toPascalCase(value)\r\n\r\n return pascalCase.charAt(0).toLowerCase() + pascalCase.slice(1)\r\n }\r\n\r\n private log(type: 'log' | 'warn' | 'error', message: string) {\r\n if (!this.options.debug) return\r\n\r\n if (type === 'error') console.error(message)\r\n else if (type === 'warn') console.warn(message)\r\n else if (type === 'log') console.log(message)\r\n else throw new Error(`Unknown log type: ${type}`)\r\n }\r\n}\r\n\r\n// const root = process.cwd()\r\n// const srcPath = path.join(root, 'src')\r\n// const entitiesPath = path.join(srcPath, 'databases', 'db-test', 'entities')\r\n// const outputPath = path.join(srcPath, 'models')\r\n// const baseModelFilePath = path.join(srcPath, 'common', 'base', 'base.model.ts')\r\n// const dataSourceFilePath = path.join(srcPath, 'databases', 'db-test')\r\n\r\n// const generator = new ModelGenerator({\r\n// srcPath,\r\n// entitiesPath,\r\n// outputPath,\r\n// baseModelFilePath,\r\n// dataSourceFilePath,\r\n// debug: true\r\n// })\r\n\r\n// const isSingleModule = process.argv[2];\r\n\r\n// if (!isSingleModule) {\r\n// generator.generate()\r\n// } else {\r\n// if (typeof isSingleModule === 'string' && isSingleModule === '--name') {\r\n// const moduleName = process.argv[3]\r\n\r\n// if (!moduleName) {\r\n// console.error('Module name is required')\r\n\r\n// process.exit(1)\r\n// }\r\n\r\n// if (typeof moduleName === 'string') {\r\n// generator.generateEntityModel(moduleName + '.entity.ts')\r\n// }\r\n// }\r\n// }\r\n","import { dirname } from \"node:path\";\r\nimport { fileURLToPath } from \"node:url\";\r\n\r\nexport const root = process.cwd();\r\nexport const __filename = fileURLToPath(import.meta.url);\r\nexport const __dirname = dirname(__filename);\r\nexport const isCommonJS = typeof module !== 'undefined' && !!module.exports;\r\nexport const isESModule = !isCommonJS;\r\n","export function toKebabCase(str: string) {\r\n return str.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();\r\n}\r\n\r\nexport function toPascalCase(str: string) {\r\n return str.replace(/(?:^|[-_])[a-z]/g, (match) => match.toUpperCase());\r\n}\r\n\r\nexport function toCamelCase(str: string) {\r\n return str.replace(/(?:^|[-_])[a-z]/g, (match) => match.toUpperCase());\r\n}\r\n\r\nexport function toTitleCase(str: string) {\r\n return str.replace(/(?:^|[-_])[a-z]/g, (match) => match.toUpperCase());\r\n}\r\n\r\nexport function toSnakeCase(str: string) {\r\n return str.replace(/([a-z])([A-Z])/g, '$1_$2').toLowerCase();\r\n}\r\n\r\nexport function toConstantCase(str: string) {\r\n return str.replace(/([a-z])([A-Z])/g, '$1_$2').toUpperCase();\r\n}\r\n\r\nexport function toDotCase(str: string) {\r\n return str.replace(/([a-z])([A-Z])/g, '$1.$2').toLowerCase();\r\n}\r\n\r\nexport function toSpaceCase(str: string) {\r\n return str.replace(/([a-z])([A-Z])/g, '$1 $2').toLowerCase();\r\n}\r\n\r\nexport function toDashCase(str: string) {\r\n return str.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();\r\n}\r\n\r\nexport function toPathCase(str: string) {\r\n return str.replace(/([a-z])([A-Z])/g, '$1/$2').toLowerCase();\r\n}\r\n\r\nexport function toHeaderCase(str: string) {\r\n return str.replace(/([a-z])([A-Z])/g, '$1 $2').toLowerCase();\r\n}"],"mappings":"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","names":["readdir","stat","writeFile","path","pathToFileURL","existsSync","mkdirSync","readdirSync","readFileSync","writeFileSync","path","dirname","fileURLToPath","root","process","cwd","__filename","url","__dirname","isCommonJS","module","exports","isESModule","ModelGenerator","options","existsSync","entitiesPath","Error","generate","entityFiles","getEntityFiles","entityFileName","generateEntityModel","createModelIndexFileTemplate","modelName","replace","entityPath","path","join","modelPath","outputPath","entityClassName","detectClassName","writeModelFiles","name","content","createEntityModelTemplate","entityRelativeFilePath","relative","isESModule","includeExtensionOnBareModuleImport","modelFiles","getModelFiles","dataSourceFilePathRelative","resolveImportPath","dataSourceFilePath","contents","model","modelFilePath","modelClassName","camelName","toCamelCase","writeFile","importPath","extension","filePath","writeFileSync","readdirSync","filter","fileName","endsWith","sort","files","mkdirSync","recursive","file","writeFileIfMissing","log","fallbackName","readFileSync","match","toPascalCase","value","split","Boolean","map","part","charAt","toUpperCase","slice","pascalCase","toLowerCase","type","message","debug","console","error","warn","existsSync","TORMDTOGenerator","toKebabCase","str","replace","toLowerCase","parseArgs","values","parseArgs","args","process","argv","slice","options","type","default","root","cwd","srcPath","path","join","databasesDir","generateEntitiesIndexFiles","generateModels","generateDTO","error","console","exit","resultScanDir","readdir","length","fileOrDirName","fileOrDirPath","fileStat","stat","catch","isFile","generateEntitiesIndexFile","databaseDir","entitiesPath","indexFilePath","resultScanEntities","entities","entityFile","endsWith","entityFilePath","entityStat","fileUrl","pathToFileURL","href","module","exportNames","Object","keys","exportName","exportValue","isClass","push","className","name","fileName","replace","importStatements","map","e","classNamesOnly","contents","writeFile","resultScanDBDir","existsSync","outputPath","dataSourceFilePath","generator","ModelGenerator","dbName","toKebabCase","includeExtensionOnBareModuleImport","debug","generate","dto","TORMDTOGenerator","entityPaths","dtoOutputDir","mapperOutputFile","includeExtensionOnImports","run","v","test","toString"]}