@synapsestudios/eslint-plugin-data-boundaries 1.3.0 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"no-cross-file-model-references.d.ts","sourceRoot":"","sources":["../../src/rules/no-cross-file-model-references.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"no-cross-file-model-references.d.ts","sourceRoot":"","sources":["../../src/rules/no-cross-file-model-references.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAwD9B,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,UAyGhB,CAAC;AAEF,SAAS,IAAI,CAAC"}
|
|
@@ -1,15 +1,45 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Helper function to recursively extract the base type name from complex field types
|
|
4
|
+
*/
|
|
5
|
+
function extractBaseType(fieldType) {
|
|
6
|
+
if (typeof fieldType === 'string') {
|
|
7
|
+
return fieldType;
|
|
8
|
+
}
|
|
9
|
+
if (fieldType && fieldType.type) {
|
|
10
|
+
switch (fieldType.type) {
|
|
11
|
+
case 'array':
|
|
12
|
+
return extractBaseType(fieldType.fieldType);
|
|
13
|
+
case 'optional':
|
|
14
|
+
return extractBaseType(fieldType.fieldType);
|
|
15
|
+
default:
|
|
16
|
+
// For other types, try to get the name or fieldType
|
|
17
|
+
return fieldType.name || extractBaseType(fieldType.fieldType) || '';
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return '';
|
|
21
|
+
}
|
|
2
22
|
/**
|
|
3
23
|
* Helper function to find the line number of a field in the schema content
|
|
4
|
-
*
|
|
24
|
+
* Looks for the field name followed by a type (space-separated tokens)
|
|
5
25
|
*/
|
|
6
26
|
function getLineNumber(content, fieldName) {
|
|
7
27
|
const lines = content.split('\n');
|
|
8
28
|
for (let i = 0; i < lines.length; i++) {
|
|
9
|
-
|
|
29
|
+
const line = lines[i].trim();
|
|
30
|
+
// Look for lines that start with the field name followed by whitespace and a type
|
|
31
|
+
// This avoids matching field names that appear in comments or other contexts
|
|
32
|
+
const fieldPattern = new RegExp(`^${fieldName}\\s+\\w+`);
|
|
33
|
+
if (fieldPattern.test(line)) {
|
|
10
34
|
return i + 1; // ESLint uses 1-based line numbers
|
|
11
35
|
}
|
|
12
36
|
}
|
|
37
|
+
// Fallback: look for any line containing the field name
|
|
38
|
+
for (let i = 0; i < lines.length; i++) {
|
|
39
|
+
if (lines[i].includes(fieldName)) {
|
|
40
|
+
return i + 1;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
13
43
|
return 1; // Default to line 1 if not found
|
|
14
44
|
}
|
|
15
45
|
const rule = {
|
|
@@ -42,20 +72,24 @@ const rule = {
|
|
|
42
72
|
return;
|
|
43
73
|
}
|
|
44
74
|
const ast = services.getPrismaAst();
|
|
45
|
-
// Extract all models defined in this file
|
|
46
|
-
const
|
|
75
|
+
// Extract all models and enums defined in this file
|
|
76
|
+
const definedTypes = new Set();
|
|
47
77
|
ast.list.forEach((item) => {
|
|
48
|
-
if (item.type === 'model' && item.name) {
|
|
49
|
-
|
|
78
|
+
if ((item.type === 'model' || item.type === 'enum') && item.name) {
|
|
79
|
+
definedTypes.add(item.name);
|
|
50
80
|
}
|
|
51
81
|
});
|
|
52
82
|
// Check each model for cross-file references
|
|
53
83
|
ast.list.forEach((item) => {
|
|
54
84
|
if (item.type === 'model' && item.properties) {
|
|
55
85
|
item.properties.forEach((property) => {
|
|
56
|
-
if (property && property.fieldType && property.name) {
|
|
57
|
-
//
|
|
58
|
-
const
|
|
86
|
+
if (property && property.type === 'field' && property.fieldType && property.name) {
|
|
87
|
+
// Extract the field type - handle both simple types and complex types
|
|
88
|
+
const referencedTypeName = extractBaseType(property.fieldType);
|
|
89
|
+
if (!referencedTypeName) {
|
|
90
|
+
// Skip if we can't determine the type
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
59
93
|
// Skip primitive types (String, Int, DateTime, etc.)
|
|
60
94
|
const primitiveTypes = [
|
|
61
95
|
'String',
|
|
@@ -66,14 +100,12 @@ const rule = {
|
|
|
66
100
|
'Json',
|
|
67
101
|
'Bytes',
|
|
68
102
|
];
|
|
69
|
-
if (primitiveTypes.includes(
|
|
103
|
+
if (primitiveTypes.includes(referencedTypeName)) {
|
|
70
104
|
return;
|
|
71
105
|
}
|
|
72
|
-
//
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
if (!definedModels.has(cleanModelName)) {
|
|
76
|
-
// This is a cross-file model reference - report it
|
|
106
|
+
// Check if the referenced type is defined in this file
|
|
107
|
+
if (!definedTypes.has(referencedTypeName)) {
|
|
108
|
+
// This is a cross-file reference - report it
|
|
77
109
|
const sourceCode = context.getSourceCode();
|
|
78
110
|
const schemaContent = sourceCode.getText();
|
|
79
111
|
const fieldLine = getLineNumber(schemaContent, property.name);
|
|
@@ -86,7 +118,7 @@ const rule = {
|
|
|
86
118
|
messageId: 'crossFileReference',
|
|
87
119
|
data: {
|
|
88
120
|
field: property.name,
|
|
89
|
-
model:
|
|
121
|
+
model: referencedTypeName,
|
|
90
122
|
},
|
|
91
123
|
});
|
|
92
124
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"no-cross-file-model-references.js","sourceRoot":"","sources":["../../src/rules/no-cross-file-model-references.ts"],"names":[],"mappings":";AAOA;;;GAGG;AACH,SAAS,aAAa,CAAC,OAAe,EAAE,SAAiB;IACvD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"no-cross-file-model-references.js","sourceRoot":"","sources":["../../src/rules/no-cross-file-model-references.ts"],"names":[],"mappings":";AAOA;;GAEG;AACH,SAAS,eAAe,CAAC,SAAc;IACrC,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;QAClC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,SAAS,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC;QAChC,QAAQ,SAAS,CAAC,IAAI,EAAE,CAAC;YACvB,KAAK,OAAO;gBACV,OAAO,eAAe,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YAC9C,KAAK,UAAU;gBACb,OAAO,eAAe,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YAC9C;gBACE,oDAAoD;gBACpD,OAAO,SAAS,CAAC,IAAI,IAAI,eAAe,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QACxE,CAAC;IACH,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;GAGG;AACH,SAAS,aAAa,CAAC,OAAe,EAAE,SAAiB;IACvD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC7B,kFAAkF;QAClF,6EAA6E;QAC7E,MAAM,YAAY,GAAG,IAAI,MAAM,CAAC,IAAI,SAAS,UAAU,CAAC,CAAC;QACzD,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,mCAAmC;QACnD,CAAC;IACH,CAAC;IAED,wDAAwD;IACxD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,CAAC;QACf,CAAC;IACH,CAAC;IAED,OAAO,CAAC,CAAC,CAAC,iCAAiC;AAC7C,CAAC;AAED,MAAM,IAAI,GAAoB;IAC5B,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EAAE,uEAAuE;YACpF,QAAQ,EAAE,gBAAgB;YAC1B,WAAW,EAAE,IAAI;SAClB;QACD,OAAO,EAAE,SAAS;QAClB,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE;YACR,kBAAkB,EAChB,gIAAgI;SACnI;KACF;IAED,MAAM,CAAC,OAAyB;QAC9B,6BAA6B;QAC7B,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QACvC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YAClC,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,OAAO;YACL,OAAO,CAAC,IAAS;gBACf,IAAI,CAAC;oBACH,sCAAsC;oBACtC,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,cAE5B,CAAC;oBACd,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC;wBACxC,oCAAoC;wBACpC,OAAO;oBACT,CAAC;oBAED,MAAM,GAAG,GAAG,QAAQ,CAAC,YAAY,EAAE,CAAC;oBAEpC,oDAAoD;oBACpD,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;oBAEvC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;wBACxB,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;4BACjE,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;wBAC9B,CAAC;oBACH,CAAC,CAAC,CAAC;oBAEH,6CAA6C;oBAC7C,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;wBACxB,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;4BAC7C,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,QAAa,EAAE,EAAE;gCACxC,IAAI,QAAQ,IAAI,QAAQ,CAAC,IAAI,KAAK,OAAO,IAAI,QAAQ,CAAC,SAAS,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;oCACjF,sEAAsE;oCACtE,MAAM,kBAAkB,GAAG,eAAe,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;oCAE/D,IAAI,CAAC,kBAAkB,EAAE,CAAC;wCACxB,sCAAsC;wCACtC,OAAO;oCACT,CAAC;oCAED,qDAAqD;oCACrD,MAAM,cAAc,GAAG;wCACrB,QAAQ;wCACR,KAAK;wCACL,OAAO;wCACP,SAAS;wCACT,UAAU;wCACV,MAAM;wCACN,OAAO;qCACR,CAAC;oCACF,IAAI,cAAc,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;wCAChD,OAAO;oCACT,CAAC;oCAED,uDAAuD;oCACvD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,kBAAkB,CAAC,EAAE,CAAC;wCAC1C,6CAA6C;wCAC7C,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;wCAC3C,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC;wCAC3C,MAAM,SAAS,GAAG,aAAa,CAAC,aAAa,EAAE,QAAQ,CAAC,IAAc,CAAC,CAAC;wCAExE,OAAO,CAAC,MAAM,CAAC;4CACb,IAAI;4CACJ,GAAG,EAAE;gDACH,IAAI,EAAE,SAAS;gDACf,MAAM,EAAE,CAAC;6CACV;4CACD,SAAS,EAAE,oBAAoB;4CAC/B,IAAI,EAAE;gDACJ,KAAK,EAAE,QAAQ,CAAC,IAAc;gDAC9B,KAAK,EAAE,kBAAkB;6CAC1B;yCACF,CAAC,CAAC;oCACL,CAAC;gCACH,CAAC;4BACH,CAAC,CAAC,CAAC;wBACL,CAAC;oBACH,CAAC,CAAC,CAAC;gBACL,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBAC5E,OAAO,CAAC,KAAK,CAAC,kCAAkC,QAAQ,GAAG,EAAE,YAAY,CAAC,CAAC;oBAC3E,gDAAgD;gBAClD,CAAC;YACH,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,iBAAS,IAAI,CAAC"}
|
package/package.json
CHANGED