.then((dataStr) => {
          // Inflate to real object and re-use previous test assertions.
          const data = JSON.parse(dataStr);

          expect(data).to.have.keys("meta", "assets");
          expect(data).to.have.property("meta").that.eql(merge(BASE_SCOPED_DATA.meta, {
            depended: {
              num: 5,
            },
            files: {
              num: 7,
            },
            installed: {
              num: 4,
            },
            packages: {
              num: 2,
            },
            resolved: {
              num: 4,
            },
          }));

          let expectProp;

          expectProp = expect(data).to.have.nested.property(
            "assets.bundle\\.js.packages.@scope/foo.1\\.1\\.1.node_modules/@scope/foo",
          );
          expectProp.to.have.property("skews").that.has.length(2);
          expectProp.to.have.property("modules").that.has.length(2);

          expectProp = expect(data).to.have.nested.property(
            "assets.bundle\\.js.packages.@scope/foo.2\\.2\\.2.node_modules/uses-foo/node_modules/@scope/foo",
          );
          expectProp.to.have.property("skews").that.has.length(1);
          expectProp.to.have.property("modules").that.has.length(1);

          expectProp = expect(data).to.have.nested.property(
            "assets.bundle\\.js.packages.foo.3\\.3\\.3.node_modules/unscoped-foo/node_modules/foo",
          );
          expectProp.to.have.property("skews").that.has.length(1);
          expectProp.to.have.property("modules").that.has.length(2);

          expectProp = expect(data).to.have.nested.property(
            "assets.bundle\\.js.packages.foo.4\\.3\\.3.node_modules/unscoped-foo/" +
            "node_modules/deeper-unscoped/node_modules/foo",
          );
          expectProp.to.have.property("skews").that.has.length(1);
          expectProp.to.have.property("modules").that.has.length(2);
        });
export function loadTsconfig(
  configFilePath: string,
  existsSync: (path: string) => boolean = fs.existsSync,
  readFileSync: (filename: string) => string = (filename: string) =>
    fs.readFileSync(filename, "utf8")
): Tsconfig | undefined {
  if (!existsSync(configFilePath)) {
    return undefined;
  }

  const configString = readFileSync(configFilePath);
  const cleanedJson = StripBom(StripJsonComments(configString));
  const config: Tsconfig = JSON.parse(cleanedJson);
  let extendedConfig = config.extends;

  if (extendedConfig) {
    if (
      typeof extendedConfig === "string" &&
      extendedConfig.indexOf(".json") === -1
    ) {
      extendedConfig += ".json";
    }

    const currentDir = path.dirname(configFilePath);
    const base =
      loadTsconfig(
        path.join(currentDir, extendedConfig),
        existsSync,
        readFileSync
      ) || {};

    // baseUrl should be interpreted as relative to the base tsconfig,
    // but we need to update it so it is relative to the original tsconfig being loaded
    if (base && base.compilerOptions && base.compilerOptions.baseUrl) {
      const extendsDir = path.dirname(extendedConfig);
      base.compilerOptions.baseUrl = path.join(
        extendsDir,
        base.compilerOptions.baseUrl
      );
    }

    return deepmerge(base, config);
  }
  return config;
}
          .then((data) => {
            expect(data).to.have.keys("meta", "assets");
            expect(data).to.have.property("meta").that.eql(merge(BASE_DUPS_CJS_DATA.meta, {
              depended: {
                num: 4,
              },
              files: {
                num: 5,
              },
              installed: {
                num: 3,
              },
              packages: {
                num: 1,
              },
              resolved: {
                num: 3,
              },
            }));

            let expectProp;

            expectProp = expect(data).to.have.nested.property(
              "assets.bundle\\.js.packages.foo.1\\.1\\.1.node_modules/foo",
            );
            expectProp.to.have.property("skews").that.has.length(2);
            expectProp.to.have.property("modules").that.has.length(2);

            expectProp = expect(data).to.have.nested.property(
              "assets.bundle\\.js.packages.foo.2\\.2\\.2.node_modules/uses-foo/node_modules/foo",
            );
            expectProp.to.have.property("skews").that.has.length(1);
            expectProp.to.have.property("modules").that.has.length(1);

            expectProp = expect(data).to.have.nested.property(
              "assets.bundle\\.js.packages.foo.3\\.3\\.3.node_modules/different-foo/node_modules/foo",
            );
            expectProp.to.have.property("skews").that.has.length(1);
            expectProp.to.have.property("modules").that.has.length(2);
          });
          .then((data) => {
            expect(data).to.have.keys("meta", "assets");
            expect(data).to.have.property("meta").that.eql(merge(EMPTY_VERSIONS_DATA.meta, {
              commonRoot: resolve(__dirname, "../../fixtures/hidden-app-roots"),
              depended: {
                num: 2,
              },
              files: {
                num: 3,
              },
              installed: {
                num: 2,
              },
              packageRoots: [
                resolve(__dirname, "../../fixtures/hidden-app-roots"),
                resolve(__dirname, "../../fixtures/hidden-app-roots/packages/hidden-app"),
              ],
              packages: {
                num: 1,
              },
              resolved: {
                num: 2,
              },
            }));

            let expectProp;

            expectProp = expect(data).to.have.nested.property(
              "assets.bundle\\.js.packages.foo.1\\.1\\.1.node_modules/foo",
            );
            expectProp.to.have.property("skews").that.has.length(1);
            expectProp.to.have.property("modules").that.has.length(1);

            expectProp = expect(data).to.have.nested.property(
              "assets.bundle\\.js.packages.foo.3\\.3\\.3.node_modules/different-foo/node_modules/foo",
            );
            expectProp.to.have.property("skews").that.has.length(1);
            expectProp.to.have.property("modules").that.has.length(2);
          });
import * as deepmerge from "deepmerge";

const x = { foo: { bar: 3 },
  array: [ { does: 'work', too: [ 1, 2, 3 ] } ] };
const y = { foo: { baz: 4 },
  quux: 5,
  array: [ { does: 'work', too: [ 4, 5, 6 ] }, { really: 'yes' } ] };

const expected = { foo: { bar: 3, baz: 4 },
  array: [ { does: 'work', too: [ 1, 2, 3, 4, 5, 6 ] }, { really: 'yes' } ],
  quux: 5 };

const result = deepmerge<any>(x, y);
import * as deepmerge from "deepmerge";

const x = {
    foo: { bar: 3 },
    array: [{ does: 'work', too: [1, 2, 3] }]
};
const y = {
    foo: { baz: 4 },
    quux: 5,
    array: [{ does: 'work', too: [4, 5, 6] }, { really: 'yes' }]
};

const expected = {
    foo: { bar: 3, baz: 4 },
    array: [{ does: 'work', too: [1, 2, 3, 4, 5, 6] }, { really: 'yes' }],
    quux: 5
};

const result = deepmerge(x, y);
const anyResult = deepmerge<any>(x, y);

function reverseConcat(dest: number[], src: number[]) {
    return src.concat(dest);
}

const withOptions = deepmerge(x, y, {
    clone: false,
    arrayMerge: reverseConcat
});
import * as deepmerge from "deepmerge";

const x = { foo: { bar: 3 },
  array: [ { does: 'work', too: [ 1, 2, 3 ] } ] }
const y = { foo: { baz: 4 },
  quux: 5,
  array: [ { does: 'work', too: [ 4, 5, 6 ] }, { really: 'yes' } ] }

const expected = { foo: { bar: 3, baz: 4 },
  array: [ { does: 'work', too: [ 1, 2, 3, 4, 5, 6 ] }, { really: 'yes' } ],
  quux: 5 }

const result = deepmerge<Object>(x, y);
    num: 0,
  },
};

export const EMPTY_VERSIONS_DATA: IVersionsData = {
  assets: {},
  meta: {
    ...EMPTY_VERSIONS_META,
    commonRoot: null,
    packageRoots: [],
  },
};

const BASE_DUPS_CJS_DATA = merge(EMPTY_VERSIONS_DATA, {
  meta: {
    commonRoot: resolve(__dirname, "../../fixtures/duplicates-cjs"),
    packageRoots: [resolve(__dirname, "../../fixtures/duplicates-cjs")],
  },
});

const BASE_SCOPED_DATA = merge(EMPTY_VERSIONS_DATA, {
  meta: {
    commonRoot: resolve(__dirname, "../../fixtures/scoped"),
    packageRoots: [resolve(__dirname, "../../fixtures/scoped")],
  },
});

// Keyed off `scenario`. Remap chunk names.
const PATCHED_ASSETS = {
  "multiple-chunks": {
    "0.js": "bar.js",
    "1.js": "different-foo.js",