Skip to content

Commit

Permalink
Merge pull request #288 from MH4GF/detect-cruise-script
Browse files Browse the repository at this point in the history
feat: detect cruise script
  • Loading branch information
MH4GF committed Dec 9, 2023
2 parents f63973d + 4822db6 commit 6996344
Show file tree
Hide file tree
Showing 7 changed files with 90 additions and 15 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ For more information on config file, please see [the official documentation](htt

### Customizing cruise script

This action automatically adds necessary flags to your cruise script. The default script is:
This action automatically adds necessary flags to your cruise script based on package manager. For example, if you are using yarn, the default script is:

```bash
yarn run -s depcruise
Expand Down
3 changes: 1 addition & 2 deletions action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,8 @@ inputs:
required: false
description: 'read rules and options from file (e.g. .dependency-cruiser.js)'
cruise-script:
required: true
required: false
description: 'specify depcruise script (e.g. yarn depcruise)'
default: yarn run -s depcruise
working-directory:
required: false
description: 'running actions in another directory'
Expand Down
32 changes: 27 additions & 5 deletions dist/index.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion dist/index.js.map

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion src/options.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ export const getOptions = (): Promise<Options> => {
const changedFiles = core.getInput('target_files', { required: false }).split(' ')
const targetFiles = filterSupportedFiles(changedFiles)
const focus = formatFocusOption(targetFiles)
const cruiseScript = core.getInput('cruise_script', { required: true })
const cruiseScript = core.getInput('cruise_script', { required: false })
const packageManager = core.getInput('package_manager', { required: false })
const depcruiseConfigFilePath = getConfigFilePath()
const pr = context.payload.pull_request
Expand Down
32 changes: 31 additions & 1 deletion src/options/validateOptions.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ const baseOptions: Options = {
targetFiles: `test/runDepcruise/sample/__mocks__/test`,
focus: `"^test/runDepcruise/sample/__mocks__/test/fixtures/cjs/root_one.js|^test/runDepcruise/sample/__mocks__/test/fixtures/cjs/root_two.js"`,
depcruiseConfigFilePath: `test/runDepcruise/.dependency-cruiser.js`,
cruiseScript: 'yarn run -s depcruise',
cruiseScript: '',
workingDirectory: 'test/runDepcruise',
packageManager: 'yarn',
}
Expand Down Expand Up @@ -50,4 +50,34 @@ describe('validateOptions', () => {
new ValidationError('inputs.package_manager must be one of: yarn, npm, pnpm, bun'),
)
})

const cruiseScripts: Record<'packageManager' | 'result', string>[] = [
{ packageManager: 'yarn', result: 'yarn run -s depcruise' },
{ packageManager: 'npm', result: 'npx --no-install depcruise' },
{ packageManager: 'pnpm', result: 'pnpm exec depcruise' },
{ packageManager: 'bun', result: 'bun x depcruise' },
]
describe.each(cruiseScripts)(
'detect default cruise script when cruiseScript is empty',
({ packageManager, result }) => {
it(`return ${result} when packageManager is ${packageManager}`, async () => {
const options = {
...baseOptions,
packageManager,
cruiseScript: '',
}
const resultOptions = await validateOptions(options)
expect(resultOptions.cruiseScript).toBe(result)
})
},
)
it("return cruiseScript when cruiseScript isn't empty", async () => {
const options = {
...baseOptions,
packageManager: 'npm',
cruiseScript: 'npm run depcruise',
}
const resultOptions = await validateOptions(options)
expect(resultOptions.cruiseScript).toBe('npm run depcruise')
})
})
32 changes: 28 additions & 4 deletions src/options/validateOptions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,24 @@ const MESSAGE_INVALID_PACKAGE_MANAGER = `inputs.package_manager must be one of:
)}`
const WARNING_MESSAGES = [MESSAGE_REQUIRED_TARGET_FILES]

const packageManagerSchema = string()
.required()
.oneOf(SUPPORTED_PACKAGE_MANAGERS, MESSAGE_INVALID_PACKAGE_MANAGER)

const detectedCruiseScript = (_packageManager: string): string => {
const packageManager = packageManagerSchema.validateSync(_packageManager)
switch (packageManager) {
case 'yarn':
return 'yarn run -s depcruise'
case 'npm':
return 'npx --no-install depcruise'
case 'pnpm':
return 'pnpm exec depcruise'
case 'bun':
return 'bun x depcruise'
}
}

const optionsSchema = object({
token: string().required(),
owner: string().required(),
Expand All @@ -21,11 +39,17 @@ const optionsSchema = object({
targetFiles: string().required(MESSAGE_REQUIRED_TARGET_FILES),
focus: string().required(),
depcruiseConfigFilePath: string().required(),
cruiseScript: string().required(),
workingDirectory: string().required(),
packageManager: string()
.required()
.oneOf(SUPPORTED_PACKAGE_MANAGERS, MESSAGE_INVALID_PACKAGE_MANAGER),
packageManager: packageManagerSchema,
cruiseScript: string()
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
.transform((value) => (value === '' ? undefined : value))
.when('packageManager', ([packageManager], schema) => {
return typeof packageManager === 'string'
? schema.default(detectedCruiseScript(packageManager))
: schema
})
.required(),
})

export type Options = InferType<typeof optionsSchema>
Expand Down

0 comments on commit 6996344

Please sign in to comment.