@webpieces/code-rules 0.3.185 → 0.3.186

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 (62) hide show
  1. package/package.json +2 -2
  2. package/src/cli.js +1 -8
  3. package/src/cli.js.map +1 -1
  4. package/src/code-validator.d.ts +18 -0
  5. package/src/code-validator.js +16 -0
  6. package/src/code-validator.js.map +1 -0
  7. package/src/index.d.ts +15 -13
  8. package/src/index.js +21 -16
  9. package/src/index.js.map +1 -1
  10. package/src/validate-catch-error-pattern.d.ts +5 -10
  11. package/src/validate-catch-error-pattern.js +12 -2
  12. package/src/validate-catch-error-pattern.js.map +1 -1
  13. package/src/validate-code.d.ts +11 -5
  14. package/src/validate-code.js +54 -257
  15. package/src/validate-code.js.map +1 -1
  16. package/src/validate-dtos.d.ts +5 -12
  17. package/src/validate-dtos.js +12 -2
  18. package/src/validate-dtos.js.map +1 -1
  19. package/src/validate-modified-files.d.ts +5 -11
  20. package/src/validate-modified-files.js +12 -2
  21. package/src/validate-modified-files.js.map +1 -1
  22. package/src/validate-modified-methods.d.ts +16 -11
  23. package/src/validate-modified-methods.js +34 -2
  24. package/src/validate-modified-methods.js.map +1 -1
  25. package/src/validate-new-methods.d.ts +3 -12
  26. package/src/validate-new-methods.js +2 -2
  27. package/src/validate-new-methods.js.map +1 -1
  28. package/src/validate-no-any-unknown.d.ts +5 -10
  29. package/src/validate-no-any-unknown.js +12 -2
  30. package/src/validate-no-any-unknown.js.map +1 -1
  31. package/src/validate-no-destructure.d.ts +5 -10
  32. package/src/validate-no-destructure.js +12 -2
  33. package/src/validate-no-destructure.js.map +1 -1
  34. package/src/validate-no-direct-api-resolver.d.ts +5 -11
  35. package/src/validate-no-direct-api-resolver.js +12 -2
  36. package/src/validate-no-direct-api-resolver.js.map +1 -1
  37. package/src/validate-no-implicit-any.d.ts +5 -10
  38. package/src/validate-no-implicit-any.js +12 -2
  39. package/src/validate-no-implicit-any.js.map +1 -1
  40. package/src/validate-no-inline-types.d.ts +5 -10
  41. package/src/validate-no-inline-types.js +12 -2
  42. package/src/validate-no-inline-types.js.map +1 -1
  43. package/src/validate-no-symbol-di-tokens.d.ts +6 -12
  44. package/src/validate-no-symbol-di-tokens.js +12 -2
  45. package/src/validate-no-symbol-di-tokens.js.map +1 -1
  46. package/src/validate-no-unmanaged-exceptions.d.ts +5 -10
  47. package/src/validate-no-unmanaged-exceptions.js +12 -2
  48. package/src/validate-no-unmanaged-exceptions.js.map +1 -1
  49. package/src/validate-prisma-converters.d.ts +5 -13
  50. package/src/validate-prisma-converters.js +12 -2
  51. package/src/validate-prisma-converters.js.map +1 -1
  52. package/src/validate-return-types.d.ts +5 -10
  53. package/src/validate-return-types.js +12 -2
  54. package/src/validate-return-types.js.map +1 -1
  55. package/src/wp-ci.js +1 -3
  56. package/src/wp-ci.js.map +1 -1
  57. package/src/from-shared-config.d.ts +0 -26
  58. package/src/from-shared-config.js +0 -44
  59. package/src/from-shared-config.js.map +0 -1
  60. package/src/validate-code-options.d.ts +0 -127
  61. package/src/validate-code-options.js +0 -14
  62. package/src/validate-code-options.js.map +0 -1
@@ -1,277 +1,74 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.default = runValidator;
4
- const tslib_1 = require("tslib");
5
4
  const rules_config_1 = require("@webpieces/rules-config");
6
- const from_shared_config_1 = require("./from-shared-config");
7
- const resolve_mode_1 = require("./resolve-mode");
8
- const validate_new_methods_1 = tslib_1.__importDefault(require("./validate-new-methods"));
9
- const validate_modified_methods_1 = tslib_1.__importDefault(require("./validate-modified-methods"));
10
- const validate_modified_files_1 = tslib_1.__importDefault(require("./validate-modified-files"));
11
- const validate_return_types_1 = tslib_1.__importDefault(require("./validate-return-types"));
12
- const validate_no_inline_types_1 = tslib_1.__importDefault(require("./validate-no-inline-types"));
13
- const validate_no_any_unknown_1 = tslib_1.__importDefault(require("./validate-no-any-unknown"));
14
- const validate_no_implicit_any_1 = tslib_1.__importDefault(require("./validate-no-implicit-any"));
15
- const validate_dtos_1 = tslib_1.__importDefault(require("./validate-dtos"));
16
- const validate_prisma_converters_1 = tslib_1.__importDefault(require("./validate-prisma-converters"));
17
- const validate_no_destructure_1 = tslib_1.__importDefault(require("./validate-no-destructure"));
18
- const validate_catch_error_pattern_1 = tslib_1.__importDefault(require("./validate-catch-error-pattern"));
19
- const validate_no_unmanaged_exceptions_1 = tslib_1.__importDefault(require("./validate-no-unmanaged-exceptions"));
20
- const validate_no_direct_api_resolver_1 = tslib_1.__importDefault(require("./validate-no-direct-api-resolver"));
21
- const validate_no_symbol_di_tokens_1 = tslib_1.__importDefault(require("./validate-no-symbol-di-tokens"));
22
- const VALID_MODES = {
23
- methodMaxLimit: ['OFF', 'NEW_METHODS', 'NEW_AND_MODIFIED_METHODS', 'MODIFIED_FILES'],
24
- fileMaxLimit: ['OFF', 'MODIFIED_FILES'],
25
- requireReturnType: ['OFF', 'NEW_METHODS', 'NEW_AND_MODIFIED_METHODS', 'MODIFIED_FILES'],
26
- noInlineTypeLiterals: ['OFF', 'NEW_METHODS', 'NEW_AND_MODIFIED_METHODS', 'MODIFIED_FILES'],
27
- noAnyUnknown: ['OFF', 'MODIFIED_CODE', 'MODIFIED_FILES'],
28
- noImplicitAny: ['OFF', 'MODIFIED_CODE', 'MODIFIED_FILES'],
29
- validateDtos: ['OFF', 'MODIFIED_CLASS', 'MODIFIED_FILES'],
30
- prismaConverter: ['OFF', 'NEW_AND_MODIFIED_METHODS', 'MODIFIED_FILES'],
31
- noDestructure: ['OFF', 'MODIFIED_CODE', 'MODIFIED_FILES'],
32
- catchErrorPattern: ['OFF', 'MODIFIED_CODE', 'MODIFIED_FILES'],
33
- noUnmanagedExceptions: ['OFF', 'MODIFIED_CODE', 'MODIFIED_FILES'],
34
- noDirectApiInResolver: ['OFF', 'MODIFIED_CODE', 'NEW_AND_MODIFIED_METHODS', 'MODIFIED_FILES'],
35
- noSymbolDiTokens: ['OFF', 'MODIFIED_CODE', 'MODIFIED_FILES'],
36
- };
5
+ const validate_modified_methods_1 = require("./validate-modified-methods");
6
+ const validate_modified_files_1 = require("./validate-modified-files");
7
+ const validate_return_types_1 = require("./validate-return-types");
8
+ const validate_no_inline_types_1 = require("./validate-no-inline-types");
9
+ const validate_no_any_unknown_1 = require("./validate-no-any-unknown");
10
+ const validate_no_implicit_any_1 = require("./validate-no-implicit-any");
11
+ const validate_dtos_1 = require("./validate-dtos");
12
+ const validate_prisma_converters_1 = require("./validate-prisma-converters");
13
+ const validate_no_destructure_1 = require("./validate-no-destructure");
14
+ const validate_catch_error_pattern_1 = require("./validate-catch-error-pattern");
15
+ const validate_no_unmanaged_exceptions_1 = require("./validate-no-unmanaged-exceptions");
16
+ const validate_no_direct_api_resolver_1 = require("./validate-no-direct-api-resolver");
17
+ const validate_no_symbol_di_tokens_1 = require("./validate-no-symbol-di-tokens");
37
18
  /**
38
- * Validate that all configured modes are valid. Produces clear error messages naming the rule.
19
+ * Build every code validator from the typed WebpiecesRulesConfig. Each validator is
20
+ * constructed with its own `*Config` (the genuinely-consumed config class), so the
21
+ * config types are exercised at compile time. Missing rule keys fall back to an empty
22
+ * config instance — `loadWebpiecesRulesConfig` already validates that configured rules
23
+ * carry an explicit `mode`, so in practice every key is present.
39
24
  */
40
- function validateModes(options) {
41
- const errors = [];
42
- const modeEntries = [
43
- ['methodMaxLimit', options.methodMaxLimit?.mode],
44
- ['fileMaxLimit', options.fileMaxLimit?.mode],
45
- ['requireReturnType', options.requireReturnType?.mode],
46
- ['noInlineTypeLiterals', options.noInlineTypeLiterals?.mode],
47
- ['noAnyUnknown', options.noAnyUnknown?.mode],
48
- ['noImplicitAny', options.noImplicitAny?.mode],
49
- ['validateDtos', options.validateDtos?.mode],
50
- ['prismaConverter', options.prismaConverter?.mode],
51
- ['noDestructure', options.noDestructure?.mode],
52
- ['catchErrorPattern', options.catchErrorPattern?.mode],
53
- ['noUnmanagedExceptions', options.noUnmanagedExceptions?.mode],
54
- ['noDirectApiInResolver', options.noDirectApiInResolver?.mode],
55
- ['noSymbolDiTokens', options.noSymbolDiTokens?.mode],
25
+ function buildValidators(config) {
26
+ return [
27
+ new validate_modified_methods_1.MaxMethodLinesValidator(config['max-method-lines'] ?? new rules_config_1.MaxMethodLinesConfig()),
28
+ new validate_modified_files_1.MaxFileLinesValidator(config['max-file-lines'] ?? new rules_config_1.MaxFileLinesConfig()),
29
+ new validate_return_types_1.RequireReturnTypeValidator(config['require-return-type'] ?? new rules_config_1.RequireReturnTypeConfig()),
30
+ new validate_no_inline_types_1.NoInlineTypeLiteralsValidator(config['no-inline-type-literals'] ?? new rules_config_1.NoInlineTypeLiteralsConfig()),
31
+ new validate_no_any_unknown_1.NoAnyUnknownValidator(config['no-any-unknown'] ?? new rules_config_1.NoAnyUnknownConfig()),
32
+ new validate_no_implicit_any_1.NoImplicitAnyValidator(config['no-implicit-any'] ?? new rules_config_1.NoImplicitAnyConfig()),
33
+ new validate_dtos_1.PrismaValidateDtosValidator(config['prisma-validate-dtos'] ?? new rules_config_1.PrismaValidateDtosConfig()),
34
+ new validate_prisma_converters_1.PrismaConverterValidator(config['prisma-converter'] ?? new rules_config_1.PrismaConverterConfig()),
35
+ new validate_no_destructure_1.NoDestructureValidator(config['no-destructure'] ?? new rules_config_1.NoDestructureConfig()),
36
+ new validate_catch_error_pattern_1.CatchErrorPatternValidator(config['catch-error-pattern'] ?? new rules_config_1.CatchErrorPatternConfig()),
37
+ new validate_no_unmanaged_exceptions_1.NoUnmanagedExceptionsValidator(config['no-unmanaged-exceptions'] ?? new rules_config_1.NoUnmanagedExceptionsConfig()),
38
+ new validate_no_direct_api_resolver_1.NoDirectApiResolverValidator(config['angular-no-direct-api-in-resolver'] ?? new rules_config_1.AngularNoDirectApiInResolverConfig()),
39
+ new validate_no_symbol_di_tokens_1.NoSymbolDiTokensValidator(config['no-symbol-di-tokens'] ?? new rules_config_1.NoSymbolDiTokensConfig()),
56
40
  ];
57
- for (const entry of modeEntries) {
58
- const ruleName = entry[0];
59
- const modeValue = entry[1];
60
- if (modeValue === undefined)
61
- continue;
62
- const validModes = VALID_MODES[ruleName];
63
- if (!validModes.includes(modeValue)) {
64
- errors.push(`${ruleName}.mode = '${modeValue}' is invalid. Valid modes: ${validModes.join(', ')}`);
65
- }
66
- }
67
- return errors;
68
- }
69
- function resolveMethodMode(normalMode, epoch, branchPattern) {
70
- if (normalMode === 'OFF') {
71
- return { mode: 'OFF', override: undefined };
72
- }
73
- const skip = (0, resolve_mode_1.shouldSkipRule)(epoch, branchPattern);
74
- if (skip.skip) {
75
- return {
76
- mode: 'OFF',
77
- override: { active: true, normalMode, reason: skip.reason },
78
- };
79
- }
80
- return { mode: normalMode, override: undefined };
81
- }
82
- function resolveFileMode(normalMode, epoch, branchPattern) {
83
- if (normalMode === 'OFF') {
84
- return { mode: 'OFF', override: undefined };
85
- }
86
- const skip = (0, resolve_mode_1.shouldSkipRule)(epoch, branchPattern);
87
- if (skip.skip) {
88
- return {
89
- mode: 'OFF',
90
- override: { active: true, normalMode, reason: skip.reason },
91
- };
92
- }
93
- return { mode: normalMode, override: undefined };
94
41
  }
95
- function parseConfig(options) {
96
- const methodConfig = options.methodMaxLimit ?? {};
97
- const fileConfig = options.fileMaxLimit ?? {};
98
- const normalMethodMode = methodConfig.mode ?? 'NEW_AND_MODIFIED_METHODS';
99
- const normalFileMode = fileConfig.mode ?? 'MODIFIED_FILES';
100
- const methodResolved = resolveMethodMode(normalMethodMode, methodConfig.ignoreModifiedUntilEpoch, methodConfig.ignoreRuleWhileOnBranch);
101
- const fileResolved = resolveFileMode(normalFileMode, fileConfig.ignoreModifiedUntilEpoch, fileConfig.ignoreRuleWhileOnBranch);
102
- return {
103
- methodLimit: methodConfig.limit ?? 80,
104
- methodMode: methodResolved.mode,
105
- methodDisableAllowed: methodConfig.disableAllowed ?? true,
106
- methodOverride: methodResolved.override,
107
- fileLimit: fileConfig.limit ?? 900,
108
- fileMode: fileResolved.mode,
109
- fileDisableAllowed: fileConfig.disableAllowed ?? true,
110
- fileOverride: fileResolved.override,
111
- returnTypeMode: options.requireReturnType?.mode ?? 'OFF',
112
- returnTypeDisableAllowed: options.requireReturnType?.disableAllowed ?? true,
113
- returnTypeIgnoreEpoch: options.requireReturnType?.ignoreModifiedUntilEpoch,
114
- returnTypeIgnoreBranch: options.requireReturnType?.ignoreRuleWhileOnBranch,
115
- noInlineTypesMode: options.noInlineTypeLiterals?.mode ?? 'OFF',
116
- noInlineTypesDisableAllowed: options.noInlineTypeLiterals?.disableAllowed ?? true,
117
- noInlineTypesIgnoreEpoch: options.noInlineTypeLiterals?.ignoreModifiedUntilEpoch,
118
- noInlineTypesIgnoreBranch: options.noInlineTypeLiterals?.ignoreRuleWhileOnBranch,
119
- noAnyUnknownMode: options.noAnyUnknown?.mode ?? 'OFF',
120
- noAnyUnknownDisableAllowed: options.noAnyUnknown?.disableAllowed ?? true,
121
- noAnyUnknownIgnoreEpoch: options.noAnyUnknown?.ignoreModifiedUntilEpoch,
122
- noAnyUnknownIgnoreBranch: options.noAnyUnknown?.ignoreRuleWhileOnBranch,
123
- noImplicitAnyMode: options.noImplicitAny?.mode ?? 'OFF',
124
- noImplicitAnyDisableAllowed: options.noImplicitAny?.disableAllowed ?? true,
125
- noImplicitAnyIgnoreEpoch: options.noImplicitAny?.ignoreModifiedUntilEpoch,
126
- noImplicitAnyIgnoreBranch: options.noImplicitAny?.ignoreRuleWhileOnBranch,
127
- validateDtosMode: options.validateDtos?.mode ?? 'OFF',
128
- validateDtosDisableAllowed: options.validateDtos?.disableAllowed ?? true,
129
- validateDtosPrismaPath: options.validateDtos?.prismaSchemaPath,
130
- validateDtosSrcPaths: options.validateDtos?.dtoSourcePaths ?? [],
131
- validateDtosIgnoreEpoch: options.validateDtos?.ignoreModifiedUntilEpoch,
132
- validateDtosIgnoreBranch: options.validateDtos?.ignoreRuleWhileOnBranch,
133
- prismaConverterMode: options.prismaConverter?.mode ?? 'OFF',
134
- prismaConverterDisableAllowed: options.prismaConverter?.disableAllowed ?? true,
135
- prismaConverterSchemaPath: options.prismaConverter?.schemaPath,
136
- prismaConverterConvertersPaths: options.prismaConverter?.convertersPaths ?? [],
137
- prismaConverterEnforcePaths: options.prismaConverter?.enforcePaths ?? [],
138
- prismaConverterIgnoreEpoch: options.prismaConverter?.ignoreModifiedUntilEpoch,
139
- prismaConverterIgnoreBranch: options.prismaConverter?.ignoreRuleWhileOnBranch,
140
- noDestructureMode: options.noDestructure?.mode ?? 'OFF',
141
- noDestructureDisableAllowed: options.noDestructure?.disableAllowed ?? true,
142
- noDestructureIgnoreEpoch: options.noDestructure?.ignoreModifiedUntilEpoch,
143
- noDestructureIgnoreBranch: options.noDestructure?.ignoreRuleWhileOnBranch,
144
- catchErrorPatternMode: options.catchErrorPattern?.mode ?? 'OFF',
145
- catchErrorPatternDisableAllowed: options.catchErrorPattern?.disableAllowed ?? true,
146
- catchErrorPatternIgnoreEpoch: options.catchErrorPattern?.ignoreModifiedUntilEpoch,
147
- catchErrorPatternIgnoreBranch: options.catchErrorPattern?.ignoreRuleWhileOnBranch,
148
- noUnmanagedExceptionsMode: options.noUnmanagedExceptions?.mode ?? 'OFF',
149
- noUnmanagedExceptionsDisableAllowed: options.noUnmanagedExceptions?.disableAllowed ?? true,
150
- noUnmanagedExceptionsIgnoreEpoch: options.noUnmanagedExceptions?.ignoreModifiedUntilEpoch,
151
- noUnmanagedExceptionsIgnoreBranch: options.noUnmanagedExceptions?.ignoreRuleWhileOnBranch,
152
- noDirectApiResolverMode: options.noDirectApiInResolver?.mode ?? 'OFF',
153
- noDirectApiResolverDisableAllowed: options.noDirectApiInResolver?.disableAllowed ?? true,
154
- noDirectApiResolverIgnoreEpoch: options.noDirectApiInResolver?.ignoreModifiedUntilEpoch,
155
- noDirectApiResolverIgnoreBranch: options.noDirectApiInResolver?.ignoreRuleWhileOnBranch,
156
- noDirectApiResolverEnforcePaths: options.noDirectApiInResolver?.enforcePaths ?? [],
157
- noSymbolDiTokensMode: options.noSymbolDiTokens?.mode ?? 'OFF',
158
- noSymbolDiTokensDisableAllowed: options.noSymbolDiTokens?.disableAllowed ?? true,
159
- noSymbolDiTokensIgnoreEpoch: options.noSymbolDiTokens?.ignoreModifiedUntilEpoch,
160
- noSymbolDiTokensIgnoreBranch: options.noSymbolDiTokens?.ignoreRuleWhileOnBranch,
161
- noSymbolDiTokensAllowedPaths: options.noSymbolDiTokens?.allowedPaths ?? [],
162
- };
163
- }
164
- function formatOverride(override) {
165
- if (!override) {
166
- return '';
167
- }
168
- return ` (override active, normal: ${override.normalMode}, ${override.reason})`;
169
- }
170
- function logConfig(config) {
171
- console.log('\n\ud83d\udccf Running Code Validations\n');
172
- console.log(` Method limits: mode=${config.methodMode}${formatOverride(config.methodOverride)}, limit=${config.methodLimit}, disableAllowed=${config.methodDisableAllowed}`);
173
- console.log(` File limits: mode=${config.fileMode}${formatOverride(config.fileOverride)}, limit=${config.fileLimit}, disableAllowed=${config.fileDisableAllowed}`);
174
- console.log(` Require return types: mode=${config.returnTypeMode}, disableAllowed=${config.returnTypeDisableAllowed}`);
175
- console.log(` No inline type literals: mode=${config.noInlineTypesMode}, disableAllowed=${config.noInlineTypesDisableAllowed}`);
176
- console.log(` No any/unknown: mode=${config.noAnyUnknownMode}, disableAllowed=${config.noAnyUnknownDisableAllowed}`);
177
- console.log(` No implicit any: mode=${config.noImplicitAnyMode}, disableAllowed=${config.noImplicitAnyDisableAllowed}`);
178
- console.log(` [Prisma] Validate DTOs: mode=${config.validateDtosMode}, disableAllowed=${config.validateDtosDisableAllowed}`);
179
- console.log(` [Prisma] Prisma converters: mode=${config.prismaConverterMode}, disableAllowed=${config.prismaConverterDisableAllowed}`);
180
- console.log(` No destructure: mode=${config.noDestructureMode}, disableAllowed=${config.noDestructureDisableAllowed}`);
181
- console.log(` Catch error pattern: mode=${config.catchErrorPatternMode}, disableAllowed=${config.catchErrorPatternDisableAllowed}`);
182
- console.log(` No unmanaged exceptions: mode=${config.noUnmanagedExceptionsMode}, disableAllowed=${config.noUnmanagedExceptionsDisableAllowed}`);
183
- console.log(` [Angular] No direct API in resolver: mode=${config.noDirectApiResolverMode}, disableAllowed=${config.noDirectApiResolverDisableAllowed}`);
184
- console.log(` No Symbol DI tokens: mode=${config.noSymbolDiTokensMode}, disableAllowed=${config.noSymbolDiTokensDisableAllowed}`);
185
- console.log('');
186
- }
187
- function isAllOff(config) {
188
- return config.methodMode === 'OFF' && config.fileMode === 'OFF' &&
189
- config.returnTypeMode === 'OFF' && config.noInlineTypesMode === 'OFF' &&
190
- config.noAnyUnknownMode === 'OFF' && config.noImplicitAnyMode === 'OFF' &&
191
- config.validateDtosMode === 'OFF' &&
192
- config.prismaConverterMode === 'OFF' && config.noDestructureMode === 'OFF' &&
193
- config.catchErrorPatternMode === 'OFF' && config.noUnmanagedExceptionsMode === 'OFF' &&
194
- config.noDirectApiResolverMode === 'OFF' && config.noSymbolDiTokensMode === 'OFF';
195
- }
196
- async function runMethodValidators(config, workspaceRoot) {
197
- const results = [];
198
- const runNew = config.methodMode === 'NEW_METHODS' || config.methodMode === 'NEW_AND_MODIFIED_METHODS';
199
- const runModified = config.methodMode === 'NEW_AND_MODIFIED_METHODS' || config.methodMode === 'MODIFIED_FILES';
200
- if (runNew) {
201
- results.push(await (0, validate_new_methods_1.default)({
202
- limit: config.methodLimit,
203
- mode: config.methodMode, disableAllowed: config.methodDisableAllowed,
204
- }, workspaceRoot));
205
- }
206
- if (runModified) {
207
- results.push(await (0, validate_modified_methods_1.default)({
208
- limit: config.methodLimit, mode: config.methodMode, disableAllowed: config.methodDisableAllowed,
209
- }, workspaceRoot));
210
- }
211
- return results;
212
- }
213
- async function runLintStyleValidators(config, workspaceRoot) {
214
- const r = [];
215
- r.push(await (0, validate_no_destructure_1.default)({ mode: config.noDestructureMode, disableAllowed: config.noDestructureDisableAllowed, ignoreModifiedUntilEpoch: config.noDestructureIgnoreEpoch, ignoreRuleWhileOnBranch: config.noDestructureIgnoreBranch }, workspaceRoot));
216
- r.push(await (0, validate_catch_error_pattern_1.default)({ mode: config.catchErrorPatternMode, disableAllowed: config.catchErrorPatternDisableAllowed, ignoreModifiedUntilEpoch: config.catchErrorPatternIgnoreEpoch, ignoreRuleWhileOnBranch: config.catchErrorPatternIgnoreBranch }, workspaceRoot));
217
- r.push(await (0, validate_no_unmanaged_exceptions_1.default)({ mode: config.noUnmanagedExceptionsMode, disableAllowed: config.noUnmanagedExceptionsDisableAllowed, ignoreModifiedUntilEpoch: config.noUnmanagedExceptionsIgnoreEpoch, ignoreRuleWhileOnBranch: config.noUnmanagedExceptionsIgnoreBranch }, workspaceRoot));
218
- r.push(await (0, validate_no_direct_api_resolver_1.default)({ mode: config.noDirectApiResolverMode, disableAllowed: config.noDirectApiResolverDisableAllowed, ignoreModifiedUntilEpoch: config.noDirectApiResolverIgnoreEpoch, ignoreRuleWhileOnBranch: config.noDirectApiResolverIgnoreBranch, enforcePaths: config.noDirectApiResolverEnforcePaths }, workspaceRoot));
219
- r.push(await (0, validate_no_symbol_di_tokens_1.default)({ mode: config.noSymbolDiTokensMode, disableAllowed: config.noSymbolDiTokensDisableAllowed, ignoreModifiedUntilEpoch: config.noSymbolDiTokensIgnoreEpoch, ignoreRuleWhileOnBranch: config.noSymbolDiTokensIgnoreBranch, allowedPaths: config.noSymbolDiTokensAllowedPaths }, workspaceRoot));
220
- return r;
221
- }
222
- async function runAllValidators(config, workspaceRoot) {
223
- const results = [];
224
- results.push(...await runMethodValidators(config, workspaceRoot));
225
- results.push(await (0, validate_modified_files_1.default)({
226
- limit: config.fileLimit, mode: config.fileMode, disableAllowed: config.fileDisableAllowed,
227
- }, workspaceRoot));
228
- results.push(await (0, validate_return_types_1.default)({ mode: config.returnTypeMode, disableAllowed: config.returnTypeDisableAllowed, ignoreModifiedUntilEpoch: config.returnTypeIgnoreEpoch, ignoreRuleWhileOnBranch: config.returnTypeIgnoreBranch }, workspaceRoot));
229
- results.push(await (0, validate_no_inline_types_1.default)({ mode: config.noInlineTypesMode, disableAllowed: config.noInlineTypesDisableAllowed, ignoreModifiedUntilEpoch: config.noInlineTypesIgnoreEpoch, ignoreRuleWhileOnBranch: config.noInlineTypesIgnoreBranch }, workspaceRoot));
230
- results.push(await (0, validate_no_any_unknown_1.default)({ mode: config.noAnyUnknownMode, disableAllowed: config.noAnyUnknownDisableAllowed, ignoreModifiedUntilEpoch: config.noAnyUnknownIgnoreEpoch, ignoreRuleWhileOnBranch: config.noAnyUnknownIgnoreBranch }, workspaceRoot));
231
- results.push(await (0, validate_no_implicit_any_1.default)({ mode: config.noImplicitAnyMode, disableAllowed: config.noImplicitAnyDisableAllowed, ignoreModifiedUntilEpoch: config.noImplicitAnyIgnoreEpoch, ignoreRuleWhileOnBranch: config.noImplicitAnyIgnoreBranch }, workspaceRoot));
232
- results.push(await (0, validate_dtos_1.default)({
233
- mode: config.validateDtosMode, disableAllowed: config.validateDtosDisableAllowed,
234
- prismaSchemaPath: config.validateDtosPrismaPath, dtoSourcePaths: config.validateDtosSrcPaths,
235
- ignoreModifiedUntilEpoch: config.validateDtosIgnoreEpoch, ignoreRuleWhileOnBranch: config.validateDtosIgnoreBranch,
236
- }, workspaceRoot));
237
- results.push(await (0, validate_prisma_converters_1.default)({
238
- mode: config.prismaConverterMode, disableAllowed: config.prismaConverterDisableAllowed,
239
- schemaPath: config.prismaConverterSchemaPath, convertersPaths: config.prismaConverterConvertersPaths,
240
- enforcePaths: config.prismaConverterEnforcePaths,
241
- ignoreModifiedUntilEpoch: config.prismaConverterIgnoreEpoch, ignoreRuleWhileOnBranch: config.prismaConverterIgnoreBranch,
242
- }, workspaceRoot));
243
- results.push(...await runLintStyleValidators(config, workspaceRoot));
244
- return results;
245
- }
246
- async function runValidator(_nxOptions, workspaceRoot) {
247
- // Config comes from webpieces.config.json at the workspace root,
248
- // loaded via the shared @webpieces/rules-config loader so ai-hooks and
249
- // this executor agree on every rule's enabled/mode/options.
42
+ /**
43
+ * Run all configured code validators against the workspace.
44
+ *
45
+ * Owns config loading: callers just pass the workspace root. Config comes from
46
+ * webpieces.config.json (loaded via @webpieces/rules-config so ai-hooks and this
47
+ * executor agree on every rule's enabled/mode/options). A validator runs only when
48
+ * `shouldRun()` is true (i.e. its mode is not OFF and no branch/epoch escape hatch matches).
49
+ */
50
+ async function runValidator(workspaceRoot) {
250
51
  const loaded = (0, rules_config_1.loadWebpiecesRulesConfig)(workspaceRoot);
251
52
  if (!loaded) {
252
53
  console.error('\n❌ No webpieces.config.json found at workspace root (or any ancestor).\n');
253
54
  return { success: false };
254
55
  }
255
- const options = (0, from_shared_config_1.toValidateCodeOptions)(loaded.config);
256
- const modeErrors = validateModes(options);
257
- if (modeErrors.length > 0) {
258
- console.error('');
259
- for (const err of modeErrors) {
260
- console.error(`❌ ${err}`);
261
- }
262
- console.error('');
263
- return { success: false };
264
- }
265
56
  console.log(`\n📄 Loaded config: ${loaded.configPath}`);
266
- const config = parseConfig(options);
267
- if (isAllOff(config)) {
268
- console.log('\n\u23ed\ufe0f Skipping all code validations (all modes: OFF)\n');
57
+ const validators = buildValidators(loaded.config);
58
+ const active = validators.filter((v) => v.shouldRun());
59
+ if (active.length === 0) {
60
+ console.log('\n⏭️ Skipping all code validations (all modes: OFF)\n');
269
61
  return { success: true };
270
62
  }
271
- logConfig(config);
272
- const results = await runAllValidators(config, workspaceRoot);
63
+ console.log('\n📏 Running Code Validations\n');
64
+ console.log(` Active rules: ${active.map((v) => v.name).join(', ')}`);
65
+ console.log('');
66
+ const results = [];
67
+ for (const validator of active) {
68
+ results.push(await validator.run(workspaceRoot));
69
+ }
273
70
  const allSuccess = results.every((r) => r.success);
274
- console.log(allSuccess ? '\n\u2705 All code validations passed\n' : '\n\u274c Some code validations failed\n');
71
+ console.log(allSuccess ? '\n All code validations passed\n' : '\n Some code validations failed\n');
275
72
  return { success: allSuccess };
276
73
  }
277
74
  //# sourceMappingURL=validate-code.js.map
@@ -1 +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 { loadWebpiecesRulesConfig } from '@webpieces/rules-config';\nimport { toValidateCodeOptions } from './from-shared-config';\nimport { shouldSkipRule } from './resolve-mode';\nimport runNewMethodsExecutor from './validate-new-methods';\nimport runModifiedMethodsExecutor from './validate-modified-methods';\nimport runModifiedFilesExecutor from './validate-modified-files';\nimport runReturnTypesExecutor from './validate-return-types';\nimport runNoInlineTypesExecutor from './validate-no-inline-types';\nimport runNoAnyUnknownExecutor from './validate-no-any-unknown';\nimport runNoImplicitAnyExecutor from './validate-no-implicit-any';\nimport runValidateDtosExecutor from './validate-dtos';\nimport runPrismaConvertersExecutor from './validate-prisma-converters';\nimport runNoDestructureExecutor from './validate-no-destructure';\nimport runCatchErrorPatternExecutor from './validate-catch-error-pattern';\nimport runNoUnmanagedExceptionsExecutor from './validate-no-unmanaged-exceptions';\nimport runNoDirectApiResolverExecutor from './validate-no-direct-api-resolver';\nimport runNoSymbolDiTokensExecutor from './validate-no-symbol-di-tokens';\nimport type {\n MethodMaxLimitMode,\n FileMaxLimitMode,\n ReturnTypeMode,\n NoInlineTypesMode,\n NoAnyUnknownMode,\n NoImplicitAnyMode,\n ValidateDtosMode,\n PrismaConverterMode,\n NoDestructureMode,\n CatchErrorPatternMode,\n NoUnmanagedExceptionsMode,\n NoDirectApiResolverMode,\n NoSymbolDiTokensMode,\n MethodMaxLimitConfig,\n FileMaxLimitConfig,\n ValidateCodeOptions,\n} from './validate-code-options';\n\nexport interface ExecutorResult {\n success: boolean;\n}\n\ninterface OverrideInfo {\n active: boolean;\n normalMode: string;\n reason: 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 returnTypeIgnoreBranch: string | undefined;\n noInlineTypesMode: NoInlineTypesMode;\n noInlineTypesDisableAllowed: boolean;\n noInlineTypesIgnoreEpoch: number | undefined;\n noInlineTypesIgnoreBranch: string | undefined;\n noAnyUnknownMode: NoAnyUnknownMode;\n noAnyUnknownDisableAllowed: boolean;\n noAnyUnknownIgnoreEpoch: number | undefined;\n noAnyUnknownIgnoreBranch: string | undefined;\n noImplicitAnyMode: NoImplicitAnyMode;\n noImplicitAnyDisableAllowed: boolean;\n noImplicitAnyIgnoreEpoch: number | undefined;\n noImplicitAnyIgnoreBranch: string | undefined;\n validateDtosMode: ValidateDtosMode;\n validateDtosDisableAllowed: boolean;\n validateDtosPrismaPath: string | undefined;\n validateDtosSrcPaths: string[];\n validateDtosIgnoreEpoch: number | undefined;\n validateDtosIgnoreBranch: string | undefined;\n prismaConverterMode: PrismaConverterMode;\n prismaConverterDisableAllowed: boolean;\n prismaConverterSchemaPath: string | undefined;\n prismaConverterConvertersPaths: string[];\n prismaConverterEnforcePaths: string[];\n prismaConverterIgnoreEpoch: number | undefined;\n prismaConverterIgnoreBranch: string | undefined;\n noDestructureMode: NoDestructureMode;\n noDestructureDisableAllowed: boolean;\n noDestructureIgnoreEpoch: number | undefined;\n noDestructureIgnoreBranch: string | undefined;\n catchErrorPatternMode: CatchErrorPatternMode;\n catchErrorPatternDisableAllowed: boolean;\n catchErrorPatternIgnoreEpoch: number | undefined;\n catchErrorPatternIgnoreBranch: string | undefined;\n noUnmanagedExceptionsMode: NoUnmanagedExceptionsMode;\n noUnmanagedExceptionsDisableAllowed: boolean;\n noUnmanagedExceptionsIgnoreEpoch: number | undefined;\n noUnmanagedExceptionsIgnoreBranch: string | undefined;\n noDirectApiResolverMode: NoDirectApiResolverMode;\n noDirectApiResolverDisableAllowed: boolean;\n noDirectApiResolverIgnoreEpoch: number | undefined;\n noDirectApiResolverIgnoreBranch: string | undefined;\n noDirectApiResolverEnforcePaths: string[];\n noSymbolDiTokensMode: NoSymbolDiTokensMode;\n noSymbolDiTokensDisableAllowed: boolean;\n noSymbolDiTokensIgnoreEpoch: number | undefined;\n noSymbolDiTokensIgnoreBranch: string | undefined;\n noSymbolDiTokensAllowedPaths: 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 noSymbolDiTokens: ['OFF', 'MODIFIED_CODE', '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 ['noSymbolDiTokens', options.noSymbolDiTokens?.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 resolveMethodMode(\n normalMode: MethodMaxLimitMode, epoch: number | undefined, branchPattern: string | undefined\n): ResolvedMethodMode {\n if (normalMode === 'OFF') {\n return { mode: 'OFF', override: undefined };\n }\n const skip = shouldSkipRule(epoch, branchPattern);\n if (skip.skip) {\n return {\n mode: 'OFF',\n override: { active: true, normalMode, reason: skip.reason! },\n };\n }\n return { mode: normalMode, override: undefined };\n}\n\nfunction resolveFileMode(\n normalMode: FileMaxLimitMode, epoch: number | undefined, branchPattern: string | undefined\n): ResolvedFileMode {\n if (normalMode === 'OFF') {\n return { mode: 'OFF', override: undefined };\n }\n const skip = shouldSkipRule(epoch, branchPattern);\n if (skip.skip) {\n return {\n mode: 'OFF',\n override: { active: true, normalMode, reason: skip.reason! },\n };\n }\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, methodConfig.ignoreRuleWhileOnBranch);\n const fileResolved = resolveFileMode(normalFileMode, fileConfig.ignoreModifiedUntilEpoch, fileConfig.ignoreRuleWhileOnBranch);\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 returnTypeIgnoreBranch: options.requireReturnType?.ignoreRuleWhileOnBranch,\n noInlineTypesMode: options.noInlineTypeLiterals?.mode ?? 'OFF',\n noInlineTypesDisableAllowed: options.noInlineTypeLiterals?.disableAllowed ?? true,\n noInlineTypesIgnoreEpoch: options.noInlineTypeLiterals?.ignoreModifiedUntilEpoch,\n noInlineTypesIgnoreBranch: options.noInlineTypeLiterals?.ignoreRuleWhileOnBranch,\n noAnyUnknownMode: options.noAnyUnknown?.mode ?? 'OFF',\n noAnyUnknownDisableAllowed: options.noAnyUnknown?.disableAllowed ?? true,\n noAnyUnknownIgnoreEpoch: options.noAnyUnknown?.ignoreModifiedUntilEpoch,\n noAnyUnknownIgnoreBranch: options.noAnyUnknown?.ignoreRuleWhileOnBranch,\n noImplicitAnyMode: options.noImplicitAny?.mode ?? 'OFF',\n noImplicitAnyDisableAllowed: options.noImplicitAny?.disableAllowed ?? true,\n noImplicitAnyIgnoreEpoch: options.noImplicitAny?.ignoreModifiedUntilEpoch,\n noImplicitAnyIgnoreBranch: options.noImplicitAny?.ignoreRuleWhileOnBranch,\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 validateDtosIgnoreBranch: options.validateDtos?.ignoreRuleWhileOnBranch,\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 prismaConverterIgnoreBranch: options.prismaConverter?.ignoreRuleWhileOnBranch,\n noDestructureMode: options.noDestructure?.mode ?? 'OFF',\n noDestructureDisableAllowed: options.noDestructure?.disableAllowed ?? true,\n noDestructureIgnoreEpoch: options.noDestructure?.ignoreModifiedUntilEpoch,\n noDestructureIgnoreBranch: options.noDestructure?.ignoreRuleWhileOnBranch,\n catchErrorPatternMode: options.catchErrorPattern?.mode ?? 'OFF',\n catchErrorPatternDisableAllowed: options.catchErrorPattern?.disableAllowed ?? true,\n catchErrorPatternIgnoreEpoch: options.catchErrorPattern?.ignoreModifiedUntilEpoch,\n catchErrorPatternIgnoreBranch: options.catchErrorPattern?.ignoreRuleWhileOnBranch,\n noUnmanagedExceptionsMode: options.noUnmanagedExceptions?.mode ?? 'OFF',\n noUnmanagedExceptionsDisableAllowed: options.noUnmanagedExceptions?.disableAllowed ?? true,\n noUnmanagedExceptionsIgnoreEpoch: options.noUnmanagedExceptions?.ignoreModifiedUntilEpoch,\n noUnmanagedExceptionsIgnoreBranch: options.noUnmanagedExceptions?.ignoreRuleWhileOnBranch,\n noDirectApiResolverMode: options.noDirectApiInResolver?.mode ?? 'OFF',\n noDirectApiResolverDisableAllowed: options.noDirectApiInResolver?.disableAllowed ?? true,\n noDirectApiResolverIgnoreEpoch: options.noDirectApiInResolver?.ignoreModifiedUntilEpoch,\n noDirectApiResolverIgnoreBranch: options.noDirectApiInResolver?.ignoreRuleWhileOnBranch,\n noDirectApiResolverEnforcePaths: options.noDirectApiInResolver?.enforcePaths ?? [],\n noSymbolDiTokensMode: options.noSymbolDiTokens?.mode ?? 'OFF',\n noSymbolDiTokensDisableAllowed: options.noSymbolDiTokens?.disableAllowed ?? true,\n noSymbolDiTokensIgnoreEpoch: options.noSymbolDiTokens?.ignoreModifiedUntilEpoch,\n noSymbolDiTokensIgnoreBranch: options.noSymbolDiTokens?.ignoreRuleWhileOnBranch,\n noSymbolDiTokensAllowedPaths: options.noSymbolDiTokens?.allowedPaths ?? [],\n };\n}\n\nfunction formatOverride(override: OverrideInfo | undefined): string {\n if (!override) {\n return '';\n }\n return ` (override active, normal: ${override.normalMode}, ${override.reason})`;\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(` [Prisma] Validate DTOs: mode=${config.validateDtosMode}, disableAllowed=${config.validateDtosDisableAllowed}`);\n console.log(` [Prisma] 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(` [Angular] No direct API in resolver: mode=${config.noDirectApiResolverMode}, disableAllowed=${config.noDirectApiResolverDisableAllowed}`);\n console.log(` No Symbol DI tokens: mode=${config.noSymbolDiTokensMode}, disableAllowed=${config.noSymbolDiTokensDisableAllowed}`);\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' && config.noSymbolDiTokensMode === '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 runLintStyleValidators(config: ParsedConfig, workspaceRoot: string): Promise<ExecutorResult[]> {\n const r: ExecutorResult[] = [];\n r.push(await runNoDestructureExecutor({ mode: config.noDestructureMode, disableAllowed: config.noDestructureDisableAllowed, ignoreModifiedUntilEpoch: config.noDestructureIgnoreEpoch, ignoreRuleWhileOnBranch: config.noDestructureIgnoreBranch }, workspaceRoot));\n r.push(await runCatchErrorPatternExecutor({ mode: config.catchErrorPatternMode, disableAllowed: config.catchErrorPatternDisableAllowed, ignoreModifiedUntilEpoch: config.catchErrorPatternIgnoreEpoch, ignoreRuleWhileOnBranch: config.catchErrorPatternIgnoreBranch }, workspaceRoot));\n r.push(await runNoUnmanagedExceptionsExecutor({ mode: config.noUnmanagedExceptionsMode, disableAllowed: config.noUnmanagedExceptionsDisableAllowed, ignoreModifiedUntilEpoch: config.noUnmanagedExceptionsIgnoreEpoch, ignoreRuleWhileOnBranch: config.noUnmanagedExceptionsIgnoreBranch }, workspaceRoot));\n r.push(await runNoDirectApiResolverExecutor({ mode: config.noDirectApiResolverMode, disableAllowed: config.noDirectApiResolverDisableAllowed, ignoreModifiedUntilEpoch: config.noDirectApiResolverIgnoreEpoch, ignoreRuleWhileOnBranch: config.noDirectApiResolverIgnoreBranch, enforcePaths: config.noDirectApiResolverEnforcePaths }, workspaceRoot));\n r.push(await runNoSymbolDiTokensExecutor({ mode: config.noSymbolDiTokensMode, disableAllowed: config.noSymbolDiTokensDisableAllowed, ignoreModifiedUntilEpoch: config.noSymbolDiTokensIgnoreEpoch, ignoreRuleWhileOnBranch: config.noSymbolDiTokensIgnoreBranch, allowedPaths: config.noSymbolDiTokensAllowedPaths }, workspaceRoot));\n return r;\n}\n\nasync function runAllValidators(config: ParsedConfig, workspaceRoot: string): Promise<ExecutorResult[]> {\n const results: ExecutorResult[] = [];\n results.push(...await runMethodValidators(config, workspaceRoot));\n results.push(await runModifiedFilesExecutor({\n limit: config.fileLimit, mode: config.fileMode, disableAllowed: config.fileDisableAllowed,\n }, workspaceRoot));\n results.push(await runReturnTypesExecutor({ mode: config.returnTypeMode, disableAllowed: config.returnTypeDisableAllowed, ignoreModifiedUntilEpoch: config.returnTypeIgnoreEpoch, ignoreRuleWhileOnBranch: config.returnTypeIgnoreBranch }, workspaceRoot));\n results.push(await runNoInlineTypesExecutor({ mode: config.noInlineTypesMode, disableAllowed: config.noInlineTypesDisableAllowed, ignoreModifiedUntilEpoch: config.noInlineTypesIgnoreEpoch, ignoreRuleWhileOnBranch: config.noInlineTypesIgnoreBranch }, workspaceRoot));\n results.push(await runNoAnyUnknownExecutor({ mode: config.noAnyUnknownMode, disableAllowed: config.noAnyUnknownDisableAllowed, ignoreModifiedUntilEpoch: config.noAnyUnknownIgnoreEpoch, ignoreRuleWhileOnBranch: config.noAnyUnknownIgnoreBranch }, workspaceRoot));\n results.push(await runNoImplicitAnyExecutor({ mode: config.noImplicitAnyMode, disableAllowed: config.noImplicitAnyDisableAllowed, ignoreModifiedUntilEpoch: config.noImplicitAnyIgnoreEpoch, ignoreRuleWhileOnBranch: config.noImplicitAnyIgnoreBranch }, workspaceRoot));\n results.push(await runValidateDtosExecutor({\n mode: config.validateDtosMode, disableAllowed: config.validateDtosDisableAllowed,\n prismaSchemaPath: config.validateDtosPrismaPath, dtoSourcePaths: config.validateDtosSrcPaths,\n ignoreModifiedUntilEpoch: config.validateDtosIgnoreEpoch, ignoreRuleWhileOnBranch: config.validateDtosIgnoreBranch,\n }, workspaceRoot));\n results.push(await runPrismaConvertersExecutor({\n mode: config.prismaConverterMode, disableAllowed: config.prismaConverterDisableAllowed,\n schemaPath: config.prismaConverterSchemaPath, convertersPaths: config.prismaConverterConvertersPaths,\n enforcePaths: config.prismaConverterEnforcePaths,\n ignoreModifiedUntilEpoch: config.prismaConverterIgnoreEpoch, ignoreRuleWhileOnBranch: config.prismaConverterIgnoreBranch,\n }, workspaceRoot));\n results.push(...await runLintStyleValidators(config, 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 loaded = loadWebpiecesRulesConfig(workspaceRoot);\n if (!loaded) {\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(loaded.config);\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: ${loaded.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"]}
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 {\n loadWebpiecesRulesConfig,\n WebpiecesRulesConfig,\n BaseRuleConfig,\n MaxMethodLinesConfig,\n MaxFileLinesConfig,\n RequireReturnTypeConfig,\n NoInlineTypeLiteralsConfig,\n NoAnyUnknownConfig,\n NoImplicitAnyConfig,\n PrismaValidateDtosConfig,\n PrismaConverterConfig,\n NoDestructureConfig,\n CatchErrorPatternConfig,\n NoUnmanagedExceptionsConfig,\n AngularNoDirectApiInResolverConfig,\n NoSymbolDiTokensConfig,\n} from '@webpieces/rules-config';\nimport { CodeValidator, ExecutorResult } from './code-validator';\nimport { MaxMethodLinesValidator } from './validate-modified-methods';\nimport { MaxFileLinesValidator } from './validate-modified-files';\nimport { RequireReturnTypeValidator } from './validate-return-types';\nimport { NoInlineTypeLiteralsValidator } from './validate-no-inline-types';\nimport { NoAnyUnknownValidator } from './validate-no-any-unknown';\nimport { NoImplicitAnyValidator } from './validate-no-implicit-any';\nimport { PrismaValidateDtosValidator } from './validate-dtos';\nimport { PrismaConverterValidator } from './validate-prisma-converters';\nimport { NoDestructureValidator } from './validate-no-destructure';\nimport { CatchErrorPatternValidator } from './validate-catch-error-pattern';\nimport { NoUnmanagedExceptionsValidator } from './validate-no-unmanaged-exceptions';\nimport { NoDirectApiResolverValidator } from './validate-no-direct-api-resolver';\nimport { NoSymbolDiTokensValidator } from './validate-no-symbol-di-tokens';\n\nexport { ExecutorResult } from './code-validator';\n\n/**\n * Build every code validator from the typed WebpiecesRulesConfig. Each validator is\n * constructed with its own `*Config` (the genuinely-consumed config class), so the\n * config types are exercised at compile time. Missing rule keys fall back to an empty\n * config instance — `loadWebpiecesRulesConfig` already validates that configured rules\n * carry an explicit `mode`, so in practice every key is present.\n */\nfunction buildValidators(config: WebpiecesRulesConfig): CodeValidator<BaseRuleConfig>[] {\n return [\n new MaxMethodLinesValidator(config['max-method-lines'] ?? new MaxMethodLinesConfig()),\n new MaxFileLinesValidator(config['max-file-lines'] ?? new MaxFileLinesConfig()),\n new RequireReturnTypeValidator(config['require-return-type'] ?? new RequireReturnTypeConfig()),\n new NoInlineTypeLiteralsValidator(config['no-inline-type-literals'] ?? new NoInlineTypeLiteralsConfig()),\n new NoAnyUnknownValidator(config['no-any-unknown'] ?? new NoAnyUnknownConfig()),\n new NoImplicitAnyValidator(config['no-implicit-any'] ?? new NoImplicitAnyConfig()),\n new PrismaValidateDtosValidator(config['prisma-validate-dtos'] ?? new PrismaValidateDtosConfig()),\n new PrismaConverterValidator(config['prisma-converter'] ?? new PrismaConverterConfig()),\n new NoDestructureValidator(config['no-destructure'] ?? new NoDestructureConfig()),\n new CatchErrorPatternValidator(config['catch-error-pattern'] ?? new CatchErrorPatternConfig()),\n new NoUnmanagedExceptionsValidator(config['no-unmanaged-exceptions'] ?? new NoUnmanagedExceptionsConfig()),\n new NoDirectApiResolverValidator(config['angular-no-direct-api-in-resolver'] ?? new AngularNoDirectApiInResolverConfig()),\n new NoSymbolDiTokensValidator(config['no-symbol-di-tokens'] ?? new NoSymbolDiTokensConfig()),\n ];\n}\n\n/**\n * Run all configured code validators against the workspace.\n *\n * Owns config loading: callers just pass the workspace root. Config comes from\n * webpieces.config.json (loaded via @webpieces/rules-config so ai-hooks and this\n * executor agree on every rule's enabled/mode/options). A validator runs only when\n * `shouldRun()` is true (i.e. its mode is not OFF and no branch/epoch escape hatch matches).\n */\nexport default async function runValidator(workspaceRoot: string): Promise<ExecutorResult> {\n const loaded = loadWebpiecesRulesConfig(workspaceRoot);\n if (!loaded) {\n console.error('\\n❌ No webpieces.config.json found at workspace root (or any ancestor).\\n');\n return { success: false };\n }\n\n console.log(`\\n📄 Loaded config: ${loaded.configPath}`);\n\n const validators = buildValidators(loaded.config);\n const active = validators.filter((v: CodeValidator<BaseRuleConfig>) => v.shouldRun());\n\n if (active.length === 0) {\n console.log('\\n⏭️ Skipping all code validations (all modes: OFF)\\n');\n return { success: true };\n }\n\n console.log('\\n📏 Running Code Validations\\n');\n console.log(` Active rules: ${active.map((v: CodeValidator<BaseRuleConfig>) => v.name).join(', ')}`);\n console.log('');\n\n const results: ExecutorResult[] = [];\n for (const validator of active) {\n results.push(await validator.run(workspaceRoot));\n }\n const allSuccess = results.every((r: ExecutorResult) => r.success);\n\n console.log(allSuccess ? '\\n✅ All code validations passed\\n' : '\\n❌ Some code validations failed\\n');\n return { success: allSuccess };\n}\n"]}
@@ -27,16 +27,9 @@
27
27
  * - Dto fields must be a subset of Dbo fields
28
28
  * - Extra Dbo fields are allowed (e.g., password)
29
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
- ignoreRuleWhileOnBranch?: string;
30
+ import { PrismaValidateDtosConfig } from '@webpieces/rules-config';
31
+ import { CodeValidator, ExecutorResult } from './code-validator';
32
+ export declare class PrismaValidateDtosValidator extends CodeValidator<PrismaValidateDtosConfig> {
33
+ constructor(config: PrismaValidateDtosConfig);
34
+ run(workspaceRoot: string): Promise<ExecutorResult>;
38
35
  }
39
- export interface ExecutorResult {
40
- success: boolean;
41
- }
42
- export default function runValidator(options: ValidateDtosOptions, workspaceRoot: string): Promise<ExecutorResult>;
@@ -29,12 +29,13 @@
29
29
  * - Extra Dbo fields are allowed (e.g., password)
30
30
  */
31
31
  Object.defineProperty(exports, "__esModule", { value: true });
32
- exports.default = runValidator;
32
+ exports.PrismaValidateDtosValidator = void 0;
33
33
  const tslib_1 = require("tslib");
34
34
  const child_process_1 = require("child_process");
35
35
  const fs = tslib_1.__importStar(require("fs"));
36
36
  const path = tslib_1.__importStar(require("path"));
37
37
  const ts = tslib_1.__importStar(require("typescript"));
38
+ const code_validator_1 = require("./code-validator");
38
39
  const resolve_mode_1 = require("./resolve-mode");
39
40
  /**
40
41
  * Auto-detect the base branch by finding the merge-base with origin/main.
@@ -535,7 +536,7 @@ function resolveMode(normalMode, epoch, branchPattern) {
535
536
  }
536
537
  return normalMode;
537
538
  }
538
- async function runValidator(options, workspaceRoot) {
539
+ async function runValidatorImpl(options, workspaceRoot) {
539
540
  const mode = resolveMode(options.mode ?? 'OFF', options.ignoreModifiedUntilEpoch, options.ignoreRuleWhileOnBranch);
540
541
  if (mode === 'OFF') {
541
542
  console.log('\n⏭️ Skipping validate-dtos (mode: OFF)');
@@ -567,4 +568,13 @@ async function runValidator(options, workspaceRoot) {
567
568
  const changedFiles = getChangedFiles(workspaceRoot, base, head);
568
569
  return validateDtoFiles(workspaceRoot, prismaSchemaPath, changedFiles, dtoSourcePaths, mode, base, head);
569
570
  }
571
+ class PrismaValidateDtosValidator extends code_validator_1.CodeValidator {
572
+ constructor(config) {
573
+ super(config, 'prisma-validate-dtos');
574
+ }
575
+ async run(workspaceRoot) {
576
+ return runValidatorImpl(this.config, workspaceRoot);
577
+ }
578
+ }
579
+ exports.PrismaValidateDtosValidator = PrismaValidateDtosValidator;
570
580
  //# sourceMappingURL=validate-dtos.js.map