From d43cc650f2c3cd51374f43ad2cd5e3544c735934 Mon Sep 17 00:00:00 2001 From: Kaden Wilkinson <7799267+kdawgwilk@users.noreply.github.com> Date: Wed, 8 Nov 2023 12:44:17 -0700 Subject: [PATCH] feat(nx-prisma): add support for prisma format adds support to the generator to include adding a new executor that will run the prisma format command the formats the prisma schema closes #767 --- packages/nx-prisma/executors.json | 5 ++ .../src/executors/format/executor.spec.ts | 51 +++++++++++++++++++ .../src/executors/format/executor.ts | 21 ++++++++ .../src/executors/format/schema.d.ts | 12 +++++ .../src/executors/format/schema.json | 14 +++++ .../configuration/generator.spec.ts | 12 +++++ .../src/generators/configuration/generator.ts | 4 ++ 7 files changed, 119 insertions(+) create mode 100644 packages/nx-prisma/src/executors/format/executor.spec.ts create mode 100644 packages/nx-prisma/src/executors/format/executor.ts create mode 100644 packages/nx-prisma/src/executors/format/schema.d.ts create mode 100644 packages/nx-prisma/src/executors/format/schema.json diff --git a/packages/nx-prisma/executors.json b/packages/nx-prisma/executors.json index 36d376c4..4e0fb819 100644 --- a/packages/nx-prisma/executors.json +++ b/packages/nx-prisma/executors.json @@ -5,6 +5,11 @@ "schema": "./src/executors/deploy/schema.json", "description": "The migrate deploy command applies all pending migrations, and creates the database if it does not exist. Primarily used in non-development environments." }, + "format": { + "implementation": "./src/executors/format/executor", + "schema": "./src/executors/format/schema.json", + "description": "Formats the Prisma Schema Language of the Prisma schema file." + }, "generate": { "implementation": "./src/executors/generate/executor", "schema": "./src/executors/generate/schema.json", diff --git a/packages/nx-prisma/src/executors/format/executor.spec.ts b/packages/nx-prisma/src/executors/format/executor.spec.ts new file mode 100644 index 00000000..fde80eb3 --- /dev/null +++ b/packages/nx-prisma/src/executors/format/executor.spec.ts @@ -0,0 +1,51 @@ +import { ExecutorContext } from '@nx/devkit'; +import { expectCommandToHaveBeenCalled } from '../generate/executor.spec'; +import executor from './executor'; +import { FormatExecutorSchema } from './schema'; + +jest.mock('@nx-tools/core', () => { + const originalModule = jest.requireActual('@nx-tools/core'); + return { + __esModule: true, + ...originalModule, + getExecOutput: jest.fn(async () => Promise.resolve({ stderr: '', exitCode: 0 })), + }; +}); + +const mockContext: Partial = { + root: 'workspace-root', + workspace: { version: 2, projects: { foo: { root: 'apps/foo' } } }, + projectName: 'foo', +}; + +describe('Format Executor', () => { + it('empty options', async () => { + const options: FormatExecutorSchema = {}; + const output = await executor(options, mockContext as ExecutorContext); + expect( + expectCommandToHaveBeenCalled('npx prisma format', ['--schema=workspace-root/apps/foo/prisma/schema.prisma']) + ); + expect(output.success).toBeTruthy(); + }); + + test.each([['schema', 'my-prisma-file.schema']])( + 'given %p option with %p value, should be handled has arg', + async (option: keyof FormatExecutorSchema, value: string) => { + const options: FormatExecutorSchema = { + [option]: value, + }; + const output = await executor(options, mockContext as ExecutorContext); + expect(expectCommandToHaveBeenCalled('npx prisma format', [`--${option}=${value}`])); + expect(output.success).toBeTruthy(); + } + ); + + it('with all options', async () => { + const options: FormatExecutorSchema = { + schema: 'my-schema.schema', + }; + const output = await executor(options, mockContext as ExecutorContext); + expect(expectCommandToHaveBeenCalled('npx prisma format', ['--schema=my-schema.schema'])); + expect(output.success).toBeTruthy(); + }); +}); diff --git a/packages/nx-prisma/src/executors/format/executor.ts b/packages/nx-prisma/src/executors/format/executor.ts new file mode 100644 index 00000000..5a549e45 --- /dev/null +++ b/packages/nx-prisma/src/executors/format/executor.ts @@ -0,0 +1,21 @@ +import { ExecutorContext } from '@nx/devkit'; +import { runCommand } from '../../run-commands'; +import { getDefaultScheme } from '../../utils'; +import { FormatExecutorSchema } from './schema'; + +export default async function run(options: FormatExecutorSchema, ctx: ExecutorContext): Promise<{ success: true }> { + return runCommand(options, ctx, { + description: 'Format schema', + command: 'prisma format', + getArgs, + }); +} + +const getArgs = (options: FormatExecutorSchema, ctx: ExecutorContext): string[] => { + const args = []; + const schema = options?.schema ?? getDefaultScheme(ctx); + + args.push(`--schema=${schema}`); + + return args; +}; diff --git a/packages/nx-prisma/src/executors/format/schema.d.ts b/packages/nx-prisma/src/executors/format/schema.d.ts new file mode 100644 index 00000000..d8c9e479 --- /dev/null +++ b/packages/nx-prisma/src/executors/format/schema.d.ts @@ -0,0 +1,12 @@ +/** + * This file was automatically generated by json-schema-to-typescript. + * DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file, + * and run json-schema-to-typescript to regenerate this file. + */ + +import { PrismaBase } from '../../interfaces'; + +/** + * Formats the Prisma Schema Language of the Prisma schema file. + */ +export type FormatExecutorSchema = PrismaBase; diff --git a/packages/nx-prisma/src/executors/format/schema.json b/packages/nx-prisma/src/executors/format/schema.json new file mode 100644 index 00000000..0f91e8ab --- /dev/null +++ b/packages/nx-prisma/src/executors/format/schema.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/schema", + "version": 2, + "title": "Prisma format executor", + "description": "Formats the Prisma Schema Language of the Prisma schema file.", + "type": "object", + "properties": { + "schema": { + "type": "string", + "description": "Specifies the path to the desired schema.prisma file to be processed instead of the default path. Both absolute and relative paths are supported." + } + }, + "required": [] +} diff --git a/packages/nx-prisma/src/generators/configuration/generator.spec.ts b/packages/nx-prisma/src/generators/configuration/generator.spec.ts index c3954db0..3e40b964 100644 --- a/packages/nx-prisma/src/generators/configuration/generator.spec.ts +++ b/packages/nx-prisma/src/generators/configuration/generator.spec.ts @@ -26,6 +26,9 @@ describe('configuration generator', () => { 'prisma-deploy': { executor: '@nx-tools/nx-prisma:deploy', }, + 'prisma-format': { + executor: '@nx-tools/nx-prisma:format', + }, 'prisma-generate': { executor: '@nx-tools/nx-prisma:generate', }, @@ -79,6 +82,12 @@ describe('configuration generator', () => { schema: 'apps/mypkg/custom-dir/schema.prisma', }, }, + 'prisma-format': { + executor: '@nx-tools/nx-prisma:format', + options: { + schema: 'apps/mypkg/custom-dir/schema.prisma', + }, + }, 'prisma-generate': { executor: '@nx-tools/nx-prisma:generate', options: { @@ -159,6 +168,9 @@ describe('configuration generator', () => { 'prisma-deploy': { executor: '@nx-tools/nx-prisma:deploy', }, + 'prisma-format': { + executor: '@nx-tools/nx-prisma:format', + }, 'prisma-generate': { executor: '@nx-tools/nx-prisma:generate', }, diff --git a/packages/nx-prisma/src/generators/configuration/generator.ts b/packages/nx-prisma/src/generators/configuration/generator.ts index 3294af98..206400fc 100644 --- a/packages/nx-prisma/src/generators/configuration/generator.ts +++ b/packages/nx-prisma/src/generators/configuration/generator.ts @@ -52,6 +52,10 @@ export async function configurationGenerator(tree: Tree, options: ConfigurationG executor: '@nx-tools/nx-prisma:deploy', ...executorOpts, }, + 'prisma-format': { + executor: '@nx-tools/nx-prisma:format', + ...executorOpts, + }, 'prisma-generate': { executor: '@nx-tools/nx-prisma:generate', ...executorOpts,