Utilities for handling files
npm install @codemod-utils/files
_Utilities for handling files_
@codemod-utils/files wraps the synchronous methods from node:fs, node:path, and glob to help you update many files in the same way.
Many of the methods make use of the file path, a string that represents the location of a file. Therefore, I recommend learning findFiles first, as it returns the paths of all files that match the search criteria.
Copies files from one directory (source) to another (destination). Creates the destination directory if it doesn't exist.
Copy LICENSE.md and README.md from the project root to the folder ember-container-query.
``ts
import { copyFiles } from '@codemod-utils/files';
const filePathMap = new Map([
['LICENSE.md', 'ember-container-query/LICENSE.md'],
['README.md', 'ember-container-query/README.md'],
]);
copyFiles(filePathMap, {
projectRoot,
});
`
Creates the directories specified in the file path, if they don't exist yet.
⚠️ Likely, you won't need this method but createFiles instead.
Create the folder ember-container-query if it doesn't exist.
`ts
import { createDirectory } from '@codemod-utils/files';
const newFilePath = 'ember-container-query/LICENSE.md';
const destination = join(projectRoot, newFilePath);
createDirectory(destination);
`
Create files. Creates the destination directory if it doesn't exist.
Create LICENSE.md and README.md in the project root.
`ts
import { createFiles } from '@codemod-utils/files';
const fileMap = new Map([
['LICENSE.md', 'The MIT License (MIT)'],
['README.md', '# ember-container-query'],
]);
createFiles(fileMap, {
projectRoot,
});
`
Often, you will want a codemod step to apply to select files. findFiles provides the paths of all files that match your search criteria (i.e. glob pattern, ignore list, and project root). The paths are sorted in alphabetical order.
> [!IMPORTANT]
>
> Glob patterns should always use / as a path separator, even on Windows systems.
Find all component templates in an Ember app.
`ts
import { findFiles } from '@codemod-utils/files';
const filePaths = findFiles('app/components/*/.hbs', {
projectRoot,
});
`
You can provide ignoreList, an array of file paths or glob patterns, to exclude files.
Find all component classes in an Ember app.
`ts
import { findFiles } from '@codemod-utils/files';
const filePaths = findFiles('app/components/*/.{js,ts}', {
ignoreList: ['*/.d.ts'],
projectRoot,
});
`
To look for multiple types of files, you can pass an array of glob patterns (pattern A or pattern B or ...).
`ts
import { findFiles } from '@codemod-utils/files';
const filePaths = findFiles([
'LICENSE.md',
'README.md',
], {
projectRoot,
});
`
`ts
import { findFiles } from '@codemod-utils/files';
const filePaths = findFiles([
'app/components/*/.hbs',
'tests/integration/components/*/-test.{js,ts}',
], {
projectRoot,
});
`
Returns the roots of all packages in a project.
Analyze each package by reading package.json.
`ts
import { readPackageJson } from '@codemod-utils/package-json';
const packageRoots = getPackageRoots({
projectRoot,
});
packageRoots.forEach((packageRoot) => {
const packageJson = readPackageJson({ projectRoot: packageRoot });
// ...
});
`
Creates a mapping of file paths, which can then be passed to copyFiles or moveFiles.
Map LICENSE.md to ember-container-query/LICENSE.md (and similarly for README.md).
`ts
import { mapFilePaths } from '@codemod-utils/files';
const filePaths = ['LICENSE.md', 'README.md'];
const filePathMap = mapFilePaths(filePaths, {
from: '',
to: 'ember-container-query',
});
`
Moves files from one directory (source) to another (destination). Creates the destination directory if it doesn't exist. Removes the source directory if it is empty.
Move LICENSE.md and README.md from the project root to a folder named ember-container-query.
`ts
import { moveFiles } from '@codemod-utils/files';
const filePathMap = new Map([
['LICENSE.md', 'ember-container-query/LICENSE.md'],
['README.md', 'ember-container-query/README.md'],
]);
moveFiles(filePathMap, {
projectRoot,
});
`
Parses a file path, similarly to parse() from node:path, but correctly handles file extensions with more than one ., e.g. .d.ts and .css.d.ts.
`ts
import { parseFilePath } from '@codemod-utils/files';
const filePath = 'src/components/navigation-menu.d.ts';
const { base, dir, ext, name } = parseFilePath(filePath);
// base -> 'navigation-menu.d.ts'
// dir -> 'src/components'
// ext -> '.d.ts'
// name -> 'navigation-menu'
`
Removes the directories specified in the file path, if they are empty.
⚠️ Likely, you won't need this method but removeFiles instead.
Remove the folder ember-container-query if it is empty.
`ts
import { removeDirectoryIfEmpty } from '@codemod-utils/files';
const filePath = 'ember-container-query/LICENSE.md';
removeDirectoryIfEmpty(filePath, {
projectRoot,
});
`
Removes files. Removes the source directory if it is empty.
Remove LICENSE.md and README.md from the project root.
`ts
import { removeFiles } from '@codemod-utils/files';
const filePaths = ['LICENSE.md', 'README.md'];
removeFiles(filePaths, {
projectRoot,
});
`
Forms a new file path by altering the path's directory.
Prepare to move components from addon to ember-container-query/src.
`ts
import { renamePathByDirectory } from '@codemod-utils/files';
const oldFilePath = 'addon/components/container-query.hbs';
const newFilePath = renamePathByDirectory(oldFilePath, {
from: 'addon',
to: 'ember-container-query/src',
});
// newFilePath -> 'ember-container-query/src/components/container-query.hbs'
``
- Node.js v20 or above
See the Contributing guide for details.
This project is licensed under the MIT License.