@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.
- package/package.json +4 -3
- package/src/cli.d.ts +1 -0
- package/src/cli.js +19 -0
- package/src/cli.js.map +1 -0
- package/src/diff-utils.d.ts +24 -0
- package/src/{diff-utils.ts → diff-utils.js} +30 -38
- package/src/diff-utils.js.map +1 -0
- package/src/from-shared-config.d.ts +28 -0
- package/src/from-shared-config.js +119 -0
- package/src/from-shared-config.js.map +1 -0
- package/src/index.js +33 -0
- package/src/index.js.map +1 -0
- package/src/validate-catch-error-pattern.d.ts +47 -0
- package/src/{validate-catch-error-pattern.ts → validate-catch-error-pattern.js} +74 -195
- package/src/validate-catch-error-pattern.js.map +1 -0
- package/src/validate-code.d.ts +98 -0
- package/src/{validate-code.ts → validate-code.js} +65 -259
- package/src/validate-code.js.map +1 -0
- package/src/validate-dtos.d.ts +41 -0
- package/src/{validate-dtos.ts → validate-dtos.js} +88 -215
- package/src/validate-dtos.js.map +1 -0
- package/src/validate-modified-files.d.ts +24 -0
- package/src/{validate-modified-files.ts → validate-modified-files.js} +46 -115
- package/src/validate-modified-files.js.map +1 -0
- package/src/validate-modified-methods.d.ts +30 -0
- package/src/{validate-modified-methods.ts → validate-modified-methods.js} +94 -196
- package/src/validate-modified-methods.js.map +1 -0
- package/src/validate-new-methods.d.ts +27 -0
- package/src/{validate-new-methods.ts → validate-new-methods.js} +63 -133
- package/src/validate-new-methods.js.map +1 -0
- package/src/validate-no-any-unknown.d.ts +41 -0
- package/src/{validate-no-any-unknown.ts → validate-no-any-unknown.js} +69 -146
- package/src/validate-no-any-unknown.js.map +1 -0
- package/src/validate-no-destructure.d.ts +51 -0
- package/src/{validate-no-destructure.ts → validate-no-destructure.js} +80 -166
- package/src/validate-no-destructure.js.map +1 -0
- package/src/validate-no-direct-api-resolver.d.ts +46 -0
- package/src/{validate-no-direct-api-resolver.ts → validate-no-direct-api-resolver.js} +112 -211
- package/src/validate-no-direct-api-resolver.js.map +1 -0
- package/src/validate-no-implicit-any.d.ts +36 -0
- package/src/{validate-no-implicit-any.ts → validate-no-implicit-any.js} +94 -141
- package/src/validate-no-implicit-any.js.map +1 -0
- package/src/validate-no-inline-types.d.ts +90 -0
- package/src/{validate-no-inline-types.ts → validate-no-inline-types.js} +93 -198
- package/src/validate-no-inline-types.js.map +1 -0
- package/src/validate-no-unmanaged-exceptions.d.ts +43 -0
- package/src/{validate-no-unmanaged-exceptions.ts → validate-no-unmanaged-exceptions.js} +71 -140
- package/src/validate-no-unmanaged-exceptions.js.map +1 -0
- package/src/validate-prisma-converters.d.ts +59 -0
- package/src/{validate-prisma-converters.ts → validate-prisma-converters.js} +120 -307
- package/src/validate-prisma-converters.js.map +1 -0
- package/src/validate-return-types.d.ts +28 -0
- package/src/{validate-return-types.ts → validate-return-types.js} +84 -168
- package/src/validate-return-types.js.map +1 -0
- package/LICENSE +0 -373
- package/jest.config.ts +0 -20
- package/project.json +0 -22
- package/src/cli.ts +0 -17
- package/src/from-shared-config.ts +0 -118
- package/tsconfig.json +0 -22
- package/tsconfig.lib.json +0 -10
- package/tsconfig.spec.json +0 -14
- /package/src/{index.ts → index.d.ts} +0 -0
|
@@ -1,207 +1,42 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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:
|
|
188
|
-
noImplicitAny:
|
|
189
|
-
validateDtos:
|
|
190
|
-
prismaConverter:
|
|
191
|
-
noDestructure:
|
|
192
|
-
catchErrorPattern:
|
|
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
|
|
201
|
-
const errors
|
|
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)
|
|
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:
|
|
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
|
-
|
|
275
|
-
const
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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>;
|