|
# EditorConfig JavaScript Core |
|
|
|
[](https://github.com/editorconfig/editorconfig-core-js/actions/workflows/node.js.yml) |
|
[](https://coveralls.io/github/editorconfig/editorconfig-core-js?branch=master) |
|
|
|
The EditorConfig JavaScript core will provide the same functionality as the |
|
[EditorConfig C Core][] and [EditorConfig Python Core][]. |
|
|
|
## Installation |
|
|
|
You need [node][] to use this package. |
|
|
|
To install the package locally: |
|
|
|
```bash |
|
$ npm install editorconfig |
|
``` |
|
|
|
To install the package system-wide: |
|
|
|
```bash |
|
$ npm install -g editorconfig |
|
``` |
|
|
|
## Usage |
|
|
|
### Options |
|
|
|
Most of the API takes an `options` object, which has the following defaults: |
|
|
|
```js |
|
{ |
|
config: '.editorconfig', |
|
version: pkg.version, |
|
root: '/', |
|
files: undefined, |
|
cache: undefined, |
|
}; |
|
``` |
|
|
|
<dl> |
|
<dt>config</dt> |
|
<dd>The name of the config file to look for in the current and every parent |
|
directory.</dd> |
|
|
|
<dt>version</dt> |
|
<dd>Which editorconfig spec version to use. Earlier versions had different |
|
defaults.</dd> |
|
|
|
<dt>root</dt> |
|
<dd>What directory to stop processing in, even if we haven't found a file |
|
containing root=true. Defaults to the root of the filesystem containing |
|
`process.cwd()`.</dd> |
|
|
|
<dt>files</dt> |
|
<dd>Pass in an empty array, which will be filled with one object for each |
|
config file processed. The objects will have the shape |
|
`{filename: "[DIRECTORY]/.editorconfig", glob: "*"}`</dd> |
|
|
|
<dt>cache</dt> |
|
<dd>If you are going to process more than one file in the same project, pass |
|
in a cache object. It must have `get(string): object|undefined` and |
|
`set(string, object)` methods, like a JavaScript Map. A long-running |
|
process might want to consider that this cache might grow over time, |
|
and that the config files might change over time. However, we leave any |
|
complexity of that nature to the caller, since there are so many different |
|
approaches that might be taken based on latency, memory, and CPU trade-offs. |
|
Note that some of the objects in the cache will be for files that did not |
|
exist. Those objects will have a `notfound: true` property. All of the |
|
objects will have a `name: string` property that contains the |
|
fully-qualified file name of the config file and a `root: boolean` property |
|
that describes if the config file had a `root=true` at the top. Any other |
|
properties in the objects should be treated as opaque.</dd> |
|
</dl> |
|
|
|
### in Node.js: |
|
|
|
#### parse(filePath[, options]) |
|
|
|
Search for `.editorconfig` files starting from the current directory to the |
|
root directory. Combine all of the sections whose section names match |
|
filePath into a single object. |
|
|
|
Example: |
|
|
|
```js |
|
const editorconfig = require('editorconfig'); |
|
const path = require('path'); |
|
|
|
const filePath = path.join(__dirname, 'sample.js'); |
|
|
|
(async () => { |
|
console.log(await editorconfig.parse(filePath, {files: []})); |
|
})(); |
|
/* |
|
{ |
|
indent_style: 'space', |
|
indent_size: 2, |
|
end_of_line: 'lf', |
|
charset: 'utf-8', |
|
trim_trailing_whitespace: true, |
|
insert_final_newline: true, |
|
tab_width: 2 |
|
}; |
|
assert.deepEqual(files, [ |
|
{ fileName: '[DIRECTORY]/.editorconfig', glob: '*' }, |
|
{ fileName: '[DIRECTORY]/.editorconfig', glob: '*.js' } |
|
]) |
|
*/ |
|
``` |
|
|
|
#### parseSync(filePath[, options]) |
|
|
|
Synchronous version of `editorconfig.parse()`. |
|
|
|
#### parseBuffer(fileContent) |
|
|
|
The `parse()` function above uses `parseBuffer()` under the hood. If you have |
|
the contents of a config file, and want to see what is being processed for |
|
just that file rather than the full directory hierarchy, this might be useful. |
|
|
|
#### parseString(fileContent) |
|
|
|
This is a thin wrapper around `parseBuffer()` for backward-compatibility. |
|
Prefer `parseBuffer()` to avoid an unnecessary UTF8-to-UTF16-to-UTF8 |
|
conversion. Deprecated. |
|
|
|
#### parseFromFiles(filePath, configs[, options]) |
|
|
|
Low-level interface, which exists only for backward-compatibility. Deprecated. |
|
|
|
Example: |
|
|
|
```js |
|
const editorconfig = require('editorconfig'); |
|
const fs = require('fs'); |
|
const path = require('path'); |
|
|
|
const configPath = path.join(__dirname, '.editorconfig'); |
|
const configs = [ |
|
{ |
|
name: configPath, |
|
contents: fs.readFileSync(configPath, 'utf8') |
|
} |
|
]; |
|
|
|
const filePath = path.join(__dirname, '/sample.js'); |
|
|
|
(async () => { |
|
console.log(await editorconfig.parseFromFiles(filePath, Promise.resolve(configs))) |
|
})(); |
|
/* |
|
{ |
|
indent_style: 'space', |
|
indent_size: 2, |
|
end_of_line: 'lf', |
|
charset: 'utf-8', |
|
trim_trailing_whitespace: true, |
|
insert_final_newline: true, |
|
tab_width: 2 |
|
}; |
|
*/ |
|
``` |
|
|
|
#### parseFromFilesSync(filePath, configs[, options]) |
|
|
|
Synchronous version of `editorconfig.parseFromFiles()`. Deprecated. |
|
|
|
### in Command Line |
|
|
|
```bash |
|
$ ./bin/editorconfig |
|
|
|
Usage: editorconfig [options] <FILEPATH...> |
|
|
|
Arguments: |
|
FILEPATH Files to find configuration for. Can be a hyphen (-) if you |
|
want path(s) to be read from stdin. |
|
|
|
Options: |
|
-v, --version Display version information from the package |
|
-f <path> Specify conf filename other than '.editorconfig' |
|
-b <version> Specify version (used by devs to test compatibility) |
|
--files Output file names that contributed to the configuration, |
|
rather than the configuation itself |
|
-h, --help display help for command |
|
``` |
|
|
|
Example: |
|
|
|
```bash |
|
$ ./bin/editorconfig /home/zoidberg/humans/anatomy.md |
|
charset=utf-8 |
|
insert_final_newline=true |
|
end_of_line=lf |
|
tab_width=8 |
|
trim_trailing_whitespace=sometimes |
|
``` |
|
|
|
```bash |
|
$ ./bin/editorconfig --files /home/zoidberg/humans/anatomy.md |
|
/home/zoidberg/.editorconfig [*] |
|
/home/zoidberg/.editorconfig [*.md] |
|
/home/zoidberg/humans/.editorconfig [*] |
|
``` |
|
|
|
## Development |
|
|
|
To install dependencies for this package run this in the package directory: |
|
|
|
```bash |
|
$ npm install |
|
``` |
|
|
|
Next, run the following commands: |
|
|
|
```bash |
|
$ npm run build |
|
$ npm link |
|
``` |
|
|
|
The global editorconfig will now point to the files in your development |
|
repository instead of a globally-installed version from npm. You can now use |
|
editorconfig directly to test your changes. |
|
|
|
If you ever update from the central repository and there are errors, it might |
|
be because you are missing some dependencies. If that happens, just run npm |
|
link again to get the latest dependencies. |
|
|
|
To test the command line interface: |
|
|
|
```bash |
|
$ editorconfig <filepath> |
|
``` |
|
|
|
# Testing |
|
|
|
[CMake][] must be installed to run the tests. |
|
|
|
To run the tests: |
|
|
|
```bash |
|
$ npm test |
|
``` |
|
|
|
To run the tests with increased verbosity (for debugging test failures): |
|
|
|
```bash |
|
$ npm run ci |
|
``` |
|
|
|
[EditorConfig C Core]: https://github.com/editorconfig/editorconfig-core |
|
[EditorConfig Python Core]: https://github.com/editorconfig/editorconfig-core-py |
|
[node]: http://nodejs.org/ |
|
[cmake]: http://www.cmake.org |
|
|