Nashville Plays Music

    fixturify-project
    TypeScript icon, indicating that this package has built-in type declarations

    5.0.2 • Public • Published

    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 writeSync()
    project.baseDir = 'some/root/';
    
    await project.write();
    
    // after writeSync(), 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/root/package.json
    some/root/index.js
    some/root/node_modules/mocha/package.json
    some/root/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.root

    Deprecated

    Kind: instance property of Project Read only: true

    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.writeSync()

    Deprecated

    Kind: instance method of Project

    project.addDependency() ⇒

    Adds a dependency to the Project's package.json.

    Kind: instance method of Project Returns:

    • The Project instance.

    project.addDevDependency() ⇒

    Adds a devDependency to the Project's package.json.

    Kind: instance method of Project Returns:

    • The Project instance.

    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:

    • The cloned Project.

    project.dispose()

    Disposes of the tmp directory that the Project is stored in.

    Kind: instance method of Project

    Project.fromDir(root, opts) ⇒

    Reads an existing project from the specified root.

    Kind: static method of Project Returns:

    • The deserialized Project.
    Param Description
    root

    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.

    Keywords

    none

    Install

    npm i fixturify-project

    DownloadsWeekly Downloads

    242,406

    Version

    5.0.2

    License

    MIT

    Unpacked Size

    56 kB

    Total Files

    6

    Last publish

    Collaborators

    • krisselden
    • ef4
    • rwjblue
    • scalvert
    • stefanpenner