kastrick 1.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.
- package/README.md +38 -0
- package/examples/01-hello-world/api/hello.ts +19 -0
- package/examples/02-users-api/README.md +39 -0
- package/examples/02-users-api/api/users/[id].ts +80 -0
- package/examples/02-users-api/api/users/index.ts +50 -0
- package/examples/03-configuration/README.md +39 -0
- package/examples/03-configuration/kastrick.config.json +22 -0
- package/examples/03-configuration/tsconfig.json +20 -0
- package/examples/README.md +48 -0
- package/lib/cli/compile.d.ts +5 -0
- package/lib/cli/compile.d.ts.map +1 -0
- package/lib/cli/compile.js +25 -0
- package/lib/cli/compile.js.map +1 -0
- package/lib/cli/dev.d.ts +5 -0
- package/lib/cli/dev.d.ts.map +1 -0
- package/lib/cli/dev.js +79 -0
- package/lib/cli/dev.js.map +1 -0
- package/lib/cli/index.d.ts +3 -0
- package/lib/cli/index.d.ts.map +1 -0
- package/lib/cli/index.js +63 -0
- package/lib/cli/index.js.map +1 -0
- package/lib/cli/serve.d.ts +5 -0
- package/lib/cli/serve.d.ts.map +1 -0
- package/lib/cli/serve.js +106 -0
- package/lib/cli/serve.js.map +1 -0
- package/lib/core/compiler.d.ts +29 -0
- package/lib/core/compiler.d.ts.map +1 -0
- package/lib/core/compiler.js +153 -0
- package/lib/core/compiler.js.map +1 -0
- package/lib/core/router.d.ts +31 -0
- package/lib/core/router.d.ts.map +1 -0
- package/lib/core/router.js +106 -0
- package/lib/core/router.js.map +1 -0
- package/lib/core/scanner.d.ts +29 -0
- package/lib/core/scanner.d.ts.map +1 -0
- package/lib/core/scanner.js +88 -0
- package/lib/core/scanner.js.map +1 -0
- package/lib/index.d.ts +12 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +35 -0
- package/lib/index.js.map +1 -0
- package/lib/server/expressServer.d.ts +28 -0
- package/lib/server/expressServer.d.ts.map +1 -0
- package/lib/server/expressServer.js +96 -0
- package/lib/server/expressServer.js.map +1 -0
- package/package.json +34 -0
- package/src/cli/compile.ts +27 -0
- package/src/cli/dev.ts +49 -0
- package/src/cli/index.ts +64 -0
- package/src/cli/serve.ts +81 -0
- package/src/core/compiler.ts +147 -0
- package/src/core/router.ts +88 -0
- package/src/core/scanner.ts +72 -0
- package/src/index.ts +38 -0
- package/src/server/expressServer.ts +107 -0
- package/templates/tsconfig.json +20 -0
- package/tsconfig.json +20 -0
package/lib/cli/serve.js
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.serve = serve;
|
|
40
|
+
const express_1 = __importDefault(require("express"));
|
|
41
|
+
const path = __importStar(require("path"));
|
|
42
|
+
const fs = __importStar(require("fs"));
|
|
43
|
+
/**
|
|
44
|
+
* Serve command - runs compiled Express app from /output folder
|
|
45
|
+
*/
|
|
46
|
+
async function serve(port = 3000, rootDir = process.cwd()) {
|
|
47
|
+
const outputDir = path.join(rootDir, "output");
|
|
48
|
+
const manifestPath = path.join(outputDir, "manifest.json");
|
|
49
|
+
// Check if compiled output exists
|
|
50
|
+
if (!fs.existsSync(outputDir)) {
|
|
51
|
+
console.log("❌ /output folder not found. Run 'npx kastrick compile' first.\n");
|
|
52
|
+
process.exit(1);
|
|
53
|
+
}
|
|
54
|
+
if (!fs.existsSync(manifestPath)) {
|
|
55
|
+
console.log("❌ manifest.json not found. Run 'npx kastrick compile' first.\n");
|
|
56
|
+
process.exit(1);
|
|
57
|
+
}
|
|
58
|
+
console.log("🚀 Starting compiled kastrick server...\n");
|
|
59
|
+
const app = (0, express_1.default)();
|
|
60
|
+
app.use(express_1.default.json());
|
|
61
|
+
app.use(express_1.default.urlencoded({ extended: true }));
|
|
62
|
+
// Logging middleware
|
|
63
|
+
app.use((req, res, next) => {
|
|
64
|
+
console.log(`📡 ${req.method} ${req.path}`);
|
|
65
|
+
next();
|
|
66
|
+
});
|
|
67
|
+
// Load manifest
|
|
68
|
+
const manifest = JSON.parse(fs.readFileSync(manifestPath, "utf-8"));
|
|
69
|
+
// Register routes from manifest
|
|
70
|
+
let routeCount = 0;
|
|
71
|
+
for (const route of manifest.routes || []) {
|
|
72
|
+
const handlerPath = path.join(outputDir, "handlers", route.file);
|
|
73
|
+
if (!fs.existsSync(handlerPath)) {
|
|
74
|
+
console.warn(`⚠️ Handler not found: ${handlerPath}`);
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
const method = route.method.toLowerCase();
|
|
78
|
+
const routePath = route.path;
|
|
79
|
+
app[method](routePath, async (req, res) => {
|
|
80
|
+
try {
|
|
81
|
+
// Dynamically require the handler
|
|
82
|
+
const modulePath = path.resolve(handlerPath);
|
|
83
|
+
delete require.cache[modulePath];
|
|
84
|
+
const handler = require(modulePath);
|
|
85
|
+
// Call the appropriate method
|
|
86
|
+
const handlerFn = handler[route.method];
|
|
87
|
+
if (!handlerFn) {
|
|
88
|
+
return res.status(404).json({ error: `${route.method} handler not found` });
|
|
89
|
+
}
|
|
90
|
+
const result = await handlerFn(req, { params: req.params });
|
|
91
|
+
res.status(result.status || 200).json(result.body !== undefined ? result.body : result);
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
console.error(`❌ Handler error in ${route.file}:`, err.message);
|
|
95
|
+
res.status(500).json({ error: err.message || "Internal server error" });
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
routeCount++;
|
|
99
|
+
}
|
|
100
|
+
console.log(`📡 Registered ${routeCount} routes from manifest\n`);
|
|
101
|
+
// Start server
|
|
102
|
+
app.listen(port, () => {
|
|
103
|
+
console.log(`🚀 Compiled server running on http://localhost:${port}\n`);
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=serve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/cli/serve.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { ApiFile } from "./scanner";
|
|
2
|
+
export interface ManifestRoute {
|
|
3
|
+
method: string;
|
|
4
|
+
path: string;
|
|
5
|
+
file: string;
|
|
6
|
+
}
|
|
7
|
+
export interface Manifest {
|
|
8
|
+
routes: ManifestRoute[];
|
|
9
|
+
version: string;
|
|
10
|
+
timestamp: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Compiler - generates the /output folder with compiled handlers
|
|
14
|
+
*/
|
|
15
|
+
export declare class Compiler {
|
|
16
|
+
private outputDir;
|
|
17
|
+
private handlersDir;
|
|
18
|
+
private router;
|
|
19
|
+
constructor(rootDir?: string);
|
|
20
|
+
/**
|
|
21
|
+
* Compile API files to output folder
|
|
22
|
+
*/
|
|
23
|
+
compile(files: ApiFile[]): boolean;
|
|
24
|
+
private ensureDirectories;
|
|
25
|
+
private copyHandlers;
|
|
26
|
+
private generateManifest;
|
|
27
|
+
private generateAppJs;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=compiler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compiler.d.ts","sourceRoot":"","sources":["../../src/core/compiler.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,MAAM,CAAS;gBAEX,OAAO,GAAE,MAAsB;IAM3C;;OAEG;IACH,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,OAAO;IA0BlC,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,YAAY;IA2BpB,OAAO,CAAC,gBAAgB;IAexB,OAAO,CAAC,aAAa;CAkCtB"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.Compiler = void 0;
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const ts = __importStar(require("typescript"));
|
|
40
|
+
const router_1 = require("./router");
|
|
41
|
+
/**
|
|
42
|
+
* Compiler - generates the /output folder with compiled handlers
|
|
43
|
+
*/
|
|
44
|
+
class Compiler {
|
|
45
|
+
constructor(rootDir = process.cwd()) {
|
|
46
|
+
this.outputDir = path.join(rootDir, "output");
|
|
47
|
+
this.handlersDir = path.join(this.outputDir, "handlers");
|
|
48
|
+
this.router = new router_1.Router();
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Compile API files to output folder
|
|
52
|
+
*/
|
|
53
|
+
compile(files) {
|
|
54
|
+
try {
|
|
55
|
+
// Create output directory structure
|
|
56
|
+
this.ensureDirectories();
|
|
57
|
+
// Generate routes
|
|
58
|
+
const routes = this.router.generateRoutes(files);
|
|
59
|
+
// Copy handler files
|
|
60
|
+
this.copyHandlers(files);
|
|
61
|
+
// Generate manifest
|
|
62
|
+
this.generateManifest(routes);
|
|
63
|
+
// Generate app.js (Express app)
|
|
64
|
+
this.generateAppJs(routes);
|
|
65
|
+
console.log(`✅ Compilation successful! Output: ${this.outputDir}`);
|
|
66
|
+
console.log(`📝 Routes registered: ${routes.length}`);
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
console.error(`❌ Compilation failed:`, error);
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
ensureDirectories() {
|
|
75
|
+
if (!fs.existsSync(this.outputDir)) {
|
|
76
|
+
fs.mkdirSync(this.outputDir, { recursive: true });
|
|
77
|
+
}
|
|
78
|
+
if (!fs.existsSync(this.handlersDir)) {
|
|
79
|
+
fs.mkdirSync(this.handlersDir, { recursive: true });
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
copyHandlers(files) {
|
|
83
|
+
for (const file of files) {
|
|
84
|
+
// Change .ts to .js in output
|
|
85
|
+
let targetPath = path.join(this.handlersDir, file.relativePath);
|
|
86
|
+
if (targetPath.endsWith(".ts")) {
|
|
87
|
+
targetPath = targetPath.slice(0, -3) + ".js";
|
|
88
|
+
}
|
|
89
|
+
const targetDir = path.dirname(targetPath);
|
|
90
|
+
if (!fs.existsSync(targetDir)) {
|
|
91
|
+
fs.mkdirSync(targetDir, { recursive: true });
|
|
92
|
+
}
|
|
93
|
+
// Transpile TypeScript to JavaScript
|
|
94
|
+
if (file.relativePath.endsWith(".ts")) {
|
|
95
|
+
const transpiled = ts.transpileModule(file.content || "", {
|
|
96
|
+
compilerOptions: { module: ts.ModuleKind.CommonJS, target: ts.ScriptTarget.ES2020 },
|
|
97
|
+
});
|
|
98
|
+
fs.writeFileSync(targetPath, transpiled.outputText, "utf-8");
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
// Plain JavaScript files - copy as-is
|
|
102
|
+
fs.writeFileSync(targetPath, file.content || "", "utf-8");
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
generateManifest(routes) {
|
|
107
|
+
const manifest = {
|
|
108
|
+
version: "1.0.0",
|
|
109
|
+
timestamp: new Date().toISOString(),
|
|
110
|
+
routes: routes.map((route) => ({
|
|
111
|
+
method: route.method,
|
|
112
|
+
path: route.path,
|
|
113
|
+
file: route.file,
|
|
114
|
+
})),
|
|
115
|
+
};
|
|
116
|
+
const manifestPath = path.join(this.outputDir, "manifest.json");
|
|
117
|
+
fs.writeFileSync(manifestPath, JSON.stringify(manifest, null, 2), "utf-8");
|
|
118
|
+
}
|
|
119
|
+
generateAppJs(routes) {
|
|
120
|
+
const routeCode = routes
|
|
121
|
+
.map((route) => {
|
|
122
|
+
const methodLower = route.method.toLowerCase();
|
|
123
|
+
const importPath = `./${path.join("handlers", route.file).replace(/\\/g, "/")}`;
|
|
124
|
+
return `app.${methodLower}('${route.path}', async (req, res) => {
|
|
125
|
+
try {
|
|
126
|
+
const handler = require('${importPath}');
|
|
127
|
+
const fn = handler.${route.method};
|
|
128
|
+
if (!fn) return res.status(404).json({ error: 'Handler not found' });
|
|
129
|
+
|
|
130
|
+
const result = await fn(req, { params: req.params });
|
|
131
|
+
res.status(result.status || 200).json(result.body || result);
|
|
132
|
+
} catch (err) {
|
|
133
|
+
res.status(500).json({ error: err.message });
|
|
134
|
+
}
|
|
135
|
+
});`;
|
|
136
|
+
})
|
|
137
|
+
.join("\n\n");
|
|
138
|
+
const appCode = `const express = require('express');
|
|
139
|
+
const app = express();
|
|
140
|
+
|
|
141
|
+
app.use(express.json());
|
|
142
|
+
|
|
143
|
+
// Routes from manifest
|
|
144
|
+
${routeCode}
|
|
145
|
+
|
|
146
|
+
module.exports = app;
|
|
147
|
+
`;
|
|
148
|
+
const appPath = path.join(this.outputDir, "app.js");
|
|
149
|
+
fs.writeFileSync(appPath, appCode, "utf-8");
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
exports.Compiler = Compiler;
|
|
153
|
+
//# sourceMappingURL=compiler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compiler.js","sourceRoot":"","sources":["../../src/core/compiler.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AACzB,2CAA6B;AAC7B,+CAAiC;AAEjC,qCAA4C;AAc5C;;GAEG;AACH,MAAa,QAAQ;IAKnB,YAAY,UAAkB,OAAO,CAAC,GAAG,EAAE;QACzC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC9C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QACzD,IAAI,CAAC,MAAM,GAAG,IAAI,eAAM,EAAE,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,KAAgB;QACtB,IAAI,CAAC;YACH,oCAAoC;YACpC,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAEzB,kBAAkB;YAClB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;YAEjD,qBAAqB;YACrB,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;YAEzB,oBAAoB;YACpB,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;YAE9B,gCAAgC;YAChC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YAE3B,OAAO,CAAC,GAAG,CAAC,qCAAqC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;YACnE,OAAO,CAAC,GAAG,CAAC,yBAAyB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;YACtD,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;YAC9C,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAEO,iBAAiB;QACvB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YACnC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,CAAC;QACD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YACrC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAEO,YAAY,CAAC,KAAgB;QACnC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,8BAA8B;YAC9B,IAAI,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;YAChE,IAAI,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC/B,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;YAC/C,CAAC;YAED,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAE3C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC9B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC/C,CAAC;YAED,qCAAqC;YACrC,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBACtC,MAAM,UAAU,GAAG,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,EAAE;oBACxD,eAAe,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE;iBACpF,CAAC,CAAC;gBACH,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,UAAU,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAC/D,CAAC;iBAAM,CAAC;gBACN,sCAAsC;gBACtC,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;IACH,CAAC;IAEO,gBAAgB,CAAC,MAAkB;QACzC,MAAM,QAAQ,GAAa;YACzB,OAAO,EAAE,OAAO;YAChB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBAC7B,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,IAAI,EAAE,KAAK,CAAC,IAAI;aACjB,CAAC,CAAC;SACJ,CAAC;QAEF,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;QAChE,EAAE,CAAC,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAC7E,CAAC;IAEO,aAAa,CAAC,MAAkB;QACtC,MAAM,SAAS,GAAG,MAAM;aACrB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACb,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YAC/C,MAAM,UAAU,GAAG,KAAK,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC;YAChF,OAAO,OAAO,WAAW,KAAK,KAAK,CAAC,IAAI;;+BAEjB,UAAU;yBAChB,KAAK,CAAC,MAAM;;;;;;;;IAQjC,CAAC;QACC,CAAC,CAAC;aACD,IAAI,CAAC,MAAM,CAAC,CAAC;QAEhB,MAAM,OAAO,GAAG;;;;;;EAMlB,SAAS;;;CAGV,CAAC;QAEE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QACpD,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;CACF;AA7HD,4BA6HC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { ApiFile } from "./scanner";
|
|
2
|
+
export interface ApiRoute {
|
|
3
|
+
method: string;
|
|
4
|
+
path: string;
|
|
5
|
+
file: string;
|
|
6
|
+
handlerName: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Router - converts file structure to API routes
|
|
10
|
+
* Maps:
|
|
11
|
+
* - api/hello.js -> /hello (GET)
|
|
12
|
+
* - api/users/index.js -> /users (GET)
|
|
13
|
+
* - api/users/[id].js -> /users/:id (GET)
|
|
14
|
+
*/
|
|
15
|
+
export declare class Router {
|
|
16
|
+
/**
|
|
17
|
+
* Convert file path to route path
|
|
18
|
+
* Handles dynamic segments [id] -> :id
|
|
19
|
+
*/
|
|
20
|
+
filePathToRoute(relativePath: string): string;
|
|
21
|
+
/**
|
|
22
|
+
* Extract HTTP methods from file content
|
|
23
|
+
* Looks for exports: GET, POST, PUT, DELETE, etc.
|
|
24
|
+
*/
|
|
25
|
+
extractMethods(content: string): string[];
|
|
26
|
+
/**
|
|
27
|
+
* Generate routes from API files
|
|
28
|
+
*/
|
|
29
|
+
generateRoutes(files: ApiFile[]): ApiRoute[];
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=router.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/core/router.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;GAMG;AACH,qBAAa,MAAM;IACjB;;;OAGG;IACH,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM;IAyB7C;;;OAGG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;IAczC;;OAEG;IACH,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,QAAQ,EAAE;CAmB7C"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.Router = void 0;
|
|
37
|
+
const path = __importStar(require("path"));
|
|
38
|
+
/**
|
|
39
|
+
* Router - converts file structure to API routes
|
|
40
|
+
* Maps:
|
|
41
|
+
* - api/hello.js -> /hello (GET)
|
|
42
|
+
* - api/users/index.js -> /users (GET)
|
|
43
|
+
* - api/users/[id].js -> /users/:id (GET)
|
|
44
|
+
*/
|
|
45
|
+
class Router {
|
|
46
|
+
/**
|
|
47
|
+
* Convert file path to route path
|
|
48
|
+
* Handles dynamic segments [id] -> :id
|
|
49
|
+
*/
|
|
50
|
+
filePathToRoute(relativePath) {
|
|
51
|
+
// Remove extension
|
|
52
|
+
const withoutExt = relativePath.replace(/\.(js|ts)$/, "");
|
|
53
|
+
// Split into parts
|
|
54
|
+
let parts = withoutExt.split(path.sep);
|
|
55
|
+
// Remove 'index' filename, keep directory
|
|
56
|
+
if (parts[parts.length - 1] === "index") {
|
|
57
|
+
parts = parts.slice(0, -1);
|
|
58
|
+
}
|
|
59
|
+
// Convert [id] to :id (dynamic segments)
|
|
60
|
+
parts = parts.map((part) => {
|
|
61
|
+
if (part.startsWith("[") && part.endsWith("]")) {
|
|
62
|
+
return `:${part.slice(1, -1)}`;
|
|
63
|
+
}
|
|
64
|
+
return part;
|
|
65
|
+
});
|
|
66
|
+
// Build route path
|
|
67
|
+
const route = "/" + parts.join("/");
|
|
68
|
+
return route === "/" ? "/" : route;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Extract HTTP methods from file content
|
|
72
|
+
* Looks for exports: GET, POST, PUT, DELETE, etc.
|
|
73
|
+
*/
|
|
74
|
+
extractMethods(content) {
|
|
75
|
+
const methods = ["GET", "POST", "PUT", "DELETE", "PATCH", "HEAD", "OPTIONS"];
|
|
76
|
+
const foundMethods = [];
|
|
77
|
+
for (const method of methods) {
|
|
78
|
+
if (new RegExp(`export\\s+function\\s+${method}\\s*\\(|export\\s+const\\s+${method}\\s*=`).test(content)) {
|
|
79
|
+
foundMethods.push(method);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// Default to GET if no methods found
|
|
83
|
+
return foundMethods.length > 0 ? foundMethods : ["GET"];
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Generate routes from API files
|
|
87
|
+
*/
|
|
88
|
+
generateRoutes(files) {
|
|
89
|
+
const routes = [];
|
|
90
|
+
for (const file of files) {
|
|
91
|
+
const routePath = this.filePathToRoute(file.relativePath);
|
|
92
|
+
const methods = this.extractMethods(file.content || "");
|
|
93
|
+
for (const method of methods) {
|
|
94
|
+
routes.push({
|
|
95
|
+
method,
|
|
96
|
+
path: routePath,
|
|
97
|
+
file: file.relativePath,
|
|
98
|
+
handlerName: method,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return routes;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
exports.Router = Router;
|
|
106
|
+
//# sourceMappingURL=router.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/core/router.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAA6B;AAU7B;;;;;;GAMG;AACH,MAAa,MAAM;IACjB;;;OAGG;IACH,eAAe,CAAC,YAAoB;QAClC,mBAAmB;QACnB,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;QAE1D,mBAAmB;QACnB,IAAI,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEvC,0CAA0C;QAC1C,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,OAAO,EAAE,CAAC;YACxC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7B,CAAC;QAED,yCAAyC;QACzC,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACzB,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC/C,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjC,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,mBAAmB;QACnB,MAAM,KAAK,GAAG,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpC,OAAO,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;IACrC,CAAC;IAED;;;OAGG;IACH,cAAc,CAAC,OAAe;QAC5B,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;QAC7E,MAAM,YAAY,GAAa,EAAE,CAAC;QAElC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,IAAI,MAAM,CAAC,yBAAyB,MAAM,8BAA8B,MAAM,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBACzG,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QAED,qCAAqC;QACrC,OAAO,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC1D,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,KAAgB;QAC7B,MAAM,MAAM,GAAe,EAAE,CAAC;QAE9B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;YAExD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,MAAM,CAAC,IAAI,CAAC;oBACV,MAAM;oBACN,IAAI,EAAE,SAAS;oBACf,IAAI,EAAE,IAAI,CAAC,YAAY;oBACvB,WAAW,EAAE,MAAM;iBACpB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAtED,wBAsEC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export interface FileInfo {
|
|
2
|
+
filePath: string;
|
|
3
|
+
relativePath: string;
|
|
4
|
+
name: string;
|
|
5
|
+
isDirectory: boolean;
|
|
6
|
+
}
|
|
7
|
+
export interface ApiFile {
|
|
8
|
+
path: string;
|
|
9
|
+
relativePath: string;
|
|
10
|
+
content?: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Scanner - scans the /api folder and extracts file structure
|
|
14
|
+
*/
|
|
15
|
+
export declare class Scanner {
|
|
16
|
+
private apiDir;
|
|
17
|
+
constructor(rootDir?: string);
|
|
18
|
+
/**
|
|
19
|
+
* Check if api folder exists
|
|
20
|
+
*/
|
|
21
|
+
apiDirExists(): boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Recursively scan /api folder
|
|
24
|
+
*/
|
|
25
|
+
scanApiFolder(): ApiFile[];
|
|
26
|
+
private scanDirectory;
|
|
27
|
+
private isApiFile;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=scanner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../src/core/scanner.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,qBAAa,OAAO;IAClB,OAAO,CAAC,MAAM,CAAS;gBAEX,OAAO,GAAE,MAAsB;IAI3C;;OAEG;IACH,YAAY,IAAI,OAAO;IAIvB;;OAEG;IACH,aAAa,IAAI,OAAO,EAAE;IAW1B,OAAO,CAAC,aAAa;IAqBrB,OAAO,CAAC,SAAS;CAGlB"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.Scanner = void 0;
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
/**
|
|
40
|
+
* Scanner - scans the /api folder and extracts file structure
|
|
41
|
+
*/
|
|
42
|
+
class Scanner {
|
|
43
|
+
constructor(rootDir = process.cwd()) {
|
|
44
|
+
this.apiDir = path.join(rootDir, "api");
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Check if api folder exists
|
|
48
|
+
*/
|
|
49
|
+
apiDirExists() {
|
|
50
|
+
return fs.existsSync(this.apiDir);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Recursively scan /api folder
|
|
54
|
+
*/
|
|
55
|
+
scanApiFolder() {
|
|
56
|
+
if (!this.apiDirExists()) {
|
|
57
|
+
console.warn(`⚠️ No /api folder found at ${this.apiDir}`);
|
|
58
|
+
return [];
|
|
59
|
+
}
|
|
60
|
+
const files = [];
|
|
61
|
+
this.scanDirectory(this.apiDir, "", files);
|
|
62
|
+
return files;
|
|
63
|
+
}
|
|
64
|
+
scanDirectory(dir, relativePrefix, files) {
|
|
65
|
+
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
66
|
+
for (const entry of entries) {
|
|
67
|
+
if (entry.name.startsWith("."))
|
|
68
|
+
continue;
|
|
69
|
+
const fullPath = path.join(dir, entry.name);
|
|
70
|
+
const relativePath = path.join(relativePrefix, entry.name);
|
|
71
|
+
if (entry.isDirectory()) {
|
|
72
|
+
this.scanDirectory(fullPath, relativePath, files);
|
|
73
|
+
}
|
|
74
|
+
else if (this.isApiFile(entry.name)) {
|
|
75
|
+
files.push({
|
|
76
|
+
path: fullPath,
|
|
77
|
+
relativePath: relativePath,
|
|
78
|
+
content: fs.readFileSync(fullPath, "utf-8"),
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
isApiFile(filename) {
|
|
84
|
+
return /\.(js|ts)$/.test(filename) && !filename.endsWith(".d.ts");
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
exports.Scanner = Scanner;
|
|
88
|
+
//# sourceMappingURL=scanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../src/core/scanner.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AACzB,2CAA6B;AAe7B;;GAEG;AACH,MAAa,OAAO;IAGlB,YAAY,UAAkB,OAAO,CAAC,GAAG,EAAE;QACzC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC1C,CAAC;IAED;;OAEG;IACH,YAAY;QACV,OAAO,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,aAAa;QACX,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;YACzB,OAAO,CAAC,IAAI,CAAC,+BAA+B,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;YAC3D,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,KAAK,GAAc,EAAE,CAAC;QAC5B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;QAC3C,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,aAAa,CAAC,GAAW,EAAE,cAAsB,EAAE,KAAgB;QACzE,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAE7D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,SAAS;YAEzC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAC5C,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAE3D,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC;YACpD,CAAC;iBAAM,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtC,KAAK,CAAC,IAAI,CAAC;oBACT,IAAI,EAAE,QAAQ;oBACd,YAAY,EAAE,YAAY;oBAC1B,OAAO,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC;iBAC5C,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAEO,SAAS,CAAC,QAAgB;QAChC,OAAO,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACpE,CAAC;CACF;AApDD,0BAoDC"}
|
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface ApiResponse<T> {
|
|
2
|
+
success: boolean;
|
|
3
|
+
data?: T;
|
|
4
|
+
error?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare class ApiHandler {
|
|
7
|
+
private baseUrl;
|
|
8
|
+
constructor(baseUrl: string);
|
|
9
|
+
request<T>(endpoint: string, options?: RequestInit): Promise<ApiResponse<T>>;
|
|
10
|
+
}
|
|
11
|
+
export default ApiHandler;
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,UAAU;IACT,OAAO,CAAC,OAAO;gBAAP,OAAO,EAAE,MAAM;IAE7B,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;CAuBnF;AAED,eAAe,UAAU,CAAC"}
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Kastrick API Logic Package
|
|
3
|
+
// Main entry point
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.ApiHandler = void 0;
|
|
6
|
+
class ApiHandler {
|
|
7
|
+
constructor(baseUrl) {
|
|
8
|
+
this.baseUrl = baseUrl;
|
|
9
|
+
}
|
|
10
|
+
async request(endpoint, options) {
|
|
11
|
+
try {
|
|
12
|
+
const response = await fetch(`${this.baseUrl}${endpoint}`, options);
|
|
13
|
+
const data = await response.json();
|
|
14
|
+
if (!response.ok) {
|
|
15
|
+
return {
|
|
16
|
+
success: false,
|
|
17
|
+
error: (data?.error || 'Request failed'),
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
return {
|
|
21
|
+
success: true,
|
|
22
|
+
data: data,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
return {
|
|
27
|
+
success: false,
|
|
28
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
exports.ApiHandler = ApiHandler;
|
|
34
|
+
exports.default = ApiHandler;
|
|
35
|
+
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA,6BAA6B;AAC7B,mBAAmB;;;AAQnB,MAAa,UAAU;IACrB,YAAoB,OAAe;QAAf,YAAO,GAAP,OAAO,CAAQ;IAAG,CAAC;IAEvC,KAAK,CAAC,OAAO,CAAI,QAAgB,EAAE,OAAqB;QACtD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,QAAQ,EAAE,EAAE,OAAO,CAAC,CAAC;YACpE,MAAM,IAAI,GAAQ,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAExC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,CAAC,IAAI,EAAE,KAAK,IAAI,gBAAgB,CAAW;iBACnD,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,IAAI,EAAE,IAAS;aAChB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;aAChE,CAAC;QACJ,CAAC;IACH,CAAC;CACF;AA1BD,gCA0BC;AAED,kBAAe,UAAU,CAAC"}
|