6.0.0 • Published 8 months ago

fixturify-project v6.0.0

Weekly downloads
297,966
License
MIT
Repository
github
Last release
8 months ago

node-fixturify-project

npm version CI

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

yarn add 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; // => the contents of package.json for the given project
project.files; // => read or write the set of files further

// if you don't set this, a new temp dir will be made for you when you write()
project.baseDir = 'some/base/dir/';

await project.write();

// after write(), you can read project.baseDir even if you didn't set it
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');

// explicit target
project.linkDependency('b', { target: '/example/b' });

// this will follow node resolution rules to lookup "c" from "../elsewhere"
project.linkDependency('c', { baseDir: '/example' });

// this will follow node resolution rules to lookup "my-aliased-name" from "../elsewhere"
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

Kind: instance property of Project

ParamDescription
dirThe directory path.

project.baseDir

Kind: instance property of Project Read only: true

project.name : string

Kind: instance property of Project

project.name

Kind: instance property of Project

project.version : string

Kind: instance property of Project

project.version

Kind: instance property of Project

project.mergeFiles(dirJSON)

Kind: instance method of Project

ParamDescription
dirJSONAn object containing a directory representation to merge.

project.write(dirJSON?)

Kind: instance method of Project

ParamDescription
dirJSON?An optional object containing a directory representation to write.

project.addDependency() ⇒

Kind: instance method of Project Returns:

project.addDevDependency() ⇒

Kind: instance method of Project Returns:

project.removeDependency(name)

Kind: instance method of Project

ParamDescription
nameThe name of the dependency to remove.

project.removeDevDependency(name)

Kind: instance method of Project

ParamDescription
nameThe name of the devDependency to remove.

project.linkDependency(name)

Kind: instance method of Project

ParamDescription
nameThe name of the dependency to link.

project.linkDevDependency(name)

Kind: instance method of Project

ParamDescription
nameThe name of the dependency to link.

project.dependencyProjects() ⇒

Kind: instance method of Project Returns:

project.devDependencyProjects() ⇒

Kind: instance method of Project Returns:

project.clone() ⇒

Kind: instance method of Project Returns:

project.dispose()

Kind: instance method of Project

Project.fromDir(baseDir, opts) ⇒

Kind: static method of Project Returns:

ParamDescription
baseDirThe base directory to read the project from.
optsAn options object.
opts.linkDepsInclude linking dependencies from the Project's node_modules.
opts.linkDevDepsInclude linking devDependencies from the Project's node_modules.
6.0.0

8 months ago

5.2.0

1 year ago

5.1.0

2 years ago

5.0.3

2 years ago

5.0.2

2 years ago

5.0.1

2 years ago

5.0.0

2 years ago

4.1.2

2 years ago

4.1.1

2 years ago

4.1.0

2 years ago

4.0.2

3 years ago

4.0.1-alpha.2

3 years ago

4.0.1-alpha.3

3 years ago

4.0.1-alpha.0

3 years ago

4.0.1-alpha.1

3 years ago

4.0.1

3 years ago

4.0.0

3 years ago

3.0.2

3 years ago

3.0.1

3 years ago

3.0.0

3 years ago

2.1.1

3 years ago

2.1.0

4 years ago

2.0.0

4 years ago

1.10.0

4 years ago

1.9.1

5 years ago

1.9.0

5 years ago

1.8.2

5 years ago

1.8.1

5 years ago

1.8.0

5 years ago

1.7.0

5 years ago

1.6.0

5 years ago

1.5.3

6 years ago

1.5.2

6 years ago

1.5.1

6 years ago

1.5.0

6 years ago

1.4.0

6 years ago

1.3.0

6 years ago

1.2.0

6 years ago

1.1.0

6 years ago

1.0.1

6 years ago

1.0.0

6 years ago