Skip to content

Commit 9f11f79

Browse files
committed
Add script to test esm and cjs consumers of the sdk.
1 parent 3997a34 commit 9f11f79

3 files changed

Lines changed: 136 additions & 0 deletions

File tree

.github/workflows/main.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@ jobs:
3535
RUNNING_IN_CI: true
3636
run: pnpm test
3737

38+
- name: Test ESM and CJS consumers
39+
run: pnpm test:esm-consumer && pnpm test:cjs-consumer
40+
3841
- name: Check examples & demos
3942
run: pnpm check-examples
4043

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
"build": "tsc --build --verbose ./tsconfig.prod.json && node scripts/fix-dist-markers.cjs",
1616
"watch": "tsc --build --verbose --watch ./tsconfig.prod.json",
1717
"test": "pnpm build && vitest run",
18+
"test:esm-consumer": "node scripts/test-consumer.cjs esm",
19+
"test:cjs-consumer": "node scripts/test-consumer.cjs cjs",
1820
"package:check": "pnpm run --parallel --aggregate-output --reporter append-only --filter './packages/**' package-check",
1921
"packages:lint": "pnpm packages:sort --check",
2022
"packages:sort": "sort-package-json \"package.json\" \"examples/*/package.json\" \"packages/*/package.json\"",

scripts/test-consumer.cjs

Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
const fs = require('fs');
2+
const os = require('os');
3+
const path = require('path');
4+
const { spawnSync } = require('child_process');
5+
6+
const mode = process.argv[2];
7+
8+
if (mode !== 'esm' && mode !== 'cjs') {
9+
console.error('Usage: node scripts/test-consumer.cjs <esm|cjs>');
10+
process.exit(1);
11+
}
12+
13+
const repoRoot = path.resolve(__dirname, '..');
14+
const packageNames = ['shared', 'taco-auth', 'taco'];
15+
const tempRoot = fs.mkdtempSync(
16+
path.join(os.tmpdir(), `taco-web-${mode}-consumer-`),
17+
);
18+
const fixtureDir = path.join(tempRoot, 'fixture');
19+
20+
const run = (command, args, cwd) => {
21+
const result = spawnSync(command, args, {
22+
cwd,
23+
encoding: 'utf8',
24+
stdio: 'pipe',
25+
});
26+
27+
if (result.stdout) {
28+
process.stdout.write(result.stdout);
29+
}
30+
31+
if (result.stderr) {
32+
process.stderr.write(result.stderr);
33+
}
34+
35+
if (result.status !== 0) {
36+
throw new Error(
37+
`${command} ${args.join(' ')} failed with exit code ${result.status}`,
38+
);
39+
}
40+
41+
return result.stdout;
42+
};
43+
44+
const packPackage = (packageName) => {
45+
const packageDir = path.join(repoRoot, 'packages', packageName);
46+
const output = run('pnpm', ['pack'], packageDir);
47+
const tarballName = output
48+
.trim()
49+
.split('\n')
50+
.map((line) => line.trim())
51+
.filter((line) => line.endsWith('.tgz'))
52+
.at(-1);
53+
54+
if (!tarballName) {
55+
throw new Error(`Could not determine tarball name for ${packageName}`);
56+
}
57+
58+
const sourceTarball = path.join(packageDir, tarballName);
59+
const targetTarball = path.join(tempRoot, tarballName);
60+
fs.renameSync(sourceTarball, targetTarball);
61+
return targetTarball;
62+
};
63+
64+
const writeFixtureFiles = (tarballs) => {
65+
fs.mkdirSync(fixtureDir, { recursive: true });
66+
67+
const packageJson = {
68+
name: `consumer-smoke-${mode}`,
69+
private: true,
70+
type: mode === 'esm' ? 'module' : 'commonjs',
71+
dependencies: {
72+
'@nucypher/taco': `file:${tarballs.taco}`,
73+
},
74+
pnpm: {
75+
overrides: {
76+
'@nucypher/shared': `file:${tarballs.shared}`,
77+
'@nucypher/taco-auth': `file:${tarballs['taco-auth']}`,
78+
},
79+
},
80+
};
81+
82+
fs.writeFileSync(
83+
path.join(fixtureDir, 'package.json'),
84+
`${JSON.stringify(packageJson, null, 2)}\n`,
85+
);
86+
87+
const entryFileName = mode === 'esm' ? 'index.js' : 'index.cjs';
88+
const entryContent =
89+
mode === 'esm'
90+
? [
91+
"import { conditions, decrypt, encrypt } from '@nucypher/taco';",
92+
'',
93+
"if (typeof encrypt !== 'function') throw new Error('encrypt export missing');",
94+
"if (typeof decrypt !== 'function') throw new Error('decrypt export missing');",
95+
"if (typeof conditions !== 'object') throw new Error('conditions export missing');",
96+
'',
97+
"console.log('ESM consumer smoke test passed');",
98+
'',
99+
].join('\n')
100+
: [
101+
"const { conditions, decrypt, encrypt } = require('@nucypher/taco');",
102+
'',
103+
"if (typeof encrypt !== 'function') throw new Error('encrypt export missing');",
104+
"if (typeof decrypt !== 'function') throw new Error('decrypt export missing');",
105+
"if (typeof conditions !== 'object') throw new Error('conditions export missing');",
106+
'',
107+
"console.log('CJS consumer smoke test passed');",
108+
'',
109+
].join('\n');
110+
111+
fs.writeFileSync(path.join(fixtureDir, entryFileName), entryContent);
112+
return entryFileName;
113+
};
114+
115+
try {
116+
run('pnpm', ['build'], repoRoot);
117+
118+
const tarballs = Object.fromEntries(
119+
packageNames.map((packageName) => [packageName, packPackage(packageName)]),
120+
);
121+
const entryFileName = writeFixtureFiles(tarballs);
122+
123+
run('pnpm', ['install'], fixtureDir);
124+
run('node', [entryFileName], fixtureDir);
125+
126+
fs.rmSync(tempRoot, { recursive: true, force: true });
127+
} catch (error) {
128+
console.error(`Consumer smoke test failed. Temporary files kept at: ${tempRoot}`);
129+
console.error(error instanceof Error ? error.message : error);
130+
process.exit(1);
131+
}

0 commit comments

Comments
 (0)