Skip to content

Commit 29d5f32

Browse files
maxhkejistan
andauthored
[S] Stop requiring defaults for @ignored relation fields. (#684)
Fixes #683 --------- Co-authored-by: Sean Nicolay <sean@nicolay.dev>
1 parent 7666ba9 commit 29d5f32

6 files changed

Lines changed: 44 additions & 13 deletions

File tree

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
## Unreleased
44

5+
## 0.10.2 (2025-05-24)
6+
7+
- [#683](https://github.com/loop-payments/prisma-lint/issues/683) Stop requiring defaults for `@ignored` relation fields.
8+
59
## 0.10.1 (2025-04-30)
610

711
- [#622](https://github.com/loop-payments/prisma-lint/issues/662) Require case-sensitive compound word match for snake case conversion. Fixes bug introduced in `0.10.0`.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "prisma-lint",
3-
"version": "0.10.1",
3+
"version": "0.10.2",
44
"description": "A linter for Prisma schema files.",
55
"repository": {
66
"type": "git",

src/common/prisma.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,3 +121,13 @@ export function assertValueIsStringArray(value: Value): Array<string> {
121121

122122
throw new Error(`value is not a string array ${JSON.stringify(value)}`);
123123
}
124+
125+
export function looksLikeAssociationFieldType(fieldType: any) {
126+
if (typeof fieldType != 'string') {
127+
return false;
128+
}
129+
if (PRISMA_SCALAR_TYPES.has(fieldType)) {
130+
return false;
131+
}
132+
return true;
133+
}

src/rules/field-name-mapping-snake-case.ts

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@ import type { Attribute } from '@mrleebo/prisma-ast';
33
import { z } from 'zod';
44

55
import { getRuleIgnoreParams } from '#src/common/ignore.js';
6-
import { PRISMA_SCALAR_TYPES, getMappedName } from '#src/common/prisma.js';
6+
import {
7+
getMappedName,
8+
looksLikeAssociationFieldType,
9+
} from '#src/common/prisma.js';
710
import type { FieldRuleDefinition } from '#src/common/rule.js';
811
import { toSnakeCase } from '#src/common/snake-case.js';
912

@@ -132,7 +135,7 @@ export default {
132135
if (
133136
!isEnumField(context.enumNames, fieldType) &&
134137
!isCustomTypeField(context.customTypeNames, fieldType) &&
135-
looksLikeAssociation(fieldType)
138+
looksLikeAssociationFieldType(fieldType)
136139
) {
137140
return;
138141
}
@@ -193,16 +196,6 @@ function findMapAttribute(attributes: Attribute[]): Attribute | undefined {
193196
return filtered[0];
194197
}
195198

196-
function looksLikeAssociation(fieldType: any) {
197-
if (typeof fieldType != 'string') {
198-
return false;
199-
}
200-
if (PRISMA_SCALAR_TYPES.has(fieldType)) {
201-
return false;
202-
}
203-
return true;
204-
}
205-
206199
function isAllLowerCase(s: string) {
207200
return s.toLowerCase() == s;
208201
}

src/rules/forbid-required-ignored-field.test.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,26 @@ describe('forbid-required-ignored-field', () => {
1717
describe('forbidding', () => {
1818
const run = getRunner();
1919

20+
describe('with ignored relation-only field', () => {
21+
it('returns no violations', async () => {
22+
const violations = await run(`
23+
model User {
24+
id Int @id @default(autoincrement())
25+
posts Post[] @ignore
26+
}
27+
28+
model Post {
29+
id Int @id @default(autoincrement())
30+
author User @relation(fields: [authorId], references: [id])
31+
authorId Int
32+
title String
33+
@@ignore
34+
}
35+
`);
36+
expect(violations.length).toEqual(0);
37+
});
38+
});
39+
2040
describe('with optional ignored field', () => {
2141
it('returns no violations', async () => {
2242
const violations = await run(`

src/rules/forbid-required-ignored-field.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { z } from 'zod';
22

3+
import { looksLikeAssociationFieldType } from '#src/common/prisma.js';
34
import type { FieldRuleDefinition } from '#src/common/rule.js';
45

56
const RULE_NAME = 'forbid-required-ignored-field';
@@ -50,6 +51,9 @@ export default {
5051
if (!isIgnored || hasDefault) return;
5152
const isRequired = !field.optional;
5253
if (!isRequired) return;
54+
if (looksLikeAssociationFieldType(field.fieldType)) {
55+
return;
56+
}
5357
const message =
5458
'Do not ignore a required field without a default value.';
5559
context.report({ model, field, message });

0 commit comments

Comments
 (0)