stoat-for-desktop/js-lingui-solid/packages/vite-plugin/test/index.ts

79 lines
2.2 KiB
TypeScript

import path from "path"
import { exec as _exec } from "child_process"
import { mkdtempSync } from "fs"
import os from "os"
describe("vite-plugin", () => {
it("should return compiled catalog", async () => {
const mod = await runVite(`po-format/vite.config.ts`)
expect((await mod.load()).messages).toMatchSnapshot()
})
it("should return compiled catalog json", async () => {
const mod = await runVite(`json-format/vite.config.ts`)
expect((await mod.load()).messages).toMatchSnapshot()
})
it("should report error when macro used without a plugin", async () => {
expect.assertions(1)
try {
await runVite(`no-macro-error/vite.config.ts`)
} catch (e) {
expect(e.stderr).toContain(
'The macro you imported from "@lingui/core/macro" is being executed outside the context of compilation.'
)
}
})
it("should not report error when macro correctly used", async () => {
const mod = await runVite(`macro-usage/vite.config.ts`)
expect(await mod.load()).toMatchSnapshot()
})
})
async function runVite(configPath: string) {
// we could not use Vite directly using nodejs api because Vite is native ESM module
// and Jest should be reconfigured completely to be able to require such modules
const packageJsonPath = require.resolve("vite/package.json")
const packageJson = require("vite/package.json")
const viteExecutable = path.resolve(
path.dirname(packageJsonPath),
packageJson.bin.vite
)
const outDir = mkdtempSync(
path.join(os.tmpdir(), `lingui-test-${process.pid}`)
)
const command =
"node " +
viteExecutable +
` build -c ` +
path.resolve(__dirname, configPath) +
` --emptyOutDir --outDir ${outDir}`
await exec(command, path.dirname(path.resolve(__dirname, configPath)))
return await import(path.resolve(outDir, "bundle.cjs"))
}
function exec(cmd: string, cwd: string) {
return new Promise((resolve, reject) => {
_exec(
cmd,
{
env: process.env,
cwd,
},
(error, stdout, stderr) => {
stdout = stdout.trim()
stderr = stderr.trim()
if (error === null) {
resolve({ stdout, stderr })
} else {
reject({ error, stdout, stderr })
}
}
)
})
}