@skalfa/skalfa-api-core 1.0.3 → 1.0.8
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.
- package/CONTRIBUTING.md +45 -0
- package/LICENSE +21 -0
- package/README.md +60 -0
- package/dist/auth/auth.d.ts +18 -15
- package/dist/auth/auth.js +20 -203
- package/dist/auth/auth.js.map +1 -1
- package/dist/auth/create-access-token.d.ts +4 -0
- package/dist/auth/create-access-token.js +26 -0
- package/dist/auth/create-access-token.js.map +1 -0
- package/dist/auth/create-user-mail-token.d.ts +4 -0
- package/dist/auth/create-user-mail-token.js +19 -0
- package/dist/auth/create-user-mail-token.js.map +1 -0
- package/dist/auth/helpers/generate-agent-id.d.ts +1 -0
- package/dist/auth/helpers/generate-agent-id.js +7 -0
- package/dist/auth/helpers/generate-agent-id.js.map +1 -0
- package/dist/auth/helpers/get-request-ip.d.ts +1 -0
- package/dist/auth/helpers/get-request-ip.js +4 -0
- package/dist/auth/helpers/get-request-ip.js.map +1 -0
- package/dist/auth/helpers/get-user-permissions.d.ts +1 -0
- package/dist/auth/helpers/get-user-permissions.js +9 -0
- package/dist/auth/helpers/get-user-permissions.js.map +1 -0
- package/dist/auth/helpers/index.d.ts +3 -0
- package/dist/auth/helpers/index.js +4 -0
- package/dist/auth/helpers/index.js.map +1 -0
- package/dist/auth/list-user-sessions.d.ts +1 -0
- package/dist/auth/list-user-sessions.js +10 -0
- package/dist/auth/list-user-sessions.js.map +1 -0
- package/dist/auth/revalidate-user-permissions-by-role.d.ts +1 -0
- package/dist/auth/revalidate-user-permissions-by-role.js +12 -0
- package/dist/auth/revalidate-user-permissions-by-role.js.map +1 -0
- package/dist/auth/revalidate-user-permissions.d.ts +1 -0
- package/dist/auth/revalidate-user-permissions.js +21 -0
- package/dist/auth/revalidate-user-permissions.js.map +1 -0
- package/dist/auth/revoke-access-token.d.ts +1 -0
- package/dist/auth/revoke-access-token.js +5 -0
- package/dist/auth/revoke-access-token.js.map +1 -0
- package/dist/auth/verify-access-token.d.ts +1 -0
- package/dist/auth/verify-access-token.js +47 -0
- package/dist/auth/verify-access-token.js.map +1 -0
- package/dist/auth/verify-user-mail-token.d.ts +1 -0
- package/dist/auth/verify-user-mail-token.js +21 -0
- package/dist/auth/verify-user-mail-token.js.map +1 -0
- package/dist/commands/cli.js +18 -27
- package/dist/commands/cli.js.map +1 -1
- package/dist/commands/make/basic-controller.js +1 -1
- package/dist/commands/make/basic-controller.js.map +1 -1
- package/dist/commands/make/basic-migration.d.ts +1 -1
- package/dist/commands/make/basic-migration.js +2 -2
- package/dist/commands/make/basic-migration.js.map +1 -1
- package/dist/commands/make/basic-model.js +1 -1
- package/dist/commands/make/basic-model.js.map +1 -1
- package/dist/commands/make/basic-seeder.js +1 -1
- package/dist/commands/make/basic-seeder.js.map +1 -1
- package/dist/commands/make/blueprint.js +1 -1
- package/dist/commands/make/blueprint.js.map +1 -1
- package/dist/commands/make/da-migration.js +3 -3
- package/dist/commands/make/da-migration.js.map +1 -1
- package/dist/commands/make/mail.js +2 -2
- package/dist/commands/make/mail.js.map +1 -1
- package/dist/commands/make/notification.js +1 -1
- package/dist/commands/make/notification.js.map +1 -1
- package/dist/commands/make/queue.js +1 -1
- package/dist/commands/make/queue.js.map +1 -1
- package/dist/commands/make/resource.d.ts +2 -0
- package/dist/commands/make/resource.js +19 -0
- package/dist/commands/make/resource.js.map +1 -0
- package/dist/commands/make/skalfa-controller.d.ts +3 -0
- package/dist/commands/make/{light-controller.js → skalfa-controller.js} +9 -9
- package/dist/commands/make/skalfa-controller.js.map +1 -0
- package/dist/commands/make/skalfa-model.d.ts +3 -0
- package/dist/commands/make/{light-model.js → skalfa-model.js} +11 -11
- package/dist/commands/make/skalfa-model.js.map +1 -0
- package/dist/commands/runner/barrels.js.map +1 -1
- package/dist/commands/runner/blueprint/controller-generation.js +2 -2
- package/dist/commands/runner/blueprint/controller-generation.js.map +1 -1
- package/dist/commands/runner/blueprint/documentation-generation.js.map +1 -1
- package/dist/commands/runner/blueprint/migration-generation.js +3 -3
- package/dist/commands/runner/blueprint/migration-generation.js.map +1 -1
- package/dist/commands/runner/blueprint/model-generation.js +2 -2
- package/dist/commands/runner/blueprint/model-generation.js.map +1 -1
- package/dist/commands/runner/blueprint/runner.js +7 -8
- package/dist/commands/runner/blueprint/runner.js.map +1 -1
- package/dist/commands/runner/blueprint/seeder-generation.js +3 -3
- package/dist/commands/runner/blueprint/seeder-generation.js.map +1 -1
- package/dist/commands/runner/da-migration.js +1 -2
- package/dist/commands/runner/da-migration.js.map +1 -1
- package/dist/commands/runner/generate-docs.d.ts +2 -0
- package/dist/commands/runner/generate-docs.js +400 -0
- package/dist/commands/runner/generate-docs.js.map +1 -0
- package/dist/commands/runner/migration.js +1 -1
- package/dist/commands/runner/migration.js.map +1 -1
- package/dist/commands/runner/seeder.js +1 -1
- package/dist/commands/runner/seeder.js.map +1 -1
- package/dist/commands/stubs/index.d.ts +4 -4
- package/dist/commands/stubs/index.js +4 -4
- package/dist/commands/stubs/index.js.map +1 -1
- package/dist/context/context.js +6 -0
- package/dist/context/context.js.map +1 -1
- package/dist/controller/controller.d.ts +17 -30
- package/dist/controller/controller.js +39 -121
- package/dist/controller/controller.js.map +1 -1
- package/dist/controller/response.d.ts +6 -0
- package/dist/controller/response.js +63 -0
- package/dist/controller/response.js.map +1 -0
- package/dist/controller/storage.d.ts +9 -0
- package/dist/controller/storage.js +56 -0
- package/dist/controller/storage.js.map +1 -0
- package/dist/conversion/conversion.d.ts +3 -0
- package/dist/conversion/conversion.js +28 -4
- package/dist/conversion/conversion.js.map +1 -1
- package/dist/conversion/date.d.ts +1 -0
- package/dist/conversion/date.js +77 -0
- package/dist/conversion/date.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/logger/logger.js +33 -0
- package/dist/logger/logger.js.map +1 -1
- package/dist/mail/mail.js +6 -6
- package/dist/mail/mail.js.map +1 -1
- package/dist/middleware/access-log.d.ts +31 -0
- package/dist/middleware/access-log.js +13 -0
- package/dist/middleware/access-log.js.map +1 -0
- package/dist/middleware/auth.d.ts +37 -0
- package/dist/middleware/auth.js +16 -0
- package/dist/middleware/auth.js.map +1 -0
- package/dist/middleware/body-parse.d.ts +35 -0
- package/dist/middleware/body-parse.js +87 -0
- package/dist/middleware/body-parse.js.map +1 -0
- package/dist/middleware/context.d.ts +29 -0
- package/dist/middleware/context.js +8 -0
- package/dist/middleware/context.js.map +1 -0
- package/dist/middleware/cors.d.ts +31 -0
- package/dist/middleware/cors.js +27 -0
- package/dist/middleware/cors.js.map +1 -0
- package/dist/middleware/error-handler.d.ts +33 -0
- package/dist/middleware/error-handler.js +17 -0
- package/dist/middleware/error-handler.js.map +1 -0
- package/dist/middleware/middleware.d.ts +31 -10
- package/dist/middleware/middleware.js +41 -209
- package/dist/middleware/middleware.js.map +1 -1
- package/dist/middleware/private.d.ts +29 -0
- package/dist/middleware/private.js +8 -0
- package/dist/middleware/private.js.map +1 -0
- package/dist/middleware/rate-limiter.d.ts +32 -0
- package/dist/middleware/rate-limiter.js +30 -0
- package/dist/middleware/rate-limiter.js.map +1 -0
- package/dist/notification/index.d.ts +1 -0
- package/dist/notification/index.js +2 -0
- package/dist/notification/index.js.map +1 -0
- package/dist/notification/notification.d.ts +16 -0
- package/dist/notification/notification.js +64 -0
- package/dist/notification/notification.js.map +1 -0
- package/dist/permission/permission.js +9 -0
- package/dist/permission/permission.js.map +1 -1
- package/dist/registry/registry.d.ts +0 -6
- package/dist/registry/registry.js +6 -6
- package/dist/registry/registry.js.map +1 -1
- package/dist/storage/storage.d.ts +3 -3
- package/dist/storage/storage.js.map +1 -1
- package/dist/validation/validation.js +43 -51
- package/dist/validation/validation.js.map +1 -1
- package/package.json +4 -4
- package/src/auth/auth.ts +21 -252
- package/src/auth/create-access-token.ts +29 -0
- package/src/auth/create-user-mail-token.ts +24 -0
- package/src/auth/helpers/generate-agent-id.ts +8 -0
- package/src/auth/helpers/get-request-ip.ts +3 -0
- package/src/auth/helpers/get-user-permissions.ts +15 -0
- package/src/auth/helpers/index.ts +3 -0
- package/src/auth/list-user-sessions.ts +11 -0
- package/src/auth/revalidate-user-permissions-by-role.ts +13 -0
- package/src/auth/revalidate-user-permissions.ts +26 -0
- package/src/auth/revoke-access-token.ts +5 -0
- package/src/auth/verify-access-token.ts +56 -0
- package/src/auth/verify-user-mail-token.ts +24 -0
- package/src/commands/cli.ts +19 -29
- package/src/commands/make/basic-controller.ts +4 -2
- package/src/commands/make/basic-migration.ts +5 -3
- package/src/commands/make/basic-model.ts +3 -1
- package/src/commands/make/basic-seeder.ts +3 -1
- package/src/commands/make/blueprint.ts +3 -1
- package/src/commands/make/da-migration.ts +6 -5
- package/src/commands/make/mail.ts +4 -2
- package/src/commands/make/notification.ts +3 -1
- package/src/commands/make/queue.ts +3 -1
- package/src/commands/make/resource.ts +21 -0
- package/src/commands/make/{light-controller.ts → skalfa-controller.ts} +10 -8
- package/src/commands/make/{light-model.ts → skalfa-model.ts} +12 -10
- package/src/commands/runner/barrels.ts +4 -0
- package/src/commands/runner/blueprint/controller-generation.ts +4 -2
- package/src/commands/runner/blueprint/documentation-generation.ts +2 -0
- package/src/commands/runner/blueprint/migration-generation.ts +5 -3
- package/src/commands/runner/blueprint/model-generation.ts +4 -2
- package/src/commands/runner/blueprint/runner.ts +15 -8
- package/src/commands/runner/blueprint/seeder-generation.ts +5 -3
- package/src/commands/runner/da-migration.ts +3 -2
- package/src/commands/runner/generate-docs.ts +495 -0
- package/src/commands/runner/migration.ts +1 -1
- package/src/commands/runner/seeder.ts +1 -1
- package/src/commands/stubs/index.ts +4 -4
- package/src/context/context.ts +23 -17
- package/src/controller/controller.ts +124 -239
- package/src/controller/response.ts +78 -0
- package/src/controller/storage.ts +78 -0
- package/src/conversion/conversion.ts +90 -64
- package/src/conversion/date.ts +74 -0
- package/src/index.ts +2 -0
- package/src/logger/logger.ts +217 -176
- package/src/mail/mail.ts +85 -85
- package/src/middleware/access-log.ts +15 -0
- package/src/middleware/auth.ts +19 -0
- package/src/middleware/body-parse.ts +83 -0
- package/src/middleware/context.ts +11 -0
- package/src/middleware/cors.ts +31 -0
- package/src/middleware/error-handler.ts +20 -0
- package/src/middleware/middleware.ts +91 -288
- package/src/middleware/private.ts +8 -0
- package/src/middleware/rate-limiter.ts +41 -0
- package/src/notification/index.ts +1 -0
- package/src/notification/notification.ts +86 -0
- package/src/permission/permission.ts +140 -136
- package/src/registry/registry.ts +17 -15
- package/src/route/route.ts +11 -11
- package/src/storage/storage.ts +104 -106
- package/src/validation/validation.ts +322 -346
- package/dist/auth.util.d.ts +0 -19
- package/dist/auth.util.js +0 -183
- package/dist/auth.util.js.map +0 -1
- package/dist/commands/make/light-controller.d.ts +0 -3
- package/dist/commands/make/light-controller.js.map +0 -1
- package/dist/commands/make/light-model.d.ts +0 -3
- package/dist/commands/make/light-model.js.map +0 -1
- package/dist/context.util.d.ts +0 -7
- package/dist/context.util.js +0 -11
- package/dist/context.util.js.map +0 -1
- package/dist/controller.util.d.ts +0 -118
- package/dist/controller.util.js +0 -144
- package/dist/controller.util.js.map +0 -1
- package/dist/conversion.util.d.ts +0 -8
- package/dist/conversion.util.js +0 -52
- package/dist/conversion.util.js.map +0 -1
- package/dist/db/db.d.ts +0 -84
- package/dist/db/db.js +0 -177
- package/dist/db/db.js.map +0 -1
- package/dist/db/index.d.ts +0 -1
- package/dist/db/index.js +0 -2
- package/dist/db/index.js.map +0 -1
- package/dist/db.util.d.ts +0 -84
- package/dist/db.util.js +0 -177
- package/dist/db.util.js.map +0 -1
- package/dist/logger.util.d.ts +0 -30
- package/dist/logger.util.js +0 -126
- package/dist/logger.util.js.map +0 -1
- package/dist/mail.util.d.ts +0 -21
- package/dist/mail.util.js +0 -53
- package/dist/mail.util.js.map +0 -1
- package/dist/middleware.util.d.ts +0 -263
- package/dist/middleware.util.js +0 -233
- package/dist/middleware.util.js.map +0 -1
- package/dist/model/index.d.ts +0 -3
- package/dist/model/index.js +0 -4
- package/dist/model/index.js.map +0 -1
- package/dist/model/model.d.ts +0 -204
- package/dist/model/model.js +0 -1495
- package/dist/model/model.js.map +0 -1
- package/dist/model.util.d.ts +0 -204
- package/dist/model.util.js +0 -1495
- package/dist/model.util.js.map +0 -1
- package/dist/permission.util.d.ts +0 -38
- package/dist/permission.util.js +0 -91
- package/dist/permission.util.js.map +0 -1
- package/dist/registry.util.d.ts +0 -28
- package/dist/registry.util.js +0 -19
- package/dist/registry.util.js.map +0 -1
- package/dist/route.util.d.ts +0 -1
- package/dist/route.util.js +0 -12
- package/dist/route.util.js.map +0 -1
- package/dist/storage.util.d.ts +0 -56
- package/dist/storage.util.js +0 -82
- package/dist/storage.util.js.map +0 -1
- package/dist/validation.util.d.ts +0 -7
- package/dist/validation.util.js +0 -237
- package/dist/validation.util.js.map +0 -1
|
@@ -0,0 +1,400 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import { Command } from "commander";
|
|
4
|
+
// Helper to recursively find files with specific extensions
|
|
5
|
+
function getFiles(dir, extList) {
|
|
6
|
+
let results = [];
|
|
7
|
+
if (!fs.existsSync(dir))
|
|
8
|
+
return results;
|
|
9
|
+
const list = fs.readdirSync(dir);
|
|
10
|
+
for (const file of list) {
|
|
11
|
+
const filePath = path.join(dir, file);
|
|
12
|
+
const stat = fs.statSync(filePath);
|
|
13
|
+
if (stat.isDirectory()) {
|
|
14
|
+
if (file !== "node_modules" && file !== ".next" && file !== ".git") {
|
|
15
|
+
results = results.concat(getFiles(filePath, extList));
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
if (extList.includes(path.extname(file))) {
|
|
20
|
+
results.push(filePath);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return results;
|
|
25
|
+
}
|
|
26
|
+
// Simple parser for object literal string (e.g. c.validation block)
|
|
27
|
+
function parseObjectLiteral(str) {
|
|
28
|
+
const result = {};
|
|
29
|
+
// Strip single-line and multi-line comments
|
|
30
|
+
const cleanStr = str
|
|
31
|
+
.replace(/\/\*[\s\S]*?\*\//g, "")
|
|
32
|
+
.replace(/\/\/.*$/gm, "");
|
|
33
|
+
// Regex to match key: value
|
|
34
|
+
const regex = /(?:(\w+)|["']([^"']+)["'])\s*:\s*([^,}\n]+)/g;
|
|
35
|
+
let match;
|
|
36
|
+
while ((match = regex.exec(cleanStr)) !== null) {
|
|
37
|
+
const key = match[1] || match[2];
|
|
38
|
+
const val = match[3].trim().replace(/['"\[\]]/g, "").replace(/\s+/g, " ");
|
|
39
|
+
result[key] = val;
|
|
40
|
+
}
|
|
41
|
+
return result;
|
|
42
|
+
}
|
|
43
|
+
export const generateDocsCommand = new Command("generate:docs")
|
|
44
|
+
.description("Generate API Markdown documentation from routes, controllers, and models")
|
|
45
|
+
.option("-p, --path <path>", "Filter by specific route path (e.g. --path=/users)")
|
|
46
|
+
.action(async (options) => {
|
|
47
|
+
const projectRoot = process.cwd();
|
|
48
|
+
const filterPath = options.path;
|
|
49
|
+
console.log(`🔍 Scanning project in: ${projectRoot}`);
|
|
50
|
+
if (filterPath) {
|
|
51
|
+
console.log(`Filter path: ${filterPath}`);
|
|
52
|
+
}
|
|
53
|
+
// 1. Parse Models
|
|
54
|
+
const modelFiles = getFiles(path.join(projectRoot, "app", "models"), [".ts"]);
|
|
55
|
+
const models = {};
|
|
56
|
+
for (const file of modelFiles) {
|
|
57
|
+
const content = fs.readFileSync(file, "utf8");
|
|
58
|
+
// Find class User extends Model
|
|
59
|
+
const classMatch = /class\s+(\w+)\s+extends\s+Model/g.exec(content);
|
|
60
|
+
if (!classMatch)
|
|
61
|
+
continue;
|
|
62
|
+
const modelName = classMatch[1];
|
|
63
|
+
const fields = [];
|
|
64
|
+
const relations = [];
|
|
65
|
+
// Parse fields: @Field(["fillable", "selectable", "searchable"]) name!: string
|
|
66
|
+
const fieldRegex = /@Field\(\s*\[([\s\S]*?)\]\s*\)\s*(\w+)\s*!?:?\s*(\w+)/g;
|
|
67
|
+
let fieldMatch;
|
|
68
|
+
while ((fieldMatch = fieldRegex.exec(content)) !== null) {
|
|
69
|
+
const decorators = fieldMatch[1]
|
|
70
|
+
.split(",")
|
|
71
|
+
.map((d) => d.trim().replace(/['"]/g, ""))
|
|
72
|
+
.filter(Boolean);
|
|
73
|
+
fields.push({
|
|
74
|
+
name: fieldMatch[2],
|
|
75
|
+
type: fieldMatch[3],
|
|
76
|
+
decorators,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
// Parse relations: @HasMany(() => Role, "user_id") roles!: Role[]
|
|
80
|
+
const relationRegex = /@(HasMany|HasOne|BelongsTo)\(\s*\(\s*\)\s*=>\s*(\w+)[^]*?\)\s*(\w+)/g;
|
|
81
|
+
let relationMatch;
|
|
82
|
+
while ((relationMatch = relationRegex.exec(content)) !== null) {
|
|
83
|
+
relations.push({
|
|
84
|
+
type: relationMatch[1],
|
|
85
|
+
targetModel: relationMatch[2],
|
|
86
|
+
name: relationMatch[3],
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
models[modelName] = {
|
|
90
|
+
name: modelName,
|
|
91
|
+
fields,
|
|
92
|
+
relations,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
// 2. Parse Controllers
|
|
96
|
+
const controllerFiles = getFiles(path.join(projectRoot, "app", "controllers"), [".ts"]);
|
|
97
|
+
const controllers = {};
|
|
98
|
+
for (const file of controllerFiles) {
|
|
99
|
+
const content = fs.readFileSync(file, "utf8");
|
|
100
|
+
const classMatch = /class\s+(\w+)/g.exec(content);
|
|
101
|
+
if (!classMatch)
|
|
102
|
+
continue;
|
|
103
|
+
const controllerName = classMatch[1];
|
|
104
|
+
const methods = {};
|
|
105
|
+
// Simple method splitter by looking for static async or static methods
|
|
106
|
+
const methodRegex = /static\s+(?:async\s+)?(\w+)\s*\(\s*c\s*:\s*(\w+|any)\s*\)\s*\{([\s\S]*?)(?=\s+static|\s+\/\/|\s*\}\s*$)/g;
|
|
107
|
+
let methodMatch;
|
|
108
|
+
while ((methodMatch = methodRegex.exec(content)) !== null) {
|
|
109
|
+
const methodName = methodMatch[1];
|
|
110
|
+
const body = methodMatch[3];
|
|
111
|
+
const isMagicResolve = body.includes(".resolve(c)");
|
|
112
|
+
const isMagicPump = body.includes(".pump(");
|
|
113
|
+
// Parse c.validation<ModelName>({ ... })
|
|
114
|
+
let validationModel;
|
|
115
|
+
let validationRules = {};
|
|
116
|
+
const valRegex = /c\.validation(?:<(\w+)>)?\(\s*(\{[\s\S]*?\})\s*\)/g;
|
|
117
|
+
const valMatch = valRegex.exec(body);
|
|
118
|
+
if (valMatch) {
|
|
119
|
+
validationModel = valMatch[1];
|
|
120
|
+
validationRules = parseObjectLiteral(valMatch[2]);
|
|
121
|
+
}
|
|
122
|
+
// Parse custom query parameters: c.getQuery.field, c.query.field, or destructuring
|
|
123
|
+
const customQueryParams = [];
|
|
124
|
+
const queryFieldRegex = /\bc\.(?:getQuery|query)\.(\w+)\b/g;
|
|
125
|
+
let qfMatch;
|
|
126
|
+
while ((qfMatch = queryFieldRegex.exec(body)) !== null) {
|
|
127
|
+
customQueryParams.push(qfMatch[1]);
|
|
128
|
+
}
|
|
129
|
+
// Destructuring: const { a, b } = c.getQuery
|
|
130
|
+
const queryDestructRegex = /const\s*\{\s*([\w\s,]+)\s*\}\s*=\s*c\.(?:getQuery|query)/g;
|
|
131
|
+
let qdMatch;
|
|
132
|
+
while ((qdMatch = queryDestructRegex.exec(body)) !== null) {
|
|
133
|
+
qdMatch[1].split(",").forEach((p) => {
|
|
134
|
+
const trimmed = p.trim();
|
|
135
|
+
if (trimmed)
|
|
136
|
+
customQueryParams.push(trimmed);
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
// Parse custom payload fields: c.payload.field, c.body.field, or destructuring
|
|
140
|
+
const customPayloadFields = [];
|
|
141
|
+
const payloadFieldRegex = /\bc\.(?:payload|body)\.(\w+)\b/g;
|
|
142
|
+
let pfMatch;
|
|
143
|
+
while ((pfMatch = payloadFieldRegex.exec(body)) !== null) {
|
|
144
|
+
customPayloadFields.push(pfMatch[1]);
|
|
145
|
+
}
|
|
146
|
+
const payloadDestructRegex = /const\s*\{\s*([\w\s,]+)\s*\}\s*=\s*c\.(?:payload|body)/g;
|
|
147
|
+
let pdMatch;
|
|
148
|
+
while ((pdMatch = payloadDestructRegex.exec(body)) !== null) {
|
|
149
|
+
pdMatch[1].split(",").forEach((p) => {
|
|
150
|
+
const trimmed = p.trim();
|
|
151
|
+
if (trimmed)
|
|
152
|
+
customPayloadFields.push(trimmed);
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
methods[methodName] = {
|
|
156
|
+
methodName,
|
|
157
|
+
isMagicResolve,
|
|
158
|
+
isMagicPump,
|
|
159
|
+
validationModel,
|
|
160
|
+
validationRules,
|
|
161
|
+
customQueryParams: Array.from(new Set(customQueryParams)),
|
|
162
|
+
customPayloadFields: Array.from(new Set(customPayloadFields)),
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
controllers[controllerName] = {
|
|
166
|
+
name: controllerName,
|
|
167
|
+
methods,
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
// 3. Parse Routes
|
|
171
|
+
const routeFiles = getFiles(path.join(projectRoot, "app", "routes"), [".ts"]);
|
|
172
|
+
const routesList = [];
|
|
173
|
+
for (const file of routeFiles) {
|
|
174
|
+
const content = fs.readFileSync(file, "utf8");
|
|
175
|
+
const filename = path.basename(file);
|
|
176
|
+
// We want to find Elysia route registrations and api() helper registrations
|
|
177
|
+
// Group: app.group('/api', (route) => { ... })
|
|
178
|
+
// Let's capture the group path
|
|
179
|
+
const groupRegex = /\.group\(\s*['"]([^'"]+)['"]/g;
|
|
180
|
+
let groupPrefix = "";
|
|
181
|
+
const groupMatch = groupRegex.exec(content);
|
|
182
|
+
if (groupMatch) {
|
|
183
|
+
groupPrefix = groupMatch[1]; // e.g. "/api"
|
|
184
|
+
}
|
|
185
|
+
// 1. Standard routes: route.get('/path', Controller.method)
|
|
186
|
+
const routeRegex = /route\.(\w+)\(\s*['"]([^'"]+)['"]\s*,\s*(\w+)\.(\w+)\)/g;
|
|
187
|
+
let rMatch;
|
|
188
|
+
while ((rMatch = routeRegex.exec(content)) !== null) {
|
|
189
|
+
routesList.push({
|
|
190
|
+
method: rMatch[1].toUpperCase(),
|
|
191
|
+
path: `${groupPrefix}${rMatch[2]}`.replace(/\/+/g, "/"),
|
|
192
|
+
controllerName: rMatch[3],
|
|
193
|
+
methodName: rMatch[4],
|
|
194
|
+
routesFile: filename,
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
// 2. Resource routes: api(route, "/users", UserController)
|
|
198
|
+
const resourceRegex = /api\(\s*\w+\s*,\s*['"]([^'"]+)['"]\s*,\s*(\w+)\)/g;
|
|
199
|
+
let resMatch;
|
|
200
|
+
while ((resMatch = resourceRegex.exec(content)) !== null) {
|
|
201
|
+
const basePath = `${groupPrefix}${resMatch[1]}`.replace(/\/+/g, "/");
|
|
202
|
+
const controllerName = resMatch[2];
|
|
203
|
+
// Standard RESTful mappings for api()
|
|
204
|
+
const resourceMethods = [
|
|
205
|
+
{ method: "GET", path: basePath, methodName: "index" },
|
|
206
|
+
{ method: "POST", path: basePath, methodName: "store" },
|
|
207
|
+
{ method: "PUT", path: `${basePath}/:id`.replace(/\/+/g, "/"), methodName: "update" },
|
|
208
|
+
{ method: "DELETE", path: `${basePath}/:id`.replace(/\/+/g, "/"), methodName: "destroy" },
|
|
209
|
+
];
|
|
210
|
+
for (const rm of resourceMethods) {
|
|
211
|
+
routesList.push({
|
|
212
|
+
method: rm.method,
|
|
213
|
+
path: rm.path,
|
|
214
|
+
controllerName,
|
|
215
|
+
methodName: rm.methodName,
|
|
216
|
+
routesFile: filename,
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
// 4. Generate Markdown Documentation
|
|
222
|
+
let generatedCount = 0;
|
|
223
|
+
const docsDir = path.join(projectRoot, "docs");
|
|
224
|
+
if (!fs.existsSync(docsDir)) {
|
|
225
|
+
fs.mkdirSync(docsDir, { recursive: true });
|
|
226
|
+
}
|
|
227
|
+
for (const route of routesList) {
|
|
228
|
+
const fullPath = route.path;
|
|
229
|
+
// Filter by path if requested
|
|
230
|
+
if (filterPath && !fullPath.startsWith(filterPath)) {
|
|
231
|
+
continue;
|
|
232
|
+
}
|
|
233
|
+
const controller = controllers[route.controllerName];
|
|
234
|
+
if (!controller)
|
|
235
|
+
continue;
|
|
236
|
+
const methodInfo = controller.methods[route.methodName];
|
|
237
|
+
if (!methodInfo)
|
|
238
|
+
continue;
|
|
239
|
+
// Find associated model
|
|
240
|
+
// First check if validation specified a model, otherwise guess from controller name or model usages
|
|
241
|
+
let modelName = methodInfo.validationModel;
|
|
242
|
+
if (!modelName) {
|
|
243
|
+
// Guess from controller name (e.g., UserController -> User)
|
|
244
|
+
const guessed = route.controllerName.replace("Controller", "");
|
|
245
|
+
if (models[guessed]) {
|
|
246
|
+
modelName = guessed;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
const model = modelName ? models[modelName] : undefined;
|
|
250
|
+
// Determine output directory based on routes file and path
|
|
251
|
+
// If routesFile is not "base.routes.ts", prefix folder with routesFile prefix (e.g. admin.routes.ts -> admin)
|
|
252
|
+
let modulePrefix = "";
|
|
253
|
+
if (route.routesFile !== "base.routes.ts") {
|
|
254
|
+
modulePrefix = route.routesFile.replace(".routes.ts", "");
|
|
255
|
+
}
|
|
256
|
+
// First path segment after the group/api prefix
|
|
257
|
+
const cleanPath = fullPath.replace(/^\/(api|v1)\//, "").replace(/^\//, "");
|
|
258
|
+
const firstSegment = cleanPath.split("/")[0] || "general";
|
|
259
|
+
const targetFolder = modulePrefix
|
|
260
|
+
? path.join(docsDir, modulePrefix, firstSegment)
|
|
261
|
+
: path.join(docsDir, firstSegment);
|
|
262
|
+
if (!fs.existsSync(targetFolder)) {
|
|
263
|
+
fs.mkdirSync(targetFolder, { recursive: true });
|
|
264
|
+
}
|
|
265
|
+
// File Naming: [METHOD]_[SAFE_PATH].md
|
|
266
|
+
// Replace :param with [param], and other unsafe chars with _
|
|
267
|
+
const safePathName = fullPath
|
|
268
|
+
.replace(/:(\w+)/g, "[$1]") // replace :id with [id]
|
|
269
|
+
.replace(/^\//, "")
|
|
270
|
+
.replace(/\/+/g, "_"); // replace slashes with underscore
|
|
271
|
+
const fileName = `${route.method}_${safePathName}.md`;
|
|
272
|
+
const filePath = path.join(targetFolder, fileName);
|
|
273
|
+
// Start building Markdown content
|
|
274
|
+
let md = `# ${route.method} ${fullPath}\n\n`;
|
|
275
|
+
md += `* **Controller**: \`${route.controllerName}.${route.methodName}\`\n`;
|
|
276
|
+
if (model) {
|
|
277
|
+
md += `* **Model**: \`${model.name}\`\n`;
|
|
278
|
+
}
|
|
279
|
+
md += `* **Features**: ${[
|
|
280
|
+
methodInfo.isMagicResolve ? "**[Magic Resolve]**" : "",
|
|
281
|
+
methodInfo.isMagicPump ? "**[Magic Pump]**" : "",
|
|
282
|
+
]
|
|
283
|
+
.filter(Boolean)
|
|
284
|
+
.join(", ") || "None"}\n\n`;
|
|
285
|
+
// 1. Headers Table (Only if GET and supports option mode, or custom headers)
|
|
286
|
+
if (route.method === "GET" && methodInfo.isMagicResolve) {
|
|
287
|
+
md += `## Request Headers (Optional)\n\n`;
|
|
288
|
+
md += `| Key | Example Value |\n`;
|
|
289
|
+
md += `| :--- | :--- |\n`;
|
|
290
|
+
md += `| \`x-option\` | \`"true"\` |\n\n`;
|
|
291
|
+
}
|
|
292
|
+
// 2. Query Parameters Table
|
|
293
|
+
const queryParams = [];
|
|
294
|
+
if (route.method === "GET" && methodInfo.isMagicResolve) {
|
|
295
|
+
queryParams.push({ key: "isOption", example: "true", desc: "Alternative to activate **Dropdown/Option Mode**." }, { key: "option[]", example: '["id", "name"]', desc: "Customizes the columns mapped to `value` and `label` in Option Mode." }, { key: "page", example: "1", desc: "The page number for pagination." }, { key: "paginate", example: "15", desc: "Number of records per page." }, { key: "search", example: '"john"', desc: "Performs a global search across `searchable` fields in the model." }, { key: "filter[column]", example: '"active"', desc: "Filters records by a specific column value." });
|
|
296
|
+
// Add expandable relations
|
|
297
|
+
if (model && model.relations.length > 0) {
|
|
298
|
+
const relationNames = model.relations.map((r) => `\`"${r.name}"\``).join(", ");
|
|
299
|
+
queryParams.push({
|
|
300
|
+
key: "expand",
|
|
301
|
+
example: `"${model.relations[0].name}"`,
|
|
302
|
+
desc: `Eager-loads related models. Available relations: ${relationNames}. Can also be passed as \`expand[]\`.`,
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
queryParams.push({ key: "sort", example: '"-created_at"', desc: "Sorts by a column. Prefix with `-` for descending order." });
|
|
306
|
+
}
|
|
307
|
+
// Add custom query parameters found in controller
|
|
308
|
+
for (const customQ of methodInfo.customQueryParams) {
|
|
309
|
+
// Skip if already in standard params
|
|
310
|
+
if (["page", "paginate", "search", "filter", "expand", "sort", "isOption", "option"].includes(customQ))
|
|
311
|
+
continue;
|
|
312
|
+
queryParams.push({
|
|
313
|
+
key: customQ,
|
|
314
|
+
example: `"value"`,
|
|
315
|
+
desc: "Custom query parameter extracted from controller logic.",
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
if (queryParams.length > 0) {
|
|
319
|
+
md += `## Query Parameters\n\n`;
|
|
320
|
+
md += `| Key | Example Value |\n`;
|
|
321
|
+
md += `| :--- | :--- |\n`;
|
|
322
|
+
for (const q of queryParams) {
|
|
323
|
+
md += `| \`${q.key}\` | \`${q.example}\` |\n`;
|
|
324
|
+
}
|
|
325
|
+
md += `\n`;
|
|
326
|
+
}
|
|
327
|
+
// 3. Payload Table (For POST/PUT/PATCH)
|
|
328
|
+
if (["POST", "PUT", "PATCH"].includes(route.method)) {
|
|
329
|
+
md += `## Payload (JSON Body)\n\n`;
|
|
330
|
+
md += `| Key | Example Value | Required | Validation |\n`;
|
|
331
|
+
md += `| :--- | :--- | :--- | :--- |\n`;
|
|
332
|
+
const payloadFieldsSet = new Set();
|
|
333
|
+
// First add fields from validation rules
|
|
334
|
+
for (const [field, rule] of Object.entries(methodInfo.validationRules)) {
|
|
335
|
+
payloadFieldsSet.add(field);
|
|
336
|
+
const isRequired = rule.includes("required") ? "Yes" : "No";
|
|
337
|
+
md += `| \`${field}\` | \`""\` | ${isRequired} | \`${rule}\` |\n`;
|
|
338
|
+
}
|
|
339
|
+
// Add other fillable fields from Model if not already in validation
|
|
340
|
+
if (model) {
|
|
341
|
+
for (const f of model.fields) {
|
|
342
|
+
if (f.decorators.includes("fillable") && !payloadFieldsSet.has(f.name)) {
|
|
343
|
+
payloadFieldsSet.add(f.name);
|
|
344
|
+
md += `| \`${f.name}\` | \`""\` | No | \`None\` |\n`;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
// Add pumpable relations
|
|
348
|
+
if (methodInfo.isMagicPump) {
|
|
349
|
+
for (const r of model.relations) {
|
|
350
|
+
if (!payloadFieldsSet.has(r.name)) {
|
|
351
|
+
payloadFieldsSet.add(r.name);
|
|
352
|
+
const isArray = r.type === "HasMany" ? "[]" : "";
|
|
353
|
+
md += `| \`${r.name}\` | \`${r.type === "HasMany" ? "[]" : "{}"}\` | No | \`Relation (${r.type})\` |\n`;
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
// Add custom payload fields found in controller
|
|
359
|
+
for (const customP of methodInfo.customPayloadFields) {
|
|
360
|
+
if (!payloadFieldsSet.has(customP)) {
|
|
361
|
+
payloadFieldsSet.add(customP);
|
|
362
|
+
md += `| \`${customP}\` | \`""\` | No | \`Custom\` |\n`;
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
md += `\n`;
|
|
366
|
+
}
|
|
367
|
+
// 4. Response Table
|
|
368
|
+
md += `## Response\n\n`;
|
|
369
|
+
md += `| Key | Example Result |\n`;
|
|
370
|
+
md += `| :--- | :--- |\n`;
|
|
371
|
+
if (route.method === "GET" && methodInfo.isMagicResolve) {
|
|
372
|
+
md += `| \`data\` | \`[]\` |\n`;
|
|
373
|
+
md += `| \`total\` | \`0\` |\n`;
|
|
374
|
+
}
|
|
375
|
+
else if (model) {
|
|
376
|
+
// Show selectable fields of the model
|
|
377
|
+
for (const f of model.fields) {
|
|
378
|
+
if (f.decorators.includes("selectable")) {
|
|
379
|
+
let exampleVal = `""`;
|
|
380
|
+
if (f.type === "number")
|
|
381
|
+
exampleVal = `0`;
|
|
382
|
+
else if (f.type === "boolean")
|
|
383
|
+
exampleVal = `true`;
|
|
384
|
+
else if (f.type === "Date")
|
|
385
|
+
exampleVal = `"${new Date().toISOString()}"`;
|
|
386
|
+
md += `| \`${f.name}\` | \`${exampleVal}\` |\n`;
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
else {
|
|
391
|
+
md += `| \`success\` | \`true\` |\n`;
|
|
392
|
+
}
|
|
393
|
+
md += `\n`;
|
|
394
|
+
fs.writeFileSync(filePath, md, "utf8");
|
|
395
|
+
console.log(`Generated: docs/${path.relative(docsDir, filePath)}`);
|
|
396
|
+
generatedCount++;
|
|
397
|
+
}
|
|
398
|
+
console.log(`🎉 API Documentation generated successfully! Total files: ${generatedCount}`);
|
|
399
|
+
});
|
|
400
|
+
//# sourceMappingURL=generate-docs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-docs.js","sourceRoot":"","sources":["../../../src/commands/runner/generate-docs.ts"],"names":[],"mappings":"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"}
|
|
@@ -78,7 +78,7 @@ async function runMigrationFile() {
|
|
|
78
78
|
const migrated = migrations.map((row) => row.name);
|
|
79
79
|
const migrationsDir = fs.existsSync(path.resolve("./database/migrations"))
|
|
80
80
|
? path.resolve("./database/migrations")
|
|
81
|
-
: path.resolve("./
|
|
81
|
+
: path.resolve("./database/migrations");
|
|
82
82
|
if (!fs.existsSync(migrationsDir)) {
|
|
83
83
|
logger.info("No migrations directory found.");
|
|
84
84
|
return;
|
|
@@ -1 +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,
|
|
1
|
+
{"version":3,"file":"migration.js","sourceRoot":"","sources":["../../../src/commands/runner/migration.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,7 +20,7 @@ export const seederCommand = new Command("seeder")
|
|
|
20
20
|
export const runSeeder = async () => {
|
|
21
21
|
const seedersDir = fs.existsSync(path.join(process.cwd(), "database", "seeders"))
|
|
22
22
|
? path.join(process.cwd(), "database", "seeders")
|
|
23
|
-
: path.join(process.cwd(), "
|
|
23
|
+
: path.join(process.cwd(), "database", "seeders");
|
|
24
24
|
if (!fs.existsSync(seedersDir)) {
|
|
25
25
|
logger.info("No seeders directory found.");
|
|
26
26
|
return;
|
|
@@ -1 +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,
|
|
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,UAAU,EAAE,SAAS,CAAC,CAAC;IACpD,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"}
|
|
@@ -4,10 +4,10 @@ export declare const basicModelStub = "import { Model } from '@utils'\n\nexport
|
|
|
4
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
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
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
|
|
8
|
-
export declare const
|
|
9
|
-
export declare const
|
|
10
|
-
export declare const
|
|
7
|
+
export declare const skalfaControllerStub = "{{ 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 skalfaMigrationStub = "{{ 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 skalfaModelStub = "{{ 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 skalfaSeederStub = "{{ 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
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
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
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";
|
|
@@ -80,7 +80,7 @@ export default class {{ className }} extends DAMigration {
|
|
|
80
80
|
}
|
|
81
81
|
}
|
|
82
82
|
`;
|
|
83
|
-
export const
|
|
83
|
+
export const skalfaControllerStub = `{{ marker }}
|
|
84
84
|
import type { ControllerContext } from "elysia"
|
|
85
85
|
import { permission } from '@utils'
|
|
86
86
|
import { {{ model }} } from '@models'
|
|
@@ -175,7 +175,7 @@ export class {{ name }} {
|
|
|
175
175
|
}
|
|
176
176
|
}
|
|
177
177
|
`;
|
|
178
|
-
export const
|
|
178
|
+
export const skalfaMigrationStub = `{{ marker }}
|
|
179
179
|
import type { Knex } from "knex"
|
|
180
180
|
|
|
181
181
|
export async function up(knex: Knex): Promise<void> {
|
|
@@ -188,7 +188,7 @@ export async function up(knex: Knex): Promise<void> {
|
|
|
188
188
|
|
|
189
189
|
{{ pivot }}
|
|
190
190
|
}`;
|
|
191
|
-
export const
|
|
191
|
+
export const skalfaModelStub = `{{ marker }}
|
|
192
192
|
import { Model, SoftDelete{{ import_utils }} } from '@utils'
|
|
193
193
|
{{ import }}
|
|
194
194
|
|
|
@@ -220,7 +220,7 @@ export class {{ name }} extends Model {
|
|
|
220
220
|
|
|
221
221
|
}
|
|
222
222
|
`;
|
|
223
|
-
export const
|
|
223
|
+
export const skalfaSeederStub = `{{ marker }}
|
|
224
224
|
import { {{ model }} } from "@models";
|
|
225
225
|
|
|
226
226
|
export default async function {{ name }}Seeder() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/stubs/index.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiCjC,CAAC;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG;;;;;;;;;EAShC,CAAC;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG;;;;EAI5B,CAAC;AAEH,MAAM,CAAC,MAAM,eAAe,GAAG;;;;;;;;;CAS9B,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG;;;;;;;;;;EAU3B,CAAC;AAEH,MAAM,CAAC,MAAM,eAAe,GAAG;;;;;;;;;;;CAW9B,CAAC;AAEF,MAAM,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/stubs/index.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiCjC,CAAC;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG;;;;;;;;;EAShC,CAAC;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG;;;;EAI5B,CAAC;AAEH,MAAM,CAAC,MAAM,eAAe,GAAG;;;;;;;;;CAS9B,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG;;;;;;;;;;EAU3B,CAAC;AAEH,MAAM,CAAC,MAAM,eAAe,GAAG;;;;;;;;;;;CAW9B,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8FnC,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;;;;;;;;;;EAYjC,CAAC;AAEH,MAAM,CAAC,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+B9B,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG;;;;;;;;;;;;CAY/B,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;;CAevB,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG;;;;;CAK/B,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG;;;;;;;CAOxB,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG;;;;;;;;;;CAUxB,CAAC"}
|
package/dist/context/context.js
CHANGED
|
@@ -1,9 +1,15 @@
|
|
|
1
1
|
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
2
2
|
const storage = new AsyncLocalStorage();
|
|
3
3
|
export const context = {
|
|
4
|
+
// =====================================>
|
|
5
|
+
// ## Context: run a function within context
|
|
6
|
+
// =====================================>
|
|
4
7
|
run(ctx, fn) {
|
|
5
8
|
return storage.run(ctx, fn);
|
|
6
9
|
},
|
|
10
|
+
// =====================================>
|
|
11
|
+
// ## Context: retrieve context property value
|
|
12
|
+
// =====================================>
|
|
7
13
|
get(key) {
|
|
8
14
|
return storage.getStore()?.[key];
|
|
9
15
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/context/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAMpD,MAAM,OAAO,GAAG,IAAI,iBAAiB,EAAc,CAAA;AAEnD,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,GAAG,CAAI,GAAe,EAAE,EAAW;QACjC,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;IAC7B,CAAC;IAED,GAAG,CAA6B,GAAM;QACpC,OAAO,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,GAAG,CAAC,CAAA;IAClC,CAAC;CACF,CAAA"}
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/context/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAMpD,MAAM,OAAO,GAAG,IAAI,iBAAiB,EAAc,CAAA;AAEnD,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,yCAAyC;IACzC,4CAA4C;IAC5C,yCAAyC;IACzC,GAAG,CAAI,GAAe,EAAE,EAAW;QACjC,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;IAC7B,CAAC;IAED,yCAAyC;IACzC,8CAA8C;IAC9C,yCAAyC;IACzC,GAAG,CAA6B,GAAM;QACpC,OAAO,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,GAAG,CAAC,CAAA;IAClC,CAAC;CACF,CAAA"}
|