UNPKG

@nexica/nestjs-trpc

Version:
282 lines 12.3 kB
"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