UNPKG

@adminjs/prisma

Version:
177 lines (127 loc) 4.67 kB
## adminjs-prisma This is an official [AdminJS](https://github.com/SoftwareBrothers/adminjs) adapter which integrates [Prisma](https://prisma.io/) into AdminJS. ### Installation - yarn: `yarn add @adminjs/prisma` - npm: `npm install @adminjs/prisma` ## Usage The plugin can be registered using standard `AdminJS.registerAdapter` method. ```typescript import { Database, Resource } from '@adminjs/prisma' import AdminJS from 'adminjs' AdminJS.registerAdapter({ Database, Resource }) ``` ## Example (Basic) Whole code can be found in `example-app` directory in the repository. ```typescript import express from 'express' import AdminJS from 'adminjs' import AdminJSExpress from '@adminjs/express' import { Database, Resource, getModelByName } from '@adminjs/prisma' import { PrismaClient } from '@prisma/client' import { DMMFClass } from '@prisma/client/runtime' const PORT = process.env.port || 3000 const prisma = new PrismaClient() AdminJS.registerAdapter({ Database, Resource }) const run = async () => { const app = express() const admin = new AdminJS({ resources: [{ resource: { model: getModelByName('Post'), client: prisma }, options: {}, }, { resource: { model: getModelByName('Profile'), client: prisma }, options: {}, }, { resource: { model: getModelByName('Publisher'), client: prisma }, options: {}, }], }) const router = AdminJSExpress.buildRouter(admin) app.use(admin.options.rootPath, router) app.listen(PORT, () => { console.log(`Example app listening at http://localhost:${PORT}`) }) } run() .finally(async () => { await prisma.$disconnect() }) ``` ## Example (Custom Client Output Path) If you defined a custom client output path in your Prisma's schema, for example: ```prisma generator client { provider = "prisma-client-js" output = "./client-prisma" } ``` You must: * import your custom Prisma client * provide it to each resource which uses that Prisma client *Example*: ```typescript // other imports import PrismaModule from '../prisma/client-prisma/index.js'; // ... const prisma = new PrismaModule.PrismaClient(); // ... // Notice `clientModule` per resource const admin = new AdminJS({ resources: [{ resource: { model: getModelByName('Post', PrismaModule), client: prisma, clientModule: PrismaModule }, options: { properties: { someJson: { type: 'mixed', isArray: true }, 'someJson.number': { type: 'number' }, 'someJson.string': { type: 'string' }, 'someJson.boolean': { type: 'boolean' }, 'someJson.date': { type: 'datetime' }, }, }, }, { resource: { model: getModelByName('Profile', PrismaModule), client: prisma, clientModule: PrismaModule }, options: {}, }, { resource: { model: getModelByName('Publisher', PrismaModule), client: prisma, clientModule: PrismaModule }, options: {}, }], }); // ... ``` ## ManyToOne / ManyToMany These relationships are currently not supported by default. You can manage them using custom actions and components. ## Pull request Before you make a PR make sure all tests pass and your code won't cause linter errors. You can do this by running: ``` yarn lint yarn test ``` Make sure you have an `.env` file with `DATABASE_URL` specified. ## Running example app with local code modifications MySQL database is required. You can use the database from `adminjs-example-app`: https://github.com/SoftwareBrothers/adminjs-example-app/blob/master/docker-compose.yaml#L24 ``` $ yarn $ yarn build # after making changes or run "yarn dev" and open a new terminal for next command $ yarn link $ cd example-app $ yarn $ npx prisma generate $ npx prisma migrate dev ``` Now copy `example-app/node_modules/.prisma` folder into `node_modules/.prisma`. This is required because installing library dependencies detects a different Prisma schema in test folder. Continue in `example-app` folder: ``` $ yarn link "@adminjs/prisma" $ yarn build $ yarn start ``` The app should start at port 3000. ## License AdminJS is copyrighted © 2023 rst.software. It is a free software, and may be redistributed under the terms specified in the [LICENSE](LICENSE.md) file. ## About rst.software <img src="https://pbs.twimg.com/profile_images/1367119173604810752/dKVlj1YY_400x400.jpg" width=150> Were an open, friendly team that helps clients from all over the world to transform their businesses and create astonishing products. * We are available for [hire](https://www.rst.software/estimate-your-project). * If you want to work for us - check out the [career page](https://www.rst.software/join-us).