mirror of
https://github.com/toss/es-toolkit.git
synced 2024-12-03 01:42:44 +03:00
91 lines
2.6 KiB
TypeScript
91 lines
2.6 KiB
TypeScript
|
import { execa } from 'execa';
|
||
|
import fs from 'node:fs';
|
||
|
import path from 'node:path';
|
||
|
import { Readable } from 'node:stream';
|
||
|
import { describe, expect, it } from 'vitest';
|
||
|
import { createPackageTarball } from './utils/createPackageTarball';
|
||
|
import { createTmpDir } from './utils/createTmpDir';
|
||
|
import { parseTar } from './utils/parseTar';
|
||
|
import { streamToBuffer } from './utils/streamToBuffer';
|
||
|
|
||
|
async function getPackageJsonOfTarball() {
|
||
|
const tarball = await createPackageTarball();
|
||
|
|
||
|
for await (const entry of parseTar(await fs.promises.readFile(tarball.path))) {
|
||
|
if (entry.path === 'package/package.json') {
|
||
|
const json = (await streamToBuffer(entry as unknown as Readable)).toString('utf-8');
|
||
|
|
||
|
return JSON.parse(json);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
throw new Error(`package.json not found.`);
|
||
|
}
|
||
|
|
||
|
const ENTRYPOINTS = [
|
||
|
'.',
|
||
|
'./array',
|
||
|
'./function',
|
||
|
'./math',
|
||
|
'./object',
|
||
|
'./predicate',
|
||
|
'./promise',
|
||
|
'./string',
|
||
|
'./compat',
|
||
|
]
|
||
|
|
||
|
describe(`es-toolkit's package tarball`, () => {
|
||
|
it('configures all entrypoints correctly', async () => {
|
||
|
const packageJson = await getPackageJsonOfTarball();
|
||
|
const entrypoints = Object.keys(packageJson.exports);
|
||
|
|
||
|
expect(entrypoints).toEqual([
|
||
|
...ENTRYPOINTS,
|
||
|
'./package.json'
|
||
|
]);
|
||
|
}, { timeout: 30_000 });
|
||
|
|
||
|
it('exports identical functions in CJS and ESM', async () => {
|
||
|
const tarball = await createPackageTarball();
|
||
|
const tmpdir = await createTmpDir();
|
||
|
|
||
|
const packageJson = {
|
||
|
"dependencies": {
|
||
|
"es-toolkit": tarball.path,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
await fs.promises.writeFile(path.join(tmpdir, 'package.json'), JSON.stringify(packageJson, null, 2));
|
||
|
await execa('npm', ['install'], { cwd: tmpdir });
|
||
|
|
||
|
for (const entrypoint of ENTRYPOINTS) {
|
||
|
const cjsScript = `
|
||
|
const toolkit = require("${path.join("es-toolkit", entrypoint)}");
|
||
|
|
||
|
const exported = Object.entries(toolkit).map(([k, v]) => [k, typeof v]);
|
||
|
|
||
|
console.log(exported);
|
||
|
`.trim();
|
||
|
const cjsScriptPath = path.join(tmpdir, 'script.cjs');
|
||
|
|
||
|
const esmScript = `
|
||
|
const toolkit = await import("${path.join("es-toolkit", entrypoint)}");
|
||
|
|
||
|
const exported = Object.entries(toolkit).map(([k, v]) => [k, typeof v]);
|
||
|
|
||
|
console.log(exported);
|
||
|
`.trim();
|
||
|
const esmScriptPath = path.join(tmpdir, 'script.mjs');
|
||
|
|
||
|
await fs.promises.writeFile(cjsScriptPath, cjsScript);
|
||
|
await fs.promises.writeFile(esmScriptPath, esmScript);
|
||
|
|
||
|
const cjsResult = await execa('node', [cjsScriptPath])
|
||
|
const esmResult = await execa('node', [esmScriptPath])
|
||
|
|
||
|
expect(cjsResult.stdout).toEqual(esmResult.stdout);
|
||
|
}
|
||
|
|
||
|
}, { timeout: 60_000 });
|
||
|
})
|