UNPKG

@algochad/prisma-core

Version:

A comprehensive NestJS library that provides EF-Core-like operations using Prisma and GraphQL. Features LINQ-style query builders, advanced data manipulation, GraphQL integration with genql, and a unified API for both Prisma and GraphQL operations. Includ

234 lines 10.1 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); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.GraphQLRepositoryFactory = exports.TypedGraphQLRepository = exports.GraphQLRepository = void 0; const common_1 = require("@nestjs/common"); const prisma_core_service_1 = require("../../prisma-core.service"); const graphql_unified_builder_1 = require("./graphql-unified-builder"); let GraphQLRepository = class GraphQLRepository { coreService; operationCache = new Map(); operationConfigs = new Map(); constructor(coreService) { this.coreService = coreService; return new Proxy(this, { get(target, prop) { if (prop in target || typeof prop === 'symbol') { return target[prop]; } const operationName = prop; try { if (!target.operationCache.has(operationName)) { const config = target.getOrCreateOperationConfig(operationName); const builder = new graphql_unified_builder_1.GraphQLUnifiedBuilder(target.coreService.graphqlClient, config.queryOperationName, config.mutationOperationNames); target.operationCache.set(operationName, builder); } return target.operationCache.get(operationName); } catch (error) { return undefined; } }, }); } operation(operationName) { if (!this.coreService.isGraphQLInitialized) { throw new Error('GraphQLRepository requires GraphQL client to be initialized in PrismaCoreService'); } const config = this.getOrCreateOperationConfig(operationName); return new graphql_unified_builder_1.GraphQLUnifiedBuilder(this.coreService.graphqlClient, config.queryOperationName, config.mutationOperationNames); } model(modelName) { if (!this.coreService.isGraphQLInitialized) { throw new Error('GraphQLRepository requires GraphQL client to be initialized in PrismaCoreService'); } const config = this.getOrCreateOperationConfig(modelName); return new graphql_unified_builder_1.GraphQLUnifiedBuilder(this.coreService.graphqlClient, config.queryOperationName, config.mutationOperationNames); } registerOperation(operationName, config) { this.operationConfigs.set(operationName, config); if (this.operationCache.has(operationName)) { this.operationCache.delete(operationName); } } registerOperations(operations) { Object.entries(operations).forEach(([operationName, config]) => { this.registerOperation(operationName, config); }); } registerCrudOperations(modelName, options) { const config = this.createCrudConfig(modelName, options); const operationName = options?.pluralName || `${modelName.toLowerCase()}s`; this.registerOperation(operationName, config); } getOrCreateOperationConfig(operationName) { if (this.operationConfigs.has(operationName)) { return this.operationConfigs.get(operationName); } const config = this.inferOperationConfig(operationName); this.operationConfigs.set(operationName, config); return config; } inferOperationConfig(operationName) { let modelName = operationName; if (operationName.endsWith('s') && operationName.length > 1) { modelName = operationName.slice(0, -1); } const capitalizedModelName = modelName.charAt(0).toUpperCase() + modelName.slice(1); return this.createCrudConfig(capitalizedModelName, { queryOperationName: operationName, pluralName: operationName, }); } createCrudConfig(modelName, options) { const pluralName = options?.pluralName || `${modelName.toLowerCase()}s`; const queryOperationName = options?.queryOperationName || pluralName; const subscriptionOperationNames = {}; if (options?.subscriptions) { options.subscriptions.forEach((sub) => { subscriptionOperationNames[sub] = sub; }); } return { queryOperationName, mutationOperationNames: { create: `create${modelName}`, createMany: `createMany${modelName}`, update: `update${modelName}`, updateMany: `updateMany${modelName}`, upsert: `upsert${modelName}`, delete: `delete${modelName}`, deleteMany: `deleteMany${modelName}`, }, subscriptionOperationNames: Object.keys(subscriptionOperationNames).length > 0 ? subscriptionOperationNames : undefined, }; } getOperationNames() { return Array.from(this.operationConfigs.keys()); } getOperationConfig(operationName) { return this.operationConfigs.get(operationName); } clearCache() { this.operationCache.clear(); } clearAll() { this.operationCache.clear(); this.operationConfigs.clear(); } get client() { return this.coreService.graphqlClient; } get isInitialized() { return this.coreService.isGraphQLInitialized; } }; exports.GraphQLRepository = GraphQLRepository; exports.GraphQLRepository = GraphQLRepository = __decorate([ (0, common_1.Injectable)(), __metadata("design:paramtypes", [prisma_core_service_1.PrismaCoreService]) ], GraphQLRepository); class TypedGraphQLRepository { genqlClient; config; constructor(genqlClient, configOrQueryOperationName, mutationOperationNames) { this.genqlClient = genqlClient; if (typeof configOrQueryOperationName === 'string') { this.config = { queryOperationName: configOrQueryOperationName, mutationOperationNames: mutationOperationNames, }; } else { this.config = configOrQueryOperationName; } } get queryOperationName() { return this.config.queryOperationName; } get mutationOperationNames() { return this.config.mutationOperationNames; } get subscriptionOperationNames() { return this.config.subscriptionOperationNames || {}; } createBuilder() { return new graphql_unified_builder_1.GraphQLUnifiedBuilder(this.genqlClient, this.queryOperationName, this.mutationOperationNames); } createSubscriptionBuilder(subscriptionOperationName) { return new graphql_unified_builder_1.GraphQLUnifiedBuilder(this.genqlClient, subscriptionOperationName, this.mutationOperationNames, 'subscription'); } get Query() { return this.createBuilder(); } async executeCustom(operationName, args, selection = true) { const builder = this.createBuilder(); return await builder.ExecuteCustomMutation(operationName, args, selection); } async *subscribe(subscriptionOperationName, where) { const builder = this.createSubscriptionBuilder(subscriptionOperationName); if (where) { builder.Where(where); } for await (const item of builder.Subscribe()) { yield item; } } createBuilderWithDefaults() { const builder = this.createBuilder(); const defaultSelection = this.getDefaultSelection(); if (defaultSelection) { builder.Select(defaultSelection); } return builder; } } exports.TypedGraphQLRepository = TypedGraphQLRepository; var GraphQLRepositoryFactory; (function (GraphQLRepositoryFactory) { function createUniversal(coreService) { return new GraphQLRepository(coreService); } GraphQLRepositoryFactory.createUniversal = createUniversal; function createTyped(repositoryClass, client, config) { return new repositoryClass(client, config); } GraphQLRepositoryFactory.createTyped = createTyped; function createCrudConfig(modelName, options) { const pluralName = options?.pluralName || `${modelName.toLowerCase()}s`; const queryOperationName = options?.queryOperationName || pluralName; const subscriptionOperationNames = {}; if (options?.subscriptions) { options.subscriptions.forEach((sub) => { subscriptionOperationNames[sub] = sub; }); } return { queryOperationName, mutationOperationNames: { create: `create${modelName}`, createMany: `createMany${modelName}`, update: `update${modelName}`, updateMany: `updateMany${modelName}`, upsert: `upsert${modelName}`, delete: `delete${modelName}`, deleteMany: `deleteMany${modelName}`, }, subscriptionOperationNames: Object.keys(subscriptionOperationNames).length > 0 ? subscriptionOperationNames : undefined, }; } GraphQLRepositoryFactory.createCrudConfig = createCrudConfig; })(GraphQLRepositoryFactory || (exports.GraphQLRepositoryFactory = GraphQLRepositoryFactory = {})); //# sourceMappingURL=graphql-repository-universal.js.map