@webpieces/dev-config 0.2.94 → 0.2.97
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/config/eslint/base.mjs +1 -1
- package/executors.json +6 -91
- package/package.json +6 -19
- package/{executors → src/executors}/help/executor.d.ts +4 -2
- package/src/executors/help/executor.js.map +1 -0
- package/{executors → src/executors}/validate-eslint-sync/executor.d.ts +3 -2
- package/src/executors/validate-eslint-sync/executor.js.map +1 -0
- package/{executors → src/executors}/validate-versions-locked/executor.js +5 -3
- package/src/executors/validate-versions-locked/executor.js.map +1 -0
- package/src/generators/init/generator.js.map +1 -1
- package/src/index.d.ts +1 -1
- package/src/index.js +1 -1
- package/src/index.js.map +1 -1
- package/src/plugin.d.ts +86 -0
- package/{plugin.js → src/plugin.js} +31 -15
- package/src/plugin.js.map +1 -0
- package/src/toError.d.ts +5 -0
- package/src/toError.js +37 -0
- package/src/toError.js.map +1 -0
- package/templates/eslint.webpieces.config.mjs +1 -1
- package/templates/webpieces.exceptions.md +15 -15
- package/architecture/executors/diff-utils.d.ts +0 -24
- package/architecture/executors/diff-utils.js +0 -119
- package/architecture/executors/diff-utils.js.map +0 -1
- package/architecture/executors/diff-utils.ts +0 -127
- package/architecture/executors/generate/executor.d.ts +0 -16
- package/architecture/executors/generate/executor.js +0 -44
- package/architecture/executors/generate/executor.js.map +0 -1
- package/architecture/executors/generate/executor.ts +0 -59
- package/architecture/executors/generate/schema.json +0 -14
- package/architecture/executors/validate-architecture-unchanged/executor.d.ts +0 -17
- package/architecture/executors/validate-architecture-unchanged/executor.js +0 -229
- package/architecture/executors/validate-architecture-unchanged/executor.js.map +0 -1
- package/architecture/executors/validate-architecture-unchanged/executor.ts +0 -251
- package/architecture/executors/validate-architecture-unchanged/schema.json +0 -14
- package/architecture/executors/validate-code/executor.d.ts +0 -78
- package/architecture/executors/validate-code/executor.js +0 -243
- package/architecture/executors/validate-code/executor.js.map +0 -1
- package/architecture/executors/validate-code/executor.ts +0 -406
- package/architecture/executors/validate-code/schema.json +0 -227
- package/architecture/executors/validate-dtos/executor.d.ts +0 -42
- package/architecture/executors/validate-dtos/executor.js +0 -561
- package/architecture/executors/validate-dtos/executor.js.map +0 -1
- package/architecture/executors/validate-dtos/executor.ts +0 -689
- package/architecture/executors/validate-dtos/schema.json +0 -33
- package/architecture/executors/validate-modified-files/executor.d.ts +0 -25
- package/architecture/executors/validate-modified-files/executor.js +0 -501
- package/architecture/executors/validate-modified-files/executor.js.map +0 -1
- package/architecture/executors/validate-modified-files/executor.ts +0 -571
- package/architecture/executors/validate-modified-files/schema.json +0 -25
- package/architecture/executors/validate-modified-methods/executor.d.ts +0 -31
- package/architecture/executors/validate-modified-methods/executor.js +0 -694
- package/architecture/executors/validate-modified-methods/executor.js.map +0 -1
- package/architecture/executors/validate-modified-methods/executor.ts +0 -797
- package/architecture/executors/validate-modified-methods/schema.json +0 -25
- package/architecture/executors/validate-new-methods/executor.d.ts +0 -28
- package/architecture/executors/validate-new-methods/executor.js +0 -513
- package/architecture/executors/validate-new-methods/executor.js.map +0 -1
- package/architecture/executors/validate-new-methods/executor.ts +0 -584
- package/architecture/executors/validate-new-methods/schema.json +0 -25
- package/architecture/executors/validate-no-any-unknown/executor.d.ts +0 -42
- package/architecture/executors/validate-no-any-unknown/executor.js +0 -462
- package/architecture/executors/validate-no-any-unknown/executor.js.map +0 -1
- package/architecture/executors/validate-no-any-unknown/executor.ts +0 -540
- package/architecture/executors/validate-no-any-unknown/schema.json +0 -24
- package/architecture/executors/validate-no-architecture-cycles/executor.d.ts +0 -16
- package/architecture/executors/validate-no-architecture-cycles/executor.js +0 -48
- package/architecture/executors/validate-no-architecture-cycles/executor.js.map +0 -1
- package/architecture/executors/validate-no-architecture-cycles/executor.ts +0 -60
- package/architecture/executors/validate-no-architecture-cycles/schema.json +0 -8
- package/architecture/executors/validate-no-destructure/executor.d.ts +0 -52
- package/architecture/executors/validate-no-destructure/executor.js +0 -491
- package/architecture/executors/validate-no-destructure/executor.js.map +0 -1
- package/architecture/executors/validate-no-destructure/executor.ts +0 -578
- package/architecture/executors/validate-no-destructure/schema.json +0 -24
- package/architecture/executors/validate-no-direct-api-resolver/executor.d.ts +0 -47
- package/architecture/executors/validate-no-direct-api-resolver/executor.js +0 -566
- package/architecture/executors/validate-no-direct-api-resolver/executor.js.map +0 -1
- package/architecture/executors/validate-no-direct-api-resolver/executor.ts +0 -666
- package/architecture/executors/validate-no-direct-api-resolver/schema.json +0 -29
- package/architecture/executors/validate-no-inline-types/executor.d.ts +0 -91
- package/architecture/executors/validate-no-inline-types/executor.js +0 -669
- package/architecture/executors/validate-no-inline-types/executor.js.map +0 -1
- package/architecture/executors/validate-no-inline-types/executor.ts +0 -775
- package/architecture/executors/validate-no-inline-types/schema.json +0 -24
- package/architecture/executors/validate-no-skiplevel-deps/executor.d.ts +0 -19
- package/architecture/executors/validate-no-skiplevel-deps/executor.js +0 -227
- package/architecture/executors/validate-no-skiplevel-deps/executor.js.map +0 -1
- package/architecture/executors/validate-no-skiplevel-deps/executor.ts +0 -267
- package/architecture/executors/validate-no-skiplevel-deps/schema.json +0 -8
- package/architecture/executors/validate-packagejson/executor.d.ts +0 -16
- package/architecture/executors/validate-packagejson/executor.js +0 -57
- package/architecture/executors/validate-packagejson/executor.js.map +0 -1
- package/architecture/executors/validate-packagejson/executor.ts +0 -74
- package/architecture/executors/validate-packagejson/schema.json +0 -8
- package/architecture/executors/validate-prisma-converters/executor.d.ts +0 -60
- package/architecture/executors/validate-prisma-converters/executor.js +0 -634
- package/architecture/executors/validate-prisma-converters/executor.js.map +0 -1
- package/architecture/executors/validate-prisma-converters/executor.ts +0 -822
- package/architecture/executors/validate-prisma-converters/schema.json +0 -38
- package/architecture/executors/validate-return-types/executor.d.ts +0 -29
- package/architecture/executors/validate-return-types/executor.js +0 -439
- package/architecture/executors/validate-return-types/executor.js.map +0 -1
- package/architecture/executors/validate-return-types/executor.ts +0 -524
- package/architecture/executors/validate-return-types/schema.json +0 -24
- package/architecture/executors/visualize/executor.d.ts +0 -17
- package/architecture/executors/visualize/executor.js +0 -49
- package/architecture/executors/visualize/executor.js.map +0 -1
- package/architecture/executors/visualize/executor.ts +0 -63
- package/architecture/executors/visualize/schema.json +0 -14
- package/architecture/index.d.ts +0 -19
- package/architecture/index.js +0 -23
- package/architecture/index.js.map +0 -1
- package/architecture/index.ts +0 -20
- package/architecture/lib/graph-comparator.d.ts +0 -39
- package/architecture/lib/graph-comparator.js +0 -100
- package/architecture/lib/graph-comparator.js.map +0 -1
- package/architecture/lib/graph-comparator.ts +0 -141
- package/architecture/lib/graph-generator.d.ts +0 -19
- package/architecture/lib/graph-generator.js +0 -84
- package/architecture/lib/graph-generator.js.map +0 -1
- package/architecture/lib/graph-generator.ts +0 -97
- package/architecture/lib/graph-loader.d.ts +0 -31
- package/architecture/lib/graph-loader.js +0 -98
- package/architecture/lib/graph-loader.js.map +0 -1
- package/architecture/lib/graph-loader.ts +0 -116
- package/architecture/lib/graph-sorter.d.ts +0 -37
- package/architecture/lib/graph-sorter.js +0 -110
- package/architecture/lib/graph-sorter.js.map +0 -1
- package/architecture/lib/graph-sorter.ts +0 -137
- package/architecture/lib/graph-visualizer.d.ts +0 -29
- package/architecture/lib/graph-visualizer.js +0 -217
- package/architecture/lib/graph-visualizer.js.map +0 -1
- package/architecture/lib/graph-visualizer.ts +0 -231
- package/architecture/lib/package-validator.d.ts +0 -38
- package/architecture/lib/package-validator.js +0 -126
- package/architecture/lib/package-validator.js.map +0 -1
- package/architecture/lib/package-validator.ts +0 -170
- package/eslint-plugin/__tests__/catch-error-pattern.test.ts +0 -359
- package/eslint-plugin/__tests__/max-file-lines.test.ts +0 -207
- package/eslint-plugin/__tests__/max-method-lines.test.ts +0 -258
- package/eslint-plugin/__tests__/no-unmanaged-exceptions.test.ts +0 -359
- package/eslint-plugin/index.d.ts +0 -23
- package/eslint-plugin/index.js +0 -30
- package/eslint-plugin/index.js.map +0 -1
- package/eslint-plugin/index.ts +0 -29
- package/eslint-plugin/rules/catch-error-pattern.d.ts +0 -11
- package/eslint-plugin/rules/catch-error-pattern.js +0 -196
- package/eslint-plugin/rules/catch-error-pattern.js.map +0 -1
- package/eslint-plugin/rules/catch-error-pattern.ts +0 -281
- package/eslint-plugin/rules/enforce-architecture.d.ts +0 -15
- package/eslint-plugin/rules/enforce-architecture.js +0 -476
- package/eslint-plugin/rules/enforce-architecture.js.map +0 -1
- package/eslint-plugin/rules/enforce-architecture.ts +0 -543
- package/eslint-plugin/rules/max-file-lines.d.ts +0 -12
- package/eslint-plugin/rules/max-file-lines.js +0 -257
- package/eslint-plugin/rules/max-file-lines.js.map +0 -1
- package/eslint-plugin/rules/max-file-lines.ts +0 -272
- package/eslint-plugin/rules/max-method-lines.d.ts +0 -12
- package/eslint-plugin/rules/max-method-lines.js +0 -240
- package/eslint-plugin/rules/max-method-lines.js.map +0 -1
- package/eslint-plugin/rules/max-method-lines.ts +0 -287
- package/eslint-plugin/rules/no-unmanaged-exceptions.d.ts +0 -22
- package/eslint-plugin/rules/no-unmanaged-exceptions.js +0 -160
- package/eslint-plugin/rules/no-unmanaged-exceptions.js.map +0 -1
- package/eslint-plugin/rules/no-unmanaged-exceptions.ts +0 -179
- package/executors/help/executor.js.map +0 -1
- package/executors/help/executor.ts +0 -61
- package/executors/validate-eslint-sync/executor.js.map +0 -1
- package/executors/validate-eslint-sync/executor.ts +0 -83
- package/executors/validate-versions-locked/executor.js.map +0 -1
- package/executors/validate-versions-locked/executor.ts +0 -367
- package/plugin/README.md +0 -243
- package/plugin/index.d.ts +0 -4
- package/plugin/index.js +0 -8
- package/plugin/index.js.map +0 -1
- package/plugin/index.ts +0 -4
- /package/{executors → src/executors}/help/executor.js +0 -0
- /package/{executors → src/executors}/help/schema.json +0 -0
- /package/{executors → src/executors}/validate-eslint-sync/executor.js +0 -0
- /package/{executors → src/executors}/validate-eslint-sync/schema.json +0 -0
- /package/{executors → src/executors}/validate-versions-locked/executor.d.ts +0 -0
- /package/{executors → src/executors}/validate-versions-locked/schema.json +0 -0
|
@@ -39,6 +39,7 @@ const DEFAULT_OPTIONS = {
|
|
|
39
39
|
validateModifiedMethods: true,
|
|
40
40
|
validateModifiedFiles: true,
|
|
41
41
|
validateVersionsLocked: true,
|
|
42
|
+
validateTsInSrc: true,
|
|
42
43
|
newMethodsMaxLines: 30,
|
|
43
44
|
modifiedAndNewMethodsMaxLines: 80,
|
|
44
45
|
modifiedFilesMaxLines: 900,
|
|
@@ -181,6 +182,8 @@ function buildValidationTargetsList(validations) {
|
|
|
181
182
|
}
|
|
182
183
|
if (validations.validateVersionsLocked)
|
|
183
184
|
targets.push('validate-versions-locked');
|
|
185
|
+
if (validations.validateTsInSrc)
|
|
186
|
+
targets.push('validate-ts-in-src');
|
|
184
187
|
return targets;
|
|
185
188
|
}
|
|
186
189
|
/**
|
|
@@ -221,6 +224,9 @@ function createWorkspaceTargetsWithoutPrefix(opts) {
|
|
|
221
224
|
if (validations.validateVersionsLocked) {
|
|
222
225
|
targets['validate-versions-locked'] = createValidateVersionsLockedTarget();
|
|
223
226
|
}
|
|
227
|
+
if (validations.validateTsInSrc) {
|
|
228
|
+
targets['validate-ts-in-src'] = createValidateTsInSrcTarget();
|
|
229
|
+
}
|
|
224
230
|
// Add validate-complete target that runs all enabled validations
|
|
225
231
|
const validationTargets = buildValidationTargetsList(validations);
|
|
226
232
|
if (validationTargets.length > 0) {
|
|
@@ -268,7 +274,7 @@ function createWorkspaceTargets(opts) {
|
|
|
268
274
|
}
|
|
269
275
|
function createGenerateTarget(graphPath) {
|
|
270
276
|
return {
|
|
271
|
-
executor: '@webpieces/
|
|
277
|
+
executor: '@webpieces/architecture-validators:generate',
|
|
272
278
|
cache: false,
|
|
273
279
|
outputs: ['{workspaceRoot}/architecture/dependencies.json'],
|
|
274
280
|
options: { graphPath },
|
|
@@ -280,7 +286,7 @@ function createGenerateTarget(graphPath) {
|
|
|
280
286
|
}
|
|
281
287
|
function createVisualizeTargetWithoutPrefix(graphPath) {
|
|
282
288
|
return {
|
|
283
|
-
executor: '@webpieces/
|
|
289
|
+
executor: '@webpieces/architecture-validators:visualize',
|
|
284
290
|
dependsOn: ['generate'],
|
|
285
291
|
options: { graphPath },
|
|
286
292
|
metadata: {
|
|
@@ -291,7 +297,7 @@ function createVisualizeTargetWithoutPrefix(graphPath) {
|
|
|
291
297
|
}
|
|
292
298
|
function createVisualizeTarget(prefix, graphPath) {
|
|
293
299
|
return {
|
|
294
|
-
executor: '@webpieces/
|
|
300
|
+
executor: '@webpieces/architecture-validators:visualize',
|
|
295
301
|
dependsOn: [`${prefix}generate`],
|
|
296
302
|
options: { graphPath },
|
|
297
303
|
metadata: {
|
|
@@ -302,9 +308,9 @@ function createVisualizeTarget(prefix, graphPath) {
|
|
|
302
308
|
}
|
|
303
309
|
function createValidateNoCyclesTarget() {
|
|
304
310
|
return {
|
|
305
|
-
executor: '@webpieces/
|
|
311
|
+
executor: '@webpieces/architecture-validators:validate-no-architecture-cycles',
|
|
306
312
|
cache: true,
|
|
307
|
-
inputs: ['
|
|
313
|
+
inputs: ['{workspaceRoot}/**/project.json', '{workspaceRoot}/architecture/dependencies.json'],
|
|
308
314
|
metadata: {
|
|
309
315
|
technologies: ['nx'],
|
|
310
316
|
description: 'Validate the architecture has no circular project dependencies',
|
|
@@ -313,7 +319,7 @@ function createValidateNoCyclesTarget() {
|
|
|
313
319
|
}
|
|
314
320
|
function createValidateUnchangedTarget(graphPath) {
|
|
315
321
|
return {
|
|
316
|
-
executor: '@webpieces/
|
|
322
|
+
executor: '@webpieces/architecture-validators:validate-architecture-unchanged',
|
|
317
323
|
cache: false,
|
|
318
324
|
inputs: ['default', '{workspaceRoot}/architecture/dependencies.json'],
|
|
319
325
|
options: { graphPath },
|
|
@@ -325,9 +331,9 @@ function createValidateUnchangedTarget(graphPath) {
|
|
|
325
331
|
}
|
|
326
332
|
function createValidateNoSkipLevelTarget() {
|
|
327
333
|
return {
|
|
328
|
-
executor: '@webpieces/
|
|
334
|
+
executor: '@webpieces/architecture-validators:validate-no-skiplevel-deps',
|
|
329
335
|
cache: true,
|
|
330
|
-
inputs: ['
|
|
336
|
+
inputs: ['{workspaceRoot}/**/project.json', '{workspaceRoot}/architecture/dependencies.json'],
|
|
331
337
|
metadata: {
|
|
332
338
|
technologies: ['nx'],
|
|
333
339
|
description: 'Validate no project has redundant transitive dependencies',
|
|
@@ -336,9 +342,9 @@ function createValidateNoSkipLevelTarget() {
|
|
|
336
342
|
}
|
|
337
343
|
function createValidatePackageJsonTarget() {
|
|
338
344
|
return {
|
|
339
|
-
executor: '@webpieces/
|
|
345
|
+
executor: '@webpieces/architecture-validators:validate-packagejson',
|
|
340
346
|
cache: true,
|
|
341
|
-
inputs: ['
|
|
347
|
+
inputs: ['{workspaceRoot}/**/project.json', '{workspaceRoot}/**/package.json'],
|
|
342
348
|
metadata: {
|
|
343
349
|
technologies: ['nx'],
|
|
344
350
|
description: 'Validate package.json dependencies match project.json build dependencies',
|
|
@@ -347,7 +353,7 @@ function createValidatePackageJsonTarget() {
|
|
|
347
353
|
}
|
|
348
354
|
function createValidateNewMethodsTarget(maxLines, mode) {
|
|
349
355
|
return {
|
|
350
|
-
executor: '@webpieces/
|
|
356
|
+
executor: '@webpieces/architecture-validators:validate-new-methods',
|
|
351
357
|
cache: false, // Don't cache - depends on git state
|
|
352
358
|
inputs: ['default'],
|
|
353
359
|
options: { max: maxLines, mode },
|
|
@@ -359,7 +365,7 @@ function createValidateNewMethodsTarget(maxLines, mode) {
|
|
|
359
365
|
}
|
|
360
366
|
function createValidateModifiedMethodsTarget(maxLines, mode) {
|
|
361
367
|
return {
|
|
362
|
-
executor: '@webpieces/
|
|
368
|
+
executor: '@webpieces/architecture-validators:validate-modified-methods',
|
|
363
369
|
cache: false, // Don't cache - depends on git state
|
|
364
370
|
inputs: ['default'],
|
|
365
371
|
options: { max: maxLines, mode },
|
|
@@ -371,7 +377,7 @@ function createValidateModifiedMethodsTarget(maxLines, mode) {
|
|
|
371
377
|
}
|
|
372
378
|
function createValidateModifiedFilesTarget(maxLines, mode) {
|
|
373
379
|
return {
|
|
374
|
-
executor: '@webpieces/
|
|
380
|
+
executor: '@webpieces/architecture-validators:validate-modified-files',
|
|
375
381
|
cache: false, // Don't cache - depends on git state
|
|
376
382
|
inputs: ['default'],
|
|
377
383
|
options: { max: maxLines, mode },
|
|
@@ -387,7 +393,7 @@ function createValidateModifiedFilesTarget(maxLines, mode) {
|
|
|
387
393
|
*/
|
|
388
394
|
function createValidateCodeTarget() {
|
|
389
395
|
return {
|
|
390
|
-
executor: '@webpieces/
|
|
396
|
+
executor: '@webpieces/architecture-validators:validate-code',
|
|
391
397
|
cache: false, // Don't cache - depends on git state
|
|
392
398
|
inputs: ['default'],
|
|
393
399
|
// No options here - they come from targetDefaults at runtime
|
|
@@ -401,13 +407,23 @@ function createValidateVersionsLockedTarget() {
|
|
|
401
407
|
return {
|
|
402
408
|
executor: '@webpieces/dev-config:validate-versions-locked',
|
|
403
409
|
cache: true,
|
|
404
|
-
inputs: ['
|
|
410
|
+
inputs: ['{workspaceRoot}/**/package.json'],
|
|
405
411
|
metadata: {
|
|
406
412
|
technologies: ['nx'],
|
|
407
413
|
description: 'Validate package.json versions are locked (no semver ranges) and consistent across projects',
|
|
408
414
|
},
|
|
409
415
|
};
|
|
410
416
|
}
|
|
417
|
+
function createValidateTsInSrcTarget() {
|
|
418
|
+
return {
|
|
419
|
+
executor: '@webpieces/architecture-validators:validate-ts-in-src',
|
|
420
|
+
cache: false,
|
|
421
|
+
metadata: {
|
|
422
|
+
technologies: ['nx'],
|
|
423
|
+
description: 'Validate all .ts files in projects are inside the src/ directory',
|
|
424
|
+
},
|
|
425
|
+
};
|
|
426
|
+
}
|
|
411
427
|
function createValidateCompleteTarget(validationTargets) {
|
|
412
428
|
return {
|
|
413
429
|
executor: 'nx:noop',
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../../../../packages/tooling/dev-config/src/plugin.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Unified Nx Inference Plugin for @webpieces/dev-config\n *\n * This plugin automatically creates targets for:\n * 1. Workspace-level architecture validation (generate, visualize, validate-*)\n * 2. Per-project circular dependency checking\n *\n * Install with: nx add @webpieces/dev-config\n *\n * Usage:\n * Add to nx.json plugins array:\n * {\n * \"plugins\": [\"@webpieces/dev-config\"]\n * }\n *\n * Then all targets appear automatically without manual project.json configuration.\n */\n\nimport { dirname, join } from 'path';\nimport { existsSync } from 'fs';\nimport type {\n CreateNodesV2,\n CreateNodesContextV2,\n CreateNodesResultV2,\n CreateNodesResult,\n TargetConfiguration,\n} from '@nx/devkit';\n\n/**\n * Circular dependency checking options\n */\nexport interface CircularDepsOptions {\n enabled?: boolean;\n targetName?: string;\n excludePatterns?: string[];\n}\n\n/**\n * Validation options for architecture checks\n */\nexport interface ValidationOptions {\n noCycles?: boolean;\n noSkipLevelDeps?: boolean;\n architectureUnchanged?: boolean;\n validatePackageJson?: boolean;\n validateNewMethods?: boolean;\n validateModifiedMethods?: boolean;\n validateModifiedFiles?: boolean;\n validateVersionsLocked?: boolean;\n validateTsInSrc?: boolean;\n newMethodsMaxLines?: number;\n modifiedAndNewMethodsMaxLines?: number;\n modifiedFilesMaxLines?: number;\n /**\n * Validation mode for method/file size limits:\n * - STRICT: All limits enforced, disable comments ignored\n * - NORMAL: Limits enforced, disable comments with dates work\n * - OFF: Skip size validations entirely (for fast iteration)\n */\n validationMode?: 'STRICT' | 'NORMAL' | 'OFF';\n}\n\n/**\n * Feature flags for workspace targets\n */\nexport interface FeatureOptions {\n generate?: boolean;\n visualize?: boolean;\n}\n\n/**\n * Workspace-level configuration options\n */\nexport interface WorkspaceOptions {\n enabled?: boolean;\n targetPrefix?: string;\n graphPath?: string;\n validations?: ValidationOptions;\n features?: FeatureOptions;\n}\n\n/**\n * Configuration for @webpieces/dev-config Nx plugin\n */\nexport interface ArchitecturePluginOptions {\n circularDeps?: CircularDepsOptions;\n workspace?: WorkspaceOptions;\n}\n\nconst DEFAULT_OPTIONS: Required<ArchitecturePluginOptions> = {\n circularDeps: {\n enabled: true,\n targetName: 'validate-no-file-import-cycles',\n excludePatterns: [],\n },\n workspace: {\n enabled: true,\n targetPrefix: 'arch:',\n graphPath: 'architecture/dependencies.json',\n validations: {\n noCycles: true,\n noSkipLevelDeps: true,\n architectureUnchanged: true,\n validatePackageJson: true,\n validateNewMethods: true,\n validateModifiedMethods: true,\n validateModifiedFiles: true,\n validateVersionsLocked: true,\n validateTsInSrc: true,\n newMethodsMaxLines: 30,\n modifiedAndNewMethodsMaxLines: 80,\n modifiedFilesMaxLines: 900,\n validationMode: 'NORMAL',\n },\n features: {\n generate: true,\n visualize: true,\n },\n },\n};\n\nfunction normalizeOptions(\n options: ArchitecturePluginOptions | undefined,\n): Required<ArchitecturePluginOptions> {\n const circularDeps = {\n ...DEFAULT_OPTIONS.circularDeps,\n ...options?.circularDeps,\n };\n\n const workspace = {\n ...DEFAULT_OPTIONS.workspace,\n ...options?.workspace,\n validations: {\n ...DEFAULT_OPTIONS.workspace.validations,\n ...options?.workspace?.validations,\n },\n features: {\n ...DEFAULT_OPTIONS.workspace.features,\n ...options?.workspace?.features,\n },\n };\n\n return {\n circularDeps,\n workspace,\n } as Required<ArchitecturePluginOptions>;\n}\n\nasync function createNodesFunction(\n projectFiles: readonly string[],\n options: ArchitecturePluginOptions | undefined,\n context: CreateNodesContextV2,\n): Promise<CreateNodesResultV2> {\n const opts = normalizeOptions(options);\n const results: CreateNodesResultV2 = [];\n\n // Add workspace-level architecture targets\n addArchitectureProject(results, projectFiles, opts, context);\n\n // Add per-project targets (circular-deps, ci)\n addPerProjectTargets(results, projectFiles, opts, context);\n\n return results;\n}\n\nfunction addArchitectureProject(\n results: CreateNodesResultV2,\n projectFiles: readonly string[],\n opts: Required<ArchitecturePluginOptions>,\n context: CreateNodesContextV2,\n): void {\n if (!opts.workspace.enabled) return;\n\n const archDirPath = join(context.workspaceRoot, 'architecture');\n if (!existsSync(archDirPath)) return;\n\n const workspaceTargets = createWorkspaceTargetsWithoutPrefix(opts);\n if (Object.keys(workspaceTargets).length === 0) return;\n\n const result: CreateNodesResult = {\n projects: {\n architecture: {\n name: 'architecture',\n root: 'architecture',\n targets: workspaceTargets,\n },\n },\n };\n\n const firstProjectFile = projectFiles[0];\n if (firstProjectFile) {\n results.push([firstProjectFile, result] as const);\n }\n}\n\nfunction addPerProjectTargets(\n results: CreateNodesResultV2,\n projectFiles: readonly string[],\n opts: Required<ArchitecturePluginOptions>,\n context: CreateNodesContextV2,\n): void {\n // Track processed project roots to avoid duplicates when both files exist\n const processedRoots = new Set<string>();\n\n for (const projectFile of projectFiles) {\n const isProjectJson = projectFile.endsWith('project.json');\n const isPackageJson = projectFile.endsWith('package.json');\n\n if (!isProjectJson && !isPackageJson) continue;\n\n const projectRoot = dirname(projectFile);\n\n // Skip root (workspace manifest, not a project)\n if (projectRoot === '.') continue;\n\n // Skip if we've already processed this project root\n if (processedRoots.has(projectRoot)) continue;\n\n // For package.json, skip if project.json also exists in same directory\n // (prefer project.json - it will be processed separately)\n if (isPackageJson) {\n const projectJsonPath = join(context.workspaceRoot, projectRoot, 'project.json');\n if (existsSync(projectJsonPath)) continue;\n }\n\n processedRoots.add(projectRoot);\n\n const targets: Record<string, TargetConfiguration> = {};\n\n // Add circular-deps target ONLY for project.json projects\n // (package.json-only projects may not have TypeScript source)\n if (isProjectJson && opts.circularDeps.enabled) {\n if (!isExcluded(projectRoot, opts.circularDeps.excludePatterns!)) {\n const targetName = opts.circularDeps.targetName!;\n targets[targetName] = createCircularDepsTarget(projectRoot, targetName);\n }\n }\n\n // Add ci target to ALL projects (both project.json and package.json)\n targets['ci'] = createCiTarget();\n\n if (Object.keys(targets).length === 0) continue;\n\n const result: CreateNodesResult = {\n projects: {\n [projectRoot]: {\n targets,\n },\n },\n };\n\n results.push([projectFile, result] as const);\n }\n}\n\n/**\n * Nx V2 Inference Plugin\n * Matches project.json and package.json files to create targets\n */\nexport const createNodesV2: CreateNodesV2<ArchitecturePluginOptions> = [\n // Pattern to match project.json and package.json files\n '**/{project,package}.json',\n\n // Inference function\n createNodesFunction,\n];\n\n/**\n * Build list of enabled validation target names for validate-complete dependency chain\n */\nfunction buildValidationTargetsList(\n validations: Required<ArchitecturePluginOptions>['workspace']['validations'],\n): string[] {\n const targets: string[] = [];\n if (validations!.noCycles) targets.push('validate-no-architecture-cycles');\n if (validations!.architectureUnchanged) targets.push('validate-architecture-unchanged');\n if (validations!.noSkipLevelDeps) targets.push('validate-no-skiplevel-deps');\n if (validations!.validatePackageJson) targets.push('validate-packagejson');\n // Use combined validate-code instead of 3 separate targets\n if (\n validations!.validateNewMethods ||\n validations!.validateModifiedMethods ||\n validations!.validateModifiedFiles\n ) {\n targets.push('validate-code');\n }\n if (validations!.validateVersionsLocked) targets.push('validate-versions-locked');\n if (validations!.validateTsInSrc) targets.push('validate-ts-in-src');\n return targets;\n}\n\n/**\n * Create workspace-level architecture validation targets WITHOUT prefix\n * Used for virtual 'architecture' project\n */\nfunction createWorkspaceTargetsWithoutPrefix(\n opts: Required<ArchitecturePluginOptions>,\n): Record<string, TargetConfiguration> {\n const targets: Record<string, TargetConfiguration> = {};\n const graphPath = opts.workspace.graphPath!;\n const validations = opts.workspace.validations!;\n\n // Add help target (always available)\n targets['help'] = createHelpTarget();\n\n if (opts.workspace.features!.generate) {\n targets['generate'] = createGenerateTarget(graphPath);\n }\n if (opts.workspace.features!.visualize) {\n targets['visualize'] = createVisualizeTargetWithoutPrefix(graphPath);\n }\n if (validations.noCycles) {\n targets['validate-no-architecture-cycles'] = createValidateNoCyclesTarget();\n }\n if (validations.architectureUnchanged) {\n targets['validate-architecture-unchanged'] = createValidateUnchangedTarget(graphPath);\n }\n if (validations.noSkipLevelDeps) {\n targets['validate-no-skiplevel-deps'] = createValidateNoSkipLevelTarget();\n }\n if (validations.validatePackageJson) {\n targets['validate-packagejson'] = createValidatePackageJsonTarget();\n }\n // Use combined validate-code instead of 3 separate targets\n // Options come from targetDefaults in nx.json (applied at runtime, no cache issues)\n if (\n validations.validateNewMethods ||\n validations.validateModifiedMethods ||\n validations.validateModifiedFiles\n ) {\n targets['validate-code'] = createValidateCodeTarget();\n }\n if (validations.validateVersionsLocked) {\n targets['validate-versions-locked'] = createValidateVersionsLockedTarget();\n }\n if (validations.validateTsInSrc) {\n targets['validate-ts-in-src'] = createValidateTsInSrcTarget();\n }\n\n // Add validate-complete target that runs all enabled validations\n const validationTargets = buildValidationTargetsList(validations);\n if (validationTargets.length > 0) {\n targets['validate-complete'] = createValidateCompleteTarget(validationTargets);\n }\n\n return targets;\n}\n\n/**\n * Create workspace-level architecture validation targets (DEPRECATED - keeping for backward compat)\n * Used when root project.json exists (old style with '.' project)\n */\nfunction createWorkspaceTargets(\n opts: Required<ArchitecturePluginOptions>,\n): Record<string, TargetConfiguration> {\n const targets: Record<string, TargetConfiguration> = {};\n const prefix = opts.workspace.targetPrefix!;\n const graphPath = opts.workspace.graphPath!;\n\n // Add help target (always available)\n targets[`${prefix}help`] = createHelpTarget();\n\n if (opts.workspace.features!.generate) {\n targets[`${prefix}generate`] = createGenerateTarget(graphPath);\n }\n\n if (opts.workspace.features!.visualize) {\n targets[`${prefix}visualize`] = createVisualizeTarget(prefix, graphPath);\n }\n\n if (opts.workspace.validations!.noCycles) {\n targets[`${prefix}validate-no-architecture-cycles`] = createValidateNoCyclesTarget();\n }\n\n if (opts.workspace.validations!.architectureUnchanged) {\n targets[`${prefix}validate-architecture-unchanged`] =\n createValidateUnchangedTarget(graphPath);\n }\n\n if (opts.workspace.validations!.noSkipLevelDeps) {\n targets[`${prefix}validate-no-skiplevel-deps`] = createValidateNoSkipLevelTarget();\n }\n\n if (opts.workspace.validations!.validatePackageJson) {\n targets[`${prefix}validate-packagejson`] = createValidatePackageJsonTarget();\n }\n\n // Use combined validate-code instead of 3 separate targets\n // Options come from targetDefaults in nx.json (applied at runtime, no cache issues)\n if (\n opts.workspace.validations!.validateNewMethods ||\n opts.workspace.validations!.validateModifiedMethods ||\n opts.workspace.validations!.validateModifiedFiles\n ) {\n targets[`${prefix}validate-code`] = createValidateCodeTarget();\n }\n\n return targets;\n}\n\nfunction createGenerateTarget(graphPath: string): TargetConfiguration {\n return {\n executor: '@webpieces/architecture-validators:generate',\n cache: false,\n outputs: ['{workspaceRoot}/architecture/dependencies.json'],\n options: { graphPath },\n metadata: {\n technologies: ['nx'],\n description: 'Generate the architecture dependency graph from project.json files',\n },\n };\n}\n\nfunction createVisualizeTargetWithoutPrefix(graphPath: string): TargetConfiguration {\n return {\n executor: '@webpieces/architecture-validators:visualize',\n dependsOn: ['generate'],\n options: { graphPath },\n metadata: {\n technologies: ['nx'],\n description: 'Generate visual representations of the architecture graph',\n },\n };\n}\n\nfunction createVisualizeTarget(prefix: string, graphPath: string): TargetConfiguration {\n return {\n executor: '@webpieces/architecture-validators:visualize',\n dependsOn: [`${prefix}generate`],\n options: { graphPath },\n metadata: {\n technologies: ['nx'],\n description: 'Generate visual representations of the architecture graph',\n },\n };\n}\n\nfunction createValidateNoCyclesTarget(): TargetConfiguration {\n return {\n executor: '@webpieces/architecture-validators:validate-no-architecture-cycles',\n cache: true,\n inputs: ['{workspaceRoot}/**/project.json', '{workspaceRoot}/architecture/dependencies.json'],\n metadata: {\n technologies: ['nx'],\n description: 'Validate the architecture has no circular project dependencies',\n },\n };\n}\n\nfunction createValidateUnchangedTarget(graphPath: string): TargetConfiguration {\n return {\n executor: '@webpieces/architecture-validators:validate-architecture-unchanged',\n cache: false,\n inputs: ['default', '{workspaceRoot}/architecture/dependencies.json'],\n options: { graphPath },\n metadata: {\n technologies: ['nx'],\n description: 'Validate the architecture matches the saved blessed graph',\n },\n };\n}\n\nfunction createValidateNoSkipLevelTarget(): TargetConfiguration {\n return {\n executor: '@webpieces/architecture-validators:validate-no-skiplevel-deps',\n cache: true,\n inputs: ['{workspaceRoot}/**/project.json', '{workspaceRoot}/architecture/dependencies.json'],\n metadata: {\n technologies: ['nx'],\n description: 'Validate no project has redundant transitive dependencies',\n },\n };\n}\n\nfunction createValidatePackageJsonTarget(): TargetConfiguration {\n return {\n executor: '@webpieces/architecture-validators:validate-packagejson',\n cache: true,\n inputs: ['{workspaceRoot}/**/project.json', '{workspaceRoot}/**/package.json'],\n metadata: {\n technologies: ['nx'],\n description: 'Validate package.json dependencies match project.json build dependencies',\n },\n };\n}\n\nfunction createValidateNewMethodsTarget(\n maxLines: number,\n mode: 'STRICT' | 'NORMAL' | 'OFF',\n): TargetConfiguration {\n return {\n executor: '@webpieces/architecture-validators:validate-new-methods',\n cache: false, // Don't cache - depends on git state\n inputs: ['default'],\n options: { max: maxLines, mode },\n metadata: {\n technologies: ['nx'],\n description: `Validate new methods do not exceed ${maxLines} lines (only runs in affected mode)`,\n },\n };\n}\n\nfunction createValidateModifiedMethodsTarget(\n maxLines: number,\n mode: 'STRICT' | 'NORMAL' | 'OFF',\n): TargetConfiguration {\n return {\n executor: '@webpieces/architecture-validators:validate-modified-methods',\n cache: false, // Don't cache - depends on git state\n inputs: ['default'],\n options: { max: maxLines, mode },\n metadata: {\n technologies: ['nx'],\n description: `Validate new and modified methods do not exceed ${maxLines} lines (encourages gradual cleanup)`,\n },\n };\n}\n\nfunction createValidateModifiedFilesTarget(\n maxLines: number,\n mode: 'STRICT' | 'NORMAL' | 'OFF',\n): TargetConfiguration {\n return {\n executor: '@webpieces/architecture-validators:validate-modified-files',\n cache: false, // Don't cache - depends on git state\n inputs: ['default'],\n options: { max: maxLines, mode },\n metadata: {\n technologies: ['nx'],\n description: `Validate modified files do not exceed ${maxLines} lines (encourages keeping files small)`,\n },\n };\n}\n\n/**\n * Create combined validate-code target\n * Options come from targetDefaults in nx.json (applied at runtime, no cache issues)\n */\nfunction createValidateCodeTarget(): TargetConfiguration {\n return {\n executor: '@webpieces/architecture-validators:validate-code',\n cache: false, // Don't cache - depends on git state\n inputs: ['default'],\n // No options here - they come from targetDefaults at runtime\n metadata: {\n technologies: ['nx'],\n description: 'Combined validation for new methods, modified methods, and file sizes',\n },\n };\n}\n\nfunction createValidateVersionsLockedTarget(): TargetConfiguration {\n return {\n executor: '@webpieces/dev-config:validate-versions-locked',\n cache: true,\n inputs: ['{workspaceRoot}/**/package.json'],\n metadata: {\n technologies: ['nx'],\n description:\n 'Validate package.json versions are locked (no semver ranges) and consistent across projects',\n },\n };\n}\n\nfunction createValidateTsInSrcTarget(): TargetConfiguration {\n return {\n executor: '@webpieces/architecture-validators:validate-ts-in-src',\n cache: false,\n metadata: {\n technologies: ['nx'],\n description: 'Validate all .ts files in projects are inside the src/ directory',\n },\n };\n}\n\nfunction createValidateCompleteTarget(validationTargets: string[]): TargetConfiguration {\n return {\n executor: 'nx:noop',\n cache: true,\n dependsOn: validationTargets,\n metadata: {\n technologies: ['nx'],\n description: 'Run all architecture validations (cycles, unchanged, skip-level deps)',\n },\n };\n}\n\n/**\n * Create per-project ci target - Gradle-style composite target\n * Runs lint, build, and test in parallel\n * (with test depending on build via targetDefaults)\n *\n * NOTE: Type checking is done by the build target (@nx/js:tsc) during compilation.\n */\nfunction createCiTarget(): TargetConfiguration {\n return {\n executor: 'nx:noop',\n cache: true,\n dependsOn: ['lint', 'build', 'test'],\n metadata: {\n technologies: ['nx'],\n description: 'Run all CI checks: lint, build, and test (Gradle-style composite target)',\n },\n };\n}\n\nfunction createHelpTarget(): TargetConfiguration {\n return {\n executor: '@webpieces/dev-config:help',\n cache: false, // Never cache - always show help output\n metadata: {\n technologies: ['nx'],\n description: 'Display help for @webpieces/dev-config commands and targets',\n },\n };\n}\n\n/**\n * Create per-project circular dependency checking target\n * Runs on project root (.) to check ALL TypeScript files in the project\n */\nfunction createCircularDepsTarget(projectRoot: string, targetName: string): TargetConfiguration {\n return {\n executor: 'nx:run-commands',\n cache: true,\n inputs: ['default'],\n outputs: [] as string[],\n options: {\n command: 'npx madge --circular --extensions ts,tsx .',\n cwd: projectRoot,\n },\n metadata: {\n technologies: ['madge'],\n description: 'Check for circular dependencies using madge',\n },\n };\n}\n\n/**\n * Check if a project should be excluded based on patterns\n */\nfunction isExcluded(projectRoot: string, excludePatterns: string[]): boolean {\n if (excludePatterns.length === 0) {\n return false;\n }\n\n // Simple glob matching (could be enhanced with minimatch if needed)\n return excludePatterns.some((pattern) => {\n // Convert glob pattern to regex\n const regexPattern = pattern\n .replace(/\\*\\*/g, '.*') // ** matches any path\n .replace(/\\*/g, '[^/]*'); // * matches any string except /\n\n const regex = new RegExp(`^${regexPattern}$`);\n return regex.test(projectRoot);\n });\n}\n\n/**\n * Export plugin as default for Nx\n */\nexport default { createNodesV2 };\n"]}
|
package/src/toError.d.ts
ADDED
package/src/toError.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toError = toError;
|
|
4
|
+
/**
|
|
5
|
+
* Lightweight duplicate of @webpieces/core-util toError for use in dev-config.
|
|
6
|
+
* dev-config is Level 0 and cannot depend on core-util (also Level 0).
|
|
7
|
+
*/
|
|
8
|
+
// webpieces-disable no-any-unknown -- toError intentionally accepts unknown to safely convert any thrown value to Error
|
|
9
|
+
function toError(err) {
|
|
10
|
+
if (err instanceof Error) {
|
|
11
|
+
return err;
|
|
12
|
+
}
|
|
13
|
+
if (err && typeof err === 'object') {
|
|
14
|
+
if ('message' in err) {
|
|
15
|
+
const error = new Error(String(err.message));
|
|
16
|
+
if ('stack' in err && typeof err.stack === 'string') {
|
|
17
|
+
error.stack = err.stack;
|
|
18
|
+
}
|
|
19
|
+
if ('name' in err && typeof err.name === 'string') {
|
|
20
|
+
error.name = err.name;
|
|
21
|
+
}
|
|
22
|
+
return error;
|
|
23
|
+
}
|
|
24
|
+
// eslint-disable-next-line @webpieces/no-unmanaged-exceptions -- must handle circular references without recursion
|
|
25
|
+
try {
|
|
26
|
+
return new Error(`Non-Error object thrown: ${JSON.stringify(err)}`);
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
//const error = toError(err);
|
|
30
|
+
void err;
|
|
31
|
+
return new Error('Non-Error object thrown (unable to stringify)');
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
const message = err == null ? 'Null or undefined thrown' : String(err);
|
|
35
|
+
return new Error(message);
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=toError.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toError.js","sourceRoot":"","sources":["../../../../../packages/tooling/dev-config/src/toError.ts"],"names":[],"mappings":";;AAKA,0BA8BC;AAnCD;;;GAGG;AACH,wHAAwH;AACxH,SAAgB,OAAO,CAAC,GAAY;IAChC,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;QACvB,OAAO,GAAG,CAAC;IACf,CAAC;IAED,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACjC,IAAI,SAAS,IAAI,GAAG,EAAE,CAAC;YACnB,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;YAE7C,IAAI,OAAO,IAAI,GAAG,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAClD,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;YAC5B,CAAC;YACD,IAAI,MAAM,IAAI,GAAG,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAChD,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;YAC1B,CAAC;YACD,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,mHAAmH;QACnH,IAAI,CAAC;YACD,OAAO,IAAI,KAAK,CAAC,4BAA4B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACxE,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACpB,6BAA6B;YAC7B,KAAK,GAAG,CAAC;YACT,OAAO,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACtE,CAAC;IACL,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACvE,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;AAC9B,CAAC","sourcesContent":["/**\n * Lightweight duplicate of @webpieces/core-util toError for use in dev-config.\n * dev-config is Level 0 and cannot depend on core-util (also Level 0).\n */\n// webpieces-disable no-any-unknown -- toError intentionally accepts unknown to safely convert any thrown value to Error\nexport function toError(err: unknown): Error {\n if (err instanceof Error) {\n return err;\n }\n\n if (err && typeof err === 'object') {\n if ('message' in err) {\n const error = new Error(String(err.message));\n\n if ('stack' in err && typeof err.stack === 'string') {\n error.stack = err.stack;\n }\n if ('name' in err && typeof err.name === 'string') {\n error.name = err.name;\n }\n return error;\n }\n\n // eslint-disable-next-line @webpieces/no-unmanaged-exceptions -- must handle circular references without recursion\n try {\n return new Error(`Non-Error object thrown: ${JSON.stringify(err)}`);\n } catch (err: unknown) {\n //const error = toError(err);\n void err;\n return new Error('Non-Error object thrown (unable to stringify)');\n }\n }\n\n const message = err == null ? 'Null or undefined thrown' : String(err);\n return new Error(message);\n}\n"]}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
// Only includes @webpieces custom rules
|
|
8
8
|
// Configure your own TypeScript and general rules in your main eslint.config.mjs as needed
|
|
9
9
|
|
|
10
|
-
import webpiecesPlugin from '@webpieces/
|
|
10
|
+
import webpiecesPlugin from '@webpieces/eslint-plugin';
|
|
11
11
|
|
|
12
12
|
export default [
|
|
13
13
|
{
|
|
@@ -52,7 +52,7 @@ Without traceId in errors:
|
|
|
52
52
|
// BAD: Catching just to rethrow without adding value
|
|
53
53
|
try {
|
|
54
54
|
await operation();
|
|
55
|
-
} catch (err:
|
|
55
|
+
} catch (err: unknown) {
|
|
56
56
|
const error = toError(err);
|
|
57
57
|
console.error('Failed:', error);
|
|
58
58
|
throw error; // No new info added - why catch?
|
|
@@ -70,7 +70,7 @@ The key question: Are you adding meaningful information or context? If yes, it m
|
|
|
70
70
|
// BAD: "I don't want to deal with this error"
|
|
71
71
|
try {
|
|
72
72
|
await riskyOperation();
|
|
73
|
-
} catch (err:
|
|
73
|
+
} catch (err: unknown) {
|
|
74
74
|
// Silence...
|
|
75
75
|
}
|
|
76
76
|
```
|
|
@@ -116,7 +116,7 @@ TraceId (also called correlation ID, request ID) ties these together.
|
|
|
116
116
|
- Is it adding context to the error before rethrowing? → May be valid (see Problem 3)
|
|
117
117
|
|
|
118
118
|
3. **IF REMOVING** the try-catch block:
|
|
119
|
-
- Delete the `try {` and `} catch (err:
|
|
119
|
+
- Delete the `try {` and `} catch (err: unknown) { ... }` wrapper
|
|
120
120
|
- Let the code execute normally
|
|
121
121
|
- Errors will bubble to global handler automatically
|
|
122
122
|
|
|
@@ -159,7 +159,7 @@ export class WebpiecesMiddleware {
|
|
|
159
159
|
// Await catches BOTH sync throws AND rejected promises
|
|
160
160
|
await next();
|
|
161
161
|
console.log('[GlobalErrorHandler] Request END (success)');
|
|
162
|
-
} catch (err:
|
|
162
|
+
} catch (err: unknown) {
|
|
163
163
|
const error = toError(err);
|
|
164
164
|
const traceId = RequestContext.get<string>('TRACE_ID');
|
|
165
165
|
|
|
@@ -279,7 +279,7 @@ async function processOrder(order: Order): Promise<void> {
|
|
|
279
279
|
try {
|
|
280
280
|
await validateOrder(order);
|
|
281
281
|
await saveToDatabase(order);
|
|
282
|
-
} catch (err:
|
|
282
|
+
} catch (err: unknown) {
|
|
283
283
|
// Error disappears into void - debugging nightmare!
|
|
284
284
|
console.log('Order processing failed');
|
|
285
285
|
}
|
|
@@ -300,7 +300,7 @@ async function fetchUserData(userId: string): Promise<User> {
|
|
|
300
300
|
try {
|
|
301
301
|
const response = await fetch(`/api/users/${userId}`);
|
|
302
302
|
return await response.json();
|
|
303
|
-
} catch (err:
|
|
303
|
+
} catch (err: unknown) {
|
|
304
304
|
const error = toError(err);
|
|
305
305
|
// Custom message without traceId
|
|
306
306
|
throw new Error(`Failed to fetch user ${userId}: ${error.message}`);
|
|
@@ -336,7 +336,7 @@ async function processOrder(order: Order): Promise<void> {
|
|
|
336
336
|
```typescript
|
|
337
337
|
// GOOD: Global handler has full context
|
|
338
338
|
// In WebpiecesMiddleware.globalErrorHandler (see Pattern 1 above)
|
|
339
|
-
catch (err:
|
|
339
|
+
catch (err: unknown) {
|
|
340
340
|
const error = toError(err);
|
|
341
341
|
const traceId = RequestContext.get<string>('TRACE_ID');
|
|
342
342
|
|
|
@@ -367,7 +367,7 @@ async function callVendorApiWithRetry(request: VendorRequest): Promise<VendorRes
|
|
|
367
367
|
for (let i = 0; i < maxRetries; i++) {
|
|
368
368
|
try {
|
|
369
369
|
return await vendorApi.call(request);
|
|
370
|
-
} catch (err:
|
|
370
|
+
} catch (err: unknown) {
|
|
371
371
|
const error = toError(err);
|
|
372
372
|
lastError = error;
|
|
373
373
|
console.warn(`Retry ${i + 1}/${maxRetries} failed:`, error.message);
|
|
@@ -404,7 +404,7 @@ async function processBatch(items: Item[]): Promise<BatchResult> {
|
|
|
404
404
|
try {
|
|
405
405
|
const result = await processItem(item);
|
|
406
406
|
results.push(result);
|
|
407
|
-
} catch (err:
|
|
407
|
+
} catch (err: unknown) {
|
|
408
408
|
const error = toError(err);
|
|
409
409
|
// Log individual error with traceId
|
|
410
410
|
console.error(`[Batch] Item ${item.id} failed (traceId: ${traceId}):`, error);
|
|
@@ -436,7 +436,7 @@ async function processBatch(items: Item[]): Promise<BatchResult> {
|
|
|
436
436
|
async function saveUser(user: User): Promise<void> {
|
|
437
437
|
try {
|
|
438
438
|
await userRepository.save(user); // Internal call, not edge
|
|
439
|
-
} catch (err:
|
|
439
|
+
} catch (err: unknown) {
|
|
440
440
|
const error = toError(err);
|
|
441
441
|
console.error('Save failed:', error);
|
|
442
442
|
throw error; // No value added - why catch?
|
|
@@ -460,7 +460,7 @@ async function saveUserToDb(user: User): Promise<void> {
|
|
|
460
460
|
logRequest('[DB] Saving user', { traceId, userId: user.id });
|
|
461
461
|
await externalDbClient.save('users', user); // EDGE: external service
|
|
462
462
|
logSuccess('[DB] User saved', { traceId, userId: user.id });
|
|
463
|
-
} catch (err:
|
|
463
|
+
} catch (err: unknown) {
|
|
464
464
|
const error = toError(err);
|
|
465
465
|
logFailure('[DB] Save failed', { traceId, userId: user.id, error: error.message });
|
|
466
466
|
throw error; // Rethrow - logging value at the edge
|
|
@@ -505,7 +505,7 @@ app.use(async (req, res, next) => {
|
|
|
505
505
|
|
|
506
506
|
try {
|
|
507
507
|
await next();
|
|
508
|
-
} catch (err:
|
|
508
|
+
} catch (err: unknown) {
|
|
509
509
|
const error = toError(err);
|
|
510
510
|
// Report to Sentry/observability
|
|
511
511
|
Sentry.captureException(error, { extra: { traceId } });
|
|
@@ -557,7 +557,7 @@ export class GlobalErrorHandler implements ErrorHandler {
|
|
|
557
557
|
vendorSdk.on('event', async (data) => {
|
|
558
558
|
try {
|
|
559
559
|
await processVendorEvent(data);
|
|
560
|
-
} catch (err:
|
|
560
|
+
} catch (err: unknown) {
|
|
561
561
|
const error = toError(err);
|
|
562
562
|
const traceId = RequestContext.get<string>('TRACE_ID');
|
|
563
563
|
Sentry.captureException(error, { extra: { traceId, vendorData: data } });
|
|
@@ -585,7 +585,7 @@ async function sendMail(request: MailRequest): Promise<MailResponse> {
|
|
|
585
585
|
const response = await emailService.send(request);
|
|
586
586
|
logSuccess('[Email] Sent', { traceId, messageId: response.messageId });
|
|
587
587
|
return response;
|
|
588
|
-
} catch (err:
|
|
588
|
+
} catch (err: unknown) {
|
|
589
589
|
const error = toError(err);
|
|
590
590
|
logFailure('[Email] Failed', { traceId, error: error.message, to: request.to });
|
|
591
591
|
throw error; // Rethrow - adds logging value at the edge
|
|
@@ -626,7 +626,7 @@ async submitForm(): Promise<void> {
|
|
|
626
626
|
try {
|
|
627
627
|
await this.apiClient.saveData(this.formData);
|
|
628
628
|
this.router.navigate(['/success']);
|
|
629
|
-
} catch (err:
|
|
629
|
+
} catch (err: unknown) {
|
|
630
630
|
const error = toError(err);
|
|
631
631
|
|
|
632
632
|
if (error instanceof HttpUserError) {
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Shared diff utility functions for executor validators.
|
|
3
|
-
* These are used by multiple executors for git diff parsing and line-level detection.
|
|
4
|
-
*/
|
|
5
|
-
/**
|
|
6
|
-
* Get the diff content for a specific file.
|
|
7
|
-
*/
|
|
8
|
-
export declare function getFileDiff(workspaceRoot: string, file: string, base: string, head?: string): string;
|
|
9
|
-
/**
|
|
10
|
-
* Parse diff to extract changed line numbers (additions only - lines starting with +).
|
|
11
|
-
*/
|
|
12
|
-
export declare function getChangedLineNumbers(diffContent: string): Set<number>;
|
|
13
|
-
/**
|
|
14
|
-
* Parse diff to find newly added method signatures.
|
|
15
|
-
*/
|
|
16
|
-
export declare function findNewMethodSignaturesInDiff(diffContent: string): Set<string>;
|
|
17
|
-
/**
|
|
18
|
-
* Check if any line in [startLine, endLine] is in the changedLines set.
|
|
19
|
-
*/
|
|
20
|
-
export declare function hasChangesInRange(startLine: number, endLine: number, changedLines: Set<number>): boolean;
|
|
21
|
-
/**
|
|
22
|
-
* Check if a node (method or function) is new or has changed lines in its range.
|
|
23
|
-
*/
|
|
24
|
-
export declare function isNewOrModified(name: string, startLine: number, endLine: number, changedLines: Set<number>, newMethodNames: Set<string>): boolean;
|
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Shared diff utility functions for executor validators.
|
|
4
|
-
* These are used by multiple executors for git diff parsing and line-level detection.
|
|
5
|
-
*/
|
|
6
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.getFileDiff = getFileDiff;
|
|
8
|
-
exports.getChangedLineNumbers = getChangedLineNumbers;
|
|
9
|
-
exports.findNewMethodSignaturesInDiff = findNewMethodSignaturesInDiff;
|
|
10
|
-
exports.hasChangesInRange = hasChangesInRange;
|
|
11
|
-
exports.isNewOrModified = isNewOrModified;
|
|
12
|
-
const tslib_1 = require("tslib");
|
|
13
|
-
const child_process_1 = require("child_process");
|
|
14
|
-
const fs = tslib_1.__importStar(require("fs"));
|
|
15
|
-
const path = tslib_1.__importStar(require("path"));
|
|
16
|
-
/**
|
|
17
|
-
* Get the diff content for a specific file.
|
|
18
|
-
*/
|
|
19
|
-
function getFileDiff(workspaceRoot, file, base, head) {
|
|
20
|
-
try {
|
|
21
|
-
const diffTarget = head ? `${base} ${head}` : base;
|
|
22
|
-
const diff = (0, child_process_1.execSync)(`git diff ${diffTarget} -- "${file}"`, {
|
|
23
|
-
cwd: workspaceRoot,
|
|
24
|
-
encoding: 'utf-8',
|
|
25
|
-
});
|
|
26
|
-
if (!diff && !head) {
|
|
27
|
-
const fullPath = path.join(workspaceRoot, file);
|
|
28
|
-
if (fs.existsSync(fullPath)) {
|
|
29
|
-
const isUntracked = (0, child_process_1.execSync)(`git ls-files --others --exclude-standard "${file}"`, {
|
|
30
|
-
cwd: workspaceRoot,
|
|
31
|
-
encoding: 'utf-8',
|
|
32
|
-
}).trim();
|
|
33
|
-
if (isUntracked) {
|
|
34
|
-
const content = fs.readFileSync(fullPath, 'utf-8');
|
|
35
|
-
const lines = content.split('\n');
|
|
36
|
-
return lines.map((line) => `+${line}`).join('\n');
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
return diff;
|
|
41
|
-
}
|
|
42
|
-
catch {
|
|
43
|
-
return '';
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Parse diff to extract changed line numbers (additions only - lines starting with +).
|
|
48
|
-
*/
|
|
49
|
-
function getChangedLineNumbers(diffContent) {
|
|
50
|
-
const changedLines = new Set();
|
|
51
|
-
const lines = diffContent.split('\n');
|
|
52
|
-
let currentLine = 0;
|
|
53
|
-
for (const line of lines) {
|
|
54
|
-
const hunkMatch = line.match(/^@@ -\d+(?:,\d+)? \+(\d+)(?:,\d+)? @@/);
|
|
55
|
-
if (hunkMatch) {
|
|
56
|
-
currentLine = parseInt(hunkMatch[1], 10);
|
|
57
|
-
continue;
|
|
58
|
-
}
|
|
59
|
-
if (line.startsWith('+') && !line.startsWith('+++')) {
|
|
60
|
-
changedLines.add(currentLine);
|
|
61
|
-
currentLine++;
|
|
62
|
-
}
|
|
63
|
-
else if (line.startsWith('-') && !line.startsWith('---')) {
|
|
64
|
-
// Deletions don't increment line number
|
|
65
|
-
}
|
|
66
|
-
else {
|
|
67
|
-
currentLine++;
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
return changedLines;
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Parse diff to find newly added method signatures.
|
|
74
|
-
*/
|
|
75
|
-
function findNewMethodSignaturesInDiff(diffContent) {
|
|
76
|
-
const newMethods = new Set();
|
|
77
|
-
const lines = diffContent.split('\n');
|
|
78
|
-
const patterns = [
|
|
79
|
-
/^\+\s*(?:export\s+)?(?:async\s+)?function\s+(\w+)\s*\(/,
|
|
80
|
-
/^\+\s*(?:export\s+)?(?:const|let)\s+(\w+)\s*=\s*(?:async\s*)?\(/,
|
|
81
|
-
/^\+\s*(?:export\s+)?(?:const|let)\s+(\w+)\s*=\s*(?:async\s+)?function/,
|
|
82
|
-
/^\+\s*(?:(?:public|private|protected)\s+)?(?:static\s+)?(?:async\s+)?(\w+)\s*\(/,
|
|
83
|
-
];
|
|
84
|
-
for (const line of lines) {
|
|
85
|
-
if (line.startsWith('+') && !line.startsWith('+++')) {
|
|
86
|
-
for (const pattern of patterns) {
|
|
87
|
-
const match = line.match(pattern);
|
|
88
|
-
if (match) {
|
|
89
|
-
const methodName = match[1];
|
|
90
|
-
if (methodName && !['if', 'for', 'while', 'switch', 'catch', 'constructor'].includes(methodName)) {
|
|
91
|
-
newMethods.add(methodName);
|
|
92
|
-
}
|
|
93
|
-
break;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
return newMethods;
|
|
99
|
-
}
|
|
100
|
-
/**
|
|
101
|
-
* Check if any line in [startLine, endLine] is in the changedLines set.
|
|
102
|
-
*/
|
|
103
|
-
function hasChangesInRange(startLine, endLine, changedLines) {
|
|
104
|
-
for (let line = startLine; line <= endLine; line++) {
|
|
105
|
-
if (changedLines.has(line)) {
|
|
106
|
-
return true;
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
return false;
|
|
110
|
-
}
|
|
111
|
-
/**
|
|
112
|
-
* Check if a node (method or function) is new or has changed lines in its range.
|
|
113
|
-
*/
|
|
114
|
-
function isNewOrModified(name, startLine, endLine, changedLines, newMethodNames) {
|
|
115
|
-
if (newMethodNames.has(name))
|
|
116
|
-
return true;
|
|
117
|
-
return hasChangesInRange(startLine, endLine, changedLines);
|
|
118
|
-
}
|
|
119
|
-
//# sourceMappingURL=diff-utils.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"diff-utils.js","sourceRoot":"","sources":["../../../../../../packages/tooling/dev-config/architecture/executors/diff-utils.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Shared diff utility functions for executor validators.\n * These are used by multiple executors for git diff parsing and line-level detection.\n */\n\nimport { execSync } from 'child_process';\nimport * as fs from 'fs';\nimport * as path from 'path';\n\n/**\n * Get the diff content for a specific file.\n */\nexport function getFileDiff(workspaceRoot: string, file: string, base: string, head?: string): string {\n try {\n const diffTarget = head ? `${base} ${head}` : base;\n const diff = execSync(`git diff ${diffTarget} -- \"${file}\"`, {\n cwd: workspaceRoot,\n encoding: 'utf-8',\n });\n\n if (!diff && !head) {\n const fullPath = path.join(workspaceRoot, file);\n if (fs.existsSync(fullPath)) {\n const isUntracked = execSync(`git ls-files --others --exclude-standard \"${file}\"`, {\n cwd: workspaceRoot,\n encoding: 'utf-8',\n }).trim();\n\n if (isUntracked) {\n const content = fs.readFileSync(fullPath, 'utf-8');\n const lines = content.split('\\n');\n return lines.map((line) => `+${line}`).join('\\n');\n }\n }\n }\n\n return diff;\n } catch {\n return '';\n }\n}\n\n/**\n * Parse diff to extract changed line numbers (additions only - lines starting with +).\n */\nexport function getChangedLineNumbers(diffContent: string): Set<number> {\n const changedLines = new Set<number>();\n const lines = diffContent.split('\\n');\n let currentLine = 0;\n\n for (const line of lines) {\n const hunkMatch = line.match(/^@@ -\\d+(?:,\\d+)? \\+(\\d+)(?:,\\d+)? @@/);\n if (hunkMatch) {\n currentLine = parseInt(hunkMatch[1], 10);\n continue;\n }\n\n if (line.startsWith('+') && !line.startsWith('+++')) {\n changedLines.add(currentLine);\n currentLine++;\n } else if (line.startsWith('-') && !line.startsWith('---')) {\n // Deletions don't increment line number\n } else {\n currentLine++;\n }\n }\n\n return changedLines;\n}\n\n/**\n * Parse diff to find newly added method signatures.\n */\nexport function findNewMethodSignaturesInDiff(diffContent: string): Set<string> {\n const newMethods = new Set<string>();\n const lines = diffContent.split('\\n');\n\n const patterns = [\n /^\\+\\s*(?:export\\s+)?(?:async\\s+)?function\\s+(\\w+)\\s*\\(/,\n /^\\+\\s*(?:export\\s+)?(?:const|let)\\s+(\\w+)\\s*=\\s*(?:async\\s*)?\\(/,\n /^\\+\\s*(?:export\\s+)?(?:const|let)\\s+(\\w+)\\s*=\\s*(?:async\\s+)?function/,\n /^\\+\\s*(?:(?:public|private|protected)\\s+)?(?:static\\s+)?(?:async\\s+)?(\\w+)\\s*\\(/,\n ];\n\n for (const line of lines) {\n if (line.startsWith('+') && !line.startsWith('+++')) {\n for (const pattern of patterns) {\n const match = line.match(pattern);\n if (match) {\n const methodName = match[1];\n if (methodName && !['if', 'for', 'while', 'switch', 'catch', 'constructor'].includes(methodName)) {\n newMethods.add(methodName);\n }\n break;\n }\n }\n }\n }\n\n return newMethods;\n}\n\n/**\n * Check if any line in [startLine, endLine] is in the changedLines set.\n */\nexport function hasChangesInRange(startLine: number, endLine: number, changedLines: Set<number>): boolean {\n for (let line = startLine; line <= endLine; line++) {\n if (changedLines.has(line)) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Check if a node (method or function) is new or has changed lines in its range.\n */\nexport function isNewOrModified(\n name: string,\n startLine: number,\n endLine: number,\n changedLines: Set<number>,\n newMethodNames: Set<string>\n): boolean {\n if (newMethodNames.has(name)) return true;\n return hasChangesInRange(startLine, endLine, changedLines);\n}\n"]}
|