UNPKG

query-2jz

Version:

Query-2jz: A GraphQL alternative with faster performance and simpler use

227 lines (204 loc) 6.44 kB
import { QrynConfig, QrynModel } from '../types'; import { QrynExpressAdapter } from './express'; import { QrynNextAdapter } from './nextjs'; import { QrynFastifyAdapter } from './fastify'; import { QrynKoaAdapter } from './koa'; import { QrynHapiAdapter } from './hapi'; import { QrynNestAdapter } from './nestjs'; import { QrynSailsAdapter } from './sails'; import { QrynLoopBackAdapter } from './loopback'; import { QrynAdonisAdapter } from './adonis'; import { QrynStrapiAdapter } from './strapi'; /** * Framework Adapter Factory * Creates appropriate adapter based on framework detection or explicit choice */ export class QrynAdapterFactory { /** * Create adapter for Express.js */ static createExpressAdapter(config: QrynConfig, models: QrynModel[] = []) { return new QrynExpressAdapter(config, models); } /** * Create adapter for Next.js */ static createNextAdapter(config: QrynConfig, models: QrynModel[] = []) { return new QrynNextAdapter(config, models); } /** * Create adapter for Fastify */ static createFastifyAdapter(config: QrynConfig, models: QrynModel[] = []) { return new QrynFastifyAdapter(config, models); } /** * Create adapter for Koa */ static createKoaAdapter(config: QrynConfig, models: QrynModel[] = []) { return new QrynKoaAdapter(config, models); } /** * Create adapter for Hapi */ static createHapiAdapter(config: QrynConfig, models: QrynModel[] = []) { return new QrynHapiAdapter(config, models); } /** * Create adapter for NestJS */ static createNestAdapter(config: QrynConfig, models: QrynModel[] = []) { return new QrynNestAdapter(config, models); } /** * Create adapter for Sails.js */ static createSailsAdapter(config: QrynConfig, models: QrynModel[] = []) { return new QrynSailsAdapter(config, models); } /** * Create adapter for LoopBack */ static createLoopBackAdapter(config: QrynConfig, models: QrynModel[] = []) { return new QrynLoopBackAdapter(config, models); } /** * Create adapter for AdonisJS */ static createAdonisAdapter(config: QrynConfig, models: QrynModel[] = []) { return new QrynAdonisAdapter(config, models); } /** * Create adapter for Strapi */ static createStrapiAdapter(config: QrynConfig, models: QrynModel[] = []) { return new QrynStrapiAdapter(config, models); } /** * Auto-detect framework and create appropriate adapter */ static createAdapter(config: QrynConfig, models: QrynModel[] = [], framework?: string) { if (framework) { return this.createAdapterByFramework(framework, config, models); } // Auto-detect framework const detectedFramework = this.detectFramework(); return this.createAdapterByFramework(detectedFramework, config, models); } /** * Create adapter by framework name */ private static createAdapterByFramework( framework: string, config: QrynConfig, models: QrynModel[] ) { switch (framework.toLowerCase()) { case 'express': return this.createExpressAdapter(config, models); case 'nextjs': case 'next': return this.createNextAdapter(config, models); case 'fastify': return this.createFastifyAdapter(config, models); case 'koa': return this.createKoaAdapter(config, models); case 'hapi': return this.createHapiAdapter(config, models); case 'nestjs': case 'nest': return this.createNestAdapter(config, models); case 'sails': case 'sailsjs': return this.createSailsAdapter(config, models); case 'loopback': return this.createLoopBackAdapter(config, models); case 'adonis': case 'adonisjs': return this.createAdonisAdapter(config, models); case 'strapi': return this.createStrapiAdapter(config, models); default: throw new Error(`Unsupported framework: ${framework}`); } } /** * Detect framework from environment */ private static detectFramework(): string { // Check for Next.js if (typeof process !== 'undefined' && process.env.NEXT_RUNTIME) { return 'nextjs'; } // Check for Express if (typeof require !== 'undefined') { try { require('express'); return 'express'; } catch { // Express not found } } // Check for Fastify if (typeof require !== 'undefined') { try { require('fastify'); return 'fastify'; } catch { // Fastify not found } } // Check for Koa if (typeof require !== 'undefined') { try { require('koa'); return 'koa'; } catch { // Koa not found } } // Check for Hapi if (typeof require !== 'undefined') { try { require('@hapi/hapi'); return 'hapi'; } catch { // Hapi not found } } // Check for NestJS if (typeof require !== 'undefined') { try { require('@nestjs/core'); return 'nestjs'; } catch { // NestJS not found } } // Default to Express return 'express'; } } /** * Generic adapter creator function */ export function createQrynAdapter( config: QrynConfig, models: QrynModel[] = [], framework?: string ) { return QrynAdapterFactory.createAdapter(config, models, framework); } /** * Framework-specific adapter creators */ export const createExpressAdapter = QrynAdapterFactory.createExpressAdapter; export const createNextAdapter = QrynAdapterFactory.createNextAdapter; export const createFastifyAdapter = QrynAdapterFactory.createFastifyAdapter; export const createKoaAdapter = QrynAdapterFactory.createKoaAdapter; export const createHapiAdapter = QrynAdapterFactory.createHapiAdapter; export const createNestAdapter = QrynAdapterFactory.createNestAdapter; export const createSailsAdapter = QrynAdapterFactory.createSailsAdapter; export const createLoopBackAdapter = QrynAdapterFactory.createLoopBackAdapter; export const createAdonisAdapter = QrynAdapterFactory.createAdonisAdapter; export const createStrapiAdapter = QrynAdapterFactory.createStrapiAdapter;