Blog
release_workspace script in langchainjs source code.

release_workspace script in langchainjs source code.

In this article, we will review release_workspace script in langchainjs source code. we will look at:

  1. release script in package.json

  2. release_workspace.js file

release script in package.json

You will find the below code in langchainjs/package.json file 

   "release": "node release_workspace.js --workspace"

When you run this below command

npm run release

release_workspace.js is executed.

release_workspace.js file

In the langchainjs/release_workspace.json file, at line 507, you will find this below code:

main().catch((error) => {
  console.error(error);
  process.exit(1);
});

main function is defined in the same file at line 422.

async function main() {
  const program = new Command();
  program
    .description("Release a new workspace version to NPM.")
    .option("--workspace <workspace>", "Workspace name, eg @langchain/core")
    .option(
      "--bump-deps",
      "Whether or not to bump other workspaces that depend on this one."
    )
    .option("--tag <tag>", "Optionally specify a tag to publish to.");

  program.parse();

  /**
   * @type {{ workspace: string, bumpDeps?: boolean, tag?: string }}
   */
  const options = program.opts();
  if (!options.workspace) {
    throw new Error("--workspace is a required flag.");
  }

commanderjs is used to create cli as shown below:

 const program = new Command();

command is imported as shown below:

const { Command } = require("commander");

Below are the functions called in this main function:

  1. hasUncommittedChanges

  2. getAllWorkspaces

  3. checkoutReleaseBranch

  4. execSyncWithErrorHandling

  5. getUserInput

  6. getWorkspaceVersion

  7. runYarnRelease

  8. hasStagedChanges

  9. hasUncommittedChanges

  10. bumpDeps

Let’s take a closer look at execSyncWithErrorHandling function.

execSyncErrorHandling

This function is defined in the same file at line 18:

/**
 * Handles execSync errors and logs them in a readable format.
 * @param {string} command
 * @param {{ doNotExit?: boolean }} [options] - Optional configuration
 * @param {boolean} [options.doNotExit] - Whether or not to exit the process on error
 */
function execSyncWithErrorHandling(command, options = {}) {
  try {
    execSync(
      command,
      { stdio: "inherit" } // This will stream output in real-time
    );
  } catch (error) {
    console.error(error.message);
    if (!options.doNotExit) {
      process.exit(1);
    }
  }
}

execsync is imported as shown below:

const { execSync } = require("child_process");

About me

Hey, my name is Ramu Narasinga. I study codebase architecture in large open-source projects.

Email: ramu.narasinga@gmail.com

Build Shadcn CLI from scratch.

References:

  1. https://github.com/langchain-ai/langchainjs/blob/main/package.json#L43

  2. https://github.com/langchain-ai/langchainjs/blob/main/release_workspace.js#L507

  3. https://github.com/langchain-ai/langchainjs/blob/main/release_workspace.js#L422

  4. https://github.com/langchain-ai/langchainjs/blob/main/release_workspace.js#L391

  5. https://github.com/langchain-ai/langchainjs/blob/main/release_workspace.js#L352

  6. https://github.com/langchain-ai/langchainjs/blob/main/release_workspace.js#L140