@nexica/nestjs-trpc
Version:
NestJS TRPC Bridge
282 lines • 12.3 kB
JavaScript
"use strict";
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var TRPCDriver_1;
Object.defineProperty(exports, "__esModule", { value: true });
exports.TRPCDriver = void 0;
const common_1 = require("@nestjs/common");
const core_1 = require("@nestjs/core");
const server_1 = require("@trpc/server");
const trpc_factory_1 = require("../factory/trpc.factory");
const express_driver_1 = require("./express.driver");
const fastify_driver_1 = require("./fastify.driver");
const app_router_provider_1 = require("../providers/app-router.provider");
let TRPCDriver = TRPCDriver_1 = class TRPCDriver {
constructor() {
Object.defineProperty(this, "logger", {
enumerable: true,
configurable: true,
writable: true,
value: new common_1.Logger(TRPCDriver_1.name)
});
Object.defineProperty(this, "httpAdapterHost", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "trpcFactory", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "expressDriver", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "fastifyDriver", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "moduleRef", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "trpcAppRouter", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "initialized", {
enumerable: true,
configurable: true,
writable: true,
value: false
});
}
isInitialized() {
return this.initialized;
}
resolveTransformer(transformerOption) {
return __awaiter(this, void 0, void 0, function* () {
if (!transformerOption)
return undefined;
try {
switch (transformerOption) {
case 'superjson': {
try {
const superjsonModule = yield Promise.resolve().then(() => require('superjson'));
const superjson = superjsonModule.default || superjsonModule;
return superjson;
}
catch (importError) {
try {
const fixESM = require('fix-esm');
const superjson = fixESM.require('superjson');
return superjson;
}
catch (fixEsmError) {
this.logger.error('Failed to load superjson with both dynamic import and fix-esm');
this.logger.error('Install fix-esm: npm install fix-esm');
throw importError;
}
}
}
case 'devalue': {
const devalueModule = yield Promise.resolve().then(() => require('devalue'));
return { serialize: devalueModule.stringify, deserialize: devalueModule.parse };
}
default:
this.logger.warn('Unknown transformer provided');
return undefined;
}
}
catch (error) {
this.logger.error(`Failed to import transformer ${transformerOption}:`, error);
this.logger.error('Make sure the transformer package is installed: npm install superjson');
return undefined;
}
});
}
initializeRouter(options) {
return __awaiter(this, void 0, void 0, function* () {
if (this.initialized) {
this.logger.warn('tRPC driver already initialized');
return true;
}
const transformer = yield this.resolveTransformer(options.transformer);
const t = server_1.initTRPC.context().create(Object.assign({}, (transformer ? { transformer } : {})));
try {
const appRouter = yield this.trpcFactory.createAppRouter(options, t.router, t.procedure);
this.trpcAppRouter.appRouter = appRouter;
this.initialized = true;
this.logger.log('tRPC router initialized for schema generation');
return true;
}
catch (error) {
this.logger.error('Error initializing router:', error);
return false;
}
});
}
start(options) {
return __awaiter(this, void 0, void 0, function* () {
var _a;
if (this.initialized) {
this.logger.warn('tRPC driver already initialized');
return true;
}
if (!((_a = this.httpAdapterHost) === null || _a === void 0 ? void 0 : _a.httpAdapter)) {
this.logger.warn('HttpAdapterHost not available, skipping tRPC initialization');
return false;
}
try {
const appRouter = yield this.createAppRouter(options);
const contextInstance = this.getContextInstance(options);
const driverType = this.determineDriverType(options);
const success = yield this.initializeDriver(driverType, options, appRouter, contextInstance);
if (success) {
this.initialized = true;
this.logRegisteredProcedures(appRouter);
this.logger.log('tRPC initialization successful, router is now available');
}
return success;
}
catch (error) {
this.logger.error('Error starting TRPC driver:', error);
return false;
}
});
}
createAppRouter(options) {
return __awaiter(this, void 0, void 0, function* () {
const transformer = yield this.resolveTransformer(options.transformer);
const t = server_1.initTRPC.context().create(Object.assign({}, (transformer ? { transformer } : {})));
const appRouter = yield this.trpcFactory.createAppRouter(options, t.router, t.procedure);
this.trpcAppRouter.appRouter = appRouter;
return appRouter;
});
}
getContextInstance(options) {
if (!options.context) {
return null;
}
try {
return this.moduleRef.get(options.context, {
strict: false,
});
}
catch (error) {
this.logger.warn('Failed to get context from ModuleRef:', error);
return null;
}
}
determineDriverType(options) {
const { httpAdapter } = this.httpAdapterHost;
const platformName = httpAdapter.getType();
this.logger.log('Detected platform: ' + platformName);
const driverType = options.driver || (platformName === 'fastify' ? 'fastify' : 'express');
this.logger.log('Using driver: ' + driverType);
return driverType;
}
initializeDriver(driverType, options, appRouter, contextInstance) {
return __awaiter(this, void 0, void 0, function* () {
const { httpAdapter } = this.httpAdapterHost;
if (driverType === 'express') {
return this.initializeExpressDriver(options, httpAdapter, appRouter, contextInstance);
}
else if (driverType === 'fastify') {
return this.initializeFastifyDriver(options, httpAdapter, appRouter, contextInstance);
}
else {
this.logger.warn('Unsupported driver: ' + String(driverType));
return false;
}
});
}
initializeExpressDriver(options, httpAdapter, appRouter, contextInstance) {
try {
const app = httpAdapter.getInstance();
const success = this.expressDriver.start(options, app, appRouter, contextInstance);
if (!success) {
this.logger.error('Express driver failed to initialize');
}
return success;
}
catch (err) {
this.logger.error('Failed to initialize Express driver:', err instanceof Error ? err.message : String(err));
return false;
}
}
initializeFastifyDriver(options, httpAdapter, appRouter, contextInstance) {
return __awaiter(this, void 0, void 0, function* () {
try {
const app = httpAdapter.getInstance();
yield this.fastifyDriver.start(options, app, appRouter, contextInstance);
return true;
}
catch (err) {
this.logger.error('Failed to initialize Fastify driver:', err instanceof Error ? err.message : String(err));
return false;
}
});
}
logRegisteredProcedures(appRouter) {
Object.keys(appRouter._def.procedures).forEach((procedure) => {
this.logger.log(`Registered procedure: ${procedure}`);
});
}
};
exports.TRPCDriver = TRPCDriver;
__decorate([
(0, common_1.Inject)(core_1.HttpAdapterHost),
__metadata("design:type", core_1.HttpAdapterHost)
], TRPCDriver.prototype, "httpAdapterHost", void 0);
__decorate([
(0, common_1.Inject)(trpc_factory_1.TRPCFactory),
__metadata("design:type", trpc_factory_1.TRPCFactory)
], TRPCDriver.prototype, "trpcFactory", void 0);
__decorate([
(0, common_1.Inject)(express_driver_1.ExpressDriver),
__metadata("design:type", express_driver_1.ExpressDriver)
], TRPCDriver.prototype, "expressDriver", void 0);
__decorate([
(0, common_1.Inject)(fastify_driver_1.FastifyDriver),
__metadata("design:type", fastify_driver_1.FastifyDriver)
], TRPCDriver.prototype, "fastifyDriver", void 0);
__decorate([
(0, common_1.Inject)(core_1.ModuleRef),
__metadata("design:type", core_1.ModuleRef)
], TRPCDriver.prototype, "moduleRef", void 0);
__decorate([
(0, common_1.Inject)(app_router_provider_1.TRPCAppRouter),
__metadata("design:type", app_router_provider_1.TRPCAppRouter)
], TRPCDriver.prototype, "trpcAppRouter", void 0);
exports.TRPCDriver = TRPCDriver = TRPCDriver_1 = __decorate([
(0, common_1.Injectable)()
], TRPCDriver);
//# sourceMappingURL=trpc.driver.js.map