ts-morph

Adding Source Files

You will need to populate the project object with source files.

By a tsconfig.json

Source files will be added when instantiating with a tsConfigFilePath:

import { Project } from "ts-morph";

const project = new Project({
  tsConfigFilePath: "path/to/tsconfig.json",
});

...and this can be disabled by setting skipAddingFilesFromTsConfig: true:

const project = new Project({
  tsConfigFilePath: "path/to/tsconfig.json",
  skipAddingFilesFromTsConfig: true,
});

Alternatively, populate the project object by calling addSourceFilesFromTsConfig:

project.addSourceFilesFromTsConfig("path/to/tsconfig.json");

Source File Dependency Resolution

By default, all the source files added to the project in the constructor via a tsconfig.json will automatically be analyzed to include the source files they depend on. If you wish to skip this analysis step, then provide the skipFileDependencyResolution option:

const project = new Project({
  tsConfigFilePath: "path/to/tsconfig.json",
  skipFileDependencyResolution: true,
});

If you are adding source files to a project in other ways and want to ensure the all the source files depended on by the added source files are also included in the Project, then call the .resolveSourceFileDependencies() after adding everything:

const project = new Project();

// add everything to the project
project.addSourceFilesFromTsConfig("dir1/tsconfig.json");
project.addSourceFilesFromTsConfig("dir2/tsconfig.json");
project.addSourceFilesAtPaths("dir3/**/*{.d.ts,.ts}");

// optionally call this when complete to resolve and
// add the dependent source files to the project
project.resolveSourceFileDependencies();

By file globs or file paths

Specify as many file globs or file paths as you wish:

project.addSourceFilesAtPaths("folder/**/*{.d.ts,.ts}");
project.addSourceFilesAtPaths(["folder/file.ts", "folder/otherFile.ts"]);
project.addSourceFilesAtPaths(["**/*.ts", "!**/*.d.ts"]);

By file path

const sourceFile = project.addSourceFileAtPath("path/to/file.ts"); // or addSourceFileAtPathIfExists

By structure

Create source files based on an object that looks like the AST of a source file:

const sourceFile = project.createSourceFile("path/to/myStructureFile.ts", {
  statements: [{
    kind: StructureKind.Enum,
    name: "MyEnum",
    members: [{
      name: "member",
    }],
  }, {
    kind: StructureKind.Class,
    name: "MyClass",
    // etc...
  }],
  // etc...
});

The above would create a source file with the following text:

enum MyEnum {
  member,
}

class MyClass {
}

By string

const fileText = "enum MyEnum {\n}\n";
const sourceFile = project.createSourceFile("path/to/myNewFile.ts", fileText);

By writer function

const sourceFile = project.createSourceFile("path/to/myOtherNewFile.ts", writer => {
  writer
    .writeLine("import * as ts from 'typescript';").blankLine()
    .writeLine("export class MyClass {}");
});

Options

createSourceFile will throw an error if the file already exists. To not throw an error, set the overwrite option to true.

const sourceFile = project.createSourceFile("path/to/myNewFile.ts", "", { overwrite: true });

Note

Adding source files to the project from a structure, writer function, or text will act like any other source file, but they will not be saved to the disk unless you ask it to be.

// save it to the disk if you wish:
await sourceFile.save(); // or saveSync();