🏡 index : quine-global-boneyard/electron-builder.git

import { assertPack, linuxDirTarget, verifyAsarFileTree, modifyPackageJson } from "./helpers/packTester"
import { Platform, Arch, DIR_TARGET } from "electron-builder"
import { outputFile, copySync, rmSync, readJsonSync, writeJsonSync, mkdirSync } from "fs-extra"
import * as path from "path"
import { spawn } from "builder-util/out/util"

test("yarn workspace", ({ expect }) =>
  assertPack(
    expect,
    "test-app-yarn-workspace",
    {
      targets: linuxDirTarget,
      projectDir: "packages/test-app",
    },
    {
      packed: context => verifyAsarFileTree(expect, context.getResources(Platform.LINUX)),
    }
  ))

test("conflict versions", ({ expect }) =>
  assertPack(
    expect,
    "test-app-yarn-workspace-version-conflict",
    {
      targets: linuxDirTarget,
      projectDir: "packages/test-app",
    },
    {
      packed: context => verifyAsarFileTree(expect, context.getResources(Platform.LINUX)),
    }
  ))

test("yarn several workspaces", ({ expect }) =>
  assertPack(
    expect,
    "test-app-yarn-several-workspace",
    {
      targets: linuxDirTarget,
      projectDir: "packages/test-app",
    },
    {
      packed: context => verifyAsarFileTree(expect, context.getResources(Platform.LINUX)),
    }
  ))

test("yarn several workspaces and asarUnpack", ({ expect }) =>
  assertPack(
    expect,
    "test-app-yarn-several-workspace",
    {
      targets: linuxDirTarget,
      projectDir: "packages/test-app",
      config: {
        asarUnpack: ["**/node_modules/ms/**/*"],
      },
    },
    {
      packed: context => verifyAsarFileTree(expect, context.getResources(Platform.LINUX)),
    }
  ))

test("yarn two package.json w/ native module", ({ expect }) =>
  assertPack(
    expect,
    "test-app-two-native-modules",
    {
      targets: linuxDirTarget,
    },
    {
      packed: context => verifyAsarFileTree(expect, context.getResources(Platform.LINUX)),
    }
  ))

test("yarn two package.json", ({ expect }) =>
  assertPack(
    expect,
    "test-app-hoisted",
    {
      targets: linuxDirTarget,
    },
    {
      isInstallDepsBefore: false,
      projectDirCreated: async projectDir => {
        await modifyPackageJson(projectDir, data => {
          data.dependencies = {
            "electron-updater": "6",
            express: "4",
            "patch-package": "^8.0.0",
          }
          data.devDependencies = {
            electron: "23.2.0",
            "del-cli": "6",
            "electron-builder": "26",
            "fs-extra": "11",
          }
          data.build.directories = {
            app: "app",
          }
        })

        // install dependencies in project dir
        await spawn("npm", ["install"], {
          cwd: projectDir,
        })

        mkdirSync(path.join(projectDir, "app"))
        rmSync(path.join(projectDir, "app", "node_modules"), { recursive: true, force: true })
        copySync(path.join(projectDir, "index.html"), path.join(projectDir, "app", "index.html"))
        copySync(path.join(projectDir, "index.js"), path.join(projectDir, "app", "index.js"))
        copySync(path.join(projectDir, "node_modules"), path.join(projectDir, "app", "node_modules"))

        // delete package.json devDependencies
        const packageJson = readJsonSync(path.join(projectDir, "package.json"))
        delete packageJson.devDependencies
        delete packageJson.build
        delete packageJson.scripts
        writeJsonSync(path.join(projectDir, "app", "package.json"), packageJson)
      },
      packed: context => verifyAsarFileTree(expect, context.getResources(Platform.LINUX)),
    }
  ))

test("yarn two package.json without node_modules", ({ expect }) =>
  assertPack(
    expect,
    "test-app-hoisted",
    {
      targets: linuxDirTarget,
    },
    {
      isInstallDepsBefore: false,
      projectDirCreated: async projectDir => {
        await modifyPackageJson(projectDir, data => {
          data.dependencies = {
            "electron-updater": "6",
            express: "4",
            "patch-package": "^8.0.0",
          }
          data.devDependencies = {
            electron: "23.2.0",
            "del-cli": "6",
            "electron-builder": "26",
            "fs-extra": "11",
          }
          data.build.directories = {
            app: "app",
          }
        })

        // install dependencies in project dir
        await spawn("npm", ["install"], {
          cwd: projectDir,
        })

        mkdirSync(path.join(projectDir, "app"))
        rmSync(path.join(projectDir, "app", "node_modules"), { recursive: true, force: true })
        copySync(path.join(projectDir, "index.html"), path.join(projectDir, "app", "index.html"))
        copySync(path.join(projectDir, "index.js"), path.join(projectDir, "app", "index.js"))

        // delete package.json devDependencies
        const packageJson = readJsonSync(path.join(projectDir, "package.json"))
        delete packageJson.devDependencies
        delete packageJson.build
        delete packageJson.scripts
        writeJsonSync(path.join(projectDir, "app", "package.json"), packageJson)
      },
      packed: context => verifyAsarFileTree(expect, context.getResources(Platform.LINUX)),
    }
  ))
describe("isInstallDepsBefore=true", { sequential: true }, () => {
  test("yarn workspace for scope name", ({ expect }) =>
    assertPack(
      expect,
      "test-app-yarn-several-workspace",
      {
        targets: linuxDirTarget,
        projectDir: "packages/test-app",
      },
      {
        isInstallDepsBefore: true,
        projectDirCreated: projectDir => {
          const subAppDir = path.join(projectDir, "packages", "test-app")
          return modifyPackageJson(subAppDir, data => {
            data.name = "@scope/xxx-app"
            data.dependencies = {
              "is-odd": "3.0.1",
            }
          })
        },
        packed: context => verifyAsarFileTree(expect, context.getResources(Platform.LINUX)),
      }
    ))

  // https://github.com/electron-userland/electron-builder/issues/8493
  test("pnpm es5-ext without hoisted config", ({ expect }) =>
    assertPack(
      expect,
      "test-app-hoisted",
      {
        targets: linuxDirTarget,
      },
      {
        isInstallDepsBefore: true,
        projectDirCreated: projectDir => {
          return Promise.all([
            modifyPackageJson(projectDir, data => {
              data.dependencies = {
                "es5-ext": "0.10.53",
              }
            }),
            outputFile(path.join(projectDir, "pnpm-lock.yaml"), ""),
          ])
        },
        packed: context => verifyAsarFileTree(expect, context.getResources(Platform.LINUX)),
      }
    ))

  test("pnpm optional dependencies", ({ expect }) =>
    assertPack(
      expect,
      "test-app-hoisted",
      {
        targets: linuxDirTarget,
      },
      {
        isInstallDepsBefore: true,
        projectDirCreated: projectDir => {
          return Promise.all([
            modifyPackageJson(projectDir, data => {
              data.dependencies = {
                "electron-clear-data": "^1.0.5",
              }
              data.optionalDependencies = {
                debug: "3.1.0",
              }
            }),
            outputFile(path.join(projectDir, "pnpm-lock.yaml"), ""),
          ])
        },
        packed: context => verifyAsarFileTree(expect, context.getResources(Platform.LINUX)),
      }
    ))

  test.ifLinux("pnpm optional dependency not installable on linux", ({ expect }) =>
    assertPack(
      expect,
      "test-app-hoisted",
      {
        targets: linuxDirTarget,
      },
      {
        isInstallDepsBefore: true,
        projectDirCreated: projectDir => {
          return Promise.all([
            modifyPackageJson(projectDir, data => {
              data.dependencies = {
                "electron-clear-data": "^1.0.5",
              }
              data.optionalDependencies = {
                "node-mac-permissions": "2.3.0",
              }
            }),
            outputFile(path.join(projectDir, "pnpm-lock.yaml"), ""),
          ])
        },
        packed: context => verifyAsarFileTree(expect, context.getResources(Platform.LINUX)),
      }
    )
  )

  test("yarn electron-clear-data", ({ expect }) =>
    assertPack(
      expect,
      "test-app-hoisted",
      {
        targets: Platform.WINDOWS.createTarget(DIR_TARGET, Arch.x64),
      },
      {
        isInstallDepsBefore: true,
        projectDirCreated: projectDir => {
          return Promise.all([
            modifyPackageJson(projectDir, data => {
              data.dependencies = {
                "electron-clear-data": "^1.0.5",
              }
              data.optionalDependencies = {
                debug: "3.1.0",
              }
            }),
            outputFile(path.join(projectDir, "yarn.lock"), ""),
          ])
        },
        packed: context => verifyAsarFileTree(expect, context.getResources(Platform.WINDOWS)),
      }
    ))

  test("npm electron-clear-data", ({ expect }) =>
    assertPack(
      expect,
      "test-app-hoisted",
      {
        targets: Platform.WINDOWS.createTarget(DIR_TARGET, Arch.x64),
      },
      {
        isInstallDepsBefore: true,
        projectDirCreated: projectDir => {
          return Promise.all([
            modifyPackageJson(projectDir, data => {
              data.dependencies = {
                "electron-clear-data": "^1.0.5",
              }
              data.optionalDependencies = {
                debug: "3.1.0",
              }
            }),
            outputFile(path.join(projectDir, "package-lock.json"), ""),
          ])
        },
        packed: context => verifyAsarFileTree(expect, context.getResources(Platform.WINDOWS)),
      }
    ))

  // https://github.com/electron-userland/electron-builder/issues/8842
  test("yarn some module add by manual instead of install", ({ expect }) =>
    assertPack(
      expect,
      "test-app-hoisted",
      {
        targets: Platform.WINDOWS.createTarget(DIR_TARGET, Arch.x64),
      },
      {
        isInstallDepsBefore: true,
        projectDirCreated: async (projectDir, tmpDir) => {
          await outputFile(path.join(projectDir, "yarn.lock"), "")
          await outputFile(path.join(projectDir, "node_modules", "foo", "package.json"), `{"name":"foo","version":"9.0.0","main":"index.js","license":"MIT"}`)
          await modifyPackageJson(projectDir, data => {
            data.dependencies = {
              debug: "3.1.0",
            }
          })
        },
        packed: context => verifyAsarFileTree(expect, context.getResources(Platform.WINDOWS)),
      }
    ))

  //https://github.com/electron-userland/electron-builder/issues/8857
  test("yarn max stack", ({ expect }) =>
    assertPack(
      expect,
      "test-app-hoisted",
      {
        targets: linuxDirTarget,
      },
      {
        isInstallDepsBefore: true,
        projectDirCreated: projectDir => {
          return Promise.all([
            modifyPackageJson(projectDir, data => {
              data.dependencies = {
                "npm-run-all": "^4.1.5",
              }
            }),
            outputFile(path.join(projectDir, "yarn.lock"), ""),
          ])
        },
        packed: context => verifyAsarFileTree(expect, context.getResources(Platform.LINUX)),
      }
    ))

  test("pnpm max stack", ({ expect }) =>
    assertPack(
      expect,
      "test-app-hoisted",
      {
        targets: linuxDirTarget,
      },
      {
        isInstallDepsBefore: true,
        projectDirCreated: projectDir => {
          return Promise.all([
            modifyPackageJson(projectDir, data => {
              data.dependencies = {
                "npm-run-all": "^4.1.5",
              }
            }),
            outputFile(path.join(projectDir, "pnpm-lock.yaml"), ""),
          ])
        },
        packed: context => verifyAsarFileTree(expect, context.getResources(Platform.LINUX)),
      }
    ))

  //github.com/electron-userland/electron-builder/issues/8842
  test("yarn ms", ({ expect }) =>
    assertPack(
      expect,
      "test-app-hoisted",
      {
        targets: linuxDirTarget,
      },
      {
        isInstallDepsBefore: true,
        projectDirCreated: projectDir => {
          return Promise.all([
            modifyPackageJson(projectDir, data => {
              data.dependencies = {
                "@sentry/electron": "5.11.0",
                "electron-clear-data": "^1.0.5",
              }
              data.devDependencies = {
                electron: "34.0.2",
              }
            }),
            outputFile(path.join(projectDir, "yarn.lock"), ""),
          ])
        },
        packed: context => verifyAsarFileTree(expect, context.getResources(Platform.LINUX)),
      }
    ))

  //github.com/electron-userland/electron-builder/issues/8426
  test("yarn parse-asn1", ({ expect }) =>
    assertPack(
      expect,
      "test-app-hoisted",
      {
        targets: linuxDirTarget,
      },
      {
        isInstallDepsBefore: true,
        projectDirCreated: projectDir => {
          return Promise.all([
            modifyPackageJson(projectDir, data => {
              data.dependencies = {
                "parse-asn1": "5.1.7",
              }
            }),
            outputFile(path.join(projectDir, "yarn.lock"), ""),
          ])
        },
        packed: context => verifyAsarFileTree(expect, context.getResources(Platform.LINUX)),
      }
    ))

  //github.com/electron-userland/electron-builder/issues/8431
  test("npm tar", ({ expect }) =>
    assertPack(
      expect,
      "test-app-hoisted",
      {
        targets: linuxDirTarget,
      },
      {
        isInstallDepsBefore: true,
        projectDirCreated: projectDir => {
          return Promise.all([
            modifyPackageJson(projectDir, data => {
              data.dependencies = {
                tar: "7.4.3",
              }
            }),
            outputFile(path.join(projectDir, "package-lock.json"), ""),
          ])
        },
        packed: context => verifyAsarFileTree(expect, context.getResources(Platform.LINUX)),
      }
    ))

  //github.com/electron-userland/electron-builder/issues/8881
  test("pnpm node-linker=hoisted", ({ expect }) =>
    assertPack(
      expect,
      "test-app-hoisted",
      {
        targets: linuxDirTarget,
      },
      {
        isInstallDepsBefore: true,
        projectDirCreated: projectDir => {
          return Promise.all([
            modifyPackageJson(projectDir, data => {
              data.dependencies = {
                dayjs: "1.11.13",
              }
            }),
            outputFile(path.join(projectDir, "pnpm-lock.yaml"), ""),
            outputFile(path.join(projectDir, ".npmrc"), "node-linker=hoisted"),
          ])
        },
        packed: context => verifyAsarFileTree(expect, context.getResources(Platform.LINUX)),
      }
    ))
  test("pnpm shamefully-hoist=true", ({ expect }) =>
    assertPack(
      expect,
      "test-app-hoisted",
      {
        targets: linuxDirTarget,
      },
      {
        isInstallDepsBefore: true,
        projectDirCreated: projectDir => {
          return Promise.all([
            modifyPackageJson(projectDir, data => {
              data.dependencies = {
                dayjs: "1.11.13",
              }
            }),
            outputFile(path.join(projectDir, "pnpm-lock.yaml"), ""),
            outputFile(path.join(projectDir, ".npmrc"), "shamefully-hoist=true"),
          ])
        },
        packed: context => verifyAsarFileTree(expect, context.getResources(Platform.LINUX)),
      }
    ))
  test("pnpm public-hoist-pattern=*", ({ expect }) =>
    assertPack(
      expect,
      "test-app-hoisted",
      {
        targets: linuxDirTarget,
      },
      {
        isInstallDepsBefore: true,
        projectDirCreated: projectDir => {
          return Promise.all([
            modifyPackageJson(projectDir, data => {
              data.dependencies = {
                dayjs: "1.11.13",
              }
            }),
            outputFile(path.join(projectDir, "pnpm-lock.yaml"), ""),
            outputFile(path.join(projectDir, ".npmrc"), "public-hoist-pattern=*"),
          ])
        },
        packed: context => verifyAsarFileTree(expect, context.getResources(Platform.LINUX)),
      }
    ))
})