@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
JavaScript
;
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