node-fixturify-project
When implementing JS build tooling it is common to have complete projects as
fixture data. Unfortunately fixtures committed to disk can be somewhat hard to
maintain and augment.
Basic Usage
npm install --save-dev fixturify-project
const { Project } = require('fixturify-project');
const project = new Project('rsvp', '3.1.4', {
files: {
'index.js': 'module.exports = "Hello, World!"',
},
});
project.addDependency('mocha', '5.2.0');
project.addDependency('chai', '5.2.0');
project.pkg;
project.files;
project.baseDir = 'some/base/dir/';
await project.write();
expect(fs.existsSync(join(project.baseDir, 'index.js'))).to.eql(true);
The above example produces the following files (and most importantly the
appropriate file contents:
some/base/dir/package.json
some/base/dir/index.js
some/base/dir/node_modules/mocha/package.json
some/base/dir/node_modules/chai/package.json
Nesting Dependencies
addDependency
returns another Project
instance, so you can nest arbitrarily deep:
const { Project } = require('fixturify-project');
let project = new Project('rsvp');
let a = project.addDependency('a');
let b = a.addDependency('b');
let c = b.addDependency('c');
await project.write();
Which produces:
$TMPDIR/xxx/package.json
$TMPDIR/xxx/index.js
$TMPDIR/xxx/node_modules/a/package.json
$TMPDIR/xxx/node_modules/a/node_modules/b/package.json
$TMPDIR/xxx/node_modules/b/node_modules/b/node_modules/c/package.json
Linking to real dependencies
Instead of creating all packages from scratch, you can link to real preexisting
packages. This lets you take a real working package and modify it and its
dependencies and watch how it behaves.
const { Project } = require('fixturify-project');
let project = new Project();
let a = project.addDependency('a');
project.linkDependency('b', { target: '/example/b' });
project.linkDependency('c', { baseDir: '/example' });
project.linkDependency('d', { baseDir: '/example', resolveName: 'my-aliased-name' });
await project.write();
Produces:
$TMPDIR/xxx/package.json
$TMPDIR/xxx/index.js
$TMPDIR/xxx/node_modules/a/package.json
$TMPDIR/xxx/node_modules/a/node_modules/b -> /example/b
$TMPDIR/xxx/node_modules/b/node_modules/c -> /example/node_modules/c
$TMPDIR/xxx/node_modules/b/node_modules/d -> /example/node_modules/my-aliased-name
When constructing a whole Project from a directory, you can choose to link all
dependencies instead of copying them in as Projects:
let project = Project.fromDir('./sample-project', { linkDeps: true });
project.files['extra.js'] = '// stuff';
await project.write();
This will generate a new copy of sample-project, with symlinks to all its
original dependencies, but with "extra.js" added.
By default, linkDeps
will only link up dependencies
(which is appropriate
for libraries). If you want to also include devDependencies
(which is
appropriate for apps) you can use linkDevDeps
instead.
API
Project
Kind: global class
project.baseDir
Sets the base directory of the project.
Kind: instance property of Project
Param | Description |
---|
dir | The directory path. |
project.baseDir
Gets the base directory path, usually a tmp directory unless a baseDir has been explicitly set.
Kind: instance property of Project
Read only: true
project.name : string
Gets the package name from the package.json.
Kind: instance property of Project
project.name
Sets the package name in the package.json.
Kind: instance property of Project
project.version : string
Gets the version number from the package.json.
Kind: instance property of Project
project.version
Sets the version number in the package.json.
Kind: instance property of Project
project.mergeFiles(dirJSON)
Merges an object containing a directory represention with the existing files.
Kind: instance method of Project
Param | Description |
---|
dirJSON | An object containing a directory representation to merge. |
project.write(dirJSON?)
Writes the existing files property containing a directory representation to the tmp directory.
Kind: instance method of Project
Param | Description |
---|
dirJSON? | An optional object containing a directory representation to write. |
project.addDependency() ⇒
Adds a dependency to the Project's package.json.
Kind: instance method of Project
Returns:
project.addDevDependency() ⇒
Adds a devDependency to the Project's package.json.
Kind: instance method of Project
Returns:
project.removeDependency(name)
Removes a dependency to the Project's package.json.
Kind: instance method of Project
Param | Description |
---|
name | The name of the dependency to remove. |
project.removeDevDependency(name)
Removes a devDependency.
Kind: instance method of Project
Param | Description |
---|
name | The name of the devDependency to remove. |
project.linkDependency(name)
Links a dependency.
Kind: instance method of Project
Param | Description |
---|
name | The name of the dependency to link. |
project.linkDevDependency(name)
Links a devDependency.
Kind: instance method of Project
Param | Description |
---|
name | The name of the dependency to link. |
project.dependencyProjects() ⇒
Kind: instance method of Project
Returns:
- An array of the dependencies for this Projct.
project.devDependencyProjects() ⇒
Kind: instance method of Project
Returns:
- An array of the devDependencies for this Projct.
project.clone() ⇒
Kind: instance method of Project
Returns:
project.dispose()
Disposes of the tmp directory that the Project is stored in.
Kind: instance method of Project
Project.fromDir(baseDir, opts) ⇒
Reads an existing project from the specified base dir.
Kind: static method of Project
Returns:
- The deserialized Project.
Param | Description |
---|
baseDir | The base directory to read the project from. |
opts | An options object. |
opts.linkDeps | Include linking dependencies from the Project's node_modules. |
opts.linkDevDeps | Include linking devDependencies from the Project's node_modules. |