# Usage

# Import


import Intermodular from "intermodular";


import Intermodular, { PackageManager, DependencyType, PredicateFileOperation, CopyFilterFunction, CopyOptions } from "intermodular";

# Usage

Your boilerplate module is source module and target module is module installed your boilerplate as a dependency.

const intermodular = await Intermodular.new();

const targetModule = intermodular.targetModule;
const config = intermodular.config;

# Copy, Edit & Save Config Files

Copy all config files from your boilerplate to your my-project TypeScript project.

 // Copy all files from `my-boilerplate/config/` to `my-project/`
await intermodular.copy("config", ".");

// Update project's `package.json`.
targetModule.package.set("description", `My awesome project of ${targetModule.name}`);

// Get some deep data from cosmiconfig compatible config file from `my-project/.my-boilerplaterc` or any cosmiconfig compatible way automatically.
const buildFlags = intermodular.config.get("build.flags");
targetModule.package.set("scripts.build": `tsc ${buildFlags}`);

// Read and update target eslint configuration.
const eslintConfig = await targetModule.read("eslint", { cosmiconfig: true });
eslintConfig.set("rules.lines-between-class-members", ["warn", "always", { exceptAfterSingleLine: true }]);

await targetModule.saveAll();

# Install modules

Install modules into my-project.

await targetModule.install("lodash");

# Check Module Dependencies

targetModule.getDependencyVersion("typescript", ["devDependencies"]);

# Execute Command

await targetModule.execute("tsc", ["-b"]);

# Operations on Target Module

const moduleName = targetModule.name;
targetModule.pathOf("config/tsconfig.json"); // Absolute path.

# Work with Files

Work with files located in target module's directory.

await targetModule.read("README.md");
await targetModule.write("README.md", `Hello from ${targetModule.name}`, { overwrite: false });
await targetModule.remove(".myconfig", { if: (data: DataFile) => data.get("version").startsWith("2") });
await targetModule.exist("README.md");
await targetModule.isEqual(".myconfig", { name: "xyz", "0.1.1" });

# Operations on Data Files

Work with data files located in target module's directory.

// Do some individual data level operations:
targetModule.package.set("keywords", ["some-key"]);
targetModule.package.set("description", `My awesome ${moduleName}`);
targetModule.package.merge("scripts", { build: "tsc", test: "jest" });
targetModule.package.merge({ author: { name: "my-name", email: "[email protected]" } });
targetModule.package.sortKeys("scripts", { start: ["build", "lint"], end: ["release"] }); // Sort scripts, but reserve start and end.
targetModule.package.sortKeys({ start: ["name", "description"], end: ["dependencies", "devDependencies"] }); // Sort root keys, but reserve start and end.
await targetModule.package.save();

# Example Logger

import { createLogger, format, transports } from "winston";

const logger = createLogger({
  level: "debug",
  format: format.combine(format.colorize(), format.splat(), format.simple()),
  transports: [new transports.Console()],

const intermodular = await Intermodular.new({ logger });

# Reuse Modules between Intermodular Instances

If more than one source module would modify same target module, it is possible to use same module between intermodular instances. It may help to reduce disk operation by reducing redundant code execution and utilizing same cache etc.

const intermodularA = await Intermodular.new({ source: "path/to/source", target: "path/to/target" });
const intermodularB = await Intermodular.new({ source: "path/to/other", target: intermodularA.targetModule });