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.
Files changed (57) hide show
  1. package/README.md +38 -0
  2. package/examples/01-hello-world/api/hello.ts +19 -0
  3. package/examples/02-users-api/README.md +39 -0
  4. package/examples/02-users-api/api/users/[id].ts +80 -0
  5. package/examples/02-users-api/api/users/index.ts +50 -0
  6. package/examples/03-configuration/README.md +39 -0
  7. package/examples/03-configuration/kastrick.config.json +22 -0
  8. package/examples/03-configuration/tsconfig.json +20 -0
  9. package/examples/README.md +48 -0
  10. package/lib/cli/compile.d.ts +5 -0
  11. package/lib/cli/compile.d.ts.map +1 -0
  12. package/lib/cli/compile.js +25 -0
  13. package/lib/cli/compile.js.map +1 -0
  14. package/lib/cli/dev.d.ts +5 -0
  15. package/lib/cli/dev.d.ts.map +1 -0
  16. package/lib/cli/dev.js +79 -0
  17. package/lib/cli/dev.js.map +1 -0
  18. package/lib/cli/index.d.ts +3 -0
  19. package/lib/cli/index.d.ts.map +1 -0
  20. package/lib/cli/index.js +63 -0
  21. package/lib/cli/index.js.map +1 -0
  22. package/lib/cli/serve.d.ts +5 -0
  23. package/lib/cli/serve.d.ts.map +1 -0
  24. package/lib/cli/serve.js +106 -0
  25. package/lib/cli/serve.js.map +1 -0
  26. package/lib/core/compiler.d.ts +29 -0
  27. package/lib/core/compiler.d.ts.map +1 -0
  28. package/lib/core/compiler.js +153 -0
  29. package/lib/core/compiler.js.map +1 -0
  30. package/lib/core/router.d.ts +31 -0
  31. package/lib/core/router.d.ts.map +1 -0
  32. package/lib/core/router.js +106 -0
  33. package/lib/core/router.js.map +1 -0
  34. package/lib/core/scanner.d.ts +29 -0
  35. package/lib/core/scanner.d.ts.map +1 -0
  36. package/lib/core/scanner.js +88 -0
  37. package/lib/core/scanner.js.map +1 -0
  38. package/lib/index.d.ts +12 -0
  39. package/lib/index.d.ts.map +1 -0
  40. package/lib/index.js +35 -0
  41. package/lib/index.js.map +1 -0
  42. package/lib/server/expressServer.d.ts +28 -0
  43. package/lib/server/expressServer.d.ts.map +1 -0
  44. package/lib/server/expressServer.js +96 -0
  45. package/lib/server/expressServer.js.map +1 -0
  46. package/package.json +34 -0
  47. package/src/cli/compile.ts +27 -0
  48. package/src/cli/dev.ts +49 -0
  49. package/src/cli/index.ts +64 -0
  50. package/src/cli/serve.ts +81 -0
  51. package/src/core/compiler.ts +147 -0
  52. package/src/core/router.ts +88 -0
  53. package/src/core/scanner.ts +72 -0
  54. package/src/index.ts +38 -0
  55. package/src/server/expressServer.ts +107 -0
  56. package/templates/tsconfig.json +20 -0
  57. package/tsconfig.json +20 -0
@@ -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
@@ -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"}