From c9f56a0c71dd2f10e48246eeb62288fa8127b932 Mon Sep 17 00:00:00 2001 From: chinhle <35798337+dangchinh25@users.noreply.github.com> Date: Sat, 4 Nov 2023 21:07:13 -0500 Subject: [PATCH] Revert "feat: Typesafe generated models graph" --- .eslintrc.json | 1 - README.md | 63 +-------- assets/annotation.png | Bin 0 -> 16303 bytes assets/output.png | Bin 0 -> 88707 bytes package.json | 21 ++- pnpm-lock.yaml | 155 +++------------------ prisma/test/custom.json | 78 +++++++++++ src/bin.ts | 2 + src/cli/generator.ts | 19 --- src/cli/prisma-generator.ts | 6 - src/{cli => }/constants.ts | 0 src/generator.ts | 46 ++++++- src/generator/config.ts | 17 --- src/generator/generateCode.ts | 174 ------------------------ src/generator/index.ts | 1 - src/{generator => }/helpers/fileName.ts | 0 src/{generator => }/helpers/index.ts | 0 src/{generator => }/helpers/parser.ts | 0 src/{generator => }/types/index.ts | 0 src/{generator => }/types/models.ts | 4 +- tests/helpers/parser.test.ts | 4 +- tsconfig.json | 3 +- usage/index.ts | 3 - 23 files changed, 165 insertions(+), 432 deletions(-) create mode 100644 assets/annotation.png create mode 100644 assets/output.png create mode 100644 prisma/test/custom.json create mode 100644 src/bin.ts delete mode 100644 src/cli/generator.ts delete mode 100644 src/cli/prisma-generator.ts rename src/{cli => }/constants.ts (100%) delete mode 100644 src/generator/config.ts delete mode 100644 src/generator/generateCode.ts delete mode 100644 src/generator/index.ts rename src/{generator => }/helpers/fileName.ts (100%) rename src/{generator => }/helpers/index.ts (100%) rename src/{generator => }/helpers/parser.ts (100%) rename src/{generator => }/types/index.ts (100%) rename src/{generator => }/types/models.ts (70%) delete mode 100644 usage/index.ts diff --git a/.eslintrc.json b/.eslintrc.json index 91850cd..5e5db42 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -170,7 +170,6 @@ } ], "space-before-function-paren": "off", - "@typescript-eslint/no-var-requires": "warn", "@typescript-eslint/space-before-function-paren": [ "error", "always" diff --git a/README.md b/README.md index 026214e..c04b84c 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ npm install prisma-models-graph **2. Add the generator to the schema** ```prisma -generator modelsGraph { +generator jsonSchema { provider = "prisma-models-graph" } ``` @@ -24,7 +24,7 @@ generator modelsGraph { Additional options ```prisma -generator modelsGraph { +generator jsonSchema { provider = "prisma-models-graph" output = "./customOutputs" fileName = "custom.json" @@ -34,61 +34,8 @@ generator modelsGraph { ## Usage - Add custom relation annotation next to the field you want annotate relationship. -- Format: `/// [[.]]` (The triple slash is important.) - -```prisma -userId Int @map("user_id) /// [[User.id]] -``` +- Format: `/// [[.]]` + - With the above annotation, the generated models graph will be like this: - -```js -{ - "users": { - "attributes": [ - "id", - "email", - "name", - "user_type_id" - ], - "relations": [ - { - "modelName": "posts", - "condition": "users.id = posts.user_id" - } - ] - }, - "posts": { - "attributes": [ - "id", - "subject", - "body", - "user_id" - ], - "relations": [ - { - "modelName": "users", - "condition": "posts.user_id = users.id" - } - ] - } -} -``` - -- To access the generated models graph, import it from `@generated/models-graph`. The generated models graph will be a _typesafe_ object matching the models declared in `schema.prisma` - -```js -import { ModelsGraph } from '@generated/models-graph' -``` - -- There are a few helper types available: - -```js -import { - ModelsGraph, // Generated models graph object - ParsedModel, // Type definition of a singular generated model graph - ParsedModels, // Type definition of all generated models graph - ParsedModelRelation, // Type definition of the relation between two models - ModelNames, // List of all generated models name -} from '@generated/models-graph' -``` + diff --git a/assets/annotation.png b/assets/annotation.png new file mode 100644 index 0000000000000000000000000000000000000000..fbc252007c3a75ced8284eb308295a6e4e3b5410 GIT binary patch literal 16303 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 U4@jI?{WWKn5|bCL6*dg~e^z!wuK)l5 literal 0 HcmV?d00001 diff --git a/assets/output.png b/assets/output.png new file mode 100644 index 0000000000000000000000000000000000000000..d18460bfa9049b674acd7d2d745ff2e1dc28039f GIT binary patch literal 88707 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%0Dw&G!j62Sgby@`UO`v5?L11 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 literal 0 HcmV?d00001 diff --git a/package.json b/package.json index 8629cca..fca79d4 100644 --- a/package.json +++ b/package.json @@ -16,34 +16,31 @@ "prepack": "yarn build", "test": "jest", "lint": "eslint --fix .", - "prepare": "husky install", - "usage": "ts-node usage/index.ts" + "prepare": "husky install" }, "dependencies": { "@prisma/client": "^5.2.0", "@prisma/generator-helper": "^5.2.0", "@prisma/internals": "^5.2.0", - "prettier": "3.0.3", "prisma": "^5.2.0", - "ts-node": "^10.9.1" + "prettier": "3.0.3" }, "devDependencies": { - "@semantic-release/changelog": "^6.0.1", - "@semantic-release/git": "^10.0.1", "@types/jest": "^29.5.2", "@types/node": "^20.4.0", + "jest": "^29.6.1", + "ts-jest": "^29.1.1", + "typescript": "^5.1.6", + "@semantic-release/changelog": "^6.0.1", + "@semantic-release/git": "^10.0.1", + "semantic-release": "^18.0.1", "@typescript-eslint/eslint-plugin": "^5.61.0", "@typescript-eslint/parser": "^5.61.0", "@typescript-eslint/typescript-estree": "^5.61.0", "eslint": "^8.44.0", "eslint-plugin-jest": "^27.2.2", "eslint-plugin-jest-formatting": "^3.1.0", - "husky": "7.0.4", - "jest": "^29.6.1", - "semantic-release": "^18.0.1", - "ts-jest": "^29.1.1", - "ts-morph": "20.0.0", - "typescript": "^5.1.6" + "husky": "7.0.4" }, "homepage": "https://github.com/dangchinh25/prisma-models-graph", "repository": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6b198bd..ef09c02 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -23,9 +23,6 @@ importers: prisma: specifier: ^5.2.0 version: 5.2.0 - ts-node: - specifier: ^10.9.1 - version: 10.9.1(@types/node@20.4.0)(typescript@5.1.6) devDependencies: '@semantic-release/changelog': specifier: ^6.0.1 @@ -62,16 +59,13 @@ importers: version: 7.0.4 jest: specifier: ^29.6.1 - version: 29.6.1(@types/node@20.4.0)(ts-node@10.9.1) + version: 29.6.1(@types/node@20.4.0) semantic-release: specifier: ^18.0.1 version: 18.0.1 ts-jest: specifier: ^29.1.1 version: 29.1.1(@babel/core@7.23.2)(jest@29.6.1)(typescript@5.1.6) - ts-morph: - specifier: 20.0.0 - version: 20.0.0 typescript: specifier: ^5.1.6 version: 5.1.6 @@ -429,12 +423,6 @@ packages: dev: true optional: true - /@cspotcode/source-map-support@0.8.1: - resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} - engines: {node: '>=12'} - dependencies: - '@jridgewell/trace-mapping': 0.3.9 - /@eslint-community/eslint-utils@4.4.0(eslint@8.44.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -520,7 +508,7 @@ packages: slash: 3.0.0 dev: true - /@jest/core@29.7.0(ts-node@10.9.1): + /@jest/core@29.7.0: resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -541,7 +529,7 @@ packages: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.4.0)(ts-node@10.9.1) + jest-config: 29.7.0(@types/node@20.4.0) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -734,6 +722,7 @@ packages: /@jridgewell/resolve-uri@3.1.1: resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} engines: {node: '>=6.0.0'} + dev: true /@jridgewell/set-array@1.1.2: resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} @@ -742,6 +731,7 @@ packages: /@jridgewell/sourcemap-codec@1.4.15: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + dev: true /@jridgewell/trace-mapping@0.3.20: resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} @@ -750,12 +740,6 @@ packages: '@jridgewell/sourcemap-codec': 1.4.15 dev: true - /@jridgewell/trace-mapping@0.3.9: - resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - dependencies: - '@jridgewell/resolve-uri': 3.1.1 - '@jridgewell/sourcemap-codec': 1.4.15 - /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -1172,27 +1156,6 @@ packages: '@sinonjs/commons': 3.0.0 dev: true - /@ts-morph/common@0.21.0: - resolution: {integrity: sha512-ES110Mmne5Vi4ypUKrtVQfXFDtCsDXiUiGxF6ILVlE90dDD4fdpC1LSjydl/ml7xJWKSDZwUYD2zkOePMSrPBA==} - dependencies: - fast-glob: 3.3.1 - minimatch: 7.4.6 - mkdirp: 2.1.6 - path-browserify: 1.0.1 - dev: true - - /@tsconfig/node10@1.0.9: - resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} - - /@tsconfig/node12@1.0.11: - resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} - - /@tsconfig/node14@1.0.3: - resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} - - /@tsconfig/node16@1.0.4: - resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - /@types/babel__core@7.20.3: resolution: {integrity: sha512-54fjTSeSHwfan8AyHWrKbfBWiEUrNTZsUwPTDSNaaP1QDQIZbeNUg3a59E9D+375MzUw/x1vx2/0F5LBz+AeYA==} dependencies: @@ -1515,14 +1478,11 @@ packages: acorn: 8.11.2 dev: true - /acorn-walk@8.3.0: - resolution: {integrity: sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==} - engines: {node: '>=0.4.0'} - /acorn@8.11.2: resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} engines: {node: '>=0.4.0'} hasBin: true + dev: true /agent-base@7.1.0: resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} @@ -1632,9 +1592,6 @@ packages: zip-stream: 4.1.1 dev: false - /arg@4.1.3: - resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} - /arg@5.0.2: resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} dev: false @@ -1785,6 +1742,7 @@ packages: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} dependencies: balanced-match: 1.0.2 + dev: false /braces@3.0.2: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} @@ -1958,10 +1916,6 @@ packages: engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} dev: true - /code-block-writer@12.0.0: - resolution: {integrity: sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==} - dev: true - /collect-v8-coverage@1.0.2: resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} dev: true @@ -2084,7 +2038,7 @@ packages: readable-stream: 3.6.2 dev: false - /create-jest@29.7.0(@types/node@20.4.0)(ts-node@10.9.1): + /create-jest@29.7.0(@types/node@20.4.0): resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -2093,7 +2047,7 @@ packages: chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.4.0)(ts-node@10.9.1) + jest-config: 29.7.0(@types/node@20.4.0) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -2103,9 +2057,6 @@ packages: - ts-node dev: true - /create-require@1.1.1: - resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - /cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} @@ -2196,10 +2147,6 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true - /diff@4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} - engines: {node: '>=0.3.1'} - /dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -2311,7 +2258,7 @@ packages: '@typescript-eslint/eslint-plugin': 5.61.0(@typescript-eslint/parser@5.61.0)(eslint@8.44.0)(typescript@5.1.6) '@typescript-eslint/utils': 5.62.0(eslint@8.44.0)(typescript@5.1.6) eslint: 8.44.0 - jest: 29.6.1(@types/node@20.4.0)(ts-node@10.9.1) + jest: 29.6.1(@types/node@20.4.0) transitivePeerDependencies: - supports-color - typescript @@ -3109,7 +3056,7 @@ packages: - supports-color dev: true - /jest-cli@29.7.0(@types/node@20.4.0)(ts-node@10.9.1): + /jest-cli@29.7.0(@types/node@20.4.0): resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -3119,14 +3066,14 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 29.7.0(ts-node@10.9.1) + '@jest/core': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.4.0)(ts-node@10.9.1) + create-jest: 29.7.0(@types/node@20.4.0) exit: 0.1.2 import-local: 3.1.0 - jest-config: 29.7.0(@types/node@20.4.0)(ts-node@10.9.1) + jest-config: 29.7.0(@types/node@20.4.0) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -3137,7 +3084,7 @@ packages: - ts-node dev: true - /jest-config@29.7.0(@types/node@20.4.0)(ts-node@10.9.1): + /jest-config@29.7.0(@types/node@20.4.0): resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -3172,7 +3119,6 @@ packages: pretty-format: 29.7.0 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.9.1(@types/node@20.4.0)(typescript@5.1.6) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -3461,7 +3407,7 @@ packages: supports-color: 8.1.1 dev: true - /jest@29.6.1(@types/node@20.4.0)(ts-node@10.9.1): + /jest@29.6.1(@types/node@20.4.0): resolution: {integrity: sha512-Nirw5B4nn69rVUZtemCQhwxOBhm0nsp3hmtF4rzCeWD7BkjAXRIji7xWQfnTNbz9g0aVsBX6aZK3n+23LM6uDw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -3471,10 +3417,10 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 29.7.0(ts-node@10.9.1) + '@jest/core': 29.7.0 '@jest/types': 29.6.3 import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@20.4.0)(ts-node@10.9.1) + jest-cli: 29.7.0(@types/node@20.4.0) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -3698,6 +3644,7 @@ packages: /make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: true /makeerror@1.0.12: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} @@ -3792,13 +3739,6 @@ packages: brace-expansion: 2.0.1 dev: false - /minimatch@7.4.6: - resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==} - engines: {node: '>=10'} - dependencies: - brace-expansion: 2.0.1 - dev: true - /minimist-options@4.1.0: resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} engines: {node: '>= 6'} @@ -3812,12 +3752,6 @@ packages: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} dev: true - /mkdirp@2.1.6: - resolution: {integrity: sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==} - engines: {node: '>=10'} - hasBin: true - dev: true - /modify-values@1.0.1: resolution: {integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==} engines: {node: '>=0.10.0'} @@ -4163,10 +4097,6 @@ packages: json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - /path-browserify@1.0.1: - resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} - dev: true - /path-exists@3.0.0: resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} engines: {node: '>=4'} @@ -4832,7 +4762,7 @@ packages: '@babel/core': 7.23.2 bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 - jest: 29.6.1(@types/node@20.4.0)(ts-node@10.9.1) + jest: 29.6.1(@types/node@20.4.0) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -4842,43 +4772,6 @@ packages: yargs-parser: 21.1.1 dev: true - /ts-morph@20.0.0: - resolution: {integrity: sha512-JVmEJy2Wow5n/84I3igthL9sudQ8qzjh/6i4tmYCm6IqYyKFlNbJZi7oBdjyqcWSWYRu3CtL0xbT6fS03ESZIg==} - dependencies: - '@ts-morph/common': 0.21.0 - code-block-writer: 12.0.0 - dev: true - - /ts-node@10.9.1(@types/node@20.4.0)(typescript@5.1.6): - resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': - optional: true - '@swc/wasm': - optional: true - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.9 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 20.4.0 - acorn: 8.11.2 - acorn-walk: 8.3.0 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 5.1.6 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - /ts-pattern@4.3.0: resolution: {integrity: sha512-pefrkcd4lmIVR0LA49Imjf9DYLK8vtWhqBPA3Ya1ir8xCW0O2yjL9dsCVvI7pCodLC5q7smNpEtDR2yVulQxOg==} dev: false @@ -4939,6 +4832,7 @@ packages: resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} engines: {node: '>=14.17'} hasBin: true + dev: true /uglify-js@3.17.4: resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} @@ -4991,9 +4885,6 @@ packages: hasBin: true dev: false - /v8-compile-cache-lib@3.0.1: - resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - /v8-to-istanbul@9.1.3: resolution: {integrity: sha512-9lDD+EVI2fjFsMWXc6dy5JJzBsVTcQ2fVkfBvncZ6xJWG9wtBhOldG+mHkSL0+V1K/xgZz0JDO5UT5hFwHUghg==} engines: {node: '>=10.12.0'} @@ -5113,10 +5004,6 @@ packages: yargs-parser: 21.1.1 dev: true - /yn@3.1.1: - resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} - engines: {node: '>=6'} - /yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} diff --git a/prisma/test/custom.json b/prisma/test/custom.json new file mode 100644 index 0000000..ec6a2c3 --- /dev/null +++ b/prisma/test/custom.json @@ -0,0 +1,78 @@ +{ + "users": { + "attributes": [ + "id", + "email", + "name", + "user_type_id" + ], + "relations": [ + { + "modelName": "user_types", + "condition": "users.user_type_id = user_types.id" + }, + { + "modelName": "posts", + "condition": "users.id = posts.user_id" + }, + { + "modelName": "users_user_groups", + "condition": "users.id = users_user_groups.user_id" + } + ] + }, + "posts": { + "attributes": [ + "id", + "subject", + "body", + "user_id" + ], + "relations": [ + { + "modelName": "users", + "condition": "posts.user_id = users.id" + } + ] + }, + "user_types": { + "attributes": [ + "id", + "name" + ], + "relations": [ + { + "modelName": "users", + "condition": "user_types.id = users.user_type_id" + } + ] + }, + "user_groups": { + "attributes": [ + "id", + "name" + ], + "relations": [ + { + "modelName": "users_user_groups", + "condition": "user_groups.id = users_user_groups.user_group_id" + } + ] + }, + "users_user_groups": { + "attributes": [ + "user_id", + "user_group_id" + ], + "relations": [ + { + "modelName": "users", + "condition": "users_user_groups.user_id = users.id" + }, + { + "modelName": "user_groups", + "condition": "users_user_groups.user_group_id = user_groups.id" + } + ] + } +} diff --git a/src/bin.ts b/src/bin.ts new file mode 100644 index 0000000..d0e369c --- /dev/null +++ b/src/bin.ts @@ -0,0 +1,2 @@ +#!/usr/bin/env node +import './generator'; diff --git a/src/cli/generator.ts b/src/cli/generator.ts deleted file mode 100644 index 96eeaed..0000000 --- a/src/cli/generator.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { GeneratorManifest, generatorHandler } from '@prisma/generator-helper'; -import { generate } from './prisma-generator'; -import { logger } from '@prisma/internals'; -import { GENERATOR_NAME, DEFAULT_OUTPUT_FOLDER } from './constants'; - -const { version } = require( '../../package.json' ); - -generatorHandler( { - onManifest (): GeneratorManifest { - logger.info( `${ GENERATOR_NAME }:Registered` ); - - return { - version, - defaultOutput: DEFAULT_OUTPUT_FOLDER, - prettyName: GENERATOR_NAME - }; - }, - onGenerate: generate -} ); diff --git a/src/cli/prisma-generator.ts b/src/cli/prisma-generator.ts deleted file mode 100644 index d133b1d..0000000 --- a/src/cli/prisma-generator.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { GeneratorOptions } from '@prisma/generator-helper'; -import { generateCode } from '../generator/generateCode'; - -export const generate = async ( options: GeneratorOptions ): Promise => { - await generateCode( options.dmmf ); -}; \ No newline at end of file diff --git a/src/cli/constants.ts b/src/constants.ts similarity index 100% rename from src/cli/constants.ts rename to src/constants.ts diff --git a/src/generator.ts b/src/generator.ts index 1df8391..98b3aa4 100644 --- a/src/generator.ts +++ b/src/generator.ts @@ -1,3 +1,47 @@ #!/usr/bin/env node -import './cli/generator'; \ No newline at end of file +/* eslint-disable @typescript-eslint/no-non-null-assertion */ +/* eslint-disable @typescript-eslint/no-non-null-asserted-optional-chain */ +/* eslint-disable @typescript-eslint/no-var-requires */ +import { + generatorHandler, GeneratorManifest, GeneratorOptions +} from '@prisma/generator-helper'; +import { logger } from '@prisma/internals'; +import path from 'path'; +import { + DEFAULT_FILE_NAME, DEFAULT_OUTPUT_FOLDER, GENERATOR_NAME +} from './constants'; +import { formatFileName, parseDMMFModels } from './helpers'; +import { writeFileSafely } from './utils/writeFileSafely'; + +const { version } = require( '../package.json' ); + +generatorHandler( { + onManifest (): GeneratorManifest { + logger.info( `${ GENERATOR_NAME }:Registered` ); + + return { + version, + defaultOutput: DEFAULT_OUTPUT_FOLDER, + prettyName: GENERATOR_NAME + }; + }, + onGenerate: async ( options: GeneratorOptions ): Promise => { + const modelsGraph = parseDMMFModels( options.dmmf.datamodel.models ); + + let writeFileName = DEFAULT_FILE_NAME; + const { fileName } = options.generator.config; + + if ( fileName ) { + // This is to handle generator config can be an array of string + writeFileName = typeof fileName === 'string' ? formatFileName( fileName ) : formatFileName( fileName[ 0 ] ); + } + + const writeLocation1 = path.join( + options.generator.output?.value!, + writeFileName + ); + + await writeFileSafely( writeLocation1, JSON.stringify( modelsGraph ) ); + } +} ); diff --git a/src/generator/config.ts b/src/generator/config.ts deleted file mode 100644 index 1f4802e..0000000 --- a/src/generator/config.ts +++ /dev/null @@ -1,17 +0,0 @@ -export const TYPE_DIRECTORY_NAME = 'types'; - -export const MODELS_GRAPH_FILE_NAME = 'modelsGraph.ts'; - -export const MODELS_GRAPH_VARIABLE_NAME = 'ModelsGraph'; - -export const INDEX_FILE_NAME = 'index.ts'; - -export const PARSED_MODELS_TYPE_NAME = 'ParsedModels'; - -export const PARSED_MODEL_TYPE_NAME = 'ParsedModel'; - -export const PARSED_MODEL_RELATION_TYPE_NAME = 'ParsedModelRelation'; - -export const MODEL_NAMES_VARIABLE_NAME = 'modelNames'; - -export const MODEL_NAMES_TYPE_NAME = 'ModelNames'; \ No newline at end of file diff --git a/src/generator/generateCode.ts b/src/generator/generateCode.ts deleted file mode 100644 index b9a83a3..0000000 --- a/src/generator/generateCode.ts +++ /dev/null @@ -1,174 +0,0 @@ -import { DMMF } from '@prisma/generator-helper'; -import path from 'path'; -import { - CompilerOptions, - Directory, - ModuleKind, - Project, - ScriptTarget, - SourceFile, - VariableDeclarationKind -} from 'ts-morph'; -import { - INDEX_FILE_NAME, - MODELS_GRAPH_FILE_NAME, - MODELS_GRAPH_VARIABLE_NAME, - MODEL_NAMES_TYPE_NAME, - MODEL_NAMES_VARIABLE_NAME, - PARSED_MODELS_TYPE_NAME, - PARSED_MODEL_RELATION_TYPE_NAME, - PARSED_MODEL_TYPE_NAME, - TYPE_DIRECTORY_NAME -} from './config'; -import { parseDMMFModels } from './helpers'; -import { ParsedModels } from './types'; - -const baseCompilerOptions: CompilerOptions = { - target: ScriptTarget.ES2022, - module: ModuleKind.CommonJS, - emitDecoratorMetadata: true, - experimentalDecorators: true, - esModuleInterop: true, - declaration: true -}; - -const baseDirPath = 'node_modules/@generated/models-graph'; - -export const generateCode = async ( - dmmf: DMMF.Document -): Promise => { - const modelsGraph = parseDMMFModels( dmmf.datamodel.models ); - - const project = new Project( { compilerOptions: { ...baseCompilerOptions } } ); - - const generatedTypesDirectory = await generateTypeDirectory( - project, - baseDirPath - ); - - const generatedModelsGraphFile = await generateModelsGraphFile( - project, - baseDirPath, - generatedTypesDirectory.getPath(), - modelsGraph - ); - - await generateIndexFile( project, baseDirPath, [ - generatedTypesDirectory, - generatedModelsGraphFile - ] ); - - await project.emit(); -}; - -// TODO figure out how to dynamically export type -const generateTypeDirectory = async ( - project: Project, - baseGeneratedDirPath: string -): Promise => { - const generatedTypeDirectory = project.createDirectory( - path.resolve( baseGeneratedDirPath, TYPE_DIRECTORY_NAME ) - ); - - const modelsTypeSourceFile = generatedTypeDirectory.createSourceFile( - path.resolve( generatedTypeDirectory.getPath(), 'models.ts' ), - `export type ${ PARSED_MODEL_RELATION_TYPE_NAME } = { - modelName: string; - condition: string; - }; - - export type ${ PARSED_MODEL_TYPE_NAME } = { - attributes: string[]; - relations: ${ PARSED_MODEL_RELATION_TYPE_NAME }[]; - }; - - export type ${ PARSED_MODELS_TYPE_NAME } = { - [modelName: string]: ${ PARSED_MODEL_TYPE_NAME }; - };`, - { overwrite: true } - ); - - await generateIndexFile( - project, - generatedTypeDirectory.getPath(), - [ modelsTypeSourceFile ] - ); - - await generatedTypeDirectory.save(); - - return generatedTypeDirectory; -}; - -const generateModelsGraphFile = async ( - project: Project, - baseGeneratedDirPath: string, - generatedTypesDirectoryPath: string, - modelsGraph: ParsedModels -): Promise => { - const modelsGraphSourceFile = project.createSourceFile( - path.resolve( baseGeneratedDirPath, MODELS_GRAPH_FILE_NAME ), - undefined, - { overwrite: true } - ); - - // Add import statements - const relativePathToTypesDirectory = `./${ modelsGraphSourceFile.getRelativePathTo( generatedTypesDirectoryPath ) }`; - - modelsGraphSourceFile.addImportDeclarations( [ - { - moduleSpecifier: relativePathToTypesDirectory, - namedImports: [ PARSED_MODEL_TYPE_NAME ] - } - ] ); - - // Generate dynamic types and export them - const modelNames = Object.keys( modelsGraph ); - - modelsGraphSourceFile.addVariableStatement( { - declarationKind: VariableDeclarationKind.Const, - declarations: [ - { - name: MODEL_NAMES_VARIABLE_NAME, - initializer: `${ JSON.stringify( modelNames ) } as const` - } - ] - } ); - - modelsGraphSourceFile.addStatements( [ `export type ${ MODEL_NAMES_TYPE_NAME } = typeof ${ MODEL_NAMES_VARIABLE_NAME }[number];` ] ); - - // Add export statement for the main ModelsGraph - modelsGraphSourceFile.addVariableStatement( { - declarationKind: VariableDeclarationKind.Const, - declarations: [ - { - name: MODELS_GRAPH_VARIABLE_NAME, - type: `{[modelName in ${ MODEL_NAMES_TYPE_NAME }]: ${ PARSED_MODEL_TYPE_NAME }}`, - initializer: JSON.stringify( modelsGraph ) - } - ], - isExported: true - } ); - - return modelsGraphSourceFile; -}; - -const generateIndexFile = async ( - project: Project, - baseGeneratedDirPath: string, - modules: ( SourceFile | Directory )[] -): Promise => { - const indexSourceFile = project.createSourceFile( - path.resolve( baseGeneratedDirPath, INDEX_FILE_NAME ), - undefined, - { overwrite: true } - ); - - modules.forEach( module => { - const moduleName = module.getBaseName() - .split( '.' )[ 0 ]; - - indexSourceFile.addExportDeclaration( { moduleSpecifier: `./${ moduleName }` } ); - } ); - - return indexSourceFile; -}; \ No newline at end of file diff --git a/src/generator/index.ts b/src/generator/index.ts deleted file mode 100644 index da403bf..0000000 --- a/src/generator/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './generateCode'; \ No newline at end of file diff --git a/src/generator/helpers/fileName.ts b/src/helpers/fileName.ts similarity index 100% rename from src/generator/helpers/fileName.ts rename to src/helpers/fileName.ts diff --git a/src/generator/helpers/index.ts b/src/helpers/index.ts similarity index 100% rename from src/generator/helpers/index.ts rename to src/helpers/index.ts diff --git a/src/generator/helpers/parser.ts b/src/helpers/parser.ts similarity index 100% rename from src/generator/helpers/parser.ts rename to src/helpers/parser.ts diff --git a/src/generator/types/index.ts b/src/types/index.ts similarity index 100% rename from src/generator/types/index.ts rename to src/types/index.ts diff --git a/src/generator/types/models.ts b/src/types/models.ts similarity index 70% rename from src/generator/types/models.ts rename to src/types/models.ts index 4f9f743..8e85681 100644 --- a/src/generator/types/models.ts +++ b/src/types/models.ts @@ -1,11 +1,11 @@ -export type ParsedModelRelation = { +export type ParseModelRelation = { modelName: string; condition: string; }; export type ParsedModel = { attributes: string[]; - relations: ParsedModelRelation[]; + relations: ParseModelRelation[]; }; export type ParsedModels = { diff --git a/tests/helpers/parser.test.ts b/tests/helpers/parser.test.ts index 738e673..da8770b 100644 --- a/tests/helpers/parser.test.ts +++ b/tests/helpers/parser.test.ts @@ -1,6 +1,6 @@ -import { parseDMMFModels } from '../../src/generator/helpers'; +import { parseDMMFModels } from '../../src/helpers'; import { getSampleDMMF } from '../__fixtures__/getSampleDMMF'; -import { ParsedModels } from '../../src/generator/types'; +import { ParsedModels } from '../../src/types'; import { DMMF } from '@prisma/generator-helper'; describe( 'parseDMMFModels', () => { diff --git a/tsconfig.json b/tsconfig.json index 9bf26d2..6bfff05 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -26,7 +26,6 @@ "exclude": [ "**/node_modules", "**/dist", - "./tests", - "./usage" + "./tests" ] } \ No newline at end of file diff --git a/usage/index.ts b/usage/index.ts deleted file mode 100644 index cb137d6..0000000 --- a/usage/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { ModelsGraph } from '@generated/models-graph'; - -console.log( ModelsGraph ); \ No newline at end of file