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