Skip to content

@codemod-utils/package-json

Utilities for handling package.json

What is it?

@codemod-utils/package-json helps you read and update package.json.

API

convertToMap

Converts an object to a Map. Use it along with convertToObject to update objects in package.json.

ts
/**
 * @param object
 *
 * An object.
 *
 * @return
 *
 * The object as a Map.
 */
function convertToMap(object?: {}): Map<string, unknown>;
ts
/**
 * Remove dependencies (if they exist) from `package.json`.
 */
const dependencies = convertToMap(packageJson['dependencies']);

const packagesToDelete = [
  '@embroider/macros',
  'ember-auto-import',
  'ember-cli-babel',
  'ember-cli-htmlbars',
];

packagesToDelete.forEach((packageName) => {
  dependencies.delete(packageName);
});

packageJson['dependencies'] = convertToObject(dependencies);

convertToObject

Converts a Map (back) to an object. Use it along with convertToMap to update objects in package.json.

ts
/**
 * @param object
 *
 * A Map.
 *
 * @return
 *
 * The Map as an object. (The object keys are sorted in alphabetical
 * order.)
 */
function convertToObject(map?: Map<any, any>): any;
ts
/**
 * Remove dependencies (if they exist) from `package.json`.
 */
const dependencies = convertToMap(packageJson['dependencies']);

const packagesToDelete = [
  '@embroider/macros',
  'ember-auto-import',
  'ember-cli-babel',
  'ember-cli-htmlbars',
];

packagesToDelete.forEach((packageName) => {
  dependencies.delete(packageName);
});

packageJson['dependencies'] = convertToObject(dependencies);

getPackageType

Determines package type based on Ember's conventions.

Possible values are 'node', 'v1-addon', 'v1-app', 'v2-addon', or 'v2-app'.

ts
/**
 * @param packageJson
 *
 * A JSON that represents `package.json`.
 *
 * @return
 *
 * A string that represents package type (`'node'`, `'v1-addon'`,
 * `'v1-app'`, `'v2-addon'`, or `'v2-app'`).
 */
function getPackageType(packageJson: PackageJson): PackageType;
ts
/**
 * Make an early exit in a codemod that converts v1 addons to v2.
 */
const packageType = getPackageType(packageJson);

if (packageType === 'v2-addon') {
  return;
}

// Convert to v2

readPackageJson

Reads package.json and returns the parsed JSON.

IMPORTANT

readPackageJson checks that package.json exists and is a valid JSON.

ts
/**
 * @param options
 *
 * An object with `projectRoot`.
 *
 * @return
 *
 * A JSON that represents `package.json`.
 */
function readPackageJson(options: Options): PackageJson;
ts
/**
 * Check if a project has `typescript` as a dependency.
 */
import { readPackageJson } from '@codemod-utils/package-json';

const { dependencies, devDependencies } = readPackageJson({
  projectRoot,
});

const projectDependencies = new Map([
  ...Object.entries(dependencies ?? {}),
  ...Object.entries(devDependencies ?? {}),
]);

const hasTypeScript = projectDependencies.has('typescript');

validatePackageJson

(Type-)Checks that the fields name and version exist, in the sense that their values are a non-empty string.

ts
/**
 * @param packageJson
 *
 * A JSON that represents `package.json`.
 */
function validatePackageJson(
  packageJson: PackageJson,
): asserts packageJson is ValidatedPackageJson;
ts
import {
  readPackageJson,
  validatePackageJson,
} from '@codemod-utils/package-json';

const packageJson = readPackageJson({ projectRoot });

validatePackageJson(packageJson);

// Both guaranteed to be `string` (not `undefined`)
const { name, version } = packageJson;