jdalrymple/semantic-release-npmx

View on GitHub
src/index.js

Summary

Maintainability
A
0 mins
Test Coverage
import { file as createFile } from 'tempy';
import { addChannelNpm } from './channel-utils';
import { prepareNpm } from './prepare-utils';
import { publishNpm } from './publish-utils';
import { verifyNpm } from './verify-utils';
import { getAllPkgInfo } from './package-config';
import { summarizeReleasesInfo, getLegacyToken } from './npm-utils';

const npmrc = createFile({ name: '.npmrc' });

export const status = {
  verified: false,
  prepared: false,
};

function modifyContext(context) {
  const legacyToken = getLegacyToken(context.env);
  const env = {
    ...legacyToken,
    ...context.env,
  };

  return { ...context, env };
}

/**
 * If the npm publish plugin is used and has `npmPublish`, `tarballDir` or
 * `pkgRoot` configured, validate them now in order to prevent any release
 * if the configuration is wrong
 */
export async function verifyConditions(pluginConfig = {}, context = {}) {
  const ctx = modifyContext(context);

  await verifyNpm(npmrc, ctx, pluginConfig);

  status.verified = true;
}

export async function prepare(pluginConfig = {}, context = {}) {
  const ctx = modifyContext(context);

  if (!status.verified) await verifyConditions(pluginConfig, ctx);

  const { rootPkg, subPkgs } = await getAllPkgInfo(ctx, pluginConfig);

  // TODO: Adjust this to handle independant versioning
  // TODO: May have to explicitly default the config properties if any of the properties clash in the future
  await Promise.all(
    [rootPkg, ...subPkgs].map(p => {
      const { pkgRoot, ...config } = pluginConfig[p.name] || pluginConfig.default || pluginConfig;

      return prepareNpm(npmrc, ctx, { pkgRoot: p.path, ...config }, p.private || false);
    }),
  );

  status.prepared = true;
}

export async function publish(pluginConfig, context) {
  const ctx = modifyContext(context);

  if (!status.prepared) await prepare(pluginConfig, ctx);

  const { rootPkg, subPkgs } = await getAllPkgInfo(ctx, pluginConfig);

  const releaseInfo = await Promise.all(
    [rootPkg, ...subPkgs].map(p => {
      const { pkgRoot, ...config } = pluginConfig[p.name] || pluginConfig.default || pluginConfig;

      return publishNpm(npmrc, ctx, { pkgRoot: p.path, ...config }, p);
    }),
  );

  return summarizeReleasesInfo(releaseInfo);
}

export async function addChannel(pluginConfig = {}, context = {}) {
  const ctx = modifyContext(context);

  if (!status.verified) await verifyConditions(pluginConfig, ctx);

  const { rootPkg, subPkgs } = await getAllPkgInfo(ctx, pluginConfig);

  const releaseInfo = await Promise.all(
    [rootPkg, ...subPkgs].map(p => {
      const { pkgRoot, ...config } = pluginConfig[p.name] || pluginConfig.default || pluginConfig;

      return addChannelNpm(npmrc, ctx, { pkgRoot: p.path, ...config }, p);
    }),
  );

  return summarizeReleasesInfo(releaseInfo);
}