Skip to content

Commit 08f589e

Browse files
committed
crud bootstrap
1 parent b1dc4df commit 08f589e

File tree

16 files changed

+437
-2
lines changed

16 files changed

+437
-2
lines changed

packages/prisma-client-types-generator/package.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,7 @@
1818
"release": "pnpm changeset && pnpm changeset version"
1919
},
2020
"files": [
21-
"/dist",
22-
"test/schemas/full.snapshot.ts"
21+
"/dist"
2322
],
2423
"keywords": [
2524
"prisma",
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
dist
2+
node_modules
3+
.DS_Store
4+
*.pem
5+
npm-debug.log*
6+
yarn-debug.log*
7+
yarn-error.log*
8+
.pnpm-debug.log*
9+
.env
10+
.env.local
11+
.env.development.local
12+
.env.test.local
13+
.env.production.local
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
# prisma-crud-generator
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# Prisma CRUD Generator
2+
3+
Docs coming soon...
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
module.exports = {
2+
root: true,
3+
extends: ["eslint-config-custom"],
4+
};
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
{
2+
"name": "prisma-crud-generator",
3+
"version": "0.0.1",
4+
"description": "Generate json crud spec for prisma",
5+
"main": "./dist/index.js",
6+
"module": "./dist/index.mjs",
7+
"types": "./dist/index.d.ts",
8+
"bin": {
9+
"prisma-crud-generator": "./dist/index.js"
10+
},
11+
"scripts": {
12+
"build": "tsup src/index.ts --format esm,cjs --dts --treeshake",
13+
"dev": "pnpm build --watch",
14+
"lint": "eslint src --fix",
15+
"clean": "rm -rf .turbo && rm -rf node_modules && rm -rf dist",
16+
"prepublish": "pnpm test && pnpm build",
17+
"test": "sh ./test/test.sh",
18+
"release": "pnpm changeset && pnpm changeset version"
19+
},
20+
"files": [
21+
"/dist"
22+
],
23+
"keywords": [
24+
"prisma",
25+
"generator"
26+
],
27+
"repository": {
28+
"type": "git",
29+
"url": "https://github.com/codeledge/prisma-tools.git",
30+
"directory": "packages/prisma-crud-generator"
31+
},
32+
"author": "Orlando Groppo <[email protected]>",
33+
"license": "MIT",
34+
"peerDependencies": {
35+
"@prisma/client": ">=5",
36+
"prisma": ">=5"
37+
},
38+
"dependencies": {
39+
"@prisma/generator-helper": "^5.22.0"
40+
},
41+
"devDependencies": {
42+
"@babel/core": "7.26.0",
43+
"@babel/preset-env": "^7.26.0",
44+
"@babel/preset-typescript": "^7.26.0",
45+
"@changesets/cli": "^2.27.10",
46+
"@prisma/client": "^5.22.0",
47+
"@types/jest": "^29.5.14",
48+
"@types/node": "^22.9.3",
49+
"deverything": "^1.10.1",
50+
"eslint-config-custom": "workspace:*",
51+
"jest": "^29.7.0",
52+
"prisma": "^5.22.0",
53+
"ts-node": "^10.9.2",
54+
"tsd": "^0.31.2",
55+
"tsup": "^8.3.5",
56+
"tsx": "^4.19.2",
57+
"typescript": "^5.7.2"
58+
}
59+
}
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
import { DMMF } from "@prisma/generator-helper";
2+
import { PrismaClientTypesGeneratorConfig } from "./onGenerate";
3+
4+
export const generateCrud = (
5+
datamodel: DMMF.Datamodel,
6+
config: PrismaClientTypesGeneratorConfig
7+
) => {
8+
const models = datamodel.models;
9+
10+
const crud = {};
11+
12+
console.dir(datamodel.indexes, { depth: null });
13+
14+
for (const model of models) {
15+
console.dir(model.fields, { depth: null });
16+
break;
17+
crud[model.name] = {
18+
read: {
19+
fields: model.fields.map((field) => {
20+
return {
21+
name: field.name,
22+
type: field.type,
23+
required: field.isRequired,
24+
};
25+
}),
26+
},
27+
list: {
28+
filters: model.fields.map((field) => {
29+
return {
30+
name: field.name,
31+
type: field.type,
32+
index: {
33+
unique: model.uniqueIndexes.some((index) => {
34+
return index.fields[0] === field.name;
35+
}),
36+
},
37+
};
38+
}),
39+
fields: model.fields.map((field) => {
40+
return {
41+
name: field.name,
42+
type: field.type,
43+
required: field.isRequired,
44+
};
45+
}),
46+
},
47+
create: {
48+
fields: model.fields.map((field) => {
49+
return {
50+
name: field.name,
51+
type: field.type,
52+
required: field.isRequired,
53+
};
54+
}),
55+
},
56+
update: {
57+
fields: model.fields.map((field) => {
58+
return {
59+
name: field.name,
60+
type: field.type,
61+
required: field.isRequired,
62+
};
63+
}),
64+
},
65+
delete: {
66+
fields: model.fields
67+
.filter((field) => field.isUnique)
68+
.map((field) => {
69+
return {
70+
name: field.name,
71+
type: field.type,
72+
required: field.isRequired,
73+
};
74+
}),
75+
},
76+
};
77+
}
78+
79+
return crud;
80+
};
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { generatorHandler } from "@prisma/generator-helper";
2+
import { onGenerate } from "./onGenerate";
3+
import { onManifest } from "./onManifest";
4+
5+
// Defines the entry point of the generator.
6+
generatorHandler({
7+
onManifest,
8+
onGenerate,
9+
});
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import type {
2+
GeneratorConfig,
3+
GeneratorOptions,
4+
} from "@prisma/generator-helper";
5+
import { generateCrud } from "./generateCrud";
6+
import fs from "node:fs";
7+
import path from "node:path";
8+
9+
export type PrismaClientTypesGeneratorConfig = {
10+
/**
11+
*
12+
*
13+
* @example
14+
*
15+
* ```ts
16+
* typeAliases = '{snake_case_model: SnakeCaseModel}
17+
* ```
18+
*
19+
* @default undefined
20+
*/
21+
aliases?: string;
22+
23+
// Whether to use PascalCase for the generated types.
24+
pascalCase?: boolean;
25+
};
26+
27+
/** Runs the generator with the given options. */
28+
export async function onGenerate(options: GeneratorOptions) {
29+
const outputFile = options.generator.output;
30+
if (!outputFile || !outputFile.value) {
31+
throw new Error("No output file specified");
32+
}
33+
34+
let output = generateCrud(
35+
options.dmmf.datamodel,
36+
options.generator.config as PrismaClientTypesGeneratorConfig
37+
);
38+
39+
const outputPath = path.resolve(outputFile.value);
40+
fs.mkdirSync(path.dirname(outputPath), { recursive: true });
41+
fs.writeFileSync(
42+
outputPath,
43+
"export const crud = " + JSON.stringify(output, null, 2),
44+
"utf-8"
45+
);
46+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import type { GeneratorManifest } from "@prisma/generator-helper";
2+
3+
const { version } = require("../package.json");
4+
5+
/** Generates simple metadata for this generator. */
6+
export function onManifest(): GeneratorManifest {
7+
return {
8+
version,
9+
defaultOutput: "./prismaCrud.ts",
10+
prettyName: "Prisma CRUD Generator",
11+
requiresGenerators: ["prisma-client-js"],
12+
};
13+
}

0 commit comments

Comments
 (0)