@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;AAqB9B,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,UAuGhB,CAAC;AAEF,SAAS,IAAI,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
- * This is a simplified implementation that finds the first occurrence
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
- if (lines[i].trim().startsWith(fieldName)) {
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 definedModels = new Set();
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
- definedModels.add(item.name);
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
- // Check if this field references another model
58
- const referencedModelName = property.fieldType;
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(referencedModelName)) {
103
+ if (primitiveTypes.includes(referencedTypeName)) {
70
104
  return;
71
105
  }
72
- // Skip array types (remove [] suffix)
73
- const cleanModelName = referencedModelName.replace(/\[\]$/, '');
74
- // Check if the referenced model is defined in this file
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: cleanModelName,
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,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,mCAAmC;QACnD,CAAC;IACH,CAAC;IACD,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,0CAA0C;oBAC1C,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;oBAExC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;wBACxB,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;4BACvC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;wBAC/B,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,SAAS,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;oCACpD,+CAA+C;oCAC/C,MAAM,mBAAmB,GAAG,QAAQ,CAAC,SAAS,CAAC;oCAE/C,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,mBAAmB,CAAC,EAAE,CAAC;wCACjD,OAAO;oCACT,CAAC;oCAED,sCAAsC;oCACtC,MAAM,cAAc,GAAG,mBAAmB,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;oCAEhE,wDAAwD;oCACxD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;wCACvC,mDAAmD;wCACnD,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,cAAc;6CACtB;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"}
1
+ {"version":3,"file":"no-cross-file-model-references.js","sourceRoot":"","sources":["../../src/rules/no-cross-file-model-references.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@synapsestudios/eslint-plugin-data-boundaries",
3
- "version": "1.3.0",
3
+ "version": "1.4.0",
4
4
  "description": "ESLint plugin to enforce data boundary policies in modular monoliths",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",