@nara-web/core 0.1.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/dist/App.d.ts ADDED
@@ -0,0 +1,41 @@
1
+ import HyperExpress from "hyper-express";
2
+ import type { Env } from "@config";
3
+ import type { NaraRequest, NaraResponse } from "./types";
4
+ import type { FrontendAdapter } from "./adapters/types";
5
+ export interface AppOptions {
6
+ port?: number;
7
+ https?: boolean;
8
+ cors?: boolean;
9
+ adapter?: FrontendAdapter;
10
+ securityHeaders?: boolean;
11
+ requestLogging?: boolean;
12
+ rateLimit?: boolean;
13
+ csrf?: boolean;
14
+ routes?: HyperExpress.Router;
15
+ shutdownTimeout?: number;
16
+ errorHandler?: (req: NaraRequest, res: NaraResponse, error: unknown) => void;
17
+ }
18
+ export declare class NaraApp {
19
+ private server;
20
+ private env;
21
+ private options;
22
+ private isShuttingDown;
23
+ private isStarted;
24
+ constructor(options?: AppOptions);
25
+ private logEnvSummary;
26
+ private createServer;
27
+ private applyDefaultMiddlewares;
28
+ private setupErrorHandler;
29
+ private setupSignalHandlers;
30
+ private gracefulShutdown;
31
+ use(middleware: Parameters<HyperExpress.Server["use"]>[0]): this;
32
+ use(path: string, middleware: Parameters<HyperExpress.Server["use"]>[0]): this;
33
+ mount(router: HyperExpress.Router, prefix?: string): this;
34
+ start(): Promise<void>;
35
+ close(): Promise<void>;
36
+ getServer(): HyperExpress.Server;
37
+ getEnv(): Env;
38
+ isRunning(): boolean;
39
+ }
40
+ export declare function createApp(options?: AppOptions): NaraApp;
41
+ //# sourceMappingURL=App.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../src/App.ts"],"names":[],"mappings":"AAeA,OAAO,YAAY,MAAM,eAAe,CAAC;AAKzC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,SAAS,CAAC;AAQnC,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAKxD,MAAM,WAAW,UAAU;IAIzB,IAAI,CAAC,EAAE,MAAM,CAAC;IAMd,KAAK,CAAC,EAAE,OAAO,CAAC;IAMhB,IAAI,CAAC,EAAE,OAAO,CAAC;IAKf,OAAO,CAAC,EAAE,eAAe,CAAC;IAM1B,eAAe,CAAC,EAAE,OAAO,CAAC;IAM1B,cAAc,CAAC,EAAE,OAAO,CAAC;IAMzB,SAAS,CAAC,EAAE,OAAO,CAAC;IAOpB,IAAI,CAAC,EAAE,OAAO,CAAC;IAMf,MAAM,CAAC,EAAE,YAAY,CAAC,MAAM,CAAC;IAM7B,eAAe,CAAC,EAAE,MAAM,CAAC;IAKzB,YAAY,CAAC,EAAE,CACb,GAAG,EAAE,WAAW,EAChB,GAAG,EAAE,YAAY,EACjB,KAAK,EAAE,OAAO,KACX,IAAI,CAAC;CACX;AA4BD,qBAAa,OAAO;IAClB,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,GAAG,CAAM;IACjB,OAAO,CAAC,OAAO,CAA8H;IAC7I,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,SAAS,CAAS;gBAEd,OAAO,CAAC,EAAE,UAAU;IAoChC,OAAO,CAAC,aAAa;IAarB,OAAO,CAAC,YAAY;IAqBpB,OAAO,CAAC,uBAAuB;IA6C/B,OAAO,CAAC,iBAAiB;IAkFzB,OAAO,CAAC,mBAAmB;YA0Bb,gBAAgB;IAyD9B,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;IAChE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;IAkB9E,KAAK,CAAC,MAAM,EAAE,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAiBnD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA+BtB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAS5B,SAAS,IAAI,YAAY,CAAC,MAAM;IAOhC,MAAM,IAAI,GAAG;IAOb,SAAS,IAAI,OAAO;CAGrB;AA8BD,wBAAgB,SAAS,CAAC,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAEvD"}
package/dist/App.js ADDED
@@ -0,0 +1,267 @@
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.NaraApp = void 0;
40
+ exports.createApp = createApp;
41
+ const hyper_express_1 = __importDefault(require("hyper-express"));
42
+ const cors_1 = __importDefault(require("cors"));
43
+ const path_1 = __importDefault(require("path"));
44
+ const _config_1 = require("@config");
45
+ const Logger_1 = __importDefault(require("@services/Logger"));
46
+ const securityHeaders_1 = require("@middlewares/securityHeaders");
47
+ const requestLogger_1 = require("@middlewares/requestLogger");
48
+ const rateLimit_1 = require("@middlewares/rateLimit");
49
+ const csrf_1 = require("@middlewares/csrf");
50
+ const errors_1 = require("./errors");
51
+ const response_1 = require("./response");
52
+ const DEFAULT_OPTIONS = {
53
+ port: 5555,
54
+ https: false,
55
+ cors: true,
56
+ adapter: undefined,
57
+ securityHeaders: true,
58
+ requestLogging: true,
59
+ rateLimit: false,
60
+ csrf: false,
61
+ shutdownTimeout: 10000,
62
+ };
63
+ class NaraApp {
64
+ constructor(options) {
65
+ this.isShuttingDown = false;
66
+ this.isStarted = false;
67
+ this.env = (0, _config_1.initEnv)();
68
+ this.options = {
69
+ ...DEFAULT_OPTIONS,
70
+ port: this.env.PORT,
71
+ https: this.env.HAS_CERTIFICATE === "true",
72
+ ...options,
73
+ };
74
+ this.logEnvSummary();
75
+ this.server = this.createServer();
76
+ this.setupErrorHandler();
77
+ this.setupSignalHandlers();
78
+ this.applyDefaultMiddlewares();
79
+ if (this.options.routes) {
80
+ this.mount(this.options.routes);
81
+ }
82
+ }
83
+ logEnvSummary() {
84
+ const featureWarnings = (0, _config_1.checkFeatureConfig)(this.env);
85
+ if (featureWarnings.length > 0) {
86
+ console.log("\n⚠️ Optional features not configured:");
87
+ featureWarnings.forEach((w) => console.log(` - ${w}`));
88
+ console.log("");
89
+ }
90
+ }
91
+ createServer() {
92
+ const serverOptions = {
93
+ max_body_length: _config_1.SERVER.MAX_BODY_SIZE,
94
+ };
95
+ if (this.options.https) {
96
+ serverOptions.key_file_name = path_1.default.join(process.cwd(), "localhost+1-key.pem");
97
+ serverOptions.cert_file_name = path_1.default.join(process.cwd(), "localhost+1.pem");
98
+ }
99
+ return new hyper_express_1.default.Server(serverOptions);
100
+ }
101
+ applyDefaultMiddlewares() {
102
+ if (this.options.securityHeaders) {
103
+ this.server.use((0, securityHeaders_1.securityHeaders)());
104
+ }
105
+ if (this.options.requestLogging) {
106
+ this.server.use((0, requestLogger_1.requestLogger)());
107
+ }
108
+ if (this.options.cors) {
109
+ this.server.use((0, cors_1.default)());
110
+ }
111
+ if (this.options.rateLimit) {
112
+ this.server.use((0, rateLimit_1.rateLimit)());
113
+ }
114
+ if (this.options.csrf) {
115
+ this.server.use((0, csrf_1.csrf)());
116
+ }
117
+ if (this.options.adapter) {
118
+ this.server.use(this.options.adapter.middleware());
119
+ this.server.use((_req, res, next) => {
120
+ this.options.adapter?.extendResponse(res);
121
+ next();
122
+ });
123
+ }
124
+ }
125
+ setupErrorHandler() {
126
+ const customHandler = this.options.errorHandler;
127
+ this.server.set_error_handler((req, res, error) => {
128
+ if (customHandler) {
129
+ return customHandler(req, res, error);
130
+ }
131
+ const isDevelopment = this.env.NODE_ENV === "development";
132
+ if ((0, errors_1.isHttpError)(error)) {
133
+ Logger_1.default.warn("HTTP error", {
134
+ name: error.name,
135
+ message: error.message,
136
+ statusCode: error.statusCode,
137
+ code: error.code,
138
+ path: req.path,
139
+ method: req.method,
140
+ });
141
+ if (error instanceof errors_1.ValidationError) {
142
+ const isInertia = req.headers["x-inertia"] === "true";
143
+ if (isInertia) {
144
+ const referer = req.headers["referer"] || "/";
145
+ const errorMsg = error.errors
146
+ ? Object.values(error.errors).flat().join(", ")
147
+ : error.message;
148
+ return res
149
+ .cookie("error", errorMsg, 5000)
150
+ .redirect(referer);
151
+ }
152
+ return (0, response_1.jsonValidationError)(res, error.message, error.errors);
153
+ }
154
+ return (0, response_1.jsonError)(res, error.message, error.statusCode, error.code);
155
+ }
156
+ const err = error;
157
+ const statusCode = error.statusCode ||
158
+ (error.code === "SQLITE_ERROR" ? 500 : 500);
159
+ Logger_1.default.error("Unhandled request error", {
160
+ err: err,
161
+ path: req.path,
162
+ method: req.method,
163
+ statusCode,
164
+ userAgent: req.headers["user-agent"],
165
+ });
166
+ return (0, response_1.jsonError)(res, isDevelopment ? err.message : "Internal Server Error", statusCode, error.code);
167
+ });
168
+ }
169
+ setupSignalHandlers() {
170
+ process.on("SIGTERM", () => this.gracefulShutdown("SIGTERM", 0));
171
+ process.on("SIGINT", () => this.gracefulShutdown("SIGINT", 0));
172
+ process.on("uncaughtException", async (error) => {
173
+ Logger_1.default.fatal("Uncaught exception", error);
174
+ await this.gracefulShutdown("uncaughtException", 1);
175
+ });
176
+ process.on("unhandledRejection", async (reason) => {
177
+ Logger_1.default.fatal("Unhandled promise rejection", { reason });
178
+ await this.gracefulShutdown("unhandledRejection", 1);
179
+ });
180
+ }
181
+ async gracefulShutdown(signal, exitCode = 0) {
182
+ if (this.isShuttingDown) {
183
+ Logger_1.default.warn("Shutdown already in progress, ignoring signal", { signal });
184
+ return;
185
+ }
186
+ this.isShuttingDown = true;
187
+ const timeoutMs = this.options.shutdownTimeout;
188
+ Logger_1.default.info(`${signal} received, starting graceful shutdown...`);
189
+ console.log(`\n⏳ Shutting down gracefully (max ${timeoutMs / 1000}s)...`);
190
+ const forceExitTimeout = setTimeout(() => {
191
+ Logger_1.default.error("Graceful shutdown timeout exceeded, forcing exit");
192
+ console.log("❌ Shutdown timeout exceeded, forcing exit");
193
+ process.exit(exitCode || 1);
194
+ }, timeoutMs);
195
+ try {
196
+ Logger_1.default.info("Closing server (stop accepting new connections)...");
197
+ await this.server.close();
198
+ Logger_1.default.info("Server closed successfully");
199
+ Logger_1.default.info("Closing database connections...");
200
+ const DB = (await Promise.resolve().then(() => __importStar(require("@services/DB")))).default;
201
+ await DB.destroy();
202
+ Logger_1.default.info("Database connections closed");
203
+ Logger_1.default.info("Flushing logs...");
204
+ await Logger_1.default.flush();
205
+ clearTimeout(forceExitTimeout);
206
+ console.log("✅ Graceful shutdown complete");
207
+ process.exit(exitCode);
208
+ }
209
+ catch (error) {
210
+ Logger_1.default.error("Error during graceful shutdown", error);
211
+ clearTimeout(forceExitTimeout);
212
+ process.exit(exitCode || 1);
213
+ }
214
+ }
215
+ use(...args) {
216
+ this.server.use(...args);
217
+ return this;
218
+ }
219
+ mount(router, prefix) {
220
+ if (prefix) {
221
+ this.server.use(prefix, router);
222
+ }
223
+ else {
224
+ this.server.use(router);
225
+ }
226
+ return this;
227
+ }
228
+ async start() {
229
+ if (this.isStarted) {
230
+ Logger_1.default.warn("Server already started");
231
+ return;
232
+ }
233
+ const port = this.options.port;
234
+ try {
235
+ await this.server.listen(port);
236
+ this.isStarted = true;
237
+ const envSummary = (0, _config_1.getEnvSummary)(this.env);
238
+ Logger_1.default.info("Server started successfully", {
239
+ ...envSummary,
240
+ nodeVersion: process.version,
241
+ });
242
+ const protocol = this.options.https ? "https" : "http";
243
+ console.log(`\n🚀 Server is running at ${protocol}://localhost:${port}\n`);
244
+ }
245
+ catch (err) {
246
+ Logger_1.default.fatal("Failed to start server", err);
247
+ process.exit(1);
248
+ }
249
+ }
250
+ async close() {
251
+ await this.gracefulShutdown("close", 0);
252
+ }
253
+ getServer() {
254
+ return this.server;
255
+ }
256
+ getEnv() {
257
+ return this.env;
258
+ }
259
+ isRunning() {
260
+ return this.isStarted && !this.isShuttingDown;
261
+ }
262
+ }
263
+ exports.NaraApp = NaraApp;
264
+ function createApp(options) {
265
+ return new NaraApp(options);
266
+ }
267
+ //# sourceMappingURL=App.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"App.js","sourceRoot":"","sources":["../src/App.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { NaraRequest, NaraResponse, NaraResponseWithInertia, User } from './types';
2
+ import type { Validator } from '@validators/validate';
3
+ export type AuthenticatedRequest = NaraRequest & {
4
+ user: User;
5
+ };
6
+ export type AdminRequest = NaraRequest & {
7
+ user: User & {
8
+ is_admin: true;
9
+ };
10
+ };
11
+ export interface PaginationParams {
12
+ page: number;
13
+ limit: number;
14
+ search: string;
15
+ }
16
+ export declare abstract class BaseController {
17
+ constructor();
18
+ protected requireInertia(res: NaraResponse): asserts res is NaraResponseWithInertia;
19
+ protected requireAuth(req: NaraRequest): asserts req is AuthenticatedRequest;
20
+ protected requireAdmin(req: NaraRequest): asserts req is AdminRequest;
21
+ protected getBody<T>(req: NaraRequest, schema: Validator<T>): Promise<T>;
22
+ protected getPaginationParams(req: NaraRequest): PaginationParams;
23
+ protected getQueryParam(req: NaraRequest, key: string, defaultValue?: string): string;
24
+ protected getParam(req: NaraRequest, key: string): string | undefined;
25
+ protected getRequiredParam(req: NaraRequest, key: string): string;
26
+ }
27
+ export default BaseController;
28
+ //# sourceMappingURL=BaseController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseController.d.ts","sourceRoot":"","sources":["../src/BaseController.ts"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,uBAAuB,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAExF,OAAO,KAAK,EAAE,SAAS,EAAoB,MAAM,sBAAsB,CAAC;AAMxE,MAAM,MAAM,oBAAoB,GAAG,WAAW,GAAG;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE,CAAC;AAKhE,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG;IAAE,IAAI,EAAE,IAAI,GAAG;QAAE,QAAQ,EAAE,IAAI,CAAA;KAAE,CAAA;CAAE,CAAC;AAK7E,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAQD,8BAAsB,cAAc;;IAuBlC,SAAS,CAAC,cAAc,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,GAAG,IAAI,uBAAuB;IAsBnF,SAAS,CAAC,WAAW,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,GAAG,IAAI,oBAAoB;IAsB5E,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,GAAG,IAAI,YAAY;cAwBrD,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IA8B9E,SAAS,CAAC,mBAAmB,CAAC,GAAG,EAAE,WAAW,GAAG,gBAAgB;IAoBjE,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,GAAE,MAAW,GAAG,MAAM;IAezF,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAkBrE,SAAS,CAAC,gBAAgB,CAAC,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM;CASlE;AAED,eAAe,cAAc,CAAC"}
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BaseController = void 0;
4
+ const errors_1 = require("./errors");
5
+ const _config_1 = require("@config");
6
+ class BaseController {
7
+ constructor() {
8
+ const prototype = Object.getPrototypeOf(this);
9
+ const propertyNames = Object.getOwnPropertyNames(prototype);
10
+ for (const name of propertyNames) {
11
+ const descriptor = Object.getOwnPropertyDescriptor(prototype, name);
12
+ if (name !== 'constructor' && descriptor && typeof descriptor.value === 'function') {
13
+ this[name] = this[name].bind(this);
14
+ }
15
+ }
16
+ }
17
+ requireInertia(res) {
18
+ if (typeof res.inertia !== 'function') {
19
+ throw new Error('Inertia support is not enabled. Please provide a FrontendAdapter (e.g., svelteAdapter) to NaraApp.');
20
+ }
21
+ }
22
+ requireAuth(req) {
23
+ if (!req.user) {
24
+ throw new errors_1.AuthError();
25
+ }
26
+ }
27
+ requireAdmin(req) {
28
+ this.requireAuth(req);
29
+ if (!req.user.is_admin) {
30
+ throw new errors_1.ForbiddenError();
31
+ }
32
+ }
33
+ async getBody(req, schema) {
34
+ const raw = await req.json();
35
+ const result = schema(raw);
36
+ if (!result.success) {
37
+ throw new errors_1.ValidationError('Validation failed', result.errors);
38
+ }
39
+ return result.data;
40
+ }
41
+ getPaginationParams(req) {
42
+ const page = parseInt(req.query.page) || _config_1.PAGINATION.DEFAULT_PAGE;
43
+ const rawLimit = parseInt(req.query.limit) || _config_1.PAGINATION.DEFAULT_PAGE_SIZE;
44
+ const limit = Math.min(rawLimit, _config_1.PAGINATION.MAX_PAGE_SIZE);
45
+ const search = req.query.search || '';
46
+ return { page, limit, search };
47
+ }
48
+ getQueryParam(req, key, defaultValue = '') {
49
+ return req.query[key] || defaultValue;
50
+ }
51
+ getParam(req, key) {
52
+ return req.params[key];
53
+ }
54
+ getRequiredParam(req, key) {
55
+ const value = req.params[key];
56
+ if (!value) {
57
+ throw new errors_1.ValidationError(`Parameter '${key}' is required`, {
58
+ [key]: [`${key} wajib diisi`]
59
+ });
60
+ }
61
+ return value;
62
+ }
63
+ }
64
+ exports.BaseController = BaseController;
65
+ exports.default = BaseController;
66
+ //# sourceMappingURL=BaseController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseController.js","sourceRoot":"","sources":["../src/BaseController.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import HyperExpress from 'hyper-express';
2
+ import type { NaraMiddleware, NaraHandler, RouteMiddlewares } from './types';
3
+ export declare class NaraRouter {
4
+ private router;
5
+ constructor();
6
+ getRouter(): HyperExpress.Router;
7
+ private registerRoute;
8
+ get(path: string, handler: NaraHandler): this;
9
+ get(path: string, middlewares: RouteMiddlewares, handler: NaraHandler): this;
10
+ post(path: string, handler: NaraHandler): this;
11
+ post(path: string, middlewares: RouteMiddlewares, handler: NaraHandler): this;
12
+ put(path: string, handler: NaraHandler): this;
13
+ put(path: string, middlewares: RouteMiddlewares, handler: NaraHandler): this;
14
+ patch(path: string, handler: NaraHandler): this;
15
+ patch(path: string, middlewares: RouteMiddlewares, handler: NaraHandler): this;
16
+ delete(path: string, handler: NaraHandler): this;
17
+ delete(path: string, middlewares: RouteMiddlewares, handler: NaraHandler): this;
18
+ options(path: string, handler: NaraHandler): this;
19
+ options(path: string, middlewares: RouteMiddlewares, handler: NaraHandler): this;
20
+ head(path: string, handler: NaraHandler): this;
21
+ head(path: string, middlewares: RouteMiddlewares, handler: NaraHandler): this;
22
+ any(path: string, handler: NaraHandler): this;
23
+ any(path: string, middlewares: RouteMiddlewares, handler: NaraHandler): this;
24
+ use(middleware: NaraMiddleware): this;
25
+ use(path: string, middleware: NaraMiddleware): this;
26
+ mount(path: string, router: NaraRouter): this;
27
+ group(prefix: string, callback: (router: NaraRouter) => void): this;
28
+ group(prefix: string, middlewares: RouteMiddlewares, callback: (router: NaraRouter) => void): this;
29
+ }
30
+ export declare function createRouter(): NaraRouter;
31
+ export default NaraRouter;
32
+ //# sourceMappingURL=Router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Router.d.ts","sourceRoot":"","sources":["../src/Router.ts"],"names":[],"mappings":"AAeA,OAAO,YAAY,MAAM,eAAe,CAAC;AACzC,OAAO,KAAK,EAA6B,cAAc,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAoBxG,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAsB;;IAUpC,SAAS,IAAI,YAAY,CAAC,MAAM;IAOhC,OAAO,CAAC,aAAa;IA8BrB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI;IAC7C,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI;IAW5E,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI;IAC9C,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI;IAW7E,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI;IAC7C,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI;IAW5E,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI;IAC/C,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI;IAW9E,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI;IAChD,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI;IAQ/E,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI;IACjD,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI;IAQhF,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI;IAC9C,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI;IAW7E,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI;IAC7C,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI;IA2B5E,GAAG,CAAC,UAAU,EAAE,cAAc,GAAG,IAAI;IACrC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,cAAc,GAAG,IAAI;IAqBnD,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI;IAc7C,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,GAAG,IAAI;IACnE,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,GAAG,IAAI;CA0BnG;AAWD,wBAAgB,YAAY,IAAI,UAAU,CAEzC;AAKD,eAAe,UAAU,CAAC"}
package/dist/Router.js ADDED
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.NaraRouter = void 0;
7
+ exports.createRouter = createRouter;
8
+ const hyper_express_1 = __importDefault(require("hyper-express"));
9
+ class NaraRouter {
10
+ constructor() {
11
+ this.router = new hyper_express_1.default.Router();
12
+ }
13
+ getRouter() {
14
+ return this.router;
15
+ }
16
+ registerRoute(method, path, ...args) {
17
+ const handler = args[args.length - 1];
18
+ const middlewares = args.length > 1 ? args[0] : [];
19
+ const middlewareArray = Array.isArray(middlewares) ? middlewares : [middlewares];
20
+ const hyperMiddlewares = middlewareArray;
21
+ const hyperHandler = handler;
22
+ if (middlewareArray.length > 0) {
23
+ this.router[method](path, hyperMiddlewares, hyperHandler);
24
+ }
25
+ else {
26
+ this.router[method](path, hyperHandler);
27
+ }
28
+ return this;
29
+ }
30
+ get(path, ...args) {
31
+ return this.registerRoute('get', path, ...args);
32
+ }
33
+ post(path, ...args) {
34
+ return this.registerRoute('post', path, ...args);
35
+ }
36
+ put(path, ...args) {
37
+ return this.registerRoute('put', path, ...args);
38
+ }
39
+ patch(path, ...args) {
40
+ return this.registerRoute('patch', path, ...args);
41
+ }
42
+ delete(path, ...args) {
43
+ return this.registerRoute('delete', path, ...args);
44
+ }
45
+ options(path, ...args) {
46
+ return this.registerRoute('options', path, ...args);
47
+ }
48
+ head(path, ...args) {
49
+ return this.registerRoute('head', path, ...args);
50
+ }
51
+ any(path, ...args) {
52
+ const handler = args[args.length - 1];
53
+ const middlewares = args.length > 1 ? args[0] : [];
54
+ const middlewareArray = Array.isArray(middlewares) ? middlewares : [middlewares];
55
+ const hyperMiddlewares = middlewareArray;
56
+ const hyperHandler = handler;
57
+ if (middlewareArray.length > 0) {
58
+ this.router.any(path, hyperMiddlewares, hyperHandler);
59
+ }
60
+ else {
61
+ this.router.any(path, hyperHandler);
62
+ }
63
+ return this;
64
+ }
65
+ use(pathOrMiddleware, middleware) {
66
+ if (typeof pathOrMiddleware === 'function') {
67
+ this.router.use(pathOrMiddleware);
68
+ }
69
+ else if (middleware) {
70
+ this.router.use(pathOrMiddleware, middleware);
71
+ }
72
+ return this;
73
+ }
74
+ mount(path, router) {
75
+ this.router.use(path, router.getRouter());
76
+ return this;
77
+ }
78
+ group(prefix, middlewaresOrCallback, callback) {
79
+ const subRouter = new NaraRouter();
80
+ if (typeof middlewaresOrCallback === 'function') {
81
+ const cb = middlewaresOrCallback;
82
+ cb(subRouter);
83
+ }
84
+ else if (callback) {
85
+ const middlewares = Array.isArray(middlewaresOrCallback)
86
+ ? middlewaresOrCallback
87
+ : [middlewaresOrCallback];
88
+ middlewares.forEach(mw => subRouter.use(mw));
89
+ callback(subRouter);
90
+ }
91
+ this.router.use(prefix, subRouter.getRouter());
92
+ return this;
93
+ }
94
+ }
95
+ exports.NaraRouter = NaraRouter;
96
+ function createRouter() {
97
+ return new NaraRouter();
98
+ }
99
+ exports.default = NaraRouter;
100
+ //# sourceMappingURL=Router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Router.js","sourceRoot":"","sources":["../src/Router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { FrontendAdapter } from "./types";
2
+ export declare function svelteAdapter(): FrontendAdapter;
3
+ //# sourceMappingURL=svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"svelte.d.ts","sourceRoot":"","sources":["../../src/adapters/svelte.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAA4B,MAAM,SAAS,CAAC;AASzE,wBAAgB,aAAa,IAAI,eAAe,CAsB/C"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.svelteAdapter = svelteAdapter;
7
+ const inertia_1 = __importDefault(require("../../middlewares/inertia"));
8
+ function svelteAdapter() {
9
+ return {
10
+ name: "svelte-inertia",
11
+ middleware: () => {
12
+ return (0, inertia_1.default)();
13
+ },
14
+ extendResponse: (res) => {
15
+ },
16
+ };
17
+ }
18
+ //# sourceMappingURL=svelte.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"svelte.js","sourceRoot":"","sources":["../../src/adapters/svelte.ts"],"names":[],"mappings":";;;;;AASA,sCAsBC;AA7BD,wEAA0D;AAO1D,SAAgB,aAAa;IAC3B,OAAO;QACL,IAAI,EAAE,gBAAgB;QAKtB,UAAU,EAAE,GAA6B,EAAE;YACzC,OAAO,IAAA,iBAAiB,GAAyC,CAAC;QACpE,CAAC;QAOD,cAAc,EAAE,CAAC,GAAiB,EAAQ,EAAE;QAI5C,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { MiddlewareNext } from "hyper-express";
2
+ import type { NaraRequest, NaraResponse } from "../types";
3
+ export type AdapterMiddlewareHandler = (req: NaraRequest, res: NaraResponse, next: MiddlewareNext) => unknown | Promise<unknown>;
4
+ export interface FrontendAdapter {
5
+ name: string;
6
+ middleware: () => AdapterMiddlewareHandler;
7
+ extendResponse: (res: NaraResponse) => void;
8
+ }
9
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/adapters/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAK1D,MAAM,MAAM,wBAAwB,GAAG,CACrC,GAAG,EAAE,WAAW,EAChB,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE,cAAc,KACjB,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAKhC,MAAM,WAAW,eAAe;IAI9B,IAAI,EAAE,MAAM,CAAC;IAKb,UAAU,EAAE,MAAM,wBAAwB,CAAC;IAK3C,cAAc,EAAE,CAAC,GAAG,EAAE,YAAY,KAAK,IAAI,CAAC;CAC7C"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/adapters/types.ts"],"names":[],"mappings":""}