npm package: @sergiyiva/adminjs-prisma
Description: Prisma adapter for AdminJS
Latest version: 2.0.1

## adminjs-prisma

This is an official [AdminJS](https://github.com/SoftwareBrothers/adminjs) adapter which integrates [Prisma](https://prisma.io/) into AdminJS.

**✨ Now supports Prisma v7!** See [PRISMA_V7_MIGRATION.md](./PRISMA_V7_MIGRATION.md) for upgrade instructions.

### Installation

- yarn: `yarn add @adminjs/prisma`

- npm: `npm install @adminjs/prisma`

### Supported Prisma Versions

- Prisma v5.x ✅
- Prisma v6.x ✅  
- Prisma v7.x ✅

## 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>

We’re 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).