Skip to content

Commit

Permalink
clean up v1 code and add tests
Browse files Browse the repository at this point in the history
  • Loading branch information
tido64 committed Oct 10, 2022
1 parent b60928d commit 2c5ad0a
Show file tree
Hide file tree
Showing 5 changed files with 238 additions and 331 deletions.
136 changes: 35 additions & 101 deletions packages/align-deps/src/check.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import { findBadPackages } from "./findBadPackages";
import { modifyManifest } from "./helpers";
import { updatePackageManifest } from "./manifest";
import { filterPreset, mergePresets } from "./preset";
import { getProfilesFor, resolveCustomProfiles } from "./profiles";
import { resolveCustomProfiles } from "./profiles";
import type {
AlignDepsConfig,
CheckConfig,
Expand All @@ -20,6 +20,36 @@ import type {
Preset,
} from "./types";

export function containsValidPresets(config: KitConfig["alignDeps"]): boolean {
const presets = config?.presets;
return !presets || (Array.isArray(presets) && presets.length > 0);
}

export function containsValidRequirements(
config: KitConfig["alignDeps"]
): boolean {
const requirements = config?.requirements;
if (requirements) {
if (Array.isArray(requirements)) {
return requirements.length > 0;
} else if (typeof requirements === "object") {
return (
Array.isArray(requirements.production) &&
requirements.production.length > 0
);
}
}
return false;
}

function ensurePreset(preset: Preset, requirements: string[]): void {
if (Object.keys(preset).length === 0) {
throw new Error(
`No profiles could satisfy requirements: ${requirements.join(", ")}`
);
}
}

export function getCheckConfig(
manifestPath: string,
{
Expand Down Expand Up @@ -96,99 +126,7 @@ export function getCheckConfig(
};
}

export function checkPackageManifest(
manifestPath: string,
options: CheckOptions
): number {
const result = options.config || getCheckConfig(manifestPath, options);
if (typeof result === "number") {
return result;
}

const {
kitType,
reactNativeVersion,
reactNativeDevVersion,
capabilities,
customProfilesPath,
manifest,
} = result;

if (capabilities.length === 0) {
return options.uncheckedReturnCode || 0;
}

const updatedManifest = updatePackageManifest(
manifest,
capabilities,
getProfilesFor(reactNativeVersion, customProfilesPath),
getProfilesFor(reactNativeDevVersion, customProfilesPath),
kitType
);

// Don't fail when manifests only have whitespace differences.
const updatedManifestJson = JSON.stringify(updatedManifest, undefined, 2);
const normalizedManifestJson = JSON.stringify(manifest, undefined, 2);

if (updatedManifestJson !== normalizedManifestJson) {
if (options.write) {
modifyManifest(manifestPath, updatedManifest);
} else {
const diff = diffLinesUnified(
normalizedManifestJson.split("\n"),
updatedManifestJson.split("\n"),
{
aAnnotation: "Current",
aColor: chalk.red,
bAnnotation: "Expected",
bColor: chalk.green,
}
);
console.log(diff);

error(
"Changes are needed to satisfy all requirements. Re-run with `--write` to have dep-check apply them."
);

const url = chalk.bold("https://aka.ms/dep-check");
info(`Visit ${url} for more information about dep-check.`);

return 1;
}
}

return 0;
}

function containsValidPresets(config: KitConfig["alignDeps"]): boolean {
const presets = config?.presets;
return !presets || (Array.isArray(presets) && presets.length > 0);
}

function containsValidRequirements(config: KitConfig["alignDeps"]): boolean {
const requirements = config?.requirements;
if (requirements) {
if (Array.isArray(requirements)) {
return requirements.length > 0;
} else if (typeof requirements === "object") {
return (
Array.isArray(requirements.production) &&
requirements.production.length > 0
);
}
}
return false;
}

function ensurePreset(preset: Preset, requirements: string[]): void {
if (Object.keys(preset).length === 0) {
throw new Error(
`No profiles could satisfy requirements: ${requirements.join(", ")}`
);
}
}

export function v2_getConfig(
export function getConfig(
manifestPath: string,
{ uncheckedReturnCode }: CheckOptions
): number | AlignDepsConfig | CheckConfig {
Expand Down Expand Up @@ -308,11 +246,11 @@ function resolve(
return { devPreset, prodPreset: initialProdPreset, capabilities };
}

export function v2_checkPackageManifest(
export function checkPackageManifest(
manifestPath: string,
options: CheckOptions
): number {
const result = options.config || v2_getConfig(manifestPath, options);
const result = options.config || getConfig(manifestPath, options);
if (typeof result === "number") {
return result;
}
Expand Down Expand Up @@ -383,9 +321,5 @@ export function v2_checkPackageManifest(
}

export function makeCheckCommand(options: CheckOptions): Command {
const check =
process.env["DEP_CHECK_VERSION"] === "2"
? v2_checkPackageManifest
: checkPackageManifest;
return (manifest: string) => check(manifest, options);
return (manifest: string) => checkPackageManifest(manifest, options);
}
32 changes: 1 addition & 31 deletions packages/align-deps/test/__snapshots__/check.app.test.ts.snap
Original file line number Diff line number Diff line change
@@ -1,36 +1,6 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`checkPackageManifest({ kitType: 'app' }) adds required dependencies 1`] = `
"{
\\"name\\": \\"awesome-repo\\",
\\"version\\": \\"1.0.0\\",
\\"dependencies\\": {
\\"@react-native-async-storage/async-storage\\": \\"^1.15.8\\",
\\"@react-native-community/async-storage\\": \\"^1.12.1\\",
\\"@react-native-community/netinfo\\": \\"^6.0.2\\",
\\"conan\\": \\"1.0.0\\",
\\"hermes-engine\\": \\"~0.7.0\\",
\\"quaid\\": \\"1.0.0\\",
\\"react\\": \\"17.0.1\\",
\\"react-native\\": \\"^0.64.2\\",
\\"react-native-lazy-index\\": \\"^2.1.1\\",
\\"react-native-reanimated\\": \\"^2.1.0\\",
\\"react-native-webview\\": \\"^11.4.2\\"
},
\\"rnx-kit\\": {
\\"reactNativeVersion\\": \\"^0.63 || ^0.64\\",
\\"kitType\\": \\"app\\",
\\"capabilities\\": [
\\"core-android\\",
\\"hermes\\",
\\"lazy-index\\"
]
}
}
"
`;

exports[`v2_checkPackageManifest({ kitType: 'app' }) (backwards compatibility) adds required dependencies 1`] = `
exports[`checkPackageManifest({ kitType: 'app' }) (backwards compatibility) adds required dependencies 1`] = `
"{
\\"name\\": \\"awesome-repo\\",
\\"version\\": \\"1.0.0\\",
Expand Down
40 changes: 10 additions & 30 deletions packages/align-deps/test/__snapshots__/check.test.ts.snap
Original file line number Diff line number Diff line change
@@ -1,52 +1,32 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`checkPackageManifest({ kitType: 'library' }) preserves indentation in 'package.json' 1`] = `
exports[`checkPackageManifest({ kitType: 'library' }) (backwards compatibility) preserves indentation in 'package.json' 1`] = `
"{
\\"name\\": \\"@rnx-kit/align-deps\\",
\\"version\\": \\"0.0.1\\",
\\"peerDependencies\\": {
\\"react\\": \\"17.0.1\\",
\\"react-native\\": \\"^0.64.2\\"
\\"react\\": \\"18.1.0\\",
\\"react-native\\": \\"^0.70.0\\"
},
\\"devDependencies\\": {
\\"react\\": \\"17.0.1\\",
\\"react-native\\": \\"^0.64.2\\"
\\"react\\": \\"18.1.0\\",
\\"react-native\\": \\"^0.70.0\\"
}
}
"
`;

exports[`checkPackageManifest({ kitType: 'library' }) prints warnings when detecting bad packages (with version range) 1`] = `
Array [
Array [
"warn",
"Known bad packages are found in '@rnx-kit/align-deps':
react-native-linear-gradient@<2.6.0: This package causes significant degradation in app start up time prior to 2.6.0.",
],
]
`;

exports[`checkPackageManifest({ kitType: 'library' }) prints warnings when detecting bad packages 1`] = `
Array [
Array [
"warn",
"Known bad packages are found in '@rnx-kit/align-deps':
react-native-linear-gradient@<2.6.0: This package causes significant degradation in app start up time prior to 2.6.0.",
],
]
`;

exports[`v2_checkPackageManifest({ kitType: 'library' }) (backwards compatibility) preserves indentation in 'package.json' 1`] = `
exports[`checkPackageManifest({ kitType: 'library' }) preserves indentation in 'package.json' 1`] = `
"{
\\"name\\": \\"@rnx-kit/align-deps\\",
\\"version\\": \\"0.0.1\\",
\\"peerDependencies\\": {
\\"react\\": \\"17.0.1\\",
\\"react-native\\": \\"^0.64.2\\"
\\"react\\": \\"18.1.0\\",
\\"react-native\\": \\"^0.70.0\\"
},
\\"devDependencies\\": {
\\"react\\": \\"17.0.1\\",
\\"react-native\\": \\"^0.64.2\\"
\\"react\\": \\"18.1.0\\",
\\"react-native\\": \\"^0.70.0\\"
}
}
"
Expand Down
35 changes: 2 additions & 33 deletions packages/align-deps/test/check.app.test.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import path from "path";
import { checkPackageManifest, v2_checkPackageManifest } from "../src/check";
import { checkPackageManifest } from "../src/check";

jest.mock("fs");
jest.unmock("@rnx-kit/config");
Expand All @@ -8,13 +8,8 @@ function fixturePath(name: string) {
return path.join(process.cwd(), "test", "__fixtures__", name);
}

describe("checkPackageManifest({ kitType: 'app' })", () => {
describe("checkPackageManifest({ kitType: 'app' }) (backwards compatibility)", () => {
const fs = require("fs");
const consoleWarnSpy = jest.spyOn(global.console, "warn");

beforeEach(() => {
consoleWarnSpy.mockReset();
});

afterAll(() => {
jest.clearAllMocks();
Expand All @@ -33,32 +28,6 @@ describe("checkPackageManifest({ kitType: 'app' })", () => {
expect(
checkPackageManifest(manifestPath, { loose: false, write: true })
).toBe(0);
expect(consoleWarnSpy).not.toBeCalled();
expect(destination).toBe(manifestPath);
expect(updatedManifest).toMatchSnapshot();
});
});

describe("v2_checkPackageManifest({ kitType: 'app' }) (backwards compatibility)", () => {
const fs = require("fs");

afterAll(() => {
jest.clearAllMocks();
});

test("adds required dependencies", () => {
const manifestPath = path.join(fixturePath("awesome-repo"), "package.json");

let destination = "";
let updatedManifest = "";
fs.__setMockFileWriter((dest, content) => {
destination = dest;
updatedManifest = content;
});

expect(
v2_checkPackageManifest(manifestPath, { loose: false, write: true })
).toBe(0);
expect(destination).toBe(manifestPath);
expect(updatedManifest).toMatchSnapshot();
});
Expand Down
Loading

0 comments on commit 2c5ad0a

Please sign in to comment.