change-tracker

A minimal, type-safe change tracker for JavaScript/TypeScript. You can use it to track changes to files for example.

View on GitHub

Change Tracker

A minimal, type-safe change tracker for JavaScript/TypeScript. You can use it to track changes to files for example. But it can be used for other things as well, as long as you can represent the data as a collection of types with a contents: Buffer property.

Features:

Installation

This package is published to NPM and you can install it using the following command:

npm install @coursebook/change-tracker

Usage

[!NOTE] The type parameter for ChangeTrackerImpl and FileDataCollection must extend { contents: Buffer }.

Basic Usage

import {
  ChangeTrackerImpl,
  type FileDataCollection,
} from "@coursebook/change-tracker";

// Define a type for test file data
type TestFileData = { contents: Buffer };

// Create change tracker instance
const changeTracker = new ChangeTrackerImpl<TestFileData>({
  historyPath: "./example-history.json",
});

// Track changes in files
// You can change the files object to simulate changes and rerun this script
const files: FileDataCollection<TestFileData> = {
  "example.txt": {
    contents: Buffer.from("file content!"),
  },
};

const states = await changeTracker.trackChanges(files);

// Get state of a specific file
const state = changeTracker.getFileState("example.txt");
console.log(state?.status); // 'new', 'modified', 'unchanged', or 'untracked'

Build Pipeline Example

import {
  ChangeTrackerImpl,
  type FileDataCollection,
} from "@coursebook/change-tracker";

// Define a type for file data
type FileData = { contents: Buffer };

// Initialize components
const changeTracker = new ChangeTrackerImpl<FileData>({
  historyPath: ".content-smith/history.json",
});

// During build
async function build() {
  // Read files
  const files: FileDataCollection<FileData> = await readFiles();

  // Track changes
  const states = await changeTracker.trackChanges(files);

  // Use change states
  for (const [filepath, state] of states) {
    if (state.status !== "unchanged") {
      // Process changed files
      await processFile(files[filepath]);
    }
  }
}

Cloning the Repository

To make your workflow more organized, it’s a good idea to clone this repository into a directory named change-tracker-workspace. This helps differentiate the workspace from the change-tracker located in the packages directory.

git clone https://github.com/proj-coursebook/change-tracker change-tracker-workspace

cd change-tracker-workspace

Repository Structure

How to Use This Repo

Using a VSCode Multi-root Workspace

With Visual Studio Code, you can enhance your development experience by using a multi-root workspace to access packages, examples, and playgrounds simultaneously. This approach is more efficient than opening the root directory, or each package or example separately.

To set up a multi-root workspace:

  1. Open Visual Studio Code.
  2. Navigate to File > Open Workspace from File....
  3. Select the change-tracker.code-workspace file located at the root of the repository. This action will open all specified folders in one workspace.

The change-tracker.code-workspace file can be customized to include different folders or settings. Here’s a typical configuration:

{
  "folders": [
    {
      "path": "packages/change-tracker"
    },
    {
      "path": "examples/simple"
    }
  ],
  "settings": {
    // Add any workspace-specific settings here, for example:
    "git.openRepositoryInParentFolders": "always"
  }
}

Developing the Package

Change to the package directory and install dependencies:

cd packages/change-tracker
npm install

Package Management

When you are ready to publish your package:

npm run release

This single command will:

[!TIP] For detailed information about package publishing, versioning, and local development workflows, see the NPM Package Management Guide.