parent
0eacf03ab7
commit
444a5b345a
@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"eslint.validate": ["json"]
|
||||||
|
}
|
File diff suppressed because one or more lines are too long
@ -0,0 +1,5 @@
|
|||||||
|
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
||||||
|
# yarn lockfile v1
|
||||||
|
|
||||||
|
|
||||||
|
yarn-path ".yarn/releases/yarn-1.22.19.cjs"
|
@ -0,0 +1,25 @@
|
|||||||
|
{
|
||||||
|
"extends": ["../../.eslintrc.json"],
|
||||||
|
"ignorePatterns": ["!**/*"],
|
||||||
|
"overrides": [
|
||||||
|
{
|
||||||
|
"files": ["*.ts", "*.tsx", "*.js", "*.jsx"],
|
||||||
|
"rules": {}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"files": ["*.ts", "*.tsx"],
|
||||||
|
"rules": {}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"files": ["*.js", "*.jsx"],
|
||||||
|
"rules": {}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"files": ["./package.json", "./generators.json"],
|
||||||
|
"parser": "jsonc-eslint-parser",
|
||||||
|
"rules": {
|
||||||
|
"@nx/nx-plugin-checks": "error"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -0,0 +1,11 @@
|
|||||||
|
# prisma-generator
|
||||||
|
|
||||||
|
This library was generated with [Nx](https://nx.dev).
|
||||||
|
|
||||||
|
## Building
|
||||||
|
|
||||||
|
Run `nx build prisma-generator` to build the library.
|
||||||
|
|
||||||
|
## Running unit tests
|
||||||
|
|
||||||
|
Run `nx test prisma-generator` to execute the unit tests via [Jest](https://jestjs.io).
|
@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"generators": {
|
||||||
|
"prisma-generator": {
|
||||||
|
"factory": "./src/generators/prisma-generator/generator",
|
||||||
|
"schema": "./src/generators/prisma-generator/schema.json",
|
||||||
|
"description": "prisma-generator generator"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,10 @@
|
|||||||
|
/* eslint-disable */
|
||||||
|
export default {
|
||||||
|
displayName: 'prisma-generator',
|
||||||
|
preset: '../../jest.preset.js',
|
||||||
|
transform: {
|
||||||
|
'^.+\\.[tj]s$': ['ts-jest', { tsconfig: '<rootDir>/tsconfig.spec.json' }],
|
||||||
|
},
|
||||||
|
moduleFileExtensions: ['ts', 'js', 'html'],
|
||||||
|
coverageDirectory: '../../coverage/libs/prisma-generator',
|
||||||
|
};
|
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"name": "@platform/prisma-generator",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"type": "commonjs",
|
||||||
|
"generators": "./generators.json"
|
||||||
|
}
|
@ -0,0 +1,66 @@
|
|||||||
|
{
|
||||||
|
"name": "prisma-generator",
|
||||||
|
"$schema": "../../node_modules/nx/schemas/project-schema.json",
|
||||||
|
"sourceRoot": "libs/prisma-generator/src",
|
||||||
|
"projectType": "library",
|
||||||
|
"targets": {
|
||||||
|
"build": {
|
||||||
|
"executor": "@nx/js:tsc",
|
||||||
|
"outputs": ["{options.outputPath}"],
|
||||||
|
"options": {
|
||||||
|
"outputPath": "dist/libs/prisma-generator",
|
||||||
|
"main": "libs/prisma-generator/src/index.ts",
|
||||||
|
"tsConfig": "libs/prisma-generator/tsconfig.lib.json",
|
||||||
|
"assets": [
|
||||||
|
"libs/prisma-generator/*.md",
|
||||||
|
{
|
||||||
|
"input": "./libs/prisma-generator/src",
|
||||||
|
"glob": "**/!(*.ts)",
|
||||||
|
"output": "./src"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "./libs/prisma-generator/src",
|
||||||
|
"glob": "**/*.d.ts",
|
||||||
|
"output": "./src"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "./libs/prisma-generator",
|
||||||
|
"glob": "generators.json",
|
||||||
|
"output": "."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"input": "./libs/prisma-generator",
|
||||||
|
"glob": "executors.json",
|
||||||
|
"output": "."
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"lint": {
|
||||||
|
"executor": "@nx/linter:eslint",
|
||||||
|
"outputs": ["{options.outputFile}"],
|
||||||
|
"options": {
|
||||||
|
"lintFilePatterns": [
|
||||||
|
"libs/prisma-generator/**/*.ts",
|
||||||
|
"libs/prisma-generator/package.json",
|
||||||
|
"libs/prisma-generator/generators.json"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"test": {
|
||||||
|
"executor": "@nx/jest:jest",
|
||||||
|
"outputs": ["{workspaceRoot}/coverage/{projectRoot}"],
|
||||||
|
"options": {
|
||||||
|
"jestConfig": "libs/prisma-generator/jest.config.ts",
|
||||||
|
"passWithNoTests": true
|
||||||
|
},
|
||||||
|
"configurations": {
|
||||||
|
"ci": {
|
||||||
|
"ci": true,
|
||||||
|
"codeCoverage": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"tags": []
|
||||||
|
}
|
@ -0,0 +1,20 @@
|
|||||||
|
import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing';
|
||||||
|
import { Tree, readProjectConfiguration } from '@nx/devkit';
|
||||||
|
|
||||||
|
import { prismaGeneratorGenerator } from './generator';
|
||||||
|
import { PrismaGeneratorGeneratorSchema } from './schema';
|
||||||
|
|
||||||
|
describe('prisma-generator generator', () => {
|
||||||
|
let tree: Tree;
|
||||||
|
const options: PrismaGeneratorGeneratorSchema = { name: 'test' };
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
tree = createTreeWithEmptyWorkspace();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should run successfully', async () => {
|
||||||
|
await prismaGeneratorGenerator(tree, options);
|
||||||
|
const config = readProjectConfiguration(tree, 'test');
|
||||||
|
expect(config).toBeDefined();
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,58 @@
|
|||||||
|
import {
|
||||||
|
addProjectConfiguration,
|
||||||
|
formatFiles,
|
||||||
|
generateFiles, joinPathFragments,
|
||||||
|
names,
|
||||||
|
Tree,
|
||||||
|
} from '@nx/devkit';
|
||||||
|
import * as path from 'path';
|
||||||
|
import { PrismaGeneratorGeneratorSchema } from './schema';
|
||||||
|
|
||||||
|
interface GeneratorOptions {
|
||||||
|
name: string;
|
||||||
|
provider: string;
|
||||||
|
connectionString: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function prismaGeneratorGenerator(
|
||||||
|
tree: Tree,
|
||||||
|
schema: GeneratorOptions
|
||||||
|
) {
|
||||||
|
|
||||||
|
const { name, className, constantName } = names(schema.name);
|
||||||
|
|
||||||
|
|
||||||
|
generateFiles(
|
||||||
|
tree,
|
||||||
|
joinPathFragments(__dirname, './template'),
|
||||||
|
'libs/prisma-clients',
|
||||||
|
{
|
||||||
|
dbType: schema.provider,
|
||||||
|
tmpl: '',
|
||||||
|
name,
|
||||||
|
className,
|
||||||
|
constantName,
|
||||||
|
outputLocation: `../../../../node_modules/.prisma/${name}-client`
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
if ( !tree.exists('.env') ) {
|
||||||
|
tree.write('.env', '')
|
||||||
|
}
|
||||||
|
|
||||||
|
let contents = tree.read('.env').toString();
|
||||||
|
contents += `${constantName}_SOURCE_URL=${schema.connectionString}\n`;
|
||||||
|
tree.write('.env', contents);
|
||||||
|
|
||||||
|
if ( !tree.exists('libs/prisma-clients/index.ts') ) {
|
||||||
|
tree.write('libs/prisma-clients/index.ts', '')
|
||||||
|
}
|
||||||
|
|
||||||
|
let exportsConents = tree.read('libs/prisma-clients/index.ts').toString()
|
||||||
|
exportsConents += `export { ${className}Client } from './${name}';\n`
|
||||||
|
tree.write('libs/prisma-clients/index.ts', exportsConents)
|
||||||
|
|
||||||
|
await formatFiles(tree);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default prismaGeneratorGenerator;
|
@ -0,0 +1,28 @@
|
|||||||
|
export interface PrismaGeneratorGeneratorSchema {
|
||||||
|
"name": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "Prisma Project Name",
|
||||||
|
"x-prompt": "What do you want to call the project?"
|
||||||
|
},
|
||||||
|
"provider": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "Database Type",
|
||||||
|
"x-prompt": {
|
||||||
|
"message": "Which type of database are you connecting to?",
|
||||||
|
"type": "list",
|
||||||
|
"items": [
|
||||||
|
{ "value": "sqlserver", "label": "MSSQL" },
|
||||||
|
{ "value": "postgresql", "label": "Postgres" },
|
||||||
|
{ "value": "mysql", "label": "MySQL" },
|
||||||
|
{ "value": "sqlite", "label": "SQLite" },
|
||||||
|
{ "value": "mongodb", "label": "MongoDB" }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"connectionString": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "Connection String",
|
||||||
|
"x-prompt": "What is the connection string you want to use?"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": ["name", "provider", "connectionString"],
|
||||||
|
}
|
@ -0,0 +1,34 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/schema",
|
||||||
|
"$id": "PrismaGenerator",
|
||||||
|
"title": "",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"name": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "Prisma Project Name",
|
||||||
|
"x-prompt": "What do you want to call the project?"
|
||||||
|
},
|
||||||
|
"provider": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "Database Type",
|
||||||
|
"x-prompt": {
|
||||||
|
"message": "Which type of database are you connecting to?",
|
||||||
|
"type": "list",
|
||||||
|
"items": [
|
||||||
|
{ "value": "sqlserver", "label": "MSSQL" },
|
||||||
|
{ "value": "postgresql", "label": "Postgres" },
|
||||||
|
{ "value": "mysql", "label": "MySQL" },
|
||||||
|
{ "value": "sqlite", "label": "SQLite" },
|
||||||
|
{ "value": "mongodb", "label": "MongoDB" }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"connectionString": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "Connection String",
|
||||||
|
"x-prompt": "What is the connection string you want to use?"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": ["name", "provider", "connectionString"]
|
||||||
|
}
|
@ -0,0 +1,3 @@
|
|||||||
|
node_modules
|
||||||
|
# Keep environment variables out of version control
|
||||||
|
.env
|
@ -0,0 +1,2 @@
|
|||||||
|
export { PrismaClient as <%= className %>Client } from '.prisma/<%= name %>-client';
|
||||||
|
export * from '.prisma/<%= name %>-client'
|
@ -0,0 +1 @@
|
|||||||
|
export class RecordNotFoundError extends Error {}
|
@ -0,0 +1 @@
|
|||||||
|
export class UniqueConstraintFailedError extends Error {}
|
@ -0,0 +1,26 @@
|
|||||||
|
import {
|
||||||
|
CallHandler,
|
||||||
|
ConflictException,
|
||||||
|
ExecutionContext,
|
||||||
|
Injectable,
|
||||||
|
NestInterceptor,
|
||||||
|
NotFoundException
|
||||||
|
} from "@nestjs/common";
|
||||||
|
import { catchError, Observable } from "rxjs";
|
||||||
|
import { RecordNotFoundError } from "../error/record-not-found.error";
|
||||||
|
import { UniqueConstraintFailedError } from "../error/unique-constraint-failed.error";
|
||||||
|
|
||||||
|
@Injectable()
|
||||||
|
export class PrismaErrorInterceptor implements NestInterceptor {
|
||||||
|
intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
|
||||||
|
return next
|
||||||
|
.handle()
|
||||||
|
.pipe(
|
||||||
|
catchError(err => {
|
||||||
|
if (err instanceof RecordNotFoundError) throw new NotFoundException(err.message);
|
||||||
|
if (err instanceof UniqueConstraintFailedError) throw new ConflictException(err.message);
|
||||||
|
throw err;
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,12 @@
|
|||||||
|
// This is your Prisma schema file,
|
||||||
|
// learn more about it in the docs: https://pris.ly/d/prisma-schema
|
||||||
|
|
||||||
|
generator client {
|
||||||
|
provider = "prisma-client-js"
|
||||||
|
output = "<%= outputLocation %>"
|
||||||
|
}
|
||||||
|
|
||||||
|
datasource db {
|
||||||
|
provider = "<%= dbType %>"
|
||||||
|
url = env("<%= constantName %>_SOURCE_URL")
|
||||||
|
}
|
@ -0,0 +1,5 @@
|
|||||||
|
import { Tree } from '@nrwl/devkit';
|
||||||
|
|
||||||
|
export default async function (tree: Tree, schema: any) {
|
||||||
|
console.log(schema)
|
||||||
|
}
|
@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
"extends": "../../tsconfig.base.json",
|
||||||
|
"compilerOptions": {
|
||||||
|
"module": "commonjs"
|
||||||
|
},
|
||||||
|
"files": [],
|
||||||
|
"include": [],
|
||||||
|
"references": [
|
||||||
|
{
|
||||||
|
"path": "./tsconfig.lib.json"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "./tsconfig.spec.json"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"extends": "./tsconfig.json",
|
||||||
|
"compilerOptions": {
|
||||||
|
"outDir": "../../dist/out-tsc",
|
||||||
|
"declaration": true,
|
||||||
|
"types": ["node"]
|
||||||
|
},
|
||||||
|
"include": ["src/**/*.ts"],
|
||||||
|
"exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"]
|
||||||
|
}
|
@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"extends": "./tsconfig.json",
|
||||||
|
"compilerOptions": {
|
||||||
|
"outDir": "../../dist/out-tsc",
|
||||||
|
"module": "commonjs",
|
||||||
|
"types": ["jest", "node"]
|
||||||
|
},
|
||||||
|
"include": [
|
||||||
|
"jest.config.ts",
|
||||||
|
"src/**/*.test.ts",
|
||||||
|
"src/**/*.spec.ts",
|
||||||
|
"src/**/*.d.ts"
|
||||||
|
]
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in new issue