@tomisakae/syosetu-api
Version:
Enterprise-grade Fastify TypeScript API for Syosetu.com data extraction using official API and web scraping. Run instantly with 'npx @tomisakae/syosetu-api'
101 lines • 3.98 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.createApp = createApp;
const fastify_1 = __importDefault(require("fastify"));
const config_1 = require("@/config");
const middleware_1 = require("@/middleware");
const routes_1 = require("@/routes");
async function createApp() {
const fastify = (0, fastify_1.default)({
logger: {
level: config_1.appConfig.logger.level,
...(config_1.appConfig.logger.prettyPrint && {
transport: {
target: 'pino-pretty',
options: {
colorize: true,
translateTime: 'SYS:standard',
ignore: 'pid,hostname',
},
},
}),
},
trustProxy: true,
disableRequestLogging: false,
});
fastify.setErrorHandler(middleware_1.errorHandler);
fastify.addHook('preHandler', middleware_1.requestLogger);
await fastify.register(Promise.resolve().then(() => __importStar(require('@fastify/cors'))), {
origin: config_1.appConfig.cors.origin,
credentials: config_1.appConfig.cors.credentials,
});
await fastify.register(Promise.resolve().then(() => __importStar(require('@fastify/helmet'))), {
contentSecurityPolicy: {
directives: {
defaultSrc: ["'self'"],
styleSrc: ["'self'", "'unsafe-inline'"],
scriptSrc: ["'self'"],
imgSrc: ["'self'", 'data:', 'https:'],
},
},
});
await fastify.register(require('@fastify/swagger'), config_1.swaggerConfig.swagger);
await fastify.register(require('@fastify/swagger-ui'), {
routePrefix: config_1.swaggerConfig.routePrefix,
uiConfig: {
docExpansion: 'list',
deepLinking: false,
},
staticCSP: true,
transformStaticCSP: (header) => header,
});
await fastify.register(routes_1.healthRoutes);
await fastify.register(routes_1.syosetuRoutes);
fastify.setNotFoundHandler(async (request, reply) => {
await reply.status(404).send({
success: false,
error: 'Endpoint không tồn tại',
message: `Không tìm thấy ${request.method} ${request.url}`,
timestamp: new Date().toISOString(),
});
});
return fastify;
}
exports.default = createApp;
//# sourceMappingURL=app.js.map