-
Notifications
You must be signed in to change notification settings - Fork 249
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
fix(config-util): adds utility that extracts dependency-cruiser optio…
…ns from a dependency-cruiser config (#933) ## Description - adds utility that extracts dependency-cruiser options from a dependency-cruiser config, and that returns an `ICruiseOptions` one can use as input parameter for the `cruise` function. This function also sets the `validate` attribute to `true` if there's a rule set in the config (and to `false` otherwise), so there's no need to do that anymore either. - corrects the documented method signature of `extractDepcruiseConfig` to what it really returns (an `IConfiguration`) - updates the docs/api.md documentation so all examples (1) run as intended (2) reflect current situation of the API. ## Motivation and Context fixes #932 `extractDepcruiseConfig` returns an `IConfiguration` object while the cruise function needs an `ICruiseOptions`. Changing the signature of `extractDepcruiseConfig` would constitute a breaking change - and `extractDepcruiseConfig` also has its own uses => we need an _additional_ utility function that translates a dependency-cruiser configuration file into an `ICruiseOptions` object. This PR adds that. ## Example ```typescript import { cruise, type ICruiseOptions, type IReporterOutput, type IResolveOptions, } from "dependency-cruiser"; import extractDepcruiseOptions from "dependency-cruiser/config-utl/extract-depcruise-options"; import extractTSConfig from "dependency-cruiser/config-utl/extract-ts-config"; import extractWebpackResolveConfig from "dependency-cruiser/config-utl/extract-webpack-resolve-config"; try { const lArrayOfFilesAndDirectoriesToCruise = ["src"]; const depcruiseOptions: ICruiseOptions = await extractDepcruiseOptions( "./.dependency-cruiser.json", ); const lWebpackResolveConfig = (await extractWebpackResolveConfig( "./webpack.config.js", )) as IResolveOptions; const tsConfig = extractTSConfig("./tsconfig.json"); const cruiseResult: IReporterOutput = await cruise( lArrayOfFilesAndDirectoriesToCruise, depcruiseOptions, lWebpackResolveConfig, { tsConfig, }, ); console.dir(cruiseResult.output, { depth: 10 }); } catch (pError) { console.error(pError); } ``` ## How Has This Been Tested? - [x] green ci - [x] additional integration tests ## Types of changes - [x] Bug fix (non-breaking change which fixes an issue) - [ ] Documentation only change - [ ] Refactor (non-breaking change which fixes an issue without changing functionality) - [ ] New feature (non-breaking change which adds functionality) - [ ] Breaking change (fix or feature that would cause existing functionality to change) ## Checklist - [x] 📖 - My change doesn't require a documentation update, or ... - it _does_ and I have updated it - [x] ⚖️ - The contribution will be subject to [The MIT license](https://github.com/sverweij/dependency-cruiser/blob/main/LICENSE), and I'm OK with that. - The contribution is my own original work. - I am ok with the stuff in [**CONTRIBUTING.md**](https://github.com/sverweij/dependency-cruiser/blob/main/.github/CONTRIBUTING.md).
- Loading branch information
Showing
13 changed files
with
229 additions
and
37 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
import extractDepcruiseConfig from "./extract-depcruise-config/index.mjs"; | ||
|
||
/** | ||
* | ||
* @param {import('../../../types/configuration.mjs').IConfiguration}} pConfiguration | ||
* @returns {import('../../../types/configuration.mjs').ICruiseOptions} | ||
*/ | ||
function configuration2options(pConfiguration) { | ||
/* c8 ignore next 1 */ | ||
const lConfiguration = structuredClone(pConfiguration || {}); | ||
const lReturnValue = structuredClone(lConfiguration?.options ?? {}); | ||
|
||
delete lConfiguration.options; | ||
lReturnValue.ruleSet = structuredClone(lConfiguration); | ||
lReturnValue.validate = Object.keys(lReturnValue.ruleSet).length > 0; | ||
|
||
return lReturnValue; | ||
} | ||
|
||
/** | ||
* | ||
* @param {string} pConfigFileName | ||
* @returns {Promise<import('../../../types/configuration.mjs').ICruiseOptions>} | ||
*/ | ||
export default async function extractDepcruiseOptions(pConfigFileName) { | ||
const lReturnValue = await extractDepcruiseConfig(pConfigFileName); | ||
return configuration2options(lReturnValue); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
export default {}; |
30 changes: 30 additions & 0 deletions
30
test/config-utl/__mocks__/depcruiseconfig/rules.sub-not-allowed-error-with-options.json
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
{ | ||
"allowed": [ | ||
{ | ||
"from": {}, | ||
"to": {} | ||
} | ||
], | ||
"forbidden": [ | ||
{ | ||
"name": "sub-not-allowed", | ||
"severity": "error", | ||
"from": {}, | ||
"to": { | ||
"path": "sub" | ||
} | ||
} | ||
], | ||
"options": { | ||
"includeOnly": ["src"], | ||
"reporterOptions": { | ||
"text": { | ||
"highlightFocused": true | ||
} | ||
}, | ||
"cache": { | ||
"strategy": "metadata", | ||
"compress": true | ||
} | ||
} | ||
} |
21 changes: 21 additions & 0 deletions
21
test/config-utl/__mocks__/depcruiseconfig/rules.sub-not-allowed-error.json
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
{ | ||
"allowed": [ | ||
{ | ||
"from": { | ||
}, | ||
"to": { | ||
} | ||
} | ||
], | ||
"forbidden": [ | ||
{ | ||
"name": "sub-not-allowed", | ||
"severity": "error", | ||
"from": { | ||
}, | ||
"to": { | ||
"path": "sub" | ||
} | ||
} | ||
] | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,71 @@ | ||
import { deepEqual } from "node:assert/strict"; | ||
import { join } from "node:path"; | ||
import { fileURLToPath } from "node:url"; | ||
import loadOptions from "#config-utl/extract-depcruise-options.mjs"; | ||
|
||
const __dirname = fileURLToPath(new URL(".", import.meta.url)); | ||
const mockDirectory = join(__dirname, "__mocks__", "depcruiseconfig"); | ||
|
||
describe("[I] config-utl/extract-depcruise-options", () => { | ||
it("correctly converts an empty configuration to options", async () => { | ||
const lFoundOptions = await loadOptions(join(mockDirectory, "empty.mjs")); | ||
deepEqual(lFoundOptions, { | ||
ruleSet: {}, | ||
validate: false, | ||
}); | ||
}); | ||
|
||
it("correctly converts a configuration with a rule set to options", async () => { | ||
const lFoundOptions = await loadOptions( | ||
join(mockDirectory, "rules.sub-not-allowed-error.json"), | ||
); | ||
deepEqual(lFoundOptions, { | ||
ruleSet: { | ||
allowed: [{ from: {}, to: {} }], | ||
forbidden: [ | ||
{ | ||
name: "sub-not-allowed", | ||
severity: "error", | ||
from: {}, | ||
to: { | ||
path: "sub", | ||
}, | ||
}, | ||
], | ||
}, | ||
validate: true, | ||
}); | ||
}); | ||
|
||
it("correctly converts a configuration with a rule set, & puts options in the right spot", async () => { | ||
const lFoundOptions = await loadOptions( | ||
join(mockDirectory, "rules.sub-not-allowed-error-with-options.json"), | ||
); | ||
deepEqual(lFoundOptions, { | ||
ruleSet: { | ||
allowed: [{ from: {}, to: {} }], | ||
forbidden: [ | ||
{ | ||
name: "sub-not-allowed", | ||
severity: "error", | ||
from: {}, | ||
to: { | ||
path: "sub", | ||
}, | ||
}, | ||
], | ||
}, | ||
validate: true, | ||
includeOnly: ["src"], | ||
reporterOptions: { | ||
text: { | ||
highlightFocused: true, | ||
}, | ||
}, | ||
cache: { | ||
strategy: "metadata", | ||
compress: true, | ||
}, | ||
}); | ||
}); | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,25 +1,27 @@ | ||
import type { ICruiseOptions } from "../options.mjs"; | ||
import type { IConfiguration } from "../configuration.mjs"; | ||
|
||
/** | ||
* Reads the file with name `pConfigFileName` returns the parsed cruise | ||
* options. | ||
* configuration. If you're looking for the function to read a | ||
* dependency-cruiser configuration file and put the result into the `cruise` | ||
* function use `extractDepcruiseOptions` instead.s | ||
* | ||
* You can safely ignore the optional parameters. This should work (given | ||
* `.dependency-cruiser.js` exists and contains a valid dependency-cruiser | ||
* config) | ||
* | ||
* ```javascript | ||
* const depcruiseConfig = extractDepcruiseConfig("./.dependency-cruiser.js") | ||
* const depcruiseConfig = await extractDepcruiseConfig("./.dependency-cruiser.js") | ||
* ``` | ||
* | ||
* @param pConfigFileName | ||
* @param pAlreadyVisited | ||
* @param pBaseDirectory | ||
* @return dependency-cruiser options | ||
* @return dependency-cruiser configuration | ||
* @throws when the config is not valid (/ does not exist/ isn't readable) | ||
*/ | ||
export default function extractDepcruiseConfig( | ||
pConfigFileName: string, | ||
pAlreadyVisited?: Set<string>, | ||
pBaseDirectory?: string | ||
): Promise<ICruiseOptions>; | ||
pBaseDirectory?: string, | ||
): Promise<IConfiguration>; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
import type { ICruiseOptions } from "../options.mjs"; | ||
|
||
/** | ||
* Reads the file with name `pConfigFileName` returns the parsed cruise | ||
* options you can use as | ||
* | ||
* ```javascript | ||
* const depcruiseOptions = await extractDepcruiseOptions("./.dependency-cruiser.js") | ||
* const cruiseResult = await cruise(["./src"], depcruiseOptions); | ||
* ``` | ||
* | ||
* @param pConfigFileName | ||
* @return dependency-cruiser options | ||
* @throws when the config is not valid (/ does not exist/ isn't readable) | ||
*/ | ||
export default function extractDepcruiseOptions( | ||
pConfigFileName: string, | ||
): Promise<ICruiseOptions>; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters