@webpieces/dev-config 0.2.77 → 0.2.78

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.
@@ -8,11 +8,13 @@ export interface MethodMaxLimitConfig {
8
8
  limit?: number;
9
9
  mode?: MethodMaxLimitMode;
10
10
  disableAllowed?: boolean;
11
+ ignoreModifiedUntilEpoch?: number;
11
12
  }
12
13
  export interface FileMaxLimitConfig {
13
14
  limit?: number;
14
15
  mode?: FileMaxLimitMode;
15
16
  disableAllowed?: boolean;
17
+ ignoreModifiedUntilEpoch?: number;
16
18
  }
17
19
  export interface ValidateCodeOptions {
18
20
  methodMaxLimit?: MethodMaxLimitConfig;
@@ -8,25 +8,73 @@ const executor_3 = tslib_1.__importDefault(require("../validate-modified-files/e
8
8
  const executor_4 = tslib_1.__importDefault(require("../validate-return-types/executor"));
9
9
  const executor_5 = tslib_1.__importDefault(require("../validate-no-inline-types/executor"));
10
10
  const executor_6 = tslib_1.__importDefault(require("../validate-no-any-unknown/executor"));
11
+ function formatEpochDate(epoch) {
12
+ return new Date(epoch * 1000).toISOString().split('T')[0];
13
+ }
14
+ function resolveMethodMode(normalMode, epoch) {
15
+ if (epoch === undefined) {
16
+ return { mode: normalMode, override: undefined };
17
+ }
18
+ const nowSeconds = Date.now() / 1000;
19
+ if (nowSeconds < epoch) {
20
+ // Active: downgrade to skip modified checking
21
+ const downgraded = normalMode === 'OFF' ? 'OFF' : 'NEW_METHODS';
22
+ return {
23
+ mode: downgraded,
24
+ override: { active: true, normalMode, expiresDate: formatEpochDate(epoch) },
25
+ };
26
+ }
27
+ // Expired
28
+ console.log(`\n\u26a0\ufe0f methodMaxLimit.ignoreModifiedUntilEpoch (${epoch}) has expired (${formatEpochDate(epoch)}). Remove it from nx.json. Using normal mode: ${normalMode}\n`);
29
+ return { mode: normalMode, override: undefined };
30
+ }
31
+ function resolveFileMode(normalMode, epoch) {
32
+ if (epoch === undefined) {
33
+ return { mode: normalMode, override: undefined };
34
+ }
35
+ const nowSeconds = Date.now() / 1000;
36
+ if (nowSeconds < epoch) {
37
+ // Active: file checking is inherently about modified files, so skip entirely
38
+ return {
39
+ mode: 'OFF',
40
+ override: { active: true, normalMode, expiresDate: formatEpochDate(epoch) },
41
+ };
42
+ }
43
+ // Expired
44
+ console.log(`\n\u26a0\ufe0f fileMaxLimit.ignoreModifiedUntilEpoch (${epoch}) has expired (${formatEpochDate(epoch)}). Remove it from nx.json. Using normal mode: ${normalMode}\n`);
45
+ return { mode: normalMode, override: undefined };
46
+ }
11
47
  function parseConfig(options) {
12
48
  const methodConfig = options.methodMaxLimit ?? {};
13
49
  const fileConfig = options.fileMaxLimit ?? {};
50
+ const normalMethodMode = methodConfig.mode ?? 'NEW_AND_MODIFIED_METHODS';
51
+ const normalFileMode = fileConfig.mode ?? 'MODIFIED_FILES';
52
+ const methodResolved = resolveMethodMode(normalMethodMode, methodConfig.ignoreModifiedUntilEpoch);
53
+ const fileResolved = resolveFileMode(normalFileMode, fileConfig.ignoreModifiedUntilEpoch);
14
54
  return {
15
55
  methodLimit: methodConfig.limit ?? 80,
16
- methodMode: methodConfig.mode ?? 'NEW_AND_MODIFIED_METHODS',
56
+ methodMode: methodResolved.mode,
17
57
  methodDisableAllowed: methodConfig.disableAllowed ?? true,
58
+ methodOverride: methodResolved.override,
18
59
  fileLimit: fileConfig.limit ?? 900,
19
- fileMode: fileConfig.mode ?? 'MODIFIED_FILES',
60
+ fileMode: fileResolved.mode,
20
61
  fileDisableAllowed: fileConfig.disableAllowed ?? true,
62
+ fileOverride: fileResolved.override,
21
63
  returnTypeMode: options.requireReturnTypeMode ?? 'OFF',
22
64
  noInlineTypesMode: options.noInlineTypeLiteralsMode ?? 'OFF',
23
65
  noAnyUnknownMode: options.noAnyUnknownMode ?? 'OFF',
24
66
  };
25
67
  }
68
+ function formatOverride(override) {
69
+ if (!override) {
70
+ return '';
71
+ }
72
+ return ` (override active, normal: ${override.normalMode}, expires: ${override.expiresDate})`;
73
+ }
26
74
  function logConfig(config) {
27
75
  console.log('\n\ud83d\udccf Running Code Validations\n');
28
- console.log(` Method limits: mode=${config.methodMode}, limit=${config.methodLimit}, disableAllowed=${config.methodDisableAllowed}`);
29
- console.log(` File limits: mode=${config.fileMode}, limit=${config.fileLimit}, disableAllowed=${config.fileDisableAllowed}`);
76
+ console.log(` Method limits: mode=${config.methodMode}${formatOverride(config.methodOverride)}, limit=${config.methodLimit}, disableAllowed=${config.methodDisableAllowed}`);
77
+ console.log(` File limits: mode=${config.fileMode}${formatOverride(config.fileOverride)}, limit=${config.fileLimit}, disableAllowed=${config.fileDisableAllowed}`);
30
78
  console.log(` Require return types: ${config.returnTypeMode}`);
31
79
  console.log(` No inline type literals: ${config.noInlineTypesMode}`);
32
80
  console.log(` No any/unknown: ${config.noAnyUnknownMode}`);
@@ -1 +1 @@
1
- {"version":3,"file":"executor.js","sourceRoot":"","sources":["../../../../../../../packages/tooling/dev-config/architecture/executors/validate-code/executor.ts"],"names":[],"mappings":"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","sourcesContent":["import { ExecutorContext } from '@nx/devkit';\nimport runNewMethodsExecutor from '../validate-new-methods/executor';\nimport runModifiedMethodsExecutor from '../validate-modified-methods/executor';\nimport runModifiedFilesExecutor from '../validate-modified-files/executor';\nimport runReturnTypesExecutor, { ReturnTypeMode } from '../validate-return-types/executor';\nimport runNoInlineTypesExecutor, { NoInlineTypesMode } from '../validate-no-inline-types/executor';\nimport runNoAnyUnknownExecutor, { NoAnyUnknownMode } from '../validate-no-any-unknown/executor';\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}\n\nexport interface FileMaxLimitConfig {\n limit?: number;\n mode?: FileMaxLimitMode;\n disableAllowed?: boolean;\n}\n\nexport interface ValidateCodeOptions {\n methodMaxLimit?: MethodMaxLimitConfig;\n fileMaxLimit?: FileMaxLimitConfig;\n requireReturnTypeMode?: ReturnTypeMode;\n noInlineTypeLiteralsMode?: NoInlineTypesMode;\n noAnyUnknownMode?: NoAnyUnknownMode;\n}\n\nexport interface ExecutorResult {\n success: boolean;\n}\n\ninterface ParsedConfig {\n methodLimit: number;\n methodMode: MethodMaxLimitMode;\n methodDisableAllowed: boolean;\n fileLimit: number;\n fileMode: FileMaxLimitMode;\n fileDisableAllowed: boolean;\n returnTypeMode: ReturnTypeMode;\n noInlineTypesMode: NoInlineTypesMode;\n noAnyUnknownMode: NoAnyUnknownMode;\n}\n\nfunction parseConfig(options: ValidateCodeOptions): ParsedConfig {\n const methodConfig: MethodMaxLimitConfig = options.methodMaxLimit ?? {};\n const fileConfig: FileMaxLimitConfig = options.fileMaxLimit ?? {};\n\n return {\n methodLimit: methodConfig.limit ?? 80,\n methodMode: methodConfig.mode ?? 'NEW_AND_MODIFIED_METHODS',\n methodDisableAllowed: methodConfig.disableAllowed ?? true,\n fileLimit: fileConfig.limit ?? 900,\n fileMode: fileConfig.mode ?? 'MODIFIED_FILES',\n fileDisableAllowed: fileConfig.disableAllowed ?? true,\n returnTypeMode: options.requireReturnTypeMode ?? 'OFF',\n noInlineTypesMode: options.noInlineTypeLiteralsMode ?? 'OFF',\n noAnyUnknownMode: options.noAnyUnknownMode ?? 'OFF',\n };\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}, limit=${config.methodLimit}, disableAllowed=${config.methodDisableAllowed}`);\n console.log(` File limits: mode=${config.fileMode}, limit=${config.fileLimit}, disableAllowed=${config.fileDisableAllowed}`);\n console.log(` Require return types: ${config.returnTypeMode}`);\n console.log(` No inline type literals: ${config.noInlineTypesMode}`);\n console.log(` No any/unknown: ${config.noAnyUnknownMode}`);\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';\n}\n\nasync function runMethodValidators(config: ParsedConfig, context: ExecutorContext): 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 }, context));\n }\n if (runModified) {\n results.push(await runModifiedMethodsExecutor({\n limit: config.methodLimit, mode: config.methodMode, disableAllowed: config.methodDisableAllowed,\n }, context));\n }\n return results;\n}\n\nexport default async function runExecutor(\n options: ValidateCodeOptions,\n context: ExecutorContext\n): Promise<ExecutorResult> {\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 methodResults = await runMethodValidators(config, context);\n const fileResult = await runModifiedFilesExecutor({\n limit: config.fileLimit, mode: config.fileMode, disableAllowed: config.fileDisableAllowed,\n }, context);\n const returnTypesResult = await runReturnTypesExecutor({ mode: config.returnTypeMode }, context);\n const noInlineTypesResult = await runNoInlineTypesExecutor({ mode: config.noInlineTypesMode }, context);\n const noAnyUnknownResult = await runNoAnyUnknownExecutor({ mode: config.noAnyUnknownMode }, context);\n\n const allSuccess = methodResults.every((r) => r.success) &&\n fileResult.success && returnTypesResult.success &&\n noInlineTypesResult.success && noAnyUnknownResult.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":"executor.js","sourceRoot":"","sources":["../../../../../../../packages/tooling/dev-config/architecture/executors/validate-code/executor.ts"],"names":[],"mappings":"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","sourcesContent":["import { ExecutorContext } from '@nx/devkit';\nimport runNewMethodsExecutor from '../validate-new-methods/executor';\nimport runModifiedMethodsExecutor from '../validate-modified-methods/executor';\nimport runModifiedFilesExecutor from '../validate-modified-files/executor';\nimport runReturnTypesExecutor, { ReturnTypeMode } from '../validate-return-types/executor';\nimport runNoInlineTypesExecutor, { NoInlineTypesMode } from '../validate-no-inline-types/executor';\nimport runNoAnyUnknownExecutor, { NoAnyUnknownMode } from '../validate-no-any-unknown/executor';\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 ValidateCodeOptions {\n methodMaxLimit?: MethodMaxLimitConfig;\n fileMaxLimit?: FileMaxLimitConfig;\n requireReturnTypeMode?: ReturnTypeMode;\n noInlineTypeLiteralsMode?: NoInlineTypesMode;\n noAnyUnknownMode?: NoAnyUnknownMode;\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 noInlineTypesMode: NoInlineTypesMode;\n noAnyUnknownMode: NoAnyUnknownMode;\n}\n\ninterface ResolvedMethodMode {\n mode: MethodMaxLimitMode;\n override: OverrideInfo | undefined;\n}\n\ninterface ResolvedFileMode {\n mode: FileMaxLimitMode;\n override: OverrideInfo | undefined;\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 console.log(`\\n\\u26a0\\ufe0f methodMaxLimit.ignoreModifiedUntilEpoch (${epoch}) has expired (${formatEpochDate(epoch)}). Remove it from nx.json. Using normal mode: ${normalMode}\\n`);\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 console.log(`\\n\\u26a0\\ufe0f fileMaxLimit.ignoreModifiedUntilEpoch (${epoch}) has expired (${formatEpochDate(epoch)}). Remove it from nx.json. Using normal mode: ${normalMode}\\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);\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.requireReturnTypeMode ?? 'OFF',\n noInlineTypesMode: options.noInlineTypeLiteralsMode ?? 'OFF',\n noAnyUnknownMode: options.noAnyUnknownMode ?? 'OFF',\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: ${config.returnTypeMode}`);\n console.log(` No inline type literals: ${config.noInlineTypesMode}`);\n console.log(` No any/unknown: ${config.noAnyUnknownMode}`);\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';\n}\n\nasync function runMethodValidators(config: ParsedConfig, context: ExecutorContext): 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 }, context));\n }\n if (runModified) {\n results.push(await runModifiedMethodsExecutor({\n limit: config.methodLimit, mode: config.methodMode, disableAllowed: config.methodDisableAllowed,\n }, context));\n }\n return results;\n}\n\nexport default async function runExecutor(\n options: ValidateCodeOptions,\n context: ExecutorContext\n): Promise<ExecutorResult> {\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 methodResults = await runMethodValidators(config, context);\n const fileResult = await runModifiedFilesExecutor({\n limit: config.fileLimit, mode: config.fileMode, disableAllowed: config.fileDisableAllowed,\n }, context);\n const returnTypesResult = await runReturnTypesExecutor({ mode: config.returnTypeMode }, context);\n const noInlineTypesResult = await runNoInlineTypesExecutor({ mode: config.noInlineTypesMode }, context);\n const noAnyUnknownResult = await runNoAnyUnknownExecutor({ mode: config.noAnyUnknownMode }, context);\n\n const allSuccess = methodResults.every((r) => r.success) &&\n fileResult.success && returnTypesResult.success &&\n noInlineTypesResult.success && noAnyUnknownResult.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"]}
@@ -13,12 +13,14 @@ export interface MethodMaxLimitConfig {
13
13
  limit?: number;
14
14
  mode?: MethodMaxLimitMode;
15
15
  disableAllowed?: boolean;
16
+ ignoreModifiedUntilEpoch?: number;
16
17
  }
17
18
 
18
19
  export interface FileMaxLimitConfig {
19
20
  limit?: number;
20
21
  mode?: FileMaxLimitMode;
21
22
  disableAllowed?: boolean;
23
+ ignoreModifiedUntilEpoch?: number;
22
24
  }
23
25
 
24
26
  export interface ValidateCodeOptions {
@@ -33,39 +35,116 @@ export interface ExecutorResult {
33
35
  success: boolean;
34
36
  }
35
37
 
38
+ interface OverrideInfo {
39
+ active: boolean;
40
+ normalMode: string;
41
+ expiresDate: string;
42
+ }
43
+
36
44
  interface ParsedConfig {
37
45
  methodLimit: number;
38
46
  methodMode: MethodMaxLimitMode;
39
47
  methodDisableAllowed: boolean;
48
+ methodOverride: OverrideInfo | undefined;
40
49
  fileLimit: number;
41
50
  fileMode: FileMaxLimitMode;
42
51
  fileDisableAllowed: boolean;
52
+ fileOverride: OverrideInfo | undefined;
43
53
  returnTypeMode: ReturnTypeMode;
44
54
  noInlineTypesMode: NoInlineTypesMode;
45
55
  noAnyUnknownMode: NoAnyUnknownMode;
46
56
  }
47
57
 
58
+ interface ResolvedMethodMode {
59
+ mode: MethodMaxLimitMode;
60
+ override: OverrideInfo | undefined;
61
+ }
62
+
63
+ interface ResolvedFileMode {
64
+ mode: FileMaxLimitMode;
65
+ override: OverrideInfo | undefined;
66
+ }
67
+
68
+ function formatEpochDate(epoch: number): string {
69
+ return new Date(epoch * 1000).toISOString().split('T')[0];
70
+ }
71
+
72
+ function resolveMethodMode(
73
+ normalMode: MethodMaxLimitMode, epoch: number | undefined
74
+ ): ResolvedMethodMode {
75
+ if (epoch === undefined) {
76
+ return { mode: normalMode, override: undefined };
77
+ }
78
+ const nowSeconds = Date.now() / 1000;
79
+ if (nowSeconds < epoch) {
80
+ // Active: downgrade to skip modified checking
81
+ const downgraded: MethodMaxLimitMode =
82
+ normalMode === 'OFF' ? 'OFF' : 'NEW_METHODS';
83
+ return {
84
+ mode: downgraded,
85
+ override: { active: true, normalMode, expiresDate: formatEpochDate(epoch) },
86
+ };
87
+ }
88
+ // Expired
89
+ console.log(`\n\u26a0\ufe0f methodMaxLimit.ignoreModifiedUntilEpoch (${epoch}) has expired (${formatEpochDate(epoch)}). Remove it from nx.json. Using normal mode: ${normalMode}\n`);
90
+ return { mode: normalMode, override: undefined };
91
+ }
92
+
93
+ function resolveFileMode(
94
+ normalMode: FileMaxLimitMode, epoch: number | undefined
95
+ ): ResolvedFileMode {
96
+ if (epoch === undefined) {
97
+ return { mode: normalMode, override: undefined };
98
+ }
99
+ const nowSeconds = Date.now() / 1000;
100
+ if (nowSeconds < epoch) {
101
+ // Active: file checking is inherently about modified files, so skip entirely
102
+ return {
103
+ mode: 'OFF',
104
+ override: { active: true, normalMode, expiresDate: formatEpochDate(epoch) },
105
+ };
106
+ }
107
+ // Expired
108
+ console.log(`\n\u26a0\ufe0f fileMaxLimit.ignoreModifiedUntilEpoch (${epoch}) has expired (${formatEpochDate(epoch)}). Remove it from nx.json. Using normal mode: ${normalMode}\n`);
109
+ return { mode: normalMode, override: undefined };
110
+ }
111
+
48
112
  function parseConfig(options: ValidateCodeOptions): ParsedConfig {
49
113
  const methodConfig: MethodMaxLimitConfig = options.methodMaxLimit ?? {};
50
114
  const fileConfig: FileMaxLimitConfig = options.fileMaxLimit ?? {};
51
115
 
116
+ const normalMethodMode = methodConfig.mode ?? 'NEW_AND_MODIFIED_METHODS';
117
+ const normalFileMode = fileConfig.mode ?? 'MODIFIED_FILES';
118
+
119
+ const methodResolved = resolveMethodMode(normalMethodMode, methodConfig.ignoreModifiedUntilEpoch);
120
+ const fileResolved = resolveFileMode(normalFileMode, fileConfig.ignoreModifiedUntilEpoch);
121
+
52
122
  return {
53
123
  methodLimit: methodConfig.limit ?? 80,
54
- methodMode: methodConfig.mode ?? 'NEW_AND_MODIFIED_METHODS',
124
+ methodMode: methodResolved.mode,
55
125
  methodDisableAllowed: methodConfig.disableAllowed ?? true,
126
+ methodOverride: methodResolved.override,
56
127
  fileLimit: fileConfig.limit ?? 900,
57
- fileMode: fileConfig.mode ?? 'MODIFIED_FILES',
128
+ fileMode: fileResolved.mode,
58
129
  fileDisableAllowed: fileConfig.disableAllowed ?? true,
130
+ fileOverride: fileResolved.override,
59
131
  returnTypeMode: options.requireReturnTypeMode ?? 'OFF',
60
132
  noInlineTypesMode: options.noInlineTypeLiteralsMode ?? 'OFF',
61
133
  noAnyUnknownMode: options.noAnyUnknownMode ?? 'OFF',
62
134
  };
63
135
  }
64
136
 
137
+ function formatOverride(override: OverrideInfo | undefined): string {
138
+ if (!override) {
139
+ return '';
140
+ }
141
+ return ` (override active, normal: ${override.normalMode}, expires: ${override.expiresDate})`;
142
+ }
143
+
65
144
  function logConfig(config: ParsedConfig): void {
66
145
  console.log('\n\ud83d\udccf Running Code Validations\n');
67
- console.log(` Method limits: mode=${config.methodMode}, limit=${config.methodLimit}, disableAllowed=${config.methodDisableAllowed}`);
68
- console.log(` File limits: mode=${config.fileMode}, limit=${config.fileLimit}, disableAllowed=${config.fileDisableAllowed}`);
146
+ console.log(` Method limits: mode=${config.methodMode}${formatOverride(config.methodOverride)}, limit=${config.methodLimit}, disableAllowed=${config.methodDisableAllowed}`);
147
+ console.log(` File limits: mode=${config.fileMode}${formatOverride(config.fileOverride)}, limit=${config.fileLimit}, disableAllowed=${config.fileDisableAllowed}`);
69
148
  console.log(` Require return types: ${config.returnTypeMode}`);
70
149
  console.log(` No inline type literals: ${config.noInlineTypesMode}`);
71
150
  console.log(` No any/unknown: ${config.noAnyUnknownMode}`);
@@ -23,6 +23,10 @@
23
23
  "type": "boolean",
24
24
  "description": "Whether disable comments work. When false, no escape hatch (like old STRICT mode).",
25
25
  "default": true
26
+ },
27
+ "ignoreModifiedUntilEpoch": {
28
+ "type": "number",
29
+ "description": "Epoch seconds. Until this time, skip modified-method validation (new methods still enforced). When expired, normal mode resumes. Omit when not needed."
26
30
  }
27
31
  }
28
32
  },
@@ -45,6 +49,10 @@
45
49
  "type": "boolean",
46
50
  "description": "Whether disable comments work. When false, no escape hatch (like old STRICT mode).",
47
51
  "default": true
52
+ },
53
+ "ignoreModifiedUntilEpoch": {
54
+ "type": "number",
55
+ "description": "Epoch seconds. Until this time, skip modified-file validation. When expired, normal mode resumes. Omit when not needed."
48
56
  }
49
57
  }
50
58
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webpieces/dev-config",
3
- "version": "0.2.77",
3
+ "version": "0.2.78",
4
4
  "description": "Development configuration, scripts, and patterns for WebPieces projects",
5
5
  "type": "commonjs",
6
6
  "bin": {