dependency-cruiser 17.3.2 → 17.3.3-beta-2
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/bin/depcruise-baseline.mjs +43 -43
- package/bin/depcruise-fmt.mjs +89 -89
- package/bin/dependency-cruise.mjs +171 -171
- package/configs/plugins/3d-reporter-plugin.mjs +36 -36
- package/configs/plugins/stats-reporter-plugin.mjs +51 -51
- package/configs/recommended-strict.cjs +5 -5
- package/configs/recommended-warn-only.cjs +5 -5
- package/configs/recommended.cjs +22 -22
- package/configs/rules/no-circular.cjs +10 -10
- package/configs/rules/no-deprecated-core.cjs +10 -10
- package/configs/rules/no-duplicate-dependency-types.cjs +17 -17
- package/configs/rules/no-non-package-json.cjs +11 -11
- package/configs/rules/no-orphans.cjs +18 -18
- package/configs/rules/not-to-deprecated.cjs +10 -10
- package/configs/rules/not-to-unresolvable.cjs +10 -10
- package/package.json +170 -170
- package/src/cache/cache.mjs +139 -139
- package/src/cache/content-strategy.mjs +88 -88
- package/src/cache/find-content-changes.mjs +58 -58
- package/src/cache/helpers.mjs +52 -52
- package/src/cache/metadata-strategy.mjs +83 -83
- package/src/cache/options-compatible.mjs +56 -109
- package/src/cli/assert-node-environment-suitable.mjs +7 -7
- package/src/cli/defaults.mjs +5 -5
- package/src/cli/format-meta-info.mjs +22 -22
- package/src/cli/format.mjs +28 -28
- package/src/cli/index.mjs +145 -145
- package/src/cli/init-config/build-config.mjs +94 -94
- package/src/cli/init-config/environment-helpers.mjs +77 -77
- package/src/cli/init-config/find-extensions.mjs +27 -27
- package/src/cli/init-config/get-user-input.mjs +151 -151
- package/src/cli/init-config/index.mjs +88 -88
- package/src/cli/init-config/normalize-init-options.mjs +47 -47
- package/src/cli/init-config/utl.mjs +4 -4
- package/src/cli/init-config/validators.mjs +10 -10
- package/src/cli/init-config/write-config.mjs +21 -21
- package/src/cli/init-config/write-run-scripts-to-manifest.mjs +103 -107
- package/src/cli/listeners/cli-feedback.mjs +49 -49
- package/src/cli/listeners/ndjson.mjs +66 -66
- package/src/cli/listeners/performance-log/format-helpers.mjs +63 -63
- package/src/cli/listeners/performance-log/handlers.mjs +56 -56
- package/src/cli/listeners/performance-log/index.mjs +37 -37
- package/src/cli/normalize-cli-options.mjs +182 -182
- package/src/cli/tools/wrap-stream-in-html.mjs +37 -37
- package/src/cli/utl/assert-file-existence.mjs +7 -7
- package/src/cli/utl/io.mjs +28 -31
- package/src/config-utl/extract-babel-config.mjs +69 -69
- package/src/config-utl/extract-depcruise-config/index.mjs +54 -54
- package/src/config-utl/extract-depcruise-config/merge-configs.mjs +63 -63
- package/src/config-utl/extract-depcruise-config/read-config.mjs +9 -9
- package/src/config-utl/extract-depcruise-options.mjs +9 -9
- package/src/config-utl/extract-known-violations.mjs +49 -49
- package/src/config-utl/extract-ts-config.mjs +46 -48
- package/src/config-utl/extract-webpack-resolve-config.mjs +88 -88
- package/src/config-utl/make-absolute.mjs +5 -5
- package/src/enrich/add-validations.mjs +13 -13
- package/src/enrich/derive/circular.mjs +49 -49
- package/src/enrich/derive/dependents.mjs +27 -27
- package/src/enrich/derive/folders/aggregate-to-folders.mjs +104 -104
- package/src/enrich/derive/folders/index.mjs +19 -19
- package/src/enrich/derive/folders/utl.mjs +18 -18
- package/src/enrich/derive/metrics/get-module-metrics.mjs +27 -27
- package/src/enrich/derive/metrics/index.mjs +8 -8
- package/src/enrich/derive/module-utl.mjs +18 -18
- package/src/enrich/derive/orphan/index.mjs +18 -18
- package/src/enrich/derive/orphan/is-orphan.mjs +9 -9
- package/src/enrich/derive/reachable.mjs +165 -168
- package/src/enrich/enrich-modules.mjs +25 -25
- package/src/enrich/index.mjs +15 -15
- package/src/enrich/soften-known-violations.mjs +90 -90
- package/src/enrich/summarize/add-rule-set-used.mjs +13 -13
- package/src/enrich/summarize/get-stats.mjs +17 -17
- package/src/enrich/summarize/index.mjs +18 -18
- package/src/enrich/summarize/is-same-violation.mjs +30 -30
- package/src/enrich/summarize/summarize-folders.mjs +35 -35
- package/src/enrich/summarize/summarize-modules.mjs +97 -97
- package/src/enrich/summarize/summarize-options.mjs +71 -71
- package/src/extract/acorn/estree-helpers.mjs +66 -66
- package/src/extract/acorn/extract-amd-deps.mjs +63 -64
- package/src/extract/acorn/extract-cjs-deps.mjs +83 -83
- package/src/extract/acorn/extract-es6-deps.mjs +54 -54
- package/src/extract/acorn/extract-stats.mjs +4 -4
- package/src/extract/acorn/extract.mjs +28 -28
- package/src/extract/acorn/parse.mjs +37 -37
- package/src/extract/clear-caches.mjs +7 -7
- package/src/extract/extract-dependencies.mjs +109 -109
- package/src/extract/extract-stats.mjs +21 -21
- package/src/extract/gather-initial-sources.mjs +64 -64
- package/src/extract/helpers.mjs +73 -71
- package/src/extract/index.mjs +120 -120
- package/src/extract/resolve/determine-dependency-types.mjs +166 -169
- package/src/extract/resolve/external-module-helpers.mjs +76 -76
- package/src/extract/resolve/get-manifest.mjs +79 -79
- package/src/extract/resolve/index.mjs +175 -164
- package/src/extract/resolve/is-built-in.mjs +22 -24
- package/src/extract/resolve/merge-manifests.mjs +43 -43
- package/src/extract/resolve/module-classifiers.mjs +229 -229
- package/src/extract/resolve/resolve-amd.mjs +44 -44
- package/src/extract/resolve/resolve-cjs.mjs +40 -40
- package/src/extract/resolve/resolve-helpers.mjs +20 -20
- package/src/extract/resolve/resolve.mjs +26 -26
- package/src/extract/swc/dependency-visitor.mjs +211 -211
- package/src/extract/swc/extract-swc-deps.mjs +4 -4
- package/src/extract/swc/extract.mjs +7 -7
- package/src/extract/swc/parse.mjs +12 -12
- package/src/extract/transpile/babel-wrap.mjs +9 -9
- package/src/extract/transpile/coffeescript-wrap.mjs +21 -21
- package/src/extract/transpile/index.mjs +47 -47
- package/src/extract/transpile/javascript-wrap.mjs +6 -6
- package/src/extract/transpile/livescript-wrap.mjs +5 -5
- package/src/extract/transpile/meta.mjs +80 -80
- package/src/extract/transpile/svelte-preprocess.mjs +73 -73
- package/src/extract/transpile/svelte-wrap.mjs +19 -19
- package/src/extract/transpile/try-import-available.mjs +26 -27
- package/src/extract/transpile/typescript-wrap.mjs +39 -39
- package/src/extract/transpile/vue-template-wrap.cjs +43 -43
- package/src/extract/tsc/extract-stats.mjs +4 -4
- package/src/extract/tsc/extract-typescript-deps.mjs +429 -398
- package/src/extract/tsc/extract.mjs +22 -22
- package/src/extract/tsc/parse.mjs +21 -21
- package/src/graph-utl/add-focus.mjs +35 -35
- package/src/graph-utl/compare.mjs +24 -24
- package/src/graph-utl/consolidate-module-dependencies.mjs +35 -35
- package/src/graph-utl/consolidate-modules.mjs +33 -33
- package/src/graph-utl/consolidate-to-folder.mjs +13 -13
- package/src/graph-utl/consolidate-to-pattern.mjs +34 -34
- package/src/graph-utl/filter-bank.mjs +74 -69
- package/src/graph-utl/indexed-module-graph.mjs +227 -225
- package/src/graph-utl/match-facade.mjs +3 -3
- package/src/graph-utl/rule-set.mjs +20 -20
- package/src/graph-utl/strip-self-transitions.mjs +6 -6
- package/src/main/cruise.mjs +81 -81
- package/src/main/files-and-dirs/normalize.mjs +7 -7
- package/src/main/format.mjs +11 -14
- package/src/main/helpers.mjs +25 -25
- package/src/main/index.mjs +8 -8
- package/src/main/options/assert-validity.mjs +100 -100
- package/src/main/options/defaults.mjs +11 -11
- package/src/main/options/normalize.mjs +158 -160
- package/src/main/report-wrap.mjs +37 -37
- package/src/main/resolve-options/normalize.mjs +127 -128
- package/src/main/rule-set/assert-validity.mjs +67 -73
- package/src/main/rule-set/normalize.mjs +81 -79
- package/src/meta.cjs +15 -16
- package/src/report/anon/anonymize-path-element.mjs +20 -34
- package/src/report/anon/anonymize-path.mjs +11 -11
- package/src/report/anon/index.mjs +119 -119
- package/src/report/anon/random-string.mjs +23 -23
- package/src/report/azure-devops.mjs +75 -99
- package/src/report/baseline.mjs +9 -9
- package/src/report/csv.mjs +13 -13
- package/src/report/d2.mjs +105 -105
- package/src/report/dot/default-theme.mjs +152 -152
- package/src/report/dot/index.mjs +146 -146
- package/src/report/dot/module-utl.mjs +72 -72
- package/src/report/dot/prepare-custom-level.mjs +20 -20
- package/src/report/dot/prepare-flat-level.mjs +11 -11
- package/src/report/dot/prepare-folder-level.mjs +12 -13
- package/src/report/dot/theming.mjs +73 -73
- package/src/report/dot-webpage/dot-module.mjs +36 -36
- package/src/report/dot-webpage/svg-in-html-snippets/script.cjs +208 -210
- package/src/report/dot-webpage/svg-in-html-snippets/style.css +51 -51
- package/src/report/dot-webpage/wrap-in-html.mjs +7 -7
- package/src/report/error-html/index.mjs +49 -49
- package/src/report/error-html/utl.mjs +99 -99
- package/src/report/error-long.mjs +1 -1
- package/src/report/error.mjs +93 -93
- package/src/report/html/index.mjs +48 -48
- package/src/report/identity.mjs +4 -4
- package/src/report/index.mjs +33 -33
- package/src/report/json.mjs +4 -4
- package/src/report/markdown.mjs +120 -120
- package/src/report/mermaid.mjs +111 -111
- package/src/report/metrics.mjs +185 -185
- package/src/report/null.mjs +4 -4
- package/src/report/plugins.mjs +41 -41
- package/src/report/teamcity.mjs +150 -150
- package/src/report/text.mjs +42 -42
- package/src/report/utl/dependency-to-incidence-transformer.mjs +32 -32
- package/src/report/utl/index.mjs +53 -53
- package/src/schema/configuration.validate.mjs +1 -0
- package/src/schema/cruise-result.validate.mjs +1 -0
- package/src/schema/utl.mjs +6 -0
- package/src/utl/array-util.mjs +25 -25
- package/src/utl/bus.mjs +12 -12
- package/src/utl/extract-root-module-name.cjs +8 -8
- package/src/utl/find-all-files.mjs +54 -54
- package/src/utl/get-extension.mjs +2 -2
- package/src/utl/object-util.mjs +21 -22
- package/src/utl/path-to-posix.mjs +5 -5
- package/src/utl/regex-util.mjs +20 -20
- package/src/utl/try-import.mjs +42 -41
- package/src/utl/try-require.cjs +23 -23
- package/src/utl/wrap-and-indent.mjs +33 -33
- package/src/validate/index.mjs +65 -65
- package/src/validate/match-dependency-rule.mjs +47 -47
- package/src/validate/match-folder-dependency-rule.mjs +27 -27
- package/src/validate/match-module-rule-helpers.mjs +76 -76
- package/src/validate/match-module-rule.mjs +12 -12
- package/src/validate/matchers.mjs +162 -162
- package/src/validate/rule-classifiers.mjs +9 -9
- package/src/validate/violates-required-rule.mjs +23 -23
- package/types/cache-options.d.mts +27 -27
- package/types/config-utl/extract-babel-config.d.mts +1 -1
- package/types/config-utl/extract-depcruise-config.d.mts +3 -3
- package/types/config-utl/extract-depcruise-options.d.mts +1 -1
- package/types/config-utl/extract-ts-config.d.mts +1 -1
- package/types/config-utl/extract-webpack-resolve-config.d.mts +3 -3
- package/types/configuration.d.mts +10 -10
- package/types/cruise-result.d.mts +414 -414
- package/types/dependency-cruiser.d.mts +52 -52
- package/types/filter-types.d.mts +45 -45
- package/types/options.d.mts +430 -430
- package/types/plugins/3d-reporter-plugin.d.mts +9 -9
- package/types/plugins/mermaid-reporter-plugin.d.mts +10 -10
- package/types/plugins/stats-reporter-plugin.d.mts +9 -9
- package/types/reporter-options.d.mts +196 -196
- package/types/resolve-options.d.mts +23 -23
- package/types/restrictions.d.mts +174 -174
- package/types/rule-set.d.mts +132 -132
- package/types/rule-summary.d.mts +14 -14
- package/types/shared-types.d.mts +89 -89
- package/types/strict-filter-types.d.mts +52 -52
- package/types/strict-options.d.mts +34 -34
- package/types/strict-restrictions.d.mts +25 -25
- package/types/strict-rule-set.d.mts +36 -36
- package/types/violations.d.mts +40 -40
- package/src/schema/README.md +0 -5
- package/src/schema/baseline-violations.schema.mjs +0 -1
- package/src/schema/configuration.schema.mjs +0 -1
- package/src/schema/cruise-result.schema.mjs +0 -1
- package/types/README.md +0 -1
|
@@ -11,7 +11,7 @@ import configTemplate from "./config-template.mjs";
|
|
|
11
11
|
* @returns {string}
|
|
12
12
|
*/
|
|
13
13
|
function quote(pString) {
|
|
14
|
-
|
|
14
|
+
return `"${pString}"`;
|
|
15
15
|
}
|
|
16
16
|
|
|
17
17
|
/**
|
|
@@ -19,10 +19,10 @@ function quote(pString) {
|
|
|
19
19
|
* @returns {string}
|
|
20
20
|
*/
|
|
21
21
|
function extensionsToString(pExtensions) {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
22
|
+
if (pExtensions) {
|
|
23
|
+
return `[${pExtensions.map(quote).join(", ")}]`;
|
|
24
|
+
}
|
|
25
|
+
return "";
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
/**
|
|
@@ -30,7 +30,7 @@ function extensionsToString(pExtensions) {
|
|
|
30
30
|
* @returns {string}
|
|
31
31
|
*/
|
|
32
32
|
function buildNotToTestRule(pInitOptions) {
|
|
33
|
-
|
|
33
|
+
const lNotToTestRule = `{
|
|
34
34
|
name: 'not-to-test',
|
|
35
35
|
comment:
|
|
36
36
|
"This module depends on code within a folder that should only contain tests. As tests don't " +
|
|
@@ -44,12 +44,12 @@ function buildNotToTestRule(pInitOptions) {
|
|
|
44
44
|
path: '{{testLocationRE}}'
|
|
45
45
|
}
|
|
46
46
|
},`;
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
47
|
+
return pInitOptions.hasTestsOutsideSource
|
|
48
|
+
? lNotToTestRule.replace(
|
|
49
|
+
/{{testLocationRE}}/g,
|
|
50
|
+
folderNameArrayToRE(pInitOptions?.testLocation ?? []),
|
|
51
|
+
)
|
|
52
|
+
: "";
|
|
53
53
|
}
|
|
54
54
|
|
|
55
55
|
/**
|
|
@@ -57,9 +57,9 @@ function buildNotToTestRule(pInitOptions) {
|
|
|
57
57
|
* @returns {string}
|
|
58
58
|
*/
|
|
59
59
|
function buildTsPreCompilationDepsAttribute(pInitOptions) {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
60
|
+
return pInitOptions.tsPreCompilationDeps
|
|
61
|
+
? "tsPreCompilationDeps: true,"
|
|
62
|
+
: "// tsPreCompilationDeps: false,";
|
|
63
63
|
}
|
|
64
64
|
|
|
65
65
|
/**
|
|
@@ -68,9 +68,9 @@ function buildTsPreCompilationDepsAttribute(pInitOptions) {
|
|
|
68
68
|
* @returns {string}
|
|
69
69
|
*/
|
|
70
70
|
function buildDetectJSDocumentImportsAttribute(pInitOptions) {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
71
|
+
return pInitOptions.detectJSDocImports
|
|
72
|
+
? "detectJSDocImports: true,"
|
|
73
|
+
: "// detectJSDocImports: true,";
|
|
74
74
|
}
|
|
75
75
|
|
|
76
76
|
/**
|
|
@@ -79,9 +79,9 @@ function buildDetectJSDocumentImportsAttribute(pInitOptions) {
|
|
|
79
79
|
* @returns {string}
|
|
80
80
|
*/
|
|
81
81
|
function buildDetectProcessBuiltinModuleCalls(pInitOptions) {
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
82
|
+
return pInitOptions.detectProcessBuiltinModuleCalls
|
|
83
|
+
? "detectProcessBuiltinModuleCalls: true,"
|
|
84
|
+
: "// detectProcessBuiltinModuleCalls: true,";
|
|
85
85
|
}
|
|
86
86
|
|
|
87
87
|
/**
|
|
@@ -89,9 +89,9 @@ function buildDetectProcessBuiltinModuleCalls(pInitOptions) {
|
|
|
89
89
|
* @returns {string}
|
|
90
90
|
*/
|
|
91
91
|
function buildCombinedDependenciesAttribute(pInitOptions) {
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
92
|
+
return pInitOptions.combinedDependencies
|
|
93
|
+
? "combinedDependencies: true,"
|
|
94
|
+
: "// combinedDependencies: false,";
|
|
95
95
|
}
|
|
96
96
|
|
|
97
97
|
/**
|
|
@@ -99,17 +99,17 @@ function buildCombinedDependenciesAttribute(pInitOptions) {
|
|
|
99
99
|
* @returns {string}
|
|
100
100
|
*/
|
|
101
101
|
function buildTsOrJsConfigAttribute(pInitOptions) {
|
|
102
|
-
|
|
103
|
-
|
|
102
|
+
if (pInitOptions.useTsConfig) {
|
|
103
|
+
return `tsConfig: {
|
|
104
104
|
fileName: '${pInitOptions.tsConfig}'
|
|
105
105
|
},`;
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
106
|
+
}
|
|
107
|
+
if (pInitOptions.useJsConfig) {
|
|
108
|
+
return `tsConfig: {
|
|
109
109
|
fileName: '${pInitOptions.jsConfig}'
|
|
110
110
|
},`;
|
|
111
|
-
|
|
112
|
-
|
|
111
|
+
}
|
|
112
|
+
return `// tsConfig: {
|
|
113
113
|
// fileName: 'tsconfig.json'
|
|
114
114
|
// },`;
|
|
115
115
|
}
|
|
@@ -119,13 +119,13 @@ function buildTsOrJsConfigAttribute(pInitOptions) {
|
|
|
119
119
|
* @returns {string}
|
|
120
120
|
*/
|
|
121
121
|
function buildWebpackConfigAttribute(pInitOptions) {
|
|
122
|
-
|
|
123
|
-
|
|
122
|
+
return pInitOptions.webpackConfig
|
|
123
|
+
? `webpackConfig: {
|
|
124
124
|
fileName: '${pInitOptions.webpackConfig}',
|
|
125
125
|
// env: {},
|
|
126
126
|
// arguments: {}
|
|
127
127
|
},`
|
|
128
|
-
|
|
128
|
+
: `// webpackConfig: {
|
|
129
129
|
// fileName: 'webpack.config.js',
|
|
130
130
|
// env: {},
|
|
131
131
|
// arguments: {}
|
|
@@ -137,11 +137,11 @@ function buildWebpackConfigAttribute(pInitOptions) {
|
|
|
137
137
|
* @returns {string}
|
|
138
138
|
*/
|
|
139
139
|
function buildBabelConfigAttribute(pInitOptions) {
|
|
140
|
-
|
|
141
|
-
|
|
140
|
+
return pInitOptions.babelConfig
|
|
141
|
+
? `babelConfig: {
|
|
142
142
|
fileName: '${pInitOptions.babelConfig}'
|
|
143
143
|
},`
|
|
144
|
-
|
|
144
|
+
: `// babelConfig: {
|
|
145
145
|
// fileName: '.babelrc',
|
|
146
146
|
// },`;
|
|
147
147
|
}
|
|
@@ -151,9 +151,9 @@ function buildBabelConfigAttribute(pInitOptions) {
|
|
|
151
151
|
* @returns {string}
|
|
152
152
|
*/
|
|
153
153
|
function buildExtensionsAttribute(pInitOptions) {
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
154
|
+
return pInitOptions.specifyResolutionExtensions
|
|
155
|
+
? `extensions: ${extensionsToString(pInitOptions.resolutionExtensions)},`
|
|
156
|
+
: `// extensions: [".js", ".jsx", ".ts", ".tsx", ".d.ts"],`;
|
|
157
157
|
}
|
|
158
158
|
|
|
159
159
|
/**
|
|
@@ -161,10 +161,10 @@ function buildExtensionsAttribute(pInitOptions) {
|
|
|
161
161
|
* @returns {string}
|
|
162
162
|
*/
|
|
163
163
|
function buildMainFieldsAttribute(pInitOptions) {
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
164
|
+
if (pInitOptions.isTypeModule) {
|
|
165
|
+
return `mainFields: ["module", "main", "types", "typings"],`;
|
|
166
|
+
}
|
|
167
|
+
return `
|
|
168
168
|
// if you migrate to ESM (or are in an ESM environment already) you will want to
|
|
169
169
|
// have "module" in the list of mainFields, like so:
|
|
170
170
|
// mainFields: ["module", "main", "types", "typings"],
|
|
@@ -176,8 +176,8 @@ function buildMainFieldsAttribute(pInitOptions) {
|
|
|
176
176
|
* @returns {string}
|
|
177
177
|
*/
|
|
178
178
|
function buildBuiltInModulesAttribute(pInitOptions) {
|
|
179
|
-
|
|
180
|
-
|
|
179
|
+
if (pInitOptions.usesBun) {
|
|
180
|
+
return `
|
|
181
181
|
/* List of built-in modules to use on top of the ones node declares.
|
|
182
182
|
|
|
183
183
|
See https://github.com/sverweij/dependency-cruiser/blob/main/doc/options-reference.md#builtinmodules-influencing-what-to-consider-built-in--core-modules
|
|
@@ -197,8 +197,8 @@ function buildBuiltInModulesAttribute(pInitOptions) {
|
|
|
197
197
|
]
|
|
198
198
|
},
|
|
199
199
|
`;
|
|
200
|
-
|
|
201
|
-
|
|
200
|
+
}
|
|
201
|
+
return "";
|
|
202
202
|
}
|
|
203
203
|
|
|
204
204
|
/**
|
|
@@ -210,50 +210,50 @@ function buildBuiltInModulesAttribute(pInitOptions) {
|
|
|
210
210
|
* @returns {string} the configuration as a string
|
|
211
211
|
*/
|
|
212
212
|
export default function buildConfig(pInitOptions) {
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
213
|
+
return configTemplate
|
|
214
|
+
.replace(
|
|
215
|
+
/{{sourceLocationRE}}/g,
|
|
216
|
+
folderNameArrayToRE(pInitOptions.sourceLocation),
|
|
217
|
+
)
|
|
218
|
+
.replace(
|
|
219
|
+
/{{resolutionExtensionsAsString}}/g,
|
|
220
|
+
extensionsToString(pInitOptions.resolutionExtensions),
|
|
221
|
+
)
|
|
222
|
+
.replace("{{notToTestRule}}", buildNotToTestRule(pInitOptions))
|
|
223
|
+
.replace(
|
|
224
|
+
"{{detectJSDocImportsAttribute}}",
|
|
225
|
+
buildDetectJSDocumentImportsAttribute(pInitOptions),
|
|
226
|
+
)
|
|
227
|
+
.replace(
|
|
228
|
+
"{{detectProcessBuiltinModuleCalls}}",
|
|
229
|
+
buildDetectProcessBuiltinModuleCalls(pInitOptions),
|
|
230
|
+
)
|
|
231
|
+
.replace(
|
|
232
|
+
"{{tsPreCompilationDepsAttribute}}",
|
|
233
|
+
buildTsPreCompilationDepsAttribute(pInitOptions),
|
|
234
|
+
)
|
|
235
|
+
.replace(
|
|
236
|
+
"{{combinedDependenciesAttribute}}",
|
|
237
|
+
buildCombinedDependenciesAttribute(pInitOptions),
|
|
238
|
+
)
|
|
239
|
+
.replace(
|
|
240
|
+
"{{tsOrJsConfigAttribute}}",
|
|
241
|
+
buildTsOrJsConfigAttribute(pInitOptions),
|
|
242
|
+
)
|
|
243
|
+
.replace(
|
|
244
|
+
"{{webpackConfigAttribute}}",
|
|
245
|
+
buildWebpackConfigAttribute(pInitOptions),
|
|
246
|
+
)
|
|
247
|
+
.replace(
|
|
248
|
+
"{{babelConfigAttribute}}",
|
|
249
|
+
buildBabelConfigAttribute(pInitOptions),
|
|
250
|
+
)
|
|
251
|
+
.replace(
|
|
252
|
+
"{{builtInModulesAttribute}}",
|
|
253
|
+
buildBuiltInModulesAttribute(pInitOptions),
|
|
254
|
+
)
|
|
255
|
+
.replace("{{extensionsAttribute}}", buildExtensionsAttribute(pInitOptions))
|
|
256
|
+
.replace("{{mainFieldsAttribute}}", buildMainFieldsAttribute(pInitOptions))
|
|
257
|
+
.replace("{{version}}", pInitOptions.version)
|
|
258
|
+
.replace("{{date}}", pInitOptions.date);
|
|
259
259
|
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
2
|
+
readFileSync,
|
|
3
|
+
readdirSync,
|
|
4
|
+
accessSync,
|
|
5
|
+
statSync,
|
|
6
|
+
constants,
|
|
7
7
|
} from "node:fs";
|
|
8
8
|
import { join } from "node:path";
|
|
9
9
|
import { DEFAULT_CONFIG_FILE_NAME } from "../defaults.mjs";
|
|
@@ -25,7 +25,7 @@ const BABEL_CONFIG_CANDIDATE_PATTERN = /^\.babelrc$|.*babel.*\.json/gi;
|
|
|
25
25
|
* @throws {SyntaxError} when the manifest's json is invalid
|
|
26
26
|
*/
|
|
27
27
|
export function readManifest(pManifestFileName = "./package.json") {
|
|
28
|
-
|
|
28
|
+
return JSON.parse(readFileSync(pManifestFileName, "utf8"));
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
/**
|
|
@@ -36,42 +36,42 @@ export function readManifest(pManifestFileName = "./package.json") {
|
|
|
36
36
|
* @returns {boolean}
|
|
37
37
|
*/
|
|
38
38
|
export function fileExists(pFile) {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
39
|
+
try {
|
|
40
|
+
accessSync(pFile, constants.R_OK);
|
|
41
|
+
} catch (pError) {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
return true;
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
/**
|
|
48
48
|
* @returns {boolean}
|
|
49
49
|
*/
|
|
50
50
|
function babelIsConfiguredInManifest() {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
51
|
+
let lReturnValue = false;
|
|
52
|
+
|
|
53
|
+
try {
|
|
54
|
+
// @ts-expect-error defaultly tsc doesn't know about newfangled stuff like hasOwn
|
|
55
|
+
lReturnValue = Object.hasOwn(readManifest(), "babel");
|
|
56
|
+
} catch (pError) {
|
|
57
|
+
// silently ignore - we'll return false anyway then
|
|
58
|
+
}
|
|
59
|
+
return lReturnValue;
|
|
60
60
|
}
|
|
61
61
|
|
|
62
62
|
/**
|
|
63
63
|
* @returns {boolean}
|
|
64
64
|
*/
|
|
65
65
|
export function isTypeModule() {
|
|
66
|
-
|
|
66
|
+
let lReturnValue = false;
|
|
67
67
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
68
|
+
try {
|
|
69
|
+
lReturnValue = (readManifest()?.type ?? "commonjs") === "module";
|
|
70
|
+
} catch (pError) {
|
|
71
|
+
// silently ignore - we'll return false anyway then
|
|
72
|
+
}
|
|
73
73
|
|
|
74
|
-
|
|
74
|
+
return lReturnValue;
|
|
75
75
|
}
|
|
76
76
|
|
|
77
77
|
/**
|
|
@@ -79,9 +79,9 @@ export function isTypeModule() {
|
|
|
79
79
|
* @returns {string[]} Array of folder names
|
|
80
80
|
*/
|
|
81
81
|
function getFolderNames(pFolderName) {
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
82
|
+
return readdirSync(pFolderName, "utf8").filter((pFileName) =>
|
|
83
|
+
statSync(join(pFolderName, pFileName)).isDirectory(),
|
|
84
|
+
);
|
|
85
85
|
}
|
|
86
86
|
|
|
87
87
|
/**
|
|
@@ -90,11 +90,11 @@ function getFolderNames(pFolderName) {
|
|
|
90
90
|
* @returns {string[]}
|
|
91
91
|
*/
|
|
92
92
|
function getMatchingFileNames(pPattern, pFolderName = process.cwd()) {
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
93
|
+
return readdirSync(pFolderName, "utf8").filter(
|
|
94
|
+
(pFileName) =>
|
|
95
|
+
statSync(join(pFolderName, pFileName)).isFile() &&
|
|
96
|
+
pFileName.match(pPattern),
|
|
97
|
+
);
|
|
98
98
|
}
|
|
99
99
|
|
|
100
100
|
/**
|
|
@@ -102,20 +102,20 @@ function getMatchingFileNames(pPattern, pFolderName = process.cwd()) {
|
|
|
102
102
|
* @returns {boolean}
|
|
103
103
|
*/
|
|
104
104
|
export function isLikelyMonoRepo(pFolderNames = getFolderNames(process.cwd())) {
|
|
105
|
-
|
|
105
|
+
return pFolderNames.includes("packages");
|
|
106
106
|
}
|
|
107
107
|
|
|
108
108
|
function getPackageManager(pManifest) {
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
109
|
+
let lReturnValue = "";
|
|
110
|
+
try {
|
|
111
|
+
const lManifest = pManifest ?? readManifest();
|
|
112
|
+
if (Object.hasOwn(lManifest, "packageManager")) {
|
|
113
|
+
lReturnValue = lManifest.packageManager;
|
|
114
|
+
}
|
|
115
|
+
} catch (pError) {
|
|
116
|
+
// silently ignore - we'll return the empty string anyway then
|
|
117
|
+
}
|
|
118
|
+
return lReturnValue;
|
|
119
119
|
}
|
|
120
120
|
|
|
121
121
|
/**
|
|
@@ -123,24 +123,24 @@ function getPackageManager(pManifest) {
|
|
|
123
123
|
* @returns {boolean}
|
|
124
124
|
*/
|
|
125
125
|
export function likelyUsesBun(pManifest) {
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
126
|
+
const bunIsPackageManager = getPackageManager(pManifest).startsWith("bun");
|
|
127
|
+
return (
|
|
128
|
+
bunIsPackageManager || fileExists("bun.lockb") || fileExists("bunfig.toml")
|
|
129
|
+
);
|
|
130
130
|
}
|
|
131
131
|
|
|
132
132
|
export function hasTestsWithinSource(pTestLocations, pSourceLocations) {
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
133
|
+
return pTestLocations.every((pTestLocation) =>
|
|
134
|
+
pSourceLocations.includes(pTestLocation),
|
|
135
|
+
);
|
|
136
136
|
}
|
|
137
137
|
|
|
138
138
|
export function getFolderCandidates(pCandidateFolderArray) {
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
139
|
+
return (pFolderNames = getFolderNames(process.cwd())) => {
|
|
140
|
+
return pFolderNames.filter((pFolderName) =>
|
|
141
|
+
pCandidateFolderArray.includes(pFolderName),
|
|
142
|
+
);
|
|
143
|
+
};
|
|
144
144
|
}
|
|
145
145
|
|
|
146
146
|
/**
|
|
@@ -148,52 +148,52 @@ export function getFolderCandidates(pCandidateFolderArray) {
|
|
|
148
148
|
* @returns {string[]}
|
|
149
149
|
*/
|
|
150
150
|
export function toSourceLocationArray(pLocations) {
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
151
|
+
if (!Array.isArray(pLocations)) {
|
|
152
|
+
return pLocations.split(",").map((pFolder) => pFolder.trim());
|
|
153
|
+
}
|
|
154
|
+
return pLocations;
|
|
155
155
|
}
|
|
156
156
|
|
|
157
157
|
/**
|
|
158
158
|
* @returns {string[]}
|
|
159
159
|
*/
|
|
160
160
|
function getManifestFilesWithABabelConfig() {
|
|
161
|
-
|
|
161
|
+
return babelIsConfiguredInManifest() ? ["package.json"] : [];
|
|
162
162
|
}
|
|
163
163
|
|
|
164
164
|
export const getBabelConfigCandidates = () =>
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
165
|
+
getManifestFilesWithABabelConfig().concat(
|
|
166
|
+
getMatchingFileNames(BABEL_CONFIG_CANDIDATE_PATTERN),
|
|
167
|
+
);
|
|
168
168
|
export const hasBabelConfigCandidates = () =>
|
|
169
|
-
|
|
169
|
+
getBabelConfigCandidates().length > 0;
|
|
170
170
|
|
|
171
171
|
export const getTSConfigCandidates = (pFolderName = process.cwd()) =>
|
|
172
|
-
|
|
172
|
+
getMatchingFileNames(TSCONFIG_CANDIDATE_PATTERN, pFolderName);
|
|
173
173
|
export const hasTSConfigCandidates = (pFolderName = process.cwd()) =>
|
|
174
|
-
|
|
174
|
+
getTSConfigCandidates(pFolderName).length > 0;
|
|
175
175
|
export const getJSConfigCandidates = (pFolderName = process.cwd()) =>
|
|
176
|
-
|
|
176
|
+
getMatchingFileNames(JSCONFIG_CANDIDATE_PATTERN, pFolderName);
|
|
177
177
|
export const hasJSConfigCandidates = (pFolderName = process.cwd()) =>
|
|
178
|
-
|
|
178
|
+
getJSConfigCandidates(pFolderName).length > 0;
|
|
179
179
|
|
|
180
180
|
export const getWebpackConfigCandidates = () =>
|
|
181
|
-
|
|
181
|
+
getMatchingFileNames(WEBPACK_CANDIDATE_PATTERN);
|
|
182
182
|
export const hasWebpackConfigCandidates = () =>
|
|
183
|
-
|
|
183
|
+
getWebpackConfigCandidates().length > 0;
|
|
184
184
|
|
|
185
185
|
export const getSourceFolderCandidates = getFolderCandidates(
|
|
186
|
-
|
|
186
|
+
LIKELY_SOURCE_FOLDERS,
|
|
187
187
|
);
|
|
188
188
|
export const getTestFolderCandidates = getFolderCandidates(LIKELY_TEST_FOLDERS);
|
|
189
189
|
|
|
190
190
|
export const getMonoRepoPackagesCandidates = getFolderCandidates(
|
|
191
|
-
|
|
191
|
+
LIKELY_PACKAGES_FOLDERS,
|
|
192
192
|
);
|
|
193
193
|
|
|
194
194
|
/**
|
|
195
195
|
* @returns {string}
|
|
196
196
|
*/
|
|
197
197
|
export function getDefaultConfigFileName() {
|
|
198
|
-
|
|
198
|
+
return isTypeModule() ? ".dependency-cruiser.cjs" : DEFAULT_CONFIG_FILE_NAME;
|
|
199
199
|
}
|
|
@@ -9,18 +9,18 @@ import findAllFiles from "#utl/find-all-files.mjs";
|
|
|
9
9
|
* @param {string} pExtension
|
|
10
10
|
*/
|
|
11
11
|
function reduceToCounts(pAll, pExtension) {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
12
|
+
if (pAll[pExtension]) {
|
|
13
|
+
pAll[pExtension] += 1;
|
|
14
|
+
} else {
|
|
15
|
+
pAll[pExtension] = 1;
|
|
16
|
+
}
|
|
17
|
+
return pAll;
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
function compareByCount(pCountsObject) {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
21
|
+
return function compare(pLeft, pRight) {
|
|
22
|
+
return pCountsObject[pRight] - pCountsObject[pLeft];
|
|
23
|
+
};
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
/**
|
|
@@ -29,24 +29,24 @@ function compareByCount(pCountsObject) {
|
|
|
29
29
|
* @returns {string[]}
|
|
30
30
|
*/
|
|
31
31
|
export default function findExtensions(pDirectories, pOptions) {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
32
|
+
const lOptions = {
|
|
33
|
+
baseDir: process.cwd(),
|
|
34
|
+
scannableExtensions,
|
|
35
|
+
...pOptions,
|
|
36
|
+
};
|
|
37
37
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
38
|
+
const lExtensionsWithCounts = pDirectories
|
|
39
|
+
.flatMap((pDirectory) =>
|
|
40
|
+
findAllFiles(pDirectory, {
|
|
41
|
+
baseDir: lOptions.baseDir,
|
|
42
|
+
ignoreFileContents: lOptions?.ignoreFileContents,
|
|
43
|
+
})
|
|
44
|
+
.map(getExtension)
|
|
45
|
+
.filter(Boolean),
|
|
46
|
+
)
|
|
47
|
+
.reduce(reduceToCounts, {});
|
|
48
48
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
49
|
+
return Object.keys(lExtensionsWithCounts)
|
|
50
|
+
.filter((pExtension) => lOptions.scannableExtensions.includes(pExtension))
|
|
51
|
+
.sort(compareByCount(lExtensionsWithCounts));
|
|
52
52
|
}
|