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
package/src/utl/array-util.mjs
CHANGED
|
@@ -7,17 +7,17 @@
|
|
|
7
7
|
* @return {boolean} true if there's at least one element in pLeftArray also in pRightArray
|
|
8
8
|
*/
|
|
9
9
|
export function intersects(pLeftArray, pRightArray) {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
10
|
+
if (pLeftArray.length === 0 || pRightArray.length === 0) {
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
if (pRightArray.length < pLeftArray.length) {
|
|
14
|
+
return pRightArray.some((pItem) => pLeftArray.includes(pItem));
|
|
15
|
+
}
|
|
16
|
+
return pLeftArray.some((pItem) => pRightArray.includes(pItem));
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
export function uniq(pArray) {
|
|
20
|
-
|
|
20
|
+
return [...new Set(pArray)];
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
/**
|
|
@@ -26,18 +26,18 @@ export function uniq(pArray) {
|
|
|
26
26
|
* @returns {any[]}
|
|
27
27
|
*/
|
|
28
28
|
export function uniqBy(pArray, pIteratee) {
|
|
29
|
-
|
|
30
|
-
|
|
29
|
+
const lSeen = new Map();
|
|
30
|
+
const lResult = [];
|
|
31
31
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
32
|
+
for (const lElement of pArray) {
|
|
33
|
+
const lKey = pIteratee(lElement);
|
|
34
|
+
if (!lSeen.has(lKey)) {
|
|
35
|
+
lSeen.set(lKey, true);
|
|
36
|
+
lResult.push(lElement);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
39
|
|
|
40
|
-
|
|
40
|
+
return lResult;
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
/**
|
|
@@ -46,13 +46,13 @@ export function uniqBy(pArray, pIteratee) {
|
|
|
46
46
|
* @returns {any[]}
|
|
47
47
|
*/
|
|
48
48
|
export function uniqWith(pArray, pComparator) {
|
|
49
|
-
|
|
49
|
+
const lResult = [];
|
|
50
50
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
51
|
+
for (const lElement of pArray) {
|
|
52
|
+
if (!lResult.some((pY) => pComparator(lElement, pY))) {
|
|
53
|
+
lResult.push(lElement);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
56
|
|
|
57
|
-
|
|
57
|
+
return lResult;
|
|
58
58
|
}
|
package/src/utl/bus.mjs
CHANGED
|
@@ -9,21 +9,21 @@ export const EXTRA_STRONG = 80;
|
|
|
9
9
|
export const ALL = 99;
|
|
10
10
|
|
|
11
11
|
class Bus extends EventEmitter {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
progress(pMessage, pOptions, ...pArguments) {
|
|
13
|
+
this.emit("progress", pMessage, pOptions, pArguments);
|
|
14
|
+
}
|
|
15
15
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
16
|
+
summary(pMessage, pOptions, ...pArguments) {
|
|
17
|
+
this.progress(pMessage, { ...pOptions, level: SUMMARY }, pArguments);
|
|
18
|
+
}
|
|
19
19
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
20
|
+
info(pMessage, pOptions, ...pArguments) {
|
|
21
|
+
this.progress(pMessage, { ...pOptions, level: INFO }, pArguments);
|
|
22
|
+
}
|
|
23
23
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
debug(pMessage, pOptions, ...pArguments) {
|
|
25
|
+
this.progress(pMessage, { ...pOptions, level: DEBUG }, pArguments);
|
|
26
|
+
}
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
export const bus = new Bus();
|
|
@@ -12,12 +12,12 @@ const ROOT_MODULE_RE = new RegExp(`^(${SCOPED_PACKAGE_RE}|${PACKAGE_RE})`, "g");
|
|
|
12
12
|
* @returns {string|undefined} the module name that likely contains the package.json
|
|
13
13
|
*/
|
|
14
14
|
module.exports = function extractRootModuleName(pModuleName) {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
15
|
+
if (
|
|
16
|
+
pModuleName.match(LOCAL_MODULE_RE) ||
|
|
17
|
+
pModuleName.match(ABSOLUTE_MODULE_RE)
|
|
18
|
+
) {
|
|
19
|
+
return pModuleName;
|
|
20
|
+
} else {
|
|
21
|
+
return (pModuleName.match(ROOT_MODULE_RE) || []).shift();
|
|
22
|
+
}
|
|
23
23
|
};
|
|
@@ -13,10 +13,10 @@ import pathToPosix from "./path-to-posix.mjs";
|
|
|
13
13
|
* @returns {boolean}
|
|
14
14
|
*/
|
|
15
15
|
function fileIsDirectory(pFullPathToFile, pBaseDirectory) {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
16
|
+
const lStat = statSync(join(pBaseDirectory, pFullPathToFile), {
|
|
17
|
+
throwIfNoEntry: false,
|
|
18
|
+
});
|
|
19
|
+
return lStat?.isDirectory() ?? false;
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
/**
|
|
@@ -25,40 +25,40 @@ function fileIsDirectory(pFullPathToFile, pBaseDirectory) {
|
|
|
25
25
|
* @returns {string[]}
|
|
26
26
|
*/
|
|
27
27
|
function walk(
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
pDirectoryName,
|
|
29
|
+
{ baseDir, ignoreFilterFn, excludeFilterFn, includeOnlyFilterFn },
|
|
30
30
|
) {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
31
|
+
const lFilesInCurrentDirectory = readdirSync(join(baseDir, pDirectoryName))
|
|
32
|
+
.map((pFileName) => join(pDirectoryName, pFileName))
|
|
33
|
+
.filter(ignoreFilterFn)
|
|
34
|
+
.filter(excludeFilterFn)
|
|
35
|
+
.filter(includeOnlyFilterFn);
|
|
36
36
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
37
|
+
const lFiles = [];
|
|
38
|
+
for (const lFile of lFilesInCurrentDirectory) {
|
|
39
|
+
if (fileIsDirectory(lFile, baseDir)) {
|
|
40
|
+
lFiles.push(
|
|
41
|
+
...walk(lFile, {
|
|
42
|
+
baseDir,
|
|
43
|
+
ignoreFilterFn,
|
|
44
|
+
excludeFilterFn,
|
|
45
|
+
includeOnlyFilterFn,
|
|
46
|
+
}),
|
|
47
|
+
);
|
|
48
|
+
} else {
|
|
49
|
+
lFiles.push(pathToPosix(lFile));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
52
|
|
|
53
|
-
|
|
53
|
+
return lFiles;
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
function readIgnoreFile(pFileName) {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
57
|
+
try {
|
|
58
|
+
return readFileSync(pFileName, "utf8");
|
|
59
|
+
} catch (pError) {
|
|
60
|
+
return "";
|
|
61
|
+
}
|
|
62
62
|
}
|
|
63
63
|
|
|
64
64
|
/**
|
|
@@ -66,7 +66,7 @@ function readIgnoreFile(pFileName) {
|
|
|
66
66
|
*/
|
|
67
67
|
|
|
68
68
|
function identityFilter(_pString, _pIndex, _pArray) {
|
|
69
|
-
|
|
69
|
+
return true;
|
|
70
70
|
}
|
|
71
71
|
|
|
72
72
|
/**
|
|
@@ -75,27 +75,27 @@ function identityFilter(_pString, _pIndex, _pArray) {
|
|
|
75
75
|
* @returns {string[]}
|
|
76
76
|
*/
|
|
77
77
|
export default function findAllFiles(
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
78
|
+
pDirectoryName,
|
|
79
|
+
{
|
|
80
|
+
baseDir,
|
|
81
|
+
ignoreFileContents,
|
|
82
|
+
additionalIgnorePatterns,
|
|
83
|
+
excludeFilterFn,
|
|
84
|
+
includeOnlyFilterFn,
|
|
85
|
+
},
|
|
86
86
|
) {
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
87
|
+
const lIgnoreFileContents =
|
|
88
|
+
ignoreFileContents ?? readIgnoreFile(join(baseDir, ".gitignore"));
|
|
89
|
+
const lAdditionalIgnorePatterns = additionalIgnorePatterns ?? [".git"];
|
|
90
|
+
const lIgnoreFilterFunction = ignore()
|
|
91
|
+
.add(lIgnoreFileContents)
|
|
92
|
+
.add(lAdditionalIgnorePatterns)
|
|
93
|
+
.createFilter();
|
|
94
94
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
95
|
+
return walk(pDirectoryName, {
|
|
96
|
+
baseDir,
|
|
97
|
+
ignoreFilterFn: lIgnoreFilterFunction,
|
|
98
|
+
excludeFilterFn: excludeFilterFn ?? identityFilter,
|
|
99
|
+
includeOnlyFilterFn: includeOnlyFilterFn ?? identityFilter,
|
|
100
|
+
});
|
|
101
101
|
}
|
|
@@ -16,7 +16,7 @@ const EXTENSION_RE = /(?<extension>(?:(?:\.d\.(?:[cm])?ts)|\.coffee\.md)$)/;
|
|
|
16
16
|
* @return {string} extension
|
|
17
17
|
*/
|
|
18
18
|
export default function getExtension(pFileName) {
|
|
19
|
-
|
|
19
|
+
const lMatchResult = pFileName.match(EXTENSION_RE);
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
return lMatchResult?.groups?.extension ?? extname(pFileName);
|
|
22
22
|
}
|
package/src/utl/object-util.mjs
CHANGED
|
@@ -1,33 +1,32 @@
|
|
|
1
1
|
/* eslint-disable security/detect-object-injection */
|
|
2
2
|
|
|
3
3
|
export function get(pObject, pPath, pDefault) {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
const lPathArray = pPath.match(/([^[.\]])+/g);
|
|
4
|
+
if (!pObject || !pPath) {
|
|
5
|
+
return pDefault;
|
|
6
|
+
}
|
|
7
|
+
const lPathArray = pPath.match(/([^[.\]])+/g);
|
|
9
8
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
9
|
+
const lReturnValue = lPathArray.reduce((pPreviousObject, pKey) => {
|
|
10
|
+
return pPreviousObject && pPreviousObject[pKey];
|
|
11
|
+
}, pObject);
|
|
13
12
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
13
|
+
if (!lReturnValue) {
|
|
14
|
+
return pDefault;
|
|
15
|
+
}
|
|
16
|
+
return lReturnValue;
|
|
18
17
|
}
|
|
19
18
|
|
|
20
19
|
export function set(pObject, pPath, pValue) {
|
|
21
|
-
|
|
20
|
+
const lPathArray = pPath.match(/([^[.\]])+/g);
|
|
22
21
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
22
|
+
lPathArray.reduce((pPreviousObject, pKey, pIndex) => {
|
|
23
|
+
if (pIndex === lPathArray.length - 1) {
|
|
24
|
+
pPreviousObject[pKey] = pValue;
|
|
25
|
+
} else if (!pPreviousObject[pKey]) {
|
|
26
|
+
pPreviousObject[pKey] = {};
|
|
27
|
+
}
|
|
28
|
+
return pPreviousObject[pKey];
|
|
29
|
+
}, pObject);
|
|
31
30
|
}
|
|
32
31
|
|
|
33
32
|
/**
|
|
@@ -36,5 +35,5 @@ export function set(pObject, pPath, pValue) {
|
|
|
36
35
|
* @returns {boolean}
|
|
37
36
|
*/
|
|
38
37
|
export function has(pObject, pPath) {
|
|
39
|
-
|
|
38
|
+
return Boolean(get(pObject, pPath));
|
|
40
39
|
}
|
|
@@ -20,11 +20,11 @@ import path from "node:path";
|
|
|
20
20
|
* @return {string} the transformed path
|
|
21
21
|
*/
|
|
22
22
|
export default function pathToPosix(pFilePath, pPathModule = path) {
|
|
23
|
-
|
|
23
|
+
const lPathModule = pPathModule || path;
|
|
24
24
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
25
|
+
if (lPathModule.sep !== path.posix.sep) {
|
|
26
|
+
return pFilePath.split(lPathModule.sep).join(path.posix.sep);
|
|
27
|
+
}
|
|
28
28
|
|
|
29
|
-
|
|
29
|
+
return pFilePath;
|
|
30
30
|
}
|
package/src/utl/regex-util.mjs
CHANGED
|
@@ -12,22 +12,22 @@
|
|
|
12
12
|
* @returns {string[]|null}
|
|
13
13
|
*/
|
|
14
14
|
export function extractGroups(pFromRestriction, pActualPath) {
|
|
15
|
-
|
|
15
|
+
let lReturnValue = [];
|
|
16
16
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
17
|
+
if (pFromRestriction.path) {
|
|
18
|
+
// @ts-expect-error pFromRestriction.path can be a string | string[] | null
|
|
19
|
+
// except before it enters here it has already been 'normalized' to a string
|
|
20
|
+
// so it can be safely passed to match. The right solution here (TODO)
|
|
21
|
+
// is to create a separate type for NormalizedFromRestriction
|
|
22
|
+
let lMatchResult = pActualPath.match(pFromRestriction.path);
|
|
23
23
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
24
|
+
if (lMatchResult && lMatchResult.length > 1) {
|
|
25
|
+
lReturnValue = lMatchResult.filter(
|
|
26
|
+
(pResult) => typeof pResult === "string",
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return lReturnValue;
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
/**
|
|
@@ -47,10 +47,10 @@ export function extractGroups(pFromRestriction, pActualPath) {
|
|
|
47
47
|
* groups from pExtractedgroups
|
|
48
48
|
*/
|
|
49
49
|
export function replaceGroupPlaceholders(pString, pExtractedGroups) {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
50
|
+
return pExtractedGroups.reduce(
|
|
51
|
+
(pAll, pThis, pIndex) =>
|
|
52
|
+
// eslint-disable-next-line security/detect-non-literal-regexp
|
|
53
|
+
pAll.replace(new RegExp(`\\$${pIndex}`, "g"), pThis),
|
|
54
|
+
pString,
|
|
55
|
+
);
|
|
56
56
|
}
|
package/src/utl/try-import.mjs
CHANGED
|
@@ -11,30 +11,31 @@ const require = createRequire(import.meta.url);
|
|
|
11
11
|
* @returns {string}
|
|
12
12
|
*/
|
|
13
13
|
function getVersion(pModuleName) {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
14
|
+
// The 'proper' way to do this would be with a dynamic import with an
|
|
15
|
+
// import assertion. Because it's 'experimental' since node 16 and prints
|
|
16
|
+
// an ugly warning on stderr since node 19 we'll be using the require
|
|
17
|
+
// hack below in stead. Code would otherwise have been:
|
|
18
|
+
//
|
|
19
|
+
// const lManifest = await import(
|
|
20
|
+
// // @ts-expect-error TS2345 extractRootModuleName can return either a string or
|
|
21
|
+
// // undefined. If undefined this function will throw. Which is _fine_, even
|
|
22
|
+
// // _expected_ in the context it's currently used
|
|
23
|
+
// path.join(extractRootModuleName(pModuleName), "package.json"),
|
|
24
|
+
// { assert: { type: "json" } }
|
|
25
|
+
// );
|
|
26
|
+
// return lManifest.default.version;
|
|
27
|
+
//
|
|
28
|
+
// eslint-disable-next-line import/no-dynamic-require, security/detect-non-literal-require
|
|
29
|
+
const lManifest = require(
|
|
30
|
+
join(
|
|
31
|
+
// @ts-expect-error TS2345 extractRootModuleName can return either a string or
|
|
32
|
+
// undefined. If undefined this function will throw. Which is _fine_, even
|
|
33
|
+
// _expected_ in the context it's currently used
|
|
34
|
+
extractRootModuleName(pModuleName),
|
|
35
|
+
"package.json",
|
|
36
|
+
),
|
|
37
|
+
);
|
|
38
|
+
return lManifest.version;
|
|
38
39
|
}
|
|
39
40
|
|
|
40
41
|
/**
|
|
@@ -46,21 +47,21 @@ function getVersion(pModuleName) {
|
|
|
46
47
|
*/
|
|
47
48
|
|
|
48
49
|
export default async function tryImport(pModuleName, pSemanticVersion) {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
50
|
+
try {
|
|
51
|
+
if (pSemanticVersion) {
|
|
52
|
+
const lVersion = getVersion(pModuleName);
|
|
53
|
+
const lCoerced = coerce(lVersion);
|
|
54
|
+
if (
|
|
55
|
+
lVersion &&
|
|
56
|
+
lCoerced &&
|
|
57
|
+
!satisfies(lCoerced.version, pSemanticVersion)
|
|
58
|
+
) {
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
const lModule = await import(pModuleName);
|
|
63
|
+
return lModule.default ? lModule.default : lModule;
|
|
64
|
+
} catch (pError) {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
66
67
|
}
|
package/src/utl/try-require.cjs
CHANGED
|
@@ -9,12 +9,12 @@ const extractRootModuleName = require("./extract-root-module-name.cjs");
|
|
|
9
9
|
* @return the version of the module identified by pModuleName
|
|
10
10
|
*/
|
|
11
11
|
function getVersion(pModuleName) {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
12
|
+
// @ts-expect-error TS2345 extractRootModuleName can return either a string or
|
|
13
|
+
// undefined. If undefined this function will throw. Which is _fine_, even
|
|
14
|
+
// _expected_ in the context it's currently used
|
|
15
|
+
// eslint-disable-next-line import/no-dynamic-require, n/global-require, security/detect-non-literal-require
|
|
16
|
+
return require(join(extractRootModuleName(pModuleName), "package.json"))
|
|
17
|
+
.version;
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
/**
|
|
@@ -29,23 +29,23 @@ function getVersion(pModuleName) {
|
|
|
29
29
|
* @return {NodeModule | false }the (resolved) module identified by pModuleName or false
|
|
30
30
|
*/
|
|
31
31
|
function tryRequire(pModuleName, pSemanticVersion) {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
32
|
+
try {
|
|
33
|
+
if (pSemanticVersion) {
|
|
34
|
+
const lVersion = getVersion(pModuleName);
|
|
35
|
+
const lCoerced = coerce(lVersion);
|
|
36
|
+
if (
|
|
37
|
+
lVersion &&
|
|
38
|
+
lCoerced &&
|
|
39
|
+
!satisfies(lCoerced.version, pSemanticVersion)
|
|
40
|
+
) {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
// eslint-disable-next-line import/no-dynamic-require, n/global-require, security/detect-non-literal-require
|
|
45
|
+
return require(pModuleName);
|
|
46
|
+
} catch (pError) {
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
49
|
}
|
|
50
50
|
|
|
51
51
|
module.exports = tryRequire;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
const DEFAULT_INDENT = 4;
|
|
2
2
|
|
|
3
3
|
function indentString(pString, pCount) {
|
|
4
|
-
|
|
4
|
+
const lRegex = /^(?!\s*$)/gm;
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
return pString.replace(lRegex, " ".repeat(pCount));
|
|
7
7
|
}
|
|
8
8
|
|
|
9
9
|
/**
|
|
@@ -11,30 +11,30 @@ function indentString(pString, pCount) {
|
|
|
11
11
|
* @param {number} pMaxWidth
|
|
12
12
|
*/
|
|
13
13
|
function splitLine(pLine, pMaxWidth) {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
14
|
+
const lWords = pLine.split(" ");
|
|
15
|
+
const lWrappedLines = [];
|
|
16
|
+
let lCurrentLine = "";
|
|
17
|
+
let lCurrentWidth = 0;
|
|
18
|
+
|
|
19
|
+
for (const lWord of lWords) {
|
|
20
|
+
if (lCurrentWidth + lWord.length > pMaxWidth) {
|
|
21
|
+
lWrappedLines.push(lCurrentLine.trimEnd());
|
|
22
|
+
lCurrentLine = "";
|
|
23
|
+
lCurrentWidth = 0;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
if (lCurrentLine) {
|
|
27
|
+
lCurrentLine += " ";
|
|
28
|
+
lCurrentWidth += 1;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
lCurrentLine += lWord;
|
|
32
|
+
lCurrentWidth += lWord.length;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
lWrappedLines.push(lCurrentLine.trimEnd());
|
|
36
|
+
|
|
37
|
+
return lWrappedLines.join("\n");
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
/**
|
|
@@ -42,15 +42,15 @@ function splitLine(pLine, pMaxWidth) {
|
|
|
42
42
|
* @param {number} pMaxWidth - the maximum width of the wrapped string
|
|
43
43
|
*/
|
|
44
44
|
function wrapString(pString, pMaxWidth) {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
45
|
+
return pString
|
|
46
|
+
.split(/\r?\n/)
|
|
47
|
+
.map((pLine) => splitLine(pLine, pMaxWidth))
|
|
48
|
+
.join("\n");
|
|
49
49
|
}
|
|
50
50
|
|
|
51
51
|
export default function wrapAndIndent(pString, pIndent = DEFAULT_INDENT) {
|
|
52
|
-
|
|
53
|
-
|
|
52
|
+
const lMaxConsoleWidth = 78;
|
|
53
|
+
const lMaxWidth = lMaxConsoleWidth - pIndent;
|
|
54
54
|
|
|
55
|
-
|
|
55
|
+
return indentString(wrapString(pString, lMaxWidth), pIndent);
|
|
56
56
|
}
|