@webpieces/code-rules 0.0.1 → 0.2.113

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.
Files changed (63) hide show
  1. package/package.json +4 -3
  2. package/src/cli.d.ts +1 -0
  3. package/src/cli.js +19 -0
  4. package/src/cli.js.map +1 -0
  5. package/src/diff-utils.d.ts +24 -0
  6. package/src/{diff-utils.ts → diff-utils.js} +30 -38
  7. package/src/diff-utils.js.map +1 -0
  8. package/src/from-shared-config.d.ts +28 -0
  9. package/src/from-shared-config.js +119 -0
  10. package/src/from-shared-config.js.map +1 -0
  11. package/src/index.js +33 -0
  12. package/src/index.js.map +1 -0
  13. package/src/validate-catch-error-pattern.d.ts +47 -0
  14. package/src/{validate-catch-error-pattern.ts → validate-catch-error-pattern.js} +74 -195
  15. package/src/validate-catch-error-pattern.js.map +1 -0
  16. package/src/validate-code.d.ts +98 -0
  17. package/src/{validate-code.ts → validate-code.js} +65 -259
  18. package/src/validate-code.js.map +1 -0
  19. package/src/validate-dtos.d.ts +41 -0
  20. package/src/{validate-dtos.ts → validate-dtos.js} +88 -215
  21. package/src/validate-dtos.js.map +1 -0
  22. package/src/validate-modified-files.d.ts +24 -0
  23. package/src/{validate-modified-files.ts → validate-modified-files.js} +46 -115
  24. package/src/validate-modified-files.js.map +1 -0
  25. package/src/validate-modified-methods.d.ts +30 -0
  26. package/src/{validate-modified-methods.ts → validate-modified-methods.js} +94 -196
  27. package/src/validate-modified-methods.js.map +1 -0
  28. package/src/validate-new-methods.d.ts +27 -0
  29. package/src/{validate-new-methods.ts → validate-new-methods.js} +63 -133
  30. package/src/validate-new-methods.js.map +1 -0
  31. package/src/validate-no-any-unknown.d.ts +41 -0
  32. package/src/{validate-no-any-unknown.ts → validate-no-any-unknown.js} +69 -146
  33. package/src/validate-no-any-unknown.js.map +1 -0
  34. package/src/validate-no-destructure.d.ts +51 -0
  35. package/src/{validate-no-destructure.ts → validate-no-destructure.js} +80 -166
  36. package/src/validate-no-destructure.js.map +1 -0
  37. package/src/validate-no-direct-api-resolver.d.ts +46 -0
  38. package/src/{validate-no-direct-api-resolver.ts → validate-no-direct-api-resolver.js} +112 -211
  39. package/src/validate-no-direct-api-resolver.js.map +1 -0
  40. package/src/validate-no-implicit-any.d.ts +36 -0
  41. package/src/{validate-no-implicit-any.ts → validate-no-implicit-any.js} +94 -141
  42. package/src/validate-no-implicit-any.js.map +1 -0
  43. package/src/validate-no-inline-types.d.ts +90 -0
  44. package/src/{validate-no-inline-types.ts → validate-no-inline-types.js} +93 -198
  45. package/src/validate-no-inline-types.js.map +1 -0
  46. package/src/validate-no-unmanaged-exceptions.d.ts +43 -0
  47. package/src/{validate-no-unmanaged-exceptions.ts → validate-no-unmanaged-exceptions.js} +71 -140
  48. package/src/validate-no-unmanaged-exceptions.js.map +1 -0
  49. package/src/validate-prisma-converters.d.ts +59 -0
  50. package/src/{validate-prisma-converters.ts → validate-prisma-converters.js} +120 -307
  51. package/src/validate-prisma-converters.js.map +1 -0
  52. package/src/validate-return-types.d.ts +28 -0
  53. package/src/{validate-return-types.ts → validate-return-types.js} +84 -168
  54. package/src/validate-return-types.js.map +1 -0
  55. package/LICENSE +0 -373
  56. package/jest.config.ts +0 -20
  57. package/project.json +0 -22
  58. package/src/cli.ts +0 -17
  59. package/src/from-shared-config.ts +0 -118
  60. package/tsconfig.json +0 -22
  61. package/tsconfig.lib.json +0 -10
  62. package/tsconfig.spec.json +0 -14
  63. /package/src/{index.ts → index.d.ts} +0 -0
@@ -1,207 +1,42 @@
1
- import { loadConfig } from '@webpieces/rules-config';
2
- import { toValidateCodeOptions } from './from-shared-config';
3
- import runNewMethodsExecutor from './validate-new-methods';
4
- import runModifiedMethodsExecutor from './validate-modified-methods';
5
- import runModifiedFilesExecutor from './validate-modified-files';
6
- import runReturnTypesExecutor, { ReturnTypeMode } from './validate-return-types';
7
- import runNoInlineTypesExecutor, { NoInlineTypesMode } from './validate-no-inline-types';
8
- import runNoAnyUnknownExecutor, { NoAnyUnknownMode } from './validate-no-any-unknown';
9
- import runNoImplicitAnyExecutor, { NoImplicitAnyMode } from './validate-no-implicit-any';
10
- import runValidateDtosExecutor, { ValidateDtosMode } from './validate-dtos';
11
- import runPrismaConvertersExecutor, { PrismaConverterMode } from './validate-prisma-converters';
12
- import runNoDestructureExecutor, { NoDestructureMode } from './validate-no-destructure';
13
- import runCatchErrorPatternExecutor, { CatchErrorPatternMode } from './validate-catch-error-pattern';
14
- import runNoUnmanagedExceptionsExecutor, { NoUnmanagedExceptionsMode } from './validate-no-unmanaged-exceptions';
15
- import runNoDirectApiResolverExecutor, { NoDirectApiResolverMode } from './validate-no-direct-api-resolver';
16
-
17
- export type MethodMaxLimitMode = 'OFF' | 'NEW_METHODS' | 'NEW_AND_MODIFIED_METHODS' | 'MODIFIED_FILES';
18
- export type FileMaxLimitMode = 'OFF' | 'MODIFIED_FILES';
19
-
20
- export interface MethodMaxLimitConfig {
21
- limit?: number;
22
- mode?: MethodMaxLimitMode;
23
- disableAllowed?: boolean;
24
- ignoreModifiedUntilEpoch?: number;
25
- }
26
-
27
- export interface FileMaxLimitConfig {
28
- limit?: number;
29
- mode?: FileMaxLimitMode;
30
- disableAllowed?: boolean;
31
- ignoreModifiedUntilEpoch?: number;
32
- }
33
-
34
- export interface RequireReturnTypeConfig {
35
- mode?: ReturnTypeMode;
36
- disableAllowed?: boolean;
37
- ignoreModifiedUntilEpoch?: number;
38
- }
39
-
40
- export interface NoInlineTypeLiteralsConfig {
41
- mode?: NoInlineTypesMode;
42
- disableAllowed?: boolean;
43
- ignoreModifiedUntilEpoch?: number;
44
- }
45
-
46
- export interface NoAnyUnknownConfig {
47
- mode?: NoAnyUnknownMode;
48
- disableAllowed?: boolean;
49
- ignoreModifiedUntilEpoch?: number;
50
- }
51
-
52
- export interface NoImplicitAnyConfig {
53
- mode?: NoImplicitAnyMode;
54
- disableAllowed?: boolean;
55
- ignoreModifiedUntilEpoch?: number;
56
- }
57
-
58
- export interface ValidateDtosConfig {
59
- mode?: ValidateDtosMode;
60
- disableAllowed?: boolean;
61
- prismaSchemaPath?: string;
62
- dtoSourcePaths?: string[];
63
- ignoreModifiedUntilEpoch?: number;
64
- }
65
-
66
- export interface PrismaConverterConfig {
67
- mode?: PrismaConverterMode;
68
- disableAllowed?: boolean;
69
- schemaPath?: string;
70
- convertersPaths?: string[];
71
- enforcePaths?: string[];
72
- ignoreModifiedUntilEpoch?: number;
73
- }
74
-
75
- export interface NoDestructureConfig {
76
- mode?: NoDestructureMode;
77
- disableAllowed?: boolean;
78
- ignoreModifiedUntilEpoch?: number;
79
- }
80
-
81
- export interface CatchErrorPatternConfig {
82
- mode?: CatchErrorPatternMode;
83
- disableAllowed?: boolean;
84
- ignoreModifiedUntilEpoch?: number;
85
- }
86
-
87
- export interface NoUnmanagedExceptionsConfig {
88
- mode?: NoUnmanagedExceptionsMode;
89
- disableAllowed?: boolean;
90
- ignoreModifiedUntilEpoch?: number;
91
- }
92
-
93
- export interface NoDirectApiResolverConfig {
94
- mode?: NoDirectApiResolverMode;
95
- disableAllowed?: boolean;
96
- ignoreModifiedUntilEpoch?: number;
97
- enforcePaths?: string[];
98
- }
99
-
100
- export interface ValidateCodeOptions {
101
- methodMaxLimit?: MethodMaxLimitConfig;
102
- fileMaxLimit?: FileMaxLimitConfig;
103
- requireReturnType?: RequireReturnTypeConfig;
104
- noInlineTypeLiterals?: NoInlineTypeLiteralsConfig;
105
- noAnyUnknown?: NoAnyUnknownConfig;
106
- noImplicitAny?: NoImplicitAnyConfig;
107
- validateDtos?: ValidateDtosConfig;
108
- prismaConverter?: PrismaConverterConfig;
109
- noDestructure?: NoDestructureConfig;
110
- catchErrorPattern?: CatchErrorPatternConfig;
111
- noUnmanagedExceptions?: NoUnmanagedExceptionsConfig;
112
- noDirectApiInResolver?: NoDirectApiResolverConfig;
113
- }
114
-
115
- export interface ExecutorResult {
116
- success: boolean;
117
- }
118
-
119
- interface OverrideInfo {
120
- active: boolean;
121
- normalMode: string;
122
- expiresDate: string;
123
- }
124
-
125
- interface ParsedConfig {
126
- methodLimit: number;
127
- methodMode: MethodMaxLimitMode;
128
- methodDisableAllowed: boolean;
129
- methodOverride: OverrideInfo | undefined;
130
- fileLimit: number;
131
- fileMode: FileMaxLimitMode;
132
- fileDisableAllowed: boolean;
133
- fileOverride: OverrideInfo | undefined;
134
- returnTypeMode: ReturnTypeMode;
135
- returnTypeDisableAllowed: boolean;
136
- returnTypeIgnoreEpoch: number | undefined;
137
- noInlineTypesMode: NoInlineTypesMode;
138
- noInlineTypesDisableAllowed: boolean;
139
- noInlineTypesIgnoreEpoch: number | undefined;
140
- noAnyUnknownMode: NoAnyUnknownMode;
141
- noAnyUnknownDisableAllowed: boolean;
142
- noAnyUnknownIgnoreEpoch: number | undefined;
143
- noImplicitAnyMode: NoImplicitAnyMode;
144
- noImplicitAnyDisableAllowed: boolean;
145
- noImplicitAnyIgnoreEpoch: number | undefined;
146
- validateDtosMode: ValidateDtosMode;
147
- validateDtosDisableAllowed: boolean;
148
- validateDtosPrismaPath: string | undefined;
149
- validateDtosSrcPaths: string[];
150
- validateDtosIgnoreEpoch: number | undefined;
151
- prismaConverterMode: PrismaConverterMode;
152
- prismaConverterDisableAllowed: boolean;
153
- prismaConverterSchemaPath: string | undefined;
154
- prismaConverterConvertersPaths: string[];
155
- prismaConverterEnforcePaths: string[];
156
- prismaConverterIgnoreEpoch: number | undefined;
157
- noDestructureMode: NoDestructureMode;
158
- noDestructureDisableAllowed: boolean;
159
- noDestructureIgnoreEpoch: number | undefined;
160
- catchErrorPatternMode: CatchErrorPatternMode;
161
- catchErrorPatternDisableAllowed: boolean;
162
- catchErrorPatternIgnoreEpoch: number | undefined;
163
- noUnmanagedExceptionsMode: NoUnmanagedExceptionsMode;
164
- noUnmanagedExceptionsDisableAllowed: boolean;
165
- noUnmanagedExceptionsIgnoreEpoch: number | undefined;
166
- noDirectApiResolverMode: NoDirectApiResolverMode;
167
- noDirectApiResolverDisableAllowed: boolean;
168
- noDirectApiResolverIgnoreEpoch: number | undefined;
169
- noDirectApiResolverEnforcePaths: string[];
170
- }
171
-
172
- interface ResolvedMethodMode {
173
- mode: MethodMaxLimitMode;
174
- override: OverrideInfo | undefined;
175
- }
176
-
177
- interface ResolvedFileMode {
178
- mode: FileMaxLimitMode;
179
- override: OverrideInfo | undefined;
180
- }
181
-
182
- const VALID_MODES: Record<string, string[]> = {
183
- methodMaxLimit: ['OFF', 'NEW_METHODS', 'NEW_AND_MODIFIED_METHODS', 'MODIFIED_FILES'],
184
- fileMaxLimit: ['OFF', 'MODIFIED_FILES'],
185
- requireReturnType: ['OFF', 'NEW_METHODS', 'NEW_AND_MODIFIED_METHODS', 'MODIFIED_FILES'],
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = runValidator;
4
+ const tslib_1 = require("tslib");
5
+ const rules_config_1 = require("@webpieces/rules-config");
6
+ const from_shared_config_1 = require("./from-shared-config");
7
+ const validate_new_methods_1 = tslib_1.__importDefault(require("./validate-new-methods"));
8
+ const validate_modified_methods_1 = tslib_1.__importDefault(require("./validate-modified-methods"));
9
+ const validate_modified_files_1 = tslib_1.__importDefault(require("./validate-modified-files"));
10
+ const validate_return_types_1 = tslib_1.__importDefault(require("./validate-return-types"));
11
+ const validate_no_inline_types_1 = tslib_1.__importDefault(require("./validate-no-inline-types"));
12
+ const validate_no_any_unknown_1 = tslib_1.__importDefault(require("./validate-no-any-unknown"));
13
+ const validate_no_implicit_any_1 = tslib_1.__importDefault(require("./validate-no-implicit-any"));
14
+ const validate_dtos_1 = tslib_1.__importDefault(require("./validate-dtos"));
15
+ const validate_prisma_converters_1 = tslib_1.__importDefault(require("./validate-prisma-converters"));
16
+ const validate_no_destructure_1 = tslib_1.__importDefault(require("./validate-no-destructure"));
17
+ const validate_catch_error_pattern_1 = tslib_1.__importDefault(require("./validate-catch-error-pattern"));
18
+ const validate_no_unmanaged_exceptions_1 = tslib_1.__importDefault(require("./validate-no-unmanaged-exceptions"));
19
+ const validate_no_direct_api_resolver_1 = tslib_1.__importDefault(require("./validate-no-direct-api-resolver"));
20
+ const VALID_MODES = {
21
+ methodMaxLimit: ['OFF', 'NEW_METHODS', 'NEW_AND_MODIFIED_METHODS', 'MODIFIED_FILES'],
22
+ fileMaxLimit: ['OFF', 'MODIFIED_FILES'],
23
+ requireReturnType: ['OFF', 'NEW_METHODS', 'NEW_AND_MODIFIED_METHODS', 'MODIFIED_FILES'],
186
24
  noInlineTypeLiterals: ['OFF', 'NEW_METHODS', 'NEW_AND_MODIFIED_METHODS', 'MODIFIED_FILES'],
187
- noAnyUnknown: ['OFF', 'MODIFIED_CODE', 'MODIFIED_FILES'],
188
- noImplicitAny: ['OFF', 'MODIFIED_CODE', 'MODIFIED_FILES'],
189
- validateDtos: ['OFF', 'MODIFIED_CLASS', 'MODIFIED_FILES'],
190
- prismaConverter: ['OFF', 'NEW_AND_MODIFIED_METHODS', 'MODIFIED_FILES'],
191
- noDestructure: ['OFF', 'MODIFIED_CODE', 'MODIFIED_FILES'],
192
- catchErrorPattern: ['OFF', 'MODIFIED_CODE', 'MODIFIED_FILES'],
25
+ noAnyUnknown: ['OFF', 'MODIFIED_CODE', 'MODIFIED_FILES'],
26
+ noImplicitAny: ['OFF', 'MODIFIED_CODE', 'MODIFIED_FILES'],
27
+ validateDtos: ['OFF', 'MODIFIED_CLASS', 'MODIFIED_FILES'],
28
+ prismaConverter: ['OFF', 'NEW_AND_MODIFIED_METHODS', 'MODIFIED_FILES'],
29
+ noDestructure: ['OFF', 'MODIFIED_CODE', 'MODIFIED_FILES'],
30
+ catchErrorPattern: ['OFF', 'MODIFIED_CODE', 'MODIFIED_FILES'],
193
31
  noUnmanagedExceptions: ['OFF', 'MODIFIED_CODE', 'MODIFIED_FILES'],
194
32
  noDirectApiInResolver: ['OFF', 'MODIFIED_CODE', 'NEW_AND_MODIFIED_METHODS', 'MODIFIED_FILES'],
195
33
  };
196
-
197
34
  /**
198
35
  * Validate that all configured modes are valid. Produces clear error messages naming the rule.
199
36
  */
200
- function validateModes(options: ValidateCodeOptions): string[] {
201
- const errors: string[] = [];
202
-
203
- type ModeEntry = [string, string | undefined];
204
- const modeEntries: ModeEntry[] = [
37
+ function validateModes(options) {
38
+ const errors = [];
39
+ const modeEntries = [
205
40
  ['methodMaxLimit', options.methodMaxLimit?.mode],
206
41
  ['fileMaxLimit', options.fileMaxLimit?.mode],
207
42
  ['requireReturnType', options.requireReturnType?.mode],
@@ -215,35 +50,29 @@ function validateModes(options: ValidateCodeOptions): string[] {
215
50
  ['noUnmanagedExceptions', options.noUnmanagedExceptions?.mode],
216
51
  ['noDirectApiInResolver', options.noDirectApiInResolver?.mode],
217
52
  ];
218
-
219
53
  for (const entry of modeEntries) {
220
54
  const ruleName = entry[0];
221
55
  const modeValue = entry[1];
222
- if (modeValue === undefined) continue;
56
+ if (modeValue === undefined)
57
+ continue;
223
58
  const validModes = VALID_MODES[ruleName];
224
59
  if (!validModes.includes(modeValue)) {
225
60
  errors.push(`${ruleName}.mode = '${modeValue}' is invalid. Valid modes: ${validModes.join(', ')}`);
226
61
  }
227
62
  }
228
-
229
63
  return errors;
230
64
  }
231
-
232
- function formatEpochDate(epoch: number): string {
65
+ function formatEpochDate(epoch) {
233
66
  return new Date(epoch * 1000).toISOString().split('T')[0];
234
67
  }
235
-
236
- function resolveMethodMode(
237
- normalMode: MethodMaxLimitMode, epoch: number | undefined
238
- ): ResolvedMethodMode {
68
+ function resolveMethodMode(normalMode, epoch) {
239
69
  if (epoch === undefined) {
240
70
  return { mode: normalMode, override: undefined };
241
71
  }
242
72
  const nowSeconds = Date.now() / 1000;
243
73
  if (nowSeconds < epoch) {
244
74
  // Active: downgrade to skip modified checking
245
- const downgraded: MethodMaxLimitMode =
246
- normalMode === 'OFF' ? 'OFF' : 'NEW_METHODS';
75
+ const downgraded = normalMode === 'OFF' ? 'OFF' : 'NEW_METHODS';
247
76
  return {
248
77
  mode: downgraded,
249
78
  override: { active: true, normalMode, expiresDate: formatEpochDate(epoch) },
@@ -252,10 +81,7 @@ function resolveMethodMode(
252
81
  // Expired
253
82
  return { mode: normalMode, override: undefined };
254
83
  }
255
-
256
- function resolveFileMode(
257
- normalMode: FileMaxLimitMode, epoch: number | undefined
258
- ): ResolvedFileMode {
84
+ function resolveFileMode(normalMode, epoch) {
259
85
  if (epoch === undefined) {
260
86
  return { mode: normalMode, override: undefined };
261
87
  }
@@ -270,17 +96,13 @@ function resolveFileMode(
270
96
  // Expired
271
97
  return { mode: normalMode, override: undefined };
272
98
  }
273
-
274
- function parseConfig(options: ValidateCodeOptions): ParsedConfig {
275
- const methodConfig: MethodMaxLimitConfig = options.methodMaxLimit ?? {};
276
- const fileConfig: FileMaxLimitConfig = options.fileMaxLimit ?? {};
277
-
99
+ function parseConfig(options) {
100
+ const methodConfig = options.methodMaxLimit ?? {};
101
+ const fileConfig = options.fileMaxLimit ?? {};
278
102
  const normalMethodMode = methodConfig.mode ?? 'NEW_AND_MODIFIED_METHODS';
279
103
  const normalFileMode = fileConfig.mode ?? 'MODIFIED_FILES';
280
-
281
104
  const methodResolved = resolveMethodMode(normalMethodMode, methodConfig.ignoreModifiedUntilEpoch);
282
105
  const fileResolved = resolveFileMode(normalFileMode, fileConfig.ignoreModifiedUntilEpoch);
283
-
284
106
  return {
285
107
  methodLimit: methodConfig.limit ?? 80,
286
108
  methodMode: methodResolved.mode,
@@ -328,15 +150,13 @@ function parseConfig(options: ValidateCodeOptions): ParsedConfig {
328
150
  noDirectApiResolverEnforcePaths: options.noDirectApiInResolver?.enforcePaths ?? [],
329
151
  };
330
152
  }
331
-
332
- function formatOverride(override: OverrideInfo | undefined): string {
153
+ function formatOverride(override) {
333
154
  if (!override) {
334
155
  return '';
335
156
  }
336
157
  return ` (override active, normal: ${override.normalMode}, expires: ${override.expiresDate})`;
337
158
  }
338
-
339
- function logConfig(config: ParsedConfig): void {
159
+ function logConfig(config) {
340
160
  console.log('\n\ud83d\udccf Running Code Validations\n');
341
161
  console.log(` Method limits: mode=${config.methodMode}${formatOverride(config.methodOverride)}, limit=${config.methodLimit}, disableAllowed=${config.methodDisableAllowed}`);
342
162
  console.log(` File limits: mode=${config.fileMode}${formatOverride(config.fileOverride)}, limit=${config.fileLimit}, disableAllowed=${config.fileDisableAllowed}`);
@@ -352,8 +172,7 @@ function logConfig(config: ParsedConfig): void {
352
172
  console.log(` No direct API in resolver: mode=${config.noDirectApiResolverMode}, disableAllowed=${config.noDirectApiResolverDisableAllowed}`);
353
173
  console.log('');
354
174
  }
355
-
356
- function isAllOff(config: ParsedConfig): boolean {
175
+ function isAllOff(config) {
357
176
  return config.methodMode === 'OFF' && config.fileMode === 'OFF' &&
358
177
  config.returnTypeMode === 'OFF' && config.noInlineTypesMode === 'OFF' &&
359
178
  config.noAnyUnknownMode === 'OFF' && config.noImplicitAnyMode === 'OFF' &&
@@ -362,61 +181,58 @@ function isAllOff(config: ParsedConfig): boolean {
362
181
  config.catchErrorPatternMode === 'OFF' && config.noUnmanagedExceptionsMode === 'OFF' &&
363
182
  config.noDirectApiResolverMode === 'OFF';
364
183
  }
365
-
366
- async function runMethodValidators(config: ParsedConfig, workspaceRoot: string): Promise<ExecutorResult[]> {
367
- const results: ExecutorResult[] = [];
184
+ async function runMethodValidators(config, workspaceRoot) {
185
+ const results = [];
368
186
  const runNew = config.methodMode === 'NEW_METHODS' || config.methodMode === 'NEW_AND_MODIFIED_METHODS';
369
187
  const runModified = config.methodMode === 'NEW_AND_MODIFIED_METHODS' || config.methodMode === 'MODIFIED_FILES';
370
-
371
188
  if (runNew) {
372
- results.push(await runNewMethodsExecutor({
189
+ results.push(await (0, validate_new_methods_1.default)({
373
190
  limit: config.methodLimit,
374
191
  mode: config.methodMode, disableAllowed: config.methodDisableAllowed,
375
192
  }, workspaceRoot));
376
193
  }
377
194
  if (runModified) {
378
- results.push(await runModifiedMethodsExecutor({
195
+ results.push(await (0, validate_modified_methods_1.default)({
379
196
  limit: config.methodLimit, mode: config.methodMode, disableAllowed: config.methodDisableAllowed,
380
197
  }, workspaceRoot));
381
198
  }
382
199
  return results;
383
200
  }
384
-
385
- async function runAllValidators(config: ParsedConfig, workspaceRoot: string): Promise<ExecutorResult[]> {
386
- const results: ExecutorResult[] = [];
201
+ async function runAllValidators(config, workspaceRoot) {
202
+ const results = [];
387
203
  const methodResults = await runMethodValidators(config, workspaceRoot);
388
204
  results.push(...methodResults);
389
- results.push(await runModifiedFilesExecutor({
205
+ results.push(await (0, validate_modified_files_1.default)({
390
206
  limit: config.fileLimit, mode: config.fileMode, disableAllowed: config.fileDisableAllowed,
391
207
  }, workspaceRoot));
392
- results.push(await runReturnTypesExecutor({
208
+ results.push(await (0, validate_return_types_1.default)({
393
209
  mode: config.returnTypeMode,
394
210
  disableAllowed: config.returnTypeDisableAllowed,
395
211
  ignoreModifiedUntilEpoch: config.returnTypeIgnoreEpoch,
396
212
  }, workspaceRoot));
397
- results.push(await runNoInlineTypesExecutor({
213
+ results.push(await (0, validate_no_inline_types_1.default)({
398
214
  mode: config.noInlineTypesMode,
399
215
  disableAllowed: config.noInlineTypesDisableAllowed,
400
216
  ignoreModifiedUntilEpoch: config.noInlineTypesIgnoreEpoch,
401
217
  }, workspaceRoot));
402
- results.push(await runNoAnyUnknownExecutor({
218
+ results.push(await (0, validate_no_any_unknown_1.default)({
403
219
  mode: config.noAnyUnknownMode,
404
220
  disableAllowed: config.noAnyUnknownDisableAllowed,
405
221
  ignoreModifiedUntilEpoch: config.noAnyUnknownIgnoreEpoch,
406
222
  }, workspaceRoot));
407
- results.push(await runNoImplicitAnyExecutor({
223
+ results.push(await (0, validate_no_implicit_any_1.default)({
408
224
  mode: config.noImplicitAnyMode,
409
225
  disableAllowed: config.noImplicitAnyDisableAllowed,
410
226
  ignoreModifiedUntilEpoch: config.noImplicitAnyIgnoreEpoch,
411
227
  }, workspaceRoot));
412
- results.push(await runValidateDtosExecutor({
228
+ results.push(await (0, validate_dtos_1.default)({
413
229
  mode: config.validateDtosMode,
414
230
  disableAllowed: config.validateDtosDisableAllowed,
415
231
  prismaSchemaPath: config.validateDtosPrismaPath,
416
232
  dtoSourcePaths: config.validateDtosSrcPaths,
417
233
  ignoreModifiedUntilEpoch: config.validateDtosIgnoreEpoch,
418
234
  }, workspaceRoot));
419
- results.push(await runPrismaConvertersExecutor({
235
+ results.push(await (0, validate_prisma_converters_1.default)({
420
236
  mode: config.prismaConverterMode,
421
237
  disableAllowed: config.prismaConverterDisableAllowed,
422
238
  schemaPath: config.prismaConverterSchemaPath,
@@ -424,22 +240,22 @@ async function runAllValidators(config: ParsedConfig, workspaceRoot: string): Pr
424
240
  enforcePaths: config.prismaConverterEnforcePaths,
425
241
  ignoreModifiedUntilEpoch: config.prismaConverterIgnoreEpoch,
426
242
  }, workspaceRoot));
427
- results.push(await runNoDestructureExecutor({
243
+ results.push(await (0, validate_no_destructure_1.default)({
428
244
  mode: config.noDestructureMode,
429
245
  disableAllowed: config.noDestructureDisableAllowed,
430
246
  ignoreModifiedUntilEpoch: config.noDestructureIgnoreEpoch,
431
247
  }, workspaceRoot));
432
- results.push(await runCatchErrorPatternExecutor({
248
+ results.push(await (0, validate_catch_error_pattern_1.default)({
433
249
  mode: config.catchErrorPatternMode,
434
250
  disableAllowed: config.catchErrorPatternDisableAllowed,
435
251
  ignoreModifiedUntilEpoch: config.catchErrorPatternIgnoreEpoch,
436
252
  }, workspaceRoot));
437
- results.push(await runNoUnmanagedExceptionsExecutor({
253
+ results.push(await (0, validate_no_unmanaged_exceptions_1.default)({
438
254
  mode: config.noUnmanagedExceptionsMode,
439
255
  disableAllowed: config.noUnmanagedExceptionsDisableAllowed,
440
256
  ignoreModifiedUntilEpoch: config.noUnmanagedExceptionsIgnoreEpoch,
441
257
  }, workspaceRoot));
442
- results.push(await runNoDirectApiResolverExecutor({
258
+ results.push(await (0, validate_no_direct_api_resolver_1.default)({
443
259
  mode: config.noDirectApiResolverMode,
444
260
  disableAllowed: config.noDirectApiResolverDisableAllowed,
445
261
  ignoreModifiedUntilEpoch: config.noDirectApiResolverIgnoreEpoch,
@@ -447,21 +263,16 @@ async function runAllValidators(config: ParsedConfig, workspaceRoot: string): Pr
447
263
  }, workspaceRoot));
448
264
  return results;
449
265
  }
450
-
451
- export default async function runValidator(
452
- _nxOptions: ValidateCodeOptions,
453
- workspaceRoot: string
454
- ): Promise<ExecutorResult> {
266
+ async function runValidator(_nxOptions, workspaceRoot) {
455
267
  // Config comes from webpieces.config.json at the workspace root,
456
268
  // loaded via the shared @webpieces/rules-config loader so ai-hooks and
457
269
  // this executor agree on every rule's enabled/mode/options.
458
- const shared = loadConfig(workspaceRoot);
270
+ const shared = (0, rules_config_1.loadConfig)(workspaceRoot);
459
271
  if (!shared.configPath) {
460
272
  console.error('\n❌ No webpieces.config.json found at workspace root (or any ancestor).\n');
461
273
  return { success: false };
462
274
  }
463
- const options = toValidateCodeOptions(shared);
464
-
275
+ const options = (0, from_shared_config_1.toValidateCodeOptions)(shared);
465
276
  const modeErrors = validateModes(options);
466
277
  if (modeErrors.length > 0) {
467
278
  console.error('');
@@ -471,21 +282,16 @@ export default async function runValidator(
471
282
  console.error('');
472
283
  return { success: false };
473
284
  }
474
-
475
285
  console.log(`\n📄 Loaded config: ${shared.configPath}`);
476
-
477
286
  const config = parseConfig(options);
478
-
479
287
  if (isAllOff(config)) {
480
288
  console.log('\n\u23ed\ufe0f Skipping all code validations (all modes: OFF)\n');
481
289
  return { success: true };
482
290
  }
483
-
484
291
  logConfig(config);
485
-
486
292
  const results = await runAllValidators(config, workspaceRoot);
487
293
  const allSuccess = results.every((r) => r.success);
488
-
489
294
  console.log(allSuccess ? '\n\u2705 All code validations passed\n' : '\n\u274c Some code validations failed\n');
490
295
  return { success: allSuccess };
491
296
  }
297
+ //# sourceMappingURL=validate-code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-code.js","sourceRoot":"","sources":["../../../../../packages/tooling/code-rules/src/validate-code.ts"],"names":[],"mappings":"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","sourcesContent":["import { loadConfig } from '@webpieces/rules-config';\nimport { toValidateCodeOptions } from './from-shared-config';\nimport runNewMethodsExecutor from './validate-new-methods';\nimport runModifiedMethodsExecutor from './validate-modified-methods';\nimport runModifiedFilesExecutor from './validate-modified-files';\nimport runReturnTypesExecutor, { ReturnTypeMode } from './validate-return-types';\nimport runNoInlineTypesExecutor, { NoInlineTypesMode } from './validate-no-inline-types';\nimport runNoAnyUnknownExecutor, { NoAnyUnknownMode } from './validate-no-any-unknown';\nimport runNoImplicitAnyExecutor, { NoImplicitAnyMode } from './validate-no-implicit-any';\nimport runValidateDtosExecutor, { ValidateDtosMode } from './validate-dtos';\nimport runPrismaConvertersExecutor, { PrismaConverterMode } from './validate-prisma-converters';\nimport runNoDestructureExecutor, { NoDestructureMode } from './validate-no-destructure';\nimport runCatchErrorPatternExecutor, { CatchErrorPatternMode } from './validate-catch-error-pattern';\nimport runNoUnmanagedExceptionsExecutor, { NoUnmanagedExceptionsMode } from './validate-no-unmanaged-exceptions';\nimport runNoDirectApiResolverExecutor, { NoDirectApiResolverMode } from './validate-no-direct-api-resolver';\n\nexport type MethodMaxLimitMode = 'OFF' | 'NEW_METHODS' | 'NEW_AND_MODIFIED_METHODS' | 'MODIFIED_FILES';\nexport type FileMaxLimitMode = 'OFF' | 'MODIFIED_FILES';\n\nexport interface MethodMaxLimitConfig {\n limit?: number;\n mode?: MethodMaxLimitMode;\n disableAllowed?: boolean;\n ignoreModifiedUntilEpoch?: number;\n}\n\nexport interface FileMaxLimitConfig {\n limit?: number;\n mode?: FileMaxLimitMode;\n disableAllowed?: boolean;\n ignoreModifiedUntilEpoch?: number;\n}\n\nexport interface RequireReturnTypeConfig {\n mode?: ReturnTypeMode;\n disableAllowed?: boolean;\n ignoreModifiedUntilEpoch?: number;\n}\n\nexport interface NoInlineTypeLiteralsConfig {\n mode?: NoInlineTypesMode;\n disableAllowed?: boolean;\n ignoreModifiedUntilEpoch?: number;\n}\n\nexport interface NoAnyUnknownConfig {\n mode?: NoAnyUnknownMode;\n disableAllowed?: boolean;\n ignoreModifiedUntilEpoch?: number;\n}\n\nexport interface NoImplicitAnyConfig {\n mode?: NoImplicitAnyMode;\n disableAllowed?: boolean;\n ignoreModifiedUntilEpoch?: number;\n}\n\nexport interface ValidateDtosConfig {\n mode?: ValidateDtosMode;\n disableAllowed?: boolean;\n prismaSchemaPath?: string;\n dtoSourcePaths?: string[];\n ignoreModifiedUntilEpoch?: number;\n}\n\nexport interface PrismaConverterConfig {\n mode?: PrismaConverterMode;\n disableAllowed?: boolean;\n schemaPath?: string;\n convertersPaths?: string[];\n enforcePaths?: string[];\n ignoreModifiedUntilEpoch?: number;\n}\n\nexport interface NoDestructureConfig {\n mode?: NoDestructureMode;\n disableAllowed?: boolean;\n ignoreModifiedUntilEpoch?: number;\n}\n\nexport interface CatchErrorPatternConfig {\n mode?: CatchErrorPatternMode;\n disableAllowed?: boolean;\n ignoreModifiedUntilEpoch?: number;\n}\n\nexport interface NoUnmanagedExceptionsConfig {\n mode?: NoUnmanagedExceptionsMode;\n disableAllowed?: boolean;\n ignoreModifiedUntilEpoch?: number;\n}\n\nexport interface NoDirectApiResolverConfig {\n mode?: NoDirectApiResolverMode;\n disableAllowed?: boolean;\n ignoreModifiedUntilEpoch?: number;\n enforcePaths?: string[];\n}\n\nexport interface ValidateCodeOptions {\n methodMaxLimit?: MethodMaxLimitConfig;\n fileMaxLimit?: FileMaxLimitConfig;\n requireReturnType?: RequireReturnTypeConfig;\n noInlineTypeLiterals?: NoInlineTypeLiteralsConfig;\n noAnyUnknown?: NoAnyUnknownConfig;\n noImplicitAny?: NoImplicitAnyConfig;\n validateDtos?: ValidateDtosConfig;\n prismaConverter?: PrismaConverterConfig;\n noDestructure?: NoDestructureConfig;\n catchErrorPattern?: CatchErrorPatternConfig;\n noUnmanagedExceptions?: NoUnmanagedExceptionsConfig;\n noDirectApiInResolver?: NoDirectApiResolverConfig;\n}\n\nexport interface ExecutorResult {\n success: boolean;\n}\n\ninterface OverrideInfo {\n active: boolean;\n normalMode: string;\n expiresDate: string;\n}\n\ninterface ParsedConfig {\n methodLimit: number;\n methodMode: MethodMaxLimitMode;\n methodDisableAllowed: boolean;\n methodOverride: OverrideInfo | undefined;\n fileLimit: number;\n fileMode: FileMaxLimitMode;\n fileDisableAllowed: boolean;\n fileOverride: OverrideInfo | undefined;\n returnTypeMode: ReturnTypeMode;\n returnTypeDisableAllowed: boolean;\n returnTypeIgnoreEpoch: number | undefined;\n noInlineTypesMode: NoInlineTypesMode;\n noInlineTypesDisableAllowed: boolean;\n noInlineTypesIgnoreEpoch: number | undefined;\n noAnyUnknownMode: NoAnyUnknownMode;\n noAnyUnknownDisableAllowed: boolean;\n noAnyUnknownIgnoreEpoch: number | undefined;\n noImplicitAnyMode: NoImplicitAnyMode;\n noImplicitAnyDisableAllowed: boolean;\n noImplicitAnyIgnoreEpoch: number | undefined;\n validateDtosMode: ValidateDtosMode;\n validateDtosDisableAllowed: boolean;\n validateDtosPrismaPath: string | undefined;\n validateDtosSrcPaths: string[];\n validateDtosIgnoreEpoch: number | undefined;\n prismaConverterMode: PrismaConverterMode;\n prismaConverterDisableAllowed: boolean;\n prismaConverterSchemaPath: string | undefined;\n prismaConverterConvertersPaths: string[];\n prismaConverterEnforcePaths: string[];\n prismaConverterIgnoreEpoch: number | undefined;\n noDestructureMode: NoDestructureMode;\n noDestructureDisableAllowed: boolean;\n noDestructureIgnoreEpoch: number | undefined;\n catchErrorPatternMode: CatchErrorPatternMode;\n catchErrorPatternDisableAllowed: boolean;\n catchErrorPatternIgnoreEpoch: number | undefined;\n noUnmanagedExceptionsMode: NoUnmanagedExceptionsMode;\n noUnmanagedExceptionsDisableAllowed: boolean;\n noUnmanagedExceptionsIgnoreEpoch: number | undefined;\n noDirectApiResolverMode: NoDirectApiResolverMode;\n noDirectApiResolverDisableAllowed: boolean;\n noDirectApiResolverIgnoreEpoch: number | undefined;\n noDirectApiResolverEnforcePaths: string[];\n}\n\ninterface ResolvedMethodMode {\n mode: MethodMaxLimitMode;\n override: OverrideInfo | undefined;\n}\n\ninterface ResolvedFileMode {\n mode: FileMaxLimitMode;\n override: OverrideInfo | undefined;\n}\n\nconst VALID_MODES: Record<string, string[]> = {\n methodMaxLimit: ['OFF', 'NEW_METHODS', 'NEW_AND_MODIFIED_METHODS', 'MODIFIED_FILES'],\n fileMaxLimit: ['OFF', 'MODIFIED_FILES'],\n requireReturnType: ['OFF', 'NEW_METHODS', 'NEW_AND_MODIFIED_METHODS', 'MODIFIED_FILES'],\n noInlineTypeLiterals: ['OFF', 'NEW_METHODS', 'NEW_AND_MODIFIED_METHODS', 'MODIFIED_FILES'],\n noAnyUnknown: ['OFF', 'MODIFIED_CODE', 'MODIFIED_FILES'],\n noImplicitAny: ['OFF', 'MODIFIED_CODE', 'MODIFIED_FILES'],\n validateDtos: ['OFF', 'MODIFIED_CLASS', 'MODIFIED_FILES'],\n prismaConverter: ['OFF', 'NEW_AND_MODIFIED_METHODS', 'MODIFIED_FILES'],\n noDestructure: ['OFF', 'MODIFIED_CODE', 'MODIFIED_FILES'],\n catchErrorPattern: ['OFF', 'MODIFIED_CODE', 'MODIFIED_FILES'],\n noUnmanagedExceptions: ['OFF', 'MODIFIED_CODE', 'MODIFIED_FILES'],\n noDirectApiInResolver: ['OFF', 'MODIFIED_CODE', 'NEW_AND_MODIFIED_METHODS', 'MODIFIED_FILES'],\n};\n\n/**\n * Validate that all configured modes are valid. Produces clear error messages naming the rule.\n */\nfunction validateModes(options: ValidateCodeOptions): string[] {\n const errors: string[] = [];\n\n type ModeEntry = [string, string | undefined];\n const modeEntries: ModeEntry[] = [\n ['methodMaxLimit', options.methodMaxLimit?.mode],\n ['fileMaxLimit', options.fileMaxLimit?.mode],\n ['requireReturnType', options.requireReturnType?.mode],\n ['noInlineTypeLiterals', options.noInlineTypeLiterals?.mode],\n ['noAnyUnknown', options.noAnyUnknown?.mode],\n ['noImplicitAny', options.noImplicitAny?.mode],\n ['validateDtos', options.validateDtos?.mode],\n ['prismaConverter', options.prismaConverter?.mode],\n ['noDestructure', options.noDestructure?.mode],\n ['catchErrorPattern', options.catchErrorPattern?.mode],\n ['noUnmanagedExceptions', options.noUnmanagedExceptions?.mode],\n ['noDirectApiInResolver', options.noDirectApiInResolver?.mode],\n ];\n\n for (const entry of modeEntries) {\n const ruleName = entry[0];\n const modeValue = entry[1];\n if (modeValue === undefined) continue;\n const validModes = VALID_MODES[ruleName];\n if (!validModes.includes(modeValue)) {\n errors.push(`${ruleName}.mode = '${modeValue}' is invalid. Valid modes: ${validModes.join(', ')}`);\n }\n }\n\n return errors;\n}\n\nfunction formatEpochDate(epoch: number): string {\n return new Date(epoch * 1000).toISOString().split('T')[0];\n}\n\nfunction resolveMethodMode(\n normalMode: MethodMaxLimitMode, epoch: number | undefined\n): ResolvedMethodMode {\n if (epoch === undefined) {\n return { mode: normalMode, override: undefined };\n }\n const nowSeconds = Date.now() / 1000;\n if (nowSeconds < epoch) {\n // Active: downgrade to skip modified checking\n const downgraded: MethodMaxLimitMode =\n normalMode === 'OFF' ? 'OFF' : 'NEW_METHODS';\n return {\n mode: downgraded,\n override: { active: true, normalMode, expiresDate: formatEpochDate(epoch) },\n };\n }\n // Expired\n return { mode: normalMode, override: undefined };\n}\n\nfunction resolveFileMode(\n normalMode: FileMaxLimitMode, epoch: number | undefined\n): ResolvedFileMode {\n if (epoch === undefined) {\n return { mode: normalMode, override: undefined };\n }\n const nowSeconds = Date.now() / 1000;\n if (nowSeconds < epoch) {\n // Active: file checking is inherently about modified files, so skip entirely\n return {\n mode: 'OFF',\n override: { active: true, normalMode, expiresDate: formatEpochDate(epoch) },\n };\n }\n // Expired\n return { mode: normalMode, override: undefined };\n}\n\nfunction parseConfig(options: ValidateCodeOptions): ParsedConfig {\n const methodConfig: MethodMaxLimitConfig = options.methodMaxLimit ?? {};\n const fileConfig: FileMaxLimitConfig = options.fileMaxLimit ?? {};\n\n const normalMethodMode = methodConfig.mode ?? 'NEW_AND_MODIFIED_METHODS';\n const normalFileMode = fileConfig.mode ?? 'MODIFIED_FILES';\n\n const methodResolved = resolveMethodMode(normalMethodMode, methodConfig.ignoreModifiedUntilEpoch);\n const fileResolved = resolveFileMode(normalFileMode, fileConfig.ignoreModifiedUntilEpoch);\n\n return {\n methodLimit: methodConfig.limit ?? 80,\n methodMode: methodResolved.mode,\n methodDisableAllowed: methodConfig.disableAllowed ?? true,\n methodOverride: methodResolved.override,\n fileLimit: fileConfig.limit ?? 900,\n fileMode: fileResolved.mode,\n fileDisableAllowed: fileConfig.disableAllowed ?? true,\n fileOverride: fileResolved.override,\n returnTypeMode: options.requireReturnType?.mode ?? 'OFF',\n returnTypeDisableAllowed: options.requireReturnType?.disableAllowed ?? true,\n returnTypeIgnoreEpoch: options.requireReturnType?.ignoreModifiedUntilEpoch,\n noInlineTypesMode: options.noInlineTypeLiterals?.mode ?? 'OFF',\n noInlineTypesDisableAllowed: options.noInlineTypeLiterals?.disableAllowed ?? true,\n noInlineTypesIgnoreEpoch: options.noInlineTypeLiterals?.ignoreModifiedUntilEpoch,\n noAnyUnknownMode: options.noAnyUnknown?.mode ?? 'OFF',\n noAnyUnknownDisableAllowed: options.noAnyUnknown?.disableAllowed ?? true,\n noAnyUnknownIgnoreEpoch: options.noAnyUnknown?.ignoreModifiedUntilEpoch,\n noImplicitAnyMode: options.noImplicitAny?.mode ?? 'OFF',\n noImplicitAnyDisableAllowed: options.noImplicitAny?.disableAllowed ?? true,\n noImplicitAnyIgnoreEpoch: options.noImplicitAny?.ignoreModifiedUntilEpoch,\n validateDtosMode: options.validateDtos?.mode ?? 'OFF',\n validateDtosDisableAllowed: options.validateDtos?.disableAllowed ?? true,\n validateDtosPrismaPath: options.validateDtos?.prismaSchemaPath,\n validateDtosSrcPaths: options.validateDtos?.dtoSourcePaths ?? [],\n validateDtosIgnoreEpoch: options.validateDtos?.ignoreModifiedUntilEpoch,\n prismaConverterMode: options.prismaConverter?.mode ?? 'OFF',\n prismaConverterDisableAllowed: options.prismaConverter?.disableAllowed ?? true,\n prismaConverterSchemaPath: options.prismaConverter?.schemaPath,\n prismaConverterConvertersPaths: options.prismaConverter?.convertersPaths ?? [],\n prismaConverterEnforcePaths: options.prismaConverter?.enforcePaths ?? [],\n prismaConverterIgnoreEpoch: options.prismaConverter?.ignoreModifiedUntilEpoch,\n noDestructureMode: options.noDestructure?.mode ?? 'OFF',\n noDestructureDisableAllowed: options.noDestructure?.disableAllowed ?? true,\n noDestructureIgnoreEpoch: options.noDestructure?.ignoreModifiedUntilEpoch,\n catchErrorPatternMode: options.catchErrorPattern?.mode ?? 'OFF',\n catchErrorPatternDisableAllowed: options.catchErrorPattern?.disableAllowed ?? true,\n catchErrorPatternIgnoreEpoch: options.catchErrorPattern?.ignoreModifiedUntilEpoch,\n noUnmanagedExceptionsMode: options.noUnmanagedExceptions?.mode ?? 'OFF',\n noUnmanagedExceptionsDisableAllowed: options.noUnmanagedExceptions?.disableAllowed ?? true,\n noUnmanagedExceptionsIgnoreEpoch: options.noUnmanagedExceptions?.ignoreModifiedUntilEpoch,\n noDirectApiResolverMode: options.noDirectApiInResolver?.mode ?? 'OFF',\n noDirectApiResolverDisableAllowed: options.noDirectApiInResolver?.disableAllowed ?? true,\n noDirectApiResolverIgnoreEpoch: options.noDirectApiInResolver?.ignoreModifiedUntilEpoch,\n noDirectApiResolverEnforcePaths: options.noDirectApiInResolver?.enforcePaths ?? [],\n };\n}\n\nfunction formatOverride(override: OverrideInfo | undefined): string {\n if (!override) {\n return '';\n }\n return ` (override active, normal: ${override.normalMode}, expires: ${override.expiresDate})`;\n}\n\nfunction logConfig(config: ParsedConfig): void {\n console.log('\\n\\ud83d\\udccf Running Code Validations\\n');\n console.log(` Method limits: mode=${config.methodMode}${formatOverride(config.methodOverride)}, limit=${config.methodLimit}, disableAllowed=${config.methodDisableAllowed}`);\n console.log(` File limits: mode=${config.fileMode}${formatOverride(config.fileOverride)}, limit=${config.fileLimit}, disableAllowed=${config.fileDisableAllowed}`);\n console.log(` Require return types: mode=${config.returnTypeMode}, disableAllowed=${config.returnTypeDisableAllowed}`);\n console.log(` No inline type literals: mode=${config.noInlineTypesMode}, disableAllowed=${config.noInlineTypesDisableAllowed}`);\n console.log(` No any/unknown: mode=${config.noAnyUnknownMode}, disableAllowed=${config.noAnyUnknownDisableAllowed}`);\n console.log(` No implicit any: mode=${config.noImplicitAnyMode}, disableAllowed=${config.noImplicitAnyDisableAllowed}`);\n console.log(` Validate DTOs: mode=${config.validateDtosMode}, disableAllowed=${config.validateDtosDisableAllowed}`);\n console.log(` Prisma converters: mode=${config.prismaConverterMode}, disableAllowed=${config.prismaConverterDisableAllowed}`);\n console.log(` No destructure: mode=${config.noDestructureMode}, disableAllowed=${config.noDestructureDisableAllowed}`);\n console.log(` Catch error pattern: mode=${config.catchErrorPatternMode}, disableAllowed=${config.catchErrorPatternDisableAllowed}`);\n console.log(` No unmanaged exceptions: mode=${config.noUnmanagedExceptionsMode}, disableAllowed=${config.noUnmanagedExceptionsDisableAllowed}`);\n console.log(` No direct API in resolver: mode=${config.noDirectApiResolverMode}, disableAllowed=${config.noDirectApiResolverDisableAllowed}`);\n console.log('');\n}\n\nfunction isAllOff(config: ParsedConfig): boolean {\n return config.methodMode === 'OFF' && config.fileMode === 'OFF' &&\n config.returnTypeMode === 'OFF' && config.noInlineTypesMode === 'OFF' &&\n config.noAnyUnknownMode === 'OFF' && config.noImplicitAnyMode === 'OFF' &&\n config.validateDtosMode === 'OFF' &&\n config.prismaConverterMode === 'OFF' && config.noDestructureMode === 'OFF' &&\n config.catchErrorPatternMode === 'OFF' && config.noUnmanagedExceptionsMode === 'OFF' &&\n config.noDirectApiResolverMode === 'OFF';\n}\n\nasync function runMethodValidators(config: ParsedConfig, workspaceRoot: string): Promise<ExecutorResult[]> {\n const results: ExecutorResult[] = [];\n const runNew = config.methodMode === 'NEW_METHODS' || config.methodMode === 'NEW_AND_MODIFIED_METHODS';\n const runModified = config.methodMode === 'NEW_AND_MODIFIED_METHODS' || config.methodMode === 'MODIFIED_FILES';\n\n if (runNew) {\n results.push(await runNewMethodsExecutor({\n limit: config.methodLimit,\n mode: config.methodMode, disableAllowed: config.methodDisableAllowed,\n }, workspaceRoot));\n }\n if (runModified) {\n results.push(await runModifiedMethodsExecutor({\n limit: config.methodLimit, mode: config.methodMode, disableAllowed: config.methodDisableAllowed,\n }, workspaceRoot));\n }\n return results;\n}\n\nasync function runAllValidators(config: ParsedConfig, workspaceRoot: string): Promise<ExecutorResult[]> {\n const results: ExecutorResult[] = [];\n const methodResults = await runMethodValidators(config, workspaceRoot);\n results.push(...methodResults);\n results.push(await runModifiedFilesExecutor({\n limit: config.fileLimit, mode: config.fileMode, disableAllowed: config.fileDisableAllowed,\n }, workspaceRoot));\n results.push(await runReturnTypesExecutor({\n mode: config.returnTypeMode,\n disableAllowed: config.returnTypeDisableAllowed,\n ignoreModifiedUntilEpoch: config.returnTypeIgnoreEpoch,\n }, workspaceRoot));\n results.push(await runNoInlineTypesExecutor({\n mode: config.noInlineTypesMode,\n disableAllowed: config.noInlineTypesDisableAllowed,\n ignoreModifiedUntilEpoch: config.noInlineTypesIgnoreEpoch,\n }, workspaceRoot));\n results.push(await runNoAnyUnknownExecutor({\n mode: config.noAnyUnknownMode,\n disableAllowed: config.noAnyUnknownDisableAllowed,\n ignoreModifiedUntilEpoch: config.noAnyUnknownIgnoreEpoch,\n }, workspaceRoot));\n results.push(await runNoImplicitAnyExecutor({\n mode: config.noImplicitAnyMode,\n disableAllowed: config.noImplicitAnyDisableAllowed,\n ignoreModifiedUntilEpoch: config.noImplicitAnyIgnoreEpoch,\n }, workspaceRoot));\n results.push(await runValidateDtosExecutor({\n mode: config.validateDtosMode,\n disableAllowed: config.validateDtosDisableAllowed,\n prismaSchemaPath: config.validateDtosPrismaPath,\n dtoSourcePaths: config.validateDtosSrcPaths,\n ignoreModifiedUntilEpoch: config.validateDtosIgnoreEpoch,\n }, workspaceRoot));\n results.push(await runPrismaConvertersExecutor({\n mode: config.prismaConverterMode,\n disableAllowed: config.prismaConverterDisableAllowed,\n schemaPath: config.prismaConverterSchemaPath,\n convertersPaths: config.prismaConverterConvertersPaths,\n enforcePaths: config.prismaConverterEnforcePaths,\n ignoreModifiedUntilEpoch: config.prismaConverterIgnoreEpoch,\n }, workspaceRoot));\n results.push(await runNoDestructureExecutor({\n mode: config.noDestructureMode,\n disableAllowed: config.noDestructureDisableAllowed,\n ignoreModifiedUntilEpoch: config.noDestructureIgnoreEpoch,\n }, workspaceRoot));\n results.push(await runCatchErrorPatternExecutor({\n mode: config.catchErrorPatternMode,\n disableAllowed: config.catchErrorPatternDisableAllowed,\n ignoreModifiedUntilEpoch: config.catchErrorPatternIgnoreEpoch,\n }, workspaceRoot));\n results.push(await runNoUnmanagedExceptionsExecutor({\n mode: config.noUnmanagedExceptionsMode,\n disableAllowed: config.noUnmanagedExceptionsDisableAllowed,\n ignoreModifiedUntilEpoch: config.noUnmanagedExceptionsIgnoreEpoch,\n }, workspaceRoot));\n results.push(await runNoDirectApiResolverExecutor({\n mode: config.noDirectApiResolverMode,\n disableAllowed: config.noDirectApiResolverDisableAllowed,\n ignoreModifiedUntilEpoch: config.noDirectApiResolverIgnoreEpoch,\n enforcePaths: config.noDirectApiResolverEnforcePaths,\n }, workspaceRoot));\n return results;\n}\n\nexport default async function runValidator(\n _nxOptions: ValidateCodeOptions,\n workspaceRoot: string\n): Promise<ExecutorResult> {\n // Config comes from webpieces.config.json at the workspace root,\n // loaded via the shared @webpieces/rules-config loader so ai-hooks and\n // this executor agree on every rule's enabled/mode/options.\n const shared = loadConfig(workspaceRoot);\n if (!shared.configPath) {\n console.error('\\n❌ No webpieces.config.json found at workspace root (or any ancestor).\\n');\n return { success: false };\n }\n const options = toValidateCodeOptions(shared);\n\n const modeErrors = validateModes(options);\n if (modeErrors.length > 0) {\n console.error('');\n for (const err of modeErrors) {\n console.error(`❌ ${err}`);\n }\n console.error('');\n return { success: false };\n }\n\n console.log(`\\n📄 Loaded config: ${shared.configPath}`);\n\n const config = parseConfig(options);\n\n if (isAllOff(config)) {\n console.log('\\n\\u23ed\\ufe0f Skipping all code validations (all modes: OFF)\\n');\n return { success: true };\n }\n\n logConfig(config);\n\n const results = await runAllValidators(config, workspaceRoot);\n const allSuccess = results.every((r) => r.success);\n\n console.log(allSuccess ? '\\n\\u2705 All code validations passed\\n' : '\\n\\u274c Some code validations failed\\n');\n return { success: allSuccess };\n}\n"]}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Validate DTOs Executor
3
+ *
4
+ * Validates that every non-deprecated field in a XxxDto class/interface exists
5
+ * in the corresponding XxxDbo Prisma model. This catches AI agents inventing
6
+ * field names that don't match the database schema.
7
+ *
8
+ * ============================================================================
9
+ * MODES
10
+ * ============================================================================
11
+ * - OFF: Skip validation entirely
12
+ * - MODIFIED_CLASS: Only validate Dto classes that have changed lines in the diff
13
+ * - MODIFIED_FILES: Validate ALL Dto classes in files that were modified
14
+ *
15
+ * ============================================================================
16
+ * SKIP CONDITIONS
17
+ * ============================================================================
18
+ * - If schema.prisma itself is modified, validation is skipped (schema in flux)
19
+ * - Dto classes ending with "JoinDto" are skipped (they compose other Dtos)
20
+ * - Fields marked @deprecated in a comment are exempt
21
+ *
22
+ * ============================================================================
23
+ * MATCHING
24
+ * ============================================================================
25
+ * - UserDto matches UserDbo by case-insensitive prefix ("user")
26
+ * - Dbo field names are converted from snake_case to camelCase for comparison
27
+ * - Dto fields must be a subset of Dbo fields
28
+ * - Extra Dbo fields are allowed (e.g., password)
29
+ */
30
+ export type ValidateDtosMode = 'OFF' | 'MODIFIED_CLASS' | 'MODIFIED_FILES';
31
+ export interface ValidateDtosOptions {
32
+ mode?: ValidateDtosMode;
33
+ disableAllowed?: boolean;
34
+ prismaSchemaPath?: string;
35
+ dtoSourcePaths?: string[];
36
+ ignoreModifiedUntilEpoch?: number;
37
+ }
38
+ export interface ExecutorResult {
39
+ success: boolean;
40
+ }
41
+ export default function runValidator(options: ValidateDtosOptions, workspaceRoot: string): Promise<ExecutorResult>;