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",
}
})
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"))
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",
}
})
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"))
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)),
}
))
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)),
}
))
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)),
}
))
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)),
}
))
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)),
}
))
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)),
}
))
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)),
}
))
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)),
}
))
})