12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- 'use strict'
- const micromatch = require('micromatch')
- const normalize = require('normalize-path')
- const path = require('path')
- const debug = require('debug')('lint-staged:gen-tasks')
- /**
- * Generates all task commands, and filelist
- *
- * @param {object} options
- * @param {Object} [options.config] - Task configuration
- * @param {Object} [options.cwd] - Current working directory
- * @param {boolean} [options.gitDir] - Git root directory
- * @param {boolean} [options.files] - Staged filepaths
- * @param {boolean} [options.relative] - Whether filepaths to should be relative to gitDir
- */
- module.exports = function generateTasks({
- config,
- cwd = process.cwd(),
- gitDir,
- files,
- relative = false,
- }) {
- debug('Generating linter tasks')
- const absoluteFiles = files.map((file) => normalize(path.resolve(gitDir, file)))
- const relativeFiles = absoluteFiles.map((file) => normalize(path.relative(cwd, file)))
- return Object.entries(config).map(([pattern, commands]) => {
- const isParentDirPattern = pattern.startsWith('../')
- const fileList = micromatch(
- relativeFiles
- // Only worry about children of the CWD unless the pattern explicitly
- // specifies that it concerns a parent directory.
- .filter((file) => {
- if (isParentDirPattern) return true
- return !file.startsWith('..') && !path.isAbsolute(file)
- }),
- pattern,
- {
- cwd,
- dot: true,
- // If pattern doesn't look like a path, enable `matchBase` to
- // match against filenames in every directory. This makes `*.js`
- // match both `test.js` and `subdirectory/test.js`.
- matchBase: !pattern.includes('/'),
- }
- ).map((file) => normalize(relative ? file : path.resolve(cwd, file)))
- const task = { pattern, commands, fileList }
- debug('Generated task: \n%O', task)
- return task
- })
- }
|